diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f03d6586dc..7e0df49db4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1 @@ -# CODEOWNERS: https://help.github.com/articles/about-codeowners/ - -# Primary (global) repo maintainers - - * @evmos/core-engineering +* @crypto-org-chain/cronos-dev diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9457055bff..8c52a0d864 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,24 +5,38 @@ updates: schedule: interval: daily time: "10:00" - open-pull-requests-limit: 10 - reviewers: - - fedekunze - - khoslaventures + open-pull-requests-limit: 5 labels: - dependencies + groups: + gh-actions: + patterns: + - "*" - package-ecosystem: docker directory: "/" schedule: interval: daily time: "10:00" - open-pull-requests-limit: 10 - reviewers: - - fedekunze - - khoslaventures + open-pull-requests-limit: 5 + groups: + docker: + patterns: + - "*" - package-ecosystem: gomod directory: "/" schedule: interval: daily time: "10:00" open-pull-requests-limit: 10 + groups: + cosmos-sdk: + patterns: + - "cosmossdk.io/*" + - "github.com/cosmos/*" + otel: + patterns: + - "go.opentelemetry.io/*" + gomod-minor-patch: + update-types: + - minor + - patch diff --git a/.github/issue_labeler.yml b/.github/issue_labeler.yml new file mode 100644 index 0000000000..b613aed105 --- /dev/null +++ b/.github/issue_labeler.yml @@ -0,0 +1,56 @@ +bug: + - 'bug' + - 'error' + - 'issue' + - 'crash' + - 'panic' + - 'fail' + - 'broken' + - 'not work' + - 'exception' + +enhancement: + - 'feature' + - 'enhancement' + - 'improve' + - 'add' + - 'support' + - 'request' + - 'proposal' + - 'rfc' + +documentation: + - 'docs' + - 'documentation' + - 'readme' + - 'guide' + - 'tutorial' + - 'example' + - 'spec' + - 'specification' + +cli: + - 'cli' + - 'command' + - 'flag' + - 'argument' + - 'terminal' + +dependencies: + - 'dependency' + - 'dependencies' + - 'go.mod' + - 'cosmos-sdk' + - 'tendermint' + - 'cometbft' + +build: + - 'build' + - 'compile' + - 'makefile' + - 'docker' + +ci: + - 'ci' + - 'github actions' + - 'workflow' diff --git a/.github/labeler.yml b/.github/labeler.yml deleted file mode 100644 index 039e8090a5..0000000000 --- a/.github/labeler.yml +++ /dev/null @@ -1,37 +0,0 @@ -"C:Crypto": - - crypto/**/* -"C:Encoding": - - encoding/**/* -"C:JSON-RPC": - - ethereum/rpc/**/* -"C:Proto": - - proto/**/* - - third_party/**/* - - /**/*.pb.go - - /**/*.pb.gw.go -"C:Types": - - types/**/* -"C:x/evm": - - x/evm/**/*/ -"Type: Build": - - Makefile - - Dockerfile - - docker-compose.yml - - scripts/* - - config.yml -"Type: CI": - - .github/**/*.yml - - buf.yaml - - .mergify.yml - - .golangci.yml -"C:CLI": - - client/**/* - - x/*/client/**/* -"Type: Tests": - - tests/**/* - - /**/*/*_test.go -"Type: Docs": - - docs/**/* - - x/*/spec/**/* -"Type: ADR": - - docs/architecture/**/* \ No newline at end of file diff --git a/.github/pr_labeler.yml b/.github/pr_labeler.yml new file mode 100644 index 0000000000..6a21f33e48 --- /dev/null +++ b/.github/pr_labeler.yml @@ -0,0 +1,38 @@ +cli: + - changed-files: + - any-glob-to-any-file: 'x/*/client/**/*' +nix: + - changed-files: + - any-glob-to-any-file: + - 'nix/**' + - 'default.nix' + - 'docker.nix' + - 'flake.nix' + - 'sources.nix' + - 'testenv.nix' + - 'goethereum.nix' + - 'golangci-lint.nix' +adr: + - changed-files: + - any-glob-to-any-file: 'docs/architecture/**/*' +build: + - changed-files: + - any-glob-to-any-file: + - 'Makefile' + - 'Dockerfile' + - 'docker-compose.yml' + - 'scripts/*' +ci: + - changed-files: + - any-glob-to-any-file: + - '.github/**' + - 'buf.work.yaml' + - '.golangci.yml' + +# modules +evm: + - changed-files: + - any-glob-to-any-file: 'x/evm/**/*' +feemarket: + - changed-files: + - any-glob-to-any-file: 'x/feemarket/**/*' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 238d7fd3aa..d1d8e9a644 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,10 +20,10 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v4 + - uses: actions/checkout@v6 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - uses: technote-space/get-diff-action@v6.1.2 id: git_diff diff --git a/.github/workflows/changelog-reminder.yml b/.github/workflows/changelog-reminder.yml new file mode 100644 index 0000000000..6de3ca6c84 --- /dev/null +++ b/.github/workflows/changelog-reminder.yml @@ -0,0 +1,25 @@ +# Checks if a changelog is missing in the PR diff +name: Changelog Reminder +on: + pull_request_target: + types: + - opened + - edited + - synchronize + - reopened + - ready_for_review + paths: [ "**/*.go" ] +permissions: + contents: read + pull-requests: write +jobs: + remind: + name: Changelog Reminder + runs-on: ubuntu-latest + # Skip draft PRs and PRs starting with: revert, test, chore, ci, docs, style, build, refactor + if: "!github.event.pull_request.draft && !contains(github.event.pull_request.title, 'revert') && !contains(github.event.pull_request.title, 'test') && !contains(github.event.pull_request.title, 'chore') && !contains(github.event.pull_request.title, 'ci') && !contains(github.event.pull_request.title, 'docs') && !contains(github.event.pull_request.title, 'style') && !contains(github.event.pull_request.title, 'build') && !contains(github.event.pull_request.title, 'refactor')" + steps: + - uses: actions/checkout@v6 + - uses: mskelton/changelog-reminder-action@v3 + with: + message: "@${{ github.actor }} your pull request is missing a changelog!" \ No newline at end of file diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml new file mode 100644 index 0000000000..5c15c1603b --- /dev/null +++ b/.github/workflows/claude-review.yml @@ -0,0 +1,117 @@ +name: Claude PR Review + +on: + issue_comment: + types: [created] + +permissions: + contents: read + pull-requests: write + issues: write + id-token: write + +concurrency: + group: claude-review-${{ github.event.issue.number }} + cancel-in-progress: true + +jobs: + review: + if: >- + github.event.issue.pull_request && + startsWith(github.event.comment.body, '@claude') + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Permission check + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const username = context.payload.comment.user.login; + + const { data: { permission } } = await github.rest.repos.getCollaboratorPermissionLevel({ + owner: context.repo.owner, + repo: context.repo.repo, + username, + }); + + const allowed = ['admin', 'maintain', 'write']; + if (!allowed.includes(permission)) { + core.setFailed(`User ${username} does not have write access.`); + return; + } + + # issue_comment runs with github.ref on the default branch; resolve the PR head explicitly + - name: Resolve PR head for checkout + id: pr + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const prUrl = context.payload.issue.pull_request?.url; + if (!prUrl) { + core.setFailed('Expected issue.pull_request.url'); + return; + } + const { data: pull } = await github.request('GET ' + prUrl); + const repository = pull.head.repo.full_name; + const ref = pull.head.ref; + const sha = pull.head.sha; + const fs = require('fs'); + fs.appendFileSync(process.env.GITHUB_OUTPUT, `repository=${repository}\n`); + fs.appendFileSync(process.env.GITHUB_OUTPUT, `ref=${ref}\n`); + fs.appendFileSync(process.env.GITHUB_OUTPUT, `sha=${sha}\n`); + + - name: Checkout PR head + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + repository: ${{ github.repository }} + ref: refs/pull/${{ github.event.issue.number }}/head + token: ${{ secrets.GITHUB_TOKEN }} + persist-credentials: false + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1 + with: + role-to-assume: ${{ vars.AWS_ROLE_TO_ASSUME_AI }} + aws-region: us-east-1 + + - name: Claude Code + uses: anthropics/claude-code-action@1dc994ee7a008f0ecc866d9ac23ef036b7229f84 # v1.0.127 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + use_bedrock: true + track_progress: true + settings: | + { + "model": "us.anthropic.claude-sonnet-4-6", + "attribution": { + "commit": "${{ steps.pr.outputs.sha }}", + "pr": "${{ github.event.issue.number }}" + } + } + prompt: | + REPO: ${{ github.repository }} + PR NUMBER: ${{ github.event.issue.number }} + + Never suggest GitHub Action SHA changes from memory — verify with `gh api repos/{owner}/{repo}/commits/{tag} --jq '.sha'` first. + + Please review this pull request with a focus on: + - Code quality and best practices + - Potential bugs or issues + - Security implications + - Performance considerations + + Identify all state-breaking changes and alert the user when they are detected (No breaking changes should be merged in release branches). + This includes: + - Consensus Impact: These changes demand that all validators upgrade to the new version to maintain network consensus. + - Module Changes: Examples include modifications to core module functionality, such as altering the transaction structure, + changing how messages are signed, or changing state serialization (e.g., changing Amino JSON support). + - In-Place Migrations: Modern Cosmos SDK upgrades use "in-place store migrations" to update data structures within the state machine to align with the new code. + - Required Procedures: Historically, these required exporting the entire chain state, running migration scripts on the JSON, + and starting a new chain (Genesis migration), though in-place migration is now preferred. + + Use `gh pr comment` for top-level feedback. + Use `mcp__github_inline_comment__create_inline_comment` (with `confirmed: true`) to highlight specific code issues. + Only post GitHub comments - don't submit review text as messages. + + claude_args: | + --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 845d0a9e34..0d5e9febc5 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -43,7 +43,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | @@ -56,7 +56,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -69,7 +69,7 @@ jobs: # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v4 if: env.GIT_DIFF # ℹ️ Command-line programs to run using the OS shell. @@ -84,5 +84,5 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v4 if: env.GIT_DIFF diff --git a/.github/workflows/dependabot-update-all.yml b/.github/workflows/dependabot-update-all.yml new file mode 100644 index 0000000000..59563ab037 --- /dev/null +++ b/.github/workflows/dependabot-update-all.yml @@ -0,0 +1,61 @@ +name: Dependabot Update All Go Modules +on: pull_request_target + +permissions: + contents: write + pull-requests: write + +env: + PR_TITLE: ${{ github.event.pull_request.title }} + +jobs: + update-all: + runs-on: ubuntu-latest + if: > + github.actor == 'dependabot[bot]' && + startsWith(github.event.pull_request.head.ref, 'dependabot/go_modules/') + steps: + - name: Generate Token + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 + id: app-token + with: + app-id: "${{ secrets.APP_ID }}" + private-key: "${{ secrets.APP_PRIVATE_KEY }}" + - uses: actions/checkout@v6 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + token: "${{ steps.app-token.outputs.token }}" + - uses: actions/setup-go@v6 + with: + go-version: "1.25.10" + check-latest: true + - name: Extract updated dependency + id: deps + run: | + # Parse Dependabot PR titles of the form: + # build(deps): bump from to + # Grouped PR titles (e.g. "bump the go_modules group across 1 directory") + # do not match and are handled by falling through to a tidy-only run. + name=$(echo "$PR_TITLE" | grep -oE 'bump [^ ]+' | head -1 | awk '{print $2}' || true) + version=$(echo "$PR_TITLE" | grep -oE 'to [0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}' || true) + if [[ -z "$name" || -z "$version" ]]; then + echo "Grouped or unparseable PR title; skipping single-dep update." + echo "skip=true" >> "$GITHUB_OUTPUT" + else + { + echo "name=$name" + echo "version=$version" + echo "skip=false" + } >> "$GITHUB_OUTPUT" + fi + - name: Update all Go modules + if: steps.deps.outputs.skip != 'true' + run: ./scripts/go-update-dep-all.sh ${{ format('{0}@v{1}', steps.deps.outputs.name, steps.deps.outputs.version) }} + - name: Tidy all Go modules + run: ./scripts/go-mod-tidy-all.sh + - name: Commit changes + uses: EndBug/add-and-commit@v10 + with: + default_author: user_info + message: "${{ github.event.pull_request.title }} for all modules" diff --git a/.github/workflows/dependencies-review.yml b/.github/workflows/dependencies-review.yml new file mode 100644 index 0000000000..f4196df46b --- /dev/null +++ b/.github/workflows/dependencies-review.yml @@ -0,0 +1,52 @@ +name: "Dependency Review" +on: + pull_request: + paths: + - "**/*.go" + - "**/go.mod" + - "**/go.sum" + merge_group: + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: "Checkout Repository" + uses: actions/checkout@v6 + - name: "Setup Go" + uses: actions/setup-go@v6 + with: + go-version: "1.25.10" + check-latest: true + - name: "Dependency Review" + uses: actions/dependency-review-action@v5 + with: + base-ref: ${{ github.event.pull_request.base.sha || 'master' }} + head-ref: ${{ github.event.pull_request.head.sha || github.ref }} + fail-on-severity: high + - name: "Go vulnerability check" + id: govuln + run: | + # GO-2026-4479 is an unfixable vuln in github.com/pion/dtls/v2, pulled in + # transitively via go-ethereum p2p → pion/stun/v2. Pion upstream only + # patched v3; there is no v2 fix. + # GO-2024-2584 is a slashing-evasion issue in cosmos-sdk itself; the + # govulndb entry has "Fixed in: N/A" — no upstream patch exists. + ALLOWED="GO-2026-4479 GO-2024-2584" + + make vulncheck 2>&1 | tee govulncheck-output.txt || true + + vulnerabilities=$(grep -oE 'GO-[0-9]{4}-[0-9]+' govulncheck-output.txt | sort -u) + echo "Detected vulnerabilities: $vulnerabilities" + + for vuln in $vulnerabilities; do + if ! echo "$ALLOWED" | grep -qw "$vuln"; then + echo "Unallowed vulnerability $vuln found; failing." + exit 1 + fi + done + + echo "Only known unfixable vulnerability ($ALLOWED) present. Continuing." diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml deleted file mode 100644 index aa8ea5fdf7..0000000000 --- a/.github/workflows/dependencies.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: "Dependency Review" -on: pull_request - -permissions: - contents: read - -jobs: - dependency-review: - runs-on: ubuntu-latest - steps: - - uses: actions/setup-go@v4 - with: - go-version: 1.21 - check-latest: true - - name: "Checkout Repository" - uses: actions/checkout@v3 - - uses: technote-space/get-diff-action@v6.1.2 - with: - PATTERNS: | - **/**.go - go.mod - go.sum - - name: "Dependency Review" - uses: actions/dependency-review-action@v3 - if: env.GIT_DIFF - - name: "Go vulnerability check" - run: make vulncheck - if: env.GIT_DIFF diff --git a/.github/workflows/deploy-contract.yml b/.github/workflows/deploy-contract.yml index bde98337b5..01df0249c6 100644 --- a/.github/workflows/deploy-contract.yml +++ b/.github/workflows/deploy-contract.yml @@ -20,9 +20,9 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: node-version: '12.x' - name: Install dependencies diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 6dbc318535..2be0fe33a6 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -9,13 +9,13 @@ jobs: runs-on: ubuntu-latest environment: release steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 with: submodules: true - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - name: release dry run run: make release-dry-run @@ -25,4 +25,4 @@ jobs: run: |- echo 'GITHUB_TOKEN=${{secrets.GITHUB_TOKEN}}' > .release-env - name: release publish - run: make release \ No newline at end of file + run: make release diff --git a/.github/workflows/issue_labeler.yml b/.github/workflows/issue_labeler.yml new file mode 100644 index 0000000000..5d2df28929 --- /dev/null +++ b/.github/workflows/issue_labeler.yml @@ -0,0 +1,15 @@ +name: "Issue Labeler" +on: + issues: + types: [opened] + +jobs: + triage: + runs-on: ubuntu-latest + steps: + - uses: github/issue-labeler@v3.4 + if: join(github.event.issue.labels) == '' + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + configuration-path: .github/issue_labeler.yml + enable-versioned-regex: 0 \ No newline at end of file diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml deleted file mode 100644 index 0b7c0a98fb..0000000000 --- a/.github/workflows/labeler.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: "Pull Request Labeler" -on: - pull_request: - push: - branches: - - develop - -jobs: - triage: - runs-on: ubuntu-latest - steps: - - uses: actions/labeler@v4 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/lint-pr.yml b/.github/workflows/lint-pr.yml new file mode 100644 index 0000000000..a474fb10ef --- /dev/null +++ b/.github/workflows/lint-pr.yml @@ -0,0 +1,47 @@ +name: "Lint PR" + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + +permissions: + contents: read + +jobs: + main: + permissions: + pull-requests: read # for amannn/action-semantic-pull-request to analyze PRs + statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR + runs-on: ubuntu-latest + steps: + - uses: amannn/action-semantic-pull-request@v6.1.1 + id: lint_pr_title + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: marocchino/sticky-pull-request-comment@v3 + # When the previous steps fails, the workflow would stop. By adding this + # condition you can continue the execution with the populated error message. + if: always() && (steps.lint_pr_title.outputs.error_message != null) + with: + header: pr-title-lint-error + message: | + Hey there and thank you for opening this pull request! 👋🏼 + + We require pull request titles to follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/) and it looks like your proposed title needs to be adjusted. + + Details: + + ``` + ${{ steps.lint_pr_title.outputs.error_message }} + ``` + + # Delete a previous comment when the issue has been resolved + - if: ${{ steps.lint_pr_title.outputs.error_message == null }} + uses: marocchino/sticky-pull-request-comment@v3 + with: + header: pr-title-lint-error + delete: true \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2931b27153..3877e791b5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,23 +19,32 @@ jobs: timeout-minutes: 10 steps: # Required: setup-go, for all versions v3.0.0+ of golangci-lint - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | **/**.go go.mod go.sum - - uses: golangci/golangci-lint-action@v3.4.0 + - uses: cachix/install-nix-action@v31 with: - # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. - version: latest - args: --timeout 10m - github-token: ${{ secrets.github_token }} + nix_path: nixpkgs=channel:nixos-22.11 + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + if: env.GIT_DIFF + - uses: cachix/cachix-action@v17 + with: + name: crypto-ethermint + if: env.GIT_DIFF + - name: Install and run golangci-lint + run: | + SYSTEM_GO=$(which go) + nix profile add -f ./nix golangci-lint + PATH="$(dirname "$SYSTEM_GO"):$PATH" golangci-lint run # Check only if there are differences in the source code if: env.GIT_DIFF markdown-lint: @@ -43,14 +52,14 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | docs/**/*.md x/**/*.md README.md - - uses: nosborn/github-action-markdown-cli@v3.3.0 + - uses: nosborn/github-action-markdown-cli@v3.5.0 with: files: . config_file: .markdownlint.yml @@ -61,13 +70,13 @@ jobs: name: Run flake8 on python integration tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v26 + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 with: - nix_path: nixpkgs=channel:nixos-23.11 + nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 + - uses: cachix/cachix-action@v17 with: name: crypto-ethermint - uses: technote-space/get-diff-action@v6.1.2 @@ -81,13 +90,13 @@ jobs: name: Check gomod2nix.toml file is up to date runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v26 + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 with: - nix_path: nixpkgs=channel:nixos-23.11 + nix_path: nixpkgs=channel:nixos-22.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 + - uses: cachix/cachix-action@v17 with: name: crypto-ethermint - uses: technote-space/get-diff-action@v6.1.2 diff --git a/.github/workflows/markdown-links.yml b/.github/workflows/markdown-links.yml index 854dbb49dc..39f6369e1f 100644 --- a/.github/workflows/markdown-links.yml +++ b/.github/workflows/markdown-links.yml @@ -17,7 +17,7 @@ jobs: markdown-link-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 id: git_diff with: diff --git a/.github/workflows/pr_labeler.yml b/.github/workflows/pr_labeler.yml new file mode 100644 index 0000000000..4a30d27205 --- /dev/null +++ b/.github/workflows/pr_labeler.yml @@ -0,0 +1,16 @@ +name: "Pull Request Labeler" +on: + - pull_request_target + +jobs: + labeler: + permissions: + contents: read # for actions/labeler to determine modified files + pull-requests: write # for actions/labeler to add labels to PRs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/labeler@v6 # v5 is broken, ref https://github.com/actions/labeler/issues/712. Do not bump. + with: + configuration-path: .github/pr_labeler.yml + repo-token: "${{ secrets.GITHUB_TOKEN }}" \ No newline at end of file diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index 556b9b3210..9040a2d08b 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -15,8 +15,8 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: - - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.16.0 + - uses: actions/checkout@v6 + - uses: bufbuild/buf-setup-action@v1.50.0 - uses: bufbuild/buf-lint-action@v1 with: input: "proto" @@ -24,8 +24,8 @@ jobs: break-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.16.0 + - uses: actions/checkout@v6 + - uses: bufbuild/buf-setup-action@v1.50.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index e82cdd18d3..2b82377d2c 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -19,7 +19,7 @@ jobs: GO111MODULE: on steps: - name: Checkout Source - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Get Diff uses: technote-space/get-diff-action@v6.1.2 with: @@ -34,7 +34,7 @@ jobs: args: "-no-fail -fmt sarif -out results.sarif ./..." if: "env.GIT_DIFF_FILTERED != ''" - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v4 with: # Path to SARIF file relative to the root of the repository sarif_file: results.sarif diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 1404cfc575..e4a35ddcbd 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Permission issue fix run: git config --global --add safe.directory /__w/ethermint/ethermint - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Get Diff uses: technote-space/get-diff-action@v6.1.2 with: @@ -36,7 +36,7 @@ jobs: **/*.sol go.mod go.sum - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - run: semgrep scan --sarif --output=semgrep.sarif --config auto env: # Upload findings to GitHub Advanced Security Dashboard [step 1/2] @@ -44,7 +44,7 @@ jobs: if: "env.GIT_DIFF_FILTERED != ''" # Upload findings to GitHub Advanced Security Dashboard [step 2/2] - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@v2 + uses: github/codeql-action/upload-sarif@v4 with: sarif_file: semgrep.sarif if: "env.GIT_DIFF_FILTERED != ''" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e6e0b131d4..33542032d8 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This pull request has been automatically marked as stale because it has not had diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ab418bf56a..fa1ed8a58c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,6 +5,7 @@ on: branches: - develop - release/** + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -22,11 +23,11 @@ jobs: test-unit-cover: runs-on: ubuntu-latest steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | @@ -38,7 +39,7 @@ jobs: run: | make test-unit-cover if: env.GIT_DIFF - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v6 with: file: ./coverage.txt fail_ci_if_error: true @@ -49,11 +50,11 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 id: git_diff with: @@ -70,11 +71,11 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | @@ -89,20 +90,21 @@ jobs: integration_tests: runs-on: ubuntu-latest - timeout-minutes: 60 + timeout-minutes: 360 strategy: matrix: tests: [unmarked, upgrade, filter] env: TESTS_TO_RUN: ${{ matrix.tests }} steps: - - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v26 + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 with: - nix_path: nixpkgs=channel:nixos-23.11 + nix_path: nixpkgs=channel:nixos-25.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 + max-jobs = auto + - uses: cachix/cachix-action@v17 with: name: crypto-ethermint signingKey: "${{ secrets.CACHIX_SIGNING_KEY }}" @@ -120,7 +122,7 @@ jobs: - name: 'Tar debug files' if: failure() run: tar cfz debug_files.tar.gz -C /tmp/pytest-of-runner . - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v7 if: failure() with: name: debug-files @@ -128,20 +130,21 @@ jobs: if-no-files-found: ignore upload-cache: - if: github.event_name == 'push' - needs: ["integration_tests"] + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + timeout-minutes: 360 strategy: matrix: - os: [macos-latest] + os: [ubuntu-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 - - uses: cachix/install-nix-action@v26 + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 with: - nix_path: nixpkgs=channel:nixos-23.11 + nix_path: nixpkgs=channel:nixos-25.11 extra_nix_config: | access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: cachix/cachix-action@v14 + max-jobs = auto + - uses: cachix/cachix-action@v17 with: name: crypto-ethermint signingKey: "${{ secrets.CACHIX_SIGNING_KEY }}" @@ -152,12 +155,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 - - uses: technote-space/get-diff-action@v6.1.1 + - uses: actions/checkout@v6 + - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | **/**.go @@ -172,12 +175,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 - - uses: technote-space/get-diff-action@v6.1.1 + - uses: actions/checkout@v6 + - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | **/**.go @@ -192,12 +195,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 - - uses: technote-space/get-diff-action@v6.1.1 + - uses: actions/checkout@v6 + - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | **/**.go @@ -212,12 +215,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/setup-go@v3 + - uses: actions/setup-go@v6 with: - go-version: 1.21 + go-version: "1.25.9" check-latest: true - - uses: actions/checkout@v3 - - uses: technote-space/get-diff-action@v6.1.1 + - uses: actions/checkout@v6 + - uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | **/**.go diff --git a/.golangci.yml b/.golangci.yml index d1aa62dfe1..a3db4f38ac 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,74 +1,79 @@ +version: "2" run: tests: false - # timeout for analysis, e.g. 30s, 5m, default is 1m - # timeout: 5m - linters: enable: + - asciicheck - bodyclose - dogsled - dupl - - errcheck - goconst - gocritic - - gofumpt - - revive + - gomodguard - gosec - - gosimple - - govet - - ineffassign - lll - misspell - nakedret + - nolintlint - prealloc - - exportloopref + - revive - staticcheck - - stylecheck - - typecheck - unconvert - unparam - - unused - - nolintlint - - asciicheck - - exportloopref - - gofumpt - - gomodguard - whitespace - + settings: + dogsled: + max-blank-identifiers: 3 + gomodguard: + blocked: + versions: + - https://github.com/etcd-io/etcd: + version: '>= 3.4.10 || ~3.3.23' + reason: CVE-2020-15114; CVE-2020-15136; CVE-2020-15115 + - https://github.com/dgrijalva/jwt-go: + version: '>= 4.0.0-preview1' + reason: CVE-2020-26160 + lll: + line-length: 150 + misspell: + locale: US + nolintlint: + require-explanation: false + require-specific: false + allow-unused: false + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + rules: + - linters: + - gosec + path: _test\.go + - linters: + - lll + source: https:// + - linters: + - revive + path: (types|interfaces)/ + - linters: + - revive + path: rpc/namespaces/ethereum/net/ + paths: + - third_party$ + - builtin$ + - examples$ + - x/evm/types/preinstall.go issues: - exclude-rules: - - path: _test\.go - linters: - - gosec - - linters: - - lll - source: "https://" max-same-issues: 50 - -linters-settings: - lll: - line-length: 150 - dogsled: - max-blank-identifiers: 3 - golint: - min-confidence: 0 - maligned: - suggest-new: true - misspell: - locale: US - nolintlint: - allow-unused: false - allow-leading-space: true - require-explanation: false - require-specific: false - gofumpt: - lang-version: "1.19" - gomodguard: - blocked: - versions: # List of blocked module version constraints - - https://github.com/etcd-io/etcd: # Blocked module with version constraint - version: ">= 3.4.10 || ~3.3.23" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons - reason: "CVE-2020-15114; CVE-2020-15136; CVE-2020-15115" # Reason why the version constraint exists. (Optional) - - https://github.com/dgrijalva/jwt-go: # Blocked module with version constraint - version: ">= 4.0.0-preview1" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons - reason: "CVE-2020-26160" # Reason why the version constraint exists. (Optional) +formatters: + enable: + - gofumpt + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index fbaba4dec2..b45b5b1017 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,14 +37,113 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## Unreleased +### API Breaking + +* (rpc) [#962](https://github.com/crypto-org-chain/ethermint/pull/962) fix(rpc): rename `AccessListResult.Accesslist` to `AccessList` and change `GasUsed` from `uint64` to `hexutil.Uint64` in `x/evm/types`; change `AccessList` and `GasUsed` from pointer to value types in `rpc/types.AccessListResult`. + +### Bug Fixes + +* (debug) [#990](https://github.com/crypto-org-chain/ethermint/pull/990) fix(debug): apply restrict-user-input path check to all file-write methods. +* (rpc) [#971](https://github.com/crypto-org-chain/ethermint/pull/971) fix(rpc): align eth_getBlockByHash response with execution-apis spec. +* (rpc) [#979](https://github.com/crypto-org-chain/ethermint/pull/979) fix(rpc): add `blockTimestamp` to transaction RPC responses — fixes `eth_getTransactionByBlockHash/NumberAndIndex`, `eth_getTransactionByHash`, and `eth_getBlockByHash/Number` (fullTx). +* (rpc) [#978](https://github.com/crypto-org-chain/ethermint/pull/978) fix(rpc): align `eth_sendRawTransaction` with execution-apis. +* (rpc) [#970](https://github.com/crypto-org-chain/ethermint/pull/970) fix(rpc): prevent nil panic in SignClient type assertion and guard nil ResultHeader in block hash lookups. +* (rpc) [#969](https://github.com/crypto-org-chain/ethermint/pull/969) fix(rpc): align eth_getLogs response with execution-apis spec. +* (rpc) [#963](https://github.com/crypto-org-chain/ethermint/pull/963) fix(rpc): align eth_feeHistory response with execution-apis spec. +* (rpc) [#962](https://github.com/crypto-org-chain/ethermint/pull/962) fix(rpc): align eth_createAccessList response with execution-apis spec — hex-encode gasUsed and propagate VM errors in the Error field. +* (test) [#972](https://github.com/crypto-org-chain/ethermint/pull/972) test(integration): fix flaky test_tracecall_diff by replacing derive_random_account with fixed unique indices. + +### Features + +* (deps) [#894](https://github.com/crypto-org-chain/ethermint/pull/894) feat: migrate to Cosmos SDK v0.54.3, IBC v11, CometBFT v0.39.3. +* (ante) [#948](https://github.com/crypto-org-chain/ethermint/pull/948) fix(ante): enforce eip-1559 cost balance check even if it is not checkTx. +* (evm) [#948](https://github.com/crypto-org-chain/ethermint/pull/948) fix(evm): fix SetCodeTx nil pointer panics, missing AuthList in Copy. +* (evm) [#951](https://github.com/crypto-org-chain/ethermint/pull/951) chore(evm): preallocate slices in AccessList conversion functions. +* (server) [#939](https://github.com/crypto-org-chain/ethermint/pull/939) feat(server): add `index-eth-tx range ` subcommand for targeted block re-indexing. +* (rpc) [#923](https://github.com/crypto-org-chain/ethermint/pull/923) fix(rpc): include block-gas-exceeded txs in `eth_getBlockReceipts` and use block-wide eth `cumulativeGasUsed`. +* (ci) [#925](https://github.com/crypto-org-chain/ethermint/pull/925) fix(ci): fix dependabot workflows and drain PR backlog +* (rpc) [#877](https://github.com/crypto-org-chain/ethermint/pull/877) fix(rpc): Fix eth_getBlockReceipts crash and return duplicate transaction +* (rpc) [#876](https://github.com/crypto-org-chain/ethermint/pull/876) enforce ws origin allowlist and namespace gating. +* (evm) [#880](https://github.com/crypto-org-chain/ethermint/pull/880) perf: reduce allocations in EVM hot paths +* (evm) [#883](https://github.com/crypto-org-chain/ethermint/pull/883) fix: prevent nil pointer dereference on BLOBBASEFEE opcode +* (evm) [#882](https://github.com/crypto-org-chain/ethermint/pull/882) fix: prevent nested StateDB storage overwrites +* (rpc) [#881](https://github.com/crypto-org-chain/ethermint/pull/881) feat(RPC): implement `eth_simulateV1` RPC +* (rpc) [#879](https://github.com/crypto-org-chain/ethermint/pull/879) fix(eth_sign): apply EIP-191 prefix to domain-separate personal signatures from transaction signatures. +* (rpc) [#861](https://github.com/crypto-org-chain/ethermint/pull/861) fix(rpc): Missing boundary checkin GetTransactionReceipt. +* (ante) [#849](https://github.com/crypto-org-chain/ethermint/pull/849) fix(ante): fix nonce cache stage writes until ante chain succeeds and capacity handling. +* (deps) [#857](https://github.com/crypto-org-chain/ethermint/pull/857) feat(cosmos-sdk): Optimize staking end-block queue through using pending queue slots instead of iterators. +* (ante) [#853](https://github.com/crypto-org-chain/ethermint/pull/853) refactor: remove redundant incarnationCache for sig verification +* (deps) [#489](https://github.com/crypto-org-chain/ethermint/pull/489) Update cosmos-sdk to `v0.53.4`. +* (ante) [#829](https://github.com/crypto-org-chain/ethermint/pull/829) fix: validate payload messages in legacy EIP-712 +* (evm) [#830](https://github.com/crypto-org-chain/ethermint/pull/830) fix: revert batch nonce management for call and create, align implementation with geth +* (ante) [#839](https://github.com/crypto-org-chain/ethermint/pull/839) fix: remove unecessary maxGasWanted +* (app) [#852](https://github.com/crypto-org-chain/ethermint/pull/852) Add interface implementation for evm and feemarket module. +* (fix) [#878](https://github.com/crypto-org-chain/ethermint/pull/878) Patch default history serve window with correct value. +* (evm) [#896](https://github.com/crypto-org-chain/ethermint/pull/896) fix: burn post-SELFDESTRUCT balance at commit to prevent fund recovery via address recreation +* (rpc) [#916](https://github.com/crypto-org-chain/ethermint/pull/916) fix(rpc): return InvalidParams error when `eth_getLogs` toBlock exceeds chain head. +* (evm) [#921](https://github.com/crypto-org-chain/ethermint/pull/921) fix: enforce floor-data-gas +* (test) [#926](https://github.com/crypto-org-chain/ethermint/pull/926) fix(test): remove flaky `base_fee` assertion in `update_feemarket_param`. +* (server) [#946](https://github.com/crypto-org-chain/ethermint/pull/946) feat(server): make JSON-RPC batch limits configurable. +* (rpc) [#964](https://github.com/crypto-org-chain/ethermint/pull/964) fix(rpc): align `eth_simulateV1` response with execution-apis spec. +* (geth) [#957](https://github.com/crypto-org-chain/ethermint/pull/957) feat(geth): update go-ethereum version to `v1.16.9`, enable Osaka hardfork +* (evm) [#973](https://github.com/crypto-org-chain/ethermint/pull/973) fix: setting evm hooks prevent the stateDB from committing for failed tx +* (rpc) [#965](https://github.com/crypto-org-chain/ethermint/pull/965) fix(rpc): align `eth_getBlockReceipts` response with execution-apis spec. +* [#967](https://github.com/crypto-org-chain/ethermint/pull/967) fix(evm): align debug_trace fee with virtual ante path + +## [v0.23.0] - 2026-01-13 + +### Features + +* (go) [#787](https://github.com/crypto-org-chain/ethermint/pull/787) feat: use golang 1.25.0. +* (evm) [#725](https://github.com/crypto-org-chain/ethermint/pull/725) feat(RPC): add authorizationList from eth_getTransactionByHash response for EIP-7702 transactions +* (evm) [#740](https://github.com/crypto-org-chain/ethermint/pull/740) fix: missing tx context during vm initialisation +* (evm) [#742](https://github.com/crypto-org-chain/ethermint/pull/742) fix: prevent nil pointer dereference in tracer hooks +* (evm) [#728](https://github.com/crypto-org-chain/ethermint/pull/728) feat: support preinstalls +* (evm) [#722](https://github.com/crypto-org-chain/ethermint/pull/722) feat: support EIP-2935 +* (rpc) [#764](https://github.com/crypto-org-chain/ethermint/pull/764) rpc: apply state overrides to eth_estimateGas +* (ante) [#775](https://github.com/crypto-org-chain/ethermint/pull/775) fix: race condition in antecache +* (ante) [#789](https://github.com/crypto-org-chain/ethermint/pull/789) fix: add check on evm transaction tip +* (evm) [#789](https://github.com/crypto-org-chain/ethermint/pull/795) chore: add validation for HeaderHashNum and HistoryServeWindow in params +* (api) [#768](https://github.com/crypto-org-chain/ethermint/pull/768) feat: support create access list +* (rpc) [#804](https://github.com/crypto-org-chain/ethermint/pull/804) fix: add allow-unprotected-txs config +* (evm) [#809](https://github.com/crypto-org-chain/ethermint/pull/809) fix: relax preinstall rules +* (rpc) [#814](https://github.com/crypto-org-chain/ethermint/pull/814) fix: estimate gas not accurate +* (evm) [#815](https://github.com/crypto-org-chain/ethermint/pull/815) fix: nonce increments on EIP-7702 contract creation +* (evm) [#822](https://github.com/crypto-org-chain/ethermint/pull/822) refactor:replace MsgEthereumTxResponse with EthCallResponse in EVM calls + +## [v0.22.0] - 2025-08-12 + +* (geth) [#665](https://github.com/crypto-org-chain/ethermint/pull/665) Update go-ethereum version to [`v1.15.11`](https://github.com/ethereum/go-ethereum/releases/tag/v1.15.11). +* (evm) [#689](https://github.com/crypto-org-chain/ethermint/pull/689) Enable CancunTime and PragueTime in chain config migration. +* (evm) [#691](https://github.com/crypto-org-chain/ethermint/pull/691) Remove active precompiles from VMContext +* (app) [#692](https://github.com/crypto-org-chain/ethermint/pull/692) Enforce app creator returning application implement AppWithPendingTxStream in build time. +* (evm) [#694](https://github.com/crypto-org-chain/ethermint/pull/694) Remove miner(eth_hashrate and eth_mining) json rpc methods +* (evm) [#695](https://github.com/crypto-org-chain/ethermint/pull/695) Remove more miner unused methods +* (evm) [#696](https://github.com/crypto-org-chain/ethermint/pull/696) Upgrade golangci-lint to v2 and enhance github workflows +* (evm) [#702](https://github.com/crypto-org-chain/ethermint/pull/702) Add default value of CancunTime and PragueTime in chain config +* (evm) [#690](https://github.com/crypto-org-chain/ethermint/pull/690) Support EIP-7702 transaction type + ### Features +* (evm) [#669](https://github.com/crypto-org-chain/ethermint/pull/669) test: fix newEthMsgTx. +* (rpc) [#667](https://github.com/crypto-org-chain/ethermint/pull/667) fix: bug in header hash. +* (evm) [#666](https://github.com/crypto-org-chain/ethermint/pull/666) feat: add gas cap for grpc eth_call. +* (evm) [#649](https://github.com/crypto-org-chain/ethermint/pull/661) chore: rename app to evmd. +* (evm) [#649](https://github.com/crypto-org-chain/ethermint/pull/649) chore: move app/ante to ante. +* (rpc) [#657](https://github.com/crypto-org-chain/ethermint/pull/659) Sanity checks for TraceTx and TraceCall. +* (rpc) [#638](https://github.com/crypto-org-chain/ethermint/pull/638) Add support for eth_getBlockReceipts. * (evm) [#414](https://github.com/crypto-org-chain/ethermint/pull/414) Integrate go-block-stm for parallel tx execution. +* (block-stm) [#498](https://github.com/crypto-org-chain/ethermint/pull/498) Enable incarnation cache for block-stm executor. +* (ante) [#681](https://github.com/crypto-org-chain/ethermint/pull/681) Tx replacement support. ### State Machine Breaking * (rpc) [#443](https://github.com/crypto-org-chain/ethermint/pull/443) Keep behavior of random opcode as before. * (app) [#451](https://github.com/crypto-org-chain/ethermint/pull/451) Disable block gas meter, it's not compatible with parallel tx execution. It's safe to do as long as we checks total gas-wanted against block gas limit in process proposal, which we do in default handler. +* (ante) [#493](https://github.com/crypto-org-chain/ethermint/pull/493) Align gasWanted for process proposal mode, [#500](https://github.com/crypto-org-chain/ethermint/pull/500) Check for overflow before adding gasLimit to gasWanted. +* (ante) [#506](https://github.com/crypto-org-chain/ethermint/pull/506) Disable MsgCreatePermanentLockedAccount and MsgCreatePeriodicVestingAccount messages. +* (ante) [#513](https://github.com/crypto-org-chain/ethermint/pull/513) Avoid unnecessary GetAccount and MakeSigner in ante handlers. +* (ibc) [#609](https://github.com/crypto-org-chain/ethermint/pull/609) Support ibc-go v10 ### Bug Fixes @@ -59,6 +158,26 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (rpc) [#474](https://github.com/crypto-org-chain/ethermint/pull/474), [#476](https://github.com/crypto-org-chain/ethermint/pull/441) Align genesis related cmd. * (rpc) [#480](https://github.com/crypto-org-chain/ethermint/pull/480), [#482](https://github.com/crypto-org-chain/ethermint/pull/482) Fix parsed logs from old events. * (rpc) [#488](https://github.com/crypto-org-chain/ethermint/pull/488) Fix handling of pending transactions related APIs. +* (rpc) [#501](https://github.com/crypto-org-chain/ethermint/pull/501) Avoid invalid chain id for signer error when rpc call before chain id set in BeginBlock. +* (block-stm) [#510](https://github.com/crypto-org-chain/ethermint/pull/510) Include a fix to avoid nondeterministic account set when stm workers execute in parallel. +* (rpc) [#521](https://github.com/crypto-org-chain/ethermint/pull/521) Align hash and miner in subscribe newHeads with eth_getBlockByNumber. +* (rpc) [#516](https://github.com/crypto-org-chain/ethermint/pull/516) Avoid method eth_chainId crashed due to nil pointer on IsEIP155 check. +* (cli) [#524](https://github.com/crypto-org-chain/ethermint/pull/524) Allow tx evm raw run for generate only when offline with evm-denom flag. +* (rpc) [#527](https://github.com/crypto-org-chain/ethermint/pull/527) Fix balance consistency between trace-block and state machine. +* (rpc) [#534](https://github.com/crypto-org-chain/ethermint/pull/534), [#540](https://github.com/crypto-org-chain/ethermint/pull/540) Fix opBlockhash when no block header in abci request. +* (rpc) [#536](https://github.com/crypto-org-chain/ethermint/pull/536) Fix validate basic after transaction conversion with raw field. +* (cli) [#537](https://github.com/crypto-org-chain/ethermint/pull/537) Fix unsuppored sign mode SIGN_MODE_TEXTUAL for bank transfer. +* (cli) [#543](https://github.com/crypto-org-chain/ethermint/pull/543) Fix graceful shutdown. +* (rpc) [#545](https://github.com/crypto-org-chain/ethermint/pull/545) Fix state overwrite in debug trace APIs. +* (rpc) [#554](https://github.com/crypto-org-chain/ethermint/pull/554) No trace detail on insufficient balance. +* (rpc) [#558](https://github.com/crypto-org-chain/ethermint/pull/558) New tracer in predecessors to trace balance correctly when `debug_traceTransaction`. +* (rpc) [#559](https://github.com/crypto-org-chain/ethermint/pull/559) Use basefee of transaction height instead of minus one height when `debug_traceTransaction`. +* (ante) [#560](https://github.com/crypto-org-chain/ethermint/pull/560) Check gasWanted only in checkTx mode. +* (rpc) [#562](https://github.com/crypto-org-chain/ethermint/pull/562) Fix nil pointer panic with legacy transaction format. +* (evm) [#567](https://github.com/crypto-org-chain/ethermint/pull/567) Fix nonce management in batch transaction. +* (rpc) [#574](https://github.com/crypto-org-chain/ethermint/pull/574) Fix incorrect spendable balance when debug trace tx. +* (rpc) [#577](https://github.com/crypto-org-chain/ethermint/pull/577) Fix eth_getLogs miss logs with batch transactions. +* (rpc) [#680](https://github.com/crypto-org-chain/ethermint/pull/680) Fix: estimate gas missing fields for new tx type ### Improvements @@ -74,6 +193,22 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (app) [#483](https://github.com/crypto-org-chain/ethermint/pull/483) Make keyring-backend client config accessible in app. * (deps) [#489](https://github.com/crypto-org-chain/ethermint/pull/489) Update cosmos-sdk to `v0.50.7`. * (rpc) [#491](https://github.com/crypto-org-chain/ethermint/pull/491) Avoid unnecessary tx decode in tx listener. +* [#496](https://github.com/crypto-org-chain/ethermint/pull/496) Set mempool MaxTx from config. +* (ante) [#497](https://github.com/crypto-org-chain/ethermint/pull/497) Enforce positive value check in eth transaction. +* (deps) [#505](https://github.com/crypto-org-chain/ethermint/pull/505) Update cometbft to v0.38.10. +* (ante) [#504](https://github.com/crypto-org-chain/ethermint/pull/504) Optimize AnteHandle method to skip checks if disabledMsgs is empty. +* [#517](https://github.com/crypto-org-chain/ethermint/pull/517) Add check for integer overflow to ensure safe conversion. +* [#522](https://github.com/crypto-org-chain/ethermint/pull/522) block-stm executor support optional pre-estimations. +* [#526](https://github.com/crypto-org-chain/ethermint/pull/526), [#535](https://github.com/crypto-org-chain/ethermint/pull/535) Avoid unnecessary block result in header related api call. +* [#533](https://github.com/crypto-org-chain/ethermint/pull/533) Bump cosmos-sdk to v0.50.10, cometbft to v0.38.13 and ibc-go to v8.5.1. +* [#546](https://github.com/crypto-org-chain/ethermint/pull/546) Introduce `--async-check-tx` flag to run check-tx async with consensus. +* [#549](https://github.com/crypto-org-chain/ethermint/pull/549) Support build without cgo. +* [#551](https://github.com/crypto-org-chain/ethermint/pull/551) Start event stream on demand. +* [#555](https://github.com/crypto-org-chain/ethermint/pull/555) Update cometbft to 0.38.14 and rocksdb to 9.7.4. +* [#565](https://github.com/crypto-org-chain/ethermint/pull/565) Add back CacheWrapWithTrace api. +* [#563](https://github.com/crypto-org-chain/ethermint/pull/563) Bump ibc-go to v9.0.2. +* [#576](https://github.com/crypto-org-chain/ethermint/pull/576) Add config `json-rpc.restrict-user-input` to restrict + user input when serving json-rpc in public. ## v0.21.x-cronos diff --git a/Dockerfile b/Dockerfile index 7ab04d2817..5668588f17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:alpine AS build-env +FROM golang:1.26.3-alpine AS build-env # Set up dependencies ENV PACKAGES git build-base @@ -17,7 +17,7 @@ COPY . . RUN make build # Final image -FROM alpine:3.17.3 +FROM alpine:3.23.4 # Install ca-certificates RUN apk add --update ca-certificates jq diff --git a/Makefile b/Makefile index 262eafe0c2..f5cde89c83 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ BINDIR ?= $(GOPATH)/bin ETHERMINT_BINARY = ethermintd ETHERMINT_DIR = ethermint BUILDDIR ?= $(CURDIR)/build -SIMAPP = ./app +SIMAPP = ./evmd HTTPS_GIT := https://github.com/evmos/ethermint.git PROJECT_NAME = $(shell git remote get-url origin | xargs basename -s .git) DOCKER := $(shell which docker) @@ -176,7 +176,7 @@ build-all: tools build lint test vulncheck ############################################################################### PACKAGE_NAME:=github.com/evmos/ethermint -GOLANG_CROSS_VERSION = v1.19 +GOLANG_CROSS_VERSION = v1.25.8 GOPATH ?= '$(HOME)/go' release-dry-run: docker run \ @@ -419,9 +419,15 @@ benchmark: ### Linting ### ############################################################################### +lint-install: + @echo "--> Installing golangci-lint $(golangci_version)" + @nix profile add -f ./nix golangci-lint + lint: - @@test -n "$$golangci-lint version | awk '$4 >= 1.42')" - golangci-lint run --out-format=tab -n + @go mod verify + @golangci-lint run --output.text.path stdout --path-prefix=./ + @flake8 --show-source --count --statistics + @find . -name "*.nix" -type f | xargs nixfmt -c lint-py: flake8 --show-source --count --statistics \ @@ -431,12 +437,17 @@ format: find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -name '*.pb.go' -not -name '*.pb.gw.go' | xargs gofumpt -d -e -extra lint-fix: - golangci-lint run --fix --out-format=tab --issues-exit-code=0 + @go mod verify + @golangci-lint run --fix --issues-exit-code=0 --path-prefix=./ + @flake8 --show-source --count --statistics + @find . -name "*.nix" -type f | xargs nixfmt + .PHONY: lint lint-fix lint-py format-fix: find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -name '*.pb.go' -not -name '*.pb.gw.go' | xargs gofumpt -w -s find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -name '*.pb.go' -not -name '*.pb.gw.go' | xargs misspell -w + find . -name "*.nix" -type f | xargs nixfmt .PHONY: format ############################################################################### @@ -529,3 +540,21 @@ localnet-show-logstream: docker-compose logs --tail=1000 -f .PHONY: build-docker-local-ethermint localnet-start localnet-stop + +############################################################################### +### Mocks ### +############################################################################### + +MOCKERY := go run github.com/vektra/mockery/v2@v2.53.0 +COMETBFT_DIR := $(shell go list -m -f '{{.Dir}}' github.com/cometbft/cometbft) + +mocks: + $(MOCKERY) --name "QueryClient" --structname "EVMQueryClient" \ + --dir x/evm/types --output rpc/backend/mocks --outpkg mocks --filename evm_query_client.go + $(MOCKERY) --name "QueryClient" --structname "FeeMarketQueryClient" \ + --dir x/feemarket/types --output rpc/backend/mocks --outpkg mocks --filename feemarket_query_client.go + $(MOCKERY) --name "Client" \ + --dir $(COMETBFT_DIR)/rpc/client \ + --output rpc/backend/mocks --outpkg mocks --filename client.go + +.PHONY: mocks diff --git a/README.md b/README.md index 25157adae1..6d9cf781fd 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ parent: Ethermint is a scalable and interoperable Ethereum library, built on Proof-of-Stake with fast-finality using the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk/) which runs on top of [Tendermint Core](https://github.com/tendermint/tendermint) consensus engine. -**Note**: Requires [Go 1.19+](https://golang.org/dl/) +**Note**: Requires [Go 1.25.8+](https://golang.org/dl/) ## Installation diff --git a/SECURITY.md b/SECURITY.md index d471281e18..7c75583849 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -20,8 +20,9 @@ If you follow these guidelines when reporting an issue to us, we commit to: Evmos uses the following disclosure process: -1. Once a security report is received via the Immunefi Bug Bounty program, the team works to verify the issue and confirm its severity level using [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) or [Immunefi’s Vulnerability Severity Classification System v2.2](https://immunefi.com/immunefi-vulnerability-severity-classification-system-v2-2/). - 1. Two people from the affected project will review, replicate and acknowledge the report within 48-96 hours of the alert according to the table below: + 1. Once a security report is received via the Immunefi Bug Bounty program, the team works to verify the issue and confirm its severity level using [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) or [Immunefi’s Vulnerability Severity Classification System v2.2](https://immunefi.com/immunefi-vulnerability-severity-classification-system-v2-2/). + 1. Two people from the affected project will review, replicate and acknowledge the report within 48-96 hours of the alert according to the table below: + | Security Level | Hours to First Response (ACK) from Escalation | | -------------------- | --------------------------------------------- | | Critical | 48 | @@ -30,6 +31,7 @@ Evmos uses the following disclosure process: | Low or Informational | 96 | | None | 96 | + 2. If the report is not applicable or reproducible, the Security Lead (or Security Secondary) will revert to the reporter to request more info or close the report. 3. The report is confirmed by the Security Lead to the reporter. 2. The team determines the vulnerability’s potential impact on Evmos. diff --git a/ante/cache/antecache.go b/ante/cache/antecache.go new file mode 100644 index 0000000000..85e8c70707 --- /dev/null +++ b/ante/cache/antecache.go @@ -0,0 +1,89 @@ +package cache + +import ( + "container/list" + "sync" +) + +// TxNonce structure for a pair sender and nonce +type TxNonce struct { + Address string + Nonce uint64 +} + +// AnteCache is a cache used to check that a specific TxNonce exists in a mempool +// Currently it is not possible to read the mempool to check if a transaction-nonce exists already +// We use a cache to track the "potential transaction" in the mempool +// TODO to be removed once we have a better solution implemented in cosmos sdk +type AnteCache struct { + mu sync.RWMutex + cache map[TxNonce]*list.Element + order *list.List + // - if maxTx == 0, there is no cap on the number of transactions in the cache + // - if maxTx > 0, the cache will cap the number of transactions it stores, + // - if maxTx < 0, the cache is a no-op cache. + maxTx int +} + +func NewAnteCache(mempoolMaxTxs int) *AnteCache { + return &AnteCache{ + cache: make(map[TxNonce]*list.Element), + order: list.New(), + maxTx: mempoolMaxTxs, + } +} + +// Set the TxNonce +func (c *AnteCache) Set(address string, nonce uint64) { + if c.maxTx < 0 { + return + } + c.mu.Lock() + defer c.mu.Unlock() + key := TxNonce{address, nonce} + if elem, ok := c.cache[key]; ok { + c.order.MoveToBack(elem) + return + } + if c.maxTx > 0 && len(c.cache) >= c.maxTx { + if front := c.order.Front(); front != nil { + oldKey := front.Value.(TxNonce) + delete(c.cache, oldKey) + c.order.Remove(front) + } + } + elem := c.order.PushBack(key) + c.cache[key] = elem +} + +// Delete the TxNonce +func (c *AnteCache) Delete(address string, nonce uint64) { + if c.maxTx < 0 { + return + } + c.mu.Lock() + defer c.mu.Unlock() + key := TxNonce{address, nonce} + if elem, ok := c.cache[key]; ok { + c.order.Remove(elem) + delete(c.cache, key) + } +} + +// Exists check if the TxNonce exists +func (c *AnteCache) Exists(address string, nonce uint64) bool { + if c.maxTx < 0 { + return false + } + c.mu.RLock() + defer c.mu.RUnlock() + key := TxNonce{address, nonce} + _, ok := c.cache[key] + return ok +} + +func (c *AnteCache) Size() int { + c.mu.RLock() + defer c.mu.RUnlock() + return len(c.cache) +} diff --git a/ante/cache/antecache_test.go b/ante/cache/antecache_test.go new file mode 100644 index 0000000000..3fb838591b --- /dev/null +++ b/ante/cache/antecache_test.go @@ -0,0 +1,107 @@ +package cache_test + +import ( + "testing" + + "github.com/evmos/ethermint/ante/cache" + + "github.com/stretchr/testify/require" +) + +func TestAnteCache_SetAndExists(t *testing.T) { + antecache := cache.NewAnteCache(0) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + + nonce := uint64(42) + antecache.Set(address, nonce) + + exists := antecache.Exists(address, nonce) + require.True(t, exists, "expected TxNonce to exist after Set") +} + +func TestAnteCache_Delete(t *testing.T) { + antecache := cache.NewAnteCache(0) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + nonce := uint64(42) + antecache.Set(address, nonce) + antecache.Delete(address, nonce) + + exists := antecache.Exists(address, nonce) + require.False(t, exists, "expected TxNonce to not exist after Delete") +} + +func TestAnteCache_ExistsForNonExistentNonce(t *testing.T) { + antecache := cache.NewAnteCache(0) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + + exists := antecache.Exists(address, 99) + require.False(t, exists, "expected TxNonce to not exist when not set") +} + +func TestAnteCache_ConcurrentAccess(t *testing.T) { + antecache := cache.NewAnteCache(0) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + + nonce := uint64(100) + done := make(chan bool) + + // Writer + go func() { + for i := 0; i < 1000; i++ { + antecache.Set(address, nonce+uint64(i)) + } + done <- true + }() + + // Reader + go func() { + for i := 0; i < 1000; i++ { + antecache.Exists(address, nonce+uint64(i)) + } + done <- true + }() + + <-done + <-done +} + +// bounded caches should continue tracking the latest nonce +// even after they reach capacity. Right now Set simply returns when +// len(cache) >= maxTx without signalling failure, so callers assume the nonce +// was cached. When that happens, a replacement tx never sees its nonce in the +// cache and gets rejected with ErrInvalidSequence, effectively disabling nonce +// replacement once a node hits maxTx and amplifying the leak documented above. +func TestAnteCache_DropNewEntriesWhenFull(t *testing.T) { + antecache := cache.NewAnteCache(1) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + + antecache.Set(address, 1) + antecache.Set(address, 2) + + require.True(t, antecache.Exists(address, 2), "cache should keep track of replacement nonce even when full") +} + +func TestAnteCache_MultipleNoncesPerAddress(t *testing.T) { + antecache := cache.NewAnteCache(0) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + + antecache.Set(address, 1) + antecache.Set(address, 2) + + require.True(t, antecache.Exists(address, 1)) + require.True(t, antecache.Exists(address, 2)) + require.Equal(t, 2, antecache.Size()) +} + +func TestAnteCache_ExistsShortcut(t *testing.T) { + antecache := cache.NewAnteCache(0) + address := "cosmos1huydeevpz37sd9shv2gqf9p8unc0j89x59cn3c" + + require.False(t, antecache.Exists(address, 1)) + + antecache.Set(address, 1) + require.True(t, antecache.Exists(address, 1)) + + antecache.Delete(address, 1) + require.False(t, antecache.Exists(address, 1)) +} diff --git a/app/ante/authz.go b/ante/cosmos/authz.go similarity index 95% rename from app/ante/authz.go rename to ante/cosmos/authz.go index 3909d0b3e1..ffbb37b234 100644 --- a/app/ante/authz.go +++ b/ante/cosmos/authz.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package cosmos import ( "fmt" @@ -48,8 +48,12 @@ func NewAuthzLimiterDecorator(disabledMsgTypes []string) AuthzLimiterDecorator { } func (ald AuthzLimiterDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (newCtx sdk.Context, err error) { + if len(ald.disabledMsgs) == 0 { + return next(ctx, tx, simulate) + } + if err := ald.checkDisabledMsgs(tx.GetMsgs(), false, 0); err != nil { - return ctx, errorsmod.Wrapf(errortypes.ErrUnauthorized, err.Error()) + return ctx, errorsmod.Wrap(errortypes.ErrUnauthorized, err.Error()) } return next(ctx, tx, simulate) } diff --git a/app/ante/eip712.go b/ante/cosmos/eip712.go similarity index 80% rename from app/ante/eip712.go rename to ante/cosmos/eip712.go index 2237a7910c..a410df9342 100644 --- a/app/ante/eip712.go +++ b/ante/cosmos/eip712.go @@ -13,13 +13,12 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package cosmos import ( "fmt" errorsmod "cosmossdk.io/errors" - txsigning "cosmossdk.io/x/tx/signing" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -29,10 +28,8 @@ import ( authante "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - ibcante "github.com/cosmos/ibc-go/v8/modules/core/ante" - + txsigning "github.com/cosmos/cosmos-sdk/x/tx/signing" ethcrypto "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/signer/core/apitypes" "github.com/evmos/ethermint/crypto/ethsecp256k1" "github.com/evmos/ethermint/ethereum/eip712" @@ -41,7 +38,7 @@ import ( evmtypes "github.com/evmos/ethermint/x/evm/types" ) -var ethermintCodec codec.ProtoCodecMarshaler +var ethermintCodec codec.Codec func init() { registry := codectypes.NewInterfaceRegistry() @@ -49,43 +46,6 @@ func init() { ethermintCodec = codec.NewProtoCodec(registry) } -// Deprecated: NewLegacyCosmosAnteHandlerEip712 creates an AnteHandler to process legacy EIP-712 -// transactions, as defined by the presence of an ExtensionOptionsWeb3Tx extension. -func NewLegacyCosmosAnteHandlerEip712(ctx sdk.Context, options HandlerOptions, extra ...sdk.AnteDecorator) sdk.AnteHandler { - evmParams := options.EvmKeeper.GetParams(ctx) - feemarketParams := options.FeeMarketKeeper.GetParams(ctx) - evmDenom := evmParams.EvmDenom - chainID := options.EvmKeeper.ChainID() - chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(chainID) - var txFeeChecker authante.TxFeeChecker - if options.DynamicFeeChecker { - txFeeChecker = NewDynamicFeeChecker(ethCfg, &evmParams, &feemarketParams) - } - decorators := []sdk.AnteDecorator{ - RejectMessagesDecorator{}, // reject MsgEthereumTxs - // disable the Msg types that cannot be included on an authz.MsgExec msgs field - NewAuthzLimiterDecorator(options.DisabledAuthzMsgs), - authante.NewSetUpContextDecorator(), - authante.NewValidateBasicDecorator(), - authante.NewTxTimeoutHeightDecorator(), - NewMinGasPriceDecorator(options.FeeMarketKeeper, evmDenom, &feemarketParams), - authante.NewValidateMemoDecorator(options.AccountKeeper), - authante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, txFeeChecker), - // SetPubKeyDecorator must be called before all signature verification decorators - authante.NewSetPubKeyDecorator(options.AccountKeeper), - authante.NewValidateSigCountDecorator(options.AccountKeeper), - authante.NewSigGasConsumeDecorator(options.AccountKeeper, options.SigGasConsumer), - // Note: signature verification uses EIP instead of the cosmos signature validator - NewLegacyEip712SigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), - authante.NewIncrementSequenceDecorator(options.AccountKeeper), - ibcante.NewRedundantRelayDecorator(options.IBCKeeper), - } - decorators = append(decorators, extra...) - return sdk.ChainAnteDecorators(decorators...) -} - // Deprecated: LegacyEip712SigVerificationDecorator Verify all signatures for a tx and return an error if any are invalid. Note, // the LegacyEip712SigVerificationDecorator decorator will not get executed on ReCheck. // NOTE: As of v0.20.0, EIP-712 signature verification is handled by the ethsecp256k1 public key (see ethsecp256k1.go) @@ -234,7 +194,7 @@ func VerifySignature( return errorsmod.Wrap(errortypes.ErrNoSignatures, "tx doesn't contain any msgs to verify signature") } - txBytes := legacytx.StdSignBytes( + txBytes := legacytx.StdSignBytes( //nolint:staticcheck signerData.ChainID, signerData.AccountNumber, signerData.Sequence, @@ -281,6 +241,10 @@ func VerifySignature( FeePayer: feePayer, } + if err := eip712.LegacyValidatePayloadMessages(msgs); err != nil { + return errorsmod.Wrap(err, "failed to validate payload messages") + } + typedData, err := eip712.LegacyWrapTxToTypedData(ethermintCodec, extOpt.TypedDataChainID, msgs[0], txBytes, feeDelegation) if err != nil { return errorsmod.Wrap(err, "failed to create EIP-712 typed data from tx") @@ -301,7 +265,7 @@ func VerifySignature( feePayerSig[ethcrypto.RecoveryIDOffset] -= 27 } - feePayerPubkey, err := secp256k1.RecoverPubkey(sigHash, feePayerSig) + feePayerPubkey, err := ethcrypto.Ecrecover(sigHash, feePayerSig) if err != nil { return errorsmod.Wrap(err, "failed to recover delegated fee payer from sig") } @@ -327,7 +291,7 @@ func VerifySignature( // VerifySignature of ethsecp256k1 accepts 64 byte signature [R||S] // WARNING! Under NO CIRCUMSTANCES try to use pubKey.VerifySignature there - if !secp256k1.VerifySignature(pubKey.Bytes(), sigHash, feePayerSig[:len(feePayerSig)-1]) { + if !ethcrypto.VerifySignature(pubKey.Bytes(), sigHash, feePayerSig[:len(feePayerSig)-1]) { return errorsmod.Wrap(errortypes.ErrorInvalidSigner, "unable to verify signer signature of EIP712 typed data") } diff --git a/ante/cosmos/eip712_test.go b/ante/cosmos/eip712_test.go new file mode 100644 index 0000000000..ee0a2688c5 --- /dev/null +++ b/ante/cosmos/eip712_test.go @@ -0,0 +1,185 @@ +package cosmos_test + +import ( + "math/big" + "testing" + + sdkmath "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/evmos/ethermint/crypto/ethsecp256k1" + "github.com/evmos/ethermint/testutil" + utiltx "github.com/evmos/ethermint/testutil/tx" + "github.com/stretchr/testify/require" +) + +func TestLegacyEIP712MixedMsg(t *testing.T) { + app := testutil.Setup(false, nil) + ctx := app.BaseApp.NewUncachedContext(false, tmproto.Header{ChainID: testutil.ChainID}) + app.FeeMarketKeeper.SetBaseFee(ctx, big.NewInt(1)) + + privKey, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + delegator := sdk.AccAddress(privKey.PubKey().Address().Bytes()) + + acc := app.AccountKeeper.NewAccountWithAddress(ctx, delegator) + app.AccountKeeper.SetAccount(ctx, acc) + + bondDenom, err := app.StakingKeeper.BondDenom(ctx) + require.NoError(t, err) + evmDenom := app.EvmKeeper.GetParams(ctx).EvmDenom + gas := uint64(500000) + delegationAmount := sdk.NewCoin(bondDenom, sdkmath.NewInt(100)) + feeAmount := sdk.NewCoins(sdk.NewCoin(evmDenom, sdkmath.NewInt(100*int64(gas)))) + + require.NoError(t, testutil.FundAccount( + app.BankKeeper, + ctx, + delegator, + sdk.NewCoins( + sdk.NewCoin(bondDenom, delegationAmount.Amount.MulRaw(10)), + sdk.NewCoin(evmDenom, feeAmount.AmountOf(evmDenom).MulRaw(2)), + ), + )) + + var valAddr sdk.ValAddress + err = app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) bool { + bz, err := app.StakingKeeper.ValidatorAddressCodec().StringToBytes(val.GetOperator()) + require.NoError(t, err) + valAddr = sdk.ValAddress(bz) + return true + }) + require.NoError(t, err) + require.NotEmpty(t, valAddr) + + msgs := []sdk.Msg{ + stakingtypes.NewMsgDelegate(delegator.String(), valAddr.String(), delegationAmount), + stakingtypes.NewMsgUndelegate(delegator.String(), valAddr.String(), delegationAmount), + } + + txArgs := utiltx.EIP712TxArgs{ + CosmosTxArgs: utiltx.CosmosTxArgs{ + TxCfg: app.TxConfig(), + Priv: privKey, + ChainID: testutil.ChainID, + Gas: gas, + Fees: feeAmount, + Msgs: msgs, + }, + UseLegacyExtension: true, + UseLegacyTypedData: true, + } + + tx, err := utiltx.CreateEIP712CosmosTx(ctx, app, txArgs) + require.NoError(t, err) + + txBytes, err := app.TxConfig().TxEncoder()(tx) + require.NoError(t, err) + height := app.LastBlockHeight() + 1 + res, err := app.FinalizeBlock(&abci.RequestFinalizeBlock{ + Height: height, + Txs: [][]byte{txBytes}, + }) + require.NoError(t, err) + require.Len(t, res.TxResults, 1) + + require.NotZero(t, res.TxResults[0].Code, "expected tx to fail with mixed message types") + require.Contains(t, res.TxResults[0].Log, "different types of messages detected", + "expected error about different message types") +} + +// TestLegacyEIP712SameMsgType tests that a legacy EIP-712 transaction with +// multiple messages of the same type succeeds on-chain. +func TestLegacyEIP712SameMsgType(t *testing.T) { + app := testutil.Setup(false, nil) + ctx := app.BaseApp.NewUncachedContext(false, tmproto.Header{ChainID: testutil.ChainID}) + app.FeeMarketKeeper.SetBaseFee(ctx, big.NewInt(1)) + + privKey, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + delegator := sdk.AccAddress(privKey.PubKey().Address().Bytes()) + + acc := app.AccountKeeper.NewAccountWithAddress(ctx, delegator) + app.AccountKeeper.SetAccount(ctx, acc) + + bondDenom, err := app.StakingKeeper.BondDenom(ctx) + require.NoError(t, err) + evmDenom := app.EvmKeeper.GetParams(ctx).EvmDenom + gas := uint64(500000) + delegationAmount := sdk.NewCoin(bondDenom, sdkmath.NewInt(100)) + feeAmount := sdk.NewCoins(sdk.NewCoin(evmDenom, sdkmath.NewInt(100*int64(gas)))) + + require.NoError(t, testutil.FundAccount( + app.BankKeeper, + ctx, + delegator, + sdk.NewCoins( + sdk.NewCoin(bondDenom, delegationAmount.Amount.MulRaw(10)), + sdk.NewCoin(evmDenom, feeAmount.AmountOf(evmDenom).MulRaw(2)), + ), + )) + + var valAddr sdk.ValAddress + err = app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) bool { + bz, err := app.StakingKeeper.ValidatorAddressCodec().StringToBytes(val.GetOperator()) + require.NoError(t, err) + valAddr = sdk.ValAddress(bz) + return true + }) + require.NoError(t, err) + require.NotEmpty(t, valAddr) + + _, err = app.StakingKeeper.GetDelegation(ctx, delegator, valAddr) + require.Error(t, err, "delegation should not exist before transaction") + + msgs := []sdk.Msg{ + stakingtypes.NewMsgDelegate(delegator.String(), valAddr.String(), delegationAmount), + stakingtypes.NewMsgDelegate(delegator.String(), valAddr.String(), delegationAmount), + } + + txArgs := utiltx.EIP712TxArgs{ + CosmosTxArgs: utiltx.CosmosTxArgs{ + TxCfg: app.TxConfig(), + Priv: privKey, + ChainID: testutil.ChainID, + Gas: gas, + Fees: feeAmount, + Msgs: msgs, + }, + UseLegacyExtension: true, + UseLegacyTypedData: true, + } + + tx, err := utiltx.CreateEIP712CosmosTx(ctx, app, txArgs) + require.NoError(t, err) + + txBytes, err := app.TxConfig().TxEncoder()(tx) + require.NoError(t, err) + height := app.LastBlockHeight() + 1 + res, err := app.FinalizeBlock(&abci.RequestFinalizeBlock{ + Height: height, + Txs: [][]byte{txBytes}, + }) + require.NoError(t, err) + require.Len(t, res.TxResults, 1) + require.Zero(t, res.TxResults[0].Code, "expected tx to succeed with same message types") + + _, err = app.Commit() + require.NoError(t, err) + + queryCtx := app.NewUncachedContext(false, tmproto.Header{ChainID: testutil.ChainID, Height: height + 1}) + delegation, err := app.StakingKeeper.GetDelegation(queryCtx, delegator, valAddr) + require.NoError(t, err) + + require.True(t, delegation.Shares.IsPositive(), + "expected positive delegation shares, got %s", delegation.Shares) + + validator, err := app.StakingKeeper.GetValidator(queryCtx, valAddr) + require.NoError(t, err) + expectedShares, err := validator.SharesFromTokens(delegationAmount.Amount.MulRaw(2)) + require.NoError(t, err) + require.True(t, delegation.Shares.Equal(expectedShares), + "expected delegation shares %s, got %s", expectedShares, delegation.Shares) +} diff --git a/app/ante/fees.go b/ante/cosmos/min_gas_price.go similarity index 96% rename from app/ante/fees.go rename to ante/cosmos/min_gas_price.go index d5946683df..510f388733 100644 --- a/app/ante/fees.go +++ b/ante/cosmos/min_gas_price.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package cosmos import ( "math/big" @@ -23,6 +23,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/evmos/ethermint/ante/interfaces" evmtypes "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" ) @@ -33,14 +34,14 @@ import ( // If fee is high enough, then call next AnteHandler // CONTRACT: Tx must implement FeeTx to use MinGasPriceDecorator type MinGasPriceDecorator struct { - feesKeeper FeeMarketKeeper + feesKeeper interfaces.FeeMarketKeeper evmDenom string feemarketParams *feemarkettypes.Params } // NewMinGasPriceDecorator creates a new MinGasPriceDecorator instance used only for // Cosmos transactions. -func NewMinGasPriceDecorator(fk FeeMarketKeeper, evmDenom string, feemarketParams *feemarkettypes.Params) MinGasPriceDecorator { +func NewMinGasPriceDecorator(fk interfaces.FeeMarketKeeper, evmDenom string, feemarketParams *feemarkettypes.Params) MinGasPriceDecorator { return MinGasPriceDecorator{feesKeeper: fk, evmDenom: evmDenom, feemarketParams: feemarketParams} } diff --git a/app/ante/reject_msgs.go b/ante/cosmos/reject_msgs.go similarity index 99% rename from app/ante/reject_msgs.go rename to ante/cosmos/reject_msgs.go index 5e8716a98e..d37b89ac3d 100644 --- a/app/ante/reject_msgs.go +++ b/ante/cosmos/reject_msgs.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package cosmos import ( errorsmod "cosmossdk.io/errors" diff --git a/app/ante/eth.go b/ante/eth.go similarity index 61% rename from app/ante/eth.go rename to ante/eth.go index 8d86c3404e..1b95b4de5a 100644 --- a/app/ante/eth.go +++ b/ante/eth.go @@ -16,37 +16,63 @@ package ante import ( + "fmt" "math" "math/big" + "github.com/evmos/ethermint/ante/cache" + errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/evmos/ethermint/ante/interfaces" ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/keeper" + "github.com/evmos/ethermint/x/evm/statedb" evmtypes "github.com/evmos/ethermint/x/evm/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" ) +type AccountGetter func(sdk.AccAddress) sdk.AccountI + +// NewCachedAccountGetter cache the account objects during the ante handler execution, +// it's safe because there's no store branching in the ante handlers, +// it also creates new account in memory if it doesn't exist in the store. +func NewCachedAccountGetter(ctx sdk.Context, ak evmtypes.AccountKeeper) AccountGetter { + accounts := make(map[string]sdk.AccountI, 1) + return func(addr sdk.AccAddress) sdk.AccountI { + acc := accounts[string(addr)] + if acc == nil { + acc = ak.GetAccount(ctx, addr) + if acc == nil { + // we create a new account in memory if it doesn't exist, + // which is only set to store when updated. + acc = ak.NewAccountWithAddress(ctx, addr) + } + accounts[string(addr)] = acc + } + return acc + } +} + // VerifyEthAccount validates checks that the sender balance is greater than the total transaction cost. -// The account will be set to store if it doesn't exis, i.e cannot be found on store. +// The account will be created in memory if it doesn't exist, i.e cannot be found on store, which will eventually set to +// store when increasing nonce. // This AnteHandler decorator will fail if: // - any of the msgs is not a MsgEthereumTx // - from address is empty // - account balance is lower than the transaction cost func VerifyEthAccount( ctx sdk.Context, tx sdk.Tx, - evmKeeper EVMKeeper, ak evmtypes.AccountKeeper, evmDenom string, + evmKeeper interfaces.EVMKeeper, evmDenom string, + accountGetter AccountGetter, + rules params.Rules, ) error { - if !ctx.IsCheckTx() { - return nil - } - for _, msg := range tx.GetMsgs() { msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx) if !ok { @@ -62,19 +88,18 @@ func VerifyEthAccount( } // check whether the sender address is EOA - fromAddr := common.BytesToAddress(from) - acct := evmKeeper.GetAccount(ctx, fromAddr) - - if acct == nil { - acc := ak.NewAccountWithAddress(ctx, from) - ak.SetAccount(ctx, acc) - } else if acct.IsContract() { - return errorsmod.Wrapf(errortypes.ErrInvalidType, - "the sender is not EOA: address %s, codeHash <%s>", fromAddr, acct.CodeHash) + acct := statedb.NewAccountFromSdkAccount(accountGetter(from)) + + if !rules.IsPrague { + if acct.IsContract() { + fromAddr := common.BytesToAddress(from) + return errorsmod.Wrapf(errortypes.ErrInvalidType, + "the sender is not EOA: address %s, codeHash <%s>", fromAddr, acct.CodeHash) + } } balance := evmKeeper.GetBalance(ctx, from, evmDenom) - if err := keeper.CheckSenderBalance(sdkmath.NewIntFromBigIntMut(balance), ethTx); err != nil { + if err := keeper.CheckSenderBalance(sdkmath.NewIntFromBigIntMut(balance.ToBig()), ethTx); err != nil { return errorsmod.Wrap(err, "failed to check sender balance") } } @@ -99,9 +124,8 @@ func VerifyEthAccount( func CheckEthGasConsume( ctx sdk.Context, tx sdk.Tx, rules params.Rules, - evmKeeper EVMKeeper, + evmKeeper interfaces.EVMKeeper, baseFee *big.Int, - maxGasWanted uint64, evmDenom string, ) (sdk.Context, error) { gasWanted := uint64(0) @@ -109,6 +133,7 @@ func CheckEthGasConsume( // Use the lowest priority of all the messages as the final one. minPriority := int64(math.MaxInt64) + blockGasLimit := ethermint.BlockGasLimit(ctx) for _, msg := range tx.GetMsgs() { msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx) @@ -122,25 +147,27 @@ func CheckEthGasConsume( minPriority = priority } + // We can't trust the tx gas limit, because we'll refund the unused gas. gasLimit := msgEthTx.GetGas() - if ctx.IsCheckTx() && maxGasWanted != 0 { - // We can't trust the tx gas limit, because we'll refund the unused gas. - if gasLimit > maxGasWanted { - gasWanted += maxGasWanted - } else { - gasWanted += gasLimit - } - } else { - gasWanted += gasLimit + if gasWanted > math.MaxInt64-gasLimit { + return ctx, fmt.Errorf("gasWanted(%d) + gasLimit(%d) overflow", gasWanted, gasLimit) + } + gasWanted += gasLimit + if gasWanted > blockGasLimit { + return ctx, errorsmod.Wrapf( + errortypes.ErrOutOfGas, + "tx gas (%d) exceeds block gas limit (%d)", + gasWanted, + blockGasLimit, + ) } - // user balance is already checked during CheckTx so there's no need to // verify it again during ReCheckTx if ctx.IsReCheckTx() { continue } - fees, err := keeper.VerifyFee(msgEthTx, evmDenom, baseFee, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai, ctx.IsCheckTx()) + fees, err := keeper.VerifyFee(msgEthTx, evmDenom, baseFee, rules, ctx.IsCheckTx()) if err != nil { return ctx, errorsmod.Wrapf(err, "failed to verify the fees") } @@ -160,22 +187,6 @@ func CheckEthGasConsume( ctx.EventManager().EmitEvents(events) - blockGasLimit := ethermint.BlockGasLimit(ctx) - - // return error if the tx gas is greater than the block limit (max gas) - - // NOTE: it's important here to use the gas wanted instead of the gas consumed - // from the tx gas pool. The later only has the value so far since the - // EthSetupContextDecorator so it will never exceed the block gas limit. - if gasWanted > blockGasLimit { - return ctx, errorsmod.Wrapf( - errortypes.ErrOutOfGas, - "tx gas (%d) exceeds block gas limit (%d)", - gasWanted, - blockGasLimit, - ) - } - // Set tx GasMeter with a limit of GasWanted (i.e gas limit from the Ethereum tx). // The gas consumed will be then reset to the gas used by the state transition // in the EVM. @@ -196,7 +207,7 @@ func CheckEthCanTransfer( ctx sdk.Context, tx sdk.Tx, baseFee *big.Int, rules params.Rules, - evmKeeper EVMKeeper, + evmKeeper interfaces.EVMKeeper, evmParams *evmtypes.Params, ) error { for _, msg := range tx.GetMsgs() { @@ -221,15 +232,18 @@ func CheckEthCanTransfer( ) } } - + value := tx.Value() + if value == nil || value.Sign() == -1 { + return fmt.Errorf("value (%s) must be positive", value) + } from := common.BytesToAddress(msgEthTx.From) // check that caller has enough balance to cover asset transfer for **topmost** call // NOTE: here the gas consumed is from the context with the infinite gas meter - if tx.Value().Sign() > 0 && !canTransfer(ctx, evmKeeper, evmParams.EvmDenom, from, tx.Value()) { + if value.Sign() > 0 && !canTransfer(ctx, evmKeeper, evmParams.EvmDenom, from, value) { return errorsmod.Wrapf( errortypes.ErrInsufficientFunds, "failed to transfer %s from address %s using the EVM block context transfer function", - tx.Value(), + value, from, ) } @@ -239,50 +253,78 @@ func CheckEthCanTransfer( } // canTransfer adapted the core.CanTransfer from go-ethereum -func canTransfer(ctx sdk.Context, evmKeeper EVMKeeper, denom string, from common.Address, amount *big.Int) bool { +func canTransfer(ctx sdk.Context, evmKeeper interfaces.EVMKeeper, denom string, from common.Address, amount *big.Int) bool { balance := evmKeeper.GetBalance(ctx, sdk.AccAddress(from.Bytes()), denom) - return balance.Cmp(amount) >= 0 + return balance.ToBig().Cmp(amount) >= 0 } -// CheckEthSenderNonce handles incrementing the sequence of the signer (i.e sender). If the transaction is a +// CheckAndSetEthSenderNonce handles incrementing the sequence of the signer (i.e sender). If the transaction is a // contract creation, the nonce will be incremented during the transaction execution and not within // this AnteHandler decorator. -func CheckEthSenderNonce( - ctx sdk.Context, tx sdk.Tx, ak evmtypes.AccountKeeper, -) error { +func CheckAndSetEthSenderNonce( + ctx sdk.Context, tx sdk.Tx, ak evmtypes.AccountKeeper, unsafeUnOrderedTx bool, accountGetter AccountGetter, nonceCache *cache.AnteCache, +) ([]cache.TxNonce, error) { + var pending []cache.TxNonce + for _, msg := range tx.GetMsgs() { msgEthTx, ok := msg.(*evmtypes.MsgEthereumTx) if !ok { - return errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil)) + return nil, errorsmod.Wrapf(errortypes.ErrUnknownRequest, "invalid message type %T, expected %T", msg, (*evmtypes.MsgEthereumTx)(nil)) } tx := msgEthTx.AsTransaction() - // increase sequence of sender - acc := ak.GetAccount(ctx, msgEthTx.GetFrom()) + from := msgEthTx.GetFrom() + acc := accountGetter(from) if acc == nil { - return errorsmod.Wrapf( + return nil, errorsmod.Wrapf( errortypes.ErrUnknownAddress, - "account %s is nil", common.BytesToAddress(msgEthTx.GetFrom().Bytes()), + "account %s is nil", common.BytesToAddress(from.Bytes()), ) } - nonce := acc.GetSequence() + expectedNonce := acc.GetSequence() + txNonce := tx.Nonce() + fromStr := from.String() + + // if flag is set, we bypass nonce all check verification + if !unsafeUnOrderedTx { + ex := nonceCache.Exists(fromStr, txNonce) + // to support tx replacement, we check if the transaction nonce exists in the cache and if yes we skip + // nonce verification, and we don't set the sequence + // We allow skip verification only during CheckTx to keep sequence safe during the execution. + if ctx.IsCheckTx() && !ctx.IsReCheckTx() && ex { + continue + } - // we merged the nonce verification to nonce increment, so when tx includes multiple messages - // with same sender, they'll be accepted. - if tx.Nonce() != nonce { - return errorsmod.Wrapf( - errortypes.ErrInvalidSequence, - "invalid nonce; got %d, expected %d", tx.Nonce(), nonce, - ) + // nonce verification, the sequence needs to be in order + if txNonce != expectedNonce { + // delete in case of recheck tx + if ex { + nonceCache.Delete(fromStr, txNonce) + } + return nil, errorsmod.Wrapf( + errortypes.ErrInvalidSequence, + "invalid nonce; got %d, expected %d", txNonce, expectedNonce, + ) + } + + if ctx.IsCheckTx() { + if !ctx.IsReCheckTx() { + pending = append(pending, cache.TxNonce{Address: fromStr, Nonce: txNonce}) + } + } else if ex { + // delete in case of deliver tx + nonceCache.Delete(fromStr, txNonce) + } } - if err := acc.SetSequence(nonce + 1); err != nil { - return errorsmod.Wrapf(err, "failed to set sequence to %d", acc.GetSequence()+1) + // increase sequence of sender + if err := acc.SetSequence(expectedNonce + 1); err != nil { + return nil, errorsmod.Wrapf(err, "failed to set sequence to %d", acc.GetSequence()+1) } ak.SetAccount(ctx, acc) } - return nil + return pending, nil } diff --git a/app/ante/fee_checker.go b/ante/evm/fee_checker.go similarity index 96% rename from app/ante/fee_checker.go rename to ante/evm/fee_checker.go index 3a97ecb0b2..47fbaf437a 100644 --- a/app/ante/fee_checker.go +++ b/ante/evm/fee_checker.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package evm import ( "fmt" @@ -78,7 +78,7 @@ func NewDynamicFeeChecker(ethCfg *params.ChainConfig, evmParams *types.Params, f gas := feeTx.GetGas() feeCoins := feeTx.GetFee() - fee := feeCoins.AmountOfNoDenomValidation(denom) + fee := feeCoins.AmountOf(denom) feeCap := fee.Quo(sdkmath.NewIntFromUint64(gas)) baseFeeInt := sdkmath.NewIntFromBigInt(baseFee) @@ -118,7 +118,10 @@ func checkTxFeeWithValidatorMinGasPrices(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, } feeCoins := feeTx.GetFee() - gas := feeTx.GetGas() + gas, err := ethermint.SafeInt64(feeTx.GetGas()) + if err != nil { + return nil, 0, err + } minGasPrices := ctx.MinGasPrices() // Ensure that the provided fees meet a minimum threshold for the validator, @@ -129,7 +132,7 @@ func checkTxFeeWithValidatorMinGasPrices(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, // Determine the required fees by multiplying each required minimum gas // price by the gas limit, where fee = ceil(minGasPrice * gasLimit). - glDec := sdkmath.LegacyNewDec(int64(gas)) + glDec := sdkmath.LegacyNewDec(gas) for i, gp := range minGasPrices { fee := gp.Amount.Mul(glDec) @@ -141,7 +144,7 @@ func checkTxFeeWithValidatorMinGasPrices(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, } } - priority := getTxPriority(feeCoins, int64(gas)) + priority := getTxPriority(feeCoins, gas) return feeCoins, priority, nil } diff --git a/app/ante/fee_checker_test.go b/ante/evm/fee_checker_test.go similarity index 99% rename from app/ante/fee_checker_test.go rename to ante/evm/fee_checker_test.go index ec956c15e8..b9dc00daec 100644 --- a/app/ante/fee_checker_test.go +++ b/ante/evm/fee_checker_test.go @@ -1,4 +1,4 @@ -package ante +package evm import ( "math/big" @@ -7,7 +7,7 @@ import ( sdkmath "cosmossdk.io/math" "github.com/stretchr/testify/require" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/app/ante/nativefee.go b/ante/evm/nativefee.go similarity index 99% rename from app/ante/nativefee.go rename to ante/evm/nativefee.go index 50d05af04c..4f2c77ebae 100644 --- a/app/ante/nativefee.go +++ b/ante/evm/nativefee.go @@ -1,4 +1,4 @@ -package ante +package evm import ( "bytes" diff --git a/app/ante/interfaces.go b/ante/interfaces/evm.go similarity index 98% rename from app/ante/interfaces.go rename to ante/interfaces/evm.go index c81683daa0..7bbf268f1a 100644 --- a/app/ante/interfaces.go +++ b/ante/interfaces/evm.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package interfaces import ( "math/big" diff --git a/app/ante/setup.go b/ante/interfaces/setup.go similarity index 88% rename from app/ante/setup.go rename to ante/interfaces/setup.go index eb61eb96c2..760f13412d 100644 --- a/app/ante/setup.go +++ b/ante/interfaces/setup.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package ante +package interfaces import ( "errors" @@ -21,7 +21,7 @@ import ( errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -86,6 +86,10 @@ func ValidateEthBasic(ctx sdk.Context, tx sdk.Tx, evmParams *evmtypes.Params, ba return errorsmod.Wrap(errortypes.ErrInvalidRequest, "for eth tx AuthInfo Fee payer and granter should be empty") } + if authInfo.Tip != nil { + return errorsmod.Wrap(errortypes.ErrInvalidRequest, "for eth tx AuthInfo Tip should be nil") + } + sigs := protoTx.Signatures if len(sigs) > 0 { return errorsmod.Wrap(errortypes.ErrInvalidRequest, "for eth tx Signatures should be empty") @@ -125,6 +129,16 @@ func ValidateEthBasic(ctx sdk.Context, tx sdk.Tx, evmParams *evmtypes.Params, ba "rejected unprotected Ethereum transaction. Please EIP155 sign your transaction to protect it against replay-attacks") } + // Check that EIP-7702 authorization list signatures are well formed. + if tx.SetCodeAuthorizations() != nil { + if tx.To() == nil { + return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "EIP-7702 set code transaction cannot be contract creation (sender %v)", msgEthTx.From) + } + if len(tx.SetCodeAuthorizations()) == 0 { + return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "EIP-7702 authorization list cannot be empty (sender %v)", msgEthTx.From) + } + } + txFee = txFee.Add(sdk.Coin{Denom: evmDenom, Amount: sdkmath.NewIntFromBigInt(msgEthTx.GetFee())}) } diff --git a/app/ante/sigverify.go b/ante/sigverify.go similarity index 100% rename from app/ante/sigverify.go rename to ante/sigverify.go diff --git a/app/ante/eth_test.go b/app/ante/eth_test.go deleted file mode 100644 index 93a3da1eea..0000000000 --- a/app/ante/eth_test.go +++ /dev/null @@ -1,502 +0,0 @@ -package ante_test - -import ( - "math" - "math/big" - - sdk "github.com/cosmos/cosmos-sdk/types" - - storetypes "cosmossdk.io/store/types" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app/ante" - "github.com/evmos/ethermint/server/config" - "github.com/evmos/ethermint/tests" - ethermint "github.com/evmos/ethermint/types" - "github.com/evmos/ethermint/x/evm/statedb" - evmtypes "github.com/evmos/ethermint/x/evm/types" -) - -func (suite *AnteTestSuite) TestNewEthAccountVerificationDecorator() { - addr := tests.GenerateAddress() - - tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) - tx.From = addr.Bytes() - - var vmdb *statedb.StateDB - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - checkTx bool - expPass bool - }{ - {"not CheckTx", nil, func() {}, false, true}, - {"invalid transaction type", &invalidTx{}, func() {}, true, false}, - { - "sender not set to msg", - evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil), - func() {}, - true, - false, - }, - { - "sender not EOA", - tx, - func() { - // set not as an EOA - vmdb.SetCode(addr, []byte("1")) - }, - true, - false, - }, - { - "not enough balance to cover tx cost", - tx, - func() { - // reset back to EOA - vmdb.SetCode(addr, nil) - }, - true, - false, - }, - { - "success new account", - tx, - func() { - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - true, - true, - }, - { - "success existing account", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - true, - true, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - vmdb = suite.StateDB() - tc.malleate() - suite.Require().NoError(vmdb.Commit()) - - err := ante.VerifyEthAccount(suite.ctx.WithIsCheckTx(tc.checkTx), tc.tx, suite.app.EvmKeeper, suite.app.AccountKeeper, evmtypes.DefaultEVMDenom) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *AnteTestSuite) TestEthNonceVerificationDecorator() { - suite.SetupTest() - - addr := tests.GenerateAddress() - - tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) - tx.From = addr.Bytes() - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - reCheckTx bool - expPass bool - }{ - {"ReCheckTx", &invalidTx{}, func() {}, true, false}, - {"invalid transaction type", &invalidTx{}, func() {}, false, false}, - {"sender account not found", tx, func() {}, false, false}, - { - "sender nonce missmatch", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - false, - }, - { - "success", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.Require().NoError(acc.SetSequence(1)) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - true, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - tc.malleate() - err := ante.CheckEthSenderNonce(suite.ctx.WithIsReCheckTx(tc.reCheckTx), tc.tx, suite.app.AccountKeeper) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { - evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - chainID := suite.app.EvmKeeper.ChainID() - chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(chainID) - baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) - rules := ethCfg.Rules(big.NewInt(suite.ctx.BlockHeight()), ethCfg.MergeNetsplitBlock != nil, uint64(suite.ctx.BlockHeader().Time.Unix())) - - addr := tests.GenerateAddress() - - txGasLimit := uint64(1000) - tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), txGasLimit, big.NewInt(1), nil, nil, nil, nil) - tx.From = addr.Bytes() - - suite.Require().Equal(int64(765625000), baseFee.Int64()) - - gasPrice := new(big.Int).Add(baseFee, evmtypes.DefaultPriorityReduction.BigInt()) - - tx2GasLimit := uint64(1000000) - tx2 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx2GasLimit, gasPrice, nil, nil, nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) - tx2.From = addr.Bytes() - tx2Priority := int64(1) - - tx3GasLimit := ethermint.BlockGasLimit(suite.ctx) + uint64(1) - tx3 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx3GasLimit, gasPrice, nil, nil, nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) - - dynamicFeeTx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx2GasLimit, - nil, // gasPrice - new(big.Int).Add(baseFee, big.NewInt(evmtypes.DefaultPriorityReduction.Int64()*2)), // gasFeeCap - evmtypes.DefaultPriorityReduction.BigInt(), // gasTipCap - nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) - dynamicFeeTx.From = addr.Bytes() - dynamicFeeTxPriority := int64(1) - - var vmdb *statedb.StateDB - - testCases := []struct { - name string - tx sdk.Tx - gasLimit uint64 - malleate func() - expPass bool - expPanic bool - expPriority int64 - }{ - {"invalid transaction type", &invalidTx{}, math.MaxUint64, func() {}, false, false, 0}, - { - "sender not found", - evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil), - math.MaxUint64, - func() {}, - false, false, - 0, - }, - { - "gas limit too low", - tx, - math.MaxUint64, - func() {}, - false, false, - 0, - }, - { - "gas limit above block gas limit", - tx3, - math.MaxUint64, - func() {}, - false, false, - 0, - }, - { - "not enough balance for fees", - tx2, - math.MaxUint64, - func() {}, - false, false, - 0, - }, - { - "not enough tx gas", - tx2, - 0, - func() { - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - false, true, - 0, - }, - { - "not enough block gas", - tx2, - 0, - func() { - vmdb.AddBalance(addr, big.NewInt(1000000)) - suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(1)) - }, - false, true, - 0, - }, - { - "success - legacy tx", - tx2, - tx2GasLimit, // it's capped - func() { - vmdb.AddBalance(addr, big.NewInt(1001000000000000)) - suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(10000000000000000000)) - }, - true, false, - tx2Priority, - }, - { - "success - dynamic fee tx", - dynamicFeeTx, - tx2GasLimit, // it's capped - func() { - vmdb.AddBalance(addr, big.NewInt(1001000000000000)) - suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(10000000000000000000)) - }, - true, false, - dynamicFeeTxPriority, - }, - { - "success - gas limit on gasMeter is set on ReCheckTx mode", - dynamicFeeTx, - tx2GasLimit, // it's capped - func() { - vmdb.AddBalance(addr, big.NewInt(1001000000000000)) - suite.ctx = suite.ctx.WithIsReCheckTx(true) - }, - true, false, - 1, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - vmdb = suite.StateDB() - tc.malleate() - suite.Require().NoError(vmdb.Commit()) - - if tc.expPanic { - suite.Require().Panics(func() { - _, _ = ante.CheckEthGasConsume( - suite.ctx.WithIsCheckTx(true).WithGasMeter(storetypes.NewGasMeter(1)), tc.tx, - rules, suite.app.EvmKeeper, baseFee, config.DefaultMaxTxGasWanted, evmtypes.DefaultEVMDenom, - ) - }) - return - } - - ctx, err := ante.CheckEthGasConsume( - suite.ctx.WithIsCheckTx(true).WithGasMeter(storetypes.NewInfiniteGasMeter()), tc.tx, - rules, suite.app.EvmKeeper, baseFee, config.DefaultMaxTxGasWanted, evmtypes.DefaultEVMDenom, - ) - if tc.expPass { - suite.Require().NoError(err) - suite.Require().Equal(tc.expPriority, ctx.Priority()) - } else { - suite.Require().Error(err) - } - suite.Require().Equal(tc.gasLimit, ctx.GasMeter().Limit()) - }) - } -} - -func (suite *AnteTestSuite) TestCanTransferDecorator() { - addr, privKey := tests.NewAddrKey() - suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, big.NewInt(100)) - - evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) - chainID := suite.app.EvmKeeper.ChainID() - chainCfg := evmParams.GetChainConfig() - ethCfg := chainCfg.EthereumConfig(chainID) - baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) - rules := ethCfg.Rules(big.NewInt(suite.ctx.BlockHeight()), ethCfg.MergeNetsplitBlock != nil, uint64(suite.ctx.BlockHeader().Time.Unix())) - - tx := evmtypes.NewTxContract( - suite.app.EvmKeeper.ChainID(), - 1, - big.NewInt(10), - 1000, - big.NewInt(150), - big.NewInt(200), - nil, - nil, - ðtypes.AccessList{}, - ) - tx2 := evmtypes.NewTxContract( - suite.app.EvmKeeper.ChainID(), - 1, - big.NewInt(10), - 1000, - big.NewInt(150), - big.NewInt(200), - nil, - nil, - ðtypes.AccessList{}, - ) - - tx.From = addr.Bytes() - - err := tx.Sign(suite.ethSigner, tests.NewSigner(privKey)) - suite.Require().NoError(err) - - var vmdb *statedb.StateDB - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - expPass bool - }{ - {"invalid transaction type", &invalidTx{}, func() {}, false}, - {"AsMessage failed", tx2, func() {}, false}, - { - "evm CanTransfer failed", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - false, - }, - { - "success", - tx, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - vmdb.AddBalance(addr, big.NewInt(1000000)) - }, - true, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - vmdb = suite.StateDB() - tc.malleate() - suite.Require().NoError(vmdb.Commit()) - - err := ante.CheckEthCanTransfer( - suite.ctx.WithIsCheckTx(true), tc.tx, - baseFee, rules, suite.app.EvmKeeper, &evmParams, - ) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *AnteTestSuite) TestEthIncrementSenderSequenceDecorator() { - addr, privKey := tests.NewAddrKey() - - contract := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) - contract.From = addr.Bytes() - err := contract.Sign(suite.ethSigner, tests.NewSigner(privKey)) - suite.Require().NoError(err) - - to := tests.GenerateAddress() - tx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 0, &to, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) - tx.From = addr.Bytes() - err = tx.Sign(suite.ethSigner, tests.NewSigner(privKey)) - suite.Require().NoError(err) - - tx2 := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) - tx2.From = addr.Bytes() - err = tx2.Sign(suite.ethSigner, tests.NewSigner(privKey)) - suite.Require().NoError(err) - - testCases := []struct { - name string - tx sdk.Tx - malleate func() - expPass bool - expPanic bool - }{ - { - "invalid transaction type", - &invalidTx{}, - func() {}, - false, false, - }, - { - "no signers", - evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil), - func() {}, - false, false, - }, - { - "account not set to store", - tx, - func() {}, - false, false, - }, - { - "success - create contract", - contract, - func() { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - }, - true, false, - }, - { - "success - call", - tx2, - func() {}, - true, false, - }, - } - - for _, tc := range testCases { - suite.Run(tc.name, func() { - tc.malleate() - - if tc.expPanic { - suite.Require().Panics(func() { - _ = ante.CheckEthSenderNonce(suite.ctx, tc.tx, suite.app.AccountKeeper) - }) - return - } - - err := ante.CheckEthSenderNonce(suite.ctx, tc.tx, suite.app.AccountKeeper) - - if tc.expPass { - suite.Require().NoError(err) - msg := tc.tx.(*evmtypes.MsgEthereumTx) - - txData := msg.AsTransaction() - suite.Require().NotNil(txData) - - nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, addr) - suite.Require().Equal(txData.Nonce()+1, nonce) - } else { - suite.Require().Error(err) - } - }) - } -} diff --git a/app/app_test.go b/app/app_test.go deleted file mode 100644 index 8b98589ba2..0000000000 --- a/app/app_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package app_test - -import ( - "os" - "testing" - - "github.com/evmos/ethermint/app" - "github.com/evmos/ethermint/testutil" - "github.com/stretchr/testify/require" - - "cosmossdk.io/log" - dbm "github.com/cosmos/cosmos-db" - - "github.com/cosmos/cosmos-sdk/baseapp" - simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" -) - -func TestEthermintAppExport(t *testing.T) { - db := dbm.NewMemDB() - ethApp := testutil.SetupWithDB(false, nil, db) - ethApp.Commit() - - // Making a new app object with the db, so that initchain hasn't been called - ethApp2 := app.NewEthermintApp( - log.NewLogger(os.Stdout), - db, - nil, - true, - simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), - baseapp.SetChainID(testutil.ChainID), - ) - _, err := ethApp2.ExportAppStateAndValidators(false, []string{}, []string{}) - require.NoError(t, err, "ExportAppStateAndValidators should not have an error") -} diff --git a/app/executor.go b/app/executor.go deleted file mode 100644 index 8086e49327..0000000000 --- a/app/executor.go +++ /dev/null @@ -1,129 +0,0 @@ -package app - -import ( - "context" - "io" - - "cosmossdk.io/store/cachemulti" - storetypes "cosmossdk.io/store/types" - abci "github.com/cometbft/cometbft/abci/types" - evmtypes "github.com/evmos/ethermint/x/evm/types" - - "github.com/cosmos/cosmos-sdk/baseapp" - - blockstm "github.com/crypto-org-chain/go-block-stm" -) - -func DefaultTxExecutor(_ context.Context, - blockSize int, - ms storetypes.MultiStore, - deliverTxWithMultiStore func(int, storetypes.MultiStore) *abci.ExecTxResult, -) ([]*abci.ExecTxResult, error) { - results := make([]*abci.ExecTxResult, blockSize) - for i := 0; i < blockSize; i++ { - results[i] = deliverTxWithMultiStore(i, ms) - } - return evmtypes.PatchTxResponses(results), nil -} - -func STMTxExecutor(stores []storetypes.StoreKey, workers int) baseapp.TxExecutor { - index := make(map[storetypes.StoreKey]int, len(stores)) - for i, k := range stores { - index[k] = i - } - return func( - ctx context.Context, - blockSize int, - ms storetypes.MultiStore, - deliverTxWithMultiStore func(int, storetypes.MultiStore) *abci.ExecTxResult, - ) ([]*abci.ExecTxResult, error) { - if blockSize == 0 { - return nil, nil - } - results := make([]*abci.ExecTxResult, blockSize) - if err := blockstm.ExecuteBlock( - ctx, - blockSize, - index, - stmMultiStoreWrapper{ms}, - workers, - func(txn blockstm.TxnIndex, ms blockstm.MultiStore) { - result := deliverTxWithMultiStore(int(txn), msWrapper{ms}) - results[txn] = result - }, - ); err != nil { - return nil, err - } - - return evmtypes.PatchTxResponses(results), nil - } -} - -type msWrapper struct { - blockstm.MultiStore -} - -var _ storetypes.MultiStore = msWrapper{} - -func (ms msWrapper) getCacheWrapper(key storetypes.StoreKey) storetypes.CacheWrapper { - return ms.GetStore(key) -} - -func (ms msWrapper) GetStore(key storetypes.StoreKey) storetypes.Store { - return ms.MultiStore.GetStore(key) -} - -func (ms msWrapper) GetKVStore(key storetypes.StoreKey) storetypes.KVStore { - return ms.MultiStore.GetKVStore(key) -} - -func (ms msWrapper) GetObjKVStore(key storetypes.StoreKey) storetypes.ObjKVStore { - return ms.MultiStore.GetObjKVStore(key) -} - -func (ms msWrapper) CacheMultiStore() storetypes.CacheMultiStore { - return cachemulti.NewFromParent(ms.getCacheWrapper, nil, nil) -} - -// Implements CacheWrapper. -func (ms msWrapper) CacheWrap() storetypes.CacheWrap { - return ms.CacheMultiStore().(storetypes.CacheWrap) -} - -// GetStoreType returns the type of the store. -func (ms msWrapper) GetStoreType() storetypes.StoreType { - return storetypes.StoreTypeMulti -} - -// Implements interface MultiStore -func (ms msWrapper) SetTracer(io.Writer) storetypes.MultiStore { - return nil -} - -// Implements interface MultiStore -func (ms msWrapper) SetTracingContext(storetypes.TraceContext) storetypes.MultiStore { - return nil -} - -// Implements interface MultiStore -func (ms msWrapper) TracingEnabled() bool { - return false -} - -type stmMultiStoreWrapper struct { - storetypes.MultiStore -} - -var _ blockstm.MultiStore = stmMultiStoreWrapper{} - -func (ms stmMultiStoreWrapper) GetStore(key storetypes.StoreKey) storetypes.Store { - return ms.MultiStore.GetStore(key) -} - -func (ms stmMultiStoreWrapper) GetKVStore(key storetypes.StoreKey) storetypes.KVStore { - return ms.MultiStore.GetKVStore(key) -} - -func (ms stmMultiStoreWrapper) GetObjKVStore(key storetypes.StoreKey) storetypes.ObjKVStore { - return ms.MultiStore.GetObjKVStore(key) -} diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index e8c1d48c18..bf0dd950b4 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -140,6 +140,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -179,7 +183,6 @@ paths: name "y.z". - JSON @@ -357,6 +360,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -396,7 +403,6 @@ paths: name "y.z". - JSON @@ -574,6 +580,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -613,7 +623,6 @@ paths: name "y.z". - JSON @@ -784,6 +793,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -823,7 +836,6 @@ paths: name "y.z". - JSON @@ -1009,6 +1021,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -1048,7 +1064,6 @@ paths: name "y.z". - JSON @@ -1234,6 +1249,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -1273,7 +1292,6 @@ paths: name "y.z". - JSON @@ -1572,6 +1590,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -1611,7 +1633,6 @@ paths: name "y.z". - JSON @@ -1828,7 +1849,7 @@ paths: prague) description: >- ChainConfig defines the Ethereum ChainConfig parameters - using *sdk.Int values + using *sdkmath.Int values instead of *big.Int. allow_unprotected_txs: @@ -1838,6 +1859,10 @@ paths: EIP155 signed) transactions can be executed on the state machine. + header_hash_num: + type: string + format: uint64 + description: header_hash_num is the number of header hash to persist. title: Params defines the EVM module parameters description: >- QueryParamsResponse defines the response type for querying x/evm @@ -1955,6 +1980,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -1994,7 +2023,6 @@ paths: name "y.z". - JSON @@ -2168,6 +2196,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -2207,7 +2239,6 @@ paths: name "y.z". - JSON @@ -2389,6 +2420,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -2428,7 +2463,6 @@ paths: name "y.z". - JSON @@ -2833,6 +2867,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -2872,7 +2910,6 @@ paths: name "y.z". - JSON @@ -3289,6 +3326,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -3328,7 +3369,6 @@ paths: name "y.z". - JSON @@ -3434,7 +3474,7 @@ paths: required: false type: number format: double - - name: msg.hash + - name: msg.deprecated_hash description: hash of the transaction in hex format. in: query required: false @@ -3455,6 +3495,12 @@ paths: required: false type: string format: byte + - name: msg.raw + description: raw is the raw bytes of the ethereum transaction. + in: query + required: false + type: string + format: byte - name: trace_config.tracer description: tracer is a custom javascript tracer. in: query @@ -3684,12 +3730,19 @@ paths: format: byte - name: chain_id description: >- - chain_id is the the eip155 chain id parsed from the requested block + chain_id is the eip155 chain id parsed from the requested block header. in: query required: false type: string format: int64 + - name: base_fee + description: >- + base_fee is the base fee based on the block_number of requested + transaction. + in: query + required: false + type: string tags: - Query /ethermint/evm/v1/validator_account/{cons_address}: @@ -3835,6 +3888,10 @@ paths: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -3874,7 +3931,6 @@ paths: name "y.z". - JSON @@ -4014,7 +4070,7 @@ definitions: type: string title: prague switch time (nil = no fork, 0 = already on prague) description: >- - ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int + ChainConfig defines the Ethereum ChainConfig parameters using *sdkmath.Int values instead of *big.Int. @@ -4187,6 +4243,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -4222,7 +4282,6 @@ definitions: name "y.z". - JSON @@ -4261,7 +4320,7 @@ definitions: type: number format: double title: size is the encoded storage size of the transaction (DEPRECATED) - hash: + deprecated_hash: type: string title: hash of the transaction in hex format deprecated_from: @@ -4276,6 +4335,10 @@ definitions: against the address derived from the signature (V, R, S) using the secp256k1 elliptic curve + raw: + type: string + format: byte + title: raw is the raw bytes of the ethereum transaction description: MsgEthereumTx encapsulates an Ethereum transaction as an SDK message. ethermint.evm.v1.MsgEthereumTxResponse: type: object @@ -4488,8 +4551,8 @@ definitions: type: string title: prague switch time (nil = no fork, 0 = already on prague) description: >- - ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int - values + ChainConfig defines the Ethereum ChainConfig parameters using + *sdkmath.Int values instead of *big.Int. allow_unprotected_txs: @@ -4497,6 +4560,10 @@ definitions: description: |- allow_unprotected_txs defines if replay-protected (i.e non EIP155 signed) transactions can be executed on the state machine. + header_hash_num: + type: string + format: uint64 + description: header_hash_num is the number of header hash to persist. title: Params defines the EVM module parameters ethermint.evm.v1.QueryAccountResponse: type: object @@ -4685,7 +4752,7 @@ definitions: title: prague switch time (nil = no fork, 0 = already on prague) description: >- ChainConfig defines the Ethereum ChainConfig parameters using - *sdk.Int values + *sdkmath.Int values instead of *big.Int. allow_unprotected_txs: @@ -4693,6 +4760,10 @@ definitions: description: |- allow_unprotected_txs defines if replay-protected (i.e non EIP155 signed) transactions can be executed on the state machine. + header_hash_num: + type: string + format: uint64 + description: header_hash_num is the number of header hash to persist. title: Params defines the EVM module parameters description: >- QueryParamsResponse defines the response type for querying x/evm @@ -4874,8 +4945,8 @@ definitions: type: string title: prague switch time (nil = no fork, 0 = already on prague) description: >- - ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int - values + ChainConfig defines the Ethereum ChainConfig parameters using + *sdkmath.Int values instead of *big.Int. enable_memory: @@ -4986,6 +5057,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -5021,7 +5096,6 @@ definitions: name "y.z". - JSON @@ -5162,6 +5236,10 @@ definitions: if (any.is(Foo.class)) { foo = any.unpack(Foo.class); } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } Example 3: Pack and unpack a message in Python. @@ -5197,7 +5275,6 @@ definitions: name "y.z". - JSON diff --git a/client/testnet.go b/client/testnet.go index 7fcc568748..31536e248e 100644 --- a/client/testnet.go +++ b/client/testnet.go @@ -38,6 +38,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" + crisistypes "github.com/cosmos/cosmos-sdk/contrib/x/crisis/types" "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/runtime" @@ -48,7 +49,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -242,10 +242,10 @@ func initTestnetFiles( appConfig := config.DefaultConfig() appConfig.MinGasPrices = args.minGasPrices appConfig.API.Enable = true - appConfig.Telemetry.Enabled = true - appConfig.Telemetry.PrometheusRetentionTime = 60 - appConfig.Telemetry.EnableHostnameLabel = false - appConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", args.chainID}} + appConfig.Telemetry.Enabled = true //nolint:staticcheck + appConfig.Telemetry.PrometheusRetentionTime = 60 //nolint:staticcheck + appConfig.Telemetry.EnableHostnameLabel = false //nolint:staticcheck + appConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", args.chainID}} //nolint:staticcheck var ( genAccounts []authtypes.GenesisAccount diff --git a/cmd/config/config.go b/cmd/config/config.go index 1e4583b2af..859ba1175d 100644 --- a/cmd/config/config.go +++ b/cmd/config/config.go @@ -55,7 +55,7 @@ func SetBech32Prefixes(config *sdk.Config) { func SetBip44CoinType(config *sdk.Config) { config.SetCoinType(ethermint.Bip44CoinType) config.SetPurpose(sdk.Purpose) // Shared - config.SetFullFundraiserPath(ethermint.BIP44HDPath) //nolint: staticcheck + config.SetFullFundraiserPath(ethermint.BIP44HDPath) //nolint:staticcheck } // RegisterDenoms registers the base and display denominations to the SDK. diff --git a/cmd/ethermintd/cmd_test.go b/cmd/ethermintd/cmd_test.go index dcacf45a7b..86b8e3e7d9 100644 --- a/cmd/ethermintd/cmd_test.go +++ b/cmd/ethermintd/cmd_test.go @@ -10,8 +10,8 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - "github.com/evmos/ethermint/app" ethermintd "github.com/evmos/ethermint/cmd/ethermintd" + "github.com/evmos/ethermint/evmd" ) func TestInitCmd(t *testing.T) { @@ -23,6 +23,6 @@ func TestInitCmd(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagChainID, "ethermint_9000-1"), }) - err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome) + err := svrcmd.Execute(rootCmd, "", evmd.DefaultNodeHome) require.NoError(t, err) } diff --git a/cmd/ethermintd/main.go b/cmd/ethermintd/main.go index b569386a53..3522f01cc7 100644 --- a/cmd/ethermintd/main.go +++ b/cmd/ethermintd/main.go @@ -22,8 +22,8 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/ethermint/app" cmdcfg "github.com/evmos/ethermint/cmd/config" + "github.com/evmos/ethermint/evmd" ) func main() { @@ -32,7 +32,7 @@ func main() { rootCmd, _ := NewRootCmd() - if err := svrcmd.Execute(rootCmd, EnvPrefix, app.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, EnvPrefix, evmd.DefaultNodeHome); err != nil { fmt.Fprintln(rootCmd.OutOrStderr(), err) os.Exit(1) } diff --git a/cmd/ethermintd/root.go b/cmd/ethermintd/root.go index 5d03d32d56..3665077c52 100644 --- a/cmd/ethermintd/root.go +++ b/cmd/ethermintd/root.go @@ -17,12 +17,12 @@ package main import ( "errors" - "io" "os" + "slices" "github.com/spf13/cobra" - cmtlog "cosmossdk.io/log" + "cosmossdk.io/log/v2" confixcmd "cosmossdk.io/tools/confix/cmd" cmtcfg "github.com/cometbft/cometbft/config" cmtcli "github.com/cometbft/cometbft/libs/cli" @@ -38,23 +38,22 @@ import ( "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/client/snapshot" - "github.com/cosmos/cosmos-sdk/crypto/keyring" sdkserver "github.com/cosmos/cosmos-sdk/server" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/client/debug" + "github.com/cosmos/cosmos-sdk/contrib/x/crisis" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" "github.com/cosmos/cosmos-sdk/types/tx/signing" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - rosettaCmd "github.com/cosmos/rosetta/cmd" - "github.com/evmos/ethermint/app" ethermintclient "github.com/evmos/ethermint/client" "github.com/evmos/ethermint/crypto/hd" "github.com/evmos/ethermint/ethereum/eip712" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/server" servercfg "github.com/evmos/ethermint/server/config" srvflags "github.com/evmos/ethermint/server/flags" @@ -66,14 +65,13 @@ const ( ChainID = "ethermint_9000-1" ) -type emptyAppOptions struct{} - -func (ao emptyAppOptions) Get(_ string) interface{} { return nil } - // NewRootCmd creates a new root command for simd. It is called once in the // main function. func NewRootCmd() (*cobra.Command, ethermint.EncodingConfig) { - tempApp := app.NewEthermintApp(cmtlog.NewNopLogger(), dbm.NewMemDB(), nil, true, emptyAppOptions{}) + tempApp := evmd.NewEthermintApp( + log.NewNopLogger(), dbm.NewMemDB(), true, + simtestutil.NewAppOptionsWithFlagHome(evmd.DefaultNodeHome), + ) encodingConfig := tempApp.EncodingConfig() initClientCtx := client.Context{}. WithCodec(encodingConfig.Codec). @@ -83,10 +81,15 @@ func NewRootCmd() (*cobra.Command, ethermint.EncodingConfig) { WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). WithBroadcastMode(flags.BroadcastSync). - WithHomeDir(app.DefaultNodeHome). + WithHomeDir(evmd.DefaultNodeHome). WithKeyringOptions(hd.EthSecp256k1Option()). WithViper(EnvPrefix) + initClientCtx, err := clientcfg.ReadDefaultValuesFromDefaultClientConfig(initClientCtx) + if err != nil { + panic(err) + } + eip712.SetEncodingConfig(encodingConfig) rootCmd := &cobra.Command{ @@ -97,6 +100,7 @@ func NewRootCmd() (*cobra.Command, ethermint.EncodingConfig) { cmd.SetOut(cmd.OutOrStdout()) cmd.SetErr(cmd.ErrOrStderr()) + initClientCtx = initClientCtx.WithCmdContext(cmd.Context()) initClientCtx, err := client.ReadPersistentCommandFlags(initClientCtx, cmd.Flags()) if err != nil { return err @@ -111,8 +115,10 @@ func NewRootCmd() (*cobra.Command, ethermint.EncodingConfig) { // sets the RPC client needed for SIGN_MODE_TEXTUAL. This sign mode // is only available if the client is online. if !initClientCtx.Offline { + enabledSignModes := slices.Clone(tx.DefaultSignModes) + enabledSignModes = append(enabledSignModes, signing.SignMode_SIGN_MODE_TEXTUAL) txConfigOpts := tx.ConfigOptions{ - EnabledSignModes: append(tx.DefaultSignModes, signing.SignMode_SIGN_MODE_TEXTUAL), + EnabledSignModes: enabledSignModes, TextualCoinMetadataQueryFn: txmodule.NewGRPCCoinMetadataQueryFn(initClientCtx), } txConfig, err := tx.NewTxConfigWithOptions( @@ -142,7 +148,6 @@ func NewRootCmd() (*cobra.Command, ethermint.EncodingConfig) { initRootCmd(rootCmd, encodingConfig, tempApp.BasicModuleManager) autoCliOpts := tempApp.AutoCliOpts() initClientCtx, _ = clientcfg.ReadDefaultValuesFromDefaultClientConfig(initClientCtx) - autoCliOpts.Keyring, _ = keyring.NewAutoCLIKeyring(initClientCtx.Keyring) autoCliOpts.ClientCtx = initClientCtx if err := autoCliOpts.EnhanceRootCommand(rootCmd); err != nil { panic(err) @@ -158,20 +163,24 @@ func initRootCmd( cfg := sdk.GetConfig() cfg.Seal() + sdkAppCreator := func(l log.Logger, d dbm.DB, ao servertypes.AppOptions) servertypes.Application { + return newApp(l, d, ao) + } + rootCmd.AddCommand( ethermintclient.ValidateChainID( - genutilcli.InitCmd(basicManager, app.DefaultNodeHome), + genutilcli.InitCmd(basicManager, evmd.DefaultNodeHome), ), cmtcli.NewCompletionCmd(rootCmd, true), ethermintclient.NewTestnetCmd(basicManager, banktypes.GenesisBalancesIterator{}), debug.Cmd(), confixcmd.ConfigCommand(), - pruning.Cmd(newApp, app.DefaultNodeHome), - snapshot.Cmd(newApp), + pruning.Cmd(sdkAppCreator, evmd.DefaultNodeHome), + snapshot.Cmd(sdkAppCreator), // this line is used by starport scaffolding # stargate/root/commands ) - server.AddCommands(rootCmd, server.NewDefaultStartOptions(newApp, app.DefaultNodeHome), appExport, addModuleInitFlags) + server.AddCommands(rootCmd, server.NewDefaultStartOptions(newApp, evmd.DefaultNodeHome), appExport, addModuleInitFlags) // add keybase, auxiliary RPC, query, and tx child commands rootCmd.AddCommand( @@ -179,21 +188,18 @@ func initRootCmd( genesisCommand(encodingConfig.TxConfig, basicManager), queryCommand(), txCommand(), - ethermintclient.KeyCommands(app.DefaultNodeHome), + ethermintclient.KeyCommands(evmd.DefaultNodeHome), ) - rootCmd, err := srvflags.AddGlobalFlags(rootCmd) + _, err := srvflags.AddGlobalFlags(rootCmd) if err != nil { panic(err) } - - // add rosetta - rootCmd.AddCommand(rosettaCmd.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Codec)) } // genesisCommand builds genesis-related `simd genesis` command. Users may provide application specific commands as a parameter func genesisCommand(txConfig client.TxConfig, basicManager module.BasicManager, cmds ...*cobra.Command) *cobra.Command { - cmd := genutilcli.Commands(txConfig, basicManager, app.DefaultNodeHome) + cmd := genutilcli.Commands(txConfig, basicManager, evmd.DefaultNodeHome) for _, subCmd := range cmds { cmd.AddCommand(subCmd) @@ -202,7 +208,7 @@ func genesisCommand(txConfig client.TxConfig, basicManager module.BasicManager, } func addModuleInitFlags(startCmd *cobra.Command) { - crisis.AddModuleInitFlags(startCmd) + crisis.AddModuleInitFlags(startCmd) //nolint:staticcheck } func queryCommand() *cobra.Command { @@ -253,10 +259,10 @@ func txCommand() *cobra.Command { } // newApp creates the application -func newApp(logger cmtlog.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { +func newApp(logger log.Logger, db dbm.DB, appOpts servertypes.AppOptions) server.AppWithPendingTxListener { baseappOptions := sdkserver.DefaultBaseappOptions(appOpts) - ethermintApp := app.NewEthermintApp( - logger, db, traceStore, true, + ethermintApp := evmd.NewEthermintApp( + logger, db, true, appOpts, baseappOptions..., ) @@ -266,29 +272,28 @@ func newApp(logger cmtlog.Logger, db dbm.DB, traceStore io.Writer, appOpts serve // appExport creates a new app (optionally at a given height) // and exports state. func appExport( - logger cmtlog.Logger, + logger log.Logger, db dbm.DB, - traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions, modulesToExport []string, ) (servertypes.ExportedApp, error) { - var ethermintApp *app.EthermintApp + var ethermintApp *evmd.EthermintApp homePath, ok := appOpts.Get(flags.FlagHome).(string) if !ok || homePath == "" { return servertypes.ExportedApp{}, errors.New("application home not set") } if height != -1 { - ethermintApp = app.NewEthermintApp(logger, db, traceStore, false, appOpts, baseapp.SetChainID(ChainID)) + ethermintApp = evmd.NewEthermintApp(logger, db, false, appOpts, baseapp.SetChainID(ChainID)) if err := ethermintApp.LoadHeight(height); err != nil { return servertypes.ExportedApp{}, err } } else { - ethermintApp = app.NewEthermintApp(logger, db, traceStore, true, appOpts, baseapp.SetChainID(ChainID)) + ethermintApp = evmd.NewEthermintApp(logger, db, true, appOpts, baseapp.SetChainID(ChainID)) } return ethermintApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) diff --git a/codecov.yml b/codecov.yml index 1b5ac5d3a1..47a3ea7590 100644 --- a/codecov.yml +++ b/codecov.yml @@ -16,7 +16,7 @@ coverage: app: target: 70% flags: - - app + - evmd modules: target: 70% flags: @@ -38,7 +38,7 @@ comment: flags: app: paths: - - "app/" + - "evmd/" modules: paths: - "x/" diff --git a/default.nix b/default.nix index 465aa8c0a1..9af34c51d2 100644 --- a/default.nix +++ b/default.nix @@ -1,6 +1,8 @@ -{ lib -, buildGoApplication -, rev ? "dirty" +{ + lib, + buildGoApplication, + buildPackages, + rev ? "dirty", }: let version = "v0.20.0-rc2"; @@ -15,16 +17,24 @@ let ]); in buildGoApplication rec { - inherit pname version tags ldflags; + inherit + pname + version + tags + ldflags + ; + go = buildPackages.go_1_25; src = lib.sourceByRegex ./. [ - "^(x|app|cmd|client|server|crypto|rpc|types|encoding|ethereum|indexer|testutil|version|store|go.mod|go.sum|gomod2nix.toml)($|/.*)" + "^(x|ante|evmd|cmd|client|server|crypto|rpc|types|encoding|ethereum|indexer|testutil|version|store|internal|go.mod|go.sum|gomod2nix.toml)($|/.*)" "^tests(/.*[.]go)?$" ]; + modRoot = "."; modules = ./gomod2nix.toml; doCheck = false; pwd = src; # needed to support replace subPackages = [ "cmd/ethermintd" ]; CGO_ENABLED = "1"; + GOTOOLCHAIN = "local"; meta = with lib; { description = "Ethermint is a scalable and interoperable Ethereum library, built on Proof-of-Stake with fast-finality using the Cosmos SDK which runs on top of Tendermint Core consensus engine."; diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 917698cf40..f11b3a899e 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -36,3 +36,4 @@ Please add an entry below in your Pull Request for an ADR. - [ADR 001: State](adr-001-state.md) - [ADR 002: EVM Hooks](adr-002-evm-hooks.md) +- [ADR 003: Batch EVM Transaction Limitations and Nonce Management](adr-003-batch-evm-transactions.md) diff --git a/docs/architecture/adr-003-batch-evm-transactions.md b/docs/architecture/adr-003-batch-evm-transactions.md new file mode 100644 index 0000000000..8a0dec2f90 --- /dev/null +++ b/docs/architecture/adr-003-batch-evm-transactions.md @@ -0,0 +1,150 @@ +# ADR 003: Batch EVM Transaction Limitations and Nonce Management + +## Changelog + +- 2026-01-27: Initial draft + +## Status + +PROPOSED, Implemented + +## Abstract + +This ADR documents the architectural decision to align Ethermint's EVM transaction processing with go-ethereum's behavior, particularly regarding nonce management and contract address derivation. This alignment results in unexpected and potentially dangerous behavior when processing batched EVM transactions—a Cosmos SDK-specific feature not present in Ethereum. We formally discourage the use of batched EVM transactions to prevent contract address collisions and maintain compatibility with Ethereum's execution model. + +## Context + +Ethermint operates at the intersection of two blockchain paradigms: Cosmos SDK's application-specific blockchain framework and Ethereum's EVM execution environment. This dual nature introduces unique capabilities and challenges. + +### Cosmos SDK Batch Transactions + +The Cosmos SDK allows multiple messages (transactions) to be included in a single transaction envelope. This feature enables atomic execution of multiple operations and can reduce transaction overhead. In Ethermint, this means multiple `MsgEthereumTx` messages can be batched together in a single Cosmos transaction. + +### Ethereum Nonce Model + +In Ethereum, each account maintains a nonce that: + +1. Prevents replay attacks by ensuring transaction ordering +2. Determines contract addresses for CREATE operations via `keccak256(rlp([sender, nonce]))` +3. Increments sequentially: one increment per transaction, plus additional increments for nested contract creations + +### The Ante Handler Problem + +In Cosmos SDK, the ante handler processes transactions before execution. Ethermint's ante handler increments account nonces for **all messages in a batch upfront** before EVM execution begins. For a batch with 3 messages from the same sender: + +- **Before ante handler:** Account nonce = N +- **After ante handler:** Account nonce = N+3 + +### EIP-7702 Self-Delegation Complexity + +EIP-7702 allows Externally Owned Accounts (EOAs) to delegate their code execution to smart contracts. When an EOA self-delegates (authorizes delegation to itself in the same transaction), the authorization processing increments the nonce before the EVM call executes. This adds another layer of nonce management complexity: + +- Authorization processing: +1 nonce per authorization +- EVM transaction execution: +1 nonce +- Nested contract creations: +N nonces (one per CREATE opcode) + +In batched transactions with self-delegation, calculating the correct nonce for contract address derivation becomes increasingly complex and error-prone. + +### Incompatibility with Ethereum's Model + +Critically, Ethereum and go-ethereum **do not support batch transactions**. The concept of processing multiple EVM transactions atomically in a single block does not exist in the Ethereum execution model. Therefore, any behavior specific to batched EVM transactions: + +1. Cannot be tested against Ethereum for correctness +2. May violate developer expectations based on Ethereum tooling +3. Could lead to contract address derivation that differs from what tools like Hardhat, Foundry, or web3.js predict + +## Decision + +We will align Ethermint's EVM transaction processing with go-ethereum's behavior and **strongly discourage the use of batched EVM transactions**. Specifically: + +1. **Nonce Management Alignment**: The EVM state transition layer will implement nonce reset-and-reconcile logic that matches go-ethereum's behavior for single transactions. + +2. **Documentation**: We will explicitly document that batched EVM transactions are not recommended and may produce unexpected results, particularly regarding contract address derivation. + +3. **CREATE Transaction Handling**: For CREATE transactions, we will: + - Reset the stateDB nonce to `msg.Nonce` before calling `evm.Create()` + - Allow `evm.Create()` to increment the nonce internally (as go-ethereum does) + +4. **CALL Transaction Handling**: For CALL transactions (including EIP-7702 delegated calls): + - Process authorizations first (which may increment nonces) + - Allow `evm.Call()` to increment the nonce internally (as go-ethereum does) + +5. **No Batch Transaction Optimizations**: We will not add special handling or optimizations for batched EVM transactions, as such patterns do not exist in Ethereum and cannot be validated against the reference implementation. + +## Consequences + +### Backwards Compatibility + +This change introduces a breaking change in nonce management behavior: + +- **Single EVM transactions**: Behavior now matches go-ethereum exactly. Previously deployed contracts and existing single-transaction workflows are unaffected. + +- **Batched EVM transactions**: Existing batched EVM transaction patterns may result in unexpected contract addresses created, particularly those involving: + - Multiple contract deployments in a single batch (EVM Create) + - Nested contract creations across batched messages with self-authorization (EVM Call) + +### Positive + +1. **Ethereum Compatibility**: Complete alignment with go-ethereum's nonce management ensures that developer tools, contract address calculations, and execution behavior match Ethereum mainnet. + +2. **Predictable Contract Addresses**: Contract addresses can be reliably predicted using standard Ethereum tools (ethers.js, web3.py, etc.) without needing to understand Cosmos-specific batch transaction semantics. + +3. **Reduced Complexity**: Removing support for edge cases in batched transactions simplifies the state transition logic and reduces the surface area for bugs. + +4. **Testing Confidence**: All EVM behavior can be validated against go-ethereum and Geth, ensuring correctness through battle-tested reference implementations. + +5. **Developer Experience**: Developers familiar with Ethereum can use Ethermint without learning Cosmos-specific batch transaction patterns. + +### Negative + +1. **Cosmos Feature Underutilization**: The Cosmos SDK's native support for multi-message transactions cannot be fully leveraged for EVM operations. + +## Examples of Batch Transaction Issues + +The following examples illustrate why batched EVM transactions produce unexpected behavior: + +### Example 1: Batch EVM CREATE Transactions with Nested Creates + +When multiple CREATE transactions are batched, nonce resets can cause address collisions: + +| Transaction | Initial Nonce | Contracts Created | Nonces Used | Issue | +|-------------|---------------|-------------------|-------------|-------| +| tx0 (msg.Nonce=0) | 0 | 2 (1 parent + 1 nested) | 0, 1 | Reset to 0, creates at nonce 0 and 1 | +| tx1 (msg.Nonce=1) | 1 (after tx0) | 1 | 1 | Reset to 1, creates at nonce 1 (collision!) | + +**Result**: Both transactions attempt to create a contract at an address derived from nonce 1, causing a conflict. + +### Example 2: Batch EIP-7702 Self-Delegated Nested CREATE Transactions + +Assuming the sender has delegated to a factory contract and submits a batch of 3 transactions: + +| Transaction | msg.Nonce | Post-Ante Nonce | Auth Nonce | CREATE Nonce | Expected | +|-------------|-----------|-----------------|------------|--------------|----------| +| tx0 | 0 | 3 | N/A (pre-delegated) | 3 | Address from nonce 3 | +| tx1 | 1 | 3 | N/A (pre-delegated) | 4 | Address from nonce 4 | +| tx2 | 2 | 3 | N/A (pre-delegated) | 5 | Address from nonce 5 | + +**Result**: All three transactions see the same post-ante-handler nonce (3) initially, requiring complex reconciliation logic that may not match Ethereum semantics. + +### Example 3: Self EIP-7702 Authorization in Batch + +When self-authorizations are included in batched transactions, the authorization nonce calculation becomes ambiguous: + +| Transaction | msg.Nonce | Post-Ante Nonce | Expected Auth Nonce | Actual Behavior | +|-------------|-----------|-----------------|---------------------|-----------------| +| tx0 | 0 | 3 | 3 (after all ante increments) | Depends on implementation | +| tx1 | 1 | 3 | 4 | Depends on implementation | +| tx2 | 2 | 3 | 5 | Depends on implementation | + +**Result**: The correct authorization nonce is unclear and cannot be validated against Ethereum, which has no concept of batched authorizations. + +## Further Discussions + +### Future Considerations + +1. **Batch Transaction Implementation**: How should we implement batch EVM transaction logic, or should we allow them at all? + +## References + +- [EIP-7702: Set EOA account code](https://eips.ethereum.org/EIPS/eip-7702) +- [go-ethereum state transition](https://github.com/ethereum/go-ethereum/blob/master/core/state_transition.go) diff --git a/docs/precompile_creation_guide.md b/docs/precompile_creation_guide.md new file mode 100644 index 0000000000..b670134696 --- /dev/null +++ b/docs/precompile_creation_guide.md @@ -0,0 +1,376 @@ +# How to Create a New Precompile in Ethermint + +This guide walks through adding a **custom precompile**: a native contract at a fixed address that runs Go code instead of EVM bytecode. Ethermint merges go-ethereum's default precompiles with your custom ones and gives them access to Cosmos `sdk.Context` when needed. + +Patterns below are based on **Ethermint** and **Cronos** ([crypto-org-chain/cronos](https://github.com/crypto-org-chain/cronos) `x/cronos/keeper/precompiles`). + +--- + +## High-level flow: Cronos / Ethermint → geth + +How a call to a custom precompile moves from the Cosmos app down into go-ethereum: + +1. **App (e.g. Cronos)** – Builds the EVM keeper with `evmkeeper.NewKeeper(..., customContractFns, ...)`. Each `CustomContractFn` is a factory that, given `(sdk.Context, ethparams.Rules)`, returns a `vm.PrecompiledContract`. When an Ethereum tx is delivered (via the EVM module handler or RPC), the keeper is used to run it. + +2. **ApplyMessage** – For each tx, the keeper’s `ApplyMessage` / `ApplyMessageWithConfig` is invoked with a `core.Message` (sender, to, data, value, gas, etc.). It obtains the Ethermint **StateDB** (which implements Cosmos-backed storage and exposes `Context()` and `ExecuteNativeAction` for precompiles) and builds an EVM instance. + +3. **NewEVM** – For that message, the keeper builds the precompile set: + - Start with **geth default precompiles**: `vm.DefaultPrecompiles(cfg.Rules)` (ecrecover, sha256, etc.). + - For each `customContractFns`, call `fn(ctx, cfg.Rules)` and add the returned contract to a map by `contract.Address()`. + - Create the geth EVM with `vm.NewEVM(blockCtx, stateDB, chainConfig, vmConfig)`. + - Call **`evm.SetPrecompiles(contracts)`** so this EVM instance uses both default and custom precompiles. + +4. **StateDB.Prepare** – Before execution, the keeper calls `stateDB.Prepare(rules, msg.From, coinbase, msg.To, vm.ActivePrecompiles(rules), msg.AccessList)`. That adds default precompile addresses to the access list (EIP-2929) and resets transient storage. + +5. **EVM execution (geth)** – The keeper calls either **`evm.Create(sender, data, gas, value)`** (contract creation) or **`evm.Call(sender, to, data, gas, value)`** (normal call). Execution runs inside go-ethereum’s EVM and interpreter. + +6. **Precompile dispatch (geth)** – When the interpreter encounters a **CALL** (or **STATICCALL**) to an address that is in the precompiles map, geth: + - Looks up the contract with that address. + - Charges **`RequiredGas(input)`**. + - Calls **`Run`** (with either `(input, contract)` or `(evm, contract, readonly)` depending on the fork). + - Your precompile’s `Run` uses the same **StateDB** (cast to `ExtStateDB` in Cronos) to read Cosmos state via `Context()` or change it via `ExecuteNativeAction`. + +So: **Cronos/Ethermint** owns keeper creation (with custom factories), StateDB, and each per-tx EVM construction; **geth** owns the interpreter and the moment it dispatches to a precompile’s `Run`. Custom precompiles are “injected” into that geth EVM via `SetPrecompiles` before every execution. + +--- + +## 1. Implement `vm.PrecompiledContract` + +Your type must satisfy the interface used by the EVM (from `github.com/ethereum/go-ethereum/core/vm`). The **exact `Run` signature depends on your go-ethereum (or fork)**: + +| Environment | `Run` signature | +|-------------|-----------------| +| Vanilla go-ethereum | `Run(input []byte, contract *vm.Contract) ([]byte, error)` | +| Cronos / Ethermint fork (e.g. crypto-org-chain/go-ethereum) | `Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]byte, error)` | + +Always required: + +- **`Address() common.Address`** – Contract address (used by Ethermint's keeper when registering). +- **`RequiredGas(input []byte) uint64`** – Gas cost for the given input (charged before `Run`). + +**Example: minimal stateless precompile (vanilla `Run`)** + +```go +package myprecompile + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" +) + +// Use an address that does not conflict with default precompiles (1–9). +// Cronos uses 100 (0x64), 101 (0x65), 102 (0x66) for bank, relayer, ICA. +var myPrecompileAddress = common.BytesToAddress([]byte{100}) + +type MyPrecompile struct{} + +func (MyPrecompile) Address() common.Address { + return myPrecompileAddress +} + +func (MyPrecompile) RequiredGas(input []byte) uint64 { + return 1000 +} + +func (MyPrecompile) Run(input []byte, contract *vm.Contract) ([]byte, error) { + return input, nil +} +``` + +**Example: extended `Run` (evm + readonly)** – use when your chain uses a fork that passes `evm` and `readonly`: + +```go +func (p MyPrecompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]byte, error) { + if readonly { + return nil, errors.New("this method is not readonly") + } + // Use evm.StateDB, contract.Caller(), contract.Input, etc. + return contract.Input, nil +} +``` + +Use an address that does **not** conflict with default precompiles (e.g. 1–9). Custom precompiles often use `common.BytesToAddress([]byte{100})`, `[]byte{101}`, etc., or the `0x0100` range. + +--- + +## 2. Use Cosmos context and native state (stateful precompiles) + +If your precompile reads or writes Cosmos state (keepers, module stores, events), it must use the StateDB implementation from Ethermint. + +- **`Context() sdk.Context`** – Use for **read-only** Cosmos access (queries, block height, KVStore reads). +- **`ExecuteNativeAction(contract, converter, action)`** – Use for **state-changing** logic; state is reverted if the action errors or the EVM call reverts. Pass `statedb.EventConverter` or `nil`. + +Define an extended interface in your precompile package (Cronos pattern) and cast in `Run`: + +```go +type ExtStateDB interface { + vm.StateDB + ExecuteNativeAction(contract common.Address, converter statedb.EventConverter, action func(ctx sdk.Context) error) error + Context() sdk.Context +} +``` + +In `Run`: use `Context()` for reads and `ExecuteNativeAction` for writes (see Cronos `x/cronos/keeper/precompiles/bank.go` for a full example). + +**Example (extended `Run`):** cast StateDB to `ExtStateDB`; use `Context()` for reads and `ExecuteNativeAction` for writes. See Cronos [bank.go](https://github.com/crypto-org-chain/cronos/blob/main/x/cronos/keeper/precompiles/bank.go) for a full stateful precompile. + +```go +func (p MyPrecompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]byte, error) { + stateDB := evm.StateDB.(ExtStateDB) + ctx := stateDB.Context() + return contract.Input, nil +} +``` + +Use these APIs only when the EVM is backed by Ethermint's StateDB. + +--- + +## 3. Create a `CustomContractFn` (factory) + +Ethermint’s keeper expects a **slice of functions** that produce a precompile for each (context, rules) pair. Each function has the type: + +```go +type CustomContractFn func(sdk.Context, ethparams.Rules) vm.PrecompiledContract +``` + +Create a factory that returns your precompile: + +```go +package myprecompile + +import ( + ethparams "github.com/ethereum/go-ethereum/params" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/core/vm" + evmkeeper "github.com/evmos/ethermint/x/evm/keeper" +) + +func NewMyPrecompileFn() evmkeeper.CustomContractFn { + return func(ctx sdk.Context, rules ethparams.Rules) vm.PrecompiledContract { + // You can use ctx/rules to enable/disable or configure the precompile per block. + return MyPrecompile{} + } +} +``` + +If you need to inject keepers or config, capture them in the closure: + +```go +// types = e.g. github.com/evmos/ethermint/x/evm/types +func NewMyPrecompileFn(accountKeeper types.AccountKeeper) evmkeeper.CustomContractFn { + return func(ctx sdk.Context, rules ethparams.Rules) vm.PrecompiledContract { + return MyPrecompile{accountKeeper: accountKeeper} + } +} +``` + +--- + +## 3a. ABI-based method dispatch and gas (recommended for multi-method precompiles) + +For precompiles that expose multiple Solidity-style methods (e.g. `balanceOf`, `transfer`, `mint`), use **ABI method IDs** and a **gas table** (Cronos pattern): + +1. **Load the ABI** – Embed `abi.json` or use generated bindings (e.g. `bank.BankModuleMetaData.ABI`). +2. **In `init()`** – Parse the ABI and build `map[[4]byte]uint64` from method ID to required gas. +3. **`RequiredGas(input []byte)`** – If `len(input) < 4` return a base cost (or 0). Otherwise copy `input[:4]` as method ID, lookup gas from the map, and add a base cost (e.g. `len(input) * kvGasConfig.WriteCostPerByte`). +4. **In `Run`** – Get method with `abi.MethodById(contract.Input[:4])`, unpack args with `method.Inputs.Unpack(contract.Input[4:])`, switch on `method.Name`, then pack output with `method.Outputs.Pack(...)`. + +Example (Cronos-style): + +```go +var myABI abi.ABI +var gasByMethod = map[[4]byte]uint64{} + +func init() { + _ = myABI.UnmarshalJSON([]byte(metadata.ABI)) + for name := range myABI.Methods { + var id [4]byte + copy(id[:], myABI.Methods[name].ID[:4]) + gasByMethod[id] = 10000 // or per-method values + } +} + +func (p *MyPrecompile) RequiredGas(input []byte) uint64 { + if len(input) < 4 { + return baseCost + } + var id [4]byte + copy(id[:], input[:4]) + return gasByMethod[id] + baseCost +} + +func (p *MyPrecompile) Run(evm *vm.EVM, contract *vm.Contract, readonly bool) ([]byte, error) { + method, err := myABI.MethodById(contract.Input[:4]) + if err != nil { return nil, err } + args, err := method.Inputs.Unpack(contract.Input[4:]) + if err != nil { return nil, err } + switch method.Name { + case "balanceOf": + return method.Outputs.Pack(p.balanceOf(evm, args)) + default: + return nil, errors.New("unknown method") + } +} +``` + +For **read-only vs state-changing**: if your `Run` has a `readonly bool`, reject state-changing methods when `readonly` is true (e.g. `if readonly && isStateChanging(method) { return nil, vm.ErrWriteProtection }`). + +--- + +## 3b. Caller authentication (Cosmos msg-style precompiles) + +When the precompile input is a **serialized Cosmos message** (e.g. IBC relayer, ICA), the caller must match the message signer. Cronos uses a generic **Executor** that unmarshals the input as a protobuf message, gets the signer via `codec.GetMsgV1Signers(msg)`, and requires `contract.Caller() == common.BytesToAddress(signers[0])` before running the action inside `ExecuteNativeAction`. See Cronos `precompiles/utils.go` (`exec`) and `relayer.go` / `ica.go`. + +--- + +## 4. Register the precompile in the app + +When constructing the EVM keeper, pass your factory (or factories) as the **custom precompiles** slice. In `evmd/app.go` the keeper is created with `nil` for that slice; replace it with your list: + +**Before (snippet from `evmd/app.go`):** + +```go +app.EvmKeeper = evmkeeper.NewKeeper( + appCodec, + keys[evmtypes.StoreKey], okeys[evmtypes.ObjectStoreKey], authtypes.NewModuleAddress(govtypes.ModuleName), + app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.FeeMarketKeeper, + tracer, + evmSs, + nil, // <-- custom precompiles + cast.ToUint64(appOpts.Get(server.FlagQueryGasLimit)), +) +``` + +**After:** + +```go +import ( + evmkeeper "github.com/evmos/ethermint/x/evm/keeper" + myprecompile "github.com/evmos/ethermint/x/myprecompile" // or your module path +) + +// ... + +app.EvmKeeper = evmkeeper.NewKeeper( + appCodec, + keys[evmtypes.StoreKey], okeys[evmtypes.ObjectStoreKey], authtypes.NewModuleAddress(govtypes.ModuleName), + app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.FeeMarketKeeper, + tracer, + evmSs, + []evmkeeper.CustomContractFn{ + myprecompile.NewMyPrecompileFn(), + // add more custom precompiles here + }, + cast.ToUint64(appOpts.Get(server.FlagQueryGasLimit)), +) +``` + +**Cronos example** – multiple precompiles with keepers and context: + +```go +[]evmkeeper.CustomContractFn{ + func(_ sdk.Context, rules ethparams.Rules) vm.PrecompiledContract { + return cronosprecompiles.NewRelayerContract(app.IBCKeeper, appCodec, rules, app.Logger()) + }, + func(ctx sdk.Context, rules ethparams.Rules) vm.PrecompiledContract { + return cronosprecompiles.NewIcaContract(ctx, app.ICAControllerKeeper, &app.CronosKeeper, appCodec, gasConfig) + }, +}, +``` + +After this, every new EVM instance will get both `vm.DefaultPrecompiles(cfg.Rules)` and your custom precompiles, and active precompile addresses are passed to `StateDB.Prepare` for access-list handling. + +--- + +## Example: Cronos bank precompile + +The Cronos **bank precompile** exposes an ERC-20-style interface for **native tokens** at a fixed address. Each EVM contract address that calls the precompile is treated as the “token” address: the Cosmos denom is `evm/`. This section summarizes how it is implemented and how it would be integrated (Cronos currently registers Relayer and ICA in `customContractFns`; the bank precompile is implemented in the same package but can be added the same way). + +### Purpose and methods + +- **Address**: `0x64` (`common.BytesToAddress([]byte{100})`). +- **Methods** (Solidity ABI): `mint(recipient, amount)`, `burn(recipient, amount)`, `balanceOf(token, account)`, `transfer(sender, recipient, amount)`. +- **Denom**: `EVMDenom(contract.Caller())` = `"evm/" + caller.Hex()` — the caller of the precompile is the “token” (e.g. a deployed contract that mints/burns its own denom). + +### ABI and gas table (`init`) + +The ABI comes from generated bindings (`bank.BankModuleMetaData.ABI` in `x/cronos/events/bindings/cosmos/precompile/bank`). In `init()` the package parses this ABI and fills a map from 4-byte method ID to gas: + +- `mint` / `burn`: 200_000 +- `balanceOf`: 10_000 +- `transfer`: 150_000 + +### Contract struct and factory + +```go +type BankContract struct { + bankKeeper types.BankKeeper + cdc codec.Codec + kvGasConfig storetypes.GasConfig +} + +func NewBankContract(bankKeeper types.BankKeeper, cdc codec.Codec, kvGasConfig storetypes.GasConfig) vm.PrecompiledContract { + return &BankContract{bankKeeper, cdc, kvGasConfig} +} +``` + +`Address()` returns the fixed address; `RequiredGas(input)` uses `input[:4]` as method ID and returns the mapped gas plus a base cost (`len(input) * kvGasConfig.WriteCostPerByte`). + +### Run: ExtStateDB and method dispatch + +1. **Cast StateDB** – `stateDB := evm.StateDB.(ExtStateDB)` (from `precompiles/interface.go`). +2. **Dispatch by method** – `method, _ := bankABI.MethodById(contract.Input[:4])`, then `method.Inputs.Unpack(contract.Input[4:])`, and a `switch method.Name`. +3. **Read-only (`balanceOf`)** – Uses `stateDB.Context()` only: + `bc.bankKeeper.GetBalance(stateDB.Context(), account, EVMDenom(token))`, then `method.Outputs.Pack(balance)`. +4. **State-changing (`mint`, `burn`, `transfer`)** – Returns an error if `readonly` is true. Then runs all Cosmos logic inside **`stateDB.ExecuteNativeAction(precompileAddr, nil, func(ctx sdk.Context) error { ... })`**: + - **mint**: `IsSendEnabledCoins` → `MintCoins(module, ...)` → `SendCoinsFromModuleToAccount`. + - **burn**: `SendCoinsFromAccountToModule` → `BurnCoins(module, ...)`. + - **transfer**: `IsSendEnabledCoins` → `SendCoins(from, to, coins)`. + - Uses `EVMDenom(contract.Caller())` as the coin denom and checks `bankKeeper.BlockedAddr` for recipients. +5. **Return** – `method.Outputs.Pack(true)` for mutating methods, or the balance for `balanceOf`. + +So: reads go through `Context()`; writes go through `ExecuteNativeAction` so that any failure (or EVM revert) reverts Cosmos state as well. + +### Integration in the app + +To register the bank precompile, pass a factory in `customContractFns` that injects the bank keeper, codec, and gas config (e.g. from `storetypes.TransientGasConfig()` or a module param): + +```go +gasConfig := storetypes.TransientGasConfig() // or your app's config + +[]evmkeeper.CustomContractFn{ + // ... other precompiles (e.g. Relayer, ICA) ... + func(_ sdk.Context, rules ethparams.Rules) vm.PrecompiledContract { + return cronosprecompiles.NewBankContract(app.BankKeeper, appCodec, gasConfig) + }, +}, +``` + +The EVM keeper then builds each EVM instance with default precompiles plus this bank precompile; calls to `0x64` with ABI-encoded `mint`, `burn`, `balanceOf`, or `transfer` are handled by the bank precompile’s `Run` and the Cosmos x/bank module. + +--- + +## 5. Avoid address conflicts + +- **Preinstalls**: If you use `AddPreinstalls` (contracts deployed at fixed addresses), the keeper checks that those addresses do **not** match any precompile address (including those from `customContractFns`). Pick precompile addresses that won’t clash with preinstalls. +- **Default precompiles**: Don’t reuse addresses 1–9 (and any others your go-ethereum fork defines). Use a distinct range (e.g. `0x0100`, `0x0101`, …) for custom precompiles. + +--- + +## 6. Summary checklist + +1. **Interface** – Implement `Address() common.Address`, `RequiredGas(input []byte) uint64`, and `Run` with the signature required by your go-ethereum (or fork): either `(input, contract)` or `(evm, contract, readonly)`. +2. **Address** – Choose a non-conflicting address (e.g. `common.BytesToAddress([]byte{100})`; avoid 1–9). +3. **Stateful** – Use `ExtStateDB`: `Context()` for reads, `ExecuteNativeAction` for writes in `Run`. +4. **Multi-method** – Use ABI method IDs and gas-by-method map; dispatch in `Run` with `MethodById`, `Unpack`, `Pack`. +5. **Factory and registration** – Add a `CustomContractFn` and pass it in `customContractFns` to `evmkeeper.NewKeeper` in `app.go`. + +Contracts call the precompile via `CALL`/`STATICCALL` to your address with ABI-encoded calldata; the EVM dispatches to your `Run` and charges `RequiredGas`. + +--- + +## References + +- **Ethermint** – `x/evm/keeper/state_transition.go` (precompiles merged and set on EVM), `x/evm/statedb/statedb.go` (`ExecuteNativeAction`, `Context()`). +- **Cronos** – [x/cronos/keeper/precompiles](https://github.com/crypto-org-chain/cronos/tree/main/x/cronos/keeper/precompiles): `interface.go` (ExtStateDB), `bank.go` (stateful ABI precompile), `relayer.go` / `ica.go` (Cosmos msg + Executor), `utils.go` (caller auth). diff --git a/encoding/config.go b/encoding/config.go index faf4406d18..0047a2af4f 100644 --- a/encoding/config.go +++ b/encoding/config.go @@ -16,13 +16,13 @@ package encoding import ( - "cosmossdk.io/x/tx/signing" amino "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" "github.com/cosmos/cosmos-sdk/x/auth/tx" + "github.com/cosmos/cosmos-sdk/x/tx/signing" gogoproto "github.com/cosmos/gogoproto/proto" enccodec "github.com/evmos/ethermint/encoding/codec" ethermint "github.com/evmos/ethermint/types" diff --git a/ethereum/eip712/domain.go b/ethereum/eip712/domain.go index 5c63df4299..6390d53e9e 100644 --- a/ethereum/eip712/domain.go +++ b/ethereum/eip712/domain.go @@ -21,11 +21,11 @@ import ( ) // createEIP712Domain creates the typed data domain for the given chainID. -func createEIP712Domain(chainID uint64) apitypes.TypedDataDomain { +func createEIP712Domain(chainID int64) apitypes.TypedDataDomain { domain := apitypes.TypedDataDomain{ Name: "Cosmos Web3", Version: "1.0.0", - ChainId: math.NewHexOrDecimal256(int64(chainID)), // #nosec G701 + ChainId: math.NewHexOrDecimal256(chainID), VerifyingContract: "cosmos", Salt: "0", } diff --git a/ethereum/eip712/eip712.go b/ethereum/eip712/eip712.go index cef97b31b1..e87de9491e 100644 --- a/ethereum/eip712/eip712.go +++ b/ethereum/eip712/eip712.go @@ -17,6 +17,7 @@ package eip712 import ( "github.com/ethereum/go-ethereum/signer/core/apitypes" + ethermint "github.com/evmos/ethermint/types" ) // WrapTxToTypedData wraps an Amino-encoded Cosmos Tx JSON SignDoc @@ -36,7 +37,11 @@ func WrapTxToTypedData( return apitypes.TypedData{}, err } - domain := createEIP712Domain(chainID) + value, err := ethermint.SafeInt64(chainID) + if err != nil { + return apitypes.TypedData{}, err + } + domain := createEIP712Domain(value) typedData := apitypes.TypedData{ Types: types, diff --git a/ethereum/eip712/eip712_legacy.go b/ethereum/eip712/eip712_legacy.go index e093065ee2..57b3376b0a 100644 --- a/ethereum/eip712/eip712_legacy.go +++ b/ethereum/eip712/eip712_legacy.go @@ -29,6 +29,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" + ethermint "github.com/evmos/ethermint/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -52,6 +53,10 @@ func LegacyWrapTxToTypedData( data []byte, feeDelegation *FeeDelegationOptions, ) (apitypes.TypedData, error) { + value, err := ethermint.SafeInt64(chainID) + if err != nil { + return apitypes.TypedData{}, err + } txData := make(map[string]interface{}) if err := json.Unmarshal(data, &txData); err != nil { @@ -61,7 +66,7 @@ func LegacyWrapTxToTypedData( domain := apitypes.TypedDataDomain{ Name: "Cosmos Web3", Version: "1.0.0", - ChainId: math.NewHexOrDecimal256(int64(chainID)), + ChainId: math.NewHexOrDecimal256(value), VerifyingContract: "cosmos", Salt: "0", } diff --git a/ethereum/eip712/encoding.go b/ethereum/eip712/encoding.go index 7dc2eba207..89f5b64882 100644 --- a/ethereum/eip712/encoding.go +++ b/ethereum/eip712/encoding.go @@ -31,7 +31,7 @@ import ( ) var ( - protoCodec codec.ProtoCodecMarshaler + protoCodec codec.Codec aminoCodec *codec.LegacyAmino ) @@ -190,7 +190,7 @@ func decodeProtobufSignDoc(signDocBytes []byte) (apitypes.TypedData, error) { } // WrapTxToTypedData expects the payload as an Amino Sign Doc - signBytes := legacytx.StdSignBytes( + signBytes := legacytx.StdSignBytes( //nolint:staticcheck signDoc.ChainId, signDoc.AccountNumber, signerInfo.Sequence, diff --git a/ethereum/eip712/encoding_legacy.go b/ethereum/eip712/encoding_legacy.go index a0ef1b00e5..ddc42ba2f1 100644 --- a/ethereum/eip712/encoding_legacy.go +++ b/ethereum/eip712/encoding_legacy.go @@ -95,7 +95,7 @@ func legacyDecodeAminoSignDoc(signDocBytes []byte) (apitypes.TypedData, error) { msgs[i] = m } - if err := legacyValidatePayloadMessages(msgs); err != nil { + if err := LegacyValidatePayloadMessages(msgs); err != nil { return apitypes.TypedData{}, err } @@ -173,7 +173,7 @@ func legacyDecodeProtobufSignDoc(signDocBytes []byte) (apitypes.TypedData, error msgs[i] = m } - if err := legacyValidatePayloadMessages(msgs); err != nil { + if err := LegacyValidatePayloadMessages(msgs); err != nil { return apitypes.TypedData{}, err } @@ -202,7 +202,7 @@ func legacyDecodeProtobufSignDoc(signDocBytes []byte) (apitypes.TypedData, error } // WrapTxToTypedData expects the payload as an Amino Sign Doc - signBytes := legacytx.StdSignBytes( + signBytes := legacytx.StdSignBytes( //nolint:staticcheck signDoc.ChainId, signDoc.AccountNumber, signerInfo.Sequence, @@ -226,9 +226,9 @@ func legacyDecodeProtobufSignDoc(signDocBytes []byte) (apitypes.TypedData, error return typedData, nil } -// validatePayloadMessages ensures that the transaction messages can be represented in an EIP-712 +// LegacyValidatePayloadMessages ensures that the transaction messages can be represented in an EIP-712 // encoding by checking that messages exist, are of the same type, and share a single signer. -func legacyValidatePayloadMessages(msgs []sdk.Msg) error { +func LegacyValidatePayloadMessages(msgs []sdk.Msg) error { if len(msgs) == 0 { return errors.New("unable to build EIP-712 payload: transaction does contain any messages") } diff --git a/app/ante/ante.go b/evmd/ante/ante.go similarity index 97% rename from app/ante/ante.go rename to evmd/ante/ante.go index 655cb3c331..b862e46143 100644 --- a/app/ante/ante.go +++ b/evmd/ante/ante.go @@ -19,11 +19,11 @@ import ( "fmt" "runtime/debug" - tmlog "cosmossdk.io/log" + tmlog "cosmossdk.io/log/v2" errorsmod "cosmossdk.io/errors" - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -79,7 +79,7 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { anteHandler = ethAnteHandler case "/ethermint.types.v1.ExtensionOptionsWeb3Tx": // Deprecated: Handle as normal Cosmos SDK tx, except signature is checked for Legacy EIP712 representation - anteHandler = NewLegacyCosmosAnteHandlerEip712(ctx, options, options.ExtraDecorators...) + anteHandler = newLegacyCosmosAnteHandlerEip712(ctx, options, options.ExtraDecorators...) case "/ethermint.types.v1.ExtensionOptionDynamicFeeTx": // cosmos-sdk tx with dynamic fee extension anteHandler = newCosmosAnteHandler(ctx, options, options.ExtraDecorators...) diff --git a/app/ante/ante_test.go b/evmd/ante/ante_test.go similarity index 92% rename from app/ante/ante_test.go rename to evmd/ante/ante_test.go index ee5195324e..e35b6de0dc 100644 --- a/app/ante/ante_test.go +++ b/evmd/ante/ante_test.go @@ -9,8 +9,9 @@ import ( "time" sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" + "github.com/holiman/uint256" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" @@ -27,8 +28,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/ethermint/app/ante" "github.com/evmos/ethermint/crypto/ethsecp256k1" + "github.com/evmos/ethermint/evmd/ante" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/testutil" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -71,7 +72,7 @@ func (suite *AnteTestSuite) TestAnteHandler() { suite.Require().NoError(acc.SetSequence(1)) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - suite.app.EvmKeeper.SetBalance(suite.ctx, addr, big.NewInt(10000000000), evmtypes.DefaultEVMDenom) + suite.app.EvmKeeper.SetBalance(suite.ctx, addr, *uint256.NewInt(10000000000), evmtypes.DefaultEVMDenom) suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, big.NewInt(100)) } @@ -1209,7 +1210,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithDynamicTxFee() { suite.app.AccountKeeper.SetAccount(suite.ctx, acc) suite.ctx = suite.ctx.WithIsCheckTx(tc.checkTx).WithIsReCheckTx(tc.reCheckTx).WithConsensusParams(*testutil.DefaultConsensusParams) - suite.app.EvmKeeper.SetBalance(suite.ctx, addr, big.NewInt((ethparams.InitialBaseFee+10)*100000), evmtypes.DefaultEVMDenom) + suite.app.EvmKeeper.SetBalance(suite.ctx, addr, *uint256.NewInt((ethparams.InitialBaseFee + 10) * 100000), evmtypes.DefaultEVMDenom) _, err := suite.anteHandler(suite.ctx, tc.txFn(), false) if tc.expPass { suite.Require().NoError(err) @@ -1338,7 +1339,7 @@ func (suite *AnteTestSuite) TestAnteHandlerWithParams() { suite.app.AccountKeeper.SetAccount(suite.ctx, acc) suite.ctx = suite.ctx.WithIsCheckTx(true).WithConsensusParams(*testutil.DefaultConsensusParams) - suite.app.EvmKeeper.SetBalance(suite.ctx, addr, big.NewInt((ethparams.InitialBaseFee+10)*100000), evmtypes.DefaultEVMDenom) + suite.app.EvmKeeper.SetBalance(suite.ctx, addr, *uint256.NewInt((ethparams.InitialBaseFee + 10) * 100000), evmtypes.DefaultEVMDenom) _, err := suite.anteHandler(suite.ctx, tc.txFn(), false) if tc.expErr == nil { suite.Require().NoError(err) @@ -1385,7 +1386,7 @@ func (suite *AnteTestSuite) TestConsumeSignatureVerificationGas() { gasConsumed uint64 shouldErr bool }{ - {"PubKeyEd25519", args{storetypes.NewInfiniteGasMeter(), nil, ed25519.GenPrivKey().PubKey(), params}, p.SigVerifyCostED25519, true}, + {"PubKeyEd25519", args{storetypes.NewInfiniteGasMeter(), nil, ed25519.GenPrivKey().PubKey(), params}, p.SigVerifyCostED25519, false}, {"PubKeyEthSecp256k1", args{storetypes.NewInfiniteGasMeter(), nil, pkSet1[0], params}, 21_000, false}, {"PubKeySecp256r1", args{storetypes.NewInfiniteGasMeter(), nil, skR1.PubKey(), params}, p.SigVerifyCostSecp256r1(), false}, {"Multisig", args{storetypes.NewInfiniteGasMeter(), multisignature1, multisigKey1, params}, expectedCost1, false}, @@ -1408,6 +1409,50 @@ func (suite *AnteTestSuite) TestConsumeSignatureVerificationGas() { } } +// TestCosmosTxFeeDeductedInSimulate guards against regression where cosmos and +// legacy EIP-712 ante handlers used evm.NewDeductFeeDecorator (virtual/ObjectStore path). +// In SDK v0.54 SimulateFromSeedX, ObjectStore is never flushed in simulate mode, +// so fees must land directly in the KV fee_collector. +func (suite *AnteTestSuite) TestCosmosTxFeeDeductedInSimulate() { + suite.Run("cosmos tx", func() { + suite.SetupTest() + + sender := sdk.AccAddress(suite.priv.PubKey().Address()) + recipient := sdk.AccAddress(make([]byte, 20)) + msg := banktypes.NewMsgSend(sender, recipient, sdk.NewCoins(sdk.NewCoin(evmtypes.DefaultEVMDenom, sdkmath.NewInt(1)))) + txBuilder := suite.CreateTestSingleSignedTx(suite.priv, signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, msg, "ethermint_9000-1", 2000000, "") + + feeCollector := suite.app.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName) + before := suite.app.BankKeeper.GetBalance(suite.ctx, feeCollector, evmtypes.DefaultEVMDenom) + _, err := suite.anteHandler(suite.ctx, txBuilder.GetTx(), true) + suite.Require().NoError(err) + after := suite.app.BankKeeper.GetBalance(suite.ctx, feeCollector, evmtypes.DefaultEVMDenom) + suite.Require().True(after.Amount.GT(before.Amount), + "fee_collector KV balance must increase in simulate mode; got before=%s after=%s", before.Amount, after.Amount) + }) + + suite.Run("legacy EIP-712 tx", func() { + suite.useLegacyEIP712Extension = true + suite.useLegacyEIP712TypedData = true + suite.SetupTest() + suite.useLegacyEIP712Extension = false + suite.useLegacyEIP712TypedData = false + + sender := sdk.AccAddress(suite.priv.PubKey().Address()) + const gas = uint64(200000) + feeCoins := sdk.NewCoins(sdk.NewCoin(evmtypes.DefaultEVMDenom, sdkmath.NewInt(int64(100*gas)))) + txBuilder := suite.CreateTestEIP712TxBuilderMsgSend(sender, suite.priv, "ethermint_9000-1", gas, feeCoins) + + feeCollector := suite.app.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName) + before := suite.app.BankKeeper.GetBalance(suite.ctx, feeCollector, evmtypes.DefaultEVMDenom) + _, err := suite.anteHandler(suite.ctx, txBuilder.GetTx(), true) + suite.Require().NoError(err) + after := suite.app.BankKeeper.GetBalance(suite.ctx, feeCollector, evmtypes.DefaultEVMDenom) + suite.Require().True(after.Amount.GT(before.Amount), + "fee_collector KV balance must increase in simulate mode; got before=%s after=%s", before.Amount, after.Amount) + }) +} + func generatePubKeysAndSignatures(n int, msg []byte, _ bool) (pubkeys []cryptotypes.PubKey, signatures [][]byte, err error) { pubkeys = make([]cryptotypes.PubKey, n) signatures = make([][]byte, n) diff --git a/app/ante/authz_test.go b/evmd/ante/authz_test.go similarity index 93% rename from app/ante/authz_test.go rename to evmd/ante/authz_test.go index d6e52a022d..23f7dc4b23 100644 --- a/app/ante/authz_test.go +++ b/evmd/ante/authz_test.go @@ -15,8 +15,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" utiltx "github.com/evmos/ethermint/testutil/tx" - "github.com/evmos/ethermint/app/ante" - + "github.com/evmos/ethermint/ante/cosmos" "github.com/evmos/ethermint/crypto/ethsecp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -44,7 +43,7 @@ func (suite *AnteTestSuite) TestAuthzLimiterDecorator() { ) suite.Require().NoError(err) - decorator := ante.NewAuthzLimiterDecorator( + decorator := cosmos.NewAuthzLimiterDecorator( []string{ sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}), sdk.MsgTypeURL(&stakingtypes.MsgUndelegate{}), @@ -255,6 +254,26 @@ func (suite *AnteTestSuite) TestRejectDeliverMsgsInAuthz() { }, expectedCode: sdkerrors.ErrUnauthorized.ABCICode(), }, + { + name: "a MsgGrant with MsgCreatePermanentLockedAccount typeURL on the authorization field is blocked", + msgs: []sdk.Msg{ + newGenericMsgGrant( + testAddresses, + sdk.MsgTypeURL(&sdkvesting.MsgCreatePermanentLockedAccount{}), + ), + }, + expectedCode: sdkerrors.ErrUnauthorized.ABCICode(), + }, + { + name: "a MsgGrant with MsgCreatePeriodicVestingAccount typeURL on the authorization field is blocked", + msgs: []sdk.Msg{ + newGenericMsgGrant( + testAddresses, + sdk.MsgTypeURL(&sdkvesting.MsgCreatePeriodicVestingAccount{}), + ), + }, + expectedCode: sdkerrors.ErrUnauthorized.ABCICode(), + }, { name: "a MsgGrant with MsgEthereumTx typeURL on the authorization field included on EIP712 tx is blocked", msgs: []sdk.Msg{ diff --git a/evmd/ante/eth_test.go b/evmd/ante/eth_test.go new file mode 100644 index 0000000000..99808a3fb4 --- /dev/null +++ b/evmd/ante/eth_test.go @@ -0,0 +1,765 @@ +package ante_test + +import ( + "errors" + "fmt" + "math" + "math/big" + + "github.com/evmos/ethermint/ante/cache" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/holiman/uint256" + "google.golang.org/protobuf/proto" + + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + "github.com/ethereum/go-ethereum/core/tracing" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/evmos/ethermint/ante" + "github.com/evmos/ethermint/tests" + ethermint "github.com/evmos/ethermint/types" + "github.com/evmos/ethermint/x/evm/statedb" + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +func (suite *AnteTestSuite) TestNewEthAccountVerificationDecorator() { + addr := tests.GenerateAddress() + + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + var vmdb *statedb.StateDB + + testCases := []struct { + name string + tx sdk.Tx + malleate func() + checkTx bool + expPass bool + }{ + {"invalid transaction type", &invalidTx{}, func() {}, true, false}, + { + "not CheckTx still rejects insufficient balance", + tx, + func() { vmdb.SetCode(addr, nil, 0) }, + false, + false, + }, + { + "sender not set to msg", + evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil), + func() {}, + true, + false, + }, + { + "sender not EOA", + tx, + func() { + // set not as an EOA + vmdb.SetCode(addr, []byte("1"), 0) + }, + true, + false, + }, + { + "not enough balance to cover tx cost", + tx, + func() { + // reset back to EOA + vmdb.SetCode(addr, nil, 0) + }, + true, + false, + }, + { + "success new account", + tx, + func() { + vmdb.AddBalance(addr, uint256.NewInt(1000000), tracing.BalanceChangeTransfer) + }, + true, + true, + }, + { + "success existing account", + tx, + func() { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + vmdb.AddBalance(addr, uint256.NewInt(1000000), tracing.BalanceChangeTransfer) + }, + true, + true, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + vmdb = suite.StateDB() + tc.malleate() + suite.Require().NoError(vmdb.Commit()) + + accountGetter := ante.NewCachedAccountGetter(suite.ctx, suite.app.AccountKeeper) + rules := params.Rules{ + IsPrague: false, + } + err := ante.VerifyEthAccount(suite.ctx.WithIsCheckTx(tc.checkTx), tc.tx, suite.app.EvmKeeper, evmtypes.DefaultEVMDenom, accountGetter, rules) + + if tc.expPass { + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *AnteTestSuite) TestEthNonceVerificationDecorator() { + suite.SetupTest() + + addr := tests.GenerateAddress() + + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + testCases := []struct { + name string + tx sdk.Tx + malleate func() + reCheckTx bool + expPass bool + }{ + {"ReCheckTx", &invalidTx{}, func() {}, true, false}, + {"invalid transaction type", &invalidTx{}, func() {}, false, false}, + {"sender account not found", tx, func() {}, false, false}, + { + "sender nonce missmatch", + tx, + func() { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + }, + false, + false, + }, + { + "success", + tx, + func() { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.Require().NoError(acc.SetSequence(1)) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + }, + false, + true, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + tc.malleate() + accountGetter := ante.NewCachedAccountGetter(suite.ctx, suite.app.AccountKeeper) + _, err := ante.CheckAndSetEthSenderNonce(suite.ctx.WithIsReCheckTx(tc.reCheckTx), tc.tx, suite.app.AccountKeeper, false, accountGetter, cache.NewAnteCache(0)) + + if tc.expPass { + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + }) + } +} + +// verifies that CheckAndSetEthSenderNonce returns pending +// entries instead of immediately setting the cache. When pending entries are +// committed (after the full ante chain succeeds), the cache is properly updated +// to enable transaction replacement. +func (suite *AnteTestSuite) TestEthNonceCacheUpdatedDuringCheckTx() { + suite.SetupTest() + + addr := tests.GenerateAddress() + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + ctx := suite.ctx.WithIsCheckTx(true) + anteCache := cache.NewAnteCache(0) + accountGetter := ante.NewCachedAccountGetter(ctx, suite.app.AccountKeeper) + + pending, err := ante.CheckAndSetEthSenderNonce(ctx, tx, suite.app.AccountKeeper, false, accountGetter, anteCache) + suite.Require().NoError(err) + + fromStr := sdk.AccAddress(addr.Bytes()).String() + suite.Require().False(anteCache.Exists(fromStr, tx.AsTransaction().Nonce()), + "CheckTx should only stage entries until the ante chain succeeds") + + commitPendingEntries(anteCache, pending) + + suite.Require().True(anteCache.Exists(fromStr, tx.AsTransaction().Nonce()), + "nonce cache should be updated during CheckTx to enable replacement transactions") +} + +// staged entries must be dropped if later ante decorators fail. +func (suite *AnteTestSuite) TestEthNonceCacheLeakOnAnteFailure() { + suite.SetupTest() + + addr := tests.GenerateAddress() + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + ctx := suite.ctx.WithIsCheckTx(true) + anteCache := cache.NewAnteCache(0) + accountGetter := ante.NewCachedAccountGetter(ctx, suite.app.AccountKeeper) + + pending, err := ante.CheckAndSetEthSenderNonce(ctx, tx, suite.app.AccountKeeper, false, accountGetter, anteCache) + suite.Require().NoError(err) + + fromStr := sdk.AccAddress(addr.Bytes()).String() + suite.Require().False(anteCache.Exists(fromStr, tx.AsTransaction().Nonce()), + "nonce cache should be cleared when later ante decorators reject the tx") + suite.Require().Len(pending, 1) +} + +// Replacement scenario: once CheckTx stages an entry and the handler commits +// it, a second transaction with the same nonce should bypass validation via +// the cache shortcut. +func (suite *AnteTestSuite) TestEthNonceCacheBypassesValidationOnSecondTx() { + suite.SetupTest() + + addr := tests.GenerateAddress() + tx1 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx1.From = addr.Bytes() + + tx2 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx2.From = addr.Bytes() + + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + ctx := suite.ctx.WithIsCheckTx(true) + anteCache := cache.NewAnteCache(0) + accountGetter := ante.NewCachedAccountGetter(ctx, suite.app.AccountKeeper) + + nonce := tx1.AsTransaction().Nonce() + suite.Require().Equal(nonce, tx2.AsTransaction().Nonce()) + + // Stage the first tx; cache must remain untouched + pending, err := ante.CheckAndSetEthSenderNonce(ctx, tx1, suite.app.AccountKeeper, false, accountGetter, anteCache) + suite.Require().NoError(err) + suite.Require().Len(pending, 1) + + fromStr := sdk.AccAddress(addr.Bytes()).String() + suite.Require().False(anteCache.Exists(fromStr, nonce), + "cache should not contain nonce until pending entries are committed") + + // Simulate successful ante chain by committing staged entry + commitPendingEntries(anteCache, pending) + suite.Require().True(anteCache.Exists(fromStr, nonce)) + + // Replacement tx with same nonce should hit the cache shortcut + accountGetter = ante.NewCachedAccountGetter(ctx, suite.app.AccountKeeper) + _, err = ante.CheckAndSetEthSenderNonce(ctx, tx2, suite.app.AccountKeeper, false, accountGetter, anteCache) + + suite.Require().NoError(err, "cache shortcut should allow tx replacement when nonce is in cache") +} + +// DeliverTx (simulated here by ctx with IsCheckTx=false) should remove any +// pending nonce markers so the cache mirrors committed state. +func (suite *AnteTestSuite) TestEthNonceCacheClearedOnDeliverTx() { + suite.SetupTest() + + addr := tests.GenerateAddress() + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + ctx := suite.ctx.WithIsCheckTx(true) + anteCache := cache.NewAnteCache(0) + accountGetter := ante.NewCachedAccountGetter(ctx, suite.app.AccountKeeper) + + pending, err := ante.CheckAndSetEthSenderNonce(ctx, tx, suite.app.AccountKeeper, false, accountGetter, anteCache) + suite.Require().NoError(err) + commitPendingEntries(anteCache, pending) + + fromStr := sdk.AccAddress(addr.Bytes()).String() + suite.Require().True(anteCache.Exists(fromStr, tx.AsTransaction().Nonce())) + + acc = suite.app.AccountKeeper.GetAccount(suite.ctx, addr.Bytes()) + suite.Require().NoError(acc.SetSequence(0)) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + deliverCtx := suite.ctx.WithIsCheckTx(false) + deliverAccountGetter := ante.NewCachedAccountGetter(deliverCtx, suite.app.AccountKeeper) + + _, err = ante.CheckAndSetEthSenderNonce(deliverCtx, tx, suite.app.AccountKeeper, false, deliverAccountGetter, anteCache) + suite.Require().NoError(err) + suite.Require().False(anteCache.Exists(fromStr, tx.AsTransaction().Nonce()), + "cache entry should be cleared after DeliverTx") +} + +// ReCheckTx should not reinsert the nonce into the cache once a previous +// DeliverTx/cleanup removed it; this test enforces that we keep the cache +// empty after the recheck run. +func (suite *AnteTestSuite) TestEthNonceCacheRecheckDoesNotPollutesCache() { + suite.SetupTest() + + addr := tests.GenerateAddress() + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + ctx := suite.ctx.WithIsCheckTx(true) + anteCache := cache.NewAnteCache(0) + accountGetter := ante.NewCachedAccountGetter(ctx, suite.app.AccountKeeper) + + pending, err := ante.CheckAndSetEthSenderNonce(ctx, tx, suite.app.AccountKeeper, false, accountGetter, anteCache) + suite.Require().NoError(err) + commitPendingEntries(anteCache, pending) + + fromStr := sdk.AccAddress(addr.Bytes()).String() + anteCache.Delete(fromStr, tx.AsTransaction().Nonce()) + + acc = suite.app.AccountKeeper.GetAccount(suite.ctx, addr.Bytes()) + suite.Require().NoError(acc.SetSequence(0)) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + recheckCtx := ctx.WithIsReCheckTx(true) + recheckAccountGetter := ante.NewCachedAccountGetter(recheckCtx, suite.app.AccountKeeper) + + _, err = ante.CheckAndSetEthSenderNonce(recheckCtx, tx, suite.app.AccountKeeper, false, recheckAccountGetter, anteCache) + suite.Require().NoError(err) + + suite.Require().False(anteCache.Exists(fromStr, tx.AsTransaction().Nonce()), + "ReCheckTx should not repopulate the cache once the entry was cleared") +} + +// Mirrors the production ante handler logic in handler_options.go: staged +// entries are flushed into the shared cache only after the full CheckTx ante +// stack succeeds. +func commitPendingEntries(c *cache.AnteCache, entries []cache.TxNonce) { + // Tests bypass the actual handler by writing staged entries directly once the + // simulated ante chain “succeeds”. + for _, entry := range entries { + c.Set(entry.Address, entry.Nonce) + } +} + +type multiTx struct { + Msgs []sdk.Msg +} + +func (msg *multiTx) GetMsgs() []sdk.Msg { + return msg.Msgs +} + +func (msg *multiTx) GetMsgsV2() ([]proto.Message, error) { + return nil, errors.New("not implemented") +} + +func (suite *AnteTestSuite) TestEthGasConsumeDecorator() { + evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) + chainID := suite.app.EvmKeeper.ChainID() + chainCfg := evmParams.GetChainConfig() + ethCfg := chainCfg.EthereumConfig(chainID) + baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) + rules := ethCfg.Rules(big.NewInt(suite.ctx.BlockHeight()), ethCfg.MergeNetsplitBlock != nil, uint64(suite.ctx.BlockHeader().Time.Unix())) + + addr := tests.GenerateAddress() + + blockGasLimit := ethermint.BlockGasLimit(suite.ctx) + txGasLimit := uint64(1000) + tx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), txGasLimit, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + + suite.Require().Equal(int64(765625000), baseFee.Int64()) + + gasPrice := new(big.Int).Add(baseFee, evmtypes.DefaultPriorityReduction.BigInt()) + + tx2GasLimit := uint64(1000000) + tx2 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx2GasLimit, gasPrice, nil, nil, nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) + tx2.From = addr.Bytes() + tx2Priority := int64(1) + + tx3GasLimit := blockGasLimit + uint64(1) + tx3 := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx3GasLimit, gasPrice, nil, nil, nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) + + dynamicFeeTx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), tx2GasLimit, + nil, // gasPrice + new(big.Int).Add(baseFee, big.NewInt(evmtypes.DefaultPriorityReduction.Int64()*2)), // gasFeeCap + evmtypes.DefaultPriorityReduction.BigInt(), // gasTipCap + nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) + dynamicFeeTx.From = addr.Bytes() + dynamicFeeTxPriority := int64(1) + + maxGasLimitTx := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), math.MaxUint64, gasPrice, nil, nil, nil, ðtypes.AccessList{{Address: addr, StorageKeys: nil}}) + maxGasLimitTx.From = addr.Bytes() + + var vmdb *statedb.StateDB + + testCases := []struct { + name string + tx sdk.Tx + gasLimit uint64 + malleate func() + expPass bool + expPanic bool + expPriority int64 + err error + }{ + {"invalid transaction type", &invalidTx{}, math.MaxUint64, func() {}, false, false, 0, nil}, + { + "sender not found", + evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 1, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil), + math.MaxUint64, + func() {}, + false, false, + 0, + nil, + }, + { + "gas limit too low", + tx, + math.MaxUint64, + func() {}, + false, false, + 0, + nil, + }, + { + "gas limit above block gas limit", + tx3, + math.MaxUint64, + func() {}, + false, false, + 0, + nil, + }, + { + "not enough balance for fees", + tx2, + math.MaxUint64, + func() {}, + false, false, + 0, + nil, + }, + { + "not enough tx gas", + tx2, + 0, + func() { + vmdb.AddBalance(addr, uint256.NewInt(1000000), tracing.BalanceChangeTransfer) + }, + false, true, + 0, + nil, + }, + { + "not enough block gas", + tx2, + 0, + func() { + vmdb.AddBalance(addr, uint256.NewInt(1000000), tracing.BalanceChangeTransfer) + suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(1)) + }, + false, true, + 0, + nil, + }, + { + "gas limit overflow", + &multiTx{ + Msgs: []sdk.Msg{maxGasLimitTx, tx2}, + }, + math.MaxUint64, + func() { + limit := uint256.NewInt(math.MaxUint64) + gasPrice := uint256.MustFromBig(gasPrice) + balance := uint256.NewInt(0).Mul(limit, gasPrice) + + vmdb.AddBalance(addr, balance, tracing.BalanceChangeTransfer) + }, + false, false, + 0, + fmt.Errorf("tx gas (%d) exceeds block gas limit (%d)", maxGasLimitTx.GetGas(), blockGasLimit), + }, + { + "success - legacy tx", + tx2, + tx2GasLimit, // it's capped + func() { + vmdb.AddBalance(addr, uint256.NewInt(1001000000000000), tracing.BalanceChangeTransfer) + suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(10000000000000000000)) + }, + true, false, + tx2Priority, + nil, + }, + { + "success - dynamic fee tx", + dynamicFeeTx, + tx2GasLimit, // it's capped + func() { + vmdb.AddBalance(addr, uint256.NewInt(1001000000000000), tracing.BalanceChangeTransfer) + suite.ctx = suite.ctx.WithBlockGasMeter(storetypes.NewGasMeter(10000000000000000000)) + }, + true, false, + dynamicFeeTxPriority, + nil, + }, + { + "success - gas limit on gasMeter is set on ReCheckTx mode", + dynamicFeeTx, + tx2GasLimit, // it's capped + func() { + vmdb.AddBalance(addr, uint256.NewInt(1001000000000000), tracing.BalanceChangeTransfer) + suite.ctx = suite.ctx.WithIsReCheckTx(true) + }, + true, false, + 1, + nil, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + vmdb = suite.StateDB() + tc.malleate() + suite.Require().NoError(vmdb.Commit()) + + if tc.expPanic { + suite.Require().Panics(func() { + _, _ = ante.CheckEthGasConsume( + suite.ctx.WithIsCheckTx(true).WithGasMeter(storetypes.NewGasMeter(1)), tc.tx, + rules, suite.app.EvmKeeper, baseFee, evmtypes.DefaultEVMDenom, + ) + }) + return + } + + ctx, err := ante.CheckEthGasConsume( + suite.ctx.WithIsCheckTx(true).WithGasMeter(storetypes.NewInfiniteGasMeter()), tc.tx, + rules, suite.app.EvmKeeper, baseFee, evmtypes.DefaultEVMDenom, + ) + if tc.expPass { + suite.Require().NoError(err) + suite.Require().Equal(tc.expPriority, ctx.Priority()) + } else { + if tc.err != nil { + suite.Require().ErrorContains(err, tc.err.Error()) + } else { + suite.Require().Error(err) + } + } + suite.Require().Equal(tc.gasLimit, ctx.GasMeter().Limit()) + }) + } +} + +func (suite *AnteTestSuite) TestCanTransferDecorator() { + addr, privKey := tests.NewAddrKey() + suite.app.FeeMarketKeeper.SetBaseFee(suite.ctx, big.NewInt(100)) + + evmParams := suite.app.EvmKeeper.GetParams(suite.ctx) + chainID := suite.app.EvmKeeper.ChainID() + chainCfg := evmParams.GetChainConfig() + ethCfg := chainCfg.EthereumConfig(chainID) + baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) + rules := ethCfg.Rules(big.NewInt(suite.ctx.BlockHeight()), ethCfg.MergeNetsplitBlock != nil, uint64(suite.ctx.BlockHeader().Time.Unix())) + + tx := evmtypes.NewTxContract( + suite.app.EvmKeeper.ChainID(), + 1, + big.NewInt(10), + 1000, + big.NewInt(150), + big.NewInt(200), + nil, + nil, + ðtypes.AccessList{}, + ) + tx2 := evmtypes.NewTxContract( + suite.app.EvmKeeper.ChainID(), + 1, + big.NewInt(10), + 1000, + big.NewInt(150), + big.NewInt(200), + nil, + nil, + ðtypes.AccessList{}, + ) + tx3 := evmtypes.NewTxContract( + suite.app.EvmKeeper.ChainID(), + 1, + big.NewInt(-10), + 1000, + big.NewInt(150), + big.NewInt(200), + nil, + nil, + ðtypes.AccessList{}, + ) + + for _, tx := range []*evmtypes.MsgEthereumTx{tx, tx3} { + tx.From = addr.Bytes() + + err := tx.Sign(suite.ethSigner, tests.NewSigner(privKey)) + suite.Require().NoError(err) + } + + var vmdb *statedb.StateDB + + testCases := []struct { + name string + tx sdk.Tx + malleate func() + expPass bool + }{ + {"invalid transaction type", &invalidTx{}, func() {}, false}, + {"AsMessage failed", tx2, func() {}, false}, + {"negative value", tx3, func() {}, false}, + { + "evm CanTransfer failed", + tx, + func() { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + }, + false, + }, + { + "success", + tx, + func() { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + vmdb.AddBalance(addr, uint256.NewInt(1000000), tracing.BalanceChangeTransfer) + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + vmdb = suite.StateDB() + tc.malleate() + suite.Require().NoError(vmdb.Commit()) + + err := ante.CheckEthCanTransfer( + suite.ctx.WithIsCheckTx(true), tc.tx, + baseFee, rules, suite.app.EvmKeeper, &evmParams, + ) + + if tc.expPass { + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *AnteTestSuite) TestEthIncrementSenderSequenceDecorator() { + addr, privKey := tests.NewAddrKey() + + contract := evmtypes.NewTxContract(suite.app.EvmKeeper.ChainID(), 0, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + contract.From = addr.Bytes() + err := contract.Sign(suite.ethSigner, tests.NewSigner(privKey)) + suite.Require().NoError(err) + + to := tests.GenerateAddress() + tx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 0, &to, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx.From = addr.Bytes() + err = tx.Sign(suite.ethSigner, tests.NewSigner(privKey)) + suite.Require().NoError(err) + + tx2 := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil) + tx2.From = addr.Bytes() + err = tx2.Sign(suite.ethSigner, tests.NewSigner(privKey)) + suite.Require().NoError(err) + + testCases := []struct { + name string + tx sdk.Tx + malleate func() + expPass bool + expPanic bool + }{ + { + "invalid transaction type", + &invalidTx{}, + func() {}, + false, false, + }, + { + "no signers", + evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 1000, big.NewInt(1), nil, nil, nil, nil), + func() {}, + false, false, + }, + { + "account not set to store", + tx, + func() {}, + true, false, + }, + { + "success - create contract", + contract, + func() { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr.Bytes()) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + }, + true, false, + }, + { + "success - call", + tx2, + func() {}, + true, false, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + tc.malleate() + accountGetter := ante.NewCachedAccountGetter(suite.ctx, suite.app.AccountKeeper) + + if tc.expPanic { + suite.Require().Panics(func() { + _, _ = ante.CheckAndSetEthSenderNonce(suite.ctx, tc.tx, suite.app.AccountKeeper, false, accountGetter, cache.NewAnteCache(0)) + }) + return + } + + _, err := ante.CheckAndSetEthSenderNonce(suite.ctx, tc.tx, suite.app.AccountKeeper, false, accountGetter, cache.NewAnteCache(0)) + + if tc.expPass { + suite.Require().NoError(err) + msg := tc.tx.(*evmtypes.MsgEthereumTx) + + txData := msg.AsTransaction() + suite.Require().NotNil(txData) + + nonce := suite.app.EvmKeeper.GetNonce(suite.ctx, addr) + suite.Require().Equal(txData.Nonce()+1, nonce) + } else { + suite.Require().Error(err) + } + }) + } +} diff --git a/evmd/ante/evm_handler.go b/evmd/ante/evm_handler.go new file mode 100644 index 0000000000..13a751d2d6 --- /dev/null +++ b/evmd/ante/evm_handler.go @@ -0,0 +1,62 @@ +// Copyright 2021 Evmos Foundation +// This file is part of Evmos' Ethermint library. +// +// The Ethermint library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The Ethermint library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + authante "github.com/cosmos/cosmos-sdk/x/auth/ante" + ibcante "github.com/cosmos/ibc-go/v11/modules/core/ante" + "github.com/evmos/ethermint/ante/cosmos" + "github.com/evmos/ethermint/ante/evm" +) + +// Deprecated: newLegacyCosmosAnteHandlerEip712 creates an AnteHandler to process legacy EIP-712 +// transactions, as defined by the presence of an ExtensionOptionsWeb3Tx extension. +func newLegacyCosmosAnteHandlerEip712(ctx sdk.Context, options HandlerOptions, extra ...sdk.AnteDecorator) sdk.AnteHandler { + evmParams := options.EvmKeeper.GetParams(ctx) + feemarketParams := options.FeeMarketKeeper.GetParams(ctx) + evmDenom := evmParams.EvmDenom + chainID := options.EvmKeeper.ChainID() + chainCfg := evmParams.GetChainConfig() + ethCfg := chainCfg.EthereumConfig(chainID) + var txFeeChecker authante.TxFeeChecker + if options.DynamicFeeChecker { + txFeeChecker = evm.NewDynamicFeeChecker(ethCfg, &evmParams, &feemarketParams) + } + decorators := make([]sdk.AnteDecorator, 0, 15+len(extra)) + decorators = append(decorators, + cosmos.RejectMessagesDecorator{}, // reject MsgEthereumTxs + // disable the Msg types that cannot be included on an authz.MsgExec msgs field + cosmos.NewAuthzLimiterDecorator(options.DisabledAuthzMsgs), + authante.NewSetUpContextDecorator(), + authante.NewValidateBasicDecorator(), + authante.NewTxTimeoutHeightDecorator(), + cosmos.NewMinGasPriceDecorator(options.FeeMarketKeeper, evmDenom, &feemarketParams), + authante.NewValidateMemoDecorator(options.AccountKeeper), + authante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), + authante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, txFeeChecker), + // SetPubKeyDecorator must be called before all signature verification decorators + authante.NewSetPubKeyDecorator(options.AccountKeeper), + authante.NewValidateSigCountDecorator(options.AccountKeeper), + authante.NewSigGasConsumeDecorator(options.AccountKeeper, options.SigGasConsumer), + // Note: signature verification uses EIP instead of the cosmos signature validator + cosmos.NewLegacyEip712SigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), + authante.NewIncrementSequenceDecorator(options.AccountKeeper), + ibcante.NewRedundantRelayDecorator(options.IBCKeeper), + ) + decorators = append(decorators, extra...) + return sdk.ChainAnteDecorators(decorators...) +} diff --git a/app/ante/handler_options.go b/evmd/ante/handler_options.go similarity index 65% rename from app/ante/handler_options.go rename to evmd/ante/handler_options.go index 2d50fcc3f6..6c09aa6dc6 100644 --- a/app/ante/handler_options.go +++ b/evmd/ante/handler_options.go @@ -17,17 +17,22 @@ package ante import ( errorsmod "cosmossdk.io/errors" - storetypes "cosmossdk.io/store/types" - txsigning "cosmossdk.io/x/tx/signing" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/ante" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + txsigning "github.com/cosmos/cosmos-sdk/x/tx/signing" ethtypes "github.com/ethereum/go-ethereum/core/types" + evmante "github.com/evmos/ethermint/ante" + "github.com/evmos/ethermint/ante/cache" + "github.com/evmos/ethermint/ante/cosmos" + "github.com/evmos/ethermint/ante/evm" + "github.com/evmos/ethermint/ante/interfaces" - ibcante "github.com/cosmos/ibc-go/v8/modules/core/ante" - ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" + ibcante "github.com/cosmos/ibc-go/v11/modules/core/ante" + ibckeeper "github.com/cosmos/ibc-go/v11/modules/core/keeper" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -38,18 +43,22 @@ type HandlerOptions struct { AccountKeeper evmtypes.AccountKeeper BankKeeper evmtypes.BankKeeper IBCKeeper *ibckeeper.Keeper - FeeMarketKeeper FeeMarketKeeper - EvmKeeper EVMKeeper + FeeMarketKeeper interfaces.FeeMarketKeeper + EvmKeeper interfaces.EVMKeeper FeegrantKeeper ante.FeegrantKeeper SignModeHandler *txsigning.HandlerMap SigGasConsumer func(meter storetypes.GasMeter, sig signing.SignatureV2, params authtypes.Params) error - MaxTxGasWanted uint64 ExtensionOptionChecker ante.ExtensionOptionChecker // use dynamic fee checker or the cosmos-sdk default one for native transactions DynamicFeeChecker bool DisabledAuthzMsgs []string ExtraDecorators []sdk.AnteDecorator PendingTxListener PendingTxListener + + // see #494, just for benchmark, don't turn on on production + UnsafeUnorderedTx bool + + AnteCache *cache.AnteCache } func (options HandlerOptions) validate() error { @@ -68,6 +77,9 @@ func (options HandlerOptions) validate() error { if options.EvmKeeper == nil { return errorsmod.Wrap(errortypes.ErrLogic, "evm keeper is required for AnteHandler") } + if options.AnteCache == nil { + return errorsmod.Wrap(errortypes.ErrLogic, "ante cache is required for AnteHandler") + } return nil } @@ -82,7 +94,6 @@ func newEthAnteHandler(options HandlerOptions) sdk.AnteHandler { feemarketParams := &blockCfg.FeeMarketParams baseFee := blockCfg.BaseFee rules := blockCfg.Rules - ethSigner := ethtypes.MakeSigner(blockCfg.ChainConfig, blockCfg.BlockNumber) // all transactions must implement FeeTx _, ok := tx.(sdk.FeeTx) @@ -91,44 +102,51 @@ func newEthAnteHandler(options HandlerOptions) sdk.AnteHandler { } // We need to setup an empty gas config so that the gas is consistent with Ethereum. - ctx, err = SetupEthContext(ctx) + ctx, err = interfaces.SetupEthContext(ctx) if err != nil { return ctx, err } - if err := CheckEthMempoolFee(ctx, tx, simulate, baseFee, evmDenom); err != nil { + if err := cosmos.CheckEthMempoolFee(ctx, tx, simulate, baseFee, evmDenom); err != nil { return ctx, err } - if err := CheckEthMinGasPrice(tx, feemarketParams.MinGasPrice, baseFee); err != nil { + if err := cosmos.CheckEthMinGasPrice(tx, feemarketParams.MinGasPrice, baseFee); err != nil { return ctx, err } - if err := ValidateEthBasic(ctx, tx, evmParams, baseFee); err != nil { + if err := interfaces.ValidateEthBasic(ctx, tx, evmParams, baseFee); err != nil { return ctx, err } - if err := VerifyEthSig(tx, ethSigner); err != nil { + ethSigner := ethtypes.MakeSigner(blockCfg.ChainConfig, blockCfg.BlockNumber, blockCfg.BlockTime) + if err := evmante.VerifyEthSig(tx, ethSigner); err != nil { return ctx, err } - if err := VerifyEthAccount(ctx, tx, options.EvmKeeper, options.AccountKeeper, evmDenom); err != nil { + // AccountGetter cache the account objects during the ante handler execution, + // it's safe because there's no store branching in the ante handlers. + accountGetter := evmante.NewCachedAccountGetter(ctx, options.AccountKeeper) + + if err := evmante.VerifyEthAccount(ctx, tx, options.EvmKeeper, evmDenom, accountGetter, rules); err != nil { return ctx, err } - if err := CheckEthCanTransfer(ctx, tx, baseFee, rules, options.EvmKeeper, evmParams); err != nil { + if err := evmante.CheckEthCanTransfer(ctx, tx, baseFee, rules, options.EvmKeeper, evmParams); err != nil { return ctx, err } - ctx, err = CheckEthGasConsume( + ctx, err = evmante.CheckEthGasConsume( ctx, tx, rules, options.EvmKeeper, - baseFee, options.MaxTxGasWanted, evmDenom, + baseFee, evmDenom, ) if err != nil { return ctx, err } - if err := CheckEthSenderNonce(ctx, tx, options.AccountKeeper); err != nil { + pendingNonces, err := evmante.CheckAndSetEthSenderNonce( + ctx, tx, options.AccountKeeper, options.UnsafeUnorderedTx, accountGetter, options.AnteCache) + if err != nil { return ctx, err } @@ -136,10 +154,24 @@ func newEthAnteHandler(options HandlerOptions) sdk.AnteHandler { if options.PendingTxListener != nil { extraDecorators = append(extraDecorators, newTxListenerDecorator(options.PendingTxListener)) } + finalCtx := ctx if len(extraDecorators) > 0 { - return sdk.ChainAnteDecorators(extraDecorators...)(ctx, tx, simulate) + finalCtx, err = sdk.ChainAnteDecorators(extraDecorators...)(ctx, tx, simulate) + if err != nil { + return finalCtx, err + } } - return ctx, nil + + // Only after the full CheckTx ante stack succeeds do we flush the staged + // nonces into the shared cache; failures exit earlier and leave the cache + // untouched. + if finalCtx.IsCheckTx() && !finalCtx.IsReCheckTx() { + for _, entry := range pendingNonces { + options.AnteCache.Set(entry.Address, entry.Nonce) + } + } + + return finalCtx, nil } } @@ -152,20 +184,21 @@ func newCosmosAnteHandler(ctx sdk.Context, options HandlerOptions, extra ...sdk. ethCfg := chainCfg.EthereumConfig(chainID) var txFeeChecker ante.TxFeeChecker if options.DynamicFeeChecker { - txFeeChecker = NewDynamicFeeChecker(ethCfg, &evmParams, &feemarketParams) + txFeeChecker = evm.NewDynamicFeeChecker(ethCfg, &evmParams, &feemarketParams) } - decorators := []sdk.AnteDecorator{ - RejectMessagesDecorator{}, // reject MsgEthereumTxs + decorators := make([]sdk.AnteDecorator, 0, 16+len(extra)) + decorators = append(decorators, + cosmos.RejectMessagesDecorator{}, // reject MsgEthereumTxs // disable the Msg types that cannot be included on an authz.MsgExec msgs field - NewAuthzLimiterDecorator(options.DisabledAuthzMsgs), + cosmos.NewAuthzLimiterDecorator(options.DisabledAuthzMsgs), ante.NewSetUpContextDecorator(), ante.NewExtensionOptionsDecorator(options.ExtensionOptionChecker), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), - NewMinGasPriceDecorator(options.FeeMarketKeeper, evmDenom, &feemarketParams), + cosmos.NewMinGasPriceDecorator(options.FeeMarketKeeper, evmDenom, &feemarketParams), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), - NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, txFeeChecker), + ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, txFeeChecker), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewSetPubKeyDecorator(options.AccountKeeper), ante.NewValidateSigCountDecorator(options.AccountKeeper), @@ -173,7 +206,7 @@ func newCosmosAnteHandler(ctx sdk.Context, options HandlerOptions, extra ...sdk. ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), ante.NewIncrementSequenceDecorator(options.AccountKeeper), ibcante.NewRedundantRelayDecorator(options.IBCKeeper), - } + ) decorators = append(decorators, extra...) return sdk.ChainAnteDecorators(decorators...) } diff --git a/app/ante/fees_test.go b/evmd/ante/min_gas_price_test.go similarity index 97% rename from app/ante/fees_test.go rename to evmd/ante/min_gas_price_test.go index a0124cb036..9adf0c4d2d 100644 --- a/app/ante/fees_test.go +++ b/evmd/ante/min_gas_price_test.go @@ -7,7 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app/ante" + "github.com/evmos/ethermint/ante/cosmos" "github.com/evmos/ethermint/tests" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -123,7 +123,7 @@ func (s *AnteTestSuite) TestMinGasPriceDecorator() { // s.SetupTest(et.isCheckTx) ctx := s.ctx.WithIsReCheckTx(et.isCheckTx) feemarketParams := s.app.FeeMarketKeeper.GetParams(ctx) - dec := ante.NewMinGasPriceDecorator(s.app.FeeMarketKeeper, evmtypes.DefaultEVMDenom, &feemarketParams) + dec := cosmos.NewMinGasPriceDecorator(s.app.FeeMarketKeeper, evmtypes.DefaultEVMDenom, &feemarketParams) _, err := dec.AnteHandle(ctx, tc.malleate(), et.simulate, NextFn) if tc.expPass || (et.simulate && tc.allowPassOnSimulate) { @@ -342,7 +342,7 @@ func (s *AnteTestSuite) TestEthMinGasPriceDecorator() { baseFee := s.app.EvmKeeper.GetBaseFee(s.ctx, ethCfg) feemarketParams := s.app.FeeMarketKeeper.GetParams(s.ctx) - err := ante.CheckEthMinGasPrice(tx, feemarketParams.MinGasPrice, baseFee) + err := cosmos.CheckEthMinGasPrice(tx, feemarketParams.MinGasPrice, baseFee) if tc.expPass { s.Require().NoError(err, tc.name) diff --git a/app/ante/setup_test.go b/evmd/ante/setup_test.go similarity index 91% rename from app/ante/setup_test.go rename to evmd/ante/setup_test.go index fb7ca9a0df..971c81add8 100644 --- a/app/ante/setup_test.go +++ b/evmd/ante/setup_test.go @@ -3,10 +3,10 @@ package ante_test import ( "math/big" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app/ante" + "github.com/evmos/ethermint/ante/interfaces" "github.com/evmos/ethermint/tests" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -28,7 +28,7 @@ func (suite *AnteTestSuite) TestEthSetupContextDecorator() { for _, tc := range testCases { suite.Run(tc.name, func() { - ctx, err := ante.SetupEthContext(suite.ctx) + ctx, err := interfaces.SetupEthContext(suite.ctx) if tc.expPass { suite.Require().NoError(err) @@ -88,7 +88,7 @@ func (suite *AnteTestSuite) TestValidateBasicDecorator() { ethCfg := chainCfg.EthereumConfig(chainID) baseFee := suite.app.EvmKeeper.GetBaseFee(suite.ctx, ethCfg) - err := ante.ValidateEthBasic(suite.ctx.WithIsReCheckTx(tc.reCheckTx), tc.tx, &evmParams, baseFee) + err := interfaces.ValidateEthBasic(suite.ctx.WithIsReCheckTx(tc.reCheckTx), tc.tx, &evmParams, baseFee) if tc.expPass { suite.Require().NoError(err) diff --git a/evmd/ante/sigcache_stm_test.go b/evmd/ante/sigcache_stm_test.go new file mode 100644 index 0000000000..26da4c165c --- /dev/null +++ b/evmd/ante/sigcache_stm_test.go @@ -0,0 +1,274 @@ +package ante_test + +import ( + "context" + "fmt" + "math/big" + "runtime" + "sync/atomic" + "testing" + "time" + + "cosmossdk.io/log/v2" + "github.com/cosmos/cosmos-sdk/store/v2/rootmulti" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + abci "github.com/cometbft/cometbft/abci/types" + dbm "github.com/cosmos/cosmos-db" + "github.com/cosmos/cosmos-sdk/baseapp/txnrunner" + "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" + + evmante "github.com/evmos/ethermint/ante" + "github.com/evmos/ethermint/crypto/ethsecp256k1" + testutilconfig "github.com/evmos/ethermint/testutil/config" + "github.com/evmos/ethermint/tests" + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +func newSTMMultiStore(t *testing.T, storeKeys []storetypes.StoreKey) storetypes.CommitMultiStore { + t.Helper() + db := dbm.NewMemDB() + cms := rootmulti.NewStore(db, log.NewNopLogger()) + for _, key := range storeKeys { + cms.MountStoreWithDB(key, storetypes.StoreTypeIAVL, nil) + } + require.NoError(t, cms.LoadLatestVersion()) + return cms +} + +func buildSignedEthTxBytes( + t *testing.T, + txConfig interface { + NewTxBuilder() client.TxBuilder + TxEncoder() sdk.TxEncoder + }, + chainID *big.Int, + signer ethtypes.Signer, + privKey *ethsecp256k1.PrivKey, + from common.Address, + nonce uint64, +) []byte { + t.Helper() + msg := evmtypes.NewTxContract( + chainID, nonce, big.NewInt(0), + params.TxGasContractCreation, + big.NewInt(1), big.NewInt(1), big.NewInt(1), + []byte("data"), nil, + ) + msg.From = from.Bytes() + require.NoError(t, msg.Sign(signer, tests.NewSigner(privKey))) + builder := txConfig.NewTxBuilder() + require.NoError(t, builder.SetMsgs(msg)) + txBz, err := txConfig.TxEncoder()(builder.GetTx()) + require.NoError(t, err) + return txBz +} + +// countingSigner wraps an ethtypes.Signer and counts how many times the +// expensive Sender() method (ecrecover) is actually invoked. When go-ethereum's +// sigCache is hit, ethtypes.Sender() returns early without calling +// signer.Sender(tx), so the count stays the same. +type countingSigner struct { + inner ethtypes.Signer + count atomic.Int64 +} + +func (s *countingSigner) Sender(tx *ethtypes.Transaction) (common.Address, error) { + s.count.Add(1) + return s.inner.Sender(tx) +} + +func (s *countingSigner) SignatureValues(tx *ethtypes.Transaction, sig []byte) (r, s2, v *big.Int, err error) { + return s.inner.SignatureValues(tx, sig) +} + +func (s *countingSigner) ChainID() *big.Int { return s.inner.ChainID() } +func (s *countingSigner) Hash(tx *ethtypes.Transaction) common.Hash { return s.inner.Hash(tx) } + +func (s *countingSigner) Equal(other ethtypes.Signer) bool { + // Unwrap the other countingSigner so the underlying signer's Equal + // can compare by type+chainID. Without this, the cache check + // (sigCache.signer.Equal(signer)) always fails because modernSigner + // doesn't recognize *countingSigner as an equal type. + if cs, ok := other.(*countingSigner); ok { + return s.inner.Equal(cs.inner) + } + return s.inner.Equal(other) +} + +// TestSTMRunnerSigCachePerformanceGain measures the cost of VerifyEthSig +// with and without the sigCache in a realistic Block-STM scenario. +// The first incarnation populates the cache; simulated re-verifications +// should be measurably cheaper. +func TestSTMRunnerSigCachePerformanceGain(t *testing.T) { + encCfg := testutilconfig.MakeConfigForTest(nil) + txConfig := encCfg.TxConfig + txDecoder := txConfig.TxDecoder() + + chainID := big.NewInt(1) + signer := ethtypes.LatestSignerForChainID(chainID) + + privKey, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + from := common.BytesToAddress(privKey.PubKey().Address()) + + const txCount = 4 + txs := make([][]byte, txCount) + for i := 0; i < txCount; i++ { + txs[i] = buildSignedEthTxBytes(t, txConfig, chainID, signer, privKey, from, uint64(i)) + } + + storeKeys := []storetypes.StoreKey{ + storetypes.NewKVStoreKey("acc"), + storetypes.NewKVStoreKey("bank"), + } + cms := newSTMMultiStore(t, storeKeys) + + runner := txnrunner.NewSTMRunner( + txDecoder, storeKeys, runtime.GOMAXPROCS(0), true, + func(_ storetypes.MultiStore) string { return evmtypes.DefaultEVMDenom }, + ) + + var ( + firstCallTotal atomic.Int64 + cachedCallTotal atomic.Int64 + ) + const cachedReps = 50 + + deliverTx := func(txBytes []byte, memTx sdk.Tx, ms storetypes.MultiStore, txIndex int, cache map[string]any) *abci.ExecTxResult { + if memTx == nil { + return &abci.ExecTxResult{Code: 1, Log: "nil memTx"} + } + + // First call: may or may not hit cache depending on whether another + // incarnation already ran. We time it regardless. + start := time.Now() + if err := evmante.VerifyEthSig(memTx, signer); err != nil { + return &abci.ExecTxResult{Code: 1, Log: err.Error()} + } + firstCallTotal.Add(time.Since(start).Nanoseconds()) + + // Subsequent calls: definitely cached + start = time.Now() + for i := 0; i < cachedReps; i++ { + if err := evmante.VerifyEthSig(memTx, signer); err != nil { + return &abci.ExecTxResult{Code: 1, Log: err.Error()} + } + } + cachedCallTotal.Add(time.Since(start).Nanoseconds()) + + return &abci.ExecTxResult{Code: 0} + } + + results, err := runner.Run(context.Background(), cms, txs, deliverTx) + require.NoError(t, err) + for i, result := range results { + require.Equal(t, uint32(0), result.Code, "tx %d failed: %s", i, result.Log) + } + + avgFirst := time.Duration(firstCallTotal.Load() / int64(txCount)) + avgCached := time.Duration(cachedCallTotal.Load() / int64(txCount*cachedReps)) + t.Logf("avg first VerifyEthSig: %v, avg cached (%d reps): %v, speedup: %.1fx", + avgFirst, cachedReps, avgCached, float64(avgFirst)/float64(avgCached)) + + // The cached path should be significantly faster (at least 2x). + // On most machines the speedup is 50-500x. + if avgFirst > 0 && avgCached > 0 { + require.Greater(t, float64(avgFirst)/float64(avgCached), 2.0, + "cached VerifyEthSig should be at least 2x faster than the first call") + } +} + +// TestSTMRunnerSigCacheEcrecoverCount provides definitive proof that go-ethereum's +// sigCache is working. It wraps the signer with a countingSigner that tracks how +// many times the expensive signer.Sender() (ecrecover) is actually called. +// +// Flow inside ethtypes.Sender(): +// +// if sigCache := tx.from.Load(); sigCache != nil && sigCache.signer.Equal(signer) { +// return sigCache.from, nil // <-- cache HIT: signer.Sender() NOT called +// } +// addr, _ := signer.Sender(tx) // <-- cache MISS: signer.Sender() IS called (ecrecover) +// tx.from.Store(&sigCache{...}) +// +// So if we call VerifyEthSig N times on the same *Transaction with the same +// signer, signer.Sender() should be called exactly 1 time (the first call), +// and the remaining N-1 calls return from the cache. +func TestSTMRunnerSigCacheEcrecoverCount(t *testing.T) { + encCfg := testutilconfig.MakeConfigForTest(nil) + txConfig := encCfg.TxConfig + txDecoder := txConfig.TxDecoder() + + chainID := big.NewInt(1) + realSigner := ethtypes.LatestSignerForChainID(chainID) + + privKey, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + from := common.BytesToAddress(privKey.PubKey().Address()) + + const txCount = 8 + txs := make([][]byte, txCount) + for i := 0; i < txCount; i++ { + txs[i] = buildSignedEthTxBytes(t, txConfig, chainID, realSigner, privKey, from, uint64(i)) + } + + storeKeys := []storetypes.StoreKey{ + storetypes.NewKVStoreKey("acc"), + storetypes.NewKVStoreKey("bank"), + } + cms := newSTMMultiStore(t, storeKeys) + + runner := txnrunner.NewSTMRunner( + txDecoder, storeKeys, runtime.GOMAXPROCS(0), true, + func(_ storetypes.MultiStore) string { return evmtypes.DefaultEVMDenom }, + ) + + // Wrap the signer with our counting proxy. + // IMPORTANT: we must use the same countingSigner instance for all calls + // so that go-ethereum's Equal() check on the cached signer returns true. + counting := &countingSigner{inner: realSigner} + + const verifyCalls = 10 + var totalVerifyCalls atomic.Int64 + + deliverTx := func(txBytes []byte, memTx sdk.Tx, ms storetypes.MultiStore, txIndex int, cache map[string]any) *abci.ExecTxResult { + if memTx == nil { + return &abci.ExecTxResult{Code: 1, Log: "nil memTx"} + } + + // Call VerifyEthSig multiple times on the same memTx pointer + for i := 0; i < verifyCalls; i++ { + if err := evmante.VerifyEthSig(memTx, counting); err != nil { + return &abci.ExecTxResult{Code: 1, Log: fmt.Sprintf("verify %d failed: %v", i, err)} + } + } + totalVerifyCalls.Add(verifyCalls) + + return &abci.ExecTxResult{Code: 0} + } + + results, err := runner.Run(context.Background(), cms, txs, deliverTx) + require.NoError(t, err) + for i, result := range results { + require.Equal(t, uint32(0), result.Code, "tx %d failed: %s", i, result.Log) + } + + ecrecoverCalls := counting.count.Load() + totalCalls := totalVerifyCalls.Load() + + t.Logf("total VerifyEthSig calls: %d, actual ecrecover (signer.Sender) calls: %d", + totalCalls, ecrecoverCalls) + + // Each unique *Transaction pointer should cause exactly 1 ecrecover. + // With txCount=8 transactions, we expect at most txCount ecrecover calls, + // but totalCalls = txCount * verifyCalls = 80. + require.LessOrEqual(t, ecrecoverCalls, int64(txCount), + "ecrecover should be called at most once per tx, got %d for %d txs", ecrecoverCalls, txCount) + + require.Greater(t, totalCalls, ecrecoverCalls, + "total VerifyEthSig calls (%d) should far exceed ecrecover calls (%d)", totalCalls, ecrecoverCalls) +} diff --git a/app/ante/signverify_test.go b/evmd/ante/signverify_test.go similarity index 97% rename from app/ante/signverify_test.go rename to evmd/ante/signverify_test.go index 1f0e47ffcb..df66278be9 100644 --- a/app/ante/signverify_test.go +++ b/evmd/ante/signverify_test.go @@ -5,7 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app/ante" + "github.com/evmos/ethermint/ante" "github.com/evmos/ethermint/tests" evmtypes "github.com/evmos/ethermint/x/evm/types" ) diff --git a/app/ante/sigs_test.go b/evmd/ante/sigs_test.go similarity index 89% rename from app/ante/sigs_test.go rename to evmd/ante/sigs_test.go index 16506815ac..3a1da1a108 100644 --- a/app/ante/sigs_test.go +++ b/evmd/ante/sigs_test.go @@ -6,6 +6,7 @@ import ( "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/x/evm/statedb" evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" ) func (suite *AnteTestSuite) TestSignatures() { @@ -17,10 +18,10 @@ func (suite *AnteTestSuite) TestSignatures() { acc := statedb.NewEmptyAccount() acc.Nonce = 1 - balance := big.NewInt(10000000000) + balance := uint256.NewInt(10000000000) suite.app.EvmKeeper.SetAccount(suite.ctx, addr, *acc) - suite.app.EvmKeeper.SetBalance(suite.ctx, addr, balance, evmtypes.DefaultEVMDenom) + suite.app.EvmKeeper.SetBalance(suite.ctx, addr, *balance, evmtypes.DefaultEVMDenom) msgEthereumTx := evmtypes.NewTx(suite.app.EvmKeeper.ChainID(), 1, &to, big.NewInt(10), 100000, big.NewInt(1), nil, nil, nil, nil) msgEthereumTx.From = addr.Bytes() diff --git a/app/ante/tx_listener.go b/evmd/ante/tx_listener.go similarity index 100% rename from app/ante/tx_listener.go rename to evmd/ante/tx_listener.go diff --git a/app/ante/utils_test.go b/evmd/ante/utils_test.go similarity index 96% rename from app/ante/utils_test.go rename to evmd/ante/utils_test.go index 4cfae9ed6c..725f14ec38 100644 --- a/app/ante/utils_test.go +++ b/evmd/ante/utils_test.go @@ -6,8 +6,11 @@ import ( "math/big" "time" + "github.com/evmos/ethermint/ante/cache" + sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + "github.com/holiman/uint256" "github.com/stretchr/testify/suite" protov2 "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" @@ -15,8 +18,8 @@ import ( signingv1beta1 "cosmossdk.io/api/cosmos/tx/signing/v1beta1" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/ethereum/eip712" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/testutil" "github.com/evmos/ethermint/testutil/config" utiltx "github.com/evmos/ethermint/testutil/tx" @@ -24,7 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - txsigning "cosmossdk.io/x/tx/signing" + txsigning "github.com/cosmos/cosmos-sdk/x/tx/signing" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -41,14 +44,14 @@ import ( authz "github.com/cosmos/cosmos-sdk/x/authz" "github.com/evmos/ethermint/crypto/ethsecp256k1" - evtypes "cosmossdk.io/x/evidence/types" - "cosmossdk.io/x/feegrant" + evtypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - ante "github.com/evmos/ethermint/app/ante" + ante "github.com/evmos/ethermint/evmd/ante" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/x/evm/statedb" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -59,7 +62,7 @@ type AnteTestSuite struct { suite.Suite ctx sdk.Context - app *app.EthermintApp + app *evmd.EthermintApp clientCtx client.Context anteHandler sdk.AnteHandler priv cryptotypes.PrivKey @@ -83,7 +86,7 @@ func (suite *AnteTestSuite) SetupTest() { suite.Require().NoError(err) suite.priv = priv - suite.app = testutil.Setup(checkTx, func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.app = testutil.Setup(checkTx, func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { if suite.enableFeemarket { // setup feemarketGenesis params feemarketGenesis := feemarkettypes.DefaultGenesisState() @@ -103,6 +106,9 @@ func (suite *AnteTestSuite) SetupTest() { evmGenesis.Params.ChainConfig.GrayGlacierBlock = &maxInt evmGenesis.Params.ChainConfig.MergeNetsplitBlock = &maxInt evmGenesis.Params.ChainConfig.ShanghaiTime = &maxInt + evmGenesis.Params.ChainConfig.CancunTime = &maxInt + evmGenesis.Params.ChainConfig.PragueTime = &maxInt + evmGenesis.Params.ChainConfig.OsakaTime = &maxInt } if suite.evmParamsOption != nil { suite.evmParamsOption(&evmGenesis.Params) @@ -143,7 +149,10 @@ func (suite *AnteTestSuite) SetupTest() { DisabledAuthzMsgs: []string{ sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}), sdk.MsgTypeURL(&vestingtypes.MsgCreateVestingAccount{}), + sdk.MsgTypeURL(&vestingtypes.MsgCreatePermanentLockedAccount{}), + sdk.MsgTypeURL(&vestingtypes.MsgCreatePeriodicVestingAccount{}), }, + AnteCache: cache.NewAnteCache(0), }) suite.Require().NoError(err) @@ -557,7 +566,7 @@ func (suite *AnteTestSuite) RegisterAccount(pubKey cryptotypes.PubKey, balance * acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, sdk.AccAddress(pubKey.Address())) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - suite.app.EvmKeeper.SetBalance(suite.ctx, common.BytesToAddress(pubKey.Address()), balance, evmtypes.DefaultEVMDenom) + suite.app.EvmKeeper.SetBalance(suite.ctx, common.BytesToAddress(pubKey.Address()), *uint256.MustFromBig(balance), evmtypes.DefaultEVMDenom) } // createSignerBytes generates sign doc bytes using the given parameters diff --git a/app/app.go b/evmd/app.go similarity index 82% rename from app/app.go rename to evmd/app.go index df5399df18..5f7edf211d 100644 --- a/app/app.go +++ b/evmd/app.go @@ -13,30 +13,37 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package app +package evmd import ( "encoding/json" "fmt" - "io" "io/fs" "net/http" "os" "path/filepath" + r "runtime" + "slices" "sort" + cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" + "github.com/cosmos/cosmos-sdk/baseapp/txnrunner" + + "github.com/evmos/ethermint/ante/cache" + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" "cosmossdk.io/client/v2/autocli" "cosmossdk.io/core/appmodule" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" "github.com/cosmos/cosmos-sdk/server" + sigtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/gogoproto/proto" "github.com/gorilla/mux" "github.com/spf13/cast" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" abci "github.com/cometbft/cometbft/abci/types" tmos "github.com/cometbft/cometbft/libs/os" dbm "github.com/cosmos/cosmos-db" @@ -53,17 +60,12 @@ import ( "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + evmserver "github.com/evmos/ethermint/server" - storetypes "cosmossdk.io/store/types" - "cosmossdk.io/x/evidence" - evidencekeeper "cosmossdk.io/x/evidence/keeper" - evidencetypes "cosmossdk.io/x/evidence/types" - "cosmossdk.io/x/feegrant" - feegrantkeeper "cosmossdk.io/x/feegrant/keeper" - feegrantmodule "cosmossdk.io/x/feegrant/module" - "cosmossdk.io/x/upgrade" - upgradekeeper "cosmossdk.io/x/upgrade/keeper" - upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/cosmos/cosmos-sdk/contrib/x/crisis" + crisiskeeper "github.com/cosmos/cosmos-sdk/contrib/x/crisis/keeper" + crisistypes "github.com/cosmos/cosmos-sdk/contrib/x/crisis/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" mempool "github.com/cosmos/cosmos-sdk/types/mempool" "github.com/cosmos/cosmos-sdk/types/module" @@ -75,6 +77,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/posthandler" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + txmodule "github.com/cosmos/cosmos-sdk/x/auth/tx/config" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/auth/vesting" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" @@ -85,12 +88,15 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/consensus" - "github.com/cosmos/cosmos-sdk/x/crisis" - crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" distr "github.com/cosmos/cosmos-sdk/x/distribution" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/evidence" + evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" + feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" @@ -112,26 +118,24 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/ibc-go/modules/capability" - capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" - capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" - - "github.com/cosmos/ibc-go/v8/modules/apps/transfer" - ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper" - ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" - ibc "github.com/cosmos/ibc-go/v8/modules/core" - ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" //nolint:staticcheck - ibcconnectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" - porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" - ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported" - ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" - ibctm "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" + "github.com/cosmos/cosmos-sdk/x/upgrade" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/cosmos/ibc-go/v11/modules/apps/transfer" + ibctransferkeeper "github.com/cosmos/ibc-go/v11/modules/apps/transfer/keeper" + ibctransfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" + ibc "github.com/cosmos/ibc-go/v11/modules/core" + porttypes "github.com/cosmos/ibc-go/v11/modules/core/05-port/types" + ibcexported "github.com/cosmos/ibc-go/v11/modules/core/exported" + ibckeeper "github.com/cosmos/ibc-go/v11/modules/core/keeper" + ibctm "github.com/cosmos/ibc-go/v11/modules/light-clients/07-tendermint" "github.com/evmos/ethermint/client/docs" - "github.com/evmos/ethermint/app/ante" "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/ethereum/eip712" + "github.com/evmos/ethermint/evmd/ante" srvconfig "github.com/evmos/ethermint/server/config" srvflags "github.com/evmos/ethermint/server/flags" ethermint "github.com/evmos/ethermint/types" @@ -176,7 +180,8 @@ var ( stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, - evmtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, // used for secure addition and subtraction of balance using module account + // used for secure addition and subtraction of balance using module account + evmtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, } // module accounts that are allowed to receive tokens @@ -184,12 +189,10 @@ var ( ) var ( - _ runtime.AppI = (*EthermintApp)(nil) - _ servertypes.Application = (*EthermintApp)(nil) + _ runtime.AppI = (*EthermintApp)(nil) + _ evmserver.AppWithPendingTxListener = (*EthermintApp)(nil) ) -type GenesisState map[string]json.RawMessage - // var _ server.Application (*EthermintApp)(nil) // EthermintApp implements an extended ABCI application. It is an application @@ -209,34 +212,28 @@ type EthermintApp struct { pendingTxListeners []ante.PendingTxListener // keys to access the substores - keys map[string]*storetypes.KVStoreKey - tkeys map[string]*storetypes.TransientStoreKey - memKeys map[string]*storetypes.MemoryStoreKey - okeys map[string]*storetypes.ObjectStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + okeys map[string]*storetypes.ObjectStoreKey // keepers AccountKeeper authkeeper.AccountKeeper - BankKeeper bankkeeper.Keeper - CapabilityKeeper *capabilitykeeper.Keeper + BankKeeper bankkeeper.BaseKeeper StakingKeeper *stakingkeeper.Keeper SlashingKeeper slashingkeeper.Keeper MintKeeper mintkeeper.Keeper DistrKeeper distrkeeper.Keeper GovKeeper govkeeper.Keeper - CrisisKeeper crisiskeeper.Keeper - UpgradeKeeper upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper + CrisisKeeper *crisiskeeper.Keeper //nolint:staticcheck + UpgradeKeeper *upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper //nolint:staticcheck FeeGrantKeeper feegrantkeeper.Keeper AuthzKeeper authzkeeper.Keeper IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly EvidenceKeeper evidencekeeper.Keeper - TransferKeeper ibctransferkeeper.Keeper + TransferKeeper *ibctransferkeeper.Keeper ConsensusParamsKeeper consensusparamkeeper.Keeper - // make scoped keepers public for test purposes - ScopedIBCKeeper capabilitykeeper.ScopedKeeper - ScopedTransferKeeper capabilitykeeper.ScopedKeeper - // Ethermint keepers EvmKeeper *evmkeeper.Keeper FeeMarketKeeper feemarketkeeper.Keeper @@ -256,7 +253,6 @@ type EthermintApp struct { func NewEthermintApp( logger log.Logger, db dbm.DB, - traceStore io.Writer, loadLatest bool, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), @@ -272,9 +268,14 @@ func NewEthermintApp( // NOTE we use custom transaction decoder that supports the sdk.Tx interface instead of sdk.StdTx // Setup Mempool and Proposal Handlers baseAppOptions = append(baseAppOptions, func(app *baseapp.BaseApp) { + maxTxs := cast.ToInt(appOpts.Get(server.FlagMempoolMaxTxs)) + if maxTxs <= 0 { + maxTxs = srvconfig.DefaultMaxTxs + } mempool := mempool.NewPriorityMempool(mempool.PriorityNonceMempoolConfig[int64]{ TxPriority: mempool.NewDefaultTxPriority(), SignerExtractor: NewEthSignerExtractionAdapter(mempool.NewDefaultSignerExtractionAdapter()), + MaxTx: maxTxs, }) handler := baseapp.NewDefaultProposalHandler(mempool, app) @@ -289,7 +290,6 @@ func NewEthermintApp( txConfig.TxDecoder(), baseAppOptions..., ) - bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) bApp.SetTxEncoder(txConfig.TxEncoder()) @@ -300,7 +300,7 @@ func NewEthermintApp( authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, paramstypes.StoreKey, upgradetypes.StoreKey, - evidencetypes.StoreKey, capabilitytypes.StoreKey, consensusparamtypes.StoreKey, + evidencetypes.StoreKey, consensusparamtypes.StoreKey, feegrant.StoreKey, authzkeeper.StoreKey, crisistypes.StoreKey, // ibc keys ibcexported.StoreKey, ibctransfertypes.StoreKey, @@ -310,7 +310,6 @@ func NewEthermintApp( // Add the EVM transient store key tkeys := storetypes.NewTransientStoreKeys(paramstypes.TStoreKey) - memKeys := storetypes.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) okeys := storetypes.NewObjectStoreKeys(banktypes.ObjectStoreKey, evmtypes.ObjectStoreKey) // load state streaming if enabled @@ -328,22 +327,9 @@ func NewEthermintApp( invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, - memKeys: memKeys, okeys: okeys, } - executor := cast.ToString(appOpts.Get(srvflags.EVMBlockExecutor)) - switch executor { - case srvconfig.BlockExecutorBlockSTM: - sdk.SetAddrCacheEnabled(false) - workers := cast.ToInt(appOpts.Get(srvflags.EVMBlockSTMWorkers)) - app.SetTxExecutor(STMTxExecutor(app.GetStoreKeys(), workers)) - case "", srvconfig.BlockExecutorSequential: - app.SetTxExecutor(DefaultTxExecutor) - default: - panic(fmt.Errorf("unknown EVM block executor: %s", executor)) - } - // init params keeper and subspaces app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) @@ -359,16 +345,6 @@ func NewEthermintApp( ) bApp.SetParamStore(app.ConsensusParamsKeeper.ParamsStore) - // add capability keeper and ScopeToModule for ibc module - app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) - - scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName) - scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) - - // Applications that wish to enforce statically created ScopedKeepers should call `Seal` after creating - // their scoped modules in `NewApp` with `ScopeToModule` - app.CapabilityKeeper.Seal() - // use custom Ethermint account for contracts app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, runtime.NewKVStoreService(keys[authtypes.StoreKey]), @@ -378,15 +354,32 @@ func NewEthermintApp( sdk.GetConfig().GetBech32AccountAddrPrefix(), authAddr, ) - app.BankKeeper = bankkeeper.NewBaseKeeper( + + bk := bankkeeper.NewBaseKeeper( appCodec, runtime.NewKVStoreService(keys[banktypes.StoreKey]), - okeys[banktypes.ObjectStoreKey], app.AccountKeeper, app.BlockedAddrs(), authAddr, logger, ) + + app.BankKeeper = bk.WithObjStoreKey(okeys[banktypes.ObjectStoreKey]) + // optional: enable sign mode textual by overwriting the default tx config (after setting the bank keeper) + enabledSignModes := slices.Clone(authtx.DefaultSignModes) + enabledSignModes = append(enabledSignModes, sigtypes.SignMode_SIGN_MODE_TEXTUAL) + txConfigOpts := authtx.ConfigOptions{ + EnabledSignModes: enabledSignModes, + TextualCoinMetadataQueryFn: txmodule.NewBankKeeperCoinMetadataQueryFn(app.BankKeeper), + } + txConfig, err := authtx.NewTxConfigWithOptions( + appCodec, + txConfigOpts, + ) + if err != nil { + panic(err) + } + app.txConfig = txConfig app.StakingKeeper = stakingkeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), @@ -421,7 +414,7 @@ func NewEthermintApp( app.StakingKeeper, authAddr, ) - app.CrisisKeeper = *crisiskeeper.NewKeeper( + app.CrisisKeeper = crisiskeeper.NewKeeper( //nolint:staticcheck appCodec, runtime.NewKVStoreService(keys[crisistypes.StoreKey]), invCheckPeriod, @@ -446,7 +439,7 @@ func NewEthermintApp( homePath = DefaultNodeHome } // set the governance module account as the authority for conducting upgrades - app.UpgradeKeeper = *upgradekeeper.NewKeeper( + app.UpgradeKeeper = upgradekeeper.NewKeeper( skipUpgradeHeights, runtime.NewKVStoreService(keys[upgradetypes.StoreKey]), appCodec, @@ -471,11 +464,8 @@ func NewEthermintApp( // Create IBC Keeper app.IBCKeeper = ibckeeper.NewKeeper( - appCodec, keys[ibcexported.StoreKey], - app.GetSubspace(ibcexported.ModuleName), - app.StakingKeeper, + appCodec, runtime.NewKVStoreService(keys[ibcexported.StoreKey]), app.UpgradeKeeper, - scopedIBCKeeper, authAddr, ) @@ -499,6 +489,7 @@ func NewEthermintApp( tracer, evmSs, nil, + cast.ToUint64(appOpts.Get(server.FlagQueryGasLimit)), ) // register the proposal types @@ -513,8 +504,9 @@ func NewEthermintApp( govKeeper := govkeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[govtypes.StoreKey]), - app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.DistrKeeper, + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.MsgServiceRouter(), govConfig, authAddr, + govkeeper.NewDefaultCalculateVoteResultsAndVotingPower(app.StakingKeeper), ) // Set legacy router for backwards compatibility with gov v1beta1 @@ -528,9 +520,9 @@ func NewEthermintApp( // Create Transfer Keepers app.TransferKeeper = ibctransferkeeper.NewKeeper( - appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), - app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, app.IBCKeeper.PortKeeper, - app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, authAddr, + appCodec, app.AccountKeeper.AddressCodec(), runtime.NewKVStoreService(keys[ibctransfertypes.StoreKey]), + app.IBCKeeper.ChannelKeeper, app.MsgServiceRouter(), + app.AccountKeeper, app.BankKeeper, authAddr, ) transferModule := transfer.NewAppModule(app.TransferKeeper) transferIBCModule := transfer.NewIBCModule(app.TransferKeeper) @@ -555,8 +547,7 @@ func NewEthermintApp( // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment // we prefer to be more strict in what arguments the modules expect. - skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) - + skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) //nolint:staticcheck // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. app.ModuleManager = module.NewManager( @@ -568,8 +559,7 @@ func NewEthermintApp( auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), - capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), - crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), + crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), //nolint:staticcheck feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), @@ -584,9 +574,9 @@ func NewEthermintApp( ), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), - upgrade.NewAppModule(&app.UpgradeKeeper, app.AccountKeeper.AddressCodec()), + upgrade.NewAppModule(app.UpgradeKeeper, app.AccountKeeper.AddressCodec()), evidence.NewAppModule(app.EvidenceKeeper), - params.NewAppModule(app.ParamsKeeper), + params.NewAppModule(app.ParamsKeeper), //nolint:staticcheck authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), @@ -619,17 +609,14 @@ func NewEthermintApp( app.ModuleManager.SetOrderPreBlockers( upgradetypes.ModuleName, + authtypes.ModuleName, ) // During begin block slashing happens after distr.BeginBlocker so that // there is nothing left over in the validator fee pool, so as to keep the // CanWithdrawInvariant invariant. - // NOTE: upgrade module must go first to handle software upgrades. // NOTE: staking module is required if HistoricalEntries param > 0 - // NOTE: capability module's beginblocker must come before any modules using capabilities (e.g. IBC) app.ModuleManager.SetOrderBeginBlockers( - upgradetypes.ModuleName, - capabilitytypes.ModuleName, feemarkettypes.ModuleName, evmtypes.ModuleName, minttypes.ModuleName, @@ -640,7 +627,6 @@ func NewEthermintApp( ibcexported.ModuleName, // no-op modules ibctransfertypes.ModuleName, - authtypes.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, @@ -661,7 +647,6 @@ func NewEthermintApp( evmtypes.ModuleName, feemarkettypes.ModuleName, // no-op modules - capabilitytypes.ModuleName, ibcexported.ModuleName, ibctransfertypes.ModuleName, authtypes.ModuleName, @@ -681,12 +666,10 @@ func NewEthermintApp( // NOTE: The genutils module must occur after staking so that pools are // properly initialized with tokens from genesis accounts. // NOTE: The genutils module must also occur after auth so that it can access the params from auth. - // NOTE: Capability module must occur first so that it can initialize any capabilities // so that other modules that want to create or claim capabilities afterwards in InitChain // can do so safely. genesisModuleOrder := []string{ // SDK modules - capabilitytypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, @@ -709,7 +692,7 @@ func NewEthermintApp( upgradetypes.ModuleName, vestingtypes.ModuleName, consensusparamtypes.ModuleName, - // NOTE: crisis module must go at the end to check for invariants on each module + // NOTE: crisis module must go at the end to check invariants on each module crisistypes.ModuleName, } app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...) @@ -718,7 +701,7 @@ func NewEthermintApp( // Uncomment if you want to set a custom migration order here. // app.ModuleManager.SetOrderMigrations(custom order) - app.ModuleManager.RegisterInvariants(&app.CrisisKeeper) + app.ModuleManager.RegisterInvariants(app.CrisisKeeper) //nolint:staticcheck app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) if err := app.ModuleManager.RegisterServices(app.configurator); err != nil { panic(err) @@ -753,7 +736,6 @@ func NewEthermintApp( // initialize stores app.MountKVStores(keys) app.MountTransientStores(tkeys) - app.MountMemoryStores(memKeys) app.MountObjectStores(okeys) // initialize BaseApp @@ -761,32 +743,16 @@ func NewEthermintApp( app.SetPreBlocker(app.PreBlocker) app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) - app.setAnteHandler(txConfig, cast.ToUint64(appOpts.Get(srvflags.EVMMaxTxGasWanted))) - // In v0.46, the SDK introduces _postHandlers_. PostHandlers are like - // antehandlers, but are run _after_ the `runMsgs` execution. They are also - // defined as a chain, and have the same signature as antehandlers. - // - // In baseapp, postHandlers are run in the same store branch as `runMsgs`, - // meaning that both `runMsgs` and `postHandler` state will be committed if - // both are successful, and both will be reverted if any of the two fails. - // - // The SDK exposes a default empty postHandlers chain. - // - // Please note that changing any of the anteHandler or postHandler chain is - // likely to be a state-machine breaking change, which needs a coordinated - // upgrade. + app.setAnteHandler(txConfig, cast.ToInt(appOpts.Get(server.FlagMempoolMaxTxs))) app.setPostHandler() - // At startup, after all modules have been registered, check that all prot - // annotations are correct. + // Validate protobuf service method annotations after module registration. protoFiles, err := proto.MergedRegistry() if err != nil { panic(err) } err = msgservice.ValidateProtoAnnotations(protoFiles) if err != nil { - // Once we switch to using protoreflect-based antehandlers, we might - // want to panic here instead of logging a warning. fmt.Fprintln(os.Stderr, err.Error()) } if loadLatest { @@ -795,14 +761,43 @@ func NewEthermintApp( } } - app.ScopedIBCKeeper = scopedIBCKeeper - app.ScopedTransferKeeper = scopedTransferKeeper + executor := cast.ToString(appOpts.Get(srvflags.EVMBlockExecutor)) + switch executor { + case "", srvconfig.BlockExecutorSequential: + // SetBlockSTMTxRunner allows for arbitrary replacement of the tx runner for the BaseApp + // not just for block-stm execution. + app.SetBlockSTMTxRunner(NewPatchedTxRunner( + txnrunner.NewDefaultRunner(app.txConfig.TxDecoder()), + )) + case srvconfig.BlockExecutorBlockSTM: + sdk.SetAddrCacheEnabled(false) + workers := cast.ToInt(appOpts.Get(srvflags.EVMBlockSTMWorkers)) + if workers == 0 { + workers = min(r.GOMAXPROCS(0), r.NumCPU()) + } + preEstimate := cast.ToBool(appOpts.Get(srvflags.EVMBlockSTMPreEstimate)) + coinDenom := func(ms storetypes.MultiStore) string { + denom := app.EvmKeeper.GetParams(sdk.NewContext(ms, cmtproto.Header{}, false, log.NewNopLogger())).EvmDenom + return denom + } + app.SetBlockSTMTxRunner(NewPatchedTxRunner( + txnrunner.NewSTMRunner( + app.txConfig.TxDecoder(), + app.GetStoreKeys(), + workers, + preEstimate, + coinDenom, + ), + )) + default: + panic(fmt.Errorf("unknown EVM block executor: %s", executor)) + } return app } // use Ethermint's custom AnteHandler -func (app *EthermintApp) setAnteHandler(txConfig client.TxConfig, maxGasWanted uint64) { +func (app *EthermintApp) setAnteHandler(txConfig client.TxConfig, mempoolMaxTxs int) { anteHandler, err := ante.NewAnteHandler(ante.HandlerOptions{ AccountKeeper: app.AccountKeeper, BankKeeper: app.BankKeeper, @@ -812,14 +807,16 @@ func (app *EthermintApp) setAnteHandler(txConfig client.TxConfig, maxGasWanted u IBCKeeper: app.IBCKeeper, EvmKeeper: app.EvmKeeper, FeeMarketKeeper: app.FeeMarketKeeper, - MaxTxGasWanted: maxGasWanted, ExtensionOptionChecker: ethermint.HasDynamicFeeExtensionOption, DynamicFeeChecker: true, DisabledAuthzMsgs: []string{ sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}), sdk.MsgTypeURL(&vestingtypes.MsgCreateVestingAccount{}), + sdk.MsgTypeURL(&vestingtypes.MsgCreatePermanentLockedAccount{}), + sdk.MsgTypeURL(&vestingtypes.MsgCreatePeriodicVestingAccount{}), }, PendingTxListener: app.onPendingTx, + AnteCache: cache.NewAnteCache(mempoolMaxTxs), }) if err != nil { panic(err) @@ -928,7 +925,11 @@ func (app *EthermintApp) InterfaceRegistry() types.InterfaceRegistry { // DefaultGenesis returns a default genesis from the registered AppModuleBasic's. func (app *EthermintApp) DefaultGenesis() map[string]json.RawMessage { - return app.BasicModuleManager.DefaultGenesis(app.appCodec) + genesis := app.BasicModuleManager.DefaultGenesis(app.appCodec) + evmGenState := NewEVMGenesisState() + genesis[evmtypes.ModuleName] = app.appCodec.MustMarshalJSON(evmGenState) + + return genesis } func (app *EthermintApp) TxConfig() client.TxConfig { @@ -978,13 +979,6 @@ func (app *EthermintApp) GetTKey(storeKey string) *storetypes.TransientStoreKey return app.tkeys[storeKey] } -// GetMemKey returns the MemStoreKey for the provided mem key. -// -// NOTE: This is solely used for testing purposes. -func (app *EthermintApp) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { - return app.memKeys[storeKey] -} - // GetStoreKeys returns all the stored store keys. func (app *EthermintApp) GetStoreKeys() []storetypes.StoreKey { keys := make([]storetypes.StoreKey, 0, len(app.keys)) @@ -994,9 +988,6 @@ func (app *EthermintApp) GetStoreKeys() []storetypes.StoreKey { for _, key := range app.tkeys { keys = append(keys, key) } - for _, key := range app.memKeys { - keys = append(keys, key) - } for _, key := range app.okeys { keys = append(keys, key) } @@ -1021,6 +1012,7 @@ func (app *EthermintApp) SimulationManager() *module.SimulationManager { // API server. func (app *EthermintApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx + app.EvmKeeper.WithChainIDString(clientCtx.ChainID) // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. @@ -1039,21 +1031,23 @@ func (app *EthermintApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config. // RegisterTxService implements the Application.RegisterTxService method. func (app *EthermintApp) RegisterTxService(clientCtx client.Context) { - authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) + authtx.RegisterTxService(app.GRPCQueryRouter(), clientCtx, app.Simulate, app.interfaceRegistry) } // RegisterTendermintService implements the Application.RegisterTendermintService method. func (app *EthermintApp) RegisterTendermintService(clientCtx client.Context) { cmtservice.RegisterTendermintService( clientCtx, - app.BaseApp.GRPCQueryRouter(), + app.GRPCQueryRouter(), app.interfaceRegistry, app.Query, ) } func (app *EthermintApp) RegisterNodeService(clientCtx client.Context, cfg config.Config) { - node.RegisterNodeService(clientCtx, app.GRPCQueryRouter(), cfg) + node.RegisterNodeService(clientCtx, app.GRPCQueryRouter(), cfg, func() int64 { + return app.CommitMultiStore().EarliestVersion() + }) } // GetStoreKey is used by unit test @@ -1066,10 +1060,6 @@ func (app *EthermintApp) GetStoreKey(name string) storetypes.StoreKey { if ok { return tkey } - mkey, ok := app.memKeys[name] - if ok { - return mkey - } return app.okeys[name] } @@ -1099,15 +1089,14 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces +// +//nolint:staticcheck func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) // register the key tables for legacy param subspaces - keyTable := ibcclienttypes.ParamKeyTable() - keyTable.RegisterParamSet(&ibcconnectiontypes.Params{}) - paramsKeeper.Subspace(ibcexported.ModuleName).WithKeyTable(keyTable) - paramsKeeper.Subspace(ibctransfertypes.ModuleName).WithKeyTable(ibctransfertypes.ParamKeyTable()) + paramsKeeper.Subspace(crisistypes.ModuleName) // ethermint subspaces - paramsKeeper.Subspace(evmtypes.ModuleName).WithKeyTable(v0evmtypes.ParamKeyTable()) //nolint: staticcheck + paramsKeeper.Subspace(evmtypes.ModuleName).WithKeyTable(v0evmtypes.ParamKeyTable()) //nolint:staticcheck paramsKeeper.Subspace(feemarkettypes.ModuleName).WithKeyTable(feemarkettypes.ParamKeyTable()) return paramsKeeper } diff --git a/evmd/app_test.go b/evmd/app_test.go new file mode 100644 index 0000000000..92991c0e78 --- /dev/null +++ b/evmd/app_test.go @@ -0,0 +1,72 @@ +package evmd_test + +import ( + "os" + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/evmos/ethermint/encoding" + "github.com/evmos/ethermint/evmd" + "github.com/evmos/ethermint/testutil" + "github.com/stretchr/testify/require" + + "cosmossdk.io/log/v2" + dbm "github.com/cosmos/cosmos-db" + + "github.com/cosmos/cosmos-sdk/baseapp" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" +) + +func TestEthermintAppExport(t *testing.T) { + db := dbm.NewMemDB() + ethApp := testutil.SetupWithDB(false, nil, db) + ethApp.Commit() + + // Making a new app object with the db, so that initchain hasn't been called + ethApp2 := evmd.NewEthermintApp( + log.NewLogger(os.Stdout), + db, + true, + simtestutil.NewAppOptionsWithFlagHome(evmd.DefaultNodeHome), + baseapp.SetChainID(testutil.ChainID), + ) + _, err := ethApp2.ExportAppStateAndValidators(false, []string{}, []string{}) + require.NoError(t, err, "ExportAppStateAndValidators should not have an error") + + ethApp3 := evmd.NewEthermintApp( + log.NewLogger(os.Stdout), + db, + true, + simtestutil.NewAppOptionsWithFlagHome(evmd.DefaultNodeHome), + baseapp.SetChainID(testutil.ChainID), + ) + + // Test for zero height + if _, err := ethApp3.ExportAppStateAndValidators(true, []string{}, []string{}); err != nil { + t.Fatal(err) + } +} + +func TestRegisterTxService(t *testing.T) { + db := dbm.NewMemDB() + ethApp := testutil.SetupWithDB(false, nil, db) + + encodingConfig := encoding.MakeConfig() + clientCtx := client.Context{}.WithTxConfig(encodingConfig.TxConfig) + + ethApp.RegisterTxService(clientCtx) + + ethApp.RegisterTendermintService(clientCtx) + +} + +func TestRegisterTendermintService(t *testing.T) { + db := dbm.NewMemDB() + ethApp := testutil.SetupWithDB(false, nil, db) + + encodingConfig := encoding.MakeConfig() + clientCtx := client.Context{}.WithTxConfig(encodingConfig.TxConfig) + + ethApp.RegisterTendermintService(clientCtx) + +} diff --git a/app/benchmark_test.go b/evmd/benchmark_test.go similarity index 75% rename from app/benchmark_test.go rename to evmd/benchmark_test.go index 07b6d5bac1..82f96b40be 100644 --- a/app/benchmark_test.go +++ b/evmd/benchmark_test.go @@ -1,27 +1,26 @@ -package app_test +package evmd_test import ( "encoding/json" "io" "testing" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" abci "github.com/cometbft/cometbft/abci/types" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/testutil" ) func BenchmarkEthermintApp_ExportAppStateAndValidators(b *testing.B) { db := dbm.NewMemDB() - app1 := app.NewEthermintApp( + app1 := evmd.NewEthermintApp( log.NewLogger(io.Discard), db, - nil, true, - simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), + simtestutil.NewAppOptionsWithFlagHome(evmd.DefaultNodeHome), baseapp.SetChainID(testutil.ChainID), ) @@ -44,13 +43,12 @@ func BenchmarkEthermintApp_ExportAppStateAndValidators(b *testing.B) { b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { - // Making a new app object with the db, so that initchain hasn't been called - app2 := app.NewEthermintApp( + // Making a new evmd object with the db, so that initchain hasn't been called + app2 := evmd.NewEthermintApp( log.NewLogger(io.Discard), db, - nil, true, - simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), + simtestutil.NewAppOptionsWithFlagHome(evmd.DefaultNodeHome), baseapp.SetChainID(testutil.ChainID), ) if _, err := app2.ExportAppStateAndValidators(false, []string{}, []string{}); err != nil { diff --git a/evmd/executor.go b/evmd/executor.go new file mode 100644 index 0000000000..f5e2e9f3e4 --- /dev/null +++ b/evmd/executor.go @@ -0,0 +1,39 @@ +package evmd + +import ( + "context" + + abci "github.com/cometbft/cometbft/abci/types" + + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +// PatchedTxRunner wraps any sdk.TxRunner and applies PatchTxResponses to the +// results, which fills in the EVM tx index and log indexes. +type PatchedTxRunner struct { + inner sdk.TxRunner +} + +var _ sdk.TxRunner = (*PatchedTxRunner)(nil) + +// NewPatchedTxRunner creates a PatchedTxRunner wrapping the given runner. +func NewPatchedTxRunner(inner sdk.TxRunner) *PatchedTxRunner { + return &PatchedTxRunner{inner: inner} +} + +func (r *PatchedTxRunner) Run( + ctx context.Context, + ms storetypes.MultiStore, + txs [][]byte, + deliverTx sdk.DeliverTxFunc, +) ([]*abci.ExecTxResult, error) { + results, err := r.inner.Run(ctx, ms, txs, deliverTx) + if err != nil { + return nil, err + } + return evmtypes.PatchTxResponses(results), nil +} diff --git a/app/export.go b/evmd/export.go similarity index 96% rename from app/export.go rename to evmd/export.go index 08757cc758..916f11089c 100644 --- a/app/export.go +++ b/evmd/export.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package app +package evmd import ( "encoding/json" @@ -22,7 +22,7 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" @@ -66,7 +66,7 @@ func (app *EthermintApp) ExportAppStateAndValidators( AppState: appState, Validators: validators, Height: height, - ConsensusParams: app.BaseApp.GetConsensusParams(ctx), + ConsensusParams: app.GetConsensusParams(ctx), }, nil } @@ -74,12 +74,9 @@ func (app *EthermintApp) ExportAppStateAndValidators( // NOTE zero height genesis is a temporary feature which will be deprecated // in favor of export at a block height func (app *EthermintApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) error { - applyAllowedAddrs := false + applyAllowedAddrs := len(jailAllowedAddrs) > 0 // check if there is a allowed address list - if len(jailAllowedAddrs) > 0 { - applyAllowedAddrs = true - } allowedAddrsMap := make(map[string]bool) @@ -91,7 +88,7 @@ func (app *EthermintApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAd allowedAddrsMap[addr] = true } - /* Just to be safe, assert the invariants on current state. */ + /* Just to be safe, assert invariants on current state. */ app.CrisisKeeper.AssertInvariants(ctx) /* Handle fee distribution state. */ diff --git a/evmd/genesis.go b/evmd/genesis.go new file mode 100644 index 0000000000..edf405fc88 --- /dev/null +++ b/evmd/genesis.go @@ -0,0 +1,27 @@ +package evmd + +import ( + "encoding/json" + + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +// GenesisState of the blockchain is represented here as a map of raw json +// messages key'd by an identifier string. +// The identifier is used to determine which module genesis information belongs +// to so it may be appropriately routed during init chain. +// Within this application default genesis information is retrieved from +// the ModuleBasicManager which populates json from each BasicModule +// object provided to it during init. +type GenesisState map[string]json.RawMessage + +// NewEVMGenesisState returns the default genesis state for the EVM module. +// +// NOTE: for the example chain implementation we need to set the default EVM denomination, +// enable ALL precompiles, and include default preinstalls. +func NewEVMGenesisState() *evmtypes.GenesisState { + evmGenState := evmtypes.DefaultGenesisState() + evmGenState.Preinstalls = evmtypes.DefaultPreinstalls + + return evmGenState +} diff --git a/app/signer.go b/evmd/signer.go similarity index 99% rename from app/signer.go rename to evmd/signer.go index c55b1a84a3..05902c93b1 100644 --- a/app/signer.go +++ b/evmd/signer.go @@ -1,4 +1,4 @@ -package app +package evmd import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/app/simulation_test.go b/evmd/simulation_test.go similarity index 94% rename from app/simulation_test.go rename to evmd/simulation_test.go index 9ff347d168..9f045e1d6d 100644 --- a/app/simulation_test.go +++ b/evmd/simulation_test.go @@ -1,4 +1,4 @@ -package app_test +package evmd_test // TODO: COsmos SDK fix for the simulator issue for custom keys import ( @@ -10,6 +10,8 @@ import ( "strings" "testing" + "github.com/evmos/ethermint/ante/cache" + "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/baseapp" @@ -17,10 +19,10 @@ import ( simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli" - "cosmossdk.io/log" - "cosmossdk.io/store" - storetypes "cosmossdk.io/store/types" - evidencetypes "cosmossdk.io/x/evidence/types" + "cosmossdk.io/log/v2" + "github.com/cosmos/cosmos-sdk/store/v2" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" abci "github.com/cometbft/cometbft/abci/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" dbm "github.com/cosmos/cosmos-db" @@ -36,11 +38,10 @@ import ( "github.com/cosmos/cosmos-sdk/x/simulation" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" - ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" - ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported" - "github.com/evmos/ethermint/app" - "github.com/evmos/ethermint/app/ante" + ibctransfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" + ibcexported "github.com/cosmos/ibc-go/v11/modules/core/exported" + "github.com/evmos/ethermint/evmd" + "github.com/evmos/ethermint/evmd/ante" "github.com/evmos/ethermint/testutil" ) @@ -67,11 +68,11 @@ func fauxMerkleModeOpt(bapp *baseapp.BaseApp) { } // NewSimApp disable feemarket on native tx, otherwise the cosmos-sdk simulation tests will fail. -func NewSimApp(logger log.Logger, db dbm.DB, baseAppOptions ...func(*baseapp.BaseApp)) (*app.EthermintApp, error) { +func NewSimApp(logger log.Logger, db dbm.DB, baseAppOptions ...func(*baseapp.BaseApp)) (*evmd.EthermintApp, error) { appOptions := make(simtestutil.AppOptionsMap, 0) - appOptions[flags.FlagHome] = app.DefaultNodeHome + appOptions[flags.FlagHome] = evmd.DefaultNodeHome appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue - app := app.NewEthermintApp(logger, db, nil, false, appOptions, baseAppOptions...) + app := evmd.NewEthermintApp(logger, db, false, appOptions, baseAppOptions...) // disable feemarket on native tx anteHandler, err := ante.NewAnteHandler(ante.HandlerOptions{ AccountKeeper: app.AccountKeeper, @@ -82,7 +83,7 @@ func NewSimApp(logger log.Logger, db dbm.DB, baseAppOptions ...func(*baseapp.Bas IBCKeeper: app.IBCKeeper, EvmKeeper: app.EvmKeeper, FeeMarketKeeper: app.FeeMarketKeeper, - MaxTxGasWanted: 0, + AnteCache: cache.NewAnteCache(0), }) if err != nil { return nil, err @@ -205,7 +206,7 @@ func TestAppImportExport(t *testing.T) { require.Equal(t, appName, newApp.Name()) require.NoError(t, err) - var genesisState app.GenesisState + var genesisState evmd.GenesisState err = json.Unmarshal(exported.AppState, &genesisState) require.NoError(t, err) @@ -236,14 +237,13 @@ func TestAppImportExport(t *testing.T) { stakingtypes.HistoricalInfoKey, stakingtypes.UnbondingIDKey, stakingtypes.UnbondingIndexKey, stakingtypes.UnbondingTypeKey, stakingtypes.ValidatorUpdatesKey, }, }, // ordering may change but it doesn't matter - {simApp.GetKey(slashingtypes.StoreKey), newApp.GetKey(slashingtypes.StoreKey), [][]byte{}}, + {simApp.GetKey(slashingtypes.StoreKey), newApp.GetKey(slashingtypes.StoreKey), [][]byte{slashingtypes.ValidatorMissedBlockBitmapKeyPrefix}}, {simApp.GetKey(minttypes.StoreKey), newApp.GetKey(minttypes.StoreKey), [][]byte{}}, {simApp.GetKey(distrtypes.StoreKey), newApp.GetKey(distrtypes.StoreKey), [][]byte{}}, {simApp.GetKey(banktypes.StoreKey), newApp.GetKey(banktypes.StoreKey), [][]byte{banktypes.BalancesPrefix}}, {simApp.GetKey(paramtypes.StoreKey), newApp.GetKey(paramtypes.StoreKey), [][]byte{}}, {simApp.GetKey(govtypes.StoreKey), newApp.GetKey(govtypes.StoreKey), [][]byte{}}, {simApp.GetKey(evidencetypes.StoreKey), newApp.GetKey(evidencetypes.StoreKey), [][]byte{}}, - {simApp.GetKey(capabilitytypes.StoreKey), newApp.GetKey(capabilitytypes.StoreKey), [][]byte{}}, {simApp.GetKey(authzkeeper.StoreKey), newApp.GetKey(authzkeeper.StoreKey), [][]byte{authzkeeper.GrantKey, authzkeeper.GrantQueuePrefix}}, {simApp.GetKey(ibcexported.StoreKey), newApp.GetKey(ibcexported.StoreKey), [][]byte{}}, {simApp.GetKey(ibctransfertypes.StoreKey), newApp.GetKey(ibctransfertypes.StoreKey), [][]byte{}}, diff --git a/app/upgrades.go b/evmd/upgrades.go similarity index 70% rename from app/upgrades.go rename to evmd/upgrades.go index f6289b9e20..8a87701b04 100644 --- a/app/upgrades.go +++ b/evmd/upgrades.go @@ -13,20 +13,25 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package app +package evmd import ( "context" - upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) func (app *EthermintApp) RegisterUpgradeHandlers() { - planName := "sdk50" - app.UpgradeKeeper.SetUpgradeHandler(planName, + app.UpgradeKeeper.SetUpgradeHandler("sdk53", func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - return app.ModuleManager.RunMigrations(ctx, app.Configurator(), fromVM) + return app.ModuleManager.RunMigrations(ctx, app.configurator, fromVM) + }, + ) + + app.UpgradeKeeper.SetUpgradeHandler("sdk54", + func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return app.ModuleManager.RunMigrations(ctx, app.configurator, fromVM) }, ) } diff --git a/flake.lock b/flake.lock index d316e6910e..ce1a5cd149 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -18,29 +18,6 @@ "type": "github" } }, - "gomod2nix": { - "inputs": { - "flake-utils": [ - "flake-utils" - ], - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1710154385, - "narHash": "sha256-4c3zQ2YY4BZOufaBJB4v9VBBeN2dH7iVdoJw8SDNCfI=", - "owner": "nix-community", - "repo": "gomod2nix", - "rev": "872b63ddd28f318489c929d25f1f0a3c6039c971", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "gomod2nix", - "type": "github" - } - }, "nix-github-actions": { "inputs": { "nixpkgs": [ @@ -49,11 +26,11 @@ ] }, "locked": { - "lastModified": 1703863825, - "narHash": "sha256-rXwqjtwiGKJheXB43ybM8NwWB8rO2dSRrEqes0S7F5Y=", + "lastModified": 1729742964, + "narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=", "owner": "nix-community", "repo": "nix-github-actions", - "rev": "5163432afc817cf8bd1f031418d1869e4c9d5547", + "rev": "e04df33f62cdcf93d73e9a04142464753a16db67", "type": "github" }, "original": { @@ -64,17 +41,17 @@ }, "nixpkgs": { "locked": { - "lastModified": 1710283812, - "narHash": "sha256-F+s4//HwNEXtgxZ6PLoe5khDTmUukPYbjCvx7us2vww=", + "lastModified": 1775811116, + "narHash": "sha256-t+HZK42pB6N+i5RGbuy7Xluez/VvWbembBdvzsc23Ss=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73bf415737ceb66a6298f806f600cfe4dccd0a41", + "rev": "54170c54449ea4d6725efd30d719c5e505f1c10e", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", + "rev": "54170c54449ea4d6725efd30d719c5e505f1c10e", "type": "github" } }, @@ -91,11 +68,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1708589824, - "narHash": "sha256-2GOiFTkvs5MtVF65sC78KNVxQSmsxtk0WmV1wJ9V2ck=", + "lastModified": 1736884309, + "narHash": "sha256-eiCqmKl0BIRiYk5/ZhZozwn4/7Km9CWTbc15Cv+VX5k=", "owner": "nix-community", "repo": "poetry2nix", - "rev": "3c92540611f42d3fb2d0d084a6c694cd6544b609", + "rev": "75d0515332b7ca269f6d7abfd2c44c47a7cbca7b", "type": "github" }, "original": { @@ -107,7 +84,6 @@ "root": { "inputs": { "flake-utils": "flake-utils", - "gomod2nix": "gomod2nix", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix" } @@ -137,8 +113,9 @@ "type": "github" }, "original": { - "id": "systems", - "type": "indirect" + "owner": "nix-systems", + "repo": "default", + "type": "github" } }, "treefmt-nix": { @@ -149,11 +126,11 @@ ] }, "locked": { - "lastModified": 1708335038, - "narHash": "sha256-ETLZNFBVCabo7lJrpjD6cAbnE11eDOjaQnznmg/6hAE=", + "lastModified": 1730120726, + "narHash": "sha256-LqHYIxMrl/1p3/kvm2ir925tZ8DkI0KA10djk8wecSk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "e504621290a1fd896631ddbc5e9c16f4366c9f65", + "rev": "9ef337e492a5555d8e17a51c911ff1f02635be15", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 0d86cd34d5..467fd112db 100644 --- a/flake.nix +++ b/flake.nix @@ -1,12 +1,7 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/54170c54449ea4d6725efd30d719c5e505f1c10e"; flake-utils.url = "github:numtide/flake-utils"; - gomod2nix = { - url = "github:nix-community/gomod2nix"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.flake-utils.follows = "flake-utils"; - }; poetry2nix = { url = "github:nix-community/poetry2nix"; inputs.nixpkgs.follows = "nixpkgs"; @@ -14,7 +9,13 @@ }; }; - outputs = { self, nixpkgs, gomod2nix, flake-utils, poetry2nix }: + outputs = + { + self, + nixpkgs, + flake-utils, + poetry2nix, + }: let rev = self.shortRev or "dirty"; mkApp = drv: { @@ -22,44 +23,64 @@ program = "${drv}/bin/${drv.meta.mainProgram}"; }; in - (flake-utils.lib.eachDefaultSystem - (system: - let - pkgs = import nixpkgs { - inherit system; - overlays = [ - gomod2nix.overlays.default - poetry2nix.overlays.default - self.overlay + (flake-utils.lib.eachDefaultSystem ( + system: + let + # Import niv sources to maintain single source of truth for dependencies + sources = import ./nix/sources.nix; + + # Custom gomod2nix overlay that avoids darwin.apple_sdk_11_0 reference + # Uses the same gomod2nix version as niv to prevent drift between flake and niv builds + gomodOverlay = + final: prev: + let + gomodSrc = sources.gomod2nix; + callPackage = final.callPackage; + gomodBuilder = callPackage "${gomodSrc}/builder" { }; + in + { + inherit (gomodBuilder) buildGoApplication mkGoEnv mkVendorEnv; + gomod2nix = (callPackage "${gomodSrc}/default.nix" { }).overrideAttrs (_: { + modRoot = "."; + }); + }; + + pkgs = import nixpkgs { + inherit system; + overlays = [ + gomodOverlay + poetry2nix.overlays.default + ] + ++ self.overlays.default; + }; + in + rec { + packages.default = pkgs.callPackage ./. { inherit rev; }; + apps.default = mkApp packages.default; + devShells = { + default = pkgs.mkShell { + buildInputs = [ + packages.default.go + pkgs.gomod2nix ]; - config = { }; }; - in - rec { - packages.default = pkgs.callPackage ./. { inherit rev; }; - apps.default = mkApp packages.default; - devShells = { - default = pkgs.mkShell { - buildInputs = [ - packages.default.go - pkgs.gomod2nix - ]; - }; - full = pkgs.mkShell { - buildInputs = [ - packages.default.go - pkgs.gomod2nix - pkgs.test-env - ]; - }; + full = pkgs.mkShell { + buildInputs = [ + packages.default.go + pkgs.gomod2nix + pkgs.test-env + ]; }; - legacyPackages = pkgs; - } - ) - ) // { - overlay = final: super: { - go = super.go_1_22; - test-env = final.callPackage ./nix/testenv.nix { }; - }; + }; + legacyPackages = pkgs; + } + )) + // { + overlays.default = [ + (import ./nix/build_overlay.nix) + (final: super: { + test-env = final.callPackage ./nix/testenv.nix { }; + }) + ]; }; } diff --git a/go.mod b/go.mod index 9c2283c1ae..5425c1c922 100644 --- a/go.mod +++ b/go.mod @@ -1,263 +1,389 @@ module github.com/evmos/ethermint -go 1.21 - -toolchain go1.21.5 +go 1.25.9 require ( - cosmossdk.io/api v0.7.5 - cosmossdk.io/client/v2 v2.0.0-beta.1 - cosmossdk.io/core v0.11.0 - cosmossdk.io/errors v1.0.1 - cosmossdk.io/log v1.3.1 - cosmossdk.io/math v1.3.0 - cosmossdk.io/store v1.1.0 - cosmossdk.io/tools/confix v0.1.1 - cosmossdk.io/x/evidence v0.1.0 - cosmossdk.io/x/feegrant v0.1.0 - cosmossdk.io/x/tx v0.13.3 - cosmossdk.io/x/upgrade v0.1.1 - github.com/btcsuite/btcd v0.23.4 - github.com/btcsuite/btcd/btcutil v1.1.3 - github.com/cometbft/cometbft v0.38.7 - github.com/cosmos/cosmos-db v1.0.2 + cosmossdk.io/api v1.0.0 + cosmossdk.io/client/v2 v2.11.0 + cosmossdk.io/core v1.1.0 + cosmossdk.io/errors v1.1.0 + cosmossdk.io/log/v2 v2.1.0 + cosmossdk.io/math v1.5.3 + cosmossdk.io/tools/confix v0.1.2 + github.com/btcsuite/btcd v0.25.0 + github.com/btcsuite/btcd/btcutil v1.1.6 + github.com/cometbft/cometbft v0.39.3 + github.com/cosmos/cosmos-db v1.1.3 github.com/cosmos/cosmos-proto v1.0.0-beta.5 - github.com/cosmos/cosmos-sdk v0.50.6 + github.com/cosmos/cosmos-sdk v0.54.3 + github.com/cosmos/cosmos-sdk/store/v2 v2.0.0 github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/gogoproto v1.4.12 - github.com/cosmos/ibc-go/modules/capability v1.0.0 - github.com/cosmos/ibc-go/v8 v8.1.0 - github.com/cosmos/rosetta v0.50.3-1 - github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde + github.com/cosmos/gogoproto v1.7.2 + github.com/cosmos/ibc-go/v11 v11.0.0 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc - github.com/ethereum/go-ethereum v1.10.26 + github.com/ethereum/go-ethereum v1.16.9 github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 - github.com/gorilla/websocket v1.5.1 + github.com/gorilla/websocket v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-metrics v0.5.3 + github.com/hashicorp/go-metrics v0.5.4 + github.com/holiman/uint256 v1.3.2 github.com/improbable-eng/grpc-web v0.15.0 - github.com/onsi/ginkgo/v2 v2.7.0 - github.com/onsi/gomega v1.26.0 + github.com/onsi/ginkgo/v2 v2.28.0 + github.com/onsi/gomega v1.39.1 github.com/pkg/errors v0.9.1 - github.com/rs/cors v1.10.1 - github.com/spf13/cast v1.6.0 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.18.2 - github.com/status-im/keycard-go v0.2.0 - github.com/stretchr/testify v1.9.0 - github.com/tidwall/gjson v1.14.4 + github.com/rs/cors v1.11.1 + github.com/rs/zerolog v1.35.0 + github.com/spf13/cast v1.10.0 + github.com/spf13/cobra v1.10.2 + github.com/spf13/viper v1.21.0 + github.com/status-im/keycard-go v0.3.3 + github.com/stretchr/testify v1.11.1 + github.com/tidwall/gjson v1.18.0 github.com/tidwall/sjson v1.2.5 github.com/tyler-smith/go-bip39 v1.1.0 - golang.org/x/net v0.24.0 - golang.org/x/sync v0.7.0 - golang.org/x/text v0.14.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de - google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.33.0 - sigs.k8s.io/yaml v1.4.0 + golang.org/x/net v0.55.0 + golang.org/x/sync v0.20.0 + golang.org/x/text v0.37.0 + google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 + google.golang.org/grpc v1.80.0 + google.golang.org/protobuf v1.36.11 + sigs.k8s.io/yaml v1.6.0 ) require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.24.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/storage v1.36.0 // indirect - cosmossdk.io/collections v0.4.0 // indirect - cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - filippo.io/edwards25519 v1.1.0 // indirect + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.20.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.9.0 // indirect + cloud.google.com/go/monitoring v1.27.0 // indirect + cloud.google.com/go/storage v1.62.1 // indirect + cosmossdk.io/collections v1.4.0 // indirect + cosmossdk.io/depinject v1.2.1 // indirect + cosmossdk.io/schema v1.1.0 // indirect + filippo.io/edwards25519 v1.2.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/DataDog/datadog-go v4.8.3+incompatible // indirect - github.com/DataDog/zstd v1.5.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect - github.com/VictoriaMetrics/fastcache v1.6.0 // indirect + github.com/DataDog/zstd v1.5.7 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect + github.com/Masterminds/semver/v3 v3.5.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20260116142910-60249400e523 // indirect + github.com/RoaringBitmap/roaring/v2 v2.18.0 // indirect + github.com/VictoriaMetrics/fastcache v1.13.0 // indirect github.com/allegro/bigcache v1.2.1 // indirect - github.com/aws/aws-sdk-go v1.44.224 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.5 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.14 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.14 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect + github.com/aws/smithy-go v1.24.3 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect - github.com/bits-and-blooms/bitset v1.8.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash v1.1.0 // indirect + github.com/bgentry/speakeasy v0.2.0 // indirect + github.com/bits-and-blooms/bitset v1.24.4 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.5 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect + github.com/bytedance/gopkg v0.1.4 // indirect + github.com/bytedance/sonic v1.15.0 // indirect + github.com/bytedance/sonic/loader v0.5.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect - github.com/cometbft/cometbft-db v0.9.1 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect + github.com/cockroachdb/errors v1.13.0 // indirect + github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect + github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.8 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb // indirect + github.com/cometbft/cometbft-db v1.0.4 // indirect + github.com/consensys/gnark-crypto v0.18.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/btree v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/iavl v1.1.2 // indirect - github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect - github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect - github.com/creachadair/atomicfile v0.3.1 // indirect - github.com/creachadair/tomledit v0.0.24 // indirect - github.com/danieljoos/wincred v1.2.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/cosmos/iavl v1.2.8 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/ledger-cosmos-go v1.0.0 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/creachadair/atomicfile v0.4.0 // indirect + github.com/creachadair/tomledit v0.0.29 // indirect + github.com/danieljoos/wincred v1.2.3 // indirect + github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 // indirect + github.com/desertbit/timer v1.0.1 // indirect + github.com/dgraph-io/badger/v4 v4.9.1 // indirect + github.com/dgraph-io/ristretto/v2 v2.4.0 // indirect github.com/dlclark/regexp2 v1.7.0 // indirect - github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7 // indirect + github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3 // indirect + github.com/dunglas/httpsfv v1.1.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect - github.com/edsrzf/mmap-go v1.0.0 // indirect - github.com/emicklei/dot v1.6.1 // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/dvsekhvalnov/jose2go v1.8.0 // indirect + github.com/ebitengine/purego v0.10.0 // indirect + github.com/emicklei/dot v1.11.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect + github.com/ethereum/go-verkle v0.2.2 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect - github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/ferranbt/fastssz v0.1.4 // indirect + github.com/flynn/noise v1.1.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/getsentry/sentry-go v0.46.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-kit/kit v0.13.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logfmt/logfmt v0.6.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect - github.com/go-stack/stack v1.8.1 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gofrs/flock v0.8.1 // indirect + github.com/gofrs/flock v0.12.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect - github.com/golang/glog v1.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.7 // indirect + github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.3 // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-plugin v1.6.0 // indirect - github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/go-plugin v1.7.0 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect - github.com/huandu/skiplist v1.2.0 // indirect - github.com/huin/goupnp v1.0.3 // indirect + github.com/huandu/skiplist v1.2.1 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ipfs/go-cid v0.5.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/koron/go-ssdp v0.0.6 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/lib/pq v1.12.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.8.14 // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/libp2p/go-flow-metrics v0.2.0 // indirect + github.com/libp2p/go-libp2p v0.47.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect + github.com/libp2p/go-msgio v0.3.0 // indirect + github.com/libp2p/go-netroute v0.3.0 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + github.com/libp2p/go-yamux/v5 v5.0.1 // indirect + github.com/linxGnu/grocksdb v1.10.7 // indirect + github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e // indirect github.com/manifoldco/promptui v0.9.0 // 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.9 // indirect - github.com/minio/highwayhash v1.0.2 // indirect + github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mdp/qrterminal/v3 v3.2.1 // indirect + github.com/miekg/dns v1.1.66 // 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.4 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mschoch/smat v0.2.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect - github.com/oklog/run v1.1.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.16.1 // indirect + github.com/multiformats/go-multiaddr-dns v0.4.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.1 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-multistream v0.6.1 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729 // indirect + github.com/oklog/run v1.2.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pelletier/go-toml/v2 v2.1.1 // indirect - github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 // indirect + github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/dtls/v3 v3.1.2 // indirect + github.com/pion/ice/v4 v4.0.10 // indirect + github.com/pion/interceptor v0.1.40 // indirect + github.com/pion/logging v0.2.4 // indirect + github.com/pion/mdns/v2 v2.0.7 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.15 // indirect + github.com/pion/rtp v1.8.19 // indirect + github.com/pion/sctp v1.8.39 // indirect + github.com/pion/sdp/v3 v3.0.13 // indirect + github.com/pion/srtp/v3 v3.0.6 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/stun/v2 v2.0.0 // indirect + github.com/pion/stun/v3 v3.0.0 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/transport/v4 v4.0.1 // indirect + github.com/pion/turn/v4 v4.0.2 // indirect + github.com/pion/webrtc/v4 v4.1.2 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.52.2 // indirect - github.com/prometheus/procfs v0.13.0 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/rs/zerolog v1.32.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect + github.com/quic-go/qpack v0.6.0 // indirect + github.com/quic-go/quic-go v0.59.0 // indirect + github.com/quic-go/webtransport-go v0.10.0 // indirect + github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/sasha-s/go-deadlock v0.3.7 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shirou/gopsutil/v4 v4.26.4 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tidwall/btree v1.7.0 // indirect + github.com/tidwall/btree v1.8.1 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect - github.com/ulikunitz/xz v0.5.11 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect + github.com/wlynxg/anet v0.0.5 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + github.com/zondax/golem v0.27.0 // indirect github.com/zondax/hid v0.9.2 // indirect - github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.8 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.22.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect + github.com/zondax/ledger-go v1.0.1 // indirect + go.etcd.io/bbolt v1.4.3 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/bridges/otelslog v0.18.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/host v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/runtime v0.68.0 // indirect + go.opentelemetry.io/contrib/otelconf v0.23.0 // indirect + go.opentelemetry.io/contrib/propagators/autoprop v0.68.0 // indirect + go.opentelemetry.io/contrib/propagators/aws v1.43.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.43.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.43.0 // indirect + go.opentelemetry.io/contrib/propagators/ot v1.43.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.19.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.43.0 // indirect + go.opentelemetry.io/otel/log v0.19.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.19.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.uber.org/dig v1.19.0 // indirect + go.uber.org/fx v1.24.0 // indirect + go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect - golang.org/x/mod v0.17.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/time v0.5.0 // indirect - golang.org/x/tools v0.20.0 // indirect - google.golang.org/api v0.162.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/rpc v0.0.0-20240401170217-c3f982113cda // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + go.uber.org/zap v1.27.1 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.26.0 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/time v0.15.0 // indirect + golang.org/x/tools v0.44.0 // indirect + google.golang.org/api v0.276.0 // indirect + google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.1 // indirect - nhooyr.io/websocket v1.8.10 // indirect - pgregory.net/rapid v1.1.0 // indirect -) - -replace ( - // release/v0.50.x - cosmossdk.io/client/v2 => github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240604100318-cf12e5ad62e4 - cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240604100318-cf12e5ad62e4 - cosmossdk.io/x/tx => github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240604100318-cf12e5ad62e4 - github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.0.0-20240604100318-cf12e5ad62e4 + gotest.tools/v3 v3.5.2 // indirect + lukechampine.com/blake3 v1.4.1 // indirect + nhooyr.io/websocket v1.8.17 // indirect + pgregory.net/rapid v1.3.0 // indirect + rsc.io/qr v0.2.0 // indirect ) replace ( // use cosmos keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 - github.com/cockroachdb/pebble => github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 - // release/v1.11.x - github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7 + + // release/v0.54.x + github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20260601063535-2cd50b219979 + // release/v1.16 + github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20260521015249-663dca6c618e // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 - github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 + github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tidwall/btree => github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c ) diff --git a/go.sum b/go.sum index 72e7660c6e..a04a87a837 100644 --- a/go.sum +++ b/go.sum @@ -1,244 +1,88 @@ +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.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.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.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 v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -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/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -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/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -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.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.5 h1:eMPTReoNmGUm8DeiQL9DyM8sYDjEhWzL1+nLbI9DqtQ= -cosmossdk.io/api v0.7.5/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= -cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= -cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= -cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= -cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= -cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= -cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= -cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= -cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= -cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= -cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= -cosmossdk.io/tools/confix v0.1.1 h1:aexyRv9+y15veH3Qw16lxQwo+ki7r2I+g0yNTEFEQM8= -cosmossdk.io/tools/confix v0.1.1/go.mod h1:nQVvP1tHsGXS83PonPVWJtSbddIqyjEw99L4M3rPJyQ= -cosmossdk.io/x/circuit v0.1.0 h1:IAej8aRYeuOMritczqTlljbUVHq1E85CpBqaCTwYgXs= -cosmossdk.io/x/circuit v0.1.0/go.mod h1:YDzblVE8+E+urPYQq5kq5foRY/IzhXovSYXb4nwd39w= -cosmossdk.io/x/evidence v0.1.0 h1:J6OEyDl1rbykksdGynzPKG5R/zm6TacwW2fbLTW4nCk= -cosmossdk.io/x/evidence v0.1.0/go.mod h1:hTaiiXsoiJ3InMz1uptgF0BnGqROllAN8mwisOMMsfw= -cosmossdk.io/x/feegrant v0.1.0 h1:c7s3oAq/8/UO0EiN1H5BIjwVntujVTkYs35YPvvrdQk= -cosmossdk.io/x/feegrant v0.1.0/go.mod h1:4r+FsViJRpcZif/yhTn+E0E6OFfg4n0Lx+6cCtnZElU= -cosmossdk.io/x/upgrade v0.1.1 h1:aoPe2gNvH+Gwt/Pgq3dOxxQVU3j5P6Xf+DaUJTDZATc= -cosmossdk.io/x/upgrade v0.1.1/go.mod h1:MNLptLPcIFK9CWt7Ra//8WUZAxweyRDNcbs5nkOcQy0= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= +cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.9.0 h1:89wyjxT6DL4b5rk/Nk8eBC9DHqf+JiMstrn5IEYxFw4= +cloud.google.com/go/iam v1.9.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/logging v1.15.0 h1:6ooUEBNT6jdWh2b36+iuPn6b/R9qN/tHCbvGS5255gg= +cloud.google.com/go/logging v1.15.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v0.10.0 h1:4OWvp1BjCvoeSZTog3sRFDu6j4IrI9TI4/Y9N+8h25g= +cloud.google.com/go/longrunning v0.10.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/monitoring v1.27.0 h1:BhYwMqao+e5Nn7JtWMM9m6zRtKtVUK6kJWMizXChkLU= +cloud.google.com/go/monitoring v1.27.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= +cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.13.0 h1:RfqsqPOiSCG8ql50UZt5F65KrVa1zbY9mJrO7xvZfbE= +cloud.google.com/go/trace v1.13.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +cosmossdk.io/api v1.0.0 h1:qTV8OPVEwcBPwp2b9p4Qy4noZyihJ+sOMaWL/VT+RCc= +cosmossdk.io/api v1.0.0/go.mod h1:fKRljeYk+04p4T8Shdyv+uH2fSVyzHoWrvDAs/7OxfI= +cosmossdk.io/client/v2 v2.11.0 h1:k3hg9liNjrLv5P/PEle8wcihSwQ/ALCr1fja2sp5His= +cosmossdk.io/client/v2 v2.11.0/go.mod h1:wJNFx9sSqSDE3QeXIU6DRZDagqdv98j6O7hmjnfGa2I= +cosmossdk.io/collections v1.4.0 h1:b373bkxCxKiRbapxZ42TRmcKJEnBVBebdQVk9I5IkkE= +cosmossdk.io/collections v1.4.0/go.mod h1:gxbieVY3tjbvWlkm3yOXf7sGyDrVi12haZH+sek6whw= +cosmossdk.io/core v1.1.0 h1:iJ7j2DjNsFzg4/z4ImNQYzy2D4LfMCsaQ8Lrz1KCmxk= +cosmossdk.io/core v1.1.0/go.mod h1:qGmJxBFHobvG1k4bROQnueslotBU5MIKZLC57xVBYYI= +cosmossdk.io/depinject v1.2.1 h1:eD6FxkIjlVaNZT+dXTQuwQTKZrFZ4UrfCq1RKgzyhMw= +cosmossdk.io/depinject v1.2.1/go.mod h1:lqQEycz0H2JXqvOgVwTsjEdMI0plswI7p6KX+MVqFOM= +cosmossdk.io/errors v1.1.0 h1:X2DSt9JYgH7cuiaDr318aUqIl2z5Lfo/PdGzAtmczUU= +cosmossdk.io/errors v1.1.0/go.mod h1:lnjBmx7etZpMTLnxdspZupH0d9HGRWZhiezDZX2ayyI= +cosmossdk.io/log/v2 v2.1.0 h1:oWLWqZ1UObWu5hIS3dvTW7QyjtvlmSzC3LOy04U/hVI= +cosmossdk.io/log/v2 v2.1.0/go.mod h1:zDNpuRD2sWw4zuw1lZYg/jxKftVG+VizgcWAWkIorwY= +cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= +cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= +cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= +cosmossdk.io/schema v1.1.0/go.mod h1:Gb7pqO+tpR+jLW5qDcNOSv0KtppYs7881kfzakguhhI= +cosmossdk.io/tools/confix v0.1.2 h1:2hoM1oFCNisd0ltSAAZw2i4ponARPmlhuNu3yy0VwI4= +cosmossdk.io/tools/confix v0.1.2/go.mod h1:7XfcbK9sC/KNgVGxgLM0BrFbVcR/+6Dg7MFfpx7duYo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -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/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q= github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= -github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= +github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -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/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= +github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20260116142910-60249400e523 h1:pQUezn45oyv/8VcOQvPCg2851EIIusY0YKkJhAXsy2I= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20260116142910-60249400e523/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= +github.com/RoaringBitmap/roaring/v2 v2.18.0 h1:h7sS0VqCkfBMGgcHaudJFB4FE6Td71H6svRB2poRnGY= +github.com/RoaringBitmap/roaring/v2 v2.18.0/go.mod h1:eq4wdNXxtJIS/oikeCzdX1rBzek7ANzbth041hrU8Q4= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0= +github.com/VictoriaMetrics/fastcache v1.13.0/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0LNjo6B+4aj2Wmng3TjU= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/adlio/schema v1.4.0 h1:dekxG6P0my/bPvlyWzMULelR2Xej8RGErlnJcoY5ddw= +github.com/adlio/schema v1.4.0/go.mod h1:3/ojUldWBCWp4e+6VN9ets6unG5WdqbjF7vyzM0zTVQ= 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= @@ -246,24 +90,60 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy 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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 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/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 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 v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.224 h1:09CiaaF35nRmxrzWZ2uRq5v6Ghg/d2RiPjZnSgtt+RQ= -github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= +github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.14 h1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI= +github.com/aws/aws-sdk-go-v2/config v1.32.14/go.mod h1:U4/V0uKxh0Tl5sxmCBZ3AecYny4UNlVmObYjKuuaiOo= +github.com/aws/aws-sdk-go-v2/credentials v1.19.14 h1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI= +github.com/aws/aws-sdk-go-v2/credentials v1.19.14/go.mod h1:cJKuyWB59Mqi0jM3nFYQRmnHVQIcgoxjEMAbLkpr62w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 h1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 h1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 h1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.15/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 h1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw= +github.com/aws/smithy-go v1.24.3 h1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg= +github.com/aws/smithy-go v1.24.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/benbjohnson/clock v1.1.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= @@ -271,26 +151,29 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= -github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= +github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= +github.com/bits-and-blooms/bitset v1.24.4/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.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd v0.25.0 h1:JPbjwvHGpSywBRuorFFqTjaVP4y6Qw69XJ1nQ6MyWJM= +github.com/btcsuite/btcd v0.25.0/go.mod h1:qbPE+pEiR9643E1s1xu57awsRhlCIm1ZIi6FfeRA4KE= 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.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU= +github.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= 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.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= @@ -300,202 +183,219 @@ 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/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= -github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= +github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= +github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= +github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI= +github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= 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.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/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.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/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/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= 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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= -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/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.13.0 h1:BoCcJeiP9hpBJDETkX19qi8Tb8So37srSsp3stTaDMQ= +github.com/cockroachdb/errors v1.13.0/go.mod h1:bjxt/4E5+OyuAnacpTIU9rn2mzPu1VlthvHP+xpROq0= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k= +github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506/go.mod h1:Mw7HqKr2kdtu6aYGn3tPmAftiP3QPX63LdK/zcariIo= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.8 h1:8eVLLj6juKxiKrAEw2b8cJvNqWq++U8WOfQFuL7KTaA= +github.com/cockroachdb/redact v1.1.8/go.mod h1:GceHHpJ0rMDpYARL5In88Alq/xMBUtVlz7Qxix6ZVkw= +github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb h1:3bCgBvB8PbJVMX1ouCcSIxvsqKPYM7gs72o0zC76n9g= +github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= -github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.38.7 h1:ULhIOJ9+LgSy6nLekhq9ae3juX3NnQUMMPyVdhZV6Hk= -github.com/cometbft/cometbft v0.38.7/go.mod h1:HIyf811dFMI73IE0F7RrnY/Fr+d1+HuJAgtkEpQjCMY= -github.com/cometbft/cometbft-db v0.9.1 h1:MIhVX5ja5bXNHF8EYrThkG9F7r9kSfv8BX4LWaxWJ4M= -github.com/cometbft/cometbft-db v0.9.1/go.mod h1:iliyWaoV0mRwBJoizElCwwRA9Tf7jZJOURcRZF9m60U= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/cometbft/cometbft v0.39.3 h1:UegHXskZNomsijmm29nL5NkeXtnzkme6fg+q1hPQnEI= +github.com/cometbft/cometbft v0.39.3/go.mod h1:PmNfvtw256BC41ad0FABts236CSZnvZ0kjPOciBwTdM= +github.com/cometbft/cometbft-db v1.0.4 h1:cezb8yx/ZWcF124wqUtAFjAuDksS1y1yXedvtprUFxs= +github.com/cometbft/cometbft-db v1.0.4/go.mod h1:M+BtHAGU2XLrpUxo3Nn1nOCcnVCiLM9yx5OuT0u5SCA= +github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDdoGqFt3fI= +github.com/consensys/gnark-crypto v0.18.1/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= +github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= +github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= 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/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/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.0.2 h1:hwMjozuY1OlJs/uh6vddqnk9j7VamLv+0DBlbEXbAKs= -github.com/cosmos/cosmos-db v1.0.2/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA= +github.com/cosmos/btree v1.0.0 h1:V3OdIzTQw2yE7f6pD6FfA9j2/YLj1UpB9MdY0zU3v3k= +github.com/cosmos/btree v1.0.0/go.mod h1:BZML+flLn4d3MOa4POmzDWf5HQ7EGh0y1OLlfhh7A0k= +github.com/cosmos/cosmos-db v1.1.3 h1:7QNT77+vkefostcKkhrzDK9uoIEryzFrU9eoMeaQOPY= +github.com/cosmos/cosmos-db v1.1.3/go.mod h1:kN+wGsnwUJZYn8Sy5Q2O0vCYA99MJllkKASbs6Unb9U= github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/cosmos-sdk/store/v2 v2.0.0 h1:5CFXBU5cHIvxMpz5QBrTwR5DL/W3uZL2BYYMoDp4siY= +github.com/cosmos/cosmos-sdk/store/v2 v2.0.0/go.mod h1:XyRyi5fGjIcokBqS1cyA8/QVbVNy4ui8hmpk1gezuHo= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.12 h1:vB6Lbe/rtnYGjQuFxkPiPYiCybqFT8QvLipDZP8JpFE= -github.com/cosmos/gogoproto v1.4.12/go.mod h1:LnZob1bXRdUoqMMtwYlcR3wjiElmlC+FkjaZRv1/eLY= -github.com/cosmos/iavl v1.1.2 h1:zL9FK7C4L/P4IF1Dm5fIwz0WXCnn7Bp1M2FxH0ayM7Y= -github.com/cosmos/iavl v1.1.2/go.mod h1:jLeUvm6bGT1YutCaL2fIar/8vGUE8cPZvh/gXEWDaDM= -github.com/cosmos/ibc-go/modules/capability v1.0.0 h1:r/l++byFtn7jHYa09zlAdSeevo8ci1mVZNO9+V0xsLE= -github.com/cosmos/ibc-go/modules/capability v1.0.0/go.mod h1:D81ZxzjZAe0ZO5ambnvn1qedsFQ8lOwtqicG6liLBco= -github.com/cosmos/ibc-go/v8 v8.1.0 h1:pf1106wl0Cf+p1+FjXzV6odlS9DnqVunPVWCH1Uz+lQ= -github.com/cosmos/ibc-go/v8 v8.1.0/go.mod h1:o1ipS95xpdjqNcB8Drq0eI3Sn4FRLigjll42ec1ECuU= -github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= -github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= +github.com/cosmos/gogoproto v1.7.2 h1:5G25McIraOC0mRFv9TVO139Uh3OklV2hczr13KKVHCA= +github.com/cosmos/gogoproto v1.7.2/go.mod h1:8S7w53P1Y1cHwND64o0BnArT6RmdgIvsBuco6uTllsk= +github.com/cosmos/iavl v1.2.8 h1:55F96BGUJ7KT7h+Ky/cEqS+pEvhFqsU4O8Th3F0N1js= +github.com/cosmos/iavl v1.2.8/go.mod h1:FRHN4tO+6crf0p2zsqye+nAbsMgiwdkxpWm18DyP6+Y= +github.com/cosmos/ibc-go/v11 v11.0.0 h1:9EIehi88hNP1cCU83NC+J8UXNn+05YZt9eqmnzCQLSg= +github.com/cosmos/ibc-go/v11 v11.0.0/go.mod h1:iWlzLuCu+ctVbQwoVf5z51HE5e/NE8/pwnLVVDmP++4= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= -github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= -github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= -github.com/cosmos/rosetta v0.50.3-1 h1:tqBTfS2I+SIT28zmlKHV/87qPELYrj5Dr5Z68EJvvzs= -github.com/cosmos/rosetta v0.50.3-1/go.mod h1:aayFO1rJpgOENMJPTm5TKJ8S8wIZoIfDjPot9xkMS5k= -github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= -github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cosmos/ledger-cosmos-go v1.0.0 h1:jNKW89nPf0vR0EkjHG8Zz16h6p3zqwYEOxlHArwgYtw= +github.com/cosmos/ledger-cosmos-go v1.0.0/go.mod h1:mGaw2wDOf+Z6SfRJsMGxU9DIrBa4du0MAiPlpPhLAOE= 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.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creachadair/atomicfile v0.3.1 h1:yQORkHjSYySh/tv5th1dkKcn02NEW5JleB84sjt+W4Q= -github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= -github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6QKQDhQ= -github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/creachadair/atomicfile v0.4.0 h1:umZ+njabCI7eeMLWXFRuUy83iQSiA8qnUj8MH04pfbM= +github.com/creachadair/atomicfile v0.4.0/go.mod h1:OyQCzy3n5KhEXHcHxSzZ7BbRt7QmeVkaiMJmtENydDI= +github.com/creachadair/mds v0.25.6 h1:l1MkbdJmhqXTpm92VWYTb0/s0wsiZSKKc/VKU0lf2bA= +github.com/creachadair/mds v0.25.6/go.mod h1:4hatI3hRM+qhzuAmqPRFvaBM8mONkS7nsLxkcuTYUIs= +github.com/creachadair/tomledit v0.0.29 h1:dB5CbdwJMpn/fmfAPTAAleXF/KJwY0Ggc1eL/zvZRgk= +github.com/creachadair/tomledit v0.0.29/go.mod h1:4SoTXxzHgvzHRMIJPw+o6zK/yXii4VjLrb6/3gCQnyA= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c h1:MOgfS4+FBB8cMkDE2j2VBVsbY+HCkPIu0YsJ/9bbGeQ= -github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/crypto-org-chain/cosmos-sdk v0.0.0-20240604100318-cf12e5ad62e4 h1:tU2H8foSm+CVtU9HPEephknr3C6mTrVeSERwRUs6yFY= -github.com/crypto-org-chain/cosmos-sdk v0.0.0-20240604100318-cf12e5ad62e4/go.mod h1:bIUzWfqXnCF2WTFb2uN+FjzMIG3BsOk+P2QmvMtm4ic= -github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240604100318-cf12e5ad62e4 h1:ucFYZpOSYOi5BE96Y782iuczZK7d6ZJVhUoQ3ijrgf4= -github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240604100318-cf12e5ad62e4/go.mod h1:W5sR4asmVDUhJpEmuXTUBkk/yEefKlXTjVWcNciVSR0= -github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240604100318-cf12e5ad62e4 h1:aW5FkDdXGz+Nl9W5bkTTxkleEo3CNGLl78nU5CxikhQ= -github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240604100318-cf12e5ad62e4/go.mod h1:gjE3DZe4t/+VeIk6CmrouyqiuDbZ7QOVDDq3nLqBTpg= -github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240604100318-cf12e5ad62e4 h1:0SAVpeeKAJQLX+5aygBW57EIyVNtvYXXWs9zDusblKk= -github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240604100318-cf12e5ad62e4/go.mod h1:RTiTs4hkXG6IvYGknvB8p79YgjYJdcbzLUOGJChsPnY= -github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde h1:sQIHTJfVt5VTrF7po9eZiFkZiPjlHbFvnXtGCOoBjNM= -github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde/go.mod h1:iwQTX9xMX8NV9k3o2BiWXA0SswpsZrDk5q3gA7nWYiE= -github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7 h1:V43F3JFcqG4MUThf9W/DytnPblpR6CcaLBw2Wx6zTgE= -github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20260601063535-2cd50b219979 h1:s39a1MkV0ViXNiiXQm8DC2iNFbErjAbPA0GPMkGaH54= +github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20260601063535-2cd50b219979/go.mod h1:Unt21RO+q1EebU6gcUPKYVzpAQSr4KIHjaOmjpz2twA= +github.com/crypto-org-chain/go-ethereum v1.10.20-0.20260521015249-663dca6c618e h1:ftyRRWDiXKWsnp3PxLNbfVLzrqkx+aDNZdkPconawWk= +github.com/crypto-org-chain/go-ethereum v1.10.20-0.20260521015249-663dca6c618e/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= +github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= +github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/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/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/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA= +github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= +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= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/desertbit/timer v1.0.1 h1:yRpYNn5Vaaj6QXecdLMPMJsW81JLiI1eokUft5nBmeo= +github.com/desertbit/timer v1.0.1/go.mod h1:htRrYeY5V/t4iu1xCJ5XsQvp4xve8QulXXctAzxqcwE= +github.com/dgraph-io/badger/v4 v4.9.1 h1:DocZXZkg5JJHJPtUErA0ibyHxOVUDVoXLSCV6t8NC8w= +github.com/dgraph-io/badger/v4 v4.9.1/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0= +github.com/dgraph-io/ristretto/v2 v2.4.0 h1:I/w09yLjhdcVD2QV192UJcq8dPBaAJb9pOuMyNy0XlU= +github.com/dgraph-io/ristretto/v2 v2.4.0/go.mod h1:0KsrXtXvnv0EqnzyowllbVJB8yBonswa2lTCK2gGo9E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= 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/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7 h1:kgvzE5wLsLa7XKfV85VZl40QXaMCaeFtHpPwJ8fhotY= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= +github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3 h1:+3HCtB74++ClLy8GgjUQYeC8R4ILzVcIe8+5edAJJnE= +github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= +github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54= +github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg= 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/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.8.0 h1:LqkkVKAlHFfH9LOEl5fe4p/zL02OhWE7pCufMBG2jLA= +github.com/dvsekhvalnov/jose2go v1.8.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.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 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= +github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/emicklei/dot v1.6.1 h1:ujpDlBkkwgWUY+qPId5IwapRW/xEoligRSYjioR6DFI= -github.com/emicklei/dot v1.6.1/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/dot v1.11.0 h1:zsrhCuFHAJge/aZIC4N4LdHy5tqYu4tWEaUzIwdYj4Y= +github.com/emicklei/dot v1.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= 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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= +github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk= +github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8= +github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= +github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= 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.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= +github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -504,20 +404,25 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -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/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/getsentry/sentry-go v0.46.0 h1:mbdDaarbUdOt9X+dx6kDdntkShLEX3/+KyOsVDTPDj0= +github.com/getsentry/sentry-go v0.46.0/go.mod h1:evVbw2qotNUdYG8KxXbAdjOQWWvWIwKxpjdZZIvcIPw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= 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-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-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= 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= @@ -529,33 +434,38 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj 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-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE= +github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk= 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.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/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 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +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-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 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/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= @@ -566,25 +476,12 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV 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/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= 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/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= @@ -592,7 +489,6 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a 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= @@ -603,88 +499,51 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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.3/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/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -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-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-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= 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/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -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/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= +github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= 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/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -695,8 +554,9 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +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/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -705,8 +565,12 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= 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= @@ -716,84 +580,86 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.3 h1:bN2+Fw9XPFvOCjB0UOevFIMICZ7G2XSQHzfvLUyOM5E= -github.com/hashicorp/go-getter v1.7.3/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= -github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= +github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= 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-plugin v1.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= -github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= +github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= +github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= 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 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.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 v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +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/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db h1:IZUYC/xb3giYwBLMnr8d0TGTzPKFGNTCGgGLoyeX330= +github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db/go.mod h1:xTEYN9KCHxuYHs+NmrmzFcnvHMzLLNiGFafCb1n3Mfg= 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.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huandu/skiplist v1.2.1 h1:dTi93MgjwErA/8idWTzIw4Y1kZsMWx35fmI2c8Rij7w= +github.com/huandu/skiplist v1.2.1/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +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.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.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/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg= +github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk= 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-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/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/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= -github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jhump/protoreflect v1.18.0 h1:TOz0MSR/0JOZ5kECB/0ufGnC2jdsgZ123Rd/k4Z5/2w= +github.com/jhump/protoreflect v1.18.0/go.mod h1:ezWcltJIVF4zYdIFM+D/sHV4Oh5LNU08ORzCGfwvTz8= +github.com/jhump/protoreflect/v2 v2.0.0-beta.1 h1:Dw1rslK/VotaUGYsv53XVWITr+5RCPXfvvlGrM/+B6w= +github.com/jhump/protoreflect/v2 v2.0.0-beta.1/go.mod h1:D9LBEowZyv8/iSu97FU2zmXG3JxVTmNw21mu63niFzU= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= 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= @@ -801,8 +667,8 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u 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/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/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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= @@ -813,12 +679,16 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= +github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= 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.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -831,49 +701,87 @@ 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/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= +github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= 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.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.47.0 h1:qQpBjSCWNQFF0hjBbKirMXE9RHLtSuzTDkTfr1rw0yc= +github.com/libp2p/go-libp2p v0.47.0/go.mod h1:s8HPh7mMV933OtXzONaGFseCg/BE//m1V34p3x4EUOY= +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-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +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-netroute v0.3.0 h1:nqPCXHmeNmgTJnktosJ/sIef9hvwYCrsLxXmfNks/oc= +github.com/libp2p/go-netroute v0.3.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= +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/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg= +github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= 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/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= -github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/linxGnu/grocksdb v1.10.7 h1:fCi4qvZWo04VgFwGWmO8HQJgUVounJBy+C2TMVPU/ho= +github.com/linxGnu/grocksdb v1.10.7/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e h1:Q6MvJtQK/iRcRtzAscm/zF23XxJlbECiGPyRicsX+Ak= +github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/marcopolo/simnet v0.0.4 h1:50Kx4hS9kFGSRIbrt9xUS3NJX33EyPqHVmpXvaKLqrY= +github.com/marcopolo/simnet v0.0.4/go.mod h1:tfQF1u2DmaB6WHODMtQaLtClEf3a296CKQLq5gAsIS0= +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/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 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.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.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -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-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdp/qrterminal/v3 v3.2.1 h1:6+yQjiiOsSuXT5n9/m60E54vdgFsw0zhADHhHLrFet4= +github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFSuQ5kpz/SU= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -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/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE= +github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE= +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/minio/highwayhash v1.0.4 h1:asJizugGgchQod2ja9NJlGOWq4s7KsAWr5XUc9Clgl4= +github.com/minio/highwayhash v1.0.4/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +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/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.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/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= 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= @@ -882,12 +790,44 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 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/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= +github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +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.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw= +github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= +github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= +github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= +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.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo= +github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo= +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.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= +github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -903,12 +843,12 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729 h1:yfQ2sO9WJXUAIUR+g7NUkxJSKCAFJcR5sUDu+ZmjTZI= +github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= 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/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E= +github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk= 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= @@ -916,23 +856,23 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow= -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +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.28.0 h1:Rrf+lVLmtlBIKv6KrIGJCjyY8N36vDVcutbGJkyqjJc= +github.com/onsi/ginkgo/v2 v2.28.0/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= 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-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opencontainers/runc v1.2.8 h1:RnEICeDReapbZ5lZEgHvj7E9Q3Eex9toYmaGBsbvU5Q= +github.com/opencontainers/runc v1.2.8/go.mod h1:cC0YkmZcuvr+rtBZ6T7NBoVbMGNAdLa/21vIElJDOzI= 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= @@ -947,128 +887,188 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +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/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= -github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= +github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= 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/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= +github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo= +github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4= +github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= +github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4= +github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= +github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= +github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c= +github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk= +github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE= +github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE= +github.com/pion/sdp/v3 v3.0.13 h1:uN3SS2b+QDZnWXgdr69SM8KB4EbcnPnPf2Laxhty/l4= +github.com/pion/sdp/v3 v3.0.13/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E= +github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4= +github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= +github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= +github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= +github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= +github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps= +github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs= +github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54= +github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U= 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/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= 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.0/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.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= 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/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/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= 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.52.2 h1:LW8Vk7BccEdONfrJBDffQGRtpSzi5CQaRZGtboOO2ck= -github.com/prometheus/common v0.52.2/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= 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.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.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/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/prysmaticlabs/gohashtree v0.0.4-beta h1:H/EbCuXPeTV3lpKeXGPpEV9gsUpkqOOVnWapUyeWro4= +github.com/prysmaticlabs/gohashtree v0.0.4-beta/go.mod h1:BFdtALS+Ffhg3lGQIHv9HDWuHS8cTvHZzrHWxwOtGOs= +github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= +github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= +github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= +github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= +github.com/quic-go/webtransport-go v0.10.0 h1:LqXXPOXuETY5Xe8ITdGisBzTYmUOy5eSj+9n4hLTjHI= +github.com/quic-go/webtransport-go v0.10.0/go.mod h1:LeGIXr5BQKE3UsynwVBeQrU1TPrbh73MGoC6jd+V7ow= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= +github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/zerolog v1.35.0 h1:VD0ykx7HMiMJytqINBsKcbLS+BJ4WYjz+05us+LRTdI= +github.com/rs/zerolog v1.35.0/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sasha-s/go-deadlock v0.3.7 h1:i3KnHMAptD/cZ8JmDXQnD44luuRbOn+CFeXGnLnf+YU= +github.com/sasha-s/go-deadlock v0.3.7/go.mod h1:KuZj51ZFmx42q/mPaYbRk0P1xcwe697zsJKE03vD4/Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +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/v4 v4.26.4 h1:B4SXVbcwTyrocPHEmWBC4uCYr4Xcu3MK1TXqbprAOWY= +github.com/shirou/gopsutil/v4 v4.26.4/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.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.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 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/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= 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.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= -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/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/status-im/keycard-go v0.3.3 h1:qk/JHSkT9sMka+lVXrTOIVSgHIY7lDm46wrUqTsNa4s= +github.com/status-im/keycard-go v0.3.3/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= @@ -1088,92 +1088,154 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= +github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= +github.com/tidwall/btree v1.8.1/go.mod h1:jBbTdUWhSZClZWoDg54VnvV7/54modSOzDN7VXftj1A= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 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/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= +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/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.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/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.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zondax/golem v0.27.0 h1:IbBjGIXF3SoGOZHsILJvIM/F/ylwJzMcHAcggiqniPw= +github.com/zondax/golem v0.27.0/go.mod h1:AmorCgJPt00L8xN1VrMBe13PSifoZksnQ1Ge906bu4A= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= -github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +github.com/zondax/ledger-go v1.0.1 h1:Ks/2tz/dOF+dbRynfZ0dEhcdL1lqw43Sa0zMXHpQ3aQ= +github.com/zondax/ledger-go v1.0.1/go.mod h1:j7IgMY39f30apthJYMd1YsHZRqdyu4KbVmUp0nU78X0= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= +go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= 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/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/bridges/otelslog v0.18.0 h1:hhPGP3zvvy1xWT9RTy970wlniSxFttBIsAK1gvMguJM= +go.opentelemetry.io/contrib/bridges/otelslog v0.18.0/go.mod h1:twJF7inoMza6kxMcF8JOdL3mPmtOZu7GEr34CUNE6Dg= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= +go.opentelemetry.io/contrib/instrumentation/host v0.68.0 h1:0BfTRAHtFpIlIY7cw1qg9nODUwblutIqx7Cn6NPD+2s= +go.opentelemetry.io/contrib/instrumentation/host v0.68.0/go.mod h1:SmgEeGNt1+gp8bmzB5LLyUlCObWcWrRbYMIiDii3NH8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/contrib/instrumentation/runtime v0.68.0 h1:jhVIQEprwUTV+KfzzliLidclhoTOoHTgdz96kAyR8mU= +go.opentelemetry.io/contrib/instrumentation/runtime v0.68.0/go.mod h1:4HsdbLUbernaTnA8CNaNE+1g026SciXb3juRYe3l8EY= +go.opentelemetry.io/contrib/otelconf v0.23.0 h1:s3C7KdMYiutf4rC8hKFA0WOIDG+gIru8ajjQKS59ir8= +go.opentelemetry.io/contrib/otelconf v0.23.0/go.mod h1:0kN2tcccZS82e7IZlo045gkcL8/8dup1k25sf9ypGxM= +go.opentelemetry.io/contrib/propagators/autoprop v0.68.0 h1:wLGFvNBPqQhzBn0QRBZjrriH8lZ9gqtTz8ufHEjLg7k= +go.opentelemetry.io/contrib/propagators/autoprop v0.68.0/go.mod h1:evWK9nCqCzH8nhclTlpkdUzmxrmJQ2mrWCdKIvyOYec= +go.opentelemetry.io/contrib/propagators/aws v1.43.0 h1:EwnsB3cXRLAh7/Nr/9rMuGw73nfb3z6uAvVDjRrbeUg= +go.opentelemetry.io/contrib/propagators/aws v1.43.0/go.mod h1:CJjTym6F87tEdm61Qvnz5xrV8vKlH4C92djiqcn62k8= +go.opentelemetry.io/contrib/propagators/b3 v1.43.0 h1:CETqV3QLLPTy5yNrqyMr41VnAOOD4lsRved7n4QG00A= +go.opentelemetry.io/contrib/propagators/b3 v1.43.0/go.mod h1:Q4mCiCdziYzpNR0g+6UqVotAlCDZdzz6L8jwY4knOrw= +go.opentelemetry.io/contrib/propagators/jaeger v1.43.0 h1:peiLMz1+aqJE+3L4mOVtR9wlmv+yh/JVYXCBjqmzJJE= +go.opentelemetry.io/contrib/propagators/jaeger v1.43.0/go.mod h1:Agvif+4A8p/3UtZzJ0MCcDEuQwgtrzM71DueU41DCs8= +go.opentelemetry.io/contrib/propagators/ot v1.43.0 h1:Hh1HahlGc81AOE7siqi1tVOlbanY/UxMMWedpb0d5oQ= +go.opentelemetry.io/contrib/propagators/ot v1.43.0/go.mod h1:58MlyS7lghzYvAm5LN9gGmZpCMQEMB5vpZp9SRgOyE4= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0/go.mod h1:gMk9F0xDgyN9M/3Ed5Y1wKcx/9mlU91NXY2SNq7RQuU= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 h1:HIBTQ3VO5aupLKjC90JgMqpezVXwFuq6Ryjn0/izoag= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0/go.mod h1:ji9vId85hMxqfvICA0Jt8JqEdrXaAkcpkI9HPXya0ro= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 h1:8UQVDcZxOJLtX6gxtDt3vY2WTgvZqMQRzjsqiIHQdkc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0/go.mod h1:2lmweYCiHYpEjQ/lSJBYhj9jP1zvCvQW4BqL9dnT7FQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0 h1:w1K+pCJoPpQifuVpsKamUdn9U0zM3xUziVOqsGksUrY= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.43.0/go.mod h1:HBy4BjzgVE8139ieRI75oXm3EcDN+6GhD88JT1Kjvxg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.19.0 h1:GJkybS+crDMdExT/BUNCEgfrmfboztcS6PhvSo88HKM= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.19.0/go.mod h1:NuAyxRYIG2lKX3YQkB+83StTxM7s52PUUkRRiC0wnYI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.43.0 h1:mS47AX77OtFfKG4vtp+84kuGSFZHTyxtXIN269vChY0= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.43.0/go.mod h1:PJnsC41lAGncJlPUniSwM81gc80GkgWJWr3cu2nKEtU= +go.opentelemetry.io/otel/log v0.19.0 h1:KUZs/GOsw79TBBMfDWsXS+KZ4g2Ckzksd1ymzsIEbo4= +go.opentelemetry.io/otel/log v0.19.0/go.mod h1:5DQYeGmxVIr4n0/BcJvF4upsraHjg6vudJJpnkL6Ipk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5dBDiXyko= +go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= +go.opentelemetry.io/otel/sdk/log/logtest v0.19.0 h1:BEbF7ZBB6qQloV/Ub1+3NQoOUnVtcGkU3XX4Ws3GQfk= +go.opentelemetry.io/otel/sdk/log/logtest v0.19.0/go.mod h1:Lua81/3yM0wOmoHTokLj9y9ADeA02v1naRrVrkAZuKk= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4= +go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg= +go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +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.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= 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= @@ -1183,61 +1245,58 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E 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.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.26.0 h1:jZ6dpec5haP/fUv1kLCbuJy6dnRrfX6iVK08lZBFpk4= +golang.org/x/arch v0.26.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8= 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-20181203042331-505ab145d0a9/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-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-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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -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.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= 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-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= -golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= +golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= 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-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/lint v0.0.0-20210508222113-6edffad5e616/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.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= 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= @@ -1251,98 +1310,49 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-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-20200421231249-e086a090c8fd/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-20210119194325-5f4716e94777/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-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/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-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/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-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -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.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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= 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-20220601150217-0de741cfad7f/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.0.0-20220929204114-8fcdb60fdcc0/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/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1351,17 +1361,11 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h 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-20181205085412-a5c9d58dba9a/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-20190312061237-fead79001313/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-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/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= @@ -1370,103 +1374,79 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-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-20200420163511-1957bb5e6d1f/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-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/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-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/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-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= 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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= 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/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1474,289 +1454,70 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-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-20191108193012-7d206e10da11/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-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-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= 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-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= 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.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/api v0.276.0 h1:nVArUtfLEihtW+b0DdcqRGK1xoEm2+ltAihyztq7MKY= +google.golang.org/api v0.276.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= 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.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-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-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-20200423170343-7949de9c1215/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-20200513103714-09dca8ec2884/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-20210126160654-44e461bb6506/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-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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -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-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478 h1:aLsVTW0lZ8+IY5u/ERjZSCvAmhuR7slKzyha3YikDNA= +google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478/go.mod h1:YJAzKjfHIUHb9T+bfu8L7mthAp7VVXQBUs1PLdBWS7M= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.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.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.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.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= 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= @@ -1770,10 +1531,10 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1782,16 +1543,11 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8 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/cheggaaa/pb.v1 v1.0.27/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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +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/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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= @@ -1810,25 +1566,23 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.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= +lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= +lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= -nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -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= +nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= +nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= +pgregory.net/rapid v1.3.0 h1:vBvO0VSqti75J1jjYqpgPNBLKMd1+gxa9fYo7vk/Exc= +pgregory.net/rapid v1.3.0/go.mod h1:dPlE4OBBxgXPqkP79flB6sJL1dx5azpI7HQ9MY9Z7uk= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= +rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/gomod2nix.toml b/gomod2nix.toml index ec35a16cf6..d359638e01 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -1,69 +1,63 @@ schema = 3 [mod] + [mod."cel.dev/expr"] + version = "v0.25.1" + hash = "sha256-TEdMxFUPK7IZuCXMufwCkbN+ZZIXSQclljIybFZcByo=" [mod."cloud.google.com/go"] - version = "v0.112.0" - hash = "sha256-lmNLoqmLURfxu+a6V/SeoP8xVn0Wi2SD7uxxAtSjm+o=" - [mod."cloud.google.com/go/compute"] - version = "v1.24.0" - hash = "sha256-icDjR0uxYeazRbhsBgl8Dx7z/oRZJ/iqK6CGjCtsaQQ=" + version = "v0.123.0" + hash = "sha256-OjuvlqYrGvoUiXO/5ALbMxHvXRlrhDjLby1BN/nuhAw=" + [mod."cloud.google.com/go/auth"] + version = "v0.20.0" + hash = "sha256-HlKu/WvrK7oj5hgaAkpv9WAufMLfEVLiRJAdM5W6GVU=" + [mod."cloud.google.com/go/auth/oauth2adapt"] + version = "v0.2.8" + hash = "sha256-GoXFqAbp1WO1tDj07PF5EyxDYvCBP0l0qwxY2oV2hfc=" [mod."cloud.google.com/go/compute/metadata"] - version = "v0.2.3" - hash = "sha256-kYB1FTQRdTDqCqJzSU/jJYbVUGyxbkASUKbEs36FUyU=" + version = "v0.9.0" + hash = "sha256-VFqQwLJKyH1zReR/XtygEHP5UkI01T9BHEL0hvXtauo=" [mod."cloud.google.com/go/iam"] - version = "v1.1.6" - hash = "sha256-u91oZdyy/wgk3J8Z+4mWmn+YliSBIATu6kpyH20Dd8k=" + version = "v1.9.0" + hash = "sha256-jIIzVfzBH6eW7SAc9M7ro2rv940ofljNcS1Yv+T37m4=" + [mod."cloud.google.com/go/monitoring"] + version = "v1.27.0" + hash = "sha256-H670IW8gMT+W32wvOcejZKS47v0MvH+JrMpj8O1p0qA=" [mod."cloud.google.com/go/storage"] - version = "v1.36.0" - hash = "sha256-dRKH1NEyAfEpVo5Mma677L7z0JO9Mfd1bv1lr1uFngI=" + version = "v1.62.1" + hash = "sha256-CI+jeQDoyF+G6kFT5GL8rgcxjMeAYpN7OyNBYEizYqw=" [mod."cosmossdk.io/api"] - version = "v0.7.5" - hash = "sha256-Nuw697sJr56kU3EU7DV1eYNkyI76psznIVqYAV6RfbQ=" + version = "v1.0.0" + hash = "sha256-JrIeHiTu1Q9fuOCdPHztITRZBNECr0aEcQkX3zu6LL0=" [mod."cosmossdk.io/client/v2"] - version = "v2.0.0-20240604100318-cf12e5ad62e4" - hash = "sha256-60hmufv3Ml4Pv3zNwgn8eeqlEINOR6n9MKr2QHddoxo=" - replaced = "github.com/crypto-org-chain/cosmos-sdk/client/v2" + version = "v2.11.0" + hash = "sha256-7b3k6yB9ECywX2DCEEVcLQ/eE0sslHph0cszISi6uzQ=" [mod."cosmossdk.io/collections"] - version = "v0.4.0" - hash = "sha256-minFyzgO/D+Oda4E3B1qvOAN5qd65SjS6nmjca4cp/8=" + version = "v1.4.0" + hash = "sha256-GQHWr2qpZn5m7TkKw+6rWsHowt5Nu77Ok52zb8clW48=" [mod."cosmossdk.io/core"] - version = "v0.11.0" - hash = "sha256-zUiOF04lWHK8OZqGhwVuzKYfig5I0107D+8fWX5/pbQ=" + version = "v1.1.0" + hash = "sha256-FJhS1gAmKkUFeN9/E79MzHoDOvmmgAH84ahq3C4f5Oc=" [mod."cosmossdk.io/depinject"] - version = "v1.0.0-alpha.4" - hash = "sha256-xpLH0K6ivQznFrLw2hmhWIIyYgqjstV47OhTEj/c1oQ=" + version = "v1.2.1" + hash = "sha256-GGTflCIZs9oWn9lsR2yi2K5HVjOpeIN2xm2sQ065pYo=" [mod."cosmossdk.io/errors"] - version = "v1.0.1" - hash = "sha256-MgTocXkBzri9FKkNtkARJXPmxRrRO/diQJS5ZzvYrJY=" - [mod."cosmossdk.io/log"] - version = "v1.3.1" - hash = "sha256-otkUvsz35VuuUWXoTmWBwR61+o6YzvWETGdLfwWDvwY=" + version = "v1.1.0" + hash = "sha256-j4b3rqKIxy7coi9j2v45IYfeIq7VVrviEabO04lCBkk=" + [mod."cosmossdk.io/log/v2"] + version = "v2.1.0" + hash = "sha256-gw+YjeHALwuduXGAf+XBZ7RczZZvt6XYkwxVeoDqEtQ=" [mod."cosmossdk.io/math"] - version = "v1.3.0" - hash = "sha256-EEFK43Cr0g0ndhQhkIKher0FqV3mvkmE9z0sP7uVSHg=" - [mod."cosmossdk.io/store"] - version = "v0.0.0-20240604100318-cf12e5ad62e4" - hash = "sha256-zne7cIFs9WLg11pIr9VLBBc+G+kZfKLn8UU1mP4w6BM=" - replaced = "github.com/crypto-org-chain/cosmos-sdk/store" + version = "v1.5.3" + hash = "sha256-8jBAGa0D9EYBzn9SxiJNZwj3ChFtX03oow8BEP7dIU4=" + [mod."cosmossdk.io/schema"] + version = "v1.1.0" + hash = "sha256-AXXiVWQsEEWe4eRwbFuLsF/dU0dnnK56Zz7e64fLGFA=" [mod."cosmossdk.io/tools/confix"] - version = "v0.1.1" - hash = "sha256-/Et2FFhb4XfakbLFvGQK3QxN5Y7alzO+DGfi2/EWbxo=" - [mod."cosmossdk.io/x/evidence"] - version = "v0.1.0" - hash = "sha256-ZhVrmCGOzx2yODpcgvM9c48jkqz37NwU2ln/uVuCEfc=" - [mod."cosmossdk.io/x/feegrant"] - version = "v0.1.0" - hash = "sha256-/gWvrqvy6bW90+NU66T+9QysYgvG1VbwfYJZ8tkqpeA=" - [mod."cosmossdk.io/x/tx"] - version = "v0.0.0-20240604100318-cf12e5ad62e4" - hash = "sha256-xT5IdapEx1h46ofBpxcBQfzGF2EntmC8xZl7aym/6xE=" - replaced = "github.com/crypto-org-chain/cosmos-sdk/x/tx" - [mod."cosmossdk.io/x/upgrade"] - version = "v0.1.1" - hash = "sha256-bM9ybpaibMH7k4M6/QAXCZ3fJcADfJHxvMgp4AVUihs=" + version = "v0.1.2" + hash = "sha256-1VhdIdBDG7jaSiRTNYtoQ3WGaGm+vQ1Qf671zSiWAek=" [mod."filippo.io/edwards25519"] - version = "v1.1.0" - hash = "sha256-9ACANrgWZSd5HYPfDZHY8DVbPSC9LOMgy8deq3rDOoc=" + version = "v1.2.0" + hash = "sha256-VOgoreEdslftsR/MyEnZAlutqvph4T57NR1mT9+APfg=" [mod."github.com/99designs/go-keychain"] version = "v0.0.0-20191008050251-8e49817e8af4" hash = "sha256-4EndKcspGC3GOPCmctXF1NnWzxWwMyY/OQpFMmr8Sc0=" @@ -75,23 +69,95 @@ schema = 3 version = "v4.8.3+incompatible" hash = "sha256-9KvlVQdgyJ1ulDa6wkLb0ACdjc+R0U91hdb7nxodrA0=" [mod."github.com/DataDog/zstd"] - version = "v1.5.5" - hash = "sha256-tSw0aq0pPyroZtQYYb9lWOtPVNaQOt8skYQ4TMXGvAQ=" + version = "v1.5.7" + hash = "sha256-GlSZOyix7Ct7tOKmSKpGckDjMhTtiYPBTpoWdwGLx5M=" + [mod."github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp"] + version = "v1.32.0" + hash = "sha256-qkLtEOoEFlKy5+GbFeGqq0D/6yBD5uiQUUMmy/eLJxg=" + [mod."github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric"] + version = "v0.56.0" + hash = "sha256-hrmkb9WIZjfHRp2PM8F8/waY4jHYZpdiHnJcjJuQvjE=" + [mod."github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping"] + version = "v0.56.0" + hash = "sha256-+ltGHktyr/wZV8ZOJlMgOTbP9slSZnmBykt/XCyoOIw=" + [mod."github.com/Masterminds/semver/v3"] + version = "v3.5.0" + hash = "sha256-Ps7gEw0nkHDZO/iDru/s+X8rMaUkNmiZ7id1GsIKlDU=" [mod."github.com/Microsoft/go-winio"] - version = "v0.6.1" - hash = "sha256-BL0BVaHtmPKQts/711W59AbHXjGKqFS4ZTal0RYnR9I=" - [mod."github.com/StackExchange/wmi"] - version = "v0.0.0-20180116203802-5d049714c4a6" - hash = "sha256-0yUxhZB3v3ZE3QY36zHs2cJ1S4GXptXIhyAi6sI2nOo=" + version = "v0.6.2" + hash = "sha256-tVNWDUMILZbJvarcl/E7tpSnkn7urqgSHa2Eaka5vSU=" + [mod."github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime"] + version = "v0.0.0-20260116142910-60249400e523" + hash = "sha256-YB2ZfbMIKJ4+Mce44MEtWCftwEKitb4wxh6I38AAIAw=" + [mod."github.com/RoaringBitmap/roaring/v2"] + version = "v2.18.0" + hash = "sha256-pD2Rfq6P8CN0WuYgmgto4Ha74q8KG2iHVwTo2oSfRLM=" [mod."github.com/VictoriaMetrics/fastcache"] - version = "v1.6.0" - hash = "sha256-u1dkRJ2Y5+hnYlkyMPm14HxKkAv999bjN622nZDjaBo=" + version = "v1.13.0" + hash = "sha256-B11EnHNBXrs3ayXVF9OTevYZsPp1E7IwPL+S9/QH+XA=" [mod."github.com/allegro/bigcache"] version = "v1.2.1" hash = "sha256-/DwqBxg75m1zzOB8BWbpjQ/jYnhoe/SMXc4310mOlMA=" - [mod."github.com/aws/aws-sdk-go"] - version = "v1.44.224" - hash = "sha256-zkewIYLOT+CvBDsxXnY2ZaFyoDdt/JCFQ2sCIdBmTFo=" + [mod."github.com/aws/aws-sdk-go-v2"] + version = "v1.41.5" + hash = "sha256-gPtAxzRKF5Uep8f1NElsuXrWVePOoU3bxfPv5CRDwvI=" + [mod."github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream"] + version = "v1.7.8" + hash = "sha256-UW9P6XKdTv9MXG8NcnZFli6RVZ1s6LXfD9j3EUBr1FE=" + [mod."github.com/aws/aws-sdk-go-v2/config"] + version = "v1.32.14" + hash = "sha256-y5sH8w7E80cT6ZWy7u6TVzkegd1jYPK0syi/QgF7sH4=" + [mod."github.com/aws/aws-sdk-go-v2/credentials"] + version = "v1.19.14" + hash = "sha256-1m4tRo0bKEgaIh3uYufB6i1xAEMMqXbsPLjrHpQAsxs=" + [mod."github.com/aws/aws-sdk-go-v2/feature/ec2/imds"] + version = "v1.18.21" + hash = "sha256-KIQqh21N0WhlDs5hM+Sle3IocWHgn9F9oYwl70/t8ko=" + [mod."github.com/aws/aws-sdk-go-v2/internal/configsources"] + version = "v1.4.21" + hash = "sha256-oVZq0A/muPG2CKD1HLeQ/kuHAESSSwbIFB9V181tKCc=" + [mod."github.com/aws/aws-sdk-go-v2/internal/endpoints/v2"] + version = "v2.7.21" + hash = "sha256-M4SiYSVAQU3wXKdIc0aW2Mv2zgGwXvd/+3oyqRKzKQc=" + [mod."github.com/aws/aws-sdk-go-v2/internal/ini"] + version = "v1.8.6" + hash = "sha256-oIRPqu99vnGINAWKnCEytpv7N0gRWO7S72tb1r8oxvk=" + [mod."github.com/aws/aws-sdk-go-v2/internal/v4a"] + version = "v1.4.22" + hash = "sha256-wyrKI56LVsMu626WbL9Qvjpo4IA8juBSq7d+k0/Dw+M=" + [mod."github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding"] + version = "v1.13.7" + hash = "sha256-AfYJdpmnW01Bk/jfHATlNU6lddjqcigFkHw/zcT9WO4=" + [mod."github.com/aws/aws-sdk-go-v2/service/internal/checksum"] + version = "v1.9.13" + hash = "sha256-DJLN7WoTwz215VzrdIb+5gXWdavjpQlaZrlhl4BbTro=" + [mod."github.com/aws/aws-sdk-go-v2/service/internal/presigned-url"] + version = "v1.13.21" + hash = "sha256-FE2sj0e8hoQ9cVzCnbGRZF068hkQI3Om9yUB/kEB+H0=" + [mod."github.com/aws/aws-sdk-go-v2/service/internal/s3shared"] + version = "v1.19.21" + hash = "sha256-tbALcmFnnU+Y8NgTJzStS6T8naV92M2skgNXY8Rmem4=" + [mod."github.com/aws/aws-sdk-go-v2/service/s3"] + version = "v1.99.0" + hash = "sha256-3gMcfOdCcMj8JFpfm+q5t1q5Iw9KTRPVxvfw/Z/Fuo4=" + [mod."github.com/aws/aws-sdk-go-v2/service/signin"] + version = "v1.0.9" + hash = "sha256-K2n7i40z1gnT6xVWrFUSGG1y0guHzY+cD1MipLWU1F8=" + [mod."github.com/aws/aws-sdk-go-v2/service/sso"] + version = "v1.30.15" + hash = "sha256-kVLP0yADAXOWET9UN2AiaVUs3xd47e8hXLXHuEo1gqY=" + [mod."github.com/aws/aws-sdk-go-v2/service/ssooidc"] + version = "v1.35.19" + hash = "sha256-WwfJCRz8pkBmFfxu3pJMTmRoOf/Kzt1450G11vcnyO8=" + [mod."github.com/aws/aws-sdk-go-v2/service/sts"] + version = "v1.41.10" + hash = "sha256-T1F3RJd3iQSkCBI/jYmHrXi2JMWWuRCuYIymlXFhylI=" + [mod."github.com/aws/smithy-go"] + version = "v1.24.3" + hash = "sha256-sruA0NYq8eTnQ121ezdKZUvtwiMdPYT3dvIlgGwzVAA=" + [mod."github.com/benbjohnson/clock"] + version = "v1.3.5" + hash = "sha256-pSTHNILoQpLL64bvdcNwXv+dVJ3LBZRoECpj7m8C9tw=" [mod."github.com/beorn7/perks"] version = "v1.0.1" hash = "sha256-h75GUqfwJKngCJQVE5Ao5wnO3cfKD9lSIteoLp/3xJ4=" @@ -99,73 +165,96 @@ schema = 3 version = "v0.0.0-20140422174119-9fd32a8b3d3d" hash = "sha256-NDxQzO5C5M/aDz5/pjUHfZUh4VwIXovbb3irtxWCwjY=" [mod."github.com/bgentry/speakeasy"] - version = "v0.1.1-0.20220910012023-760eaf8b6816" + version = "v0.2.0" hash = "sha256-Tx3sPuhsoVwrCfJdIwf4ipn7pD92OQNYvpCxl1Z9Wt0=" [mod."github.com/bits-and-blooms/bitset"] - version = "v1.8.0" - hash = "sha256-ySle5MJXSGMHJa1HSf/ZMDTYXdow9ct7JXth4k5Po50=" + version = "v1.24.4" + hash = "sha256-Kjo3ZJKHxyJ8+59Zt/Z6ai0S4DTfbzpFZ5ArFIqfxmM=" [mod."github.com/btcsuite/btcd"] - version = "v0.23.4" - hash = "sha256-xP7TLBdOoUIjg5Q3MOjbT5P9tkCWjsd4bWgZLp539Wo=" + version = "v0.25.0" + hash = "sha256-Yh3UJ8HmzY+5WXZHhcl3oFcXl2PkBTd4O4s8FYyNbos=" [mod."github.com/btcsuite/btcd/btcec/v2"] - version = "v2.3.2" - hash = "sha256-natWs+yIAuD1UI07iZtjPilroQLfXizFn3lNOiOT83U=" + version = "v2.3.5" + hash = "sha256-stpoaGQ1PNPqtLYIQc96YH24s8owcV+PoSo6xREi9LI=" [mod."github.com/btcsuite/btcd/btcutil"] - version = "v1.1.3" - hash = "sha256-6Y9sP1yvPBO8PhqmFVVXNV7dxsXlERDAB+TPTEfW3kI=" + version = "v1.1.6" + hash = "sha256-TYbwJLNX/+63nm+b3RqPH3ZIvTBnsm9peqJP05v9Z90=" [mod."github.com/btcsuite/btcd/chaincfg/chainhash"] - version = "v1.0.1" - hash = "sha256-vix0j/KGNvoKjhlKgVeSLY6un2FHeIEoZWMC4z3yvZ4=" - [mod."github.com/cenkalti/backoff/v4"] - version = "v4.2.1" - hash = "sha256-CKogmPe0pCcAdpztzPwr24rLTJZfq8QVZ9AUduwAcoA=" - [mod."github.com/cespare/xxhash"] version = "v1.1.0" - hash = "sha256-nVDTtXH9PC3yJ0THaQZEN243UP9xgLi/clt5xRqj3+M=" + hash = "sha256-F+EqvufC+KBslZV/vL8ph6MqDoVD5ic5rVaM27reDqo=" + [mod."github.com/bytedance/gopkg"] + version = "v0.1.4" + hash = "sha256-GpfG8K5YTWAt5MRg7RvpcemU7jfPV0A+mMbxSfA+2ws=" + [mod."github.com/bytedance/sonic"] + version = "v1.15.0" + hash = "sha256-zxpmkDsKpW1bcYuv/Ogm8wXMAZt1yKDALt2MGLYZtOI=" + [mod."github.com/bytedance/sonic/loader"] + version = "v0.5.1" + hash = "sha256-fbUguA0wNj+aggu3oHaEzkduQVO4oawcvjohfgUmha8=" + [mod."github.com/cenkalti/backoff/v4"] + version = "v4.3.0" + hash = "sha256-wfVjNZsGG1WoNC5aL+kdcy6QXPgZo4THAevZ1787md8=" + [mod."github.com/cenkalti/backoff/v5"] + version = "v5.0.3" + hash = "sha256-bKq43PPD8RM6e7HePxHaO27traqm76bkvHcTVTQ+jeY=" [mod."github.com/cespare/xxhash/v2"] version = "v2.3.0" hash = "sha256-7hRlwSR+fos1kx4VZmJ/7snR7zHh8ZFKX+qqqqGcQpY=" [mod."github.com/chzyer/readline"] version = "v1.5.1" hash = "sha256-6wKd6/JZ9/O7FwSyNKE3KOt8fVPZEunqbTHQUxlOUNc=" - [mod."github.com/cockroachdb/apd/v2"] - version = "v2.0.2" - hash = "sha256-UrPHkvqVF8V78+kXKmjTHl79XsgDBnqFsje5BMYh0E4=" + [mod."github.com/cloudwego/base64x"] + version = "v0.1.6" + hash = "sha256-VzYJsGubsDk3FAMH6e0Xk0Cl4HtUFHHmWkVASUYidsI=" + [mod."github.com/cncf/xds/go"] + version = "v0.0.0-20260202195803-dba9d589def2" + hash = "sha256-nCcna5Dwr8a+FgdSZt43VmoMds5U0FZta2vpJfdMOhs=" [mod."github.com/cockroachdb/errors"] - version = "v1.11.1" - hash = "sha256-ufKtavyfW/i3ZemiqDqKGc0JM+f0IBi6bZWkZyb/jdc=" + version = "v1.13.0" + hash = "sha256-QfogwVHvVSPOci5o7D1XayB01DRgKwMduXGhVhyiRSs=" + [mod."github.com/cockroachdb/fifo"] + version = "v0.0.0-20240816210425-c5d0cb0b6fc0" + hash = "sha256-V3KTcjUuphajY+luSTnocaTdTEDJea45oOA+e3Dp4p4=" [mod."github.com/cockroachdb/logtags"] - version = "v0.0.0-20230118201751-21c54148d20b" - hash = "sha256-7dQH6j1o99fuxHKkw0RhNC5wJKkvRLMDJpUiVnDx6h8=" + version = "v0.0.0-20241215232642-bb51bb14a506" + hash = "sha256-h69C+/qFjmijuSViiJ3IF5ted/+x7VY7xlkVMya4i24=" [mod."github.com/cockroachdb/pebble"] - version = "v0.0.0-20230209160836-829675f94811" - hash = "sha256-DpbEXN/YWWXap83lz99r6sAUUk76ixDe4fRn1GpBWpo=" - replaced = "github.com/cockroachdb/pebble" - [mod."github.com/cockroachdb/redact"] version = "v1.1.5" - hash = "sha256-0rtT7LRO0wxf9XovOK8GXRrhmx8OcbdPK/mXOKbJdog=" - [mod."github.com/coinbase/rosetta-sdk-go/types"] - version = "v1.0.0" - hash = "sha256-z/0E0NiEGo7zxM7d94ImgUf8P0/KG6hbP9T4Vuym4p0=" + hash = "sha256-m2mwRUX5Kp3WluKBpF4tU32QhMZmUDDgS14YfGfHygs=" + [mod."github.com/cockroachdb/redact"] + version = "v1.1.8" + hash = "sha256-WBtMGyYEvBMgCLJcmG4UAIuuBFliieK7qR4W6BQCXn0=" + [mod."github.com/cockroachdb/tokenbucket"] + version = "v0.0.0-20250429170803-42689b6311bb" + hash = "sha256-ONv0/mLeHiYi/a/7b6TDdqL/iYYW+/87FtniXoYPOhQ=" [mod."github.com/cometbft/cometbft"] - version = "v0.38.7" - hash = "sha256-mN7L3Q4xZ0YcwMIRkIsodCzRPBZqrSKD7VgDHBOWM98=" + version = "v0.39.3" + hash = "sha256-1CUNgloD38PgTjhqeJSByppCQH5BuLPtRq7eMX3DoYw=" [mod."github.com/cometbft/cometbft-db"] - version = "v0.9.1" - hash = "sha256-ftRdle5ok2aCyqT3u5rYY0jKB8WT8uDus26Pw4Mo1go=" + version = "v1.0.4" + hash = "sha256-sRDmCP2jCvaMUjE4g3SRaWIvN0TQMwokDMIBA2lbT8M=" + [mod."github.com/consensys/gnark-crypto"] + version = "v0.18.1" + hash = "sha256-8NFI8oeqRkMBnKdGUpGZfwt3gr4nmzmE3yoasQ3zZkg=" [mod."github.com/cosmos/btcutil"] version = "v1.0.5" hash = "sha256-t572Sr5iiHcuMKLMWa2i+LBAt192oa+G1oA371tG/eI=" + [mod."github.com/cosmos/btree"] + version = "v1.0.0" + hash = "sha256-Ku/QnL5x0wQ8/4YyX5FqIhQpRBeSB8OT/QzQMkAa86Y=" [mod."github.com/cosmos/cosmos-db"] - version = "v1.0.2" - hash = "sha256-WjDoB2AGoIyEW30LlGcQX5JVACJbs0jWSY58IuJHz0M=" + version = "v1.1.3" + hash = "sha256-5V/Dvf4WstXzp3S/EX3Bh9x0MHUpMbjxuJICfad/y6Q=" [mod."github.com/cosmos/cosmos-proto"] version = "v1.0.0-beta.5" hash = "sha256-Fy/PbsOsd6iq0Njy3DVWK6HqWsogI+MkE8QslHGWyVg=" [mod."github.com/cosmos/cosmos-sdk"] - version = "v0.0.0-20240604100318-cf12e5ad62e4" - hash = "sha256-rKHP2oF2+W7iP4jor3jkGtieHTjccX9Gm2GQ1yeomC4=" + version = "v0.50.6-0.20260601063535-2cd50b219979" + hash = "sha256-rjhqJVu4Oh9Er4HfwHAdi1LNqoTEuHmqkRfLMXKYMh0=" replaced = "github.com/crypto-org-chain/cosmos-sdk" + [mod."github.com/cosmos/cosmos-sdk/store/v2"] + version = "v2.0.0" + hash = "sha256-UlKTyyx31e9sd7TH4fH3HlEle92anUoezZm94YQ7r6M=" [mod."github.com/cosmos/go-bip39"] version = "v1.0.0" hash = "sha256-Qm2aC2vaS8tjtMUbHmlBSagOSqbduEEDwc51qvQaBmA=" @@ -173,99 +262,117 @@ schema = 3 version = "v1.2.0" hash = "sha256-Hd19V0RCiMoCL67NsqvWIsvWF8KM3LnuJTbYjWtQkEo=" [mod."github.com/cosmos/gogoproto"] - version = "v1.4.12" - hash = "sha256-e2tbfaZtzLijq+EMnNG9GWKDCG4sBj8wIVnn6/R26iM=" + version = "v1.7.2" + hash = "sha256-L9sJZoQGWaix43AJ7rsm1DUng8uoD8HJ6Mb92Ynq8+s=" [mod."github.com/cosmos/iavl"] - version = "v1.1.2" - hash = "sha256-fhh5fN1BMDxbF4PobERMQdIb9vIrxaSl0tRXas0WKmc=" - [mod."github.com/cosmos/ibc-go/modules/capability"] - version = "v1.0.0" - hash = "sha256-xOeHJWUj6fTc2EUGiE4dgfY2WkvrqTg/FWewoUvQcvg=" - [mod."github.com/cosmos/ibc-go/v8"] - version = "v8.1.0" - hash = "sha256-uwYDKW+lFEfLR6Ro+HM3KhBi7B0mGMutH8oWdoZM7d8=" + version = "v1.2.8" + hash = "sha256-9eqXqTs5UjfYmxFiTVR6sm8/56gGSq3WKoN3xss/OFk=" + [mod."github.com/cosmos/ibc-go/v11"] + version = "v11.0.0" + hash = "sha256-quFHU6vHmDigd2BxwH/khZebwjqYADvdx0vE073IEqk=" [mod."github.com/cosmos/ics23/go"] - version = "v0.10.0" - hash = "sha256-KYEv727BO/ht63JO02xiKFGFAddg41Ve9l2vSSZZBq0=" + version = "v0.11.0" + hash = "sha256-mgU/pqp4kASmW/bP0z6PzssfjRp7GU9ioyvNlDdGC+E=" [mod."github.com/cosmos/ledger-cosmos-go"] - version = "v0.13.3" - hash = "sha256-4f73odipfgWku0/gK2UtXbrBXvj8kT9sg4IhnfAP/S0=" - [mod."github.com/cosmos/rosetta"] - version = "v0.50.3-1" - hash = "sha256-lmB2W6b4cmyGHLh3OpOLnGy2Q75QONLtrWwp/Pvnf6k=" - [mod."github.com/cosmos/rosetta-sdk-go"] - version = "v0.10.0" - hash = "sha256-WmLq9E9mYV+ms6Tdb43lCoAy6cowkDnK4bvX/ApDzLY=" + version = "v1.0.0" + hash = "sha256-BtXZ8t9DOw5yleSozMd4giBRHjuXQCyzRimNmgC/nSU=" + [mod."github.com/crate-crypto/go-eth-kzg"] + version = "v1.4.0" + hash = "sha256-46WtXOdjXppg4zh+5CpUwkWZ0gsEjnIm98cSQOXUV1I=" + [mod."github.com/crate-crypto/go-ipa"] + version = "v0.0.0-20240724233137-53bbb0ceb27a" + hash = "sha256-LQqXqcuo3mRwRgdO4O5rLLJqW635KCAD0tcdOImk0rA=" [mod."github.com/creachadair/atomicfile"] - version = "v0.3.1" - hash = "sha256-GEp1gRxKfBYI6K0XbElcVYcJMPu6eeLufaYxr7Z0MAQ=" + version = "v0.4.0" + hash = "sha256-3JfQJFsZbOhFoKDwR+r3DzK+PtR54UaVVUJZ6sOZElI=" [mod."github.com/creachadair/tomledit"] - version = "v0.0.24" - hash = "sha256-4vUukHONOjNn0qfQr4esK6TWfPWsIp+rbdz65og84lw=" - [mod."github.com/crypto-org-chain/go-block-stm"] - version = "v0.0.0-20240408011717-9f11af197bde" - hash = "sha256-+UTSUoh4DxkWPQEc/j0atak1Oxq3tdP8r6ZMmB0k5KE=" + version = "v0.0.29" + hash = "sha256-QP39Y1YMGWQSIAaD92s6LVLERgwh+5004a7U3flUTU8=" [mod."github.com/danieljoos/wincred"] - version = "v1.2.0" - hash = "sha256-LHcvTJCc8++bFndbd8ZgMSTe4L5h2C4rN+cSWHCz54Y=" + version = "v1.2.3" + hash = "sha256-lDRkd1rU5EIyhzzCB0yIuQUpSdvMM2jjUsCg7rQaHMQ=" [mod."github.com/davecgh/go-spew"] version = "v1.1.2-0.20180830191138-d8f796af33cc" hash = "sha256-fV9oI51xjHdOmEx6+dlq7Ku2Ag+m/bmbzPo6A4Y74qc=" + [mod."github.com/davidlazar/go-crypto"] + version = "v0.0.0-20200604182044-b73af7476f6c" + hash = "sha256-aDgsk+QsLgtbUHDuq44fDDcA8DNxqyX+4xqiqRWCi4I=" [mod."github.com/deckarep/golang-set/v2"] - version = "v2.1.0" - hash = "sha256-Co6gfAcVn256IUEJNNPmVlx8LZRI4sT+KmqGs2uIQ90=" + version = "v2.6.0" + hash = "sha256-ni1XK75Q8iBBmxgoyZTedP4RmrUPzFC4978xB4HKdfs=" [mod."github.com/decred/dcrd/dcrec/secp256k1/v4"] - version = "v4.2.0" - hash = "sha256-Mw+axGW3RzaRFzcYc7/9/gpqZgWXZHeyT2c4USFtAQA=" + version = "v4.4.1" + hash = "sha256-FfHNUmNdqtxHP5OFxqlJJ5jiZ9unpjeLGJS2yHoaNfU=" [mod."github.com/desertbit/timer"] - version = "v0.0.0-20180107155436-c41aec40b27f" - hash = "sha256-abLOtEcomAqCWLphd2X6WkD/ED764w6sa6unox4BXss=" - [mod."github.com/dgraph-io/badger/v2"] - version = "v2.2007.4" - hash = "sha256-+KwqZJZpViv8S3TqUVvPXrFoMgWFyS3NoLsi4RR5fGk=" - [mod."github.com/dgraph-io/ristretto"] - version = "v0.1.1" - hash = "sha256-Wr9ovXhGi71+n37EnrpIj2o9goyaQHtY4Vvurv6IVlY=" - [mod."github.com/dgryski/go-farm"] - version = "v0.0.0-20200201041132-a6ae2369ad13" - hash = "sha256-aOMlPwFY36bLiiIx4HonbCYRAhagk5N6HAWN7Ygif+E=" + version = "v1.0.1" + hash = "sha256-Uk1Ep6lHLGEadcSF/2R9Bk6zwc5OUbTf/WCHrPatWEM=" + [mod."github.com/dgraph-io/badger/v4"] + version = "v4.9.1" + hash = "sha256-izmptzOGBB8YWUYLphkfZuJ7qxAGRney0Tx4Ayyppn0=" + [mod."github.com/dgraph-io/ristretto/v2"] + version = "v2.4.0" + hash = "sha256-U7lgRlPXM3IZWaVeoiEpZinBRfVR5jVHzM5GEOonj0U=" [mod."github.com/dlclark/regexp2"] version = "v1.7.0" hash = "sha256-Z/M62esiZ0fVwvueVQhwz18z0eS22LZ3DJ4O8FKp3AY=" [mod."github.com/dop251/goja"] - version = "v0.0.0-20230122112309-96b1610dd4f7" - hash = "sha256-iKN5Eqr61dDSipTfdf8gd5Va+rSfsKdlDteAkjZXq2g=" + version = "v0.0.0-20230605162241-28ee0ee714f3" + hash = "sha256-dm3HFq1Y+eRt3SGQKTQd5h8BQnPqf4l4/3KD1s95HKY=" + [mod."github.com/dunglas/httpsfv"] + version = "v1.1.0" + hash = "sha256-JHdgw2XK+J0yJpGwOBFfVNHp9NwiqG01BCORk7O/ym0=" [mod."github.com/dustin/go-humanize"] version = "v1.0.1" hash = "sha256-yuvxYYngpfVkUg9yAmG99IUVmADTQA0tMbBXe0Fq0Mc=" [mod."github.com/dvsekhvalnov/jose2go"] - version = "v1.6.0" - hash = "sha256-IXn2BuUp4fi/i2zf1tGGW1m9xoYh3VCksB6GJ5Sf06g=" - [mod."github.com/edsrzf/mmap-go"] - version = "v1.0.0" - hash = "sha256-k1DYvCqO3BKNcGEve/nMW0RxzMkK2tGfXbUbycqcVSo=" + version = "v1.8.0" + hash = "sha256-0KVm4KFqxnPD2tSOpevvIGhbLfKAtCf2FkI9q9DTg8Q=" + [mod."github.com/ebitengine/purego"] + version = "v0.10.0" + hash = "sha256-NPS88SNvsm4QEAx1zVmNGzMwtR1EBhdQYywQU1JdRqM=" [mod."github.com/emicklei/dot"] - version = "v1.6.1" - hash = "sha256-zOpoaepCfPLmU9iQji/Ait+SVEHI9eF3rwtW0h/8lho=" + version = "v1.11.0" + hash = "sha256-FueS4f2xQTz2cuU2BgND91fcsUPraTaAghYKDoS5X40=" + [mod."github.com/envoyproxy/go-control-plane/envoy"] + version = "v1.37.0" + hash = "sha256-xxQd6objJVXpcQ8B7MznhqeQLoLWlyjlASnq2hJDp+k=" + [mod."github.com/envoyproxy/protoc-gen-validate"] + version = "v1.3.3" + hash = "sha256-NsI6A4CBVTpAq4gsmv66sMx0gvY0J0kF/t9zbtlRLr4=" + [mod."github.com/ethereum/c-kzg-4844/v2"] + version = "v2.1.5" + hash = "sha256-v23w5QE40Xv9VNd87a6d4TT8+pAWu509kMSdMGB3qoc=" + [mod."github.com/ethereum/go-bigmodexpfix"] + version = "v0.0.0-20250911101455-f9e208c548ab" + hash = "sha256-4NBADIRV6mJ645F8u5MKxfNv9S1XgCs+pXwPOCoI06s=" [mod."github.com/ethereum/go-ethereum"] - version = "v1.10.20-0.20240425065928-ebb09502e7a7" - hash = "sha256-lE4G5FaRb3MVi9FFVn+WlwsSTOB4SbjmVboKyQ5yB0A=" + version = "v1.10.20-0.20260521015249-663dca6c618e" + hash = "sha256-+WbliqGbS1A9VoccD15twT4JURG8k7ThaGXoDj02KJU=" replaced = "github.com/crypto-org-chain/go-ethereum" + [mod."github.com/ethereum/go-verkle"] + version = "v0.2.2" + hash = "sha256-0MLfSJKdeK3Z7tWAXTdzwB4091dmyxIX38S5SKH5QAw=" [mod."github.com/fatih/color"] - version = "v1.16.0" - hash = "sha256-Aq/SM28aPJVzvapllQ64R/DM4aZ5CHPewcm/AUJPyJQ=" + version = "v1.18.0" + hash = "sha256-pP5y72FSbi4j/BjyVq/XbAOFjzNjMxZt2R/lFFxGWvY=" [mod."github.com/felixge/httpsnoop"] version = "v1.0.4" hash = "sha256-c1JKoRSndwwOyOxq9ddCe+8qn7mG9uRq2o/822x5O/c=" + [mod."github.com/ferranbt/fastssz"] + version = "v0.1.4" + hash = "sha256-BPwVA8BDQmSBPX/kAx7IE7XMNrhBYire2iQsP0icj2s=" + [mod."github.com/flynn/noise"] + version = "v1.1.0" + hash = "sha256-gHCdm9oJTKO+aUGWCw9LM/WHrZT2K6C5+j7VLXpqK48=" [mod."github.com/fsnotify/fsnotify"] - version = "v1.7.0" - hash = "sha256-MdT2rQyQHspPJcx6n9ozkLbsktIOJutOqDuKpNAtoZY=" - [mod."github.com/gballet/go-libpcsclite"] - version = "v0.0.0-20190607065134-2772fd86a8ff" - hash = "sha256-Nr5ocU9s1F2Lhx/Zq6/nIo+KkKEqMjDYOEs3yWRC48g=" + version = "v1.9.0" + hash = "sha256-WtpE1N6dpHwEvIub7Xp/CrWm0fd6PX7MKA4PV44rp2g=" [mod."github.com/getsentry/sentry-go"] - version = "v0.27.0" - hash = "sha256-PTkTzVNogqFA/5rc6INLY6RxK5uR1AoJFOO+pOPdE7Q=" + version = "v0.46.0" + hash = "sha256-HDgKHwRkv5cYWWsNDE2HfPPALANNPwRDGyj9h8wxeT4=" + [mod."github.com/go-jose/go-jose/v4"] + version = "v4.1.4" + hash = "sha256-MKoJKXup1jfwOyN8mHXu1CQ8fvFJTaEf3K2LVtNSRhc=" [mod."github.com/go-kit/kit"] version = "v0.13.0" hash = "sha256-EncDzq0JVtY+NLlW5lD+nbVewNYTTrfzlOxI4PuwREw=" @@ -273,71 +380,71 @@ schema = 3 version = "v0.2.1" hash = "sha256-puLJ+up45X2j9E3lXvBPKqHPKOA/sFAhfCqGxsITW/Y=" [mod."github.com/go-logfmt/logfmt"] - version = "v0.6.0" - hash = "sha256-RtIG2qARd5sT10WQ7F3LR8YJhS8exs+KiuUiVf75bWg=" + version = "v0.6.1" + hash = "sha256-+gUGmdR/QOsB9qKESLrsbq6tK2VssNT/kDbRFpgrZL4=" [mod."github.com/go-logr/logr"] - version = "v1.4.1" - hash = "sha256-WM4badoqxXlBmqCRrnmtNce63dLlr/FJav3BJSYHvaY=" + version = "v1.4.3" + hash = "sha256-Nnp/dEVNMxLp3RSPDHZzGbI8BkSNuZMX0I0cjWKXXLA=" [mod."github.com/go-logr/stdr"] version = "v1.2.2" hash = "sha256-rRweAP7XIb4egtT1f2gkz4sYOu7LDHmcJ5iNsJUd0sE=" [mod."github.com/go-ole/go-ole"] - version = "v1.2.6" - hash = "sha256-+oxitLeJxYF19Z6g+6CgmCHJ1Y5D8raMi2Cb3M6nXCs=" + version = "v1.3.0" + hash = "sha256-tF8t3VcV71jQ4jbPL91BwR59AKDpUAFV1waIKzkXJu8=" [mod."github.com/go-sourcemap/sourcemap"] version = "v2.1.3+incompatible" hash = "sha256-eXhXPPLnAy/rmt/zDgeqni2G3o58UtnHjR8vHLXvISI=" - [mod."github.com/go-stack/stack"] - version = "v1.8.1" - hash = "sha256-ixcJ2RrK1ZH3YWGQZF9QFBo02NOuLeSp9wJ7gniipgY=" + [mod."github.com/go-task/slim-sprig/v3"] + version = "v3.0.0" + hash = "sha256-vCCw4MXVBm33VNLXcOBccVDD1CSnzDvDdWB6w5FN1cA=" + [mod."github.com/go-viper/mapstructure/v2"] + version = "v2.5.0" + hash = "sha256-LbrCBANBprVI84M0CWrXc7rriJL5ac5VKbh58LBTw7U=" [mod."github.com/godbus/dbus"] version = "v0.0.0-20190726142602-4481cbc300e2" hash = "sha256-R7Gb9+Zjy80FbQSDGketoVEqfdOQKuOVTfWRjQ5kxZY=" [mod."github.com/gofrs/flock"] - version = "v0.8.1" - hash = "sha256-pm3JJjYx+DjthmmdnIZQ4PvvtUVlpUTGiucIvmNI0dY=" + version = "v0.12.1" + hash = "sha256-clC0E7x21vaNcDpnmbgn07KqVQdjHXqvwTRKwed5cjc=" [mod."github.com/gogo/googleapis"] version = "v1.4.1" hash = "sha256-4KgwVRIA6GOV/Lkv11c/vj2RMlgu4ZMjwJGeyb2DZC4=" [mod."github.com/gogo/protobuf"] version = "v1.3.2" hash = "sha256-pogILFrrk+cAtb0ulqn9+gRZJ7sGnnLLdtqITvxvG6c=" - [mod."github.com/golang/glog"] - version = "v1.2.0" - hash = "sha256-eCWkUlsWbHSjsuTw8HcNpj3KxT+QPvW5SSIv88hAsxA=" - [mod."github.com/golang/groupcache"] - version = "v0.0.0-20210331224755-41bb18bfe9da" - hash = "sha256-7Gs7CS9gEYZkbu5P4hqPGBpeGZWC64VDwraSKFF+VR0=" - [mod."github.com/golang/mock"] - version = "v1.6.0" - hash = "sha256-fWdnMQisRbiRzGT3ISrUHovquzLRHWvcv1JEsJFZRno=" [mod."github.com/golang/protobuf"] version = "v1.5.4" hash = "sha256-N3+Lv9lEZjrdOWdQhFj6Y3Iap4rVLEQeI8/eFFyAMZ0=" [mod."github.com/golang/snappy"] - version = "v0.0.5-0.20220116011046-fa5810519dcb" - hash = "sha256-4GVLPBwJIXYFJU+Uvoa/sb5VHea7yJhwE7feABa7ucs=" + version = "v1.0.0" + hash = "sha256-o/S91mX4ysjuG/oRHLs8qSyfb1Risf/YzMuW5u7d3U4=" [mod."github.com/google/btree"] - version = "v1.1.2" - hash = "sha256-K7V2obq3pLM71Mg0vhhHtZ+gtaubwXPQx3xcIyZDCjM=" + version = "v1.1.3" + hash = "sha256-/6Us2eNRFi2IIp7p5uPUXLridilAdk4SmZhcTYR0csw=" + [mod."github.com/google/flatbuffers"] + version = "v25.2.10+incompatible" + hash = "sha256-qWFf58zxZzIdn+5dB9VRbhYPcZb39tCG/ePfC9dgn3M=" [mod."github.com/google/go-cmp"] - version = "v0.6.0" - hash = "sha256-qgra5jze4iPGP0JSTVeY5qV5AvEnEu39LYAuUCIkMtg=" + version = "v0.7.0" + hash = "sha256-JbxZFBFGCh/Rj5XZ1vG94V2x7c18L8XKB0N9ZD5F2rM=" [mod."github.com/google/orderedcode"] version = "v0.0.1" hash = "sha256-KrExYovtUQrHGI1mPQf57jGw8soz7eWOC2xqEaV0uGk=" + [mod."github.com/google/pprof"] + version = "v0.0.0-20260115054156-294ebfa9ad83" + hash = "sha256-fhalKl/thSt1gdsHZmFyNGF1Gwxb0YLXV0pBv65EZjE=" [mod."github.com/google/s2a-go"] - version = "v0.1.7" - hash = "sha256-E+SX/3VmRI5qN7SbnRP4Tt+gQTq93pScpY9U2tTmIU0=" + version = "v0.1.9" + hash = "sha256-0AdSpSTso4bATmM/9qamWzKrVtOLDf7afvDhoiT/UpA=" [mod."github.com/google/uuid"] version = "v1.6.0" hash = "sha256-VWl9sqUzdOuhW0KzQlv0gwwUQClYkmZwSydHG2sALYw=" [mod."github.com/googleapis/enterprise-certificate-proxy"] - version = "v0.3.2" - hash = "sha256-wVuR3QC0mYFl5LNeKdRXdKdod7BGP5sv2h6VVib85v8=" + version = "v0.3.14" + hash = "sha256-yuNtkMq+gqN1vZ9alekxe47vAEbTCBHXO6Mwwv/lwrE=" [mod."github.com/googleapis/gax-go/v2"] - version = "v2.12.0" - hash = "sha256-ZcXS+1B11UaJHf8D15N3ZCh00fiMUncpHd+eNRffLZ4=" + version = "v2.22.0" + hash = "sha256-EEoIpOYGDuzhiQdhJcpjMs4mSb2oMw3uPYRhCHCESR0=" [mod."github.com/gorilla/handlers"] version = "v1.5.2" hash = "sha256-2WQeVCe7vQg+8MpNLMhOGsRdbrcWLpbtUhUX8mbiQrs=" @@ -345,50 +452,56 @@ schema = 3 version = "v1.8.1" hash = "sha256-nDABvAhlYgxUW2N/brrep7NkQXoSGcHhA+XI4+tK0F0=" [mod."github.com/gorilla/websocket"] - version = "v1.5.1" - hash = "sha256-eHZ/U+eeE5tSgWc1jEDuBwtTRbXKP9fqP9zfW4Zw8T0=" + version = "v1.5.3" + hash = "sha256-vTIGEFMEi+30ZdO6ffMNJ/kId6pZs5bbyqov8xe9BM0=" [mod."github.com/grpc-ecosystem/go-grpc-middleware"] version = "v1.4.0" hash = "sha256-0UymBjkg41C9MPqkBLz/ZY9WbimZrabpJk+8C/X63h8=" [mod."github.com/grpc-ecosystem/grpc-gateway"] version = "v1.16.0" hash = "sha256-wLymGic7wZ6fSiBYDAaGqnQ9Ste1fUWeqXeolZXCHvI=" + [mod."github.com/grpc-ecosystem/grpc-gateway/v2"] + version = "v2.28.0" + hash = "sha256-QeWb6jN6noeGPCzECgpUSb9YX9LzvKGwImEuX+A03gs=" [mod."github.com/gsterjov/go-libsecret"] version = "v0.0.0-20161001094733-a6f4afe4910c" hash = "sha256-Z5upjItPU9onq5t7VzhdQFp13lMJrSiE3gNRapuK6ic=" + [mod."github.com/hashicorp/aws-sdk-go-base/v2"] + version = "v2.0.0-beta.72" + hash = "sha256-Q1RQJJrLrBm8vND4QnvUX52hSKd6fHclwB0vM7kdkAc=" [mod."github.com/hashicorp/go-cleanhttp"] version = "v0.5.2" hash = "sha256-N9GOKYo7tK6XQUFhvhImtL7PZW/mr4C4Manx/yPVvcQ=" [mod."github.com/hashicorp/go-getter"] - version = "v1.7.3" - hash = "sha256-z3zrjcOsgJrZkGLwaKVauq/MFAPtulXatV/RrkKNJv4=" + version = "v1.8.6" + hash = "sha256-oN12gFUHqlF2J0h63wo8P1OSfuWeN8h4LJrBZvKHEvw=" [mod."github.com/hashicorp/go-hclog"] - version = "v1.5.0" - hash = "sha256-u3Jqg7Qex11IZ7vbk4hRGgLy6e0cF70CCx7ERF0GUHo=" + version = "v1.6.3" + hash = "sha256-BK2s+SH1tQyUaXCH4kC0/jgqiSu638UFbwamfKjFOYg=" [mod."github.com/hashicorp/go-immutable-radix"] version = "v1.3.1" hash = "sha256-65+A2HiVfS/GV9G+6/TkXXjzXhI/V98e6RlJWjxy+mg=" [mod."github.com/hashicorp/go-metrics"] - version = "v0.5.3" - hash = "sha256-5jQftEvEhL88yWeVnu+IZKzV5p9osZcgFmwP1zlrjzY=" + version = "v0.5.4" + hash = "sha256-WQGb38CuijG9YxHfqgKn1U655BmxLYhNXXdSw0MRiGc=" [mod."github.com/hashicorp/go-plugin"] - version = "v1.6.0" - hash = "sha256-NeY86Z+qJwt0NPV4cNmWDiTryDPSiyKMkS1ivRX9ThE=" - [mod."github.com/hashicorp/go-safetemp"] - version = "v1.0.0" - hash = "sha256-g5i9m7FSRInQzZ4iRpIsoUu685AY7fppUwjhuZCezT8=" + version = "v1.7.0" + hash = "sha256-nPTlKEssbp3/uDRZ2kkdO8z5mbu3j417Bra4FpBceHk=" + [mod."github.com/hashicorp/go-uuid"] + version = "v1.0.3" + hash = "sha256-8893qBbaug2yhxElowSrl3PrfhYlQ7cZ71QBgZWqpHE=" [mod."github.com/hashicorp/go-version"] - version = "v1.6.0" - hash = "sha256-UV0equpmW6BiJnp4W3TZlSJ+PTHuTA+CdOs2JTeHhjs=" + version = "v1.9.0" + hash = "sha256-sRr/50k8Wra0PJLCJgSkIxvR+ce3PItx4HpFvVijGYk=" [mod."github.com/hashicorp/golang-lru"] version = "v1.0.2" hash = "sha256-yy+5botc6T5wXgOe2mfNXJP3wr+MkVlUZ2JBkmmrA48=" - [mod."github.com/hashicorp/hcl"] - version = "v1.0.0" - hash = "sha256-xsRCmYyBfglMxeWUvTZqkaRLSW+V2FvNodEDjTGg1WA=" + [mod."github.com/hashicorp/golang-lru/v2"] + version = "v2.0.7" + hash = "sha256-t1bcXLgrQNOYUVyYEZ0knxcXpsTk4IuJZDjKvyJX75g=" [mod."github.com/hashicorp/yamux"] - version = "v0.1.1" - hash = "sha256-jr4ZFM3XHSwGoZcRcmmdGTq4IqxBTnimojIPDgK0USU=" + version = "v0.1.2" + hash = "sha256-JvpgwhqKAaS0PSlU/obe4tDJ2LcR1pyWRmJTkmT7hrA=" [mod."github.com/hdevalence/ed25519consensus"] version = "v0.2.0" hash = "sha256-KTbeKMOT/HCJjDHqyciQjJPPgpNk6H0VyQCCbeGgs7Y=" @@ -396,14 +509,14 @@ schema = 3 version = "v2.0.3" hash = "sha256-5VsJMQzJSNd4F7yAl3iF/q6JodWOlE4dUvTQ0UGPe+k=" [mod."github.com/holiman/uint256"] - version = "v1.2.2-0.20230321075855-87b91420868c" - hash = "sha256-Ek4KUYsFaAYfvnXJFLH4zFHQ6FzZGB+OsMIpjQ/kLGw=" + version = "v1.3.2" + hash = "sha256-R5ZNDTQy6ELF5Z6BLK/DeMg1JqEtPkDNfFi9XOKmncY=" [mod."github.com/huandu/skiplist"] - version = "v1.2.0" - hash = "sha256-/r4QP1SldMlhpkr1ZQFHImSYaeMZEtqBW7R53yN+JtQ=" + version = "v1.2.1" + hash = "sha256-7/e0UOuykDWTINMFPV/yMQaFrhZuKyM1c7OQbJ6Fiyw=" [mod."github.com/huin/goupnp"] - version = "v1.0.3" - hash = "sha256-EMGmTdoQhP2bVbCPX37hes5krqXn6NFexfnKr9E5u8I=" + version = "v1.3.0" + hash = "sha256-/VTfjUhHLGuXymYBC1vQJv1N8O1AjYwC/xTGd6h3Uw0=" [mod."github.com/iancoleman/strcase"] version = "v0.3.0" hash = "sha256-lVOk4klrikSCUviR16qcyAr6eoIbniUSfsLFOE1ZLpk=" @@ -413,18 +526,27 @@ schema = 3 [mod."github.com/inconshreveable/mousetrap"] version = "v1.1.0" hash = "sha256-XWlYH0c8IcxAwQTnIi6WYqq44nOKUylSWxWO/vi+8pE=" + [mod."github.com/ipfs/go-cid"] + version = "v0.5.0" + hash = "sha256-BuZKkcBXrnx7mM1c9SP4LdzZoaAoai9U49vITGrYJQk=" [mod."github.com/jackpal/go-nat-pmp"] version = "v1.0.2" hash = "sha256-L1D4Yoxnzihs795GZ+Q3AZsFP5c4iqyjTeyrudzPXtw=" - [mod."github.com/jmespath/go-jmespath"] - version = "v0.4.0" - hash = "sha256-xpT9g2qIXmPq7eeHUXHiDqJeQoHCudh44G/KCSFbcuo=" + [mod."github.com/jbenet/go-temp-err-catcher"] + version = "v0.1.0" + hash = "sha256-+SSoW7g/ADswuIS4AyVEp3+cH8KzByHlIJhLA6EUiFg=" [mod."github.com/jmhodges/levigo"] version = "v1.0.0" hash = "sha256-xEd0mDBeq3eR/GYeXjoTVb2sPs8sTCosn5ayWkcgENI=" [mod."github.com/klauspost/compress"] - version = "v1.17.7" - hash = "sha256-UkW+tAFEZYj067z9gXDQjQx0dCF8noCn5OSw/APh4oo=" + version = "v1.18.5" + hash = "sha256-H9b5iFJf4XbEnkGQCjGQAJ3aYhVDiolKrDewTbhuzQo=" + [mod."github.com/klauspost/cpuid/v2"] + version = "v2.3.0" + hash = "sha256-50JhbQyT67BK38HIdJihPtjV7orYp96HknI2VP7A9Yc=" + [mod."github.com/koron/go-ssdp"] + version = "v0.0.6" + hash = "sha256-zkEJzIaE67lPwHKn7Vp7cO5KATWQDQ1l+MpEcOOiHtU=" [mod."github.com/kr/pretty"] version = "v0.3.1" hash = "sha256-DlER7XM+xiaLjvebcIPiB12oVNjyZHuJHoRGITzzpKU=" @@ -432,137 +554,305 @@ schema = 3 version = "v0.2.0" hash = "sha256-fadcWxZOORv44oak3jTxm6YcITcFxdGt4bpn869HxUE=" [mod."github.com/lib/pq"] - version = "v1.10.7" - hash = "sha256-YPUv1VBZNFVUjFxQKdYd0Djje6KYYE99Hz6FnTfrmMw=" + version = "v1.12.0" + hash = "sha256-SJfVo5IyW7rb8O6CyrPoCPhrfqbDhw448VMxmTaVYWw=" [mod."github.com/libp2p/go-buffer-pool"] version = "v0.1.0" hash = "sha256-wQqGTtRWsfR9n0O/SXHVgECebbnNmHddxJIbG63OJBQ=" + [mod."github.com/libp2p/go-flow-metrics"] + version = "v0.2.0" + hash = "sha256-Bed+T9WyZzxznHxwjg3mz6c0MQ99kdMJNHEDHssndyU=" + [mod."github.com/libp2p/go-libp2p"] + version = "v0.47.0" + hash = "sha256-R2aGx9RguaNJJ5zba1Qp2UgTOU+qqccax70gOc7WnQE=" + [mod."github.com/libp2p/go-libp2p-asn-util"] + version = "v0.4.1" + hash = "sha256-J1+ePyBarLdD1cVo8B374xcfvcuOUUoJuDPQNQjWJLE=" + [mod."github.com/libp2p/go-msgio"] + version = "v0.3.0" + hash = "sha256-SYDQsX0WWRHSiytL6JDCPcbi6/edo0OQo9jpx2ZtrAA=" + [mod."github.com/libp2p/go-netroute"] + version = "v0.3.0" + hash = "sha256-htwlt7+0a5HkVrK3p3tyVAXSEjH/qJOsgc34x6c6MzE=" + [mod."github.com/libp2p/go-reuseport"] + version = "v0.4.0" + hash = "sha256-RenBCRxyp43IKCFWBuByriZLhifOmXkVcJCtwGN+UwQ=" + [mod."github.com/libp2p/go-yamux/v5"] + version = "v5.0.1" + hash = "sha256-rWJ194dlIICbTNPZrgUxMNk2IUypJkMMilg/UVp3XOQ=" [mod."github.com/linxGnu/grocksdb"] - version = "v1.8.14" - hash = "sha256-dT647UzB25Ye1Gv6b9JEtJZjuWKdJo4D8kw9cB0W8gA=" - [mod."github.com/magiconair/properties"] - version = "v1.8.7" - hash = "sha256-XQ2bnc2s7/IH3WxEO4GishZurMyKwEclZy1DXg+2xXc=" + version = "v1.10.7" + hash = "sha256-heU4fQSj9j8Tg1hVwFrBBXZ0SX0cqrLUvsQY6H3tpJM=" + [mod."github.com/lufia/plan9stats"] + version = "v0.0.0-20260330125221-c963978e514e" + hash = "sha256-BmFzkPZ+UeYgJom+1VesNiqIrTwKEGhUmYY0cWzAwfE=" [mod."github.com/manifoldco/promptui"] version = "v0.9.0" hash = "sha256-Fe2OPoyRExZejwtUBivKhfJAJW7o9b1eyYpgDlWQ1No=" + [mod."github.com/marten-seemann/tcp"] + version = "v0.0.0-20210406111302-dfbc87cc63fd" + hash = "sha256-/RfByluusNJhQBF560EP9URdoW6Mfvz0CsTI0vehA1A=" [mod."github.com/mattn/go-colorable"] - version = "v0.1.13" - hash = "sha256-qb3Qbo0CELGRIzvw7NVM1g/aayaz4Tguppk9MD2/OI8=" + version = "v0.1.14" + hash = "sha256-JC60PjKj7MvhZmUHTZ9p372FV72I9Mxvli3fivTbxuA=" [mod."github.com/mattn/go-isatty"] - version = "v0.0.20" - hash = "sha256-qhw9hWtU5wnyFyuMbKx+7RB8ckQaFQ8D+8GKPkN3HHQ=" + version = "v0.0.22" + hash = "sha256-6O/0jc33pKUzlzUGpH8Ekk54XgJvx6Qe7kJtbcNJAV4=" [mod."github.com/mattn/go-runewidth"] - version = "v0.0.9" - hash = "sha256-dK/kIPe1tcxEubwI4CWfov/HWRBgD/fqlPC3d5i30CY=" + version = "v0.0.15" + hash = "sha256-WP39EU2UrQbByYfnwrkBDoKN7xzXsBssDq3pNryBGm0=" + [mod."github.com/mdp/qrterminal/v3"] + version = "v3.2.1" + hash = "sha256-OqRnO3cSJfMZwOivLgWw0bozmUMaoPVsm/8R/GwyBh0=" + [mod."github.com/miekg/dns"] + version = "v1.1.66" + hash = "sha256-zpyZllOorCXRu+uhtWizfvDepvOt1pi1kYqjpPpPluo=" + [mod."github.com/mikioh/tcpinfo"] + version = "v0.0.0-20190314235526-30a79bb1804b" + hash = "sha256-7qDEv/9S7shWXzqbrZoIF1sXG45fwi08PRVCrujmbRQ=" + [mod."github.com/mikioh/tcpopt"] + version = "v0.0.0-20190314235656-172688c1accc" + hash = "sha256-Euf1BdkoiYc37obpR66425I1Xjn4wvO+cRz4mOsGueE=" [mod."github.com/minio/highwayhash"] - version = "v1.0.2" - hash = "sha256-UeHeepKtToyA5e/w3KdmpbCn+4medesZG0cAcU6P2cY=" + version = "v1.0.4" + hash = "sha256-GW5irfhrYqrhUOrBavARHslApXnWz3rVoU/PcphA6no=" + [mod."github.com/minio/sha256-simd"] + version = "v1.0.1" + hash = "sha256-4hfGDIQaWq8fvtGzHDhoK9v2IocXnJY7OAL6saMJbmA=" [mod."github.com/mitchellh/go-homedir"] version = "v1.1.0" hash = "sha256-oduBKXHAQG8X6aqLEpqZHs5DOKe84u6WkBwi4W6cv3k=" - [mod."github.com/mitchellh/go-testing-interface"] - version = "v1.14.1" - hash = "sha256-TMGi38D13BEVN5cpeKDzKRIgLclm4ErOG+JEyqJrN/c=" [mod."github.com/mitchellh/mapstructure"] version = "v1.5.0" hash = "sha256-ztVhGQXs67MF8UadVvG72G3ly0ypQW0IRDdOOkjYwoE=" + [mod."github.com/mr-tron/base58"] + version = "v1.2.0" + hash = "sha256-8FzMu3kHUbBX10pUdtGf59Ag7BNupx8ZHeUaodR1/Vk=" + [mod."github.com/mschoch/smat"] + version = "v0.2.0" + hash = "sha256-DZvUJXjIcta3U+zxzgU3wpoGn/V4lpBY7Xme8aQUi+E=" [mod."github.com/mtibben/percent"] version = "v0.2.1" hash = "sha256-Zj1lpCP6mKQ0UUTMs2By4LC414ou+iJzKkK+eBHfEcc=" + [mod."github.com/multiformats/go-base32"] + version = "v0.1.0" + hash = "sha256-O2IM7FB+Y9MkDdZztyQL5F8oEnmON2Yew7XkotQziio=" + [mod."github.com/multiformats/go-base36"] + version = "v0.2.0" + hash = "sha256-GKNnAGA0Lb39BDGYBm1ieKdXmho8Pu7ouyfVPXvV0PE=" + [mod."github.com/multiformats/go-multiaddr"] + version = "v0.16.1" + hash = "sha256-TtPUhA7qsNI0UOj/1x9rKBR1Z5wwuBVaMfbtLUCBzBw=" + [mod."github.com/multiformats/go-multiaddr-dns"] + version = "v0.4.1" + hash = "sha256-LKz0kL+QldrDfVGYaDrr3cv6Wpt+j0dIRnjVDcYCsCc=" + [mod."github.com/multiformats/go-multiaddr-fmt"] + version = "v0.1.0" + hash = "sha256-1SbQXGliO7tAaFoBD8mROaffxNaaKiRIjWmxD23GOIU=" + [mod."github.com/multiformats/go-multibase"] + version = "v0.2.0" + hash = "sha256-w+hp6u5bWyd34qe0CX+bq487ADqq6SgRR/JuqRB578s=" + [mod."github.com/multiformats/go-multicodec"] + version = "v0.9.1" + hash = "sha256-+iXntZND7VN+jVSDZVKAZCjVRCslmlIY2ESdq1h5ews=" + [mod."github.com/multiformats/go-multihash"] + version = "v0.2.3" + hash = "sha256-zqIIE5jMFzm+qhUrouSF+WdXGeHUEYIQvVnKWWU6mRs=" + [mod."github.com/multiformats/go-multistream"] + version = "v0.6.1" + hash = "sha256-SGKDLguuqlzo+zlhNQl4sdUYf/IsGWXJwPgRXUuKXNE=" + [mod."github.com/multiformats/go-varint"] + version = "v0.0.7" + hash = "sha256-To3Uuv7uSUJEr5OTwxE1LEIpA62xY3M/KKMNlscHmlA=" + [mod."github.com/munnerz/goautoneg"] + version = "v0.0.0-20191010083416-a7dc8b61c822" + hash = "sha256-79URDDFenmGc9JZu+5AXHToMrtTREHb3BC84b/gym9Q=" [mod."github.com/oasisprotocol/curve25519-voi"] - version = "v0.0.0-20230904125328-1f23a7beb09a" - hash = "sha256-N5MMNn4rytO3ObXVXoY34Sf7AGPkw2dTPkXjigjozls=" + version = "v0.0.0-20251114093237-2ab5a27a1729" + hash = "sha256-dETXsuUaJEwafc/y9Lbuj0oQ5Dae5WVl0SQxxz+42gw=" [mod."github.com/oklog/run"] - version = "v1.1.0" - hash = "sha256-U4IS0keJa4BSBSeEBqtIV1Zg6N4b0zFiKfzN9ua4pWQ=" + version = "v1.2.0" + hash = "sha256-cjt2KtX55AdhwTyxNXGMEvYORcFphCI6GUbeIrsmnas=" [mod."github.com/olekukonko/tablewriter"] version = "v0.0.5" hash = "sha256-/5i70IkH/qSW5KjGzv8aQNKh9tHoz98tqtL0K2DMFn4=" [mod."github.com/onsi/ginkgo/v2"] - version = "v2.7.0" - hash = "sha256-BKqQKCsPA73FaQwYpAY+QsWFHIncrG5jgRhC2IiNmCk=" + version = "v2.28.0" + hash = "sha256-p5cif8IrShko0DyGHkdjnDaHc+S8ZiQ9dKsOz8nogzQ=" [mod."github.com/onsi/gomega"] - version = "v1.26.0" - hash = "sha256-B18jsoJHK/oE+wudT0dOsUb41s5+ZIAu/ZBzQ5djOLE=" + version = "v1.39.1" + hash = "sha256-ZlbQhUVwQBzmhBWCQ9iPWoJOVr+OqqIHB4iCNDFMEds=" + [mod."github.com/pbnjay/memory"] + version = "v0.0.0-20210728143218-7b4eea64cf58" + hash = "sha256-QI+F1oPLOOtwNp8+m45OOoSfYFs3QVjGzE0rFdpF/IA=" [mod."github.com/pelletier/go-toml/v2"] - version = "v2.1.1" - hash = "sha256-BQtflYQ8Dt7FL/yFI9OnxwvsRk0oEO37ZXuGXFveVpo=" + version = "v2.2.4" + hash = "sha256-8qQIPldbsS5RO8v/FW/se3ZsAyvLzexiivzJCbGRg2Q=" [mod."github.com/petermattis/goid"] - version = "v0.0.0-20231207134359-e60b3f734c67" - hash = "sha256-73DbyhUTwYhqmvbcI96CNblTrfl6uz9OvM6z/h8j5TM=" + version = "v0.0.0-20260113132338-7c7de50cc741" + hash = "sha256-j+r+iDl3v2mae0ZMXES4JWFYh8e2oKDLr23YSjmwInQ=" + [mod."github.com/pion/datachannel"] + version = "v1.5.10" + hash = "sha256-67druailFGdnUOgCiZF4/PTSMjGk2gtKWivBLJItm3Y=" + [mod."github.com/pion/dtls/v2"] + version = "v2.2.12" + hash = "sha256-NLz6Aa6sg8sre7yKoiE0TdOtzyDxlnkYldByveCUNww=" + [mod."github.com/pion/dtls/v3"] + version = "v3.1.2" + hash = "sha256-eWgXdBDNk/9Tpi5M5dEq0lAWYWU+tbnDUVaiQyQTjFU=" + [mod."github.com/pion/ice/v4"] + version = "v4.0.10" + hash = "sha256-Yeq0XUDI264wOPhHWajoW2K3trwmyBOzHhzs/5uk5ic=" + [mod."github.com/pion/interceptor"] + version = "v0.1.40" + hash = "sha256-fDqDJ+0eNvAFe9/bpEKmCKS11ggOE8c0rVt5jYsH4QE=" + [mod."github.com/pion/logging"] + version = "v0.2.4" + hash = "sha256-S3bPblOkgYbRnbuC0YVTGUh3aCdaIHEQyoK+suhwYxk=" + [mod."github.com/pion/mdns/v2"] + version = "v2.0.7" + hash = "sha256-yFvSDSvahAcYfr/3OWm8RSqpwo+XcQyCjWMPcqHUvI8=" + [mod."github.com/pion/randutil"] + version = "v0.1.0" + hash = "sha256-jl6WfLPH7RV5MQhQtqwSDzhIL0D0eCnDT2L9uButveI=" + [mod."github.com/pion/rtcp"] + version = "v1.2.15" + hash = "sha256-rMel8k0zEsly3mz/BVo5dL6SFPE5zTeSu/NiAtieI7w=" + [mod."github.com/pion/rtp"] + version = "v1.8.19" + hash = "sha256-304C1jf0iJD3vWWxHexebPXS8hgctGaEPvyHhWZJd6E=" + [mod."github.com/pion/sctp"] + version = "v1.8.39" + hash = "sha256-1UI25+tR+2codUT0FaSHT0FazIAcJR5Ydd2V3j6KEZg=" + [mod."github.com/pion/sdp/v3"] + version = "v3.0.13" + hash = "sha256-WC3ZI1yVcHXOm/Ps7CmU10CprsQCQg9B/7nkiAdEbC0=" + [mod."github.com/pion/srtp/v3"] + version = "v3.0.6" + hash = "sha256-Yi/KmeAPnIuviwHJr6sCE7sMTGSeaODEOMEAcRqG/RU=" + [mod."github.com/pion/stun"] + version = "v0.6.1" + hash = "sha256-jgEt6Z/wkI+LmsGHBdc8rl3OU2eV8VYnYwml5kWywmA=" + [mod."github.com/pion/stun/v2"] + version = "v2.0.0" + hash = "sha256-ptqO5Q2UG6rm4AiAJsJ44gycR1OzFRtgNSns2GrQ/gY=" + [mod."github.com/pion/stun/v3"] + version = "v3.0.0" + hash = "sha256-1RmyYu6hRpJ8nPQD8zGXO5nFl5SdVXJKRGEggnhygB4=" + [mod."github.com/pion/transport/v2"] + version = "v2.2.10" + hash = "sha256-YTMWnXUqAsoigVg+D6xfEFJcXCwU7JYEJWQNG167Nr8=" + [mod."github.com/pion/transport/v3"] + version = "v3.0.7" + hash = "sha256-b/MToefdk4m28vw+3G4SECEbWP/jSBZRC5fDneaIvAk=" + [mod."github.com/pion/transport/v4"] + version = "v4.0.1" + hash = "sha256-hDHt5UUtdVB6EQuWjIg1s5PPyUTq2gY5sUpydVe87Ak=" + [mod."github.com/pion/turn/v4"] + version = "v4.0.2" + hash = "sha256-kFJImdexwp3AVlJuaIGdnRAJilzpgt1TGVpjuAAEq7M=" + [mod."github.com/pion/webrtc/v4"] + version = "v4.1.2" + hash = "sha256-LTa1i719OyUEbqN9OUl3mTvIvZx0j2w+apkzzkcONr4=" [mod."github.com/pkg/errors"] version = "v0.9.1" hash = "sha256-mNfQtcrQmu3sNg/7IwiieKWOgFQOVVe2yXgKBpe/wZw=" + [mod."github.com/planetscale/vtprotobuf"] + version = "v0.6.1-0.20240319094008-0393e58bdf10" + hash = "sha256-L8dyNm+PCRDNADiIGKZqsPkCgB4xpLrosZjssrN+sUY=" [mod."github.com/pmezard/go-difflib"] version = "v1.0.1-0.20181226105442-5d4384ee4fb2" hash = "sha256-XA4Oj1gdmdV/F/+8kMI+DBxKPthZ768hbKsO3d9Gx90=" + [mod."github.com/power-devops/perfstat"] + version = "v0.0.0-20240221224432-82ca36839d55" + hash = "sha256-ujzuJ1ttQgjHQJEij4O/2+I8DZaUVZQCQgA4ysfqulI=" [mod."github.com/prometheus/client_golang"] - version = "v1.19.0" - hash = "sha256-YV8sxMPR+xorTUCriTfcFsaV2b7PZfPJDQmOgUYOZJo=" + version = "v1.23.2" + hash = "sha256-3GD4fBFa1tJu8MS4TNP6r2re2eViUE+kWUaieIOQXCg=" [mod."github.com/prometheus/client_model"] - version = "v0.6.1" - hash = "sha256-rIDyUzNfxRA934PIoySR0EhuBbZVRK/25Jlc/r8WODw=" + version = "v0.6.2" + hash = "sha256-q6Fh6v8iNJN9ypD47LjWmx66YITa3FyRjZMRsuRTFeQ=" [mod."github.com/prometheus/common"] - version = "v0.52.2" - hash = "sha256-XQUvk9/Kwf9NDlDUVl7mOWRD7z7z9QEbLH/rNU4D2nI=" + version = "v0.67.5" + hash = "sha256-pDzmYsAANsaIf3W9HxpbgRnZ4BkPhJBBwzKq2E58FRw=" [mod."github.com/prometheus/procfs"] - version = "v0.13.0" - hash = "sha256-J31K36TkIiQU2EGOcmqDa+dkoKXiVuxafPVT4rKbEsg=" + version = "v0.20.1" + hash = "sha256-L6RuVGYgdBCCke8BibA7cXgfwizGE2pA0gNo9dGJ8WQ=" + [mod."github.com/quic-go/qpack"] + version = "v0.6.0" + hash = "sha256-xaxHnTKIZt1cHK5ZqTuSTOt5RNSjQB37GlrIgEGBskM=" + [mod."github.com/quic-go/quic-go"] + version = "v0.59.0" + hash = "sha256-PCXo4SV8kZ/aXXVaeRvkcJW42GO75P5/1O7UhtXS3Pk=" + [mod."github.com/quic-go/webtransport-go"] + version = "v0.10.0" + hash = "sha256-8VBcD+z08UY/TnxVEESF28015ludUOtguNTNa94X5Fo=" [mod."github.com/rcrowley/go-metrics"] - version = "v0.0.0-20201227073835-cf1acfcdf475" - hash = "sha256-10ytHQ1SpMKYTiKuOPdEMuOVa8HVvv9ryYSIF9BHEBI=" + version = "v0.0.0-20250401214520-65e299d6c5c9" + hash = "sha256-xTuRRrDpI/ANi/cvRMerx+gHP/ePGT0MxHHB5UXMVus=" + [mod."github.com/rivo/uniseg"] + version = "v0.2.0" + hash = "sha256-GLj0jiGrT03Ept4V6FXCN1yeZ/b6PpS3MEXK6rYQ8Eg=" [mod."github.com/rogpeppe/go-internal"] - version = "v1.12.0" - hash = "sha256-qvDNCe3l84/LgrA8X4O15e1FeDcazyX91m9LmXGXX6M=" + version = "v1.14.1" + hash = "sha256-6NzhXCCD1Qhj05WHbCDxH5hwfNM6psoAk7uIxm7N55E=" [mod."github.com/rs/cors"] - version = "v1.10.1" - hash = "sha256-um4INJM5/675MLK42npIsDbSQ1/Iy5ZiUNuAFReUfeM=" + version = "v1.11.1" + hash = "sha256-0z4aFR5VjuVYn+XnANbjui0ADcdG7gU56A9Y/NtrzCQ=" [mod."github.com/rs/zerolog"] - version = "v1.32.0" - hash = "sha256-9dZjtsES+wLp1cFiSVMuEUbdeXVFcgT0dgg5ACZkILk=" + version = "v1.35.0" + hash = "sha256-HMu0f8l3MQPH7gsm7rNZ7iJoWOgWcw+vEcnTgmEkwQA=" [mod."github.com/sagikazarmark/locafero"] - version = "v0.4.0" - hash = "sha256-7I1Oatc7GAaHgAqBFO6Tv4IbzFiYeU9bJAfJhXuWaXk=" - [mod."github.com/sagikazarmark/slog-shim"] - version = "v0.1.0" - hash = "sha256-F92BQXXmn3mCwu3mBaGh+joTRItQDSDhsjU6SofkYdA=" + version = "v0.11.0" + hash = "sha256-PUX8dzJtkD8YDZFNqpHnl4qgb0tE1W/DLnL7V+/d1z4=" [mod."github.com/sasha-s/go-deadlock"] - version = "v0.3.1" - hash = "sha256-2CBEi9/iN/OMt7wEIG+hRjgDH6CRWIgibGGGy1dQ78I=" + version = "v0.3.7" + hash = "sha256-so3Wdqil3jSojffuwKD4lfOFgTlz3ba0zqrnoSYS+AI=" [mod."github.com/shirou/gopsutil"] - version = "v3.21.4-0.20210419000835-c7a38de76ee5+incompatible" - hash = "sha256-oqIqyFquWabIE6DID6uTEc8oFEmM1rVu2ATn3toiCEg=" + version = "v3.21.11+incompatible" + hash = "sha256-tcH5zN94yZhKtg8wAUfojlqdyguifuPTBLPso3KF7QA=" + [mod."github.com/shirou/gopsutil/v4"] + version = "v4.26.4" + hash = "sha256-FOSzlSATJ7CIv2lHW9Z2zs0nQmN6xTeEUIO6MdLgaIY=" [mod."github.com/sourcegraph/conc"] - version = "v0.3.0" - hash = "sha256-mIdMs9MLAOBKf3/0quf1iI3v8uNWydy7ae5MFa+F2Ko=" + version = "v0.3.1-0.20240121214520-5f936abd7ae8" + hash = "sha256-AUNFlY6K7s1aoW/vb4pjK84ROdnVZY1i6cOmdeG+wN8=" + [mod."github.com/spaolacci/murmur3"] + version = "v1.1.0" + hash = "sha256-RWD4PPrlAsZZ8Xy356MBxpj+/NZI7w2XOU14Ob7/Y9M=" [mod."github.com/spf13/afero"] - version = "v1.11.0" - hash = "sha256-+rV3cDZr13N8E0rJ7iHmwsKYKH+EhV+IXBut+JbBiIE=" + version = "v1.15.0" + hash = "sha256-LhcezbOqfuBzacytbqck0hNUxi6NbWNhifUc5/9uHQ8=" [mod."github.com/spf13/cast"] - version = "v1.6.0" - hash = "sha256-hxioqRZfXE0AE5099wmn3YG0AZF8Wda2EB4c7zHF6zI=" + version = "v1.10.0" + hash = "sha256-dQ6Qqf26IZsa6XsGKP7GDuCj+WmSsBmkBwGTDfue/rk=" [mod."github.com/spf13/cobra"] - version = "v1.8.0" - hash = "sha256-oAE+fEaRfZPE541IPWE0GMeBBYgH2DMhtZNxzp7DFlY=" + version = "v1.10.2" + hash = "sha256-nbRCTFiDCC2jKK7AHi79n7urYCMP5yDZnWtNVJrDi+k=" [mod."github.com/spf13/pflag"] - version = "v1.0.5" - hash = "sha256-w9LLYzxxP74WHT4ouBspH/iQZXjuAh2WQCHsuvyEjAw=" + version = "v1.0.10" + hash = "sha256-uDPnWjHpSrzXr17KEYEA1yAbizfcsfo5AyztY2tS6ZU=" [mod."github.com/spf13/viper"] - version = "v1.18.2" - hash = "sha256-MXYbK6w1LEaoZ2/L/STF3WU1tbK+7NwGVxUCLKPkwks=" + version = "v1.21.0" + hash = "sha256-A9A8i7HH/ge4j3hw7G++HNj8BjhhpZKvxHhfY+QAxkI=" + [mod."github.com/spiffe/go-spiffe/v2"] + version = "v2.6.0" + hash = "sha256-8fvyGwDgSAFebzE1TA/cMTsFjH2CgxvHP5WoPfhw4Fk=" [mod."github.com/status-im/keycard-go"] - version = "v0.2.0" - hash = "sha256-UUiGmlgaIZDeMUJv3fdZBoQ9hJeSsg2ixRGmm6TgHug=" + version = "v0.3.3" + hash = "sha256-fHPRc6gyWiBhfRxEkKBVPf1LADuuSeSTkIztAJp+ZY8=" [mod."github.com/stretchr/objx"] version = "v0.5.2" hash = "sha256-VKYxrrFb1nkX6Wu3tE5DoP9+fCttwSl9pgLN6567nck=" [mod."github.com/stretchr/testify"] - version = "v1.9.0" - hash = "sha256-uUp/On+1nK+lARkTVtb5RxlW15zxtw2kaAFuIASA+J0=" + version = "v1.11.1" + hash = "sha256-sWfjkuKJyDllDEtnM8sb/pdLzPQmUYWYtmeWz/5suUc=" [mod."github.com/subosito/gotenv"] version = "v1.6.0" hash = "sha256-LspbjTniiq2xAICSXmgqP7carwlNaLqnCTQfw2pa80A=" + [mod."github.com/supranational/blst"] + version = "v0.3.16" + hash = "sha256-R4zABpBK/qAjKiMcr+YF4jR7/8jw6yxP+uRPRP7mI1A=" [mod."github.com/syndtr/goleveldb"] version = "v1.0.1-0.20210819022825-2ae1ddf74ef7" hash = "sha256-36a4hgVQfwtS2zhylKpQuFhrjdc/Y8pF0dxc26jcZIU=" @@ -571,135 +861,245 @@ schema = 3 version = "v0.16.0" hash = "sha256-JW4zO/0vMzf1dXLePOqaMtiLUZgNbuIseh9GV+jQlf0=" [mod."github.com/tidwall/btree"] - version = "v0.0.0-20240406140148-2687063b042c" - hash = "sha256-8eDLGHhw4qXG6MEa7w5Q9KLwOobXr8Vn5qqyQhuipQw=" - replaced = "github.com/crypto-org-chain/btree" + version = "v1.8.1" + hash = "sha256-QsYonFnbD/zaxUYAJMzDNI3ju0TjcBJrh8/DBhaJfbM=" [mod."github.com/tidwall/gjson"] - version = "v1.14.4" - hash = "sha256-3DS2YNL95wG0qSajgRtIABD32J+oblaKVk8LIw+KSOc=" + version = "v1.18.0" + hash = "sha256-CO6hqDu8Y58Po6A01e5iTpwiUBQ5khUZsw7czaJHw0I=" [mod."github.com/tidwall/match"] version = "v1.1.1" hash = "sha256-M2klhPId3Q3T3VGkSbOkYl/2nLHnsG+yMbXkPkyrRdg=" [mod."github.com/tidwall/pretty"] - version = "v1.2.0" - hash = "sha256-esRQGsn2Ee/CiySlwyuOICSLdqUkH4P7u8qXszos8Yc=" + version = "v1.2.1" + hash = "sha256-S0uTDDGD8qr415Ut7QinyXljCp0TkL4zOIrlJ+9OMl8=" [mod."github.com/tidwall/sjson"] version = "v1.2.5" hash = "sha256-OYGNolkmL7E1Qs2qrQ3IVpQp5gkcHNU/AB/z2O+Myps=" [mod."github.com/tklauser/go-sysconf"] - version = "v0.3.10" - hash = "sha256-Zf2NsgM9+HeM949vCce4HQtSbfUiFpeiQ716yKcFyx4=" + version = "v0.3.16" + hash = "sha256-hNVbsk0G+M9bLtHNywPD0nCW0z/9pM4jQV53nnDo/MY=" [mod."github.com/tklauser/numcpus"] - version = "v0.4.0" - hash = "sha256-ndE82nOb3agubhEV7aRzEqqTlN4DPbKFHEm2+XZLn8k=" + version = "v0.11.0" + hash = "sha256-ObydGqAvRiHwVfO2ytmL28pRHyuCWYWwjH4hWdgI/Vs=" + [mod."github.com/twitchyliquid64/golang-asm"] + version = "v0.15.1" + hash = "sha256-HLk6oUe7EoITrNvP0y8D6BtIgIcmDZYtb/xl/dufIoY=" [mod."github.com/tyler-smith/go-bip39"] version = "v1.1.0" hash = "sha256-3YhWBtSwRLGwm7vNwqumphZG3uLBW1vwT9QkQ8JuSjU=" [mod."github.com/ulikunitz/xz"] - version = "v0.5.11" - hash = "sha256-SUyrjc2wyN3cTGKe5JdBEXjtZC1rJySRxJHVUZ59row=" + version = "v0.5.15" + hash = "sha256-L5KYLue5U14bxUuNyhZ6lIjbda6eCQsx1V6gToqfRdk=" + [mod."github.com/wlynxg/anet"] + version = "v0.0.5" + hash = "sha256-F4JBxnY/O08YIwtjaMqEm0AV/fx42SeS7uGUhZHoQyc=" + [mod."github.com/yusufpapurcu/wmi"] + version = "v1.2.4" + hash = "sha256-N+YDBjOW59YOsZ2lRBVtFsEEi48KhNQRb63/0ZSU3bA=" + [mod."github.com/zondax/golem"] + version = "v0.27.0" + hash = "sha256-I2Sq9O2HdeL48c8EhBPv3QwDxtV/sjdiKGYZ9UHFfUQ=" [mod."github.com/zondax/hid"] version = "v0.9.2" hash = "sha256-9h1gEJ/loyaJvu9AsmslztiA8U9ixDTC6TBw9lCU2BE=" [mod."github.com/zondax/ledger-go"] - version = "v0.14.3" - hash = "sha256-tldEok5ebZ4R4B7H8dSlYS5oVuLvh89n9wUaVlDjYwg=" + version = "v1.0.1" + hash = "sha256-5esehBHnhgxGmcQSxJO+Zag/fW+HmWJAsagh5qQJ0v8=" [mod."go.etcd.io/bbolt"] - version = "v1.3.8" - hash = "sha256-ekKy8198B2GfPldHLYZnvNjID6x07dUPYKgFx84TgVs=" - [mod."go.opencensus.io"] - version = "v0.24.0" - hash = "sha256-4H+mGZgG2c9I1y0m8avF4qmt8LUKxxVsTqR8mKgP4yo=" + version = "v1.4.3" + hash = "sha256-ahFku15afu8YNTOAFR7v/MmKyxKhvv+ZwqrgP5lguNQ=" + [mod."go.opentelemetry.io/auto/sdk"] + version = "v1.2.1" + hash = "sha256-73bFYhnxNf4SfeQ52ebnwOWywdQbqc9lWawCcSgofvE=" + [mod."go.opentelemetry.io/contrib/bridges/otelslog"] + version = "v0.18.0" + hash = "sha256-m1iSWb89HFOPP1I8Zqb+p85ZMRrdlyAM9x6FjcW7DQ4=" + [mod."go.opentelemetry.io/contrib/detectors/gcp"] + version = "v1.43.0" + hash = "sha256-u+MgeLA1+ZbH9Y9C9WbIY8FEfmvbtM/SF1rDScGM1po=" [mod."go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"] - version = "v0.47.0" - hash = "sha256-D+bP2jEZcB4S8AprlDM3qAghYtxhqc8fSKZNac6WVFs=" + version = "v0.68.0" + hash = "sha256-u3x5NLbkkAUyrcKyxwX+LFOZOzH9TtzTRil5pPCv8sw=" + [mod."go.opentelemetry.io/contrib/instrumentation/host"] + version = "v0.68.0" + hash = "sha256-5XXwCfVD3i6B8zrpYwk4L7RJCwF17r/5lJ6uX8tWhUk=" [mod."go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"] - version = "v0.47.0" - hash = "sha256-Pv1X0oIWYXyVxEaDQmgYcw+49I9+65N9Y+1wbxoXOog=" + version = "v0.68.0" + hash = "sha256-n90fV18xmJMBnxzLF4S0rqEdAcAPmLl835eFGoQc3K8=" + [mod."go.opentelemetry.io/contrib/instrumentation/runtime"] + version = "v0.68.0" + hash = "sha256-ZdFTTjZeXTY9NPStostCiapQQ0Gg0xowvGgU1FmATr8=" + [mod."go.opentelemetry.io/contrib/otelconf"] + version = "v0.23.0" + hash = "sha256-RlqdHoPx5nTzfeLxtgkcIic3wXzY7tBoVLB3d4v5L/k=" + [mod."go.opentelemetry.io/contrib/propagators/autoprop"] + version = "v0.68.0" + hash = "sha256-Ni0X19WY0X1fWEOS7DQEvD9s11JrRitlDfUItd8pzlo=" + [mod."go.opentelemetry.io/contrib/propagators/aws"] + version = "v1.43.0" + hash = "sha256-+boviixSxnuyqUVkG9jui43Xt/Ry4VyqJY+sFbMReAU=" + [mod."go.opentelemetry.io/contrib/propagators/b3"] + version = "v1.43.0" + hash = "sha256-4SZoHVtz0ErybE1Ofj6xGvc25gW3FJ24++y9gKG8YJo=" + [mod."go.opentelemetry.io/contrib/propagators/jaeger"] + version = "v1.43.0" + hash = "sha256-7xZj3x7iu3yHtbYngtwjtzNNhMutTUf9LUNDKqEHkA8=" + [mod."go.opentelemetry.io/contrib/propagators/ot"] + version = "v1.43.0" + hash = "sha256-oJUlEiywS8JXOY0A/BUdrxBy70i904YrsmrbtMc1hbU=" [mod."go.opentelemetry.io/otel"] - version = "v1.22.0" - hash = "sha256-4K70RPjaPzPpTO/VkE9ueoSo9EANuNXneDR6jEiUaJQ=" + version = "v1.43.0" + hash = "sha256-oRemJUZhA7AzfUoBbRVA32u/XhMpipxLywHoJ1qsHBs=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc"] + version = "v0.19.0" + hash = "sha256-4R/vtaw7tAi8S+wCa8a8U3bAWOT9DXIFdUT9KWfysOc=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"] + version = "v0.19.0" + hash = "sha256-fPT9B5yAIEXYVGBi5gcc7emErpKGUZzY46TV68wCWJ0=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"] + version = "v1.43.0" + hash = "sha256-Ywq1bOmyuEY2FQ+0AqB39996DnGohg8UtFR/aJxRYSc=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"] + version = "v1.43.0" + hash = "sha256-w0aHW8rhDy5W8MuL7yekpJnEFxlIIjn7v9jyG4Jdql0=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlptrace"] + version = "v1.43.0" + hash = "sha256-caYRUaQ4DZGYtcUtH5kEkWXezDI4/vZRpUXpet3tQlg=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"] + version = "v1.43.0" + hash = "sha256-eb10xx3JrjEG+A6S0QUtS9/LKQm/HeJIjy4TippGiOM=" + [mod."go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"] + version = "v1.43.0" + hash = "sha256-wvXfMOb3dIVtNDrsxO+wlH3BJwN70t3p0X2EV/ubPjQ=" + [mod."go.opentelemetry.io/otel/exporters/stdout/stdoutlog"] + version = "v0.19.0" + hash = "sha256-pg2uKuO/qz8yTE8b1gTBzCq7i8/1Qd+ouB6zeuV/mHo=" + [mod."go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"] + version = "v1.43.0" + hash = "sha256-ygULgA8spJJotC/uog+xygtrJ67xXtUr3OJtKHiCq7M=" + [mod."go.opentelemetry.io/otel/exporters/stdout/stdouttrace"] + version = "v1.43.0" + hash = "sha256-ILr+FPHHhnLqVRNRlbLkKQE78jSZ/Ow7h9XE3G4LaaI=" + [mod."go.opentelemetry.io/otel/log"] + version = "v0.19.0" + hash = "sha256-bxaeA+aHA2VRrl4hfzomoadJyq34e6pzUvW9BLTtC/o=" [mod."go.opentelemetry.io/otel/metric"] - version = "v1.22.0" - hash = "sha256-Lb4wdlZNmz6Ut6CljBAePSUA8X0RBEOEDyOl2oO+pL8=" + version = "v1.43.0" + hash = "sha256-iUfx5AvN2oiqlh2v8/oFa+2jm8RX4kbb6X1EOKRyPPw=" + [mod."go.opentelemetry.io/otel/sdk"] + version = "v1.43.0" + hash = "sha256-Z1uTuALNhRXStiDl0UvYh9+XE2hd9OYe/bxCSuR78uE=" + [mod."go.opentelemetry.io/otel/sdk/log"] + version = "v0.19.0" + hash = "sha256-mV2lp63Qi6THZYNmWEBo6puRFdslx3meMC+Sv7vs3iU=" + [mod."go.opentelemetry.io/otel/sdk/metric"] + version = "v1.43.0" + hash = "sha256-8wIG4fqOYJSqlKRpLFze7HTaIptFq51nQXdMWLeGz2g=" [mod."go.opentelemetry.io/otel/trace"] - version = "v1.22.0" - hash = "sha256-38zzkmcoOzYYeDN+rC44HmwmdnalIcEpObCS6tIvMO8=" + version = "v1.43.0" + hash = "sha256-LLx1PjBGzDwZ3//Gp14R1DCMlnMCzFxnGYqVUz5jTmk=" + [mod."go.opentelemetry.io/proto/otlp"] + version = "v1.10.0" + hash = "sha256-IEnbR38ucFLTcuC2FA+gRvZNq2loUqXgDskSqP3+LUM=" + [mod."go.uber.org/dig"] + version = "v1.19.0" + hash = "sha256-/27soFu058DqVt8F4Yoq987lwqS+iz5n2bMGawclrfI=" + [mod."go.uber.org/fx"] + version = "v1.24.0" + hash = "sha256-AZxnrgAYFuud9V9tXjvoEeWlqMdZD0Af+Bn6hcz6XvQ=" + [mod."go.uber.org/mock"] + version = "v0.6.0" + hash = "sha256-m11cxIbrvOowa6xj11AztzfFk86DwR6SNO1lStcKzvo=" [mod."go.uber.org/multierr"] version = "v1.11.0" hash = "sha256-Lb6rHHfR62Ozg2j2JZy3MKOMKdsfzd1IYTR57r3Mhp0=" + [mod."go.uber.org/zap"] + version = "v1.27.1" + hash = "sha256-bn/MMu7X3GkUuW12Xwn9JYbOJeEu9+yoQtkmO+36xlQ=" + [mod."go.yaml.in/yaml/v2"] + version = "v2.4.4" + hash = "sha256-ecT2ZXw7iT+63J4210xA6sMz0fUFXmDzLwZe2FzaNFU=" + [mod."go.yaml.in/yaml/v3"] + version = "v3.0.4" + hash = "sha256-NkGFiDPoCxbr3LFsI6OCygjjkY0rdmg5ggvVVwpyDQ4=" + [mod."golang.org/x/arch"] + version = "v0.26.0" + hash = "sha256-xssXQRlEa2O2Dv4lfLsshYIn2r67nhBPOdvL58MnEXo=" [mod."golang.org/x/crypto"] - version = "v0.22.0" - hash = "sha256-2+u9nd32+Bi7EEv7QFc12CRTbfV7DApNv+yKIr7+lTw=" + version = "v0.51.0" + hash = "sha256-/R74sc1mcOaOuBeXRQzrXrHAgA5VhNWc6SfQJaxb17U=" [mod."golang.org/x/exp"] - version = "v0.0.0-20240404231335-c0f41cb1a7a0" - hash = "sha256-pBDEjILNDJVYAaUIPOoTwMetstVvMybVKtTvFbLM/tg=" + version = "v0.0.0-20260312153236-7ab1446f8b90" + hash = "sha256-q4a4MK4pVmaazKo9DTOwocH6Fvo8NsO96YeY9FJmNyo=" [mod."golang.org/x/mod"] - version = "v0.17.0" - hash = "sha256-CLaPeF6uTFuRDv4oHwOQE6MCMvrzkUjWN3NuyywZjKU=" + version = "v0.35.0" + hash = "sha256-ICEQxokHywOFInDPqoP+go9l1tZSz3roknF5SXPtNV4=" [mod."golang.org/x/net"] - version = "v0.24.0" - hash = "sha256-w1c21ljta5wNIyel9CSIn/crPzwOCRofNKhqmfs4aEQ=" + version = "v0.55.0" + hash = "sha256-Phi2mSmBGOJcvqPPAit3uqF3UP8SKRI9dHj6yTM3s5s=" [mod."golang.org/x/oauth2"] - version = "v0.18.0" - hash = "sha256-TX4CvtvHU+SGSmqlxaQqlgJjlJiOtLGYAZa0zeBfZak=" + version = "v0.36.0" + hash = "sha256-evS7WkMrpgonmTcqtWFpC5rSKZN8O+vnAhNUs1MS9kw=" [mod."golang.org/x/sync"] - version = "v0.7.0" - hash = "sha256-2ETllEu2GDWoOd/yMkOkLC2hWBpKzbVZ8LhjLu0d2A8=" + version = "v0.20.0" + hash = "sha256-ybcjhCfK6lroUM0yswUvWooW8MOQZBXyiSqoxG6Uy0Y=" [mod."golang.org/x/sys"] - version = "v0.19.0" - hash = "sha256-cmuL31TYLJmDm/fDnI2Sn0wB88cpdOHV1+urorsJWx4=" + version = "v0.45.0" + hash = "sha256-hkBoNazrDA67ER6sWhb+EKxx9nJ24+nz3zGy+zT5Hvw=" + [mod."golang.org/x/telemetry"] + version = "v0.0.0-20260409153401-be6f6cb8b1fa" + hash = "sha256-NH3t7QaWURhZnwukd4+/w2VdFYpaF0dFTyKlKXuuKew=" [mod."golang.org/x/term"] - version = "v0.19.0" - hash = "sha256-wFwEMwhtsr0C4mqjxukjMM7lxJLYPvb7gAPO95xyhyg=" + version = "v0.43.0" + hash = "sha256-gFV1oGgs/vpRamvDWmu93voN57iyZMk/hh+oL8L9VrQ=" [mod."golang.org/x/text"] - version = "v0.14.0" - hash = "sha256-yh3B0tom1RfzQBf1RNmfdNWF1PtiqxV41jW1GVS6JAg=" + version = "v0.37.0" + hash = "sha256-8XDOnlPIybcDRy89fkjG5VqtIt5Ku+LmaqYhgKl7i1E=" [mod."golang.org/x/time"] - version = "v0.5.0" - hash = "sha256-W6RgwgdYTO3byIPOFxrP2IpAZdgaGowAaVfYby7AULU=" + version = "v0.15.0" + hash = "sha256-5D24A65wn7k93Jj3+918UKjB9ccmGHPBEqjD2XDB92E=" [mod."golang.org/x/tools"] - version = "v0.20.0" - hash = "sha256-g5T5FrNPO/cf2W1lc+/93FcFB3HftPjqI72FueD9Wt8=" + version = "v0.44.0" + hash = "sha256-xuj5FLtSJsAojLLTLXtPdLAIFNTKoVFbDMuqRXmj2W4=" [mod."google.golang.org/api"] - version = "v0.162.0" - hash = "sha256-+AsT4DPjefEmPPelZoSHuQ8nCHhmhhUWU4UGnJ/8+fg=" - [mod."google.golang.org/appengine"] - version = "v1.6.8" - hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ=" + version = "v0.276.0" + hash = "sha256-qXHX3iYmJD3Pb1vaCaTwSoqvTdbnNljndShDM8sSJUM=" [mod."google.golang.org/genproto"] - version = "v0.0.0-20240227224415-6ceb2ff114de" - hash = "sha256-G+tvsCTXxzk3sS6HbBxPN1DYaN1tPOqKsa60mI05Feg=" + version = "v0.0.0-20260414002931-afd174a4e478" + hash = "sha256-4QLhCQDbid/KKlPNihJzxIaQ+JXimd7UOEBzGTnII3o=" [mod."google.golang.org/genproto/googleapis/api"] - version = "v0.0.0-20240227224415-6ceb2ff114de" - hash = "sha256-H3d2ZhPJI9RH5EK9NsxUAFmT6tr2DgGV9SjZgqJ80r4=" + version = "v0.0.0-20260414002931-afd174a4e478" + hash = "sha256-V8SVPC3gIhLNjH5k20RZY446llOBedAWkLvUIYVUXOg=" [mod."google.golang.org/genproto/googleapis/rpc"] - version = "v0.0.0-20240401170217-c3f982113cda" - hash = "sha256-P5SBku16dYnK4koUQxTeGwPxAAWH8rxbDm2pOzFLo/Q=" + version = "v0.0.0-20260414002931-afd174a4e478" + hash = "sha256-ldJTTb7hhj1mdmzTn9IEkQVwCoj3KRlENZtUSEKHABU=" [mod."google.golang.org/grpc"] - version = "v1.63.2" - hash = "sha256-RmtVjYLam97k7IHTHU7Gn16xNX+GvA9AiLKlQwOiZXU=" + version = "v1.80.0" + hash = "sha256-+p50KGJvGWdpB/4f0h477dCAfoOL5m2PzG8BGOekVgY=" [mod."google.golang.org/protobuf"] - version = "v1.33.0" - hash = "sha256-cWwQjtUwSIEkAlAadrlxK1PYZXTRrV4NKzt7xDpJgIU=" - [mod."gopkg.in/ini.v1"] - version = "v1.67.0" - hash = "sha256-V10ahGNGT+NLRdKUyRg1dos5RxLBXBk1xutcnquc/+4=" - [mod."gopkg.in/natefinch/npipe.v2"] - version = "v2.0.0-20160621034901-c1b8fa8bdcce" - hash = "sha256-ytqeVZqn4kd2uc65HvEjPlpPA2VnBmPfu5DsFlO0o+g=" + version = "v1.36.11" + hash = "sha256-7W+6jntfI/awWL3JP6yQedxqP5S9o3XvPgJ2XxxsIeE=" + [mod."gopkg.in/yaml.v2"] + version = "v2.4.0" + hash = "sha256-uVEGglIedjOIGZzHW4YwN1VoRSTK8o0eGZqzd+TNdd0=" [mod."gopkg.in/yaml.v3"] version = "v3.0.1" hash = "sha256-FqL9TKYJ0XkNwJFnq9j0VvJ5ZUU1RvH/52h/f5bkYAU=" [mod."gotest.tools/v3"] - version = "v3.5.1" - hash = "sha256-ps2GEc3P2xvlrU4TCtXz+nLTxyP0RrF7SScz5jUqE5E=" + version = "v3.5.2" + hash = "sha256-eAxnRrF2bQugeFYzGLOr+4sLyCPOpaTWpoZsIKNP1WE=" + [mod."lukechampine.com/blake3"] + version = "v1.4.1" + hash = "sha256-HaZGo9L44ptPsgxIhvKy3+0KZZm1+xt+cZC1rDQA9Yc=" [mod."nhooyr.io/websocket"] - version = "v1.8.10" - hash = "sha256-EsUWUFIA2uJTap1DfsYuSxlPMH3UHDpxEohJMalDOcI=" + version = "v1.8.17" + hash = "sha256-YIYdIz3KR3j3ykT/TSOoftwkCoZdX1/bUtlXm3RjfoQ=" [mod."pgregory.net/rapid"] - version = "v1.1.0" - hash = "sha256-sVQY9EQ9Y5blYyVYfaOa+y12e+399OqdHiEY3BaDnqo=" + version = "v1.3.0" + hash = "sha256-GmWX33UKjofHgHDw8QiwxSaeDjqT81Tb2m+ChtC+ueg=" + [mod."rsc.io/qr"] + version = "v0.2.0" + hash = "sha256-I3fAJwwZhIrgBbCjWvIElAE9JqG2y59KRBc78EYi3RM=" [mod."sigs.k8s.io/yaml"] - version = "v1.4.0" - hash = "sha256-Hd/M0vIfIVobDd87eb58p1HyVOjYWNlGq2bRXfmtVno=" + version = "v1.6.0" + hash = "sha256-49hg7IVPzwxeovp+HTMiWa/10NMMTSTjAdCmIv6p9dw=" diff --git a/indexer/kv_indexer.go b/indexer/kv_indexer.go index 7849418021..b9eb1e345d 100644 --- a/indexer/kv_indexer.go +++ b/indexer/kv_indexer.go @@ -19,7 +19,7 @@ import ( "fmt" errorsmod "cosmossdk.io/errors" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" abci "github.com/cometbft/cometbft/abci/types" tmtypes "github.com/cometbft/cometbft/types" dbm "github.com/cosmos/cosmos-db" @@ -70,6 +70,10 @@ func (kv *KVIndexer) IndexBlock(block *tmtypes.Block, txResults []*abci.ExecTxRe // record index of valid eth tx during the iteration var ethTxIndex int32 for txIndex, tx := range block.Txs { + txIdx, err := ethermint.SafeUint32(txIndex) + if err != nil { + return err + } result := txResults[txIndex] if !rpctypes.TxSuccessOrExceedsBlockGasLimit(result) { continue @@ -93,13 +97,17 @@ func (kv *KVIndexer) IndexBlock(block *tmtypes.Block, txResults []*abci.ExecTxRe var cumulativeGasUsed uint64 for msgIndex, msg := range tx.GetMsgs() { + msgIdx, err := ethermint.SafeUint32(msgIndex) + if err != nil { + return err + } ethMsg := msg.(*evmtypes.MsgEthereumTx) var txHash common.Hash txResult := ethermint.TxResult{ Height: height, - TxIndex: uint32(txIndex), - MsgIndex: uint32(msgIndex), + TxIndex: txIdx, + MsgIndex: msgIdx, EthTxIndex: ethTxIndex, } if result.Code != abci.CodeTypeOK { @@ -182,8 +190,16 @@ func TxHashKey(hash common.Hash) []byte { // TxIndexKey returns the key for db entry: `(block number, tx index) -> tx hash` func TxIndexKey(blockNumber int64, txIndex int32) []byte { - bz1 := sdk.Uint64ToBigEndian(uint64(blockNumber)) - bz2 := sdk.Uint64ToBigEndian(uint64(txIndex)) + value, err := ethermint.SafeUint64(blockNumber) + if err != nil { + panic(err) + } + bz1 := sdk.Uint64ToBigEndian(value) + value, err = ethermint.SafeInt32ToUint64(txIndex) + if err != nil { + panic(err) + } + bz2 := sdk.Uint64ToBigEndian(value) return append(append([]byte{KeyPrefixTxIndex}, bz1...), bz2...) } @@ -243,5 +259,5 @@ func parseBlockNumberFromKey(key []byte) (int64, error) { return 0, fmt.Errorf("wrong tx index key length, expect: %d, got: %d", TxIndexKeyLength, len(key)) } - return int64(sdk.BigEndianToUint64(key[1:9])), nil + return ethermint.SafeInt64(sdk.BigEndianToUint64(key[1:9])) } diff --git a/indexer/kv_indexer_test.go b/indexer/kv_indexer_test.go index ac0971ca06..f4e51ab3e4 100644 --- a/indexer/kv_indexer_test.go +++ b/indexer/kv_indexer_test.go @@ -4,7 +4,7 @@ import ( "math/big" "testing" - tmlog "cosmossdk.io/log" + tmlog "cosmossdk.io/log/v2" abci "github.com/cometbft/cometbft/abci/types" tmtypes "github.com/cometbft/cometbft/types" dbm "github.com/cosmos/cosmos-db" diff --git a/init.sh b/init.sh index 407a898595..ceeff523e4 100755 --- a/init.sh +++ b/init.sh @@ -1,90 +1,73 @@ #!/bin/bash -KEY="mykey" CHAINID="ethermint_9000-1" MONIKER="localtestnet" -KEYRING="test" -KEYALGO="eth_secp256k1" -LOGLEVEL="info" -# trace evm -TRACE="--trace" -# TRACE="" -# validate dependencies are installed -command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } +# localKey address 0x7cb61d4117ae31a12e393a1cfa3bac666481d02e +VAL_KEY="localkey" +VAL_MNEMONIC="gesture inject test cycle original hollow east ridge hen combine junk child bacon zero hope comfort vacuum milk pitch cage oppose unhappy lunar seat" -# remove existing daemon and client -rm -rf ~/.ethermintd* - -make install +# user1 address 0xc6fe5d33615a1c52c08018c47e8bc53646a0e101 +USER1_KEY="user1" +USER1_MNEMONIC="copper push brief egg scan entry inform record adjust fossil boss egg comic alien upon aspect dry avoid interest fury window hint race symptom" -ethermintd config keyring-backend $KEYRING -ethermintd config chain-id $CHAINID +# user2 address 0x963ebdf2e1f8db8707d05fc75bfeffba1b5bac17 +USER2_KEY="user2" +USER2_MNEMONIC="maximum display century economy unlock van census kite error heart snow filter midnight usage egg venture cash kick motor survey drastic edge muffin visual" -# if $KEY exists it should be deleted -ethermintd keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO - -# Set moniker and chain-id for Ethermint (Moniker can be anything, chain-id must be an integer) -ethermintd init $MONIKER --chain-id $CHAINID +# user3 address 0x40a0cb1C63e026A81B55EE1308586E21eec1eFa9 +USER3_KEY="user3" +USER3_MNEMONIC="will wear settle write dance topic tape sea glory hotel oppose rebel client problem era video gossip glide during yard balance cancel file rose" -# Change parameter token denominations to aphoton -cat $HOME/.ethermintd/config/genesis.json | jq '.app_state["staking"]["params"]["bond_denom"]="aphoton"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json -cat $HOME/.ethermintd/config/genesis.json | jq '.app_state["crisis"]["constant_fee"]["denom"]="aphoton"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json -cat $HOME/.ethermintd/config/genesis.json | jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="aphoton"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json -cat $HOME/.ethermintd/config/genesis.json | jq '.app_state["mint"]["params"]["mint_denom"]="aphoton"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json +# user4 address 0x498B5AeC5D439b733dC2F58AB489783A23FB26dA +USER4_KEY="user4" +USER4_MNEMONIC="doll midnight silk carpet brush boring pluck office gown inquiry duck chief aim exit gain never tennis crime fragile ship cloud surface exotic patch" -# Set gas limit in genesis -cat $HOME/.ethermintd/config/genesis.json | jq '.consensus_params["block"]["max_gas"]="20000000"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json +# remove existing daemon and client +rm -rf ~/.ethermint* -# Allocate genesis accounts (cosmos formatted addresses) -ethermintd genesis add-genesis-account $KEY 100000000000000000000000000aphoton --keyring-backend $KEYRING +# Import keys from mnemonics +echo $VAL_MNEMONIC | ethermintd keys add $VAL_KEY --recover --keyring-backend test --algo "eth_secp256k1" +echo $USER1_MNEMONIC | ethermintd keys add $USER1_KEY --recover --keyring-backend test --algo "eth_secp256k1" +echo $USER2_MNEMONIC | ethermintd keys add $USER2_KEY --recover --keyring-backend test --algo "eth_secp256k1" +echo $USER3_MNEMONIC | ethermintd keys add $USER3_KEY --recover --keyring-backend test --algo "eth_secp256k1" +echo $USER4_MNEMONIC | ethermintd keys add $USER4_KEY --recover --keyring-backend test --algo "eth_secp256k1" -# Sign genesis transaction -ethermintd genesis gentx $KEY 1000000000000000000000aphoton --keyring-backend $KEYRING --chain-id $CHAINID - -# Collect genesis tx -ethermintd genesis collect-gentxs +ethermintd init $MONIKER --chain-id $CHAINID -# Run this to ensure everything worked and that the genesis file is setup correctly -ethermintd genesis validate-genesis +# Set gas limit in genesis +cat $HOME/.ethermintd/config/genesis.json | jq '.consensus["params"]["block"]["max_gas"]="10000000"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json -# disable produce empty block and enable prometheus metrics +# modified default configs if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' 's/create_empty_blocks = true/create_empty_blocks = false/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/prometheus = false/prometheus = true/' $HOME/.ethermintd/config/config.toml sed -i '' 's/prometheus-retention-time = 0/prometheus-retention-time = 1000000000000/g' $HOME/.ethermintd/config/app.toml sed -i '' 's/enabled = false/enabled = true/g' $HOME/.ethermintd/config/app.toml + sed -i '' 's/prometheus = false/prometheus = true/' $HOME/.ethermintd/config/config.toml + sed -i '' 's/timeout_commit = "5s"/timeout_commit = "1s"/g' $HOME/.ethermintd/config/config.toml else sed -i 's/create_empty_blocks = true/create_empty_blocks = false/g' $HOME/.ethermintd/config/config.toml - sed -i 's/prometheus = false/prometheus = true/' $HOME/.ethermintd/config/config.toml sed -i 's/prometheus-retention-time = "0"/prometheus-retention-time = "1000000000000"/g' $HOME/.ethermintd/config/app.toml sed -i 's/enabled = false/enabled = true/g' $HOME/.ethermintd/config/app.toml + sed -i 's/prometheus = false/prometheus = true/' $HOME/.ethermintd/config/config.toml + sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/g' $HOME/.ethermintd/config/config.toml fi -if [[ $1 == "pending" ]]; then - echo "pending mode is on, please wait for the first block committed." - if [[ $OSTYPE == "darwin"* ]]; then - sed -i '' 's/create_empty_blocks_interval = "0s"/create_empty_blocks_interval = "30s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_propose = "3s"/timeout_propose = "30s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "5s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_prevote = "1s"/timeout_prevote = "10s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "5s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_precommit = "1s"/timeout_precommit = "10s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "5s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_commit = "5s"/timeout_commit = "150s"/g' $HOME/.ethermintd/config/config.toml - sed -i '' 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "150s"/g' $HOME/.ethermintd/config/config.toml - else - sed -i 's/create_empty_blocks_interval = "0s"/create_empty_blocks_interval = "30s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_propose = "3s"/timeout_propose = "30s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "5s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_prevote = "1s"/timeout_prevote = "10s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "5s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_precommit = "1s"/timeout_precommit = "10s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "5s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_commit = "5s"/timeout_commit = "150s"/g' $HOME/.ethermintd/config/config.toml - sed -i 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "150s"/g' $HOME/.ethermintd/config/config.toml - fi -fi +# Allocate genesis accounts (cosmos formatted addresses) +ethermintd genesis add-genesis-account "$(ethermintd keys show $VAL_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test +ethermintd genesis add-genesis-account "$(ethermintd keys show $USER1_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test +ethermintd genesis add-genesis-account "$(ethermintd keys show $USER2_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test +ethermintd genesis add-genesis-account "$(ethermintd keys show $USER3_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test +ethermintd genesis add-genesis-account "$(ethermintd keys show $USER4_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test + +# Sign genesis transaction +ethermintd genesis gentx $VAL_KEY 1000000000000000000stake --amount=1000000000000000000000aphoton --chain-id $CHAINID --keyring-backend test + +# Collect genesis tx +ethermintd genesis collect-gentxs + +# Run this to ensure everything worked and that the genesis file is setup correctly +ethermintd genesis validate-genesis # Start the node (remove the --pruning=nothing flag if historical queries are not needed) -ethermintd start --metrics --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable +ethermintd start --metrics --pruning=nothing --rpc.unsafe --keyring-backend test --log_level info --json-rpc.api eth,txpool,personal,net,debug,web3 --api.enable diff --git a/internal/origin/origin.go b/internal/origin/origin.go new file mode 100644 index 0000000000..8ed6acd3d0 --- /dev/null +++ b/internal/origin/origin.go @@ -0,0 +1,111 @@ +package origin + +import ( + "errors" + "fmt" + "net/url" + "strings" +) + +// Normalize returns the normalized origin string (scheme://host[:port]) or false if invalid. +func Normalize(origin string) (string, bool) { + trimmed := strings.TrimSpace(origin) + if trimmed == "" { + return "", false + } + parsed, err := url.Parse(trimmed) + if err != nil || parsed.Scheme == "" || parsed.Host == "" { + return "", false + } + + scheme := strings.ToLower(parsed.Scheme) + host := strings.ToLower(parsed.Hostname()) + if host == "" { + return "", false + } + if strings.Contains(host, ":") { + host = "[" + host + "]" + } + port := parsed.Port() + if port != "" { + if (scheme == "http" && port == "80") || (scheme == "https" && port == "443") { + port = "" + } + } + if port != "" { + host = host + ":" + port + } + + return scheme + "://" + host, true +} + +// BuildAllowlist builds the websocket origin allowlist from the provided slice. +// It returns (allowAll, allowedSet, errors). When the only non-empty entry is +// "*" it returns (true, nil, nil) indicating all origins are permitted. +// Errors are collected for invalid entries but valid entries are still kept. +func BuildAllowlist(origins []string) (bool, map[string]struct{}, []error) { + allowed := make(map[string]struct{}) + var errs []error + if len(origins) == 0 { + return false, allowed, nil + } + + trimmed := make([]string, 0, len(origins)) + for _, origin := range origins { + value := strings.TrimSpace(origin) + if value == "" { + continue + } + trimmed = append(trimmed, value) + } + + if len(trimmed) == 0 { + return false, allowed, nil + } + + if len(trimmed) == 1 && trimmed[0] == "*" { + return true, nil, nil + } + + for _, origin := range trimmed { + if origin == "*" { + errs = append(errs, errors.New("ws-origins '*' must be the only entry")) + continue + } + normalized, ok := Normalize(origin) + if !ok { + errs = append(errs, fmt.Errorf("invalid ws-origin %q", origin)) + continue + } + if _, exists := allowed[normalized]; exists { + continue + } + allowed[normalized] = struct{}{} + } + + return false, allowed, errs +} + +// IsAllowed reports whether the given origin header value is permitted. +// An empty origin is always allowed (non-browser clients). If allowAll is +// true every origin is accepted. Otherwise the origin is normalised and +// looked up in allowlist. +func IsAllowed(origin string, allowAll bool, allowlist map[string]struct{}) bool { + if origin == "" { + return true + } + if allowAll { + return true + } + if len(allowlist) == 0 { + return false + } + + normalized, ok := Normalize(origin) + if !ok { + return false + } + + _, ok = allowlist[normalized] + return ok +} diff --git a/internal/origin/origin_test.go b/internal/origin/origin_test.go new file mode 100644 index 0000000000..e61621b100 --- /dev/null +++ b/internal/origin/origin_test.go @@ -0,0 +1,193 @@ +package origin + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestNormalize(t *testing.T) { + tests := []struct { + name string + input string + wantOut string + wantValid bool + }{ + { + name: "empty", + input: "", + wantValid: false, + }, + { + name: "whitespaceOnly", + input: " ", + wantValid: false, + }, + { + name: "noScheme", + input: "example.com", + wantValid: false, + }, + { + name: "noHost", + input: "http://", + wantValid: false, + }, + { + name: "simple", + input: "http://example.com", + wantOut: "http://example.com", + wantValid: true, + }, + { + name: "uppercaseSchemeAndHost", + input: "HTTP://EXAMPLE.COM", + wantOut: "http://example.com", + wantValid: true, + }, + { + name: "trailingSlash", + input: "http://example.com/", + wantOut: "http://example.com", + wantValid: true, + }, + { + name: "withPath", + input: "http://example.com/some/path", + wantOut: "http://example.com", + wantValid: true, + }, + { + name: "leadingTrailingSpace", + input: " http://example.com ", + wantOut: "http://example.com", + wantValid: true, + }, + { + name: "httpDefaultPort80Stripped", + input: "http://example.com:80", + wantOut: "http://example.com", + wantValid: true, + }, + { + name: "httpsDefaultPort443Stripped", + input: "https://example.com:443", + wantOut: "https://example.com", + wantValid: true, + }, + { + name: "nonDefaultPortKept", + input: "http://example.com:8080", + wantOut: "http://example.com:8080", + wantValid: true, + }, + { + name: "httpsNonDefaultPort", + input: "https://example.com:8443", + wantOut: "https://example.com:8443", + wantValid: true, + }, + { + name: "websocketScheme", + input: "ws://example.com", + wantOut: "ws://example.com", + wantValid: true, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, ok := Normalize(tc.input) + require.Equal(t, tc.wantValid, ok) + require.Equal(t, tc.wantOut, got) + }) + } +} + +func TestBuildAllowlist(t *testing.T) { + t.Run("empty", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist(nil) + require.False(t, allowAll) + require.Len(t, origins, 0) + require.Empty(t, errs) + }) + + t.Run("allWhitespace", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist([]string{" ", ""}) + require.False(t, allowAll) + require.Len(t, origins, 0) + require.Empty(t, errs) + }) + + t.Run("star", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist([]string{"*"}) + require.True(t, allowAll) + require.Nil(t, origins) + require.Empty(t, errs) + }) + + t.Run("starMixedWithOthers", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist([]string{"*", "http://example.com"}) + require.False(t, allowAll) + require.NotNil(t, origins) + require.Len(t, origins, 1) + require.NotEmpty(t, errs) + }) + + t.Run("normalizes", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist([]string{" HTTP://Example.COM ", "http://example.com/"}) + require.False(t, allowAll) + require.Len(t, origins, 1) + _, ok := origins["http://example.com"] + require.True(t, ok) + require.Empty(t, errs) + }) + + t.Run("invalidOrigin", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist([]string{"not a url"}) + require.False(t, allowAll) + require.NotNil(t, origins) + require.Len(t, origins, 0) + require.NotEmpty(t, errs) + }) + + t.Run("mixValidAndInvalid", func(t *testing.T) { + allowAll, origins, errs := BuildAllowlist([]string{"http://valid.example", "not-a-url"}) + require.False(t, allowAll) + require.Len(t, origins, 1) + _, ok := origins["http://valid.example"] + require.True(t, ok) + require.Len(t, errs, 1) + }) +} + +func TestIsAllowed(t *testing.T) { + t.Run("emptyOriginAlwaysAllowed", func(t *testing.T) { + require.True(t, IsAllowed("", false, map[string]struct{}{})) + require.True(t, IsAllowed("", true, nil)) + }) + + t.Run("allowAll", func(t *testing.T) { + require.True(t, IsAllowed("http://any.example", true, nil)) + require.True(t, IsAllowed("http://any.example", true, map[string]struct{}{})) + }) + + t.Run("emptyAllowlistBlocksNonEmpty", func(t *testing.T) { + require.False(t, IsAllowed("http://example.com", false, map[string]struct{}{})) + }) + + t.Run("allowlistEnforced", func(t *testing.T) { + allowlist := map[string]struct{}{ + "http://allowed.example": {}, + } + require.True(t, IsAllowed("http://allowed.example", false, allowlist)) + require.True(t, IsAllowed("HTTP://ALLOWED.EXAMPLE:80/", false, allowlist)) + require.False(t, IsAllowed("http://blocked.example", false, allowlist)) + }) + + t.Run("invalidOriginBlocked", func(t *testing.T) { + allowlist := map[string]struct{}{ + "http://allowed.example": {}, + } + require.False(t, IsAllowed("not-a-url", false, allowlist)) + }) +} diff --git a/networks/local/ethermintnode/Dockerfile b/networks/local/ethermintnode/Dockerfile index 15e72bebaa..d3d3106b51 100644 --- a/networks/local/ethermintnode/Dockerfile +++ b/networks/local/ethermintnode/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:stretch as build-env +FROM golang:1.25.8 as build-env # Install minimum necessary dependencies ENV PACKAGES curl make git libc-dev bash gcc @@ -15,7 +15,7 @@ COPY . . RUN make build-linux # Final image -FROM golang:1.19 as final +FROM golang:1.25.8 as final WORKDIR / @@ -28,4 +28,4 @@ COPY --from=build-env /go/src/github.com/evmos/ethermint/scripts/start-docker.sh EXPOSE 26656 26657 1317 8545 8546 # Run ethermintd by default, omit entrypoint to ease using container with ethermintd -ENTRYPOINT ["/bin/bash", "-c"] \ No newline at end of file +ENTRYPOINT ["/bin/bash", "-c"] diff --git a/nix/build_overlay.nix b/nix/build_overlay.nix new file mode 100644 index 0000000000..fbd8ed8d4f --- /dev/null +++ b/nix/build_overlay.nix @@ -0,0 +1,3 @@ +# some basic overlays necessary for the build +final: super: { +} diff --git a/nix/default.nix b/nix/default.nix index f3f6433c9b..eda0977442 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,30 +1,153 @@ -{ sources ? import ./sources.nix, system ? builtins.currentSystem, ... }: +{ + sources ? import ./sources.nix, + system ? builtins.currentSystem, + ... +}: +let + # Bootstrap nixpkgs (without overlays) just to get applyPatches. + # Used to patch poetry2nix's vendored pep599.nix to add the missing + # riscv64 entry (some Python packages now ship riscv64 wheels, which + # this older poetry2nix doesn't know how to evaluate). + bootstrapPkgs = import sources.nixpkgs { inherit system; }; + patchedPoetry2nix = bootstrapPkgs.applyPatches { + name = "poetry2nix-with-riscv64"; + src = sources.poetry2nix; + postPatch = '' + substituteInPlace vendor/pyproject.nix/lib/pep599.nix \ + --replace 'manyLinuxTargetMachines = {' \ + 'manyLinuxTargetMachines = { riscv64 = "riscv64";' + ''; + }; + # Patch gomod2nix's symlink builder to handle split-module monorepos where + # a root module and its sub-modules share a vendor path prefix. + # E.g. github.com/aws/aws-sdk-go-v2 (root) + aws-sdk-go-v2/config (sub-module) + # both need entries under vendor/github.com/aws/aws-sdk-go-v2/. + # + # The naive "symlink whole module dir" approach fails because sub-module + # MkdirAll creates the parent as a real directory before the root module + # can claim it as a symlink. The original skip-if-exists patch fixed the + # "file exists" panic but silently dropped root module content. + # + # This patch appends symlinkOrMerge directly into symlink.go (the only file + # compiled by gomod2nix-symlink.drv) and replaces os.Symlink with it: + # - dst missing → create symlink as usual + # - dst is a symlink → skip (already claimed by another module) + # - dst is a dir → recurse and symlink each top-level src entry + # + # Upstream issue is unfixed as of nix-community/gomod2nix@514283ec. + gomod2nixMergeFunc = bootstrapPkgs.writeText "symlink-merge-func" '' + + func symlinkOrMerge(src, dst string) error { + dstInfo, dstErr := os.Lstat(dst) + if dstErr != nil { + return os.Symlink(src, dst) + } + if dstInfo.Mode()&os.ModeSymlink != 0 { + return nil + } + srcInfo, srcErr := os.Lstat(src) + if srcErr != nil || !srcInfo.IsDir() { + return nil + } + entries, err := os.ReadDir(src) + if err != nil { + return err + } + for _, entry := range entries { + if err := symlinkOrMerge( + src+"/"+entry.Name(), + dst+"/"+entry.Name(), + ); err != nil { + return err + } + } + return nil + } + ''; + patchedGomod2nix = bootstrapPkgs.applyPatches { + name = "gomod2nix-symlink-merge"; + src = sources.gomod2nix; + postPatch = '' + cat ${gomod2nixMergeFunc} >> builder/symlink/symlink.go + substituteInPlace builder/symlink/symlink.go \ + --replace-fail \ + $'\t\tif err := os.Symlink(innerSrc, dst); err != nil {\n' \ + $'\t\tif err := symlinkOrMerge(innerSrc, dst); err != nil {\n' + ''; + }; +in import sources.nixpkgs { overlays = [ - (_: pkgs: { + (import ./build_overlay.nix) + (final: super: { flake-compat = import sources.flake-compat; - go = pkgs.go_1_22; - go-ethereum = pkgs.callPackage ./go-ethereum.nix { - inherit (pkgs.darwin) libobjc; - inherit (pkgs.darwin.apple_sdk.frameworks) IOKit; - buildGoModule = pkgs.buildGo120Module; + # nixpkgs 25.11 already aliases go = go_1_25 (1.25.9) and buildGoModule = buildGo125Module + go-ethereum = final.callPackage ./go-ethereum.nix { + # Skip darwin-specific dependencies to avoid apple_sdk_11_0 errors in nixpkgs 25.11 + libobjc = null; + IOKit = null; }; + golangci-lint = final.callPackage ./golangci-lint.nix { }; }) # update to a version that supports eip-1559 - (import "${sources.poetry2nix}/overlay.nix") - (import "${sources.gomod2nix}/overlay.nix") - (pkgs: _: + (import "${patchedPoetry2nix}/overlay.nix") + # Fix poetry2nix compatibility with nixpkgs 25.11 - override fetchCargoTarball usage + (final: prev: { + poetry2nix = prev.poetry2nix.overrideScope ( + p2nFinal: p2nPrev: { + defaultPoetryOverrides = p2nPrev.defaultPoetryOverrides.extend ( + pyFinal: pyPrev: { + # Override rpds-py to use fetchCargoVendor instead of fetchCargoTarball + rpds-py = pyPrev.rpds-py.overridePythonAttrs ( + old: + if old.src.isWheel or false then + { } + else + { + cargoDeps = final.rustPlatform.fetchCargoVendor { + inherit (old) src; + name = "${old.pname}-${old.version}-cargo-vendor.tar.gz"; + hash = "sha256-npvJz6PMHWzPkI0LVNeiMsZVxmwR6uzjlhBPMCCrFfw="; + }; + } + ); + } + ); + } + ); + }) + # Custom gomod2nix overlay that avoids darwin.apple_sdk_11_0 reference + ( + final: prev: + let + gomodSrc = patchedGomod2nix; + callPackage = final.callPackage; + gomodBuilder = callPackage "${gomodSrc}/builder" { }; + in + { + inherit (gomodBuilder) buildGoApplication mkGoEnv mkVendorEnv; + gomod2nix = (callPackage "${gomodSrc}/default.nix" { }).overrideAttrs (_: { + modRoot = "."; + }); + } + ) + ( + pkgs: _: import ./scripts.nix { inherit pkgs; config = { ethermint-config = ../scripts/ethermint-devnet.yaml; geth-genesis = ../scripts/geth-genesis.json; - dotenv = builtins.path { name = "dotenv"; path = ../scripts/env; }; + dotenv = builtins.path { + name = "dotenv"; + path = ../scripts/env; + }; }; - }) + } + ) (_: pkgs: { test-env = pkgs.callPackage ./testenv.nix { }; }) (_: pkgs: { - cosmovisor = pkgs.buildGo120Module rec { + cosmovisor = pkgs.buildGoModule rec { name = "cosmovisor"; src = sources.cosmos-sdk + "/cosmovisor"; subPackages = [ "./cmd/cosmovisor" ]; diff --git a/nix/go-ethereum.nix b/nix/go-ethereum.nix index 74280075ed..ddb30961a9 100644 --- a/nix/go-ethereum.nix +++ b/nix/go-ethereum.nix @@ -1,4 +1,12 @@ -{ lib, stdenv, buildGoModule, fetchFromGitHub, libobjc, IOKit, nixosTests }: +{ + lib, + stdenv, + buildGoModule, + fetchFromGitHub, + libobjc, + IOKit, + nixosTests, +}: let # A list of binaries to put into separate outputs @@ -7,18 +15,22 @@ let "clef" ]; -in buildGoModule rec { +in +buildGoModule rec { pname = "go-ethereum"; - version = "1.11.6"; + # Use the old estimateGas implementation + # https://github.com/crypto-org-chain/go-ethereum/commits/release/1.16-estimateGas/ + version = "84de8af25c3e0915a69838b0ecb8e683d3b6ea53"; src = fetchFromGitHub { - owner = "ethereum"; + owner = "crypto-org-chain"; repo = pname; - rev = "v${version}"; - sha256 = "sha256-mZ11xan3MGgaUORbiQczKrXSrxzjvQMhZbpHnEal11Y="; + rev = version; + sha256 = "sha256-Zo3AnEDSu0qjBbftEkUEedrPwDIWf0P6gzLIWSil7gQ="; }; - vendorHash = "sha256-rjSGR2ie5sFK2OOo4HUZ6+hrDlQuUDtyTKn0sh8jFBY="; + proxyVendor = true; + vendorHash = "sha256-KP9oD87kn8MCvEf3ply8HbP8xIBlGAEtthGob8Yh++A="; doCheck = false; @@ -26,21 +38,22 @@ in buildGoModule rec { # Move binaries to separate outputs and symlink them back to $out postInstall = lib.concatStringsSep "\n" ( - builtins.map (bin: "mkdir -p \$${bin}/bin && mv $out/bin/${bin} \$${bin}/bin/ && ln -s \$${bin}/bin/${bin} $out/bin/") bins + builtins.map ( + bin: + "mkdir -p \$${bin}/bin && mv $out/bin/${bin} \$${bin}/bin/ && ln -s \$${bin}/bin/${bin} $out/bin/" + ) bins ); subPackages = [ "cmd/abidump" "cmd/abigen" - "cmd/bootnode" - "cmd/checkpoint-admin" + "cmd/blsync" "cmd/clef" "cmd/devp2p" + "cmd/era" "cmd/ethkey" "cmd/evm" - "cmd/faucet" "cmd/geth" - "cmd/p2psim" "cmd/rlpdump" "cmd/utils" ]; @@ -49,15 +62,29 @@ in buildGoModule rec { tags = [ "urfave_cli_no_docs" ]; # Fix for usb-related segmentation faults on darwin - propagatedBuildInputs = - lib.optionals stdenv.isDarwin [ libobjc IOKit ]; + propagatedBuildInputs = lib.optionals (stdenv.isDarwin && libobjc != null && IOKit != null) [ + libobjc + IOKit + ]; + + # Add missing dependencies for HID support on Darwin + buildInputs = lib.optionals (stdenv.isDarwin && libobjc != null && IOKit != null) [ + libobjc + IOKit + ]; passthru.tests = { inherit (nixosTests) geth; }; meta = with lib; { homepage = "https://geth.ethereum.org/"; description = "Official golang implementation of the Ethereum protocol"; - license = with licenses; [ lgpl3Plus gpl3Plus ]; - maintainers = with maintainers; [ adisbladis RaghavSood ]; + license = with licenses; [ + lgpl3Plus + gpl3Plus + ]; + maintainers = with maintainers; [ + adisbladis + RaghavSood + ]; }; -} \ No newline at end of file +} diff --git a/nix/golangci-lint.nix b/nix/golangci-lint.nix new file mode 100644 index 0000000000..0c1e89ce63 --- /dev/null +++ b/nix/golangci-lint.nix @@ -0,0 +1,51 @@ +{ + buildGoModule, + fetchFromGitHub, + lib, + installShellFiles, +}: + +buildGoModule rec { + pname = "golangci-lint"; + version = "2.1.6"; + + src = fetchFromGitHub { + owner = "golangci"; + repo = "golangci-lint"; + rev = "v${version}"; + hash = "sha256-L0TsVOUSU+nfxXyWsFLe+eU4ZxWbW3bHByQVatsTpXA="; + }; + + vendorHash = "sha256-tYoAUumnHgA8Al3jKjS8P/ZkUlfbmmmBcJYUR7+5u9w="; + + subPackages = [ "cmd/golangci-lint" ]; + + nativeBuildInputs = [ installShellFiles ]; + + ldflags = [ + "-s" + "-w" + "-X main.version=${version}" + "-X main.commit=v${version}" + "-X main.date=19700101-00:00:00" + ]; + + postInstall = '' + for shell in bash zsh fish; do + HOME=$TMPDIR $out/bin/golangci-lint completion $shell > golangci-lint.$shell + installShellCompletion golangci-lint.$shell + done + ''; + + meta = with lib; { + description = "Fast linters Runner for Go"; + homepage = "https://golangci-lint.run/"; + changelog = "https://github.com/golangci/golangci-lint/blob/v${version}/CHANGELOG.md"; + mainProgram = "golangci-lint"; + license = licenses.gpl3Plus; + maintainers = with maintainers; [ + SuperSandro2000 + mic92 + ]; + }; +} diff --git a/nix/scripts.nix b/nix/scripts.nix index 131f8d3122..8568aea435 100644 --- a/nix/scripts.nix +++ b/nix/scripts.nix @@ -1,7 +1,9 @@ -{ pkgs -, config -, ethermint ? (import ../. { inherit pkgs; }) -}: rec { +{ + pkgs, + config, + ethermint ? (import ../. { inherit pkgs; }), +}: +rec { start-ethermint = pkgs.writeShellScriptBin "start-ethermint" '' # rely on environment to provide ethermintd export PATH=${pkgs.test-env}/bin:$PATH @@ -14,6 +16,9 @@ ''; start-scripts = pkgs.symlinkJoin { name = "start-scripts"; - paths = [ start-ethermint start-geth ]; + paths = [ + start-ethermint + start-geth + ]; }; } diff --git a/nix/sources.json b/nix/sources.json index 054b1ea6e1..227e0a9dd3 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -11,16 +11,28 @@ "url": "https://github.com/cosmos/cosmos-sdk/archive/b6c77e6c819f8a51166649eaef125d1bfb276f04.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, + "flake-compat": { + "branch": "master", + "description": null, + "homepage": null, + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "sha256": "1qc703yg0babixi6wshn5wm2kgl5y1drcswgszh4xxzbrwkk9sv7", + "type": "tarball", + "url": "https://github.com/edolstra/flake-compat/archive/b4a34015c698c7793d592d66adbab377907a2be8.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, "gomod2nix": { "branch": "master", "description": "Convert applications using Go modules to Nix expressions", "homepage": null, "owner": "nix-community", "repo": "gomod2nix", - "rev": "30e3c3a9ec4ac8453282ca7f67fca9e1da12c3e6", - "sha256": "1m0q0p1xidsp61xfrbj8ld1dqk3fhyrfifxj2ks36yjbnzmi1x69", + "rev": "514283ec89c39ad0079ff2f3b1437404e4cba608", + "sha256": "tPsqU00FhgdFr0JiQUiBMgPVbl1jbPCY5gbFiJycL3I=", "type": "tarball", - "url": "https://github.com/nix-community/gomod2nix/archive/30e3c3a9ec4ac8453282ca7f67fca9e1da12c3e6.tar.gz", + "url": "https://github.com/nix-community/gomod2nix/archive/514283ec89c39ad0079ff2f3b1437404e4cba608.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "niv": { @@ -36,15 +48,15 @@ "url_template": "https://github.com///archive/.tar.gz" }, "nixpkgs": { - "branch": "nixpkgs-unstable", + "branch": "nixos-25.11", "description": "Nix Packages collection", "homepage": "", "owner": "NixOS", "repo": "nixpkgs", - "rev": "86ef6bd96b6279e1a4a53236d341f5df1ede3803", - "sha256": "0mmgk3bg8rqs4mlsaxr5hyvzqn3sg53pqqm1aiwq00kmcnhds7nx", + "rev": "d7a713c0b7e47c908258e71cba7a2d77cc8d71d5", + "sha256": "1hp1ddh41wrqxgrnfa79nsv7gzlbpwcqsijx7jw5b33wvk5ah5gb", "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/86ef6bd96b6279e1a4a53236d341f5df1ede3803.tar.gz", + "url": "https://github.com/NixOS/nixpkgs/archive/d7a713c0b7e47c908258e71cba7a2d77cc8d71d5.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "poetry2nix": { @@ -53,22 +65,10 @@ "homepage": "", "owner": "nix-community", "repo": "poetry2nix", - "rev": "4eb2ac54029af42a001c9901194e9ce19cbd8a40", - "sha256": "16fi71fpywiqsya1z99kkb14dansyrmkkrb2clzs3b5qqx673wf4", + "rev": "75d0515332b7ca269f6d7abfd2c44c47a7cbca7b", + "sha256": "16azjpzhlyfddn9jbx56nbzzh2fgd0b6czsfc9i8813lm6cal83s", "type": "tarball", - "url": "https://github.com/nix-community/poetry2nix/archive/4eb2ac54029af42a001c9901194e9ce19cbd8a40.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "flake-compat": { - "branch": "master", - "description": null, - "homepage": null, - "owner": "edolstra", - "repo": "flake-compat", - "rev": "b4a34015c698c7793d592d66adbab377907a2be8", - "sha256": "1qc703yg0babixi6wshn5wm2kgl5y1drcswgszh4xxzbrwkk9sv7", - "type": "tarball", - "url": "https://github.com/edolstra/flake-compat/archive/b4a34015c698c7793d592d66adbab377907a2be8.tar.gz", + "url": "https://github.com/nix-community/poetry2nix/archive/75d0515332b7ca269f6d7abfd2c44c47a7cbca7b.tar.gz", "url_template": "https://github.com///archive/.tar.gz" } } diff --git a/nix/sources.nix b/nix/sources.nix index 3f841046a8..c420541d76 100644 --- a/nix/sources.nix +++ b/nix/sources.nix @@ -6,113 +6,159 @@ let # The fetchers. fetch_ fetches specs of type . # - fetch_file = pkgs: name: spec: + fetch_file = + pkgs: name: spec: let name' = sanitizeName name + "-src"; in if spec.builtin or true then - builtins_fetchurl { inherit (spec) url sha256; name = name'; } + builtins_fetchurl { + inherit (spec) url sha256; + name = name'; + } else - pkgs.fetchurl { inherit (spec) url sha256; name = name'; }; + pkgs.fetchurl { + inherit (spec) url sha256; + name = name'; + }; - fetch_tarball = pkgs: name: spec: + fetch_tarball = + pkgs: name: spec: let name' = sanitizeName name + "-src"; in if spec.builtin or true then - builtins_fetchTarball { name = name'; inherit (spec) url sha256; } + builtins_fetchTarball { + name = name'; + inherit (spec) url sha256; + } else - pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; + pkgs.fetchzip { + name = name'; + inherit (spec) url sha256; + }; - fetch_git = name: spec: + fetch_git = + name: spec: let ref = - if spec ? ref then spec.ref else - if spec ? branch then "refs/heads/${spec.branch}" else - if spec ? tag then "refs/tags/${spec.tag}" else - abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"; + if spec ? ref then + spec.ref + else if spec ? branch then + "refs/heads/${spec.branch}" + else if spec ? tag then + "refs/tags/${spec.tag}" + else + abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"; in - builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; }; + builtins.fetchGit { + url = spec.repo; + inherit (spec) rev; + inherit ref; + }; fetch_local = spec: spec.path; - fetch_builtin-tarball = name: throw - ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=tarball -a builtin=true''; + fetch_builtin-tarball = + name: + throw '' + [${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. + $ niv modify ${name} -a type=tarball -a builtin=true''; - fetch_builtin-url = name: throw - ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=file -a builtin=true''; + fetch_builtin-url = + name: + throw '' + [${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. + $ niv modify ${name} -a type=file -a builtin=true''; # # Various helpers # # https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695 - sanitizeName = name: - ( - concatMapStrings (s: if builtins.isList s then "-" else s) - ( - builtins.split "[^[:alnum:]+._?=-]+" - ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) - ) - ); + sanitizeName = + name: + (concatMapStrings (s: if builtins.isList s then "-" else s) ( + builtins.split "[^[:alnum:]+._?=-]+" ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) + )); # The set of packages used when specs are fetched using non-builtins. - mkPkgs = sources: system: + mkPkgs = + sources: system: let - sourcesNixpkgs = - import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; }; + sourcesNixpkgs = import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { + inherit system; + }; hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; hasThisAsNixpkgsPath = == ./.; in - if builtins.hasAttr "nixpkgs" sources - then sourcesNixpkgs - else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then + if builtins.hasAttr "nixpkgs" sources then + sourcesNixpkgs + else if hasNixpkgsPath && !hasThisAsNixpkgsPath then import { } else - abort - '' - Please specify either (through -I or NIX_PATH=nixpkgs=...) or - add a package called "nixpkgs" to your sources.json. - ''; + abort '' + Please specify either (through -I or NIX_PATH=nixpkgs=...) or + add a package called "nixpkgs" to your sources.json. + ''; # The actual fetching function. - fetch = pkgs: name: spec: + fetch = + pkgs: name: spec: - if ! builtins.hasAttr "type" spec then + if !builtins.hasAttr "type" spec then abort "ERROR: niv spec ${name} does not have a 'type' attribute" - else if spec.type == "file" then fetch_file pkgs name spec - else if spec.type == "tarball" then fetch_tarball pkgs name spec - else if spec.type == "git" then fetch_git name spec - else if spec.type == "local" then fetch_local spec - else if spec.type == "builtin-tarball" then fetch_builtin-tarball name - else if spec.type == "builtin-url" then fetch_builtin-url name + else if spec.type == "file" then + fetch_file pkgs name spec + else if spec.type == "tarball" then + fetch_tarball pkgs name spec + else if spec.type == "git" then + fetch_git name spec + else if spec.type == "local" then + fetch_local spec + else if spec.type == "builtin-tarball" then + fetch_builtin-tarball name + else if spec.type == "builtin-url" then + fetch_builtin-url name else abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; # If the environment variable NIV_OVERRIDE_${name} is set, then use # the path directly as opposed to the fetched source. - replace = name: drv: + replace = + name: drv: let saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name; ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}"; in - if ersatz == "" then drv else - # this turns the string into an actual Nix path (for both absolute and - # relative paths) - if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}"; + if ersatz == "" then + drv + else + # this turns the string into an actual Nix path (for both absolute and + # relative paths) + if builtins.substring 0 1 ersatz == "/" then + /. + ersatz + else + /. + builtins.getEnv "PWD" + "/${ersatz}"; # Ports of functions for older nix versions # a Nix version of mapAttrs if the built-in doesn't exist - mapAttrs = builtins.mapAttrs or ( - f: set: with builtins; - listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) - ); + mapAttrs = + builtins.mapAttrs or ( + f: set: + with builtins; + listToAttrs ( + map (attr: { + name = attr; + value = f attr set.${attr}; + }) (attrNames set) + ) + ); # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 - range = first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1); + range = + first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1); # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); @@ -126,7 +172,12 @@ let optionalAttrs = cond: as: if cond then as else { }; # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name ? null, sha256 }@attrs: + builtins_fetchTarball = + { + url, + name ? null, + sha256, + }@attrs: let inherit (builtins) lessThan nixVersion fetchTarball; in @@ -136,7 +187,12 @@ let fetchTarball attrs; # fetchurl version that is compatible between all the versions of Nix - builtins_fetchurl = { url, name ? null, sha256 }@attrs: + builtins_fetchurl = + { + url, + name ? null, + sha256, + }@attrs: let inherit (builtins) lessThan nixVersion fetchurl; in @@ -146,26 +202,25 @@ let fetchurl attrs; # Create the final "sources" from the config - mkSources = config: - mapAttrs - ( - name: spec: - if builtins.hasAttr "outPath" spec - then - abort - "The values in sources.json should not have an 'outPath' attribute" - else - spec // { outPath = replace name (fetch config.pkgs name spec); } - ) - config.sources; + mkSources = + config: + mapAttrs ( + name: spec: + if builtins.hasAttr "outPath" spec then + abort "The values in sources.json should not have an 'outPath' attribute" + else + spec // { outPath = replace name (fetch config.pkgs name spec); } + ) config.sources; # The "config" used by the fetchers mkConfig = - { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null - , sources ? if isNull sourcesFile then { } else builtins.fromJSON (builtins.readFile sourcesFile) - , system ? builtins.currentSystem - , pkgs ? mkPkgs sources system - }: rec { + { + sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null, + sources ? if isNull sourcesFile then { } else builtins.fromJSON (builtins.readFile sourcesFile), + system ? builtins.currentSystem, + pkgs ? mkPkgs sources system, + }: + rec { # The sources, i.e. the attribute set of spec name to spec inherit sources; diff --git a/nix/testenv.nix b/nix/testenv.nix index 2c03e4bb4a..188ebbc40b 100644 --- a/nix/testenv.nix +++ b/nix/testenv.nix @@ -1,8 +1,13 @@ -{ poetry2nix, lib, python311 }: +{ + poetry2nix, + lib, + python311, +}: poetry2nix.mkPoetryEnv { projectDir = ../tests/integration_tests; python = python311; - overrides = poetry2nix.overrides.withDefaults (self: super: + overrides = poetry2nix.overrides.withDefaults ( + self: super: let buildSystems = { pystarport = [ "poetry-core" ]; @@ -16,11 +21,25 @@ poetry2nix.mkPoetryEnv { eth-bloom = [ "setuptools" ]; }; in - lib.mapAttrs - (attr: systems: super.${attr}.overridePythonAttrs - (old: { - nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ map (a: self.${a}) systems; - })) - buildSystems + (lib.mapAttrs ( + attr: systems: + super.${attr}.overridePythonAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ map (a: self.${a}) systems; + }) + ) buildSystems) + // { + # Fix malformed license field in types-requests package + types-requests = super.types-requests.overridePythonAttrs (old: { + postPatch = (old.postPatch or "") + '' + # Fix malformed license field in pyproject.toml + if [ -f pyproject.toml ]; then + # Fix license field format + sed -i 's/license = "Apache-2.0"/license = {text = "Apache-2.0"}/' pyproject.toml + # Remove invalid license-files property from [project] section + sed -i '/^license-files = /d' pyproject.toml + fi + ''; + }); + } ); } diff --git a/proto/ethermint/evm/v1/chain_config.proto b/proto/ethermint/evm/v1/chain_config.proto index 64b956a3c8..d2fb3f2940 100644 --- a/proto/ethermint/evm/v1/chain_config.proto +++ b/proto/ethermint/evm/v1/chain_config.proto @@ -9,10 +9,8 @@ option go_package = "github.com/evmos/ethermint/x/evm/types"; // instead of *big.Int. message ChainConfig { // homestead_block switch (nil no fork, 0 = already homestead) - string homestead_block = 1 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"homestead_block\"" - ]; + string homestead_block = 1 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"homestead_block\""]; // dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork) string dao_fork_block = 2 [ (gogoproto.customname) = "DAOForkBlock", @@ -44,74 +42,51 @@ message ChainConfig { (gogoproto.moretags) = "yaml:\"eip158_block\"" ]; // byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium) - string byzantium_block = 8 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"byzantium_block\"" - ]; + string byzantium_block = 8 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"byzantium_block\""]; // constantinople_block: Constantinople switch block (nil no fork, 0 = already activated) - string constantinople_block = 9 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"constantinople_block\"" - ]; + string constantinople_block = 9 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"constantinople_block\""]; // petersburg_block: Petersburg switch block (nil same as Constantinople) - string petersburg_block = 10 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"petersburg_block\"" - ]; + string petersburg_block = 10 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"petersburg_block\""]; // istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul) - string istanbul_block = 11 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"istanbul_block\"" - ]; + string istanbul_block = 11 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"istanbul_block\""]; // muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated) - string muir_glacier_block = 12 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"muir_glacier_block\"" - ]; + string muir_glacier_block = 12 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"muir_glacier_block\""]; // berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin) - string berlin_block = 13 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"berlin_block\"" - ]; + string berlin_block = 13 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"berlin_block\""]; // DEPRECATED: EWASM, YOLOV3 and Catalyst block have been deprecated reserved 14, 15, 16; reserved "yolo_v3_block", "ewasm_block", "catalyst_block"; // london_block: London switch block (nil = no fork, 0 = already on london) - string london_block = 17 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"london_block\"" - ]; + string london_block = 17 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"london_block\""]; // arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) - string arrow_glacier_block = 18 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"arrow_glacier_block\"" - ]; + string arrow_glacier_block = 18 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"arrow_glacier_block\""]; // DEPRECATED: merge fork block was deprecated: https://github.com/ethereum/go-ethereum/pull/24904 reserved 19; reserved "merge_fork_block"; // gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated) - string gray_glacier_block = 20 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"gray_glacier_block\"" - ]; + string gray_glacier_block = 20 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"gray_glacier_block\""]; // merge_netsplit_block: Virtual fork after The Merge to use as a network splitter - string merge_netsplit_block = 21 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"merge_netsplit_block\"" - ]; + string merge_netsplit_block = 21 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"merge_netsplit_block\""]; // shanghai switch time (nil = no fork, 0 = already on shanghai) - string shanghai_time = 22 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"shanghai_time\"" - ]; + string shanghai_time = 22 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"shanghai_time\""]; // cancun switch time (nil = no fork, 0 = already on cancun) - string cancun_time = 23 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"cancun_time\"" - ]; + string cancun_time = 23 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"cancun_time\""]; // prague switch time (nil = no fork, 0 = already on prague) - string prague_time = 24 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"prague_time\"" - ]; -} \ No newline at end of file + string prague_time = 24 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"prague_time\""]; + // osaka switch time (nil = no fork, 0 = already on osaka) + string osaka_time = 25 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"osaka_time\""]; +} diff --git a/proto/ethermint/evm/v1/chain_config_v0.proto b/proto/ethermint/evm/v1/chain_config_v0.proto index fe2ee499e7..c8fce02856 100644 --- a/proto/ethermint/evm/v1/chain_config_v0.proto +++ b/proto/ethermint/evm/v1/chain_config_v0.proto @@ -9,10 +9,8 @@ option go_package = "github.com/evmos/ethermint/x/evm/types"; // instead of *big.Int. message V0ChainConfig { // homestead_block switch (nil no fork, 0 = already homestead) - string homestead_block = 1 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"homestead_block\"" - ]; + string homestead_block = 1 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"homestead_block\""]; // dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork) string dao_fork_block = 2 [ (gogoproto.customname) = "DAOForkBlock", @@ -44,69 +42,45 @@ message V0ChainConfig { (gogoproto.moretags) = "yaml:\"eip158_block\"" ]; // byzantium_block: Byzantium switch block (nil no fork, 0 = already on byzantium) - string byzantium_block = 8 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"byzantium_block\"" - ]; + string byzantium_block = 8 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"byzantium_block\""]; // constantinople_block: Constantinople switch block (nil no fork, 0 = already activated) - string constantinople_block = 9 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"constantinople_block\"" - ]; + string constantinople_block = 9 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"constantinople_block\""]; // petersburg_block: Petersburg switch block (nil same as Constantinople) - string petersburg_block = 10 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"petersburg_block\"" - ]; + string petersburg_block = 10 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"petersburg_block\""]; // istanbul_block: Istanbul switch block (nil no fork, 0 = already on istanbul) - string istanbul_block = 11 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"istanbul_block\"" - ]; + string istanbul_block = 11 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"istanbul_block\""]; // muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated) - string muir_glacier_block = 12 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"muir_glacier_block\"" - ]; + string muir_glacier_block = 12 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"muir_glacier_block\""]; // berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin) - string berlin_block = 13 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"berlin_block\"" - ]; + string berlin_block = 13 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"berlin_block\""]; // DEPRECATED: EWASM, YOLOV3 and Catalyst block have been deprecated reserved 14, 15, 16; reserved "yolo_v3_block", "ewasm_block", "catalyst_block"; // london_block: London switch block (nil = no fork, 0 = already on london) - string london_block = 17 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"london_block\"" - ]; + string london_block = 17 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"london_block\""]; // arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) - string arrow_glacier_block = 18 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"arrow_glacier_block\"" - ]; + string arrow_glacier_block = 18 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"arrow_glacier_block\""]; // DEPRECATED: merge fork block was deprecated: https://github.com/ethereum/go-ethereum/pull/24904 reserved 19; reserved "merge_fork_block"; // gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 = already activated) - string gray_glacier_block = 20 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"gray_glacier_block\"" - ]; + string gray_glacier_block = 20 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"gray_glacier_block\""]; // merge_netsplit_block: Virtual fork after The Merge to use as a network splitter - string merge_netsplit_block = 21 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"merge_netsplit_block\"" - ]; + string merge_netsplit_block = 21 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"merge_netsplit_block\""]; // shanghai_block switch block (nil = no fork, 0 = already on shanghai) - string shanghai_block = 22 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"shanghai_block\"" - ]; + string shanghai_block = 22 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"shanghai_block\""]; // cancun_block switch block (nil = no fork, 0 = already on cancun) - string cancun_block = 23 [ - (gogoproto.customtype) = "cosmossdk.io/math.Int", - (gogoproto.moretags) = "yaml:\"cancun_block\"" - ]; + string cancun_block = 23 + [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.moretags) = "yaml:\"cancun_block\""]; } diff --git a/proto/ethermint/evm/v1/genesis.proto b/proto/ethermint/evm/v1/genesis.proto index 67092d42d9..ad620b211a 100644 --- a/proto/ethermint/evm/v1/genesis.proto +++ b/proto/ethermint/evm/v1/genesis.proto @@ -1,7 +1,9 @@ syntax = "proto3"; package ethermint.evm.v1; +import "amino/amino.proto"; import "ethermint/evm/v1/params.proto"; +import "ethermint/evm/v1/preinstall.proto"; import "ethermint/evm/v1/state.proto"; import "gogoproto/gogo.proto"; @@ -13,6 +15,9 @@ message GenesisState { repeated GenesisAccount accounts = 1 [(gogoproto.nullable) = false]; // params defines all the parameters of the module. Params params = 2 [(gogoproto.nullable) = false]; + // preinstalls defines a set of predefined contracts + repeated Preinstall preinstalls = 3 + [ (gogoproto.nullable) = false, (amino.dont_omitempty) = true ]; } // GenesisAccount defines an account to be initialized in the genesis state. diff --git a/proto/ethermint/evm/v1/params.proto b/proto/ethermint/evm/v1/params.proto index c4c64323aa..f4e8482f7a 100644 --- a/proto/ethermint/evm/v1/params.proto +++ b/proto/ethermint/evm/v1/params.proto @@ -22,4 +22,9 @@ message Params { // allow_unprotected_txs defines if replay-protected (i.e non EIP155 // signed) transactions can be executed on the state machine. bool allow_unprotected_txs = 6; + // header_hash_num is the number of header hash to persist. + uint64 header_hash_num = 7; + // historyServeWindow for EIP 2935 + uint64 history_serve_window = 8; + } \ No newline at end of file diff --git a/proto/ethermint/evm/v1/preinstall.proto b/proto/ethermint/evm/v1/preinstall.proto new file mode 100644 index 0000000000..546ed32558 --- /dev/null +++ b/proto/ethermint/evm/v1/preinstall.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; +package ethermint.evm.v1; + +option go_package = "github.com/evmos/ethermint/x/evm/types"; + +// Preinstall defines a contract that is preinstalled on-chain with a specific +// contract address and bytecode +message Preinstall { + // name of the preinstall contract + string name = 1; + // address in hex format of the preinstall contract + string address = 2; + // code in hex format for the preinstall contract + string code = 3; +} \ No newline at end of file diff --git a/proto/ethermint/evm/v1/query.proto b/proto/ethermint/evm/v1/query.proto index 8898dd7287..386e0cdaa9 100644 --- a/proto/ethermint/evm/v1/query.proto +++ b/proto/ethermint/evm/v1/query.proto @@ -52,7 +52,7 @@ service Query { } // EthCall implements the `eth_call` rpc api - rpc EthCall(EthCallRequest) returns (MsgEthereumTxResponse) { + rpc EthCall(EthCallRequest) returns (EthCallResponse) { option (google.api.http).get = "/ethermint/evm/v1/eth_call"; } @@ -81,6 +81,19 @@ service Query { rpc BaseFee(QueryBaseFeeRequest) returns (QueryBaseFeeResponse) { option (google.api.http).get = "/ethermint/evm/v1/base_fee"; } + + // CreateAccessList implement `eth_createAccessList` rpc call + rpc CreateAccessList(EthCallRequest) returns (CreateAccessListResponse) { + option (google.api.http).get = "/ethermint/evm/v1/create_access_list"; + } + + // SimulateV1 implements the `eth_simulateV1` rpc api + rpc SimulateV1(SimulateV1Request) returns (SimulateV1Response) { + option (google.api.http) = { + post: "/ethermint/evm/v1/simulate_v1" + body: "*" + }; + } } // QueryAccountRequest is the request type for the Query/Account RPC method. @@ -236,6 +249,23 @@ message EthCallRequest { bytes overrides = 5; } +// EthCallResponse defines EthCall response +message EthCallResponse { + // hash of the ethereum transaction in hex format. + // This hash differs from the Tendermint sha256 hash of the transaction bytes. + string hash = 1; + // logs contains the transaction hash and the proto-compatible ethereum logs. + repeated Log logs = 2; + // ret is the returned data from evm function (result or data supplied with revert opcode) + bytes ret = 3; + // vm_error is the error returned by vm execution + string vm_error = 4; + // gas_used specifies how much gas was consumed by the transaction + uint64 gas_used = 5; + // include the block hash for json-rpc to use + bytes block_hash = 6; +} + // EstimateGasResponse defines EstimateGas response message EstimateGasResponse { // gas returns the estimated gas @@ -267,8 +297,10 @@ message QueryTraceTxRequest { google.protobuf.Timestamp block_time = 7 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; // proposer_address is the proposer of the requested block bytes proposer_address = 8 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.ConsAddress"]; - // chain_id is the the eip155 chain id parsed from the requested block header + // chain_id is the eip155 chain id parsed from the requested block header int64 chain_id = 9; + // base_fee is the base fee based on the block_number of requested transaction + string base_fee = 10 [(gogoproto.customtype) = "cosmossdk.io/math.Int"]; } // QueryTraceTxResponse defines TraceTx response @@ -336,3 +368,31 @@ message QueryBaseFeeResponse { // base_fee is the EIP1559 base fee string base_fee = 1 [(gogoproto.customtype) = "cosmossdk.io/math.Int"]; } + +// CreateAccessListResponse defines CreateAccessList response +message CreateAccessListResponse { + // data is the response serialized in bytes + bytes data = 1; +} + +// SimulateV1Request defines the request for eth_simulateV1 +message SimulateV1Request { + // args is the JSON-encoded rpc/types.SimulateV1Args (SimOpts plus resolved base header) + bytes args = 1; + // gas_cap defines the default gas cap to be used + uint64 gas_cap = 2; + // proposer_address of the requested block in hex format + bytes proposer_address = 3 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.ConsAddress"]; + // chain_id is the eip155 chain id parsed from the requested block header + int64 chain_id = 4; +} + +// SimulateV1Response defines the response for eth_simulateV1 +message SimulateV1Response { + // result is the JSON-encoded simulation results (set on success, empty on error) + bytes result = 1; + // error_message is a human-readable description of the simulation error (empty on success) + string error_message = 2; + // error_code is the machine-readable simulation error code (0 on success) + int32 error_code = 3; +} diff --git a/proto/ethermint/evm/v1/set_code_authorization.proto b/proto/ethermint/evm/v1/set_code_authorization.proto new file mode 100644 index 0000000000..fb2e29cc9f --- /dev/null +++ b/proto/ethermint/evm/v1/set_code_authorization.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package ethermint.evm.v1; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/evmos/ethermint/x/evm/types"; + +// SetCodeAuthorization is an authorization from an account to deploy code at its address. +message SetCodeAuthorization { + option (gogoproto.goproto_getters) = false; + + string chain_id = 1 [ + (gogoproto.customtype) = "cosmossdk.io/math.Int", + (gogoproto.customname) = "ChainID", + (gogoproto.jsontag) = "chainID" + ]; + string address = 2; + uint64 nonce = 3; + bytes v = 4; + bytes r = 5; + bytes s = 6; +} diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index cea3279399..45b9582d31 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package ethermint.evm.v1; +import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; @@ -9,6 +10,8 @@ import "google/protobuf/any.proto"; import "ethermint/evm/v1/access_tuple.proto"; import "ethermint/evm/v1/log.proto"; import "ethermint/evm/v1/params.proto"; +import "ethermint/evm/v1/preinstall.proto"; +import "ethermint/evm/v1/set_code_authorization.proto"; option go_package = "github.com/evmos/ethermint/x/evm/types"; @@ -22,6 +25,10 @@ service Msg { // UpdateParams defined a governance operation for updating the x/evm module parameters. // The authority is hard-coded to the Cosmos SDK x/gov module account rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); + + // UpdateParams defined a governance operation for updating the x/evm module parameters. + // The authority is hard-coded to the Cosmos SDK x/gov module account + rpc RegisterPreinstalls(MsgRegisterPreinstalls) returns (MsgRegisterPreinstallsResponse); } // MsgEthereumTx encapsulates an Ethereum transaction as an SDK message. @@ -61,8 +68,7 @@ message LegacyTx { // to is the hex formatted address of the recipient string to = 4; // value defines the unsigned integer value of the transaction amount. - string value = 5 - [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; + string value = 5 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; // data is the data payload bytes of the transaction. bytes data = 6; // v defines the signature value @@ -93,8 +99,7 @@ message AccessListTx { // to is the recipient address in hex format string to = 5; // value defines the unsigned integer value of the transaction amount. - string value = 6 - [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; + string value = 6 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; // data is the data payload bytes of the transaction. bytes data = 7; // accesses is an array of access tuples @@ -130,8 +135,7 @@ message DynamicFeeTx { // to is the hex formatted address of the recipient string to = 6; // value defines the the transaction amount. - string value = 7 - [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; + string value = 7 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; // data is the data payload bytes of the transaction. bytes data = 8; // accesses is an array of access tuples @@ -145,6 +149,46 @@ message DynamicFeeTx { bytes s = 12; } +// SetCodeTx implements the EIP-7702 transaction type. +message SetCodeTx { + option (gogoproto.goproto_getters) = false; + option (cosmos_proto.implements_interface) = "TxData"; + + // chain_id of the destination EVM chain + string chain_id = 1 [ + (gogoproto.customtype) = "cosmossdk.io/math.Int", + (gogoproto.customname) = "ChainID", + (gogoproto.jsontag) = "chainID" + ]; + // nonce corresponds to the account nonce (transaction sequence). + uint64 nonce = 2; + // gas_tip_cap defines the max value for the gas tip + string gas_tip_cap = 3 [(gogoproto.customtype) = "cosmossdk.io/math.Int"]; + // gas_fee_cap defines the max value for the gas fee + string gas_fee_cap = 4 [(gogoproto.customtype) = "cosmossdk.io/math.Int"]; + // gas defines the gas limit defined for the transaction. + uint64 gas = 5 [(gogoproto.customname) = "GasLimit"]; + // to is the hex formatted address of the recipient + string to = 6; + // value defines the the transaction amount. + string value = 7 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.customname) = "Amount"]; + // data is the data payload bytes of the transaction. + bytes data = 8; + // accesses is an array of access tuples + repeated AccessTuple accesses = 9 + [(gogoproto.castrepeated) = "AccessList", (gogoproto.jsontag) = "accessList", (gogoproto.nullable) = false]; + // auth_list is a list of tuples that indicate what code the signer of each tuple desires to execute in the context of + // their EOA + repeated SetCodeAuthorization auth_list = 10 + [(gogoproto.castrepeated) = "AuthList", (gogoproto.jsontag) = "authList", (gogoproto.nullable) = false]; + // v defines the signature value + bytes v = 11; + // r defines the signature value + bytes r = 12; + // s define the signature value + bytes s = 13; +} + // ExtensionOptionsEthereumTx is an extension option for ethereum transactions message ExtensionOptionsEthereumTx { option (gogoproto.goproto_getters) = false; @@ -187,3 +231,19 @@ message MsgUpdateParams { // MsgUpdateParamsResponse defines the response structure for executing a // MsgUpdateParams message. message MsgUpdateParamsResponse {} + +// MsgRegisterPreinstalls defines a Msg for creating preinstalls in evm state. +message MsgRegisterPreinstalls { + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + string authority = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ]; + + // preinstalls defines the preinstalls to create. + repeated Preinstall preinstalls = 2 + [ (gogoproto.nullable) = false, (amino.dont_omitempty) = true ]; +} + +// MsgRegisterPreinstallsResponse defines the response structure for executing a +// MsgRegisterPreinstalls message. +message MsgRegisterPreinstallsResponse {} \ No newline at end of file diff --git a/proto/ethermint/feemarket/v1/feemarket.proto b/proto/ethermint/feemarket/v1/feemarket.proto index 55c8c4bc3e..210f5d7822 100644 --- a/proto/ethermint/feemarket/v1/feemarket.proto +++ b/proto/ethermint/feemarket/v1/feemarket.proto @@ -23,10 +23,8 @@ message Params { // base_fee for EIP-1559 blocks. string base_fee = 6 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.nullable) = false]; // min_gas_price defines the minimum gas price value for cosmos and eth transactions - string min_gas_price = 7 - [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false]; + string min_gas_price = 7 [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false]; // min_gas_multiplier bounds the minimum gas used to be charged // to senders based on gas limit - string min_gas_multiplier = 8 - [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false]; + string min_gas_multiplier = 8 [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false]; } diff --git a/proto/ethermint/types/v1/dynamic_fee.proto b/proto/ethermint/types/v1/dynamic_fee.proto index 1b38f07326..bde4191ce2 100644 --- a/proto/ethermint/types/v1/dynamic_fee.proto +++ b/proto/ethermint/types/v1/dynamic_fee.proto @@ -8,6 +8,5 @@ option go_package = "github.com/evmos/ethermint/types"; // ExtensionOptionDynamicFeeTx is an extension option that specifies the maxPrioPrice for cosmos tx message ExtensionOptionDynamicFeeTx { // max_priority_price is the same as `max_priority_fee_per_gas` in eip-1559 spec - string max_priority_price = 1 - [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.nullable) = false]; + string max_priority_price = 1 [(gogoproto.customtype) = "cosmossdk.io/math.Int", (gogoproto.nullable) = false]; } diff --git a/rpc/apis.go b/rpc/apis.go index 01cee8c09c..f2079b2b97 100644 --- a/rpc/apis.go +++ b/rpc/apis.go @@ -27,7 +27,6 @@ import ( "github.com/evmos/ethermint/rpc/namespaces/ethereum/debug" "github.com/evmos/ethermint/rpc/namespaces/ethereum/eth" "github.com/evmos/ethermint/rpc/namespaces/ethereum/eth/filters" - "github.com/evmos/ethermint/rpc/namespaces/ethereum/miner" "github.com/evmos/ethermint/rpc/namespaces/ethereum/net" "github.com/evmos/ethermint/rpc/namespaces/ethereum/personal" "github.com/evmos/ethermint/rpc/namespaces/ethereum/txpool" @@ -50,7 +49,6 @@ const ( NetNamespace = "net" TxPoolNamespace = "txpool" DebugNamespace = "debug" - MinerNamespace = "miner" apiVersion = "1.0" ) @@ -153,22 +151,6 @@ func init() { }, } }, - MinerNamespace: func(ctx *server.Context, - clientCtx client.Context, - _ *stream.RPCStream, - allowUnprotectedTxs bool, - indexer ethermint.EVMTxIndexer, - ) []rpc.API { - evmBackend := backend.NewBackend(ctx, ctx.Logger, clientCtx, allowUnprotectedTxs, indexer) - return []rpc.API{ - { - Namespace: MinerNamespace, - Version: apiVersion, - Service: miner.NewPrivateAPI(ctx, evmBackend), - Public: false, - }, - } - }, } } diff --git a/rpc/backend/account_info.go b/rpc/backend/account_info.go index ea4c130179..9ec3b89ad9 100644 --- a/rpc/backend/account_info.go +++ b/rpc/backend/account_info.go @@ -16,8 +16,6 @@ package backend import ( - "fmt" - "math" "math/big" errorsmod "cosmossdk.io/errors" @@ -29,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" rpctypes "github.com/evmos/ethermint/rpc/types" + ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" "github.com/pkg/errors" ) @@ -60,7 +59,7 @@ func (b *Backend) GetProof(address common.Address, storageKeys []string, blockNr } height := blockNum.Int64() - _, err = b.TendermintBlockByNumber(blockNum) + _, err = b.TendermintHeaderByNumber(blockNum) if err != nil { // the error message imitates geth behavior return nil, errors.New("header not found") @@ -74,11 +73,10 @@ func (b *Backend) GetProof(address common.Address, storageKeys []string, blockNr return nil, err } - if bn > math.MaxInt64 { - return nil, fmt.Errorf("not able to query block number greater than MaxInt64") + height, err = ethermint.SafeHexToInt64(bn) + if err != nil { + return nil, err } - - height = int64(bn) } clientCtx := b.clientCtx.WithHeight(height) @@ -88,7 +86,7 @@ func (b *Backend) GetProof(address common.Address, storageKeys []string, blockNr for i, key := range storageKeys { hexKey := common.HexToHash(key) - valueBz, proof, err := b.queryClient.GetProof(clientCtx, evmtypes.StoreKey, evmtypes.StateKey(address, hexKey.Bytes())) + valueBz, proof, err := b.queryClient.GetProof(clientCtx, evmtypes.StoreKey, evmtypes.StateKey(address, hexKey)) if err != nil { return nil, err } @@ -165,7 +163,7 @@ func (b *Backend) GetBalance(address common.Address, blockNrOrHash rpctypes.Bloc Address: address.String(), } - _, err = b.TendermintBlockByNumber(blockNum) + _, err = b.TendermintHeaderByNumber(blockNum) if err != nil { return nil, err } @@ -195,8 +193,11 @@ func (b *Backend) GetTransactionCount(address common.Address, blockNum rpctypes. if err != nil { return &n, err } + currentHeight, err := ethermint.SafeHexToInt64(bn) + if err != nil { + return nil, err + } height := blockNum.Int64() - currentHeight := int64(bn) if height > currentHeight { return &n, errorsmod.Wrapf( sdkerrors.ErrInvalidHeight, diff --git a/rpc/backend/account_info_test.go b/rpc/backend/account_info_test.go index 200cf36385..296b1dc201 100644 --- a/rpc/backend/account_info_test.go +++ b/rpc/backend/account_info_test.go @@ -97,7 +97,8 @@ func (suite *BackendTestSuite) TestGetProof() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNrInvalid}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, bn.Int64(), nil) + height := bn.Int64() + RegisterHeader(client, &height, nil) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterAccount(queryClient, addr, blockNrInvalid.Int64()) }, @@ -111,7 +112,8 @@ func (suite *BackendTestSuite) TestGetProof() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNrInvalid}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockError(client, bn.Int64()) + height := bn.Int64() + RegisterHeaderError(client, &height) }, false, &rpctypes.AccountResult{}, @@ -122,12 +124,12 @@ func (suite *BackendTestSuite) TestGetProof() { []string{"0x0"}, rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, func(bn rpctypes.BlockNumber, addr common.Address) { - suite.backend.ctx = rpctypes.ContextWithHeight(bn.Int64()) - + height := bn.Int64() + suite.backend.ctx = rpctypes.ContextWithHeight(height) client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, bn.Int64(), nil) + RegisterHeader(client, &height, nil) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterAccount(queryClient, addr, bn.Int64()) + RegisterAccount(queryClient, addr, height) // Use the IAVL height if a valid tendermint height is passed in. iavlHeight := bn.Int64() @@ -135,7 +137,7 @@ func (suite *BackendTestSuite) TestGetProof() { client, bn.Int64(), "store/evm/key", - evmtypes.StateKey(address1, common.HexToHash("0x0").Bytes()), + evmtypes.StateKey(address1, common.HexToHash("0x0")), tmrpcclient.ABCIQueryOptions{Height: iavlHeight, Prove: true}, ) addressStoreKey := append(authtypes.AddressStoreKeyPrefix, sdk.AccAddress(address1.Bytes())...) @@ -270,7 +272,8 @@ func (suite *BackendTestSuite) TestGetBalance() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockError(client, bn.Int64()) + height := bn.Int64() + RegisterHeaderError(client, &height) }, false, nil, @@ -281,7 +284,8 @@ func (suite *BackendTestSuite) TestGetBalance() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, bn.Int64(), nil) + height := bn.Int64() + RegisterHeader(client, &height, nil) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBalanceError(queryClient, addr, bn.Int64()) }, @@ -294,7 +298,8 @@ func (suite *BackendTestSuite) TestGetBalance() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, bn.Int64(), nil) + height := bn.Int64() + RegisterHeader(client, &height, nil) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBalanceInvalid(queryClient, addr, bn.Int64()) }, @@ -307,7 +312,8 @@ func (suite *BackendTestSuite) TestGetBalance() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, bn.Int64(), nil) + height := bn.Int64() + RegisterHeader(client, &height, nil) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBalanceNegative(queryClient, addr, bn.Int64()) }, @@ -320,7 +326,8 @@ func (suite *BackendTestSuite) TestGetBalance() { rpctypes.BlockNumberOrHash{BlockNumber: &blockNr}, func(bn rpctypes.BlockNumber, addr common.Address) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, bn.Int64(), nil) + height := bn.Int64() + RegisterHeader(client, &height, nil) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBalance(queryClient, addr, bn.Int64()) }, diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index 68090e4767..c5700ae94d 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -21,7 +21,7 @@ import ( "math/big" "time" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" sdkmath "cosmossdk.io/math" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/cosmos/cosmos-sdk/client" @@ -85,6 +85,7 @@ type EVMBackend interface { GetBlockByHash(hash common.Hash, fullTx bool) (map[string]interface{}, error) GetBlockTransactionCountByHash(hash common.Hash) *hexutil.Uint GetBlockTransactionCountByNumber(blockNum rpctypes.BlockNumber) *hexutil.Uint + GetBlockReceipts(blockNrOrHash rpctypes.BlockNumberOrHash) ([]map[string]interface{}, error) TendermintBlockByNumber(blockNum rpctypes.BlockNumber) (*tmrpctypes.ResultBlock, error) TendermintBlockResultByNumber(height *int64) (*tmrpctypes.ResultBlockResults, error) TendermintBlockByHash(blockHash common.Hash) (*tmrpctypes.ResultBlock, error) @@ -121,16 +122,21 @@ type EVMBackend interface { GetTxByEthHash(txHash common.Hash) (*ethermint.TxResult, error) GetTxByTxIndex(height int64, txIndex uint) (*ethermint.TxResult, error) GetTransactionByBlockAndIndex(block *tmrpctypes.ResultBlock, idx hexutil.Uint) (*rpctypes.RPCTransaction, error) - GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) + GetTransactionReceipt(hash common.Hash, resBlock *tmrpctypes.ResultBlock) (map[string]interface{}, error) GetTransactionByBlockHashAndIndex(hash common.Hash, idx hexutil.Uint) (*rpctypes.RPCTransaction, error) GetTransactionByBlockNumberAndIndex(blockNum rpctypes.BlockNumber, idx hexutil.Uint) (*rpctypes.RPCTransaction, error) + CreateAccessList( + args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + overrides *json.RawMessage, + ) (*rpctypes.AccessListResult, error) // Send Transaction Resend(args evmtypes.TransactionArgs, gasPrice *hexutil.Big, gasLimit *hexutil.Uint64) (common.Hash, error) SendRawTransaction(data hexutil.Bytes) (common.Hash, error) SetTxDefaults(args evmtypes.TransactionArgs) (evmtypes.TransactionArgs, error) - EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) - DoCall(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, overrides *json.RawMessage) (*evmtypes.MsgEthereumTxResponse, error) + EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber, overrides *json.RawMessage) (hexutil.Uint64, error) + DoCall(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, overrides *json.RawMessage) (*evmtypes.EthCallResponse, error) GasPrice() (*hexutil.Big, error) // Filter API @@ -142,6 +148,9 @@ type EVMBackend interface { TraceTransaction(hash common.Hash, config *rpctypes.TraceConfig) (interface{}, error) TraceBlock(height rpctypes.BlockNumber, config *rpctypes.TraceConfig, block *tmrpctypes.ResultBlock) ([]*evmtypes.TxTraceResult, error) TraceCall(args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumberOrHash, config *rpctypes.TraceConfig) (interface{}, error) + + // Simulation + SimulateV1(opts rpctypes.SimOpts, blockNr rpctypes.BlockNumber) (json.RawMessage, error) } var _ BackendI = (*Backend)(nil) diff --git a/rpc/backend/backend_suite_test.go b/rpc/backend/backend_suite_test.go index a7419524ad..3aea16e6aa 100644 --- a/rpc/backend/backend_suite_test.go +++ b/rpc/backend/backend_suite_test.go @@ -16,6 +16,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/trie" "github.com/stretchr/testify/suite" "github.com/evmos/ethermint/crypto/ethsecp256k1" @@ -136,7 +137,7 @@ func (suite *BackendTestSuite) buildFormattedBlock( root := common.Hash{}.Bytes() receipt := ethtypes.NewReceipt(root, false, gasUsed.Uint64()) - bloom := ethtypes.CreateBloom(ethtypes.Receipts{receipt}) + bloom := ethtypes.CreateBloom(receipt) ethRPCTxs := []interface{}{} if tx != nil { @@ -146,6 +147,7 @@ func (suite *BackendTestSuite) buildFormattedBlock( common.BytesToHash(header.Hash()), uint64(header.Height), uint64(0), + uint64(0), baseFee, suite.backend.chainID, ) @@ -156,16 +158,20 @@ func (suite *BackendTestSuite) buildFormattedBlock( } } - return rpctypes.FormatBlock( - header, - resBlock.Block.Size(), - gasLimit, - gasUsed, - ethRPCTxs, - bloom, - common.BytesToAddress(validator.Bytes()), - baseFee, - ) + var expTxs []*ethtypes.Transaction + if tx != nil { + expTxs = []*ethtypes.Transaction{tx.AsTransaction()} + } + ethHeader := rpctypes.EthHeaderFromTendermint(header, bloom, baseFee, validator) + ethHeader.GasLimit = uint64(gasLimit) + ethHeader.GasUsed = gasUsed.Uint64() + ethBody := ðtypes.Body{ + Transactions: expTxs, + Uncles: []*ethtypes.Header{}, + Withdrawals: ethtypes.Withdrawals{}, + } + ethBlock := ethtypes.NewBlock(ethHeader, ethBody, nil, trie.NewStackTrie(nil)) + return rpctypes.FormatBlock(ethBlock.Header(), header.Hash(), resBlock.Block.Size(), ethRPCTxs) } func (suite *BackendTestSuite) generateTestKeyring(clientDir string) (keyring.Keyring, error) { diff --git a/rpc/backend/blocks.go b/rpc/backend/blocks.go index fe946ebfc1..59aad4e15a 100644 --- a/rpc/backend/blocks.go +++ b/rpc/backend/blocks.go @@ -30,6 +30,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/trie" rpctypes "github.com/evmos/ethermint/rpc/types" + ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" "github.com/pkg/errors" "google.golang.org/grpc" @@ -78,7 +79,7 @@ func (b *Backend) GetBlockByNumber(blockNum rpctypes.BlockNumber, fullTx bool) ( blockRes, err := b.TendermintBlockResultByNumber(&resBlock.Block.Height) if err != nil { b.logger.Debug("failed to fetch block result from Tendermint", "height", blockNum, "error", err.Error()) - return nil, nil + return nil, err } res, err := b.RPCBlockFromTendermintBlock(resBlock, blockRes, fullTx) @@ -90,6 +91,54 @@ func (b *Backend) GetBlockByNumber(blockNum rpctypes.BlockNumber, fullTx bool) ( return res, nil } +// GetBlockReceipts returns a list of Ethereum transaction receipts given a block number or hash. +func (b *Backend) GetBlockReceipts(blockNrOrHash rpctypes.BlockNumberOrHash) ([]map[string]interface{}, error) { + resBlock, err := b.tendermintBlockByNumberOrHash(blockNrOrHash) + if err != nil { + return nil, err + } + // return if requested block height is greater than the current one + if resBlock == nil || resBlock.Block == nil { + return nil, nil + } + blockRes, err := b.TendermintBlockResultByNumber(&resBlock.Block.Height) + if err != nil { + b.logger.Debug("failed to fetch block result from Tendermint", "block", blockNrOrHash, "error", err.Error()) + return nil, err + } + + entries, err := b.collectReceiptEntriesFromBlock(resBlock, blockRes, nil) + if err != nil { + return nil, err + } + + res := make([]map[string]interface{}, 0, len(entries)) + for _, entry := range entries { + receipt, err := b.buildReceiptDirect(resBlock, blockRes, entry.txResult, entry.ethMsg) + if err != nil { + return nil, err + } + if receipt == nil { + continue + } + res = append(res, receipt) + } + + return res, nil +} + +func (b *Backend) tendermintBlockByNumberOrHash(blockNrOrHash rpctypes.BlockNumberOrHash) (*tmrpctypes.ResultBlock, error) { + if blockNrOrHash.BlockHash != nil { + return b.TendermintBlockByHash(*blockNrOrHash.BlockHash) + } + if blockNrOrHash.BlockNumber != nil { + return b.TendermintBlockByNumber(*blockNrOrHash.BlockNumber) + } + b.logger.Debug("empty block number/hash, defaulting eth_getBlockReceipts to latest") + blockNum := rpctypes.EthLatestBlockNumber + return b.TendermintBlockByNumber(blockNum) +} + // GetBlockByHash returns the JSON-RPC compatible Ethereum block identified by // hash. func (b *Backend) GetBlockByHash(hash common.Hash, fullTx bool) (map[string]interface{}, error) { @@ -106,7 +155,7 @@ func (b *Backend) GetBlockByHash(hash common.Hash, fullTx bool) (map[string]inte blockRes, err := b.TendermintBlockResultByNumber(&resBlock.Block.Height) if err != nil { b.logger.Debug("failed to fetch block result from Tendermint", "block-hash", hash.String(), "error", err.Error()) - return nil, nil + return nil, err } res, err := b.RPCBlockFromTendermintBlock(resBlock, blockRes, fullTx) @@ -124,6 +173,7 @@ func (b *Backend) GetBlockTransactionCountByHash(hash common.Hash) *hexutil.Uint sc, ok := b.clientCtx.Client.(tmrpcclient.SignClient) if !ok { b.logger.Error("invalid rpc client") + return nil } block, err := sc.BlockByHash(b.ctx, hash.Bytes()) if err != nil { @@ -172,14 +222,9 @@ func (b *Backend) GetBlockTransactionCount(block *tmrpctypes.ResultBlock) *hexut // TendermintBlockByNumber returns a Tendermint-formatted block for a given // block number func (b *Backend) TendermintBlockByNumber(blockNum rpctypes.BlockNumber) (*tmrpctypes.ResultBlock, error) { - height := blockNum.Int64() - if height <= 0 { - // fetch the latest block number from the app state, more accurate than the tendermint block store state. - n, err := b.BlockNumber() - if err != nil { - return nil, err - } - height = int64(n) + height, err := b.getHeightByBlockNum(blockNum) + if err != nil { + return nil, err } resBlock, err := b.clientCtx.Client.Block(b.ctx, &height) if err != nil { @@ -189,12 +234,42 @@ func (b *Backend) TendermintBlockByNumber(blockNum rpctypes.BlockNumber) (*tmrpc if resBlock.Block == nil { b.logger.Debug("TendermintBlockByNumber block not found", "height", height) - return nil, nil + return nil, fmt.Errorf("tendermint block not found") } return resBlock, nil } +func (b *Backend) getHeightByBlockNum(blockNum rpctypes.BlockNumber) (int64, error) { + height := blockNum.Int64() + if height <= 0 { + // fetch the latest block number from the app state, more accurate than the tendermint block store state. + n, err := b.BlockNumber() + if err != nil { + return 0, err + } + height, err = ethermint.SafeHexToInt64(n) + if err != nil { + return 0, err + } + } + return height, nil +} + +// TendermintHeaderByNumber returns a Tendermint-formatted header for a given +// block number +func (b *Backend) TendermintHeaderByNumber(blockNum rpctypes.BlockNumber) (*tmrpctypes.ResultHeader, error) { + height, err := b.getHeightByBlockNum(blockNum) + if err != nil { + return nil, err + } + sc, ok := b.clientCtx.Client.(tmrpcclient.SignClient) + if !ok { + return nil, errors.New("invalid rpc client") + } + return sc.Header(b.ctx, &height) +} + // TendermintBlockResultByNumber returns a Tendermint-formatted block result // by block number func (b *Backend) TendermintBlockResultByNumber(height *int64) (*tmrpctypes.ResultBlockResults, error) { @@ -245,19 +320,26 @@ func (b *Backend) BlockNumberFromTendermint(blockNrOrHash rpctypes.BlockNumberOr // BlockNumberFromTendermintByHash returns the block height of given block hash func (b *Backend) BlockNumberFromTendermintByHash(blockHash common.Hash) (*big.Int, error) { - resBlock, err := b.TendermintBlockByHash(blockHash) + sc, ok := b.clientCtx.Client.(tmrpcclient.SignClient) + if !ok { + return nil, errors.New("invalid rpc client") + } + resHeader, err := sc.HeaderByHash(b.ctx, blockHash.Bytes()) if err != nil { return nil, err } - if resBlock == nil { - return nil, errors.Errorf("block not found for hash %s", blockHash.Hex()) + if resHeader == nil || resHeader.Header == nil { + return nil, errors.Errorf("header not found for hash %s", blockHash.Hex()) } - return big.NewInt(resBlock.Block.Height), nil + return big.NewInt(resHeader.Header.Height), nil } // EthMsgsFromTendermintBlock returns all real MsgEthereumTxs from a // Tendermint block. It also ensures consistency over the correct txs indexes // across RPC endpoints +// +// Only txs that succeeded or hit the block gas limit are included; other +// failed txs are excluded and unreachable via eth_getTransactionByHash. func (b *Backend) EthMsgsFromTendermintBlock( resBlock *tmrpctypes.ResultBlock, blockRes *tmrpctypes.ResultBlockResults, @@ -297,62 +379,71 @@ func (b *Backend) EthMsgsFromTendermintBlock( // HeaderByNumber returns the block header identified by height. func (b *Backend) HeaderByNumber(blockNum rpctypes.BlockNumber) (*ethtypes.Header, error) { - resBlock, err := b.TendermintBlockByNumber(blockNum) + res, err := b.TendermintHeaderByNumber(blockNum) if err != nil { return nil, err } - if resBlock == nil { - return nil, errors.Errorf("block not found for height %d", blockNum) + if res == nil || res.Header == nil { + return nil, errors.Errorf("header not found for height %d", blockNum) } - blockRes, err := b.TendermintBlockResultByNumber(&resBlock.Block.Height) + blockRes, err := b.TendermintBlockResultByNumber(&res.Header.Height) if err != nil { - return nil, fmt.Errorf("block result not found for height %d", resBlock.Block.Height) + return nil, fmt.Errorf("header result not found for height %d", res.Header.Height) } bloom, err := b.BlockBloom(blockRes) if err != nil { - b.logger.Debug("HeaderByNumber BlockBloom failed", "height", resBlock.Block.Height) + b.logger.Debug("HeaderByNumber BlockBloom failed", "height", res.Header.Height) } baseFee, err := b.BaseFee(blockRes) if err != nil { // handle the error for pruned node. - b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", resBlock.Block.Height, "error", err) + b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", res.Header.Height, "error", err) } - - ethHeader := rpctypes.EthHeaderFromTendermint(resBlock.Block.Header, bloom, baseFee) + validator, err := b.getValidatorAccount(res.Header) + if err != nil { + return nil, err + } + ethHeader := rpctypes.EthHeaderFromTendermint(*res.Header, bloom, baseFee, validator) return ethHeader, nil } // HeaderByHash returns the block header identified by hash. func (b *Backend) HeaderByHash(blockHash common.Hash) (*ethtypes.Header, error) { - resBlock, err := b.TendermintBlockByHash(blockHash) + sc, ok := b.clientCtx.Client.(tmrpcclient.SignClient) + if !ok { + return nil, errors.New("invalid rpc client") + } + resHeader, err := sc.HeaderByHash(b.ctx, blockHash.Bytes()) if err != nil { return nil, err } - if resBlock == nil { - return nil, errors.Errorf("block not found for hash %s", blockHash.Hex()) + if resHeader == nil || resHeader.Header == nil { + return nil, errors.Errorf("header not found for hash %s", blockHash.Hex()) } - - blockRes, err := b.TendermintBlockResultByNumber(&resBlock.Block.Height) + blockRes, err := b.TendermintBlockResultByNumber(&resHeader.Header.Height) if err != nil { - return nil, errors.Errorf("block result not found for height %d", resBlock.Block.Height) + return nil, errors.Errorf("block result not found for height %d", resHeader.Header.Height) } bloom, err := b.BlockBloom(blockRes) if err != nil { - b.logger.Debug("HeaderByHash BlockBloom failed", "height", resBlock.Block.Height) + b.logger.Debug("HeaderByHash BlockBloom failed", "height", resHeader.Header.Height) } baseFee, err := b.BaseFee(blockRes) if err != nil { // handle the error for pruned node. - b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", resBlock.Block.Height, "error", err) + b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", resHeader.Header.Height, "error", err) } - - ethHeader := rpctypes.EthHeaderFromTendermint(resBlock.Block.Header, bloom, baseFee) + validator, err := b.getValidatorAccount(resHeader.Header) + if err != nil { + return nil, err + } + ethHeader := rpctypes.EthHeaderFromTendermint(*resHeader.Header, bloom, baseFee, validator) return ethHeader, nil } @@ -381,7 +472,10 @@ func (b *Backend) RPCBlockFromTendermintBlock( ) (map[string]interface{}, error) { ethRPCTxs := []interface{}{} block := resBlock.Block - + height, err := ethermint.SafeUint64(block.Height) + if err != nil { + return nil, err + } baseFee, err := b.BaseFee(blockRes) if err != nil { // handle the error for pruned node. @@ -389,17 +483,25 @@ func (b *Backend) RPCBlockFromTendermintBlock( } msgs := b.EthMsgsFromTendermintBlock(resBlock, blockRes) + // includedMsgs mirrors ethRPCTxs; keeping them in sync ensures + // transactionsRoot matches the "transactions" array. + includedMsgs := make([]*evmtypes.MsgEthereumTx, 0, len(msgs)) for txIndex, ethMsg := range msgs { if !fullTx { ethRPCTxs = append(ethRPCTxs, ethMsg.Hash()) + includedMsgs = append(includedMsgs, ethMsg) continue } - + index, err := ethermint.SafeIntToUint64(txIndex) + if err != nil { + return nil, err + } rpcTx, err := rpctypes.NewRPCTransaction( ethMsg, common.BytesToHash(block.Hash()), - uint64(block.Height), - uint64(txIndex), + height, + safeBlockTime(block.Time.Unix()), + index, baseFee, b.chainID, ) @@ -408,6 +510,7 @@ func (b *Backend) RPCBlockFromTendermintBlock( continue } ethRPCTxs = append(ethRPCTxs, rpcTx) + includedMsgs = append(includedMsgs, ethMsg) } bloom, err := b.BlockBloom(blockRes) @@ -439,32 +542,64 @@ func (b *Backend) RPCBlockFromTendermintBlock( } } - validatorAddr := common.BytesToAddress(validatorAccAddr) - gasLimit, err := rpctypes.BlockMaxGasFromConsensusParams(ctx, b.clientCtx, block.Height) if err != nil { b.logger.Error("failed to query consensus params", "error", err.Error()) } - gasUsed := uint64(0) - + var gasUsed uint64 for _, txsResult := range blockRes.TxsResults { // workaround for cosmos-sdk bug. https://github.com/cosmos/cosmos-sdk/issues/10832 if ShouldIgnoreGasUsed(txsResult) { // block gas limit has exceeded, other txs must have failed with same reason. break } - gasUsed += uint64(txsResult.GetGasUsed()) + gas, err := ethermint.SafeUint64(txsResult.GetGasUsed()) + if err != nil { + return nil, err + } + gasUsed += gas } - formattedBlock := rpctypes.FormatBlock( - block.Header, block.Size(), - gasLimit, new(big.Int).SetUint64(gasUsed), - ethRPCTxs, bloom, validatorAddr, baseFee, - ) + ethHeader := rpctypes.EthHeaderFromTendermint(block.Header, bloom, baseFee, validatorAccAddr) + gasLimitUint64, err := ethermint.SafeUint64(gasLimit) + if err != nil { + return nil, fmt.Errorf("failed to convert gas limit: %w", err) + } + ethHeader.GasLimit = gasLimitUint64 + ethHeader.GasUsed = gasUsed + + // Build an eth block so NewBlock derives TxHash from includedMsgs, + // keeping transactionsRoot consistent with the "transactions" array. + txs := make([]*ethtypes.Transaction, len(includedMsgs)) + for i, msg := range includedMsgs { + txs[i] = msg.AsTransaction() + } + body := ðtypes.Body{ + Transactions: txs, + Uncles: []*ethtypes.Header{}, + Withdrawals: ethtypes.Withdrawals{}, + } + ethBlock := ethtypes.NewBlock(ethHeader, body, nil, trie.NewStackTrie(nil)) + formattedBlock := rpctypes.FormatBlock(ethBlock.Header(), block.Hash(), block.Size(), ethRPCTxs) return formattedBlock, nil } +// TransactionHashesFromTendermintBlock returns list of eth transaction hashes +// given Tendermint block and its block result. +func (b *Backend) TransactionHashesFromTendermintBlock( + resBlock *tmrpctypes.ResultBlock, + blockRes *tmrpctypes.ResultBlockResults, +) []common.Hash { + msgs := b.EthMsgsFromTendermintBlock(resBlock, blockRes) + ethHashes := make([]common.Hash, 0, len(msgs)) + for _, ethMsg := range msgs { + ethHashes = append(ethHashes, ethMsg.Hash()) + } + + return ethHashes +} + // EthBlockByNumber returns the Ethereum Block identified by number. func (b *Backend) EthBlockByNumber(blockNum rpctypes.BlockNumber) (*ethtypes.Block, error) { resBlock, err := b.TendermintBlockByNumber(blockNum) @@ -502,8 +637,11 @@ func (b *Backend) EthBlockFromTendermintBlock( // handle error for pruned node and log b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", height, "error", err) } - - ethHeader := rpctypes.EthHeaderFromTendermint(block.Header, bloom, baseFee) + validator, err := b.getValidatorAccount(&resBlock.Block.Header) + if err != nil { + return nil, err + } + ethHeader := rpctypes.EthHeaderFromTendermint(block.Header, bloom, baseFee, validator) msgs := b.EthMsgsFromTendermintBlock(resBlock, blockRes) txs := make([]*ethtypes.Transaction, len(msgs)) @@ -512,6 +650,11 @@ func (b *Backend) EthBlockFromTendermintBlock( } // TODO: add tx receipts - ethBlock := ethtypes.NewBlock(ethHeader, txs, nil, nil, trie.NewStackTrie(nil)) + ethBlock := ethtypes.NewBlock( + ethHeader, + ðtypes.Body{Transactions: txs, Uncles: []*ethtypes.Header{}, Withdrawals: ethtypes.Withdrawals{}}, + nil, + trie.NewStackTrie(nil), + ) return ethBlock, nil } diff --git a/rpc/backend/blocks_test.go b/rpc/backend/blocks_test.go index 431a10629c..8981225f31 100644 --- a/rpc/backend/blocks_test.go +++ b/rpc/backend/blocks_test.go @@ -1,12 +1,17 @@ package backend import ( + tmlog "cosmossdk.io/log/v2" + "encoding/json" "fmt" + dbm "github.com/cosmos/cosmos-db" + "github.com/evmos/ethermint/indexer" "math/big" sdkmath "cosmossdk.io/math" "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" + comettypes "github.com/cometbft/cometbft/types" tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" @@ -131,7 +136,7 @@ func (suite *BackendTestSuite) TestGetBlockByNumber() { true, }, { - "pass - block results error", + "fail - block results error", ethrpc.BlockNumber(1), true, sdkmath.NewInt(1).BigInt(), @@ -145,7 +150,7 @@ func (suite *BackendTestSuite) TestGetBlockByNumber() { RegisterBlockResultsError(client, blockNum.Int64()) }, true, - true, + false, }, { "pass - without tx", @@ -289,7 +294,7 @@ func (suite *BackendTestSuite) TestGetBlockByHash() { RegisterBlockResultsError(client, height) }, true, - true, + false, }, { "pass - without tx", @@ -326,7 +331,6 @@ func (suite *BackendTestSuite) TestGetBlockByHash() { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) resBlock, _ = RegisterBlockByHash(client, hash, txBz) - blockRes, _ = RegisterBlockResults(client, height) RegisterConsensusParams(client, height) @@ -547,7 +551,7 @@ func (suite *BackendTestSuite) TestTendermintBlockByNumber() { RegisterBlockNotFound(client, height) }, false, - true, + false, }, { "fail - blockNum < 0 with app state height error", @@ -674,7 +678,7 @@ func (suite *BackendTestSuite) TestTendermintBlockResultByNumber() { } func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { - var resBlock *tmrpctypes.ResultBlock + var resHeader *tmrpctypes.ResultHeader _, bz := suite.buildEthereumTx() block := tmtypes.MakeBlock(1, []tmtypes.Tx{bz}, nil, nil) @@ -701,7 +705,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { &blockHash, func(hash *common.Hash) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockByHashError(client, *hash, bz) + RegisterHeaderByHashError(client, *hash, bz) }, false, }, @@ -711,7 +715,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { &blockHash, func(hash *common.Hash) { client := suite.backend.clientCtx.Client.(*mocks.Client) - resBlock, _ = RegisterBlockByHash(client, *hash, bz) + resHeader, _ = RegisterHeaderByHash(client, *hash, bz) }, true, }, @@ -740,7 +744,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { if tc.hash == nil { suite.Require().Equal(*tc.blockNum, blockNum) } else { - expHeight := ethrpc.NewBlockNumber(big.NewInt(resBlock.Block.Height)) + expHeight := ethrpc.NewBlockNumber(big.NewInt(resHeader.Header.Height)) suite.Require().Equal(expHeight, blockNum) } } else { @@ -751,7 +755,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermint() { } func (suite *BackendTestSuite) TestBlockNumberFromTendermintByHash() { - var resBlock *tmrpctypes.ResultBlock + var resHeader *tmrpctypes.ResultHeader _, bz := suite.buildEthereumTx() block := tmtypes.MakeBlock(1, []tmtypes.Tx{bz}, nil, nil) @@ -768,7 +772,16 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermintByHash() { common.BytesToHash(block.Hash()), func(hash common.Hash) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockByHashError(client, hash, bz) + RegisterHeaderByHashError(client, hash, bz) + }, + false, + }, + { + "fail - nil response from client", + common.BytesToHash(block.Hash()), + func(hash common.Hash) { + client := suite.backend.clientCtx.Client.(*mocks.Client) + RegisterHeaderByHashNilResult(client, hash) }, false, }, @@ -777,7 +790,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermintByHash() { common.BytesToHash(emptyBlock.Hash()), func(hash common.Hash) { client := suite.backend.clientCtx.Client.(*mocks.Client) - resBlock, _ = RegisterBlockByHash(client, hash, bz) + resHeader, _ = RegisterHeaderByHash(client, hash, bz) }, true, }, @@ -786,7 +799,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermintByHash() { common.BytesToHash(block.Hash()), func(hash common.Hash) { client := suite.backend.clientCtx.Client.(*mocks.Client) - resBlock, _ = RegisterBlockByHash(client, hash, bz) + resHeader, _ = RegisterHeaderByHash(client, hash, bz) }, true, }, @@ -798,7 +811,7 @@ func (suite *BackendTestSuite) TestBlockNumberFromTendermintByHash() { tc.registerMock(tc.hash) blockNum, err := suite.backend.BlockNumberFromTendermintByHash(tc.hash) if tc.expPass { - expHeight := big.NewInt(resBlock.Block.Height) + expHeight := big.NewInt(resHeader.Header.Height) suite.Require().NoError(err) suite.Require().Equal(expHeight, blockNum) } else { @@ -1077,7 +1090,7 @@ func (suite *BackendTestSuite) TestGetEthBlockFromTendermint() { root := common.Hash{}.Bytes() receipt := ethtypes.NewReceipt(root, false, gasUsed.Uint64()) - bloom := ethtypes.CreateBloom(ethtypes.Receipts{receipt}) + bloom := ethtypes.CreateBloom(receipt) ethRPCTxs := []interface{}{} @@ -1088,6 +1101,7 @@ func (suite *BackendTestSuite) TestGetEthBlockFromTendermint() { common.BytesToHash(header.Hash()), uint64(header.Height), uint64(0), + uint64(0), tc.baseFee, suite.backend.chainID, ) @@ -1098,16 +1112,19 @@ func (suite *BackendTestSuite) TestGetEthBlockFromTendermint() { } } - expBlock = ethrpc.FormatBlock( - header, - tc.resBlock.Block.Size(), - gasLimit, - gasUsed, - ethRPCTxs, - bloom, - common.BytesToAddress(tc.validator.Bytes()), - tc.baseFee, - ) + var expTxs []*ethtypes.Transaction + if tc.expTxs { + expTxs = []*ethtypes.Transaction{msgEthereumTx.AsTransaction()} + } + ethHeader := ethrpc.EthHeaderFromTendermint(header, bloom, tc.baseFee, tc.validator) + ethHeader.GasLimit = uint64(gasLimit) + ethHeader.GasUsed = gasUsed.Uint64() + expEthBlock := ethtypes.NewBlock(ethHeader, ðtypes.Body{ + Transactions: expTxs, + Uncles: []*ethtypes.Header{}, + Withdrawals: ethtypes.Withdrawals{}, + }, nil, trie.NewStackTrie(nil)) + expBlock = ethrpc.FormatBlock(expEthBlock.Header(), header.Hash(), tc.resBlock.Block.Size(), ethRPCTxs) if tc.expPass { suite.Require().Equal(expBlock, block) @@ -1178,15 +1195,23 @@ func (suite *BackendTestSuite) TestEthMsgsFromTendermintBlock() { suite.SetupTest() // reset test and queries msgs := suite.backend.EthMsgsFromTendermintBlock(tc.resBlock, tc.blockRes) - suite.Require().Equal(tc.expMsgs, msgs) + suite.Require().Equal(len(tc.expMsgs), len(msgs)) + for i, expMsg := range tc.expMsgs { + expBytes, err := json.Marshal(expMsg) + suite.Require().Nil(err) + bytes, err := json.Marshal(msgs[i]) + suite.Require().Nil(err) + suite.Require().Equal(expBytes, bytes) + } }) } } func (suite *BackendTestSuite) TestHeaderByNumber() { - var expResultBlock *tmrpctypes.ResultBlock + var expResultHeader *tmrpctypes.ResultHeader _, bz := suite.buildEthereumTx() + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) testCases := []struct { name string @@ -1202,29 +1227,29 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { func(blockNum ethrpc.BlockNumber, baseFee sdkmath.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockError(client, height) + RegisterHeaderError(client, &height) }, false, }, { - "fail - block not found for height", + "fail - header not found for height", ethrpc.BlockNumber(1), sdkmath.NewInt(1).BigInt(), func(blockNum ethrpc.BlockNumber, baseFee sdkmath.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockNotFound(client, height) + RegisterHeaderNotFound(client, height) }, false, }, { - "fail - block not found for height", + "fail - header not found for height", ethrpc.BlockNumber(1), sdkmath.NewInt(1).BigInt(), func(blockNum ethrpc.BlockNumber, baseFee sdkmath.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlock(client, height, nil) + RegisterHeader(client, &height, nil) RegisterBlockResultsError(client, height) }, false, @@ -1236,11 +1261,12 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { func(blockNum ethrpc.BlockNumber, baseFee sdkmath.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) - expResultBlock, _ = RegisterBlock(client, height, nil) + expResultHeader, _ = RegisterHeader(client, &height, nil) RegisterBlockResults(client, height) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFeeError(queryClient) + RegisterValidatorAccount(queryClient, validator) }, true, }, @@ -1251,11 +1277,12 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { func(blockNum ethrpc.BlockNumber, baseFee sdkmath.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) - expResultBlock, _ = RegisterBlock(client, height, nil) + expResultHeader, _ = RegisterHeader(client, &height, nil) RegisterBlockResults(client, height) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, true, }, @@ -1266,11 +1293,12 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { func(blockNum ethrpc.BlockNumber, baseFee sdkmath.Int) { height := blockNum.Int64() client := suite.backend.clientCtx.Client.(*mocks.Client) - expResultBlock, _ = RegisterBlock(client, height, bz) + expResultHeader, _ = RegisterHeader(client, &height, bz) RegisterBlockResults(client, height) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, true, }, @@ -1283,7 +1311,7 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { header, err := suite.backend.HeaderByNumber(tc.blockNumber) if tc.expPass { - expHeader := ethrpc.EthHeaderFromTendermint(expResultBlock.Block.Header, ethtypes.Bloom{}, tc.baseFee) + expHeader := ethrpc.EthHeaderFromTendermint(*expResultHeader.Header, ethtypes.Bloom{}, tc.baseFee, validator) suite.Require().NoError(err) suite.Require().Equal(expHeader, header) } else { @@ -1294,11 +1322,13 @@ func (suite *BackendTestSuite) TestHeaderByNumber() { } func (suite *BackendTestSuite) TestHeaderByHash() { - var expResultBlock *tmrpctypes.ResultBlock + var resHeader *tmrpctypes.ResultHeader _, bz := suite.buildEthereumTx() block := tmtypes.MakeBlock(1, []tmtypes.Tx{bz}, nil, nil) emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil) + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + emptyBlock.Header.ProposerAddress = validator.Bytes() testCases := []struct { name string @@ -1313,17 +1343,27 @@ func (suite *BackendTestSuite) TestHeaderByHash() { sdkmath.NewInt(1).BigInt(), func(hash common.Hash, baseFee sdkmath.Int) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockByHashError(client, hash, bz) + RegisterHeaderByHashError(client, hash, bz) }, false, }, { - "fail - block not found for height", + "fail - nil response from client", common.BytesToHash(block.Hash()), sdkmath.NewInt(1).BigInt(), func(hash common.Hash, baseFee sdkmath.Int) { client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockByHashNotFound(client, hash, bz) + RegisterHeaderByHashNilResult(client, hash) + }, + false, + }, + { + "fail - header not found for height", + common.BytesToHash(block.Hash()), + sdkmath.NewInt(1).BigInt(), + func(hash common.Hash, baseFee sdkmath.Int) { + client := suite.backend.clientCtx.Client.(*mocks.Client) + RegisterHeaderByHashNotFound(client, hash, bz) }, false, }, @@ -1334,7 +1374,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() { func(hash common.Hash, baseFee sdkmath.Int) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) - RegisterBlockByHash(client, hash, bz) + RegisterHeaderByHash(client, hash, bz) RegisterBlockResultsError(client, height) }, false, @@ -1346,11 +1386,12 @@ func (suite *BackendTestSuite) TestHeaderByHash() { func(hash common.Hash, baseFee sdkmath.Int) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) - expResultBlock, _ = RegisterBlockByHash(client, hash, bz) + resHeader, _ = RegisterHeaderByHash(client, hash, bz) RegisterBlockResults(client, height) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFeeError(queryClient) + RegisterValidatorAccount(queryClient, validator) }, true, }, @@ -1361,11 +1402,12 @@ func (suite *BackendTestSuite) TestHeaderByHash() { func(hash common.Hash, baseFee sdkmath.Int) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) - expResultBlock, _ = RegisterBlockByHash(client, hash, nil) + resHeader, _ = RegisterHeaderByHash(client, hash, bz) RegisterBlockResults(client, height) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, true, }, @@ -1376,11 +1418,12 @@ func (suite *BackendTestSuite) TestHeaderByHash() { func(hash common.Hash, baseFee sdkmath.Int) { height := int64(1) client := suite.backend.clientCtx.Client.(*mocks.Client) - expResultBlock, _ = RegisterBlockByHash(client, hash, bz) + resHeader, _ = RegisterHeaderByHash(client, hash, bz) RegisterBlockResults(client, height) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, true, }, @@ -1393,7 +1436,7 @@ func (suite *BackendTestSuite) TestHeaderByHash() { header, err := suite.backend.HeaderByHash(tc.hash) if tc.expPass { - expHeader := ethrpc.EthHeaderFromTendermint(expResultBlock.Block.Header, ethtypes.Bloom{}, tc.baseFee) + expHeader := ethrpc.EthHeaderFromTendermint(*resHeader.Header, ethtypes.Bloom{}, tc.baseFee, validator) suite.Require().NoError(err) suite.Require().Equal(expHeader, header) } else { @@ -1406,6 +1449,8 @@ func (suite *BackendTestSuite) TestHeaderByHash() { func (suite *BackendTestSuite) TestEthBlockByNumber() { msgEthereumTx, bz := suite.buildEthereumTx() emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil) + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + emptyBlock.Header.ProposerAddress = validator.Bytes() testCases := []struct { name string @@ -1449,17 +1494,21 @@ func (suite *BackendTestSuite) TestEthBlockByNumber() { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) baseFee := sdkmath.NewInt(1) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, ethtypes.NewBlock( ethrpc.EthHeaderFromTendermint( emptyBlock.Header, ethtypes.Bloom{}, sdkmath.NewInt(1).BigInt(), + validator, ), - []*ethtypes.Transaction{}, - nil, - nil, + ðtypes.Body{ + Transactions: []*ethtypes.Transaction{}, + Withdrawals: ethtypes.Withdrawals{}, + }, nil, + trie.NewStackTrie(nil), ), true, }, @@ -1475,15 +1524,19 @@ func (suite *BackendTestSuite) TestEthBlockByNumber() { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) baseFee := sdkmath.NewInt(1) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, ethtypes.NewBlock( ethrpc.EthHeaderFromTendermint( emptyBlock.Header, ethtypes.Bloom{}, sdkmath.NewInt(1).BigInt(), + validator, ), - []*ethtypes.Transaction{msgEthereumTx.AsTransaction()}, - nil, + ðtypes.Body{ + Transactions: []*ethtypes.Transaction{msgEthereumTx.AsTransaction()}, + Withdrawals: ethtypes.Withdrawals{}, + }, nil, trie.NewStackTrie(nil), ), @@ -1520,6 +1573,9 @@ func (suite *BackendTestSuite) TestEthBlockByNumber() { func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() { msgEthereumTx, bz := suite.buildEthereumTx() emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil) + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + emptyBlock.Header.ProposerAddress = validator.Bytes() + consAddress := sdk.ConsAddress(emptyBlock.Header.ProposerAddress).String() testCases := []struct { name string @@ -1543,17 +1599,21 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() { func(baseFee sdkmath.Int, blockNum int64) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccountWithConsAddress(queryClient, validator, consAddress) }, ethtypes.NewBlock( ethrpc.EthHeaderFromTendermint( emptyBlock.Header, ethtypes.Bloom{}, sdkmath.NewInt(1).BigInt(), + validator, ), - []*ethtypes.Transaction{}, - nil, - nil, + ðtypes.Body{ + Transactions: []*ethtypes.Transaction{}, + Withdrawals: ethtypes.Withdrawals{}, + }, nil, + trie.NewStackTrie(nil), ), true, }, @@ -1578,15 +1638,19 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() { func(baseFee sdkmath.Int, blockNum int64) { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, ethtypes.NewBlock( ethrpc.EthHeaderFromTendermint( emptyBlock.Header, ethtypes.Bloom{}, sdkmath.NewInt(1).BigInt(), + validator, ), - []*ethtypes.Transaction{msgEthereumTx.AsTransaction()}, - nil, + ðtypes.Body{ + Transactions: []*ethtypes.Transaction{msgEthereumTx.AsTransaction()}, + Withdrawals: ethtypes.Withdrawals{}, + }, nil, trie.NewStackTrie(nil), ), @@ -1615,3 +1679,160 @@ func (suite *BackendTestSuite) TestEthBlockFromTendermintBlock() { }) } } + +// TODO fix this test case and TestGetTransactionReceipt +func (suite *BackendTestSuite) TestEthBlockReceipts() { + msgEthereumTx, _ := suite.buildEthereumTx() + txBz := suite.signAndEncodeEthTx(msgEthereumTx) + txHash := msgEthereumTx.Hash() + + testCases := []struct { + name string + registerMock func() + tx *evmtypes.MsgEthereumTx + block *comettypes.Block + blockResult []*types.ExecTxResult + expTxReceipt map[string]interface{} + expPass bool + }{ + { + "fail - Receipts do not match ", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + RegisterBlock(client, 1, txBz) + RegisterBlockResults(client, 1) + }, + msgEthereumTx, + &comettypes.Block{Header: comettypes.Header{Height: 1}, Data: comettypes.Data{Txs: []comettypes.Tx{txBz}}}, + []*types.ExecTxResult{ + { + Code: 0, + Events: []types.Event{ + {Type: evmtypes.EventTypeEthereumTx, Attributes: []types.EventAttribute{ + {Key: "ethereumTxHash", Value: txHash.Hex()}, + {Key: "txIndex", Value: "0"}, + {Key: "amount", Value: "1000"}, + {Key: "txGasUsed", Value: "21000"}, + {Key: "txHash", Value: ""}, + {Key: "recipient", Value: "0x775b87ef5D82ca211811C1a02CE0fE0CA3a455d7"}, + }}, + }, + }, + }, + map[string]interface{}(nil), + false, + }, + { + "Success - Receipts match", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + RegisterBlock(client, 1, txBz) + RegisterBlockResults(client, 1) + }, + msgEthereumTx, + &comettypes.Block{Header: comettypes.Header{Height: 1}, Data: comettypes.Data{Txs: []comettypes.Tx{txBz}}}, + []*types.ExecTxResult{ + { + Code: 0, + Events: []types.Event{ + {Type: evmtypes.EventTypeEthereumTx, Attributes: []types.EventAttribute{ + {Key: "ethereumTxHash", Value: txHash.Hex()}, + {Key: "txIndex", Value: "0"}, + {Key: "amount", Value: "1000"}, + {Key: "txGasUsed", Value: "21000"}, + {Key: "txHash", Value: ""}, + {Key: "recipient", Value: "0x775b87ef5D82ca211811C1a02CE0fE0CA3a455d7"}, + }}, + }, + }, + }, + map[string]interface{}(nil), + false, //needs to be set to true + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.SetupTest() // reset test and queries + tc.registerMock() + + db := dbm.NewMemDB() + suite.backend.indexer = indexer.NewKVIndexer(db, tmlog.NewNopLogger(), suite.backend.clientCtx) + err := suite.backend.indexer.IndexBlock(tc.block, tc.blockResult) + suite.Require().NoError(err) + + blockNum := ethrpc.BlockNumber(1) + receipts, err := suite.backend.GetBlockReceipts(ethrpc.BlockNumberOrHash{BlockNumber: &blockNum}) + + for receipt := range receipts { + if tc.expPass { + suite.Require().NoError(err) + suite.Require().Equal(receipt, tc.expTxReceipt) + } else { + suite.Require().NotEqual(receipt, tc.expTxReceipt) + } + } + + }) + } +} + +func (suite *BackendTestSuite) TestGetBlockReceipts_BlockLookupError() { + suite.SetupTest() + client := suite.backend.clientCtx.Client.(*mocks.Client) + RegisterBlockError(client, 1) + + blockNum := ethrpc.BlockNumber(1) + receipts, err := suite.backend.GetBlockReceipts(ethrpc.BlockNumberOrHash{BlockNumber: &blockNum}) + suite.Require().Error(err, "block lookup error must be propagated, not swallowed") + suite.Require().Nil(receipts) +} + +func (suite *BackendTestSuite) TestTransactionHashesFromTendermintBlock() { + msgEthereumTx, bz := suite.buildEthereumTx() + emptyBlock := tmtypes.MakeBlock(1, []tmtypes.Tx{}, nil, nil) + testCases := []struct { + name string + resBlock *tmrpctypes.ResultBlock + blockRes *tmrpctypes.ResultBlockResults + expHashes []common.Hash + }{ + { + "empty block", + &tmrpctypes.ResultBlock{ + Block: emptyBlock, + }, + &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*types.ExecTxResult{{Code: 0, GasUsed: 0}}, + }, + []common.Hash{}, + }, + { + "block with tx", + &tmrpctypes.ResultBlock{ + Block: tmtypes.MakeBlock(1, []tmtypes.Tx{bz}, nil, nil), + }, + &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*types.ExecTxResult{{Code: 0, GasUsed: 0}}, + FinalizeBlockEvents: []types.Event{ + { + Type: evmtypes.EventTypeBlockBloom, + Attributes: []types.EventAttribute{ + {Key: string(bAttributeKeyEthereumBloom)}, + }, + }, + }, + }, + []common.Hash{msgEthereumTx.Hash()}, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.name), func() { + suite.SetupTest() // reset test and queries + hashes := suite.backend.TransactionHashesFromTendermintBlock(tc.resBlock, tc.blockRes) + + suite.Require().Equal(tc.expHashes, hashes) + }) + } +} diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index f9be170c78..558611b233 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -116,6 +116,10 @@ func (b *Backend) Resend(args evmtypes.TransactionArgs, gasPrice *hexutil.Big, g } // SendRawTransaction send a raw Ethereum transaction. +// +// Note: unlike geth and cosmos-evm (which queue future nonces), CometBFT's mempool +// requires the exact next nonce — future nonces are rejected. Clients must submit +// transactions in strict nonce order. func (b *Backend) SendRawTransaction(data hexutil.Bytes) (common.Hash, error) { // RLP decode raw transaction bytes var tx ethtypes.Transaction @@ -124,44 +128,54 @@ func (b *Backend) SendRawTransaction(data hexutil.Bytes) (common.Hash, error) { return common.Hash{}, err } + // Ensure the transaction fee is reasonable — matches geth's SubmitTransaction. + if err := rpctypes.CheckTxFee(tx.GasPrice(), tx.Gas(), b.RPCTxFeeCap()); err != nil { + return common.Hash{}, err + } + // check the local node config in case unprotected txs are disabled if !b.UnprotectedAllowed() && !tx.Protected() { // Ensure only eip155 signed transactions are submitted if EIP155Required is set. return common.Hash{}, errors.New("only replay-protected (EIP-155) transactions allowed over RPC") } + // Reject transactions targeting a different chain. + if tx.Protected() && tx.ChainId().Cmp(b.chainID) != 0 { + return common.Hash{}, fmt.Errorf("incorrect chain-id; expected %d, got %d", b.chainID, tx.ChainId()) + } + var ethereumTx evmtypes.MsgEthereumTx if err := ethereumTx.FromSignedEthereumTx(&tx, ethtypes.LatestSignerForChainID(b.chainID)); err != nil { b.logger.Error("transaction converting failed", "error", err.Error()) - return common.Hash{}, err + return common.Hash{}, fmt.Errorf("failed to convert ethereum transaction: %w", err) } if err := ethereumTx.ValidateBasic(); err != nil { b.logger.Debug("tx failed basic validation", "error", err.Error()) - return common.Hash{}, err + return common.Hash{}, fmt.Errorf("failed to validate transaction: %w", err) } // Query params to use the EVM denomination res, err := b.queryClient.Params(b.ctx, &evmtypes.QueryParamsRequest{}) if err != nil { b.logger.Error("failed to query evm params", "error", err.Error()) - return common.Hash{}, err + return common.Hash{}, fmt.Errorf("failed to query evm params: %w", err) } cosmosTx, err := ethereumTx.BuildTx(b.clientCtx.TxConfig.NewTxBuilder(), res.Params.EvmDenom) if err != nil { b.logger.Error("failed to build cosmos tx", "error", err.Error()) - return common.Hash{}, err + return common.Hash{}, fmt.Errorf("failed to build cosmos tx: %w", err) } // Encode transaction by default Tx encoder txBytes, err := b.clientCtx.TxConfig.TxEncoder()(cosmosTx) if err != nil { b.logger.Error("failed to encode eth tx using default encoder", "error", err.Error()) - return common.Hash{}, err + return common.Hash{}, fmt.Errorf("failed to encode cosmos tx: %w", err) } - txHash := ethereumTx.Hash() + txHash := tx.Hash() syncCtx := b.clientCtx.WithBroadcastMode(flags.BroadcastSync) rsp, err := syncCtx.BroadcastTx(txBytes) @@ -173,6 +187,14 @@ func (b *Backend) SendRawTransaction(data hexutil.Bytes) (common.Hash, error) { return txHash, err } + // Log submitted transaction for manual investigation (mirrors geth's SubmitTransaction). + from := common.BytesToAddress(ethereumTx.GetFrom()) + if tx.To() == nil { + b.logger.Info("Submitted contract creation", "hash", txHash.Hex(), "from", from, "nonce", tx.Nonce()) + } else { + b.logger.Info("Submitted transaction", "hash", txHash.Hex(), "from", from, "nonce", tx.Nonce(), "recipient", tx.To()) + } + return txHash, nil } @@ -245,6 +267,9 @@ func (b *Backend) SetTxDefaults(args evmtypes.TransactionArgs) (evmtypes.Transac args.Value = new(hexutil.Big) } if args.Nonce == nil { + if args.From == nil { + return args, errors.New("missing from in argument") + } // get the nonce from the account retriever // ignore error in case tge account doesn't exist yet nonce, _ := b.getAccountNonce(*args.From, true, 0, b.logger) @@ -292,7 +317,7 @@ func (b *Backend) SetTxDefaults(args evmtypes.TransactionArgs) (evmtypes.Transac } blockNr := rpctypes.NewBlockNumber(big.NewInt(0)) - estimated, err := b.EstimateGas(callArgs, &blockNr) + estimated, err := b.EstimateGas(callArgs, &blockNr, nil) if err != nil { return args, err } @@ -313,16 +338,17 @@ func (b *Backend) handleRevertError(vmError string, ret []byte) error { if vmError != vm.ErrExecutionReverted.Error() { return status.Error(codes.Internal, vmError) } - if len(ret) == 0 { - return errors.New(vmError) - } return evmtypes.NewExecErrorWithReason(ret) } return nil } // EstimateGas returns an estimate of gas usage for the given smart contract call. -func (b *Backend) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) { +func (b *Backend) EstimateGas( + args evmtypes.TransactionArgs, + blockNrOptional *rpctypes.BlockNumber, + overrides *json.RawMessage, +) (hexutil.Uint64, error) { blockNr := rpctypes.EthPendingBlockNumber if blockNrOptional != nil { blockNr = *blockNrOptional @@ -333,17 +359,23 @@ func (b *Backend) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rp return 0, err } - header, err := b.TendermintBlockByNumber(blockNr) + header, err := b.TendermintHeaderByNumber(blockNr) if err != nil { // the error message imitates geth behavior return 0, errors.New("header not found") } + var bzOverrides []byte + if overrides != nil { + bzOverrides = *overrides + } + req := evmtypes.EthCallRequest{ Args: bz, GasCap: b.RPCGasCap(), - ProposerAddress: sdk.ConsAddress(header.Block.ProposerAddress), + ProposerAddress: sdk.ConsAddress(header.Header.ProposerAddress), ChainId: b.chainID.Int64(), + Overrides: bzOverrides, } // From ContextWithHeight: if the provided height is 0, @@ -360,21 +392,21 @@ func (b *Backend) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rp } // DoCall performs a simulated call operation through the evmtypes. It returns the -// estimated gas used on the operation or an error if fails. +// EthCallResponse containing the result of the call or an error if fails. func (b *Backend) DoCall( - args evmtypes.TransactionArgs, blockNr rpctypes.BlockNumber, + args evmtypes.TransactionArgs, + blockNr rpctypes.BlockNumber, overrides *json.RawMessage, -) (*evmtypes.MsgEthereumTxResponse, error) { +) (*evmtypes.EthCallResponse, error) { bz, err := json.Marshal(&args) if err != nil { return nil, err } - header, err := b.TendermintBlockByNumber(blockNr) + header, err := b.TendermintHeaderByNumber(blockNr) if err != nil { // the error message imitates geth behavior return nil, errors.New("header not found") } - var bzOverrides []byte if overrides != nil { bzOverrides = *overrides @@ -383,7 +415,7 @@ func (b *Backend) DoCall( req := evmtypes.EthCallRequest{ Args: bz, GasCap: b.RPCGasCap(), - ProposerAddress: sdk.ConsAddress(header.Block.ProposerAddress), + ProposerAddress: sdk.ConsAddress(header.Header.ProposerAddress), ChainId: b.chainID.Int64(), Overrides: bzOverrides, } @@ -413,7 +445,7 @@ func (b *Backend) DoCall( } length := len(res.Ret) if length > int(b.cfg.JSONRPC.ReturnDataLimit) && b.cfg.JSONRPC.ReturnDataLimit != 0 { - return nil, fmt.Errorf("call retuned result on length %d exceeding limit %d", length, b.cfg.JSONRPC.ReturnDataLimit) + return nil, fmt.Errorf("call returned result of length %d exceeding limit %d", length, b.cfg.JSONRPC.ReturnDataLimit) } if err = b.handleRevertError(res.VmError, res.Ret); err != nil { @@ -454,3 +486,66 @@ func (b *Backend) GasPrice() (*hexutil.Big, error) { return (*hexutil.Big)(result), nil } + +// CreateAccessListCall performs a simulated call operation through the evmtypes. It returns a +// list of accessed slot and an estimated gas used on the operation or an error if fails. +func (b *Backend) CreateAccessListCall( + args evmtypes.TransactionArgs, + blockNr rpctypes.BlockNumber, + overrides *json.RawMessage, +) (*evmtypes.AccessListResult, error) { + bz, err := json.Marshal(&args) + if err != nil { + return nil, err + } + header, err := b.TendermintHeaderByNumber(blockNr) + if err != nil { + // the error message imitates geth behavior + return nil, errors.New("header not found") + } + var bzOverrides []byte + if overrides != nil { + bzOverrides = *overrides + } + + req := evmtypes.EthCallRequest{ + Args: bz, + GasCap: b.RPCGasCap(), + ProposerAddress: sdk.ConsAddress(header.Header.ProposerAddress), + ChainId: b.chainID.Int64(), + Overrides: bzOverrides, + } + + // From ContextWithHeight: if the provided height is 0, + // it will return an empty context and the gRPC query will use + // the latest block height for querying. + ctx := rpctypes.ContextWithHeight(blockNr.Int64()) + timeout := b.RPCEVMTimeout() + + // Setup context so it may be canceled the call has completed + // or, in case of unmetered gas, setup a context with a timeout. + var cancel context.CancelFunc + if timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + + // Make sure the context is canceled when the call has completed + // this makes sure resources are cleaned up. + defer cancel() + + res, err := b.queryClient.CreateAccessList(ctx, &req) + if err != nil { + b.logger.Error("error access list call", "err", err) + return nil, err + } + if res == nil { + return nil, errors.New("result is nil") + } + var accessListResult evmtypes.AccessListResult + if err := json.Unmarshal(res.GetData(), &accessListResult); err != nil { + return nil, err + } + return &accessListResult, nil +} diff --git a/rpc/backend/call_tx_test.go b/rpc/backend/call_tx_test.go index dc2865791d..74894b5bbd 100644 --- a/rpc/backend/call_tx_test.go +++ b/rpc/backend/call_tx_test.go @@ -6,8 +6,10 @@ import ( "math/big" sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" "github.com/evmos/ethermint/rpc/backend/mocks" rpctypes "github.com/evmos/ethermint/rpc/types" @@ -22,6 +24,8 @@ func (suite *BackendTestSuite) TestResend() { gasPrice := new(hexutil.Big) toAddr := tests.GenerateAddress() chainID := (*hexutil.Big)(suite.backend.chainID) + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + height := int64(1) callArgs := evmtypes.TransactionArgs{ From: nil, To: &toAddr, @@ -63,10 +67,11 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) + RegisterParams(queryClient, &header, height) + RegisterHeader(client, &height, nil) RegisterBlockResults(client, 1) RegisterBaseFeeDisabled(queryClient) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -84,11 +89,12 @@ func (suite *BackendTestSuite) TestResend() { client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) feeMarketClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) - RegisterParams(queryClient, &header, 1) - RegisterFeeMarketParams(feeMarketClient, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterParams(queryClient, &header, height) + RegisterFeeMarketParams(feeMarketClient, height) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -104,10 +110,11 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterParams(queryClient, &header, height) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFeeDisabled(queryClient) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -140,8 +147,8 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterParams(queryClient, &header, 1) - RegisterBlockError(client, 1) + RegisterParams(queryClient, &header, height) + RegisterHeaderError(client, &height) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -157,10 +164,11 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterParams(queryClient, &header, height) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -180,10 +188,11 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterParams(queryClient, &header, height) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -201,13 +210,14 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) RegisterEstimateGas(queryClient, callArgs) - RegisterParams(queryClient, &header, 1) - RegisterParamsWithoutHeader(queryClient, 1) + RegisterParams(queryClient, &header, height) + RegisterParamsWithoutHeader(queryClient, height) RegisterUnconfirmedTxsError(client, nil) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -229,13 +239,14 @@ func (suite *BackendTestSuite) TestResend() { var header metadata.MD client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) RegisterEstimateGas(queryClient, callArgs) - RegisterParams(queryClient, &header, 1) - RegisterParamsWithoutHeader(queryClient, 1) + RegisterParams(queryClient, &header, height) + RegisterParamsWithoutHeader(queryClient, height) RegisterUnconfirmedTxsEmpty(client, nil) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ Nonce: &txNonce, @@ -275,6 +286,26 @@ func (suite *BackendTestSuite) TestSendRawTransaction() { cosmosTx, _ := ethTx.BuildTx(suite.backend.clientCtx.TxConfig.NewTxBuilder(), "aphoton") txBytes, _ := suite.backend.clientCtx.TxConfig.TxEncoder()(cosmosTx) + // Build a tx whose fee exceeds the default 1 ether cap (gasPrice * gas > 1e18). + highFeeTx := evmtypes.NewTx( + suite.backend.chainID, 0, &common.Address{}, big.NewInt(0), + 100000, new(big.Int).Mul(big.NewInt(1e10), big.NewInt(1e9)), // 10 gwei * 100k gas = 1e6 gwei > 1 ether... actually 1e10 * 1e9 = 1e19 wei = 10 ether + nil, nil, nil, nil, + ) + highFeeTx.From = suite.signerAddress + _ = highFeeTx.Sign(ethtypes.LatestSignerForChainID(suite.backend.chainID), suite.signer) + highFeeRlp, _ := rlp.EncodeToBytes(highFeeTx.AsTransaction()) + + // Build a tx signed with a different chain ID. + wrongChainID := new(big.Int).Add(suite.backend.chainID, big.NewInt(1)) + wrongChainTx := evmtypes.NewTx( + wrongChainID, 0, &common.Address{}, big.NewInt(0), + 100000, big.NewInt(1), nil, nil, nil, nil, + ) + wrongChainTx.From = suite.signerAddress + _ = wrongChainTx.Sign(ethtypes.LatestSignerForChainID(wrongChainID), suite.signer) + wrongChainRlp, _ := rlp.EncodeToBytes(wrongChainTx.AsTransaction()) + testCases := []struct { name string registerMock func() @@ -296,6 +327,23 @@ func (suite *BackendTestSuite) TestSendRawTransaction() { common.Hash{}, false, }, + { + "fail - fee exceeds configured cap", + func() { + suite.backend.allowUnprotectedTxs = true + suite.backend.cfg.JSONRPC.TxFeeCap = 1.0 // 1 ether cap + }, + highFeeRlp, + common.Hash{}, + false, + }, + { + "fail - wrong chain ID", + func() { suite.backend.allowUnprotectedTxs = true }, + wrongChainRlp, + common.Hash{}, + false, + }, { "fail - unprotected transactions", func() { @@ -388,7 +436,7 @@ func (suite *BackendTestSuite) TestDoCall() { registerMock func() blockNum rpctypes.BlockNumber callArgs evmtypes.TransactionArgs - expEthTx *evmtypes.MsgEthereumTxResponse + expEthTx *evmtypes.EthCallResponse expPass bool }{ { @@ -396,12 +444,13 @@ func (suite *BackendTestSuite) TestDoCall() { func() { client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterBlock(client, 1, bz) + height := int64(1) + RegisterHeader(client, &height, bz) RegisterEthCallError(queryClient, &evmtypes.EthCallRequest{Args: argsBz, ChainId: suite.backend.chainID.Int64()}) }, rpctypes.BlockNumber(1), callArgs, - &evmtypes.MsgEthereumTxResponse{}, + &evmtypes.EthCallResponse{}, false, }, { @@ -409,12 +458,13 @@ func (suite *BackendTestSuite) TestDoCall() { func() { client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterBlock(client, 1, bz) + height := int64(1) + RegisterHeader(client, &height, bz) RegisterEthCall(queryClient, &evmtypes.EthCallRequest{Args: argsBz, ChainId: suite.backend.chainID.Int64()}) }, rpctypes.BlockNumber(1), callArgs, - &evmtypes.MsgEthereumTxResponse{}, + &evmtypes.EthCallResponse{}, true, }, } @@ -437,7 +487,8 @@ func (suite *BackendTestSuite) TestDoCall() { func (suite *BackendTestSuite) TestGasPrice() { defaultGasPrice := (*hexutil.Big)(big.NewInt(1)) - + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + height := int64(1) testCases := []struct { name string registerMock func() @@ -451,11 +502,12 @@ func (suite *BackendTestSuite) TestGasPrice() { client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) feeMarketClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) - RegisterFeeMarketParams(feeMarketClient, 1) - RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterFeeMarketParams(feeMarketClient, height) + RegisterParams(queryClient, &header, height) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, sdkmath.NewInt(1)) + RegisterValidatorAccount(queryClient, validator) }, defaultGasPrice, true, @@ -467,11 +519,12 @@ func (suite *BackendTestSuite) TestGasPrice() { client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) feeMarketClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) - RegisterFeeMarketParamsError(feeMarketClient, 1) - RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterFeeMarketParamsError(feeMarketClient, height) + RegisterParams(queryClient, &header, height) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, sdkmath.NewInt(1)) + RegisterValidatorAccount(queryClient, validator) }, defaultGasPrice, false, @@ -492,3 +545,108 @@ func (suite *BackendTestSuite) TestGasPrice() { }) } } + +func (suite *BackendTestSuite) TestCreateAccessListCall() { + _, bz := suite.buildEthereumTx() + toAddr := tests.GenerateAddress() + chainID := (*hexutil.Big)(suite.backend.chainID) + callArgs := evmtypes.TransactionArgs{ + To: &toAddr, + ChainID: chainID, + } + argsBz, err := json.Marshal(callArgs) + suite.Require().NoError(err) + + baseReq := &evmtypes.EthCallRequest{ + Args: argsBz, + GasCap: suite.backend.RPCGasCap(), + ChainId: suite.backend.chainID.Int64(), + } + + successData := func(gasUsed uint64, vmErr string) []byte { + al := evmtypes.AccessListResult{ + AccessList: ethtypes.AccessList{}, + GasUsed: hexutil.Uint64(gasUsed), + Error: vmErr, + } + bz, _ := json.Marshal(al) + return bz + } + + testCases := []struct { + name string + registerMock func() + expResult *evmtypes.AccessListResult + expPass bool + }{ + { + "fail - header not found", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + height := int64(1) + RegisterHeaderError(client, &height) + }, + nil, + false, + }, + { + "fail - grpc returns error", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + height := int64(1) + RegisterHeader(client, &height, bz) + RegisterCreateAccessListError(queryClient, baseReq) + }, + nil, + false, + }, + { + "pass - success with gas used hex-encoded", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + height := int64(1) + RegisterHeader(client, &height, bz) + RegisterCreateAccessList(queryClient, baseReq, successData(21000, "")) + }, + &evmtypes.AccessListResult{ + AccessList: ethtypes.AccessList{}, + GasUsed: hexutil.Uint64(21000), + Error: "", + }, + true, + }, + { + "pass - vm error propagated in Error field", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + height := int64(1) + RegisterHeader(client, &height, bz) + RegisterCreateAccessList(queryClient, baseReq, successData(21000, "execution reverted")) + }, + &evmtypes.AccessListResult{ + AccessList: ethtypes.AccessList{}, + GasUsed: hexutil.Uint64(21000), + Error: "execution reverted", + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("case %s", tc.name), func() { + suite.SetupTest() + tc.registerMock() + + result, err := suite.backend.CreateAccessListCall(callArgs, rpctypes.BlockNumber(1), nil) + if tc.expPass { + suite.Require().NoError(err) + suite.Require().Equal(tc.expResult, result) + } else { + suite.Require().Error(err) + } + }) + } +} diff --git a/rpc/backend/chain_info.go b/rpc/backend/chain_info.go index 883b062544..9c16034bce 100644 --- a/rpc/backend/chain_info.go +++ b/rpc/backend/chain_info.go @@ -17,6 +17,7 @@ package backend import ( "fmt" + "math" "math/big" "strconv" "sync" @@ -28,7 +29,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" + gethmath "github.com/ethereum/go-ethereum/common/math" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" @@ -41,18 +42,20 @@ import ( // ChainID is the EIP-155 replay-protection chain id for the current ethereum chain config. func (b *Backend) ChainID() (*hexutil.Big, error) { - eip155ChainID, err := ethermint.ParseChainID(b.clientCtx.ChainID) - if err != nil { - panic(err) - } // if current block is at or past the EIP-155 replay-protection fork block, return chainID from config bn, err := b.BlockNumber() if err != nil { b.logger.Debug("failed to fetch latest block number", "error", err.Error()) - return (*hexutil.Big)(eip155ChainID), nil + return (*hexutil.Big)(b.chainID), nil + } + + config := b.ChainConfig() + if config == nil { + // assume eip-155 is enabled + return (*hexutil.Big)(b.chainID), nil } - if config := b.ChainConfig(); config.IsEIP155(new(big.Int).SetUint64(uint64(bn))) { + if config.IsEIP155(new(big.Int).SetUint64(uint64(bn))) { return (*hexutil.Big)(config.ChainID), nil } @@ -170,7 +173,7 @@ var ( // FeeHistory returns data relevant for fee estimation based on the specified range of blocks. func (b *Backend) FeeHistory( - userBlockCount math.HexOrDecimal64, // number blocks to fetch, maximum is 100 + userBlockCount gethmath.HexOrDecimal64, // number blocks to fetch, maximum is 100 lastBlock rpc.BlockNumber, // the block to start search , to oldest rewardPercentiles []float64, // percentiles to fetch reward ) (*rpctypes.FeeHistoryResult, error) { @@ -182,21 +185,45 @@ func (b *Backend) FeeHistory( return nil, fmt.Errorf("%w: #%d:%f > #%d:%f", errInvalidPercentile, i-1, rewardPercentiles[i-1], i, p) } } - blockNumber, err := b.BlockNumber() + blkNumber, err := b.BlockNumber() + if err != nil { + return nil, err + } + blockNumber, err := ethermint.SafeHexToInt64(blkNumber) if err != nil { return nil, err } blockEnd := int64(lastBlock) - if blockEnd < 0 { - blockEnd = int64(blockNumber) - } else if int64(blockNumber) < blockEnd { - return nil, fmt.Errorf("%w: requested %d, head %d", errRequestBeyondHead, blockEnd, int64(blockNumber)) + switch lastBlock { + case rpc.EarliestBlockNumber: + blockEnd = 0 + case rpc.LatestBlockNumber, rpc.PendingBlockNumber, rpc.SafeBlockNumber, rpc.FinalizedBlockNumber: + blockEnd = blockNumber + default: + if blockEnd < 0 { + return nil, fmt.Errorf("invalid block number: %d", blockEnd) + } + if blockNumber < blockEnd { + return nil, fmt.Errorf("%w: requested %d, head %d", errRequestBeyondHead, blockEnd, blockNumber) + } } - blocks := int64(userBlockCount) + blocks, err := ethermint.SafeInt64(uint64(userBlockCount)) + if err != nil { + return nil, err + } maxBlockCount := int64(b.cfg.JSONRPC.FeeHistoryCap) if blocks > maxBlockCount { - return nil, fmt.Errorf("FeeHistory user block count %d higher than %d", blocks, maxBlockCount) + blocks = maxBlockCount + } + if blocks == 0 { + return &rpctypes.FeeHistoryResult{ + OldestBlock: (*hexutil.Big)(new(big.Int)), + BaseFee: []*hexutil.Big{}, + GasUsedRatio: []float64{}, + BlobBaseFee: []*hexutil.Big{}, + BlobGasUsedRatio: []float64{}, + }, nil } if blockEnd < math.MaxInt64 && blockEnd+1 < blocks { blocks = blockEnd + 1 @@ -226,6 +253,10 @@ func (b *Backend) FeeHistory( if blockID+int64(i) >= blockEnd+1 { break } + value := blockID - blockStart + int64(i) + if value > math.MaxInt32 || value < math.MinInt32 { + return nil, fmt.Errorf("integer overflow: calculated value %d exceeds int32 limits", value) + } wg.Add(1) go func(index int32) { defer func() { @@ -282,7 +313,7 @@ func (b *Backend) FeeHistory( } } } - }(int32(blockID - blockStart + int64(i))) + }(int32(value)) } go func() { wg.Wait() @@ -295,10 +326,19 @@ func (b *Backend) FeeHistory( } } + // EIP-4844 blob transactions are not supported; return zeros per spec. + thisBlobBaseFee := make([]*hexutil.Big, blocks+1) + for i := range thisBlobBaseFee { + thisBlobBaseFee[i] = (*hexutil.Big)(new(big.Int)) + } + thisBlobGasUsedRatio := make([]float64, blocks) + feeHistory := rpctypes.FeeHistoryResult{ - OldestBlock: oldestBlock, - BaseFee: thisBaseFee, - GasUsedRatio: thisGasUsedRatio, + OldestBlock: oldestBlock, + BaseFee: thisBaseFee, + GasUsedRatio: thisGasUsedRatio, + BlobBaseFee: thisBlobBaseFee, + BlobGasUsedRatio: thisBlobGasUsedRatio, } if calculateRewards { diff --git a/rpc/backend/chain_info_test.go b/rpc/backend/chain_info_test.go index 0c2025116d..db7872dc65 100644 --- a/rpc/backend/chain_info_test.go +++ b/rpc/backend/chain_info_test.go @@ -13,6 +13,7 @@ import ( "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" + tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkmath "cosmossdk.io/math" @@ -336,7 +337,7 @@ func (suite *BackendTestSuite) TestFeeHistory() { func(validator sdk.AccAddress) { var header metadata.MD queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - suite.backend.cfg.JSONRPC.FeeHistoryCap = 0 + suite.backend.cfg.JSONRPC.FeeHistoryCap = 2 RegisterParamsError(queryClient, &header, ethrpc.BlockNumber(1).Int64()) }, 1, @@ -347,18 +348,55 @@ func (suite *BackendTestSuite) TestFeeHistory() { nil, }, { - "fail - user block count higher than max block count ", + "pass - user block count higher than max block count is silently capped", + func(validator sdk.AccAddress) { + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + client := suite.backend.clientCtx.Client.(*mocks.Client) + suite.backend.cfg.JSONRPC.FeeHistoryCap = 1 + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + RegisterBlock(client, ethrpc.BlockNumber(1).Int64(), nil) + RegisterBlockResults(client, 1) + RegisterBaseFeeError(queryClient) + RegisterValidatorAccount(queryClient, validator) + RegisterConsensusParams(client, 1) + fQueryClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) + RegisterFeeMarketParams(fQueryClient, 1) + }, + 2, + 1, + &rpc.FeeHistoryResult{ + OldestBlock: (*hexutil.Big)(big.NewInt(1)), + BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(new(big.Int).SetBits([]big.Word{}))}, + GasUsedRatio: []float64{0}, + Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + BlobBaseFee: []*hexutil.Big{(*hexutil.Big)(new(big.Int)), (*hexutil.Big)(new(big.Int))}, + BlobGasUsedRatio: []float64{0}, + }, + sdk.AccAddress(tests.GenerateAddress().Bytes()), + true, + nil, + }, + { + "pass - blockCount 0 returns empty result", func(validator sdk.AccAddress) { var header metadata.MD queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - suite.backend.cfg.JSONRPC.FeeHistoryCap = 0 + suite.backend.cfg.JSONRPC.FeeHistoryCap = 2 RegisterParams(queryClient, &header, ethrpc.BlockNumber(1).Int64()) }, - 1, + 0, -1, + &rpc.FeeHistoryResult{ + OldestBlock: (*hexutil.Big)(new(big.Int)), + BaseFee: []*hexutil.Big{}, + GasUsedRatio: []float64{}, + BlobBaseFee: []*hexutil.Big{}, + BlobGasUsedRatio: []float64{}, + }, nil, - nil, - false, + true, nil, }, { @@ -410,7 +448,7 @@ func (suite *BackendTestSuite) TestFeeHistory() { 1, nil, nil, - true, + false, nil, }, { @@ -433,10 +471,12 @@ func (suite *BackendTestSuite) TestFeeHistory() { 1, 1, &rpc.FeeHistoryResult{ - OldestBlock: (*hexutil.Big)(big.NewInt(1)), - BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(new(big.Int).SetBits([]big.Word{}))}, - GasUsedRatio: []float64{0}, - Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + OldestBlock: (*hexutil.Big)(big.NewInt(1)), + BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(new(big.Int).SetBits([]big.Word{}))}, + GasUsedRatio: []float64{0}, + Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + BlobBaseFee: []*hexutil.Big{(*hexutil.Big)(new(big.Int)), (*hexutil.Big)(new(big.Int))}, + BlobGasUsedRatio: []float64{0}, }, sdk.AccAddress(tests.GenerateAddress().Bytes()), true, @@ -463,10 +503,12 @@ func (suite *BackendTestSuite) TestFeeHistory() { 1, 1, &rpc.FeeHistoryResult{ - OldestBlock: (*hexutil.Big)(big.NewInt(1)), - BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(1)), (*hexutil.Big)(big.NewInt(1))}, - GasUsedRatio: []float64{0}, - Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + OldestBlock: (*hexutil.Big)(big.NewInt(1)), + BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(1)), (*hexutil.Big)(big.NewInt(1))}, + GasUsedRatio: []float64{0}, + Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + BlobBaseFee: []*hexutil.Big{(*hexutil.Big)(new(big.Int)), (*hexutil.Big)(new(big.Int))}, + BlobGasUsedRatio: []float64{0}, }, sdk.AccAddress(tests.GenerateAddress().Bytes()), true, @@ -493,10 +535,12 @@ func (suite *BackendTestSuite) TestFeeHistory() { 1, 1, &rpc.FeeHistoryResult{ - OldestBlock: (*hexutil.Big)(big.NewInt(1)), - BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(1)), (*hexutil.Big)(big.NewInt(0))}, - GasUsedRatio: []float64{0}, - Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + OldestBlock: (*hexutil.Big)(big.NewInt(1)), + BaseFee: []*hexutil.Big{(*hexutil.Big)(big.NewInt(1)), (*hexutil.Big)(big.NewInt(0))}, + GasUsedRatio: []float64{0}, + Reward: [][]*hexutil.Big{{(*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0)), (*hexutil.Big)(big.NewInt(0))}}, + BlobBaseFee: []*hexutil.Big{(*hexutil.Big)(new(big.Int)), (*hexutil.Big)(new(big.Int))}, + BlobGasUsedRatio: []float64{0}, }, sdk.AccAddress(tests.GenerateAddress().Bytes()), true, @@ -537,3 +581,33 @@ func (suite *BackendTestSuite) TestFeeHistory() { }) } } + +func (suite *BackendTestSuite) TestProcessBlock() { + suite.SetupTest() + + const height = int64(1) + gasLimit := hexutil.Uint64(8_000_000) + gasUsed := hexutil.Uint64(21_000) + + ethBlock := map[string]interface{}{ + "gasLimit": gasLimit, + "gasUsed": gasUsed, + "baseFeePerGas": (*hexutil.Big)(big.NewInt(1_000_000_000)), + } + + tmBlock := &tmrpctypes.ResultBlock{ + Block: &tmtypes.Block{Header: tmtypes.Header{Height: height}}, + } + blockRes := &tmrpctypes.ResultBlockResults{Height: height} + + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterBaseFeeError(queryClient) + RegisterParamsWithoutHeader(queryClient, height) + fQueryClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) + RegisterFeeMarketParams(fQueryClient, height) + + var target rpc.OneFeeHistory + err := suite.backend.processBlock(tmBlock, ðBlock, []float64{}, blockRes, &target) + suite.Require().NoError(err) + suite.Require().Equal(float64(gasUsed)/float64(gasLimit), target.GasUsedRatio) +} diff --git a/rpc/backend/client_test.go b/rpc/backend/client_test.go index a48df59a57..a020729872 100644 --- a/rpc/backend/client_test.go +++ b/rpc/backend/client_test.go @@ -255,21 +255,68 @@ func RegisterBlockByHash( block := types.MakeBlock(1, []types.Tx{tx}, nil, nil) resBlock := &tmrpctypes.ResultBlock{Block: block} - client.On("BlockByHash", rpc.ContextWithHeight(1), []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}). + client.On("BlockByHash", rpc.ContextWithHeight(1), hash.Bytes()). Return(resBlock, nil) return resBlock, nil } func RegisterBlockByHashError(client *mocks.Client, hash common.Hash, tx []byte) { - client.On("BlockByHash", rpc.ContextWithHeight(1), []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}). + client.On("BlockByHash", rpc.ContextWithHeight(1), hash.Bytes()). Return(nil, errortypes.ErrInvalidRequest) } func RegisterBlockByHashNotFound(client *mocks.Client, hash common.Hash, tx []byte) { - client.On("BlockByHash", rpc.ContextWithHeight(1), []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}). + client.On("BlockByHash", rpc.ContextWithHeight(1), hash.Bytes()). Return(nil, nil) } +// HeaderByHash +func RegisterHeaderByHash( + client *mocks.Client, + hash common.Hash, + tx []byte, +) (*tmrpctypes.ResultHeader, error) { + block := types.MakeBlock(1, []types.Tx{tx}, nil, nil) + resHeader := &tmrpctypes.ResultHeader{Header: &block.Header} + + client.On("HeaderByHash", rpc.ContextWithHeight(1), bytes.HexBytes(hash.Bytes())). + Return(resHeader, nil) + return resHeader, nil +} + +func RegisterHeaderByHashError(client *mocks.Client, hash common.Hash, tx []byte) { + client.On("HeaderByHash", rpc.ContextWithHeight(1), bytes.HexBytes(hash.Bytes())). + Return(nil, errortypes.ErrInvalidRequest) +} + +func RegisterHeaderByHashNotFound(client *mocks.Client, hash common.Hash, tx []byte) { + client.On("HeaderByHash", rpc.ContextWithHeight(1), bytes.HexBytes(hash.Bytes())). + Return(&tmrpctypes.ResultHeader{Header: nil}, nil) +} + +func RegisterHeaderByHashNilResult(client *mocks.Client, hash common.Hash) { + client.On("HeaderByHash", rpc.ContextWithHeight(1), bytes.HexBytes(hash.Bytes())). + Return(nil, nil) +} + +// Header +func RegisterHeader(client *mocks.Client, height *int64, tx []byte) (*tmrpctypes.ResultHeader, error) { + block := types.MakeBlock(*height, []types.Tx{tx}, nil, nil) + resHeader := &tmrpctypes.ResultHeader{Header: &block.Header} + client.On("Header", rpc.ContextWithHeight(*height), height).Return(resHeader, nil) + return resHeader, nil +} + +func RegisterHeaderError(client *mocks.Client, height *int64) { + client.On("Header", rpc.ContextWithHeight(*height), height).Return(nil, errortypes.ErrInvalidRequest) +} + +// Header not found +func RegisterHeaderNotFound(client *mocks.Client, height int64) { + client.On("Header", rpc.ContextWithHeight(height), mock.AnythingOfType("*int64")). + Return(&tmrpctypes.ResultHeader{Header: nil}, nil) +} + func RegisterABCIQueryWithOptions(client *mocks.Client, height int64, path string, data bytes.HexBytes, opts tmrpcclient.ABCIQueryOptions) { client.On("ABCIQueryWithOptions", context.Background(), path, data, opts). Return(&tmrpctypes.ResultABCIQuery{ diff --git a/rpc/backend/evm_query_client_test.go b/rpc/backend/evm_query_client_test.go index 357901a5fc..e07513fa37 100644 --- a/rpc/backend/evm_query_client_test.go +++ b/rpc/backend/evm_query_client_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "slices" "strconv" "testing" @@ -35,13 +36,48 @@ var _ evmtypes.QueryClient = &mocks.EVMQueryClient{} func RegisterTraceTransactionWithPredecessors(queryClient *mocks.EVMQueryClient, msgEthTx *evmtypes.MsgEthereumTx, predecessors []*evmtypes.MsgEthereumTx) { data := []byte{0x7b, 0x22, 0x74, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x22, 0x7d} queryClient.On("TraceTx", rpc.ContextWithHeight(1), - &evmtypes.QueryTraceTxRequest{Msg: msgEthTx, BlockNumber: 1, Predecessors: predecessors, ChainId: 9000}). + mock.MatchedBy(func(req *evmtypes.QueryTraceTxRequest) bool { + if req.BlockNumber != 1 { + return false + } + bytes, _ := json.Marshal(msgEthTx) + bytes2, _ := json.Marshal(req.Msg) + if slices.Compare(bytes, bytes2) != 0 { + return false + } + if len(req.Predecessors) != len(predecessors) { + return false + } + bytes, _ = json.Marshal(req.Predecessors) + bytes2, _ = json.Marshal(predecessors) + if slices.Compare(bytes, bytes2) != 0 { + return false + } + if req.ChainId != 9000 { + return false + } + return true + })). Return(&evmtypes.QueryTraceTxResponse{Data: data}, nil) } func RegisterTraceTransaction(queryClient *mocks.EVMQueryClient, msgEthTx *evmtypes.MsgEthereumTx) { data := []byte{0x7b, 0x22, 0x74, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x22, 0x7d} - queryClient.On("TraceTx", rpc.ContextWithHeight(1), &evmtypes.QueryTraceTxRequest{Msg: msgEthTx, BlockNumber: 1, ChainId: 9000}). + queryClient.On("TraceTx", rpc.ContextWithHeight(1), + mock.MatchedBy(func(req *evmtypes.QueryTraceTxRequest) bool { + if req.BlockNumber != 1 { + return false + } + bytes, _ := json.Marshal(msgEthTx) + bytes2, _ := json.Marshal(req.Msg) + if slices.Compare(bytes, bytes2) != 0 { + return false + } + if req.ChainId != 9000 { + return false + } + return true + })). Return(&evmtypes.QueryTraceTxResponse{Data: data}, nil) } @@ -54,7 +90,20 @@ func RegisterTraceTransactionError(queryClient *mocks.EVMQueryClient, msgEthTx * func RegisterTraceBlock(queryClient *mocks.EVMQueryClient, txs []*evmtypes.MsgEthereumTx) { data := []byte{0x7b, 0x22, 0x74, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x22, 0x7d} queryClient.On("TraceBlock", rpc.ContextWithHeight(1), - &evmtypes.QueryTraceBlockRequest{Txs: txs, BlockNumber: 1, TraceConfig: &evmtypes.TraceConfig{}, ChainId: 9000}). + mock.MatchedBy(func(req *evmtypes.QueryTraceBlockRequest) bool { + if req.BlockNumber != 1 { + return false + } + bytes, _ := json.Marshal(txs) + bytes2, _ := json.Marshal(req.Txs) + if slices.Compare(bytes, bytes2) != 0 { + return false + } + if req.ChainId != 9000 { + return false + } + return true + })). Return(&evmtypes.QueryTraceBlockResponse{Data: data}, nil) } @@ -139,13 +188,13 @@ func TestRegisterParamsError(t *testing.T) { // ETH Call func RegisterEthCall(queryClient *mocks.EVMQueryClient, request *evmtypes.EthCallRequest) { - ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) + ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) //nolint:govet queryClient.On("EthCall", ctx, request). - Return(&evmtypes.MsgEthereumTxResponse{}, nil) + Return(&evmtypes.EthCallResponse{}, nil) } func RegisterEthCallError(queryClient *mocks.EVMQueryClient, request *evmtypes.EthCallRequest) { - ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) + ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) //nolint:govet queryClient.On("EthCall", ctx, request). Return(nil, errortypes.ErrInvalidRequest) } @@ -206,6 +255,13 @@ func RegisterValidatorAccount(queryClient *mocks.EVMQueryClient, validator sdk.A Return(&evmtypes.QueryValidatorAccountResponse{AccountAddress: validator.String()}, nil) } +func RegisterValidatorAccountWithConsAddress(queryClient *mocks.EVMQueryClient, validator sdk.AccAddress, consAddress string) { + queryClient.On("ValidatorAccount", rpc.ContextWithHeight(1), &evmtypes.QueryValidatorAccountRequest{ + ConsAddress: consAddress, + }). + Return(&evmtypes.QueryValidatorAccountResponse{AccountAddress: validator.String()}, nil) +} + func RegisterValidatorAccountError(queryClient *mocks.EVMQueryClient) { queryClient.On("ValidatorAccount", rpc.ContextWithHeight(1), &evmtypes.QueryValidatorAccountRequest{}). Return(nil, status.Error(codes.InvalidArgument, "empty request")) @@ -275,6 +331,19 @@ func RegisterBalanceError(queryClient *mocks.EVMQueryClient, addr common.Address Return(nil, errortypes.ErrInvalidRequest) } +// CreateAccessList +func RegisterCreateAccessList(queryClient *mocks.EVMQueryClient, request *evmtypes.EthCallRequest, data []byte) { + ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) //nolint:govet + queryClient.On("CreateAccessList", ctx, request). + Return(&evmtypes.CreateAccessListResponse{Data: data}, nil) +} + +func RegisterCreateAccessListError(queryClient *mocks.EVMQueryClient, request *evmtypes.EthCallRequest) { + ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) //nolint:govet + queryClient.On("CreateAccessList", ctx, request). + Return(nil, errortypes.ErrInvalidRequest) +} + // TraceCall func RegisterTraceCall(queryClient *mocks.EVMQueryClient, request *evmtypes.QueryTraceCallRequest, response *evmtypes.QueryTraceCallResponse) { queryClient.On("TraceCall", rpc.ContextWithHeight(request.BlockNumber), request). @@ -282,7 +351,7 @@ func RegisterTraceCall(queryClient *mocks.EVMQueryClient, request *evmtypes.Quer } func RegisterTraceCallError(queryClient *mocks.EVMQueryClient, request *evmtypes.QueryTraceCallRequest) { - ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) + ctx, _ := context.WithCancel(rpc.ContextWithHeight(1)) //nolint:govet queryClient.On("TraceCall", ctx, request). Return(nil, errortypes.ErrInvalidRequest) } diff --git a/rpc/backend/filters.go b/rpc/backend/filters.go index b989d8099b..a685ddb744 100644 --- a/rpc/backend/filters.go +++ b/rpc/backend/filters.go @@ -30,7 +30,7 @@ func (b *Backend) GetLogs(hash common.Hash) ([][]*ethtypes.Log, error) { if resBlock == nil { return nil, errors.Errorf("block not found for hash %s", hash) } - return b.GetLogsByHeight(&resBlock.Block.Header.Height) + return b.GetLogsByHeight(&resBlock.Block.Height) } // GetLogsByHeight returns all the logs from all the ethereum transactions in a block. diff --git a/rpc/backend/mocks/client.go b/rpc/backend/mocks/client.go index d93d9c5a59..957a96ba89 100644 --- a/rpc/backend/mocks/client.go +++ b/rpc/backend/mocks/client.go @@ -1,4 +1,4 @@ -// Code generated by mockery. DO NOT EDIT. +// Code generated by mockery v2.53.0. DO NOT EDIT. package mocks @@ -26,7 +26,15 @@ type Client struct { func (_m *Client) ABCIInfo(_a0 context.Context) (*coretypes.ResultABCIInfo, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for ABCIInfo") + } + var r0 *coretypes.ResultABCIInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultABCIInfo, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultABCIInfo); ok { r0 = rf(_a0) } else { @@ -35,7 +43,6 @@ func (_m *Client) ABCIInfo(_a0 context.Context) (*coretypes.ResultABCIInfo, erro } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -49,7 +56,15 @@ func (_m *Client) ABCIInfo(_a0 context.Context) (*coretypes.ResultABCIInfo, erro func (_m *Client) ABCIQuery(ctx context.Context, path string, data bytes.HexBytes) (*coretypes.ResultABCIQuery, error) { ret := _m.Called(ctx, path, data) + if len(ret) == 0 { + panic("no return value specified for ABCIQuery") + } + var r0 *coretypes.ResultABCIQuery + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bytes.HexBytes) (*coretypes.ResultABCIQuery, error)); ok { + return rf(ctx, path, data) + } if rf, ok := ret.Get(0).(func(context.Context, string, bytes.HexBytes) *coretypes.ResultABCIQuery); ok { r0 = rf(ctx, path, data) } else { @@ -58,7 +73,6 @@ func (_m *Client) ABCIQuery(ctx context.Context, path string, data bytes.HexByte } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bytes.HexBytes) error); ok { r1 = rf(ctx, path, data) } else { @@ -72,7 +86,15 @@ func (_m *Client) ABCIQuery(ctx context.Context, path string, data bytes.HexByte func (_m *Client) ABCIQueryWithOptions(ctx context.Context, path string, data bytes.HexBytes, opts client.ABCIQueryOptions) (*coretypes.ResultABCIQuery, error) { ret := _m.Called(ctx, path, data, opts) + if len(ret) == 0 { + panic("no return value specified for ABCIQueryWithOptions") + } + var r0 *coretypes.ResultABCIQuery + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bytes.HexBytes, client.ABCIQueryOptions) (*coretypes.ResultABCIQuery, error)); ok { + return rf(ctx, path, data, opts) + } if rf, ok := ret.Get(0).(func(context.Context, string, bytes.HexBytes, client.ABCIQueryOptions) *coretypes.ResultABCIQuery); ok { r0 = rf(ctx, path, data, opts) } else { @@ -81,7 +103,6 @@ func (_m *Client) ABCIQueryWithOptions(ctx context.Context, path string, data by } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bytes.HexBytes, client.ABCIQueryOptions) error); ok { r1 = rf(ctx, path, data, opts) } else { @@ -95,7 +116,15 @@ func (_m *Client) ABCIQueryWithOptions(ctx context.Context, path string, data by func (_m *Client) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { ret := _m.Called(ctx, height) + if len(ret) == 0 { + panic("no return value specified for Block") + } + var r0 *coretypes.ResultBlock + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int64) (*coretypes.ResultBlock, error)); ok { + return rf(ctx, height) + } if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultBlock); ok { r0 = rf(ctx, height) } else { @@ -104,7 +133,6 @@ func (_m *Client) Block(ctx context.Context, height *int64) (*coretypes.ResultBl } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { r1 = rf(ctx, height) } else { @@ -118,7 +146,15 @@ func (_m *Client) Block(ctx context.Context, height *int64) (*coretypes.ResultBl func (_m *Client) BlockByHash(ctx context.Context, hash []byte) (*coretypes.ResultBlock, error) { ret := _m.Called(ctx, hash) + if len(ret) == 0 { + panic("no return value specified for BlockByHash") + } + var r0 *coretypes.ResultBlock + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []byte) (*coretypes.ResultBlock, error)); ok { + return rf(ctx, hash) + } if rf, ok := ret.Get(0).(func(context.Context, []byte) *coretypes.ResultBlock); ok { r0 = rf(ctx, hash) } else { @@ -127,7 +163,6 @@ func (_m *Client) BlockByHash(ctx context.Context, hash []byte) (*coretypes.Resu } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []byte) error); ok { r1 = rf(ctx, hash) } else { @@ -141,7 +176,15 @@ func (_m *Client) BlockByHash(ctx context.Context, hash []byte) (*coretypes.Resu func (_m *Client) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { ret := _m.Called(ctx, height) + if len(ret) == 0 { + panic("no return value specified for BlockResults") + } + var r0 *coretypes.ResultBlockResults + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int64) (*coretypes.ResultBlockResults, error)); ok { + return rf(ctx, height) + } if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultBlockResults); ok { r0 = rf(ctx, height) } else { @@ -150,7 +193,6 @@ func (_m *Client) BlockResults(ctx context.Context, height *int64) (*coretypes.R } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { r1 = rf(ctx, height) } else { @@ -164,7 +206,15 @@ func (_m *Client) BlockResults(ctx context.Context, height *int64) (*coretypes.R func (_m *Client) BlockSearch(ctx context.Context, query string, page *int, perPage *int, orderBy string) (*coretypes.ResultBlockSearch, error) { ret := _m.Called(ctx, query, page, perPage, orderBy) + if len(ret) == 0 { + panic("no return value specified for BlockSearch") + } + var r0 *coretypes.ResultBlockSearch + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *int, *int, string) (*coretypes.ResultBlockSearch, error)); ok { + return rf(ctx, query, page, perPage, orderBy) + } if rf, ok := ret.Get(0).(func(context.Context, string, *int, *int, string) *coretypes.ResultBlockSearch); ok { r0 = rf(ctx, query, page, perPage, orderBy) } else { @@ -173,7 +223,6 @@ func (_m *Client) BlockSearch(ctx context.Context, query string, page *int, perP } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, *int, *int, string) error); ok { r1 = rf(ctx, query, page, perPage, orderBy) } else { @@ -187,7 +236,15 @@ func (_m *Client) BlockSearch(ctx context.Context, query string, page *int, perP func (_m *Client) BlockchainInfo(ctx context.Context, minHeight int64, maxHeight int64) (*coretypes.ResultBlockchainInfo, error) { ret := _m.Called(ctx, minHeight, maxHeight) + if len(ret) == 0 { + panic("no return value specified for BlockchainInfo") + } + var r0 *coretypes.ResultBlockchainInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64, int64) (*coretypes.ResultBlockchainInfo, error)); ok { + return rf(ctx, minHeight, maxHeight) + } if rf, ok := ret.Get(0).(func(context.Context, int64, int64) *coretypes.ResultBlockchainInfo); ok { r0 = rf(ctx, minHeight, maxHeight) } else { @@ -196,7 +253,6 @@ func (_m *Client) BlockchainInfo(ctx context.Context, minHeight int64, maxHeight } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64, int64) error); ok { r1 = rf(ctx, minHeight, maxHeight) } else { @@ -210,7 +266,15 @@ func (_m *Client) BlockchainInfo(ctx context.Context, minHeight int64, maxHeight func (_m *Client) BroadcastEvidence(_a0 context.Context, _a1 types.Evidence) (*coretypes.ResultBroadcastEvidence, error) { ret := _m.Called(_a0, _a1) + if len(ret) == 0 { + panic("no return value specified for BroadcastEvidence") + } + var r0 *coretypes.ResultBroadcastEvidence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.Evidence) (*coretypes.ResultBroadcastEvidence, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, types.Evidence) *coretypes.ResultBroadcastEvidence); ok { r0 = rf(_a0, _a1) } else { @@ -219,7 +283,6 @@ func (_m *Client) BroadcastEvidence(_a0 context.Context, _a1 types.Evidence) (*c } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.Evidence) error); ok { r1 = rf(_a0, _a1) } else { @@ -233,7 +296,15 @@ func (_m *Client) BroadcastEvidence(_a0 context.Context, _a1 types.Evidence) (*c func (_m *Client) BroadcastTxAsync(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultBroadcastTx, error) { ret := _m.Called(_a0, _a1) + if len(ret) == 0 { + panic("no return value specified for BroadcastTxAsync") + } + var r0 *coretypes.ResultBroadcastTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) (*coretypes.ResultBroadcastTx, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultBroadcastTx); ok { r0 = rf(_a0, _a1) } else { @@ -242,7 +313,6 @@ func (_m *Client) BroadcastTxAsync(_a0 context.Context, _a1 types.Tx) (*coretype } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { r1 = rf(_a0, _a1) } else { @@ -256,7 +326,15 @@ func (_m *Client) BroadcastTxAsync(_a0 context.Context, _a1 types.Tx) (*coretype func (_m *Client) BroadcastTxCommit(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultBroadcastTxCommit, error) { ret := _m.Called(_a0, _a1) + if len(ret) == 0 { + panic("no return value specified for BroadcastTxCommit") + } + var r0 *coretypes.ResultBroadcastTxCommit + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) (*coretypes.ResultBroadcastTxCommit, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultBroadcastTxCommit); ok { r0 = rf(_a0, _a1) } else { @@ -265,7 +343,6 @@ func (_m *Client) BroadcastTxCommit(_a0 context.Context, _a1 types.Tx) (*coretyp } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { r1 = rf(_a0, _a1) } else { @@ -279,7 +356,15 @@ func (_m *Client) BroadcastTxCommit(_a0 context.Context, _a1 types.Tx) (*coretyp func (_m *Client) BroadcastTxSync(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultBroadcastTx, error) { ret := _m.Called(_a0, _a1) + if len(ret) == 0 { + panic("no return value specified for BroadcastTxSync") + } + var r0 *coretypes.ResultBroadcastTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) (*coretypes.ResultBroadcastTx, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultBroadcastTx); ok { r0 = rf(_a0, _a1) } else { @@ -288,7 +373,6 @@ func (_m *Client) BroadcastTxSync(_a0 context.Context, _a1 types.Tx) (*coretypes } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { r1 = rf(_a0, _a1) } else { @@ -302,7 +386,15 @@ func (_m *Client) BroadcastTxSync(_a0 context.Context, _a1 types.Tx) (*coretypes func (_m *Client) CheckTx(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultCheckTx, error) { ret := _m.Called(_a0, _a1) + if len(ret) == 0 { + panic("no return value specified for CheckTx") + } + var r0 *coretypes.ResultCheckTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.Tx) (*coretypes.ResultCheckTx, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, types.Tx) *coretypes.ResultCheckTx); ok { r0 = rf(_a0, _a1) } else { @@ -311,7 +403,6 @@ func (_m *Client) CheckTx(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultC } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.Tx) error); ok { r1 = rf(_a0, _a1) } else { @@ -325,7 +416,15 @@ func (_m *Client) CheckTx(_a0 context.Context, _a1 types.Tx) (*coretypes.ResultC func (_m *Client) Commit(ctx context.Context, height *int64) (*coretypes.ResultCommit, error) { ret := _m.Called(ctx, height) + if len(ret) == 0 { + panic("no return value specified for Commit") + } + var r0 *coretypes.ResultCommit + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int64) (*coretypes.ResultCommit, error)); ok { + return rf(ctx, height) + } if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultCommit); ok { r0 = rf(ctx, height) } else { @@ -334,7 +433,6 @@ func (_m *Client) Commit(ctx context.Context, height *int64) (*coretypes.ResultC } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { r1 = rf(ctx, height) } else { @@ -348,7 +446,15 @@ func (_m *Client) Commit(ctx context.Context, height *int64) (*coretypes.ResultC func (_m *Client) ConsensusParams(ctx context.Context, height *int64) (*coretypes.ResultConsensusParams, error) { ret := _m.Called(ctx, height) + if len(ret) == 0 { + panic("no return value specified for ConsensusParams") + } + var r0 *coretypes.ResultConsensusParams + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int64) (*coretypes.ResultConsensusParams, error)); ok { + return rf(ctx, height) + } if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultConsensusParams); ok { r0 = rf(ctx, height) } else { @@ -357,7 +463,6 @@ func (_m *Client) ConsensusParams(ctx context.Context, height *int64) (*coretype } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { r1 = rf(ctx, height) } else { @@ -371,7 +476,15 @@ func (_m *Client) ConsensusParams(ctx context.Context, height *int64) (*coretype func (_m *Client) ConsensusState(_a0 context.Context) (*coretypes.ResultConsensusState, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for ConsensusState") + } + var r0 *coretypes.ResultConsensusState + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultConsensusState, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultConsensusState); ok { r0 = rf(_a0) } else { @@ -380,7 +493,6 @@ func (_m *Client) ConsensusState(_a0 context.Context) (*coretypes.ResultConsensu } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -394,7 +506,15 @@ func (_m *Client) ConsensusState(_a0 context.Context) (*coretypes.ResultConsensu func (_m *Client) DumpConsensusState(_a0 context.Context) (*coretypes.ResultDumpConsensusState, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for DumpConsensusState") + } + var r0 *coretypes.ResultDumpConsensusState + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultDumpConsensusState, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultDumpConsensusState); ok { r0 = rf(_a0) } else { @@ -403,7 +523,6 @@ func (_m *Client) DumpConsensusState(_a0 context.Context) (*coretypes.ResultDump } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -417,7 +536,15 @@ func (_m *Client) DumpConsensusState(_a0 context.Context) (*coretypes.ResultDump func (_m *Client) Genesis(_a0 context.Context) (*coretypes.ResultGenesis, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for Genesis") + } + var r0 *coretypes.ResultGenesis + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultGenesis, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultGenesis); ok { r0 = rf(_a0) } else { @@ -426,7 +553,6 @@ func (_m *Client) Genesis(_a0 context.Context) (*coretypes.ResultGenesis, error) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -440,7 +566,15 @@ func (_m *Client) Genesis(_a0 context.Context) (*coretypes.ResultGenesis, error) func (_m *Client) GenesisChunked(_a0 context.Context, _a1 uint) (*coretypes.ResultGenesisChunk, error) { ret := _m.Called(_a0, _a1) + if len(ret) == 0 { + panic("no return value specified for GenesisChunked") + } + var r0 *coretypes.ResultGenesisChunk + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint) (*coretypes.ResultGenesisChunk, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, uint) *coretypes.ResultGenesisChunk); ok { r0 = rf(_a0, _a1) } else { @@ -449,7 +583,6 @@ func (_m *Client) GenesisChunked(_a0 context.Context, _a1 uint) (*coretypes.Resu } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, uint) error); ok { r1 = rf(_a0, _a1) } else { @@ -463,7 +596,15 @@ func (_m *Client) GenesisChunked(_a0 context.Context, _a1 uint) (*coretypes.Resu func (_m *Client) Header(ctx context.Context, height *int64) (*coretypes.ResultHeader, error) { ret := _m.Called(ctx, height) + if len(ret) == 0 { + panic("no return value specified for Header") + } + var r0 *coretypes.ResultHeader + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int64) (*coretypes.ResultHeader, error)); ok { + return rf(ctx, height) + } if rf, ok := ret.Get(0).(func(context.Context, *int64) *coretypes.ResultHeader); ok { r0 = rf(ctx, height) } else { @@ -472,7 +613,6 @@ func (_m *Client) Header(ctx context.Context, height *int64) (*coretypes.ResultH } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int64) error); ok { r1 = rf(ctx, height) } else { @@ -486,7 +626,15 @@ func (_m *Client) Header(ctx context.Context, height *int64) (*coretypes.ResultH func (_m *Client) HeaderByHash(ctx context.Context, hash bytes.HexBytes) (*coretypes.ResultHeader, error) { ret := _m.Called(ctx, hash) + if len(ret) == 0 { + panic("no return value specified for HeaderByHash") + } + var r0 *coretypes.ResultHeader + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, bytes.HexBytes) (*coretypes.ResultHeader, error)); ok { + return rf(ctx, hash) + } if rf, ok := ret.Get(0).(func(context.Context, bytes.HexBytes) *coretypes.ResultHeader); ok { r0 = rf(ctx, hash) } else { @@ -495,7 +643,6 @@ func (_m *Client) HeaderByHash(ctx context.Context, hash bytes.HexBytes) (*coret } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, bytes.HexBytes) error); ok { r1 = rf(ctx, hash) } else { @@ -509,7 +656,15 @@ func (_m *Client) HeaderByHash(ctx context.Context, hash bytes.HexBytes) (*coret func (_m *Client) Health(_a0 context.Context) (*coretypes.ResultHealth, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for Health") + } + var r0 *coretypes.ResultHealth + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultHealth, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultHealth); ok { r0 = rf(_a0) } else { @@ -518,7 +673,6 @@ func (_m *Client) Health(_a0 context.Context) (*coretypes.ResultHealth, error) { } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -528,10 +682,14 @@ func (_m *Client) Health(_a0 context.Context) (*coretypes.ResultHealth, error) { return r0, r1 } -// IsRunning provides a mock function with given fields: +// IsRunning provides a mock function with no fields func (_m *Client) IsRunning() bool { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for IsRunning") + } + var r0 bool if rf, ok := ret.Get(0).(func() bool); ok { r0 = rf() @@ -546,7 +704,15 @@ func (_m *Client) IsRunning() bool { func (_m *Client) NetInfo(_a0 context.Context) (*coretypes.ResultNetInfo, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for NetInfo") + } + var r0 *coretypes.ResultNetInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultNetInfo, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultNetInfo); ok { r0 = rf(_a0) } else { @@ -555,7 +721,6 @@ func (_m *Client) NetInfo(_a0 context.Context) (*coretypes.ResultNetInfo, error) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -569,7 +734,15 @@ func (_m *Client) NetInfo(_a0 context.Context) (*coretypes.ResultNetInfo, error) func (_m *Client) NumUnconfirmedTxs(_a0 context.Context) (*coretypes.ResultUnconfirmedTxs, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for NumUnconfirmedTxs") + } + var r0 *coretypes.ResultUnconfirmedTxs + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultUnconfirmedTxs, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultUnconfirmedTxs); ok { r0 = rf(_a0) } else { @@ -578,7 +751,6 @@ func (_m *Client) NumUnconfirmedTxs(_a0 context.Context) (*coretypes.ResultUncon } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -588,10 +760,14 @@ func (_m *Client) NumUnconfirmedTxs(_a0 context.Context) (*coretypes.ResultUncon return r0, r1 } -// OnReset provides a mock function with given fields: +// OnReset provides a mock function with no fields func (_m *Client) OnReset() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for OnReset") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -602,10 +778,14 @@ func (_m *Client) OnReset() error { return r0 } -// OnStart provides a mock function with given fields: +// OnStart provides a mock function with no fields func (_m *Client) OnStart() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for OnStart") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -616,15 +796,19 @@ func (_m *Client) OnStart() error { return r0 } -// OnStop provides a mock function with given fields: +// OnStop provides a mock function with no fields func (_m *Client) OnStop() { _m.Called() } -// Quit provides a mock function with given fields: +// Quit provides a mock function with no fields func (_m *Client) Quit() <-chan struct{} { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Quit") + } + var r0 <-chan struct{} if rf, ok := ret.Get(0).(func() <-chan struct{}); ok { r0 = rf() @@ -637,10 +821,14 @@ func (_m *Client) Quit() <-chan struct{} { return r0 } -// Reset provides a mock function with given fields: +// Reset provides a mock function with no fields func (_m *Client) Reset() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Reset") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -656,10 +844,14 @@ func (_m *Client) SetLogger(_a0 log.Logger) { _m.Called(_a0) } -// Start provides a mock function with given fields: +// Start provides a mock function with no fields func (_m *Client) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -674,7 +866,15 @@ func (_m *Client) Start() error { func (_m *Client) Status(_a0 context.Context) (*coretypes.ResultStatus, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for Status") + } + var r0 *coretypes.ResultStatus + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*coretypes.ResultStatus, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *coretypes.ResultStatus); ok { r0 = rf(_a0) } else { @@ -683,7 +883,6 @@ func (_m *Client) Status(_a0 context.Context) (*coretypes.ResultStatus, error) { } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -693,10 +892,14 @@ func (_m *Client) Status(_a0 context.Context) (*coretypes.ResultStatus, error) { return r0, r1 } -// Stop provides a mock function with given fields: +// Stop provides a mock function with no fields func (_m *Client) Stop() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Stop") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -707,10 +910,14 @@ func (_m *Client) Stop() error { return r0 } -// String provides a mock function with given fields: +// String provides a mock function with no fields func (_m *Client) String() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for String") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -732,7 +939,15 @@ func (_m *Client) Subscribe(ctx context.Context, subscriber string, query string _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + var r0 <-chan coretypes.ResultEvent + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, ...int) (<-chan coretypes.ResultEvent, error)); ok { + return rf(ctx, subscriber, query, outCapacity...) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, ...int) <-chan coretypes.ResultEvent); ok { r0 = rf(ctx, subscriber, query, outCapacity...) } else { @@ -741,7 +956,6 @@ func (_m *Client) Subscribe(ctx context.Context, subscriber string, query string } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, ...int) error); ok { r1 = rf(ctx, subscriber, query, outCapacity...) } else { @@ -755,7 +969,15 @@ func (_m *Client) Subscribe(ctx context.Context, subscriber string, query string func (_m *Client) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.ResultTx, error) { ret := _m.Called(ctx, hash, prove) + if len(ret) == 0 { + panic("no return value specified for Tx") + } + var r0 *coretypes.ResultTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []byte, bool) (*coretypes.ResultTx, error)); ok { + return rf(ctx, hash, prove) + } if rf, ok := ret.Get(0).(func(context.Context, []byte, bool) *coretypes.ResultTx); ok { r0 = rf(ctx, hash, prove) } else { @@ -764,7 +986,6 @@ func (_m *Client) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.R } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []byte, bool) error); ok { r1 = rf(ctx, hash, prove) } else { @@ -778,7 +999,15 @@ func (_m *Client) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.R func (_m *Client) TxSearch(ctx context.Context, query string, prove bool, page *int, perPage *int, orderBy string) (*coretypes.ResultTxSearch, error) { ret := _m.Called(ctx, query, prove, page, perPage, orderBy) + if len(ret) == 0 { + panic("no return value specified for TxSearch") + } + var r0 *coretypes.ResultTxSearch + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool, *int, *int, string) (*coretypes.ResultTxSearch, error)); ok { + return rf(ctx, query, prove, page, perPage, orderBy) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool, *int, *int, string) *coretypes.ResultTxSearch); ok { r0 = rf(ctx, query, prove, page, perPage, orderBy) } else { @@ -787,7 +1016,6 @@ func (_m *Client) TxSearch(ctx context.Context, query string, prove bool, page * } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bool, *int, *int, string) error); ok { r1 = rf(ctx, query, prove, page, perPage, orderBy) } else { @@ -801,7 +1029,15 @@ func (_m *Client) TxSearch(ctx context.Context, query string, prove bool, page * func (_m *Client) UnconfirmedTxs(ctx context.Context, limit *int) (*coretypes.ResultUnconfirmedTxs, error) { ret := _m.Called(ctx, limit) + if len(ret) == 0 { + panic("no return value specified for UnconfirmedTxs") + } + var r0 *coretypes.ResultUnconfirmedTxs + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int) (*coretypes.ResultUnconfirmedTxs, error)); ok { + return rf(ctx, limit) + } if rf, ok := ret.Get(0).(func(context.Context, *int) *coretypes.ResultUnconfirmedTxs); ok { r0 = rf(ctx, limit) } else { @@ -810,7 +1046,6 @@ func (_m *Client) UnconfirmedTxs(ctx context.Context, limit *int) (*coretypes.Re } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int) error); ok { r1 = rf(ctx, limit) } else { @@ -824,6 +1059,10 @@ func (_m *Client) UnconfirmedTxs(ctx context.Context, limit *int) (*coretypes.Re func (_m *Client) Unsubscribe(ctx context.Context, subscriber string, query string) error { ret := _m.Called(ctx, subscriber, query) + if len(ret) == 0 { + panic("no return value specified for Unsubscribe") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string) error); ok { r0 = rf(ctx, subscriber, query) @@ -838,6 +1077,10 @@ func (_m *Client) Unsubscribe(ctx context.Context, subscriber string, query stri func (_m *Client) UnsubscribeAll(ctx context.Context, subscriber string) error { ret := _m.Called(ctx, subscriber) + if len(ret) == 0 { + panic("no return value specified for UnsubscribeAll") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, subscriber) @@ -852,7 +1095,15 @@ func (_m *Client) UnsubscribeAll(ctx context.Context, subscriber string) error { func (_m *Client) Validators(ctx context.Context, height *int64, page *int, perPage *int) (*coretypes.ResultValidators, error) { ret := _m.Called(ctx, height, page, perPage) + if len(ret) == 0 { + panic("no return value specified for Validators") + } + var r0 *coretypes.ResultValidators + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *int64, *int, *int) (*coretypes.ResultValidators, error)); ok { + return rf(ctx, height, page, perPage) + } if rf, ok := ret.Get(0).(func(context.Context, *int64, *int, *int) *coretypes.ResultValidators); ok { r0 = rf(ctx, height, page, perPage) } else { @@ -861,7 +1112,6 @@ func (_m *Client) Validators(ctx context.Context, height *int64, page *int, perP } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *int64, *int, *int) error); ok { r1 = rf(ctx, height, page, perPage) } else { @@ -871,13 +1121,12 @@ func (_m *Client) Validators(ctx context.Context, height *int64, page *int, perP return r0, r1 } -type mockConstructorTestingTNewClient interface { +// NewClient creates a new instance of Client. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewClient(t interface { mock.TestingT Cleanup(func()) -} - -// NewClient creates a new instance of Client. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewClient(t mockConstructorTestingTNewClient) *Client { +}) *Client { mock := &Client{} mock.Mock.Test(t) diff --git a/rpc/backend/mocks/evm_query_client.go b/rpc/backend/mocks/evm_query_client.go index 845dae72d9..0683770c88 100644 --- a/rpc/backend/mocks/evm_query_client.go +++ b/rpc/backend/mocks/evm_query_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.53.0. DO NOT EDIT. package mocks @@ -12,7 +12,7 @@ import ( types "github.com/evmos/ethermint/x/evm/types" ) -// EVMQueryClient is an autogenerated mock type for the EVMQueryClient type +// EVMQueryClient is an autogenerated mock type for the QueryClient type type EVMQueryClient struct { mock.Mock } @@ -28,7 +28,15 @@ func (_m *EVMQueryClient) Account(ctx context.Context, in *types.QueryAccountReq _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Account") + } + var r0 *types.QueryAccountResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAccountRequest, ...grpc.CallOption) (*types.QueryAccountResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryAccountRequest, ...grpc.CallOption) *types.QueryAccountResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -37,7 +45,6 @@ func (_m *EVMQueryClient) Account(ctx context.Context, in *types.QueryAccountReq } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryAccountRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -58,7 +65,15 @@ func (_m *EVMQueryClient) Balance(ctx context.Context, in *types.QueryBalanceReq _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Balance") + } + var r0 *types.QueryBalanceResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) (*types.QueryBalanceResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) *types.QueryBalanceResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -67,7 +82,6 @@ func (_m *EVMQueryClient) Balance(ctx context.Context, in *types.QueryBalanceReq } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryBalanceRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -88,7 +102,15 @@ func (_m *EVMQueryClient) BaseFee(ctx context.Context, in *types.QueryBaseFeeReq _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for BaseFee") + } + var r0 *types.QueryBaseFeeResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBaseFeeRequest, ...grpc.CallOption) (*types.QueryBaseFeeResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBaseFeeRequest, ...grpc.CallOption) *types.QueryBaseFeeResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -97,7 +119,6 @@ func (_m *EVMQueryClient) BaseFee(ctx context.Context, in *types.QueryBaseFeeReq } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryBaseFeeRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -118,7 +139,15 @@ func (_m *EVMQueryClient) Code(ctx context.Context, in *types.QueryCodeRequest, _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Code") + } + var r0 *types.QueryCodeResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCodeRequest, ...grpc.CallOption) (*types.QueryCodeResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCodeRequest, ...grpc.CallOption) *types.QueryCodeResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -127,7 +156,6 @@ func (_m *EVMQueryClient) Code(ctx context.Context, in *types.QueryCodeRequest, } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryCodeRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -148,7 +176,15 @@ func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosm _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for CosmosAccount") + } + var r0 *types.QueryCosmosAccountResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) (*types.QueryCosmosAccountResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) *types.QueryCosmosAccountResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -157,7 +193,6 @@ func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosm } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryCosmosAccountRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -167,6 +202,43 @@ func (_m *EVMQueryClient) CosmosAccount(ctx context.Context, in *types.QueryCosm return r0, r1 } +// CreateAccessList provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) CreateAccessList(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.CreateAccessListResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CreateAccessList") + } + + var r0 *types.CreateAccessListResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.CreateAccessListResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.CreateAccessListResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.CreateAccessListResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // EstimateGas provides a mock function with given fields: ctx, in, opts func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.EstimateGasResponse, error) { _va := make([]interface{}, len(opts)) @@ -178,7 +250,15 @@ func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequ _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + var r0 *types.EstimateGasResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.EstimateGasResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.EstimateGasResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -187,7 +267,6 @@ func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -198,7 +277,7 @@ func (_m *EVMQueryClient) EstimateGas(ctx context.Context, in *types.EthCallRequ } // EthCall provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) EthCall(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.MsgEthereumTxResponse, error) { +func (_m *EVMQueryClient) EthCall(ctx context.Context, in *types.EthCallRequest, opts ...grpc.CallOption) (*types.EthCallResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -208,16 +287,23 @@ func (_m *EVMQueryClient) EthCall(ctx context.Context, in *types.EthCallRequest, _ca = append(_ca, _va...) ret := _m.Called(_ca...) - var r0 *types.MsgEthereumTxResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.MsgEthereumTxResponse); ok { + if len(ret) == 0 { + panic("no return value specified for EthCall") + } + + var r0 *types.EthCallResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) (*types.EthCallResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) *types.EthCallResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.MsgEthereumTxResponse) + r0 = ret.Get(0).(*types.EthCallResponse) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.EthCallRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -238,7 +324,15 @@ func (_m *EVMQueryClient) Params(ctx context.Context, in *types.QueryParamsReque _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Params") + } + var r0 *types.QueryParamsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) (*types.QueryParamsResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -247,7 +341,6 @@ func (_m *EVMQueryClient) Params(ctx context.Context, in *types.QueryParamsReque } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -257,6 +350,43 @@ func (_m *EVMQueryClient) Params(ctx context.Context, in *types.QueryParamsReque return r0, r1 } +// SimulateV1 provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) SimulateV1(ctx context.Context, in *types.SimulateV1Request, opts ...grpc.CallOption) (*types.SimulateV1Response, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for SimulateV1") + } + + var r0 *types.SimulateV1Response + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.SimulateV1Request, ...grpc.CallOption) (*types.SimulateV1Response, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.SimulateV1Request, ...grpc.CallOption) *types.SimulateV1Response); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.SimulateV1Response) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.SimulateV1Request, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Storage provides a mock function with given fields: ctx, in, opts func (_m *EVMQueryClient) Storage(ctx context.Context, in *types.QueryStorageRequest, opts ...grpc.CallOption) (*types.QueryStorageResponse, error) { _va := make([]interface{}, len(opts)) @@ -268,7 +398,15 @@ func (_m *EVMQueryClient) Storage(ctx context.Context, in *types.QueryStorageReq _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Storage") + } + var r0 *types.QueryStorageResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryStorageRequest, ...grpc.CallOption) (*types.QueryStorageResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryStorageRequest, ...grpc.CallOption) *types.QueryStorageResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -277,7 +415,6 @@ func (_m *EVMQueryClient) Storage(ctx context.Context, in *types.QueryStorageReq } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryStorageRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -298,7 +435,15 @@ func (_m *EVMQueryClient) TraceBlock(ctx context.Context, in *types.QueryTraceBl _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for TraceBlock") + } + var r0 *types.QueryTraceBlockResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceBlockRequest, ...grpc.CallOption) (*types.QueryTraceBlockResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceBlockRequest, ...grpc.CallOption) *types.QueryTraceBlockResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -307,7 +452,6 @@ func (_m *EVMQueryClient) TraceBlock(ctx context.Context, in *types.QueryTraceBl } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTraceBlockRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -317,8 +461,8 @@ func (_m *EVMQueryClient) TraceBlock(ctx context.Context, in *types.QueryTraceBl return r0, r1 } -// TraceTx provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) TraceTx(ctx context.Context, in *types.QueryTraceTxRequest, opts ...grpc.CallOption) (*types.QueryTraceTxResponse, error) { +// TraceCall provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) TraceCall(ctx context.Context, in *types.QueryTraceCallRequest, opts ...grpc.CallOption) (*types.QueryTraceCallResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -328,17 +472,24 @@ func (_m *EVMQueryClient) TraceTx(ctx context.Context, in *types.QueryTraceTxReq _ca = append(_ca, _va...) ret := _m.Called(_ca...) - var r0 *types.QueryTraceTxResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceTxRequest, ...grpc.CallOption) *types.QueryTraceTxResponse); ok { + if len(ret) == 0 { + panic("no return value specified for TraceCall") + } + + var r0 *types.QueryTraceCallResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceCallRequest, ...grpc.CallOption) (*types.QueryTraceCallResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceCallRequest, ...grpc.CallOption) *types.QueryTraceCallResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryTraceTxResponse) + r0 = ret.Get(0).(*types.QueryTraceCallResponse) } } - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTraceTxRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTraceCallRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -347,8 +498,8 @@ func (_m *EVMQueryClient) TraceTx(ctx context.Context, in *types.QueryTraceTxReq return r0, r1 } -// TraceCall provides a mock function with given fields: ctx, in, opts -func (_m *EVMQueryClient) TraceCall(ctx context.Context, in *types.QueryTraceCallRequest, opts ...grpc.CallOption) (*types.QueryTraceCallResponse, error) { +// TraceTx provides a mock function with given fields: ctx, in, opts +func (_m *EVMQueryClient) TraceTx(ctx context.Context, in *types.QueryTraceTxRequest, opts ...grpc.CallOption) (*types.QueryTraceTxResponse, error) { _va := make([]interface{}, len(opts)) for _i := range opts { _va[_i] = opts[_i] @@ -358,17 +509,24 @@ func (_m *EVMQueryClient) TraceCall(ctx context.Context, in *types.QueryTraceCal _ca = append(_ca, _va...) ret := _m.Called(_ca...) - var r0 *types.QueryTraceCallResponse - if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceCallRequest, ...grpc.CallOption) *types.QueryTraceCallResponse); ok { + if len(ret) == 0 { + panic("no return value specified for TraceTx") + } + + var r0 *types.QueryTraceTxResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceTxRequest, ...grpc.CallOption) (*types.QueryTraceTxResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryTraceTxRequest, ...grpc.CallOption) *types.QueryTraceTxResponse); ok { r0 = rf(ctx, in, opts...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.QueryTraceCallResponse) + r0 = ret.Get(0).(*types.QueryTraceTxResponse) } } - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTraceCallRequest, ...grpc.CallOption) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.QueryTraceTxRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { r1 = ret.Error(1) @@ -388,7 +546,15 @@ func (_m *EVMQueryClient) ValidatorAccount(ctx context.Context, in *types.QueryV _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for ValidatorAccount") + } + var r0 *types.QueryValidatorAccountResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryValidatorAccountRequest, ...grpc.CallOption) (*types.QueryValidatorAccountResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryValidatorAccountRequest, ...grpc.CallOption) *types.QueryValidatorAccountResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -397,7 +563,6 @@ func (_m *EVMQueryClient) ValidatorAccount(ctx context.Context, in *types.QueryV } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryValidatorAccountRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -407,13 +572,12 @@ func (_m *EVMQueryClient) ValidatorAccount(ctx context.Context, in *types.QueryV return r0, r1 } -type mockConstructorTestingTNewEVMQueryClient interface { +// NewEVMQueryClient creates a new instance of EVMQueryClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEVMQueryClient(t interface { mock.TestingT Cleanup(func()) -} - -// NewEVMQueryClient creates a new instance of EVMQueryClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewEVMQueryClient(t mockConstructorTestingTNewEVMQueryClient) *EVMQueryClient { +}) *EVMQueryClient { mock := &EVMQueryClient{} mock.Mock.Test(t) diff --git a/rpc/backend/mocks/feemarket_query_client.go b/rpc/backend/mocks/feemarket_query_client.go index 2536699fb0..487716dbf2 100644 --- a/rpc/backend/mocks/feemarket_query_client.go +++ b/rpc/backend/mocks/feemarket_query_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.1. DO NOT EDIT. +// Code generated by mockery v2.53.0. DO NOT EDIT. package mocks @@ -28,7 +28,15 @@ func (_m *FeeMarketQueryClient) BaseFee(ctx context.Context, in *types.QueryBase _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for BaseFee") + } + var r0 *types.QueryBaseFeeResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBaseFeeRequest, ...grpc.CallOption) (*types.QueryBaseFeeResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBaseFeeRequest, ...grpc.CallOption) *types.QueryBaseFeeResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -37,7 +45,6 @@ func (_m *FeeMarketQueryClient) BaseFee(ctx context.Context, in *types.QueryBase } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryBaseFeeRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -58,7 +65,15 @@ func (_m *FeeMarketQueryClient) BlockGas(ctx context.Context, in *types.QueryBlo _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for BlockGas") + } + var r0 *types.QueryBlockGasResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBlockGasRequest, ...grpc.CallOption) (*types.QueryBlockGasResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryBlockGasRequest, ...grpc.CallOption) *types.QueryBlockGasResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -67,7 +82,6 @@ func (_m *FeeMarketQueryClient) BlockGas(ctx context.Context, in *types.QueryBlo } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryBlockGasRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -88,7 +102,15 @@ func (_m *FeeMarketQueryClient) Params(ctx context.Context, in *types.QueryParam _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for Params") + } + var r0 *types.QueryParamsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) (*types.QueryParamsResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) *types.QueryParamsResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -97,7 +119,6 @@ func (_m *FeeMarketQueryClient) Params(ctx context.Context, in *types.QueryParam } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.QueryParamsRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -107,13 +128,12 @@ func (_m *FeeMarketQueryClient) Params(ctx context.Context, in *types.QueryParam return r0, r1 } -type mockConstructorTestingTNewQueryClient interface { +// NewFeeMarketQueryClient creates a new instance of FeeMarketQueryClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewFeeMarketQueryClient(t interface { mock.TestingT Cleanup(func()) -} - -// NewQueryClient creates a new instance of QueryClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewFeeMarketQueryClient(t mockConstructorTestingTNewQueryClient) *FeeMarketQueryClient { +}) *FeeMarketQueryClient { mock := &FeeMarketQueryClient{} mock.Mock.Test(t) diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index 94745a040b..764ec1c1fc 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -78,10 +78,17 @@ func (b *Backend) Syncing() (interface{}, error) { if !status.SyncInfo.CatchingUp { return false, nil } - + start, err := ethermint.SafeUint64(status.SyncInfo.EarliestBlockHeight) + if err != nil { + return false, err + } + current, err := ethermint.SafeUint64(status.SyncInfo.LatestBlockHeight) + if err != nil { + return false, err + } return map[string]interface{}{ - "startingBlock": hexutil.Uint64(status.SyncInfo.EarliestBlockHeight), - "currentBlock": hexutil.Uint64(status.SyncInfo.LatestBlockHeight), + "startingBlock": hexutil.Uint64(start), + "currentBlock": hexutil.Uint64(current), // "highestBlock": nil, // NA // "pulledStates": nil, // NA // "knownStates": nil, // NA diff --git a/rpc/backend/sign_tx.go b/rpc/backend/sign_tx.go index 1727120003..563715dfb1 100644 --- a/rpc/backend/sign_tx.go +++ b/rpc/backend/sign_tx.go @@ -24,6 +24,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -64,7 +65,13 @@ func (b *Backend) SendTransaction(args evmtypes.TransactionArgs) (common.Hash, e return common.Hash{}, err } - signer := ethtypes.MakeSigner(b.ChainConfig(), new(big.Int).SetUint64(uint64(bn))) + header, err := b.CurrentHeader() + if err != nil { + b.logger.Debug("failed to fetch latest block header", "error", err.Error()) + return common.Hash{}, err + } + + signer := ethtypes.MakeSigner(b.ChainConfig(), new(big.Int).SetUint64(uint64(bn)), header.Time) // Sign transaction if err := msg.Sign(signer, b.clientCtx.Keyring); err != nil { @@ -73,7 +80,7 @@ func (b *Backend) SendTransaction(args evmtypes.TransactionArgs) (common.Hash, e } // Query params to use the EVM denomination - res, err := b.queryClient.QueryClient.Params(b.ctx, &evmtypes.QueryParamsRequest{}) + res, err := b.queryClient.Params(b.ctx, &evmtypes.QueryParamsRequest{}) if err != nil { b.logger.Error("failed to query evm params", "error", err.Error()) return common.Hash{}, err @@ -130,8 +137,9 @@ func (b *Backend) Sign(address common.Address, data hexutil.Bytes) (hexutil.Byte return nil, fmt.Errorf("%s; %s", keystore.ErrNoMatch, err.Error()) } - // Sign the requested hash with the wallet - signature, _, err := b.clientCtx.Keyring.SignByAddress(from, data, signingtypes.SignMode_SIGN_MODE_TEXTUAL) + // Apply EIP-191 signed-message prefix to domain-separate personal + // signatures from transaction signatures (matching Geth's eth_sign). + signature, _, err := b.clientCtx.Keyring.SignByAddress(from, accounts.TextHash(data), signingtypes.SignMode_SIGN_MODE_TEXTUAL) if err != nil { b.logger.Error("keyring.SignByAddress failed", "address", address.Hex()) return nil, err diff --git a/rpc/backend/sign_tx_test.go b/rpc/backend/sign_tx_test.go index 6d1dce3dc7..633d47fa95 100644 --- a/rpc/backend/sign_tx_test.go +++ b/rpc/backend/sign_tx_test.go @@ -2,11 +2,13 @@ package backend import ( "fmt" + "math/big" sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/crypto" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -35,9 +37,9 @@ func (suite *BackendTestSuite) TestSendTransaction() { Gas: &gas, Nonce: &nonce, } - hash := common.Hash{} - + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + height := int64(1) testCases := []struct { name string registerMock func() @@ -60,8 +62,8 @@ func (suite *BackendTestSuite) TestSendTransaction() { client := suite.backend.clientCtx.Client.(*mocks.Client) armor := crypto.EncryptArmorPrivKey(priv, "", "eth_secp256k1") suite.backend.clientCtx.Keyring.ImportPrivKey("test_key", armor, "") - RegisterParams(queryClient, &header, 1) - RegisterBlockError(client, 1) + RegisterParams(queryClient, &header, height) + RegisterHeaderError(client, &height) }, callArgsDefault, hash, @@ -76,9 +78,10 @@ func (suite *BackendTestSuite) TestSendTransaction() { armor := crypto.EncryptArmorPrivKey(priv, "", "eth_secp256k1") suite.backend.clientCtx.Keyring.ImportPrivKey("test_key", armor, "") RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) }, evmtypes.TransactionArgs{ From: &from, @@ -99,10 +102,10 @@ func (suite *BackendTestSuite) TestSendTransaction() { armor := crypto.EncryptArmorPrivKey(priv, "", "eth_secp256k1") suite.backend.clientCtx.Keyring.ImportPrivKey("test_key", armor, "") RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) - RegisterParamsWithoutHeader(queryClient, 1) + RegisterParamsWithoutHeader(queryClient, height) ethSigner := ethtypes.LatestSigner(suite.backend.ChainConfig()) msg := callArgsDefault.ToTransaction() msg.Sign(ethSigner, suite.backend.clientCtx.Keyring) @@ -110,6 +113,7 @@ func (suite *BackendTestSuite) TestSendTransaction() { txEncoder := suite.backend.clientCtx.TxConfig.TxEncoder() txBytes, _ := txEncoder(tx) RegisterBroadcastTxError(client, txBytes) + RegisterValidatorAccount(queryClient, validator) }, callArgsDefault, common.Hash{}, @@ -124,10 +128,10 @@ func (suite *BackendTestSuite) TestSendTransaction() { armor := crypto.EncryptArmorPrivKey(priv, "", "eth_secp256k1") suite.backend.clientCtx.Keyring.ImportPrivKey("test_key", armor, "") RegisterParams(queryClient, &header, 1) - RegisterBlock(client, 1, nil) - RegisterBlockResults(client, 1) + RegisterHeader(client, &height, nil) + RegisterBlockResults(client, height) RegisterBaseFee(queryClient, baseFee) - RegisterParamsWithoutHeader(queryClient, 1) + RegisterParamsWithoutHeader(queryClient, height) ethSigner := ethtypes.LatestSigner(suite.backend.ChainConfig()) msg := callArgsDefault.ToTransaction() msg.Sign(ethSigner, suite.backend.clientCtx.Keyring) @@ -135,6 +139,7 @@ func (suite *BackendTestSuite) TestSendTransaction() { txEncoder := suite.backend.clientCtx.TxConfig.TxEncoder() txBytes, _ := txEncoder(tx) RegisterBroadcastTx(client, txBytes) + RegisterValidatorAccount(queryClient, validator) }, callArgsDefault, hash, @@ -202,7 +207,7 @@ func (suite *BackendTestSuite) TestSign() { responseBz, err := suite.backend.Sign(tc.fromAddr, tc.inputBz) if tc.expPass { - signature, _, err := suite.backend.clientCtx.Keyring.SignByAddress((sdk.AccAddress)(from.Bytes()), tc.inputBz, signing.SignMode_SIGN_MODE_TEXTUAL) + signature, _, err := suite.backend.clientCtx.Keyring.SignByAddress((sdk.AccAddress)(from.Bytes()), accounts.TextHash(tc.inputBz), signing.SignMode_SIGN_MODE_TEXTUAL) signature[goethcrypto.RecoveryIDOffset] += 27 suite.Require().NoError(err) suite.Require().Equal((hexutil.Bytes)(signature), responseBz) @@ -213,6 +218,51 @@ func (suite *BackendTestSuite) TestSign() { } } +// TestSign_CannotForgeTransaction verifies that eth_sign applies the EIP-191 +// prefix, making the returned signature unusable as a transaction signature. +func (suite *BackendTestSuite) TestSign_CannotForgeTransaction() { + from, priv := tests.NewAddrKey() + to := tests.GenerateAddress() + + armor := crypto.EncryptArmorPrivKey(priv, "", "eth_secp256k1") + suite.Require().NoError(suite.backend.clientCtx.Keyring.ImportPrivKey("victim_key", armor, "")) + + unsignedTx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: suite.backend.chainID, + Nonce: 7, + To: &to, + Gas: 21000, + GasTipCap: big.NewInt(1), + GasFeeCap: big.NewInt(2), + Value: big.NewInt(123456789), + }) + signer := ethtypes.LatestSignerForChainID(suite.backend.chainID) + txHash := signer.Hash(unsignedTx) + + signature, err := suite.backend.Sign(from, txHash.Bytes()) + suite.Require().NoError(err) + suite.Require().Len(signature, goethcrypto.SignatureLength) + + // The signature should verify against the EIP-191 prefixed hash, not the raw tx hash. + suite.Require().True( + goethcrypto.VerifySignature(priv.PubKey().Bytes(), accounts.TextHash(txHash.Bytes()), signature[:goethcrypto.RecoveryIDOffset]), + "signature should verify against TextHash(txHash)", + ) + suite.Require().False( + goethcrypto.VerifySignature(priv.PubKey().Bytes(), txHash.Bytes(), signature[:goethcrypto.RecoveryIDOffset]), + "signature must NOT verify against raw txHash (would allow tx forgery)", + ) + + // Attaching the signature to the unsigned tx must NOT recover the victim address. + signature[goethcrypto.RecoveryIDOffset] -= 27 + signedTx, err := unsignedTx.WithSignature(signer, signature) + suite.Require().NoError(err) + + recoveredFrom, err := ethtypes.Sender(signer, signedTx) + suite.Require().NoError(err) + suite.Require().NotEqual(from, recoveredFrom, "forged tx must not recover victim address") +} + func (suite *BackendTestSuite) TestSignTypedData() { from, priv := tests.NewAddrKey() testCases := []struct { diff --git a/rpc/backend/simulate.go b/rpc/backend/simulate.go new file mode 100644 index 0000000000..369db49bad --- /dev/null +++ b/rpc/backend/simulate.go @@ -0,0 +1,97 @@ +package backend + +import ( + "context" + "encoding/json" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + rpctypes "github.com/evmos/ethermint/rpc/types" + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +// simulateError is a JSON-RPC error with a specific error code. +type simulateError struct { + code int + message string +} + +func (e *simulateError) Error() string { return e.message } +func (e *simulateError) ErrorCode() int { return e.code } + +// SimulateV1 implements eth_simulateV1 by forwarding to the keeper via gRPC. +func (b *Backend) SimulateV1(opts rpctypes.SimOpts, blockNr rpctypes.BlockNumber) (json.RawMessage, error) { + if len(opts.BlockStateCalls) == 0 { + return nil, &rpctypes.InvalidParamsError{Message: "empty input"} + } else if len(opts.BlockStateCalls) > rpctypes.MaxSimulateBlocks { + return nil, &rpctypes.ClientLimitExceededError{Message: "too many blocks"} + } + + header, err := b.HeaderByNumber(blockNr) + if err != nil { + return nil, err + } + + // EthHeaderFromTendermint leaves GasLimit at 0; fill it from + // consensus params so the simulated blocks inherit the real limit. + if header.GasLimit == 0 { + height := blockNr.Int64() + if height <= 0 { + if tendermintHeader, err := b.TendermintHeaderByNumber(blockNr); err == nil { + height = tendermintHeader.Header.Height + } + } + if maxGas, err := rpctypes.BlockMaxGasFromConsensusParams(b.ctx, b.clientCtx, height); err == nil && maxGas > 0 { + header.GasLimit = uint64(maxGas) + } + } + + payload := rpctypes.SimulateV1Args{ + Opts: opts, + BaseHeader: header, + } + bz, err := json.Marshal(&payload) + if err != nil { + return nil, err + } + + tendermintHeader, err := b.TendermintHeaderByNumber(blockNr) + if err != nil { + return nil, err + } + + req := evmtypes.SimulateV1Request{ + Args: bz, + GasCap: b.RPCGasCap(), + ProposerAddress: sdk.ConsAddress(tendermintHeader.Header.ProposerAddress), + ChainId: b.chainID.Int64(), + } + + ctx := rpctypes.ContextWithHeight(blockNr.Int64()) + timeout := b.RPCEVMTimeout() + + var cancel context.CancelFunc + if timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + res, err := b.queryClient.SimulateV1(ctx, &req) + if err != nil { + return nil, err + } + + // Simulation errors are returned via dedicated fields, not packed into Result. + if res.ErrorCode != 0 { + return nil, &simulateError{code: int(res.ErrorCode), message: res.ErrorMessage} + } + + length := len(res.Result) + if length > int(b.cfg.JSONRPC.ReturnDataLimit) && b.cfg.JSONRPC.ReturnDataLimit != 0 { + return nil, fmt.Errorf("simulate returned result of length %d exceeding limit %d", length, b.cfg.JSONRPC.ReturnDataLimit) + } + + return json.RawMessage(res.Result), nil +} diff --git a/rpc/backend/simulate_test.go b/rpc/backend/simulate_test.go new file mode 100644 index 0000000000..8c41abcac2 --- /dev/null +++ b/rpc/backend/simulate_test.go @@ -0,0 +1,257 @@ +package backend + +import ( + "encoding/json" + "errors" + "fmt" + "time" + + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/ethermint/rpc/backend/mocks" + rpctypes "github.com/evmos/ethermint/rpc/types" + "github.com/evmos/ethermint/tests" + evmtypes "github.com/evmos/ethermint/x/evm/types" + mock "github.com/stretchr/testify/mock" +) + +func (suite *BackendTestSuite) TestSimulateV1() { + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + baseFee := sdkmath.NewInt(1) + height := int64(1) + + testCases := []struct { + name string + registerMock func() + opts rpctypes.SimOpts + blockNr rpctypes.BlockNumber + expPass bool + expErrMsg string + }{ + { + name: "fail - empty block state calls", + registerMock: func() {}, + opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{}, + }, + blockNr: rpctypes.BlockNumber(1), + expPass: false, + expErrMsg: "empty input", + }, + { + name: "fail - too many blocks", + registerMock: func() {}, + opts: rpctypes.SimOpts{ + BlockStateCalls: make([]rpctypes.SimBlock, rpctypes.MaxSimulateBlocks+1), + }, + blockNr: rpctypes.BlockNumber(1), + expPass: false, + expErrMsg: "too many blocks", + }, + { + name: "fail - HeaderByNumber error", + registerMock: func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + RegisterHeaderError(client, &height) + }, + opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + }, + blockNr: rpctypes.BlockNumber(1), + expPass: false, + }, + { + name: "fail - SimulateV1 gRPC error", + registerMock: func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterHeader(client, &height, nil) + RegisterConsensusParams(client, height) + RegisterBlockResults(client, height) + RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) + RegisterSimulateV1Error(queryClient) + }, + opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + }, + blockNr: rpctypes.BlockNumber(1), + expPass: false, + }, + { + name: "fail - result exceeds return data limit", + registerMock: func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterHeader(client, &height, nil) + RegisterConsensusParams(client, height) + RegisterBlockResults(client, height) + RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) + // Large result that exceeds the limit. + largeResult := make([]byte, 1024) + RegisterSimulateV1Success(queryClient, largeResult) + suite.backend.cfg.JSONRPC.ReturnDataLimit = 10 + }, + opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + }, + blockNr: rpctypes.BlockNumber(1), + expPass: false, + expErrMsg: "exceeding limit", + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("case %s", tc.name), func() { + suite.SetupTest() + // Reset return data limit (may have been modified in a previous test case). + suite.backend.cfg.JSONRPC.ReturnDataLimit = 0 + tc.registerMock() + + res, err := suite.backend.SimulateV1(tc.opts, tc.blockNr) + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + } else { + suite.Require().Error(err) + if tc.expErrMsg != "" { + suite.Require().Contains(err.Error(), tc.expErrMsg) + } + } + }) + } +} + +// TestSimulateV1ErrorCode verifies that when gRPC returns OK and the response +// carries ErrorCode/ErrorMessage (as grpc_query.SimulateV1 now does after a +// failed sim.Execute), the backend surfaces a *simulateError with the same code +// and message. This replaces the old behaviour where the error was JSON-encoded +// inside the Result bytes. +func (suite *BackendTestSuite) TestSimulateV1ErrorCode() { + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + baseFee := sdkmath.NewInt(1) + height := int64(1) + + suite.SetupTest() + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterHeader(client, &height, nil) + RegisterConsensusParams(client, height) + RegisterBlockResults(client, height) + RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) + + msg := "too many blocks" + queryClient.On("SimulateV1", mock.Anything, mock.MatchedBy(func(req *evmtypes.SimulateV1Request) bool { + return req != nil + })).Return(&evmtypes.SimulateV1Response{ + ErrorCode: int32(rpctypes.ErrCodeClientLimitExceeded), + ErrorMessage: msg, + }, nil) + + opts := rpctypes.SimOpts{BlockStateCalls: []rpctypes.SimBlock{{}}} + _, err := suite.backend.SimulateV1(opts, rpctypes.BlockNumber(1)) + suite.Require().Error(err) + + var simErr *simulateError + suite.Require().True(errors.As(err, &simErr)) + suite.Require().Equal(rpctypes.ErrCodeClientLimitExceeded, simErr.ErrorCode()) + suite.Require().Equal(msg, simErr.Error()) +} + +// TestSimulateV1ReturnDataLimitZeroUnlimited verifies that ReturnDataLimit=0 means +// no limit and large results are returned successfully. +func (suite *BackendTestSuite) TestSimulateV1ReturnDataLimitZeroUnlimited() { + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + baseFee := sdkmath.NewInt(1) + height := int64(1) + + suite.SetupTest() + suite.backend.cfg.JSONRPC.ReturnDataLimit = 0 // unlimited + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterHeader(client, &height, nil) + RegisterConsensusParams(client, height) + RegisterBlockResults(client, height) + RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) + largeResult := []byte(`[{"number":"0x1","calls":[]}]`) + RegisterSimulateV1Success(queryClient, largeResult) + + opts := rpctypes.SimOpts{BlockStateCalls: []rpctypes.SimBlock{{}}} + res, err := suite.backend.SimulateV1(opts, rpctypes.BlockNumber(1)) + suite.Require().NoError(err) + suite.Require().NotNil(res) +} + +// TestSimulateErrorType verifies the simulateError type fields. +func (suite *BackendTestSuite) TestSimulateErrorType() { + msg := "block numbers must be in order: 5 <= 3" + e := &simulateError{code: rpctypes.ErrCodeBlockNumberInvalid, message: msg} + suite.Require().Equal(rpctypes.ErrCodeBlockNumberInvalid, e.ErrorCode()) + suite.Require().Equal(msg, e.Error()) +} + +// TestSimulateV1JSONPayload verifies that the SimulateV1Args payload is +// marshalled correctly and round-trips cleanly. +func (suite *BackendTestSuite) TestSimulateV1JSONPayload() { + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + TraceTransfers: true, + Validation: false, + ReturnFullTransactions: true, + } + payload := rpctypes.SimulateV1Args{ + Opts: opts, + BaseHeader: nil, + } + bz, err := json.Marshal(&payload) + suite.Require().NoError(err) + + var decoded rpctypes.SimulateV1Args + suite.Require().NoError(json.Unmarshal(bz, &decoded)) + suite.Require().Equal(opts.TraceTransfers, decoded.Opts.TraceTransfers) + suite.Require().Equal(opts.Validation, decoded.Opts.Validation) + suite.Require().Equal(opts.ReturnFullTransactions, decoded.Opts.ReturnFullTransactions) + suite.Require().Len(decoded.Opts.BlockStateCalls, 1) +} + +// TestSimulateV1WithTimeout verifies the context.WithTimeout branch taken +// when EVMTimeout > 0. +func (suite *BackendTestSuite) TestSimulateV1WithTimeout() { + validator := sdk.AccAddress(tests.GenerateAddress().Bytes()) + baseFee := sdkmath.NewInt(1) + height := int64(1) + + suite.SetupTest() + suite.backend.cfg.JSONRPC.EVMTimeout = 5 * time.Second // triggers context.WithTimeout path + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterHeader(client, &height, nil) + RegisterConsensusParams(client, height) + RegisterBlockResults(client, height) + RegisterBaseFee(queryClient, baseFee) + RegisterValidatorAccount(queryClient, validator) + result := []byte(`[{"number":"0x1","calls":[]}]`) + RegisterSimulateV1Success(queryClient, result) + + opts := rpctypes.SimOpts{BlockStateCalls: []rpctypes.SimBlock{{}}} + res, err := suite.backend.SimulateV1(opts, rpctypes.BlockNumber(1)) + suite.Require().NoError(err) + suite.Require().NotNil(res) +} + +// RegisterSimulateV1Success registers a SimulateV1 mock that returns the given result bytes. +func RegisterSimulateV1Success(queryClient *mocks.EVMQueryClient, result []byte) { + queryClient.On("SimulateV1", mock.Anything, mock.MatchedBy(func(req *evmtypes.SimulateV1Request) bool { + return req != nil + })).Return(&evmtypes.SimulateV1Response{Result: result}, nil) +} + +// RegisterSimulateV1Error registers a SimulateV1 mock that returns a gRPC error. +func RegisterSimulateV1Error(queryClient *mocks.EVMQueryClient) { + queryClient.On("SimulateV1", mock.Anything, mock.MatchedBy(func(req *evmtypes.SimulateV1Request) bool { + return req != nil + })).Return(nil, fmt.Errorf("internal error")) +} diff --git a/rpc/backend/tracing.go b/rpc/backend/tracing.go index 2b80baba1d..12282f42b4 100644 --- a/rpc/backend/tracing.go +++ b/rpc/backend/tracing.go @@ -24,7 +24,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" rpctypes "github.com/evmos/ethermint/rpc/types" + ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" + feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" "github.com/pkg/errors" ) @@ -48,9 +50,12 @@ func (b *Backend) TraceTransaction(hash common.Hash, config *rpctypes.TraceConfi b.logger.Debug("block not found", "height", transaction.Height) return nil, err } - + total, err := ethermint.SafeUint32(len(blk.Block.Txs)) + if err != nil { + return nil, err + } // check tx index is not out of bound - if uint32(len(blk.Block.Txs)) < transaction.TxIndex { + if total < transaction.TxIndex { b.logger.Debug("tx index out of bounds", "index", transaction.TxIndex, "hash", hash.String(), "height", blk.Block.Height) return nil, fmt.Errorf("transaction not included in block %v", blk.Block.Height) } @@ -113,6 +118,12 @@ func (b *Backend) TraceTransaction(hash common.Hash, config *rpctypes.TraceConfi // 0 is a special value in `ContextWithHeight` contextHeight = 1 } + // Get basefee from transaction height + res, err := b.queryClient.FeeMarket.Params(rpctypes.ContextWithHeight(transaction.Height), &feemarkettypes.QueryParamsRequest{}) + if err != nil { + return nil, err + } + traceTxRequest.BaseFee = &res.Params.BaseFee traceResult, err := b.queryClient.TraceTx(rpctypes.ContextWithHeight(contextHeight), &traceTxRequest) if err != nil { return nil, err @@ -227,7 +238,7 @@ func (b *Backend) TraceCall( if err != nil { return nil, err } - blk, err := b.TendermintBlockByNumber(blockNr) + header, err := b.TendermintHeaderByNumber(blockNr) if err != nil { // the error message imitates geth behavior return nil, errors.New("header not found") @@ -236,10 +247,10 @@ func (b *Backend) TraceCall( traceCallRequest := evmtypes.QueryTraceCallRequest{ Args: bz, GasCap: b.RPCGasCap(), - ProposerAddress: sdk.ConsAddress(blk.Block.ProposerAddress), - BlockNumber: blk.Block.Height, - BlockHash: common.Bytes2Hex(blk.BlockID.Hash), - BlockTime: blk.Block.Time, + ProposerAddress: sdk.ConsAddress(header.Header.ProposerAddress), + BlockNumber: header.Header.Height, + BlockHash: common.Bytes2Hex(header.Header.Hash()), + BlockTime: header.Header.Time, ChainId: b.chainID.Int64(), } @@ -248,7 +259,7 @@ func (b *Backend) TraceCall( } // get the context of provided block - contextHeight := blk.Block.Height + contextHeight := header.Header.Height if contextHeight < 1 { // 0 is a special value in `ContextWithHeight` contextHeight = 1 diff --git a/rpc/backend/tracing_test.go b/rpc/backend/tracing_test.go index 78f2284aaa..7916b1ca9c 100644 --- a/rpc/backend/tracing_test.go +++ b/rpc/backend/tracing_test.go @@ -5,7 +5,7 @@ import ( "fmt" "math/big" - tmlog "cosmossdk.io/log" + tmlog "cosmossdk.io/log/v2" abci "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/cometbft/cometbft/types" @@ -129,6 +129,8 @@ func (suite *BackendTestSuite) TestTraceTransaction() { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlockMultipleTxs(client, 1, []types.Tx{txBz, txBz2}) + feeMarketClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) + RegisterFeeMarketParams(feeMarketClient, 1) RegisterTraceTransactionWithPredecessors(queryClient, msgEthereumTx, []*evmtypes.MsgEthereumTx{msgEthereumTx}) }, &types.Block{Header: types.Header{Height: 1, ChainID: ChainID}, Data: types.Data{Txs: []types.Tx{txBz, txBz2}}}, @@ -169,6 +171,8 @@ func (suite *BackendTestSuite) TestTraceTransaction() { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) client := suite.backend.clientCtx.Client.(*mocks.Client) RegisterBlock(client, 1, txBz) + feeMarketClient := suite.backend.queryClient.FeeMarket.(*mocks.FeeMarketQueryClient) + RegisterFeeMarketParams(feeMarketClient, 1) RegisterTraceTransaction(queryClient, msgEthereumTx) }, &types.Block{Header: types.Header{Height: 1}, Data: types.Data{Txs: []types.Tx{txBz}}}, @@ -307,7 +311,8 @@ func (suite *BackendTestSuite) TestDebugTraceCall() { func() { client := suite.backend.clientCtx.Client.(*mocks.Client) queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) - RegisterBlock(client, 1, bz) + height := int64(1) + RegisterHeader(client, &height, bz) RegisterTraceCall( queryClient, &evmtypes.QueryTraceCallRequest{Args: argsBz, ChainId: suite.backend.chainID.Int64(), BlockNumber: 1}, diff --git a/rpc/backend/tx_info.go b/rpc/backend/tx_info.go index 2e626e2565..0634c80c49 100644 --- a/rpc/backend/tx_info.go +++ b/rpc/backend/tx_info.go @@ -16,12 +16,16 @@ package backend import ( + "encoding/json" "fmt" + "math/big" errorsmod "cosmossdk.io/errors" + abci "github.com/cometbft/cometbft/abci/types" tmrpcclient "github.com/cometbft/cometbft/rpc/client" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -29,7 +33,6 @@ import ( rpctypes "github.com/evmos/ethermint/rpc/types" ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" - "github.com/pkg/errors" ) // GetTransactionByHash returns the Ethereum format transaction identified by Ethereum transaction hash @@ -38,21 +41,30 @@ func (b *Backend) GetTransactionByHash(txHash common.Hash) (*rpctypes.RPCTransac if err != nil { return b.getTransactionByHashPending(txHash) } - + height, err := ethermint.SafeUint64(res.Height) + if err != nil { + return nil, err + } block, err := b.TendermintBlockByNumber(rpctypes.BlockNumber(res.Height)) if err != nil { return nil, err } + if int(res.TxIndex) >= len(block.Block.Txs) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "tx index %d out of range (block has %d txs)", res.TxIndex, len(block.Block.Txs)) + } tx, err := b.clientCtx.TxConfig.TxDecoder()(block.Block.Txs[res.TxIndex]) if err != nil { return nil, err } - // the `res.MsgIndex` is inferred from tx index, should be within the bound. - msg, ok := tx.GetMsgs()[res.MsgIndex].(*evmtypes.MsgEthereumTx) + msgs := tx.GetMsgs() + if int(res.MsgIndex) >= len(msgs) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "msg index %d out of range (tx has %d msgs)", res.MsgIndex, len(msgs)) + } + msg, ok := msgs[res.MsgIndex].(*evmtypes.MsgEthereumTx) if !ok { - return nil, errors.New("invalid ethereum tx") + return nil, errorsmod.Wrapf(errortypes.ErrInvalidType, "msg at index %d is not MsgEthereumTx (got %T)", res.MsgIndex, msgs[res.MsgIndex]) } blockRes, err := b.TendermintBlockResultByNumber(&block.Block.Height) @@ -65,28 +77,35 @@ func (b *Backend) GetTransactionByHash(txHash common.Hash) (*rpctypes.RPCTransac // Fallback to find tx index by iterating all valid eth transactions msgs := b.EthMsgsFromTendermintBlock(block, blockRes) for i := range msgs { + idx, err := ethermint.SafeIntToInt32(i) + if err != nil { + return nil, err + } if msgs[i].Hash() == txHash { - res.EthTxIndex = int32(i) + res.EthTxIndex = idx break } } } // if we still unable to find the eth tx index, return error, shouldn't happen. if res.EthTxIndex == -1 { - return nil, errors.New("can't find index of ethereum tx") + return nil, errorsmod.Wrap(errortypes.ErrNotFound, "can't find index of ethereum tx") + } + index, err := ethermint.SafeInt32ToUint64(res.EthTxIndex) + if err != nil { + return nil, err } - baseFee, err := b.BaseFee(blockRes) if err != nil { // handle the error for pruned node. b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", blockRes.Height, "error", err) } - return rpctypes.NewTransactionFromMsg( msg, common.BytesToHash(block.BlockID.Hash.Bytes()), - uint64(res.Height), - uint64(res.EthTxIndex), + height, + safeBlockTime(block.Block.Time.Unix()), + index, baseFee, b.chainID, ) @@ -115,6 +134,7 @@ func (b *Backend) getTransactionByHashPending(txHash common.Hash) (*rpctypes.RPC common.Hash{}, uint64(0), uint64(0), + uint64(0), nil, b.chainID, ) @@ -140,43 +160,218 @@ func (b *Backend) GetGasUsed(res *ethermint.TxResult, gas uint64) uint64 { return res.GasUsed } -// GetTransactionReceipt returns the transaction receipt identified by hash. -func (b *Backend) GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) { +// GetTransactionReceipt returns the receipt identified by hash. When block +// is nil the tx is resolved via the KV indexer; otherwise the receipt is +// rebuilt from block to guard against indexer hash→height overwrites. +func (b *Backend) GetTransactionReceipt(hash common.Hash, block *tmrpctypes.ResultBlock) (map[string]interface{}, error) { b.logger.Debug("eth_getTransactionReceipt", "hash", hash) + if block == nil { + return b.getTransactionReceiptByIndexer(hash) + } + + blockResults, err := b.TendermintBlockResultByNumber(&block.Block.Height) + if err != nil { + b.logger.Debug("failed to retrieve block results", "height", block.Block.Height, "error", err.Error()) + return nil, nil + } + + input, err := b.collectReceiptEntriesFromBlock(block, blockResults, &hash) + if err != nil { + return nil, err + } + for i := range input { + if input[i].hash == hash { + return b.buildReceiptDirect(block, blockResults, input[i].txResult, input[i].ethMsg) + } + } + b.logger.Debug("tx not found in block", "hash", hash, "height", block.Block.Height) + return nil, nil +} + +// getTransactionReceiptByIndexer resolves the tx via the KV indexer and +// assembles the receipt, folding prior cosmos tx gas into cumulativeGasUsed. +func (b *Backend) getTransactionReceiptByIndexer(hash common.Hash) (map[string]interface{}, error) { res, err := b.GetTxByEthHash(hash) if err != nil { b.logger.Debug("tx not found", "hash", hash, "error", err.Error()) return nil, nil } - resBlock, err := b.TendermintBlockByNumber(rpctypes.BlockNumber(res.Height)) + if res == nil { + b.logger.Debug("tx not found in indexer", "hash", hash) + return nil, nil + } + block, err := b.TendermintBlockByNumber(rpctypes.BlockNumber(res.Height)) if err != nil { b.logger.Debug("block not found", "height", res.Height, "error", err.Error()) return nil, nil } - tx, err := b.clientCtx.TxConfig.TxDecoder()(resBlock.Block.Txs[res.TxIndex]) + blockResults, err := b.TendermintBlockResultByNumber(&res.Height) if err != nil { - b.logger.Debug("decoding failed", "error", err.Error()) - return nil, fmt.Errorf("failed to decode tx: %w", err) + b.logger.Debug("failed to retrieve block results", "height", res.Height, "error", err.Error()) + return nil, nil + } + if int(res.TxIndex) >= len(block.Block.Txs) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "tx index %d out of range (block has %d txs)", res.TxIndex, len(block.Block.Txs)) + } + tx, err := b.clientCtx.TxConfig.TxDecoder()(block.Block.Txs[res.TxIndex]) + if err != nil { + return nil, errorsmod.Wrapf(errortypes.ErrTxDecode, "failed to decode tx: %v", err) + } + msgs := tx.GetMsgs() + if int(res.MsgIndex) >= len(msgs) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "msg index %d out of range (tx has %d msgs)", res.MsgIndex, len(msgs)) + } + ethMsg, ok := msgs[res.MsgIndex].(*evmtypes.MsgEthereumTx) + if !ok { + return nil, errorsmod.Wrapf(errortypes.ErrInvalidType, "msg at index %d is not MsgEthereumTx (got %T)", res.MsgIndex, msgs[res.MsgIndex]) + } + + if int(res.TxIndex) >= len(blockResults.TxsResults) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "tx index %d out of range for block results (%d txs)", res.TxIndex, len(blockResults.TxsResults)) + } + var priorGas uint64 + for _, txResult := range blockResults.TxsResults[0:res.TxIndex] { + gas, err := ethermint.SafeUint64(txResult.GasUsed) + if err != nil { + return nil, err + } + priorGas += gas + } + res.CumulativeGasUsed += priorGas + return b.buildReceiptDirect(block, blockResults, res, ethMsg) +} + +type receiptEntry struct { + hash common.Hash + txResult *ethermint.TxResult + ethMsg *evmtypes.MsgEthereumTx +} + +// collectReceiptEntriesFromBlock walks the block and builds eth receipt entries. +// When stopAtHash is non-nil the walk returns early once that hash is found. +func (b *Backend) collectReceiptEntriesFromBlock( + block *tmrpctypes.ResultBlock, + blockResults *tmrpctypes.ResultBlockResults, + stopAtHash *common.Hash, +) ([]receiptEntry, error) { + if block == nil || block.Block == nil || blockResults == nil { + return nil, nil + } + + entries := make([]receiptEntry, 0, len(block.Block.Txs)) + // Keep eth tx index assignment consistent with KV indexer. + var ethTxIndex int32 + var cumulativeGasUsed uint64 + for txIndex, txBz := range block.Block.Txs { + if txIndex >= len(blockResults.TxsResults) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "tx index %d out of range for block results (%d txs)", txIndex, len(blockResults.TxsResults)) + } + + result := blockResults.TxsResults[txIndex] + if !rpctypes.TxSuccessOrExceedsBlockGasLimit(result) { + continue + } + + tx, err := b.clientCtx.TxConfig.TxDecoder()(txBz) + if err != nil { + b.logger.Debug("failed to decode transaction in block", "height", block.Block.Height, "error", err.Error()) + continue + } + + var parsed *rpctypes.ParsedTxs + if result.Code == abci.CodeTypeOK { + parsed, err = rpctypes.ParseTxResult(result, tx) + if err != nil { + b.logger.Error("failed to parse tx events", "height", block.Block.Height, "tx-index", txIndex, "error", err.Error()) + continue + } + } + + for msgIndex, msg := range tx.GetMsgs() { + ethMsg, ok := msg.(*evmtypes.MsgEthereumTx) + if !ok { + continue + } + + txIdx, err := ethermint.SafeUint32(txIndex) + if err != nil { + return nil, err + } + msgIdx, err := ethermint.SafeUint32(msgIndex) + if err != nil { + return nil, err + } + + txResult := ðermint.TxResult{ + Height: block.Block.Height, + TxIndex: txIdx, + MsgIndex: msgIdx, + EthTxIndex: ethTxIndex, + } + + if result.Code != abci.CodeTypeOK { + // Exceed-block-gas tx may not emit ethereum_tx events. + txResult.GasUsed = ethMsg.GetGas() + txResult.Failed = true + } else { + parsedTx := parsed.GetTxByMsgIndex(msgIndex) + if parsedTx == nil { + b.logger.Debug("msg index not found in events", "height", block.Block.Height, "tx-index", txIndex, "msg-index", msgIndex) + continue + } + txResult.GasUsed = parsedTx.GasUsed + txResult.Failed = parsedTx.Failed + } + + cumulativeGasUsed += txResult.GasUsed + txResult.CumulativeGasUsed = cumulativeGasUsed + + hash := ethMsg.Hash() + entries = append(entries, receiptEntry{ + hash: hash, + txResult: txResult, + ethMsg: ethMsg, + }) + ethTxIndex++ + + if stopAtHash != nil && hash == *stopAtHash { + return entries, nil + } + } + } + + return entries, nil +} + +// buildReceiptDirect assembles the receipt map from resolved tx data. +// Caller must set res.CumulativeGasUsed to the block-wide value. +func (b *Backend) buildReceiptDirect( + block *tmrpctypes.ResultBlock, + blockResults *tmrpctypes.ResultBlockResults, + res *ethermint.TxResult, + ethMsg *evmtypes.MsgEthereumTx, +) (map[string]interface{}, error) { + if res == nil || ethMsg == nil { + return nil, nil + } + hash := ethMsg.Hash() + if block == nil || block.Block == nil { + return nil, errorsmod.Wrap(errortypes.ErrNotFound, "block not found") + } + if blockResults == nil { + return nil, errorsmod.Wrap(errortypes.ErrNotFound, "block result not found") } - ethMsg := tx.GetMsgs()[res.MsgIndex].(*evmtypes.MsgEthereumTx) txData := ethMsg.AsTransaction() if txData == nil { b.logger.Error("failed to unpack tx data") - return nil, err + return nil, errorsmod.Wrap(errortypes.ErrTxDecode, "failed to unpack tx data") } - cumulativeGasUsed := uint64(0) - blockRes, err := b.TendermintBlockResultByNumber(&res.Height) - if err != nil { - b.logger.Debug("failed to retrieve block results", "height", res.Height, "error", err.Error()) - return nil, nil - } - for _, txResult := range blockRes.TxsResults[0:res.TxIndex] { - cumulativeGasUsed += uint64(txResult.GasUsed) + if int(res.TxIndex) >= len(blockResults.TxsResults) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "tx index %d out of range for block results (%d txs)", res.TxIndex, len(blockResults.TxsResults)) } - cumulativeGasUsed += res.CumulativeGasUsed var status hexutil.Uint if res.Failed { @@ -194,37 +389,63 @@ func (b *Backend) GetTransactionReceipt(hash common.Hash) (map[string]interface{ return nil, err } + height, err := ethermint.SafeUint64(blockResults.Height) + if err != nil { + return nil, err + } // parse tx logs from events logs, err := evmtypes.DecodeMsgLogsFromEvents( - blockRes.TxsResults[res.TxIndex].Data, - blockRes.TxsResults[res.TxIndex].Events, + blockResults.TxsResults[res.TxIndex].Data, + blockResults.TxsResults[res.TxIndex].Events, int(res.MsgIndex), - uint64(blockRes.Height), + height, ) if err != nil { b.logger.Debug("failed to parse logs", "hash", hash, "error", err.Error()) } if res.EthTxIndex == -1 { - // Fallback to find tx index by iterating all valid eth transactions - msgs := b.EthMsgsFromTendermintBlock(resBlock, blockRes) + // Reachable via TM-indexer fallback (ParseTxIndexerResult) when events + // lack the txIndex attribute. Scan the block for a matching hash. + msgs := b.EthMsgsFromTendermintBlock(block, blockResults) for i := range msgs { + idx, err := ethermint.SafeIntToInt32(i) + if err != nil { + return nil, err + } if msgs[i].Hash() == hash { - res.EthTxIndex = int32(i) + res.EthTxIndex = idx break } } } - // return error if still unable to find the eth tx index if res.EthTxIndex == -1 { - return nil, errors.New("can't find index of ethereum tx") + return nil, errorsmod.Wrap(errortypes.ErrNotFound, "can't find index of ethereum tx") + } + + blockNumber, err := ethermint.SafeUint64(res.Height) + if err != nil { + return nil, err + } + transactionIndex, err := ethermint.SafeInt32ToUint64(res.EthTxIndex) + if err != nil { + return nil, err + } + + // create the logs bloom + var bloom ethtypes.Bloom + for _, log := range logs { + bloom.Add(log.Address.Bytes()) + for _, b := range log.Topics { + bloom.Add(b[:]) + } } receipt := map[string]interface{}{ // Consensus fields: These fields are defined by the Yellow Paper "status": status, - "cumulativeGasUsed": hexutil.Uint64(cumulativeGasUsed), - "logsBloom": ethtypes.BytesToBloom(ethtypes.LogsBloom(logs)), + "cumulativeGasUsed": hexutil.Uint64(res.CumulativeGasUsed), + "logsBloom": ethtypes.BytesToBloom(bloom.Bytes()), "logs": logs, // Implementation fields: These fields are added by geth when processing a transaction. @@ -235,9 +456,9 @@ func (b *Backend) GetTransactionReceipt(hash common.Hash) (map[string]interface{ // Inclusion information: These fields provide information about the inclusion of the // transaction corresponding to this receipt. - "blockHash": common.BytesToHash(resBlock.Block.Header.Hash()).Hex(), - "blockNumber": hexutil.Uint64(res.Height), - "transactionIndex": hexutil.Uint64(res.EthTxIndex), + "blockHash": common.BytesToHash(block.Block.Header.Hash()).Hex(), + "blockNumber": hexutil.Uint64(blockNumber), + "transactionIndex": hexutil.Uint64(transactionIndex), // sender and receiver (contract or EOA) addreses "from": from, @@ -254,15 +475,34 @@ func (b *Backend) GetTransactionReceipt(hash common.Hash) (map[string]interface{ receipt["contractAddress"] = crypto.CreateAddress(from, txData.Nonce()) } - if txData.Type() == ethtypes.DynamicFeeTxType { - baseFee, err := b.BaseFee(blockRes) + if txData.Type() == ethtypes.BlobTxType { + // Ethermint does not execute EIP-4844 blob gas accounting yet. + receipt["blobGasUsed"] = hexutil.Uint64(0) + receipt["blobGasPrice"] = (*hexutil.Big)(big.NewInt(0)) + } + + var baseFee *big.Int + isEIP1559Tx := txData.Type() == ethtypes.DynamicFeeTxType || + txData.Type() == ethtypes.BlobTxType || + txData.Type() == ethtypes.SetCodeTxType + if isEIP1559Tx { + var err error + baseFee, err = b.BaseFee(blockResults) if err != nil { // tolerate the error for pruned node. b.logger.Error("fetch basefee failed, node is pruned?", "height", res.Height, "error", err) - } else { - receipt["effectiveGasPrice"] = hexutil.Big(*ethMsg.GetEffectiveGasPrice(baseFee)) + baseFee = nil } } + // Omit effectiveGasPrice for EIP-1559 txs when baseFee is unavailable + // (pruned node / fee market disabled) — GasFeeCap is not the effective price. + if !isEIP1559Tx || baseFee != nil { + effectiveGasPrice := ethMsg.GetEffectiveGasPrice(baseFee) + if effectiveGasPrice == nil { + return nil, errorsmod.Wrap(errortypes.ErrLogic, "effective gas price is nil") + } + receipt["effectiveGasPrice"] = hexutil.Big(*effectiveGasPrice) + } return receipt, nil } @@ -273,7 +513,7 @@ func (b *Backend) GetTransactionByBlockHashAndIndex(hash common.Hash, idx hexuti sc, ok := b.clientCtx.Client.(tmrpcclient.SignClient) if !ok { - return nil, errors.New("invalid rpc client") + return nil, errorsmod.Wrap(errortypes.ErrInvalidType, "invalid rpc client") } block, err := sc.BlockByHash(b.ctx, hash.Bytes()) @@ -328,9 +568,17 @@ func (b *Backend) GetTxByEthHash(hash common.Hash) (*ethermint.TxResult, error) } // GetTxByTxIndex uses `/tx_query` to find transaction by tx index of valid ethereum txs -func (b *Backend) GetTxByTxIndex(height int64, index uint) (*ethermint.TxResult, error) { +func (b *Backend) GetTxByTxIndex(height int64, i uint) (*ethermint.TxResult, error) { + index, err := ethermint.SafeUintToInt32(i) + if err != nil { + return nil, err + } + idx, err := ethermint.SafeInt(i) + if err != nil { + return nil, err + } if b.indexer != nil { - return b.indexer.GetByBlockAndIndex(height, int32(index)) + return b.indexer.GetByBlockAndIndex(height, index) } // fallback to tendermint tx indexer @@ -339,7 +587,7 @@ func (b *Backend) GetTxByTxIndex(height int64, index uint) (*ethermint.TxResult, evmtypes.AttributeKeyTxIndex, index, ) txResult, err := b.queryTendermintTxIndexer(query, func(txs *rpctypes.ParsedTxs) *rpctypes.ParsedTx { - return txs.GetTxByTxIndex(int(index)) + return txs.GetTxByTxIndex(idx) }) if err != nil { return nil, errorsmod.Wrapf(err, "GetTxByTxIndex %d %d", height, index) @@ -351,14 +599,14 @@ func (b *Backend) GetTxByTxIndex(height int64, index uint) (*ethermint.TxResult, func (b *Backend) queryTendermintTxIndexer(query string, txGetter func(*rpctypes.ParsedTxs) *rpctypes.ParsedTx) (*ethermint.TxResult, error) { resTxs, err := b.clientCtx.Client.TxSearch(b.ctx, query, false, nil, nil, "") if err != nil { - return nil, err + return nil, errorsmod.Wrapf(err, "failed to search tx in tendermint indexer, query: %s", query) } if len(resTxs.Txs) == 0 { - return nil, errors.New("ethereum tx not found") + return nil, errorsmod.Wrap(errortypes.ErrNotFound, "ethereum tx not found") } txResult := resTxs.Txs[0] if !rpctypes.TxSuccessOrExceedsBlockGasLimit(&txResult.TxResult) { - return nil, errors.New("invalid ethereum tx") + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "ethereum tx failed, code: %d, log: %s", txResult.TxResult.Code, txResult.TxResult.Log) } var tx sdk.Tx @@ -366,7 +614,7 @@ func (b *Backend) queryTendermintTxIndexer(query string, txGetter func(*rpctypes // it's only needed when the tx exceeds block gas limit tx, err = b.clientCtx.TxConfig.TxDecoder()(txResult.Tx) if err != nil { - return nil, fmt.Errorf("invalid ethereum tx") + return nil, errorsmod.Wrapf(errortypes.ErrTxDecode, "failed to decode tx: %v", err) } } @@ -384,21 +632,30 @@ func (b *Backend) GetTransactionByBlockAndIndex(block *tmrpctypes.ResultBlock, i // find in tx indexer res, err := b.GetTxByTxIndex(block.Block.Height, uint(idx)) if err == nil { + if int(res.TxIndex) >= len(block.Block.Txs) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "tx index %d out of range (block has %d txs)", res.TxIndex, len(block.Block.Txs)) + } tx, err := b.clientCtx.TxConfig.TxDecoder()(block.Block.Txs[res.TxIndex]) if err != nil { b.logger.Debug("invalid ethereum tx", "height", block.Block.Header, "index", idx) return nil, nil } + msgs := tx.GetMsgs() + if int(res.MsgIndex) >= len(msgs) { + return nil, errorsmod.Wrapf(errortypes.ErrLogic, "msg index %d out of range (tx has %d msgs)", res.MsgIndex, len(msgs)) + } var ok bool - // msgIndex is inferred from tx events, should be within bound. - msg, ok = tx.GetMsgs()[res.MsgIndex].(*evmtypes.MsgEthereumTx) + msg, ok = msgs[res.MsgIndex].(*evmtypes.MsgEthereumTx) if !ok { b.logger.Debug("invalid ethereum tx", "height", block.Block.Header, "index", idx) return nil, nil } } else { - i := int(idx) + i, err := ethermint.SafeHexToInt(idx) + if err != nil { + return nil, err + } ethMsgs := b.EthMsgsFromTendermintBlock(block, blockRes) if i >= len(ethMsgs) { b.logger.Debug("block txs index out of bound", "index", i) @@ -414,12 +671,42 @@ func (b *Backend) GetTransactionByBlockAndIndex(block *tmrpctypes.ResultBlock, i b.logger.Error("failed to fetch Base Fee from prunned block. Check node prunning configuration", "height", block.Block.Height, "error", err) } + height, err := ethermint.SafeUint64(block.Block.Height) + if err != nil { + return nil, err + } + return rpctypes.NewTransactionFromMsg( msg, common.BytesToHash(block.Block.Hash()), - uint64(block.Block.Height), + height, + safeBlockTime(block.Block.Time.Unix()), uint64(idx), baseFee, b.chainID, ) } + +// CreateAccessList returns the list of addresses and storage keys used by the transaction (except for the +// sender account and precompiles), plus the estimated gas if the access list were added to the transaction. +func (b *Backend) CreateAccessList( + args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + overrides *json.RawMessage, +) (*rpctypes.AccessListResult, error) { + blockNb, err := b.BlockNumberFromTendermint(blockNrOrHash) + if err != nil { + return nil, err + } + res, err := b.CreateAccessListCall(args, blockNb, overrides) + if err != nil { + b.logger.Error("failed to call access list", "error", err) + return nil, err + } + result := rpctypes.AccessListResult{ + AccessList: res.AccessList, + GasUsed: res.GasUsed, + Error: res.Error, + } + return &result, nil +} diff --git a/rpc/backend/tx_info_test.go b/rpc/backend/tx_info_test.go index fd0471303f..f55b591760 100644 --- a/rpc/backend/tx_info_test.go +++ b/rpc/backend/tx_info_test.go @@ -1,10 +1,11 @@ package backend import ( + "encoding/json" "fmt" "math/big" - tmlog "cosmossdk.io/log" + tmlog "cosmossdk.io/log/v2" sdkmath "cosmossdk.io/math" abci "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" @@ -12,11 +13,15 @@ import ( dbm "github.com/cosmos/cosmos-db" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/evmos/ethermint/indexer" "github.com/evmos/ethermint/rpc/backend/mocks" rpctypes "github.com/evmos/ethermint/rpc/types" + "github.com/evmos/ethermint/tests" ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" + "github.com/stretchr/testify/mock" "google.golang.org/grpc/metadata" ) @@ -41,7 +46,7 @@ func (suite *BackendTestSuite) TestGetTransactionByHash() { }, } - rpcTransaction, _ := rpctypes.NewRPCTransaction(msgEthereumTx, common.Hash{}, 0, 0, big.NewInt(1), suite.backend.chainID) + rpcTransaction, _ := rpctypes.NewRPCTransaction(msgEthereumTx, common.Hash{}, 0, 0, 0, big.NewInt(1), suite.backend.chainID) testCases := []struct { name string @@ -114,6 +119,10 @@ func (suite *BackendTestSuite) TestGetTransactionByHash() { if tc.expPass { suite.Require().NoError(err) suite.Require().Equal(rpcTx, tc.expRPCTx) + // mock block has zero time — BlockTimestamp must be nil, not a wrapped uint64. + if rpcTx != nil { + suite.Require().Nil(rpcTx.BlockTimestamp) + } } else { suite.Require().Error(err) } @@ -123,7 +132,7 @@ func (suite *BackendTestSuite) TestGetTransactionByHash() { func (suite *BackendTestSuite) TestGetTransactionsByHashPending() { msgEthereumTx, bz := suite.buildEthereumTx() - rpcTransaction, _ := rpctypes.NewRPCTransaction(msgEthereumTx, common.Hash{}, 0, 0, big.NewInt(1), suite.backend.chainID) + rpcTransaction, _ := rpctypes.NewRPCTransaction(msgEthereumTx, common.Hash{}, 0, 0, 0, big.NewInt(1), suite.backend.chainID) testCases := []struct { name string @@ -183,7 +192,7 @@ func (suite *BackendTestSuite) TestGetTransactionsByHashPending() { func (suite *BackendTestSuite) TestGetTxByEthHash() { msgEthereumTx, bz := suite.buildEthereumTx() - rpcTransaction, _ := rpctypes.NewRPCTransaction(msgEthereumTx, common.Hash{}, 0, 0, big.NewInt(1), suite.backend.chainID) + rpcTransaction, _ := rpctypes.NewRPCTransaction(msgEthereumTx, common.Hash{}, 0, 0, 0, big.NewInt(1), suite.backend.chainID) testCases := []struct { name string @@ -298,6 +307,7 @@ func (suite *BackendTestSuite) TestGetTransactionByBlockAndIndex() { common.BytesToHash(defaultBlock.Hash().Bytes()), 1, 0, + 0, big.NewInt(1), suite.backend.chainID, ) @@ -377,6 +387,10 @@ func (suite *BackendTestSuite) TestGetTransactionByBlockAndIndex() { if tc.expPass { suite.Require().NoError(err) suite.Require().Equal(rpcTx, tc.expRPCTx) + // mock block has zero time — BlockTimestamp must be nil, not a wrapped uint64. + if rpcTx != nil { + suite.Require().Nil(rpcTx.BlockTimestamp) + } } else { suite.Require().Error(err) } @@ -392,6 +406,7 @@ func (suite *BackendTestSuite) TestGetTransactionByBlockNumberAndIndex() { common.BytesToHash(defaultBlock.Hash().Bytes()), 1, 0, + 0, big.NewInt(1), suite.backend.chainID, ) @@ -552,7 +567,22 @@ func (suite *BackendTestSuite) TestGetTransactionReceipt() { RegisterParams(queryClient, &header, 1) RegisterParamsWithoutHeader(queryClient, 1) RegisterBlock(client, 1, txBz) - RegisterBlockResults(client, 1) + // Block results must include ethereum_tx events so buildReceiptEntriesFromBlock + // can locate the tx; RegisterBlockResults (no events) is insufficient. + client.On("BlockResults", rpctypes.ContextWithHeight(1), mock.AnythingOfType("*int64")). + Return(&tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{{ + Code: 0, + GasUsed: 21000, + Events: []abci.Event{ + {Type: evmtypes.EventTypeEthereumTx, Attributes: []abci.EventAttribute{ + {Key: evmtypes.AttributeKeyEthereumTxHash, Value: txHash.Hex()}, + {Key: evmtypes.AttributeKeyTxIndex, Value: "0"}, + }}, + }, + }}, + }, nil) }, msgEthereumTx, &types.Block{Header: types.Header{Height: 1}, Data: types.Data{Txs: []types.Tx{txBz}}}, @@ -586,7 +616,7 @@ func (suite *BackendTestSuite) TestGetTransactionReceipt() { err := suite.backend.indexer.IndexBlock(tc.block, tc.blockResult) suite.Require().NoError(err) - txReceipt, err := suite.backend.GetTransactionReceipt(tc.tx.Hash()) + txReceipt, err := suite.backend.GetTransactionReceipt(tc.tx.Hash(), nil) if tc.expPass { suite.Require().NoError(err) suite.Require().Equal(txReceipt, tc.expTxReceipt) @@ -597,6 +627,445 @@ func (suite *BackendTestSuite) TestGetTransactionReceipt() { } } +// TestGetTransactionReceipt_BlockScopedWhenIndexerOverwritten verifies that when +// the KV indexer has been overwritten to point a tx hash at a later block, +// block-scoped receipt queries still rebuild the receipt from the requested +// block data. +func (suite *BackendTestSuite) TestGetTransactionReceipt_BlockScopedWhenIndexerOverwritten() { + txBz, txHash, block1, txResult := suite.indexSameTxInTwoBlocks() + + indexed, err := suite.backend.indexer.GetByTxHash(txHash) + suite.Require().NoError(err) + suite.Require().Equal(int64(2), indexed.Height) + + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + resBlock1, err := RegisterBlock(client, 1, txBz) + suite.Require().NoError(err) + blockRes1 := &tmrpctypes.ResultBlockResults{ + Height: block1.Height, + TxsResults: txResult, + } + client.On("BlockResults", rpctypes.ContextWithHeight(1), mock.AnythingOfType("*int64")). + Return(blockRes1, nil) + + receipt, err := suite.backend.GetTransactionReceipt(txHash, resBlock1) + suite.Require().NoError(err) + suite.Require().NotNil(receipt) + suite.Require().Equal(hexutil.Uint64(1), receipt["blockNumber"]) + + blockNum := rpctypes.BlockNumber(1) + receipts, err := suite.backend.GetBlockReceipts(rpctypes.BlockNumberOrHash{BlockNumber: &blockNum}) + suite.Require().NoError(err) + suite.Require().Len(receipts, 1) + suite.Require().Equal(hexutil.Uint64(1), receipts[0]["blockNumber"]) +} + +// TestGetTransactionReceipt_BlockScopedWhenBlockResultsFetchFails verifies that +// when rebuilding receipt data from a block-scoped query and fetching block +// results fails, the call returns nil without error. +func (suite *BackendTestSuite) TestGetTransactionReceipt_BlockScopedWhenBlockResultsFetchFails() { + _, txHash, block1, _ := suite.indexSameTxInTwoBlocks() + + client := suite.backend.clientCtx.Client.(*mocks.Client) + resBlock1 := &tmrpctypes.ResultBlock{Block: block1} + RegisterBlockResultsError(client, 1) + + receipt, err := suite.backend.GetTransactionReceipt(txHash, resBlock1) + suite.Require().NoError(err) + suite.Require().Nil(receipt) +} + +// indexSameTxInTwoBlocks builds one eth tx, indexes it in block 1 then block 2 +// so that the KV indexer's hash→height mapping is overwritten to point at +// block 2. Returns the encoded tx bytes, its hash, block 1, and the shared +// tx-result slice used for both blocks. +func (suite *BackendTestSuite) indexSameTxInTwoBlocks() (types.Tx, common.Hash, *types.Block, []*abci.ExecTxResult) { + msgEthereumTx, _ := suite.buildEthereumTx() + txBz := suite.signAndEncodeEthTx(msgEthereumTx) + txHash := msgEthereumTx.Hash() + + txResult := []*abci.ExecTxResult{ + { + Code: 0, + Events: []abci.Event{ + {Type: evmtypes.EventTypeEthereumTx, Attributes: []abci.EventAttribute{ + {Key: "ethereumTxHash", Value: txHash.Hex()}, + {Key: "txIndex", Value: "0"}, + {Key: "amount", Value: "1000"}, + {Key: "txGasUsed", Value: "21000"}, + {Key: "txHash", Value: ""}, + {Key: "recipient", Value: "0x775b87ef5D82ca211811C1a02CE0fE0CA3a455d7"}, + }}, + }, + }, + } + + db := dbm.NewMemDB() + suite.backend.indexer = indexer.NewKVIndexer(db, tmlog.NewNopLogger(), suite.backend.clientCtx) + + block1 := &types.Block{Header: types.Header{Height: 1, ChainID: ChainID}, Data: types.Data{Txs: []types.Tx{txBz}}} + block2 := &types.Block{Header: types.Header{Height: 2, ChainID: ChainID}, Data: types.Data{Txs: []types.Tx{txBz}}} + suite.Require().NoError(suite.backend.indexer.IndexBlock(block1, txResult)) + suite.Require().NoError(suite.backend.indexer.IndexBlock(block2, txResult)) + + return txBz, txHash, block1, txResult +} + +func (suite *BackendTestSuite) TestBuildReceiptFromBlock_BlockGasExceeded() { + msgEthereumTx, txBz := suite.buildEthereumTxWithNonceAndGas(0, 45000) + resBlock := &tmrpctypes.ResultBlock{ + Block: types.MakeBlock(1, []types.Tx{txBz}, nil, nil), + } + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 11, + Log: rpctypes.ExceedBlockGasLimitError, + }, + }, + } + + res, ethMsg, err := suite.findReceiptEntry(resBlock, blockRes, msgEthereumTx.Hash()) + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().NotNil(ethMsg) + suite.Require().Equal(msgEthereumTx.Hash(), ethMsg.Hash()) + suite.Require().Equal(int64(1), res.Height) + suite.Require().Equal(uint32(0), res.TxIndex) + suite.Require().Equal(uint32(0), res.MsgIndex) + suite.Require().Equal(int32(0), res.EthTxIndex) + suite.Require().True(res.Failed) + suite.Require().Equal(msgEthereumTx.GetGas(), res.GasUsed) + suite.Require().Equal(msgEthereumTx.GetGas(), res.CumulativeGasUsed) +} + +func (suite *BackendTestSuite) TestBuildReceiptFromBlock_SuccessfulTx() { + msgEthereumTx, txBz := suite.buildEthereumTxWithNonceAndGas(0, 100000) + resBlock := &tmrpctypes.ResultBlock{ + Block: types.MakeBlock(1, []types.Tx{txBz}, nil, nil), + } + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 0, + GasUsed: 21000, + Events: []abci.Event{ + { + Type: evmtypes.EventTypeEthereumTx, + Attributes: []abci.EventAttribute{ + {Key: evmtypes.AttributeKeyEthereumTxHash, Value: msgEthereumTx.Hash().Hex()}, + {Key: evmtypes.AttributeKeyTxIndex, Value: "0"}, + }, + }, + }, + }, + }, + } + + res, ethMsg, err := suite.findReceiptEntry(resBlock, blockRes, msgEthereumTx.Hash()) + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().NotNil(ethMsg) + suite.Require().Equal(msgEthereumTx.Hash(), ethMsg.Hash()) + suite.Require().Equal(uint64(21000), res.GasUsed) + suite.Require().Equal(uint64(21000), res.CumulativeGasUsed) + suite.Require().False(res.Failed) +} + +func (suite *BackendTestSuite) TestBuildReceiptFromBlock_HashMiss() { + // Build a real tx with valid events so an entry IS created, then query a different hash. + // Without this, ParseTxResult would return empty results (no events) and the loop + // would continue before hash-matching — testing missing events, not an actual hash miss. + msgEthereumTx, txBz := suite.buildEthereumTxWithNonceAndGas(0, 100000) + resBlock := &tmrpctypes.ResultBlock{ + Block: types.MakeBlock(1, []types.Tx{txBz}, nil, nil), + } + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 0, + GasUsed: 21000, + Events: []abci.Event{ + { + Type: evmtypes.EventTypeEthereumTx, + Attributes: []abci.EventAttribute{ + {Key: evmtypes.AttributeKeyEthereumTxHash, Value: msgEthereumTx.Hash().Hex()}, + {Key: evmtypes.AttributeKeyTxIndex, Value: "0"}, + }, + }, + }, + }, + }, + } + + res, ethMsg, err := suite.findReceiptEntry(resBlock, blockRes, common.HexToHash("0x1234")) + suite.Require().NoError(err) + suite.Require().Nil(res) + suite.Require().Nil(ethMsg) +} + +func (suite *BackendTestSuite) TestBuildReceiptFromBlock_MixedBlock() { + msg1, txBz1 := suite.buildEthereumTxWithNonceAndGas(0, 100000) + msg2, txBz2 := suite.buildEthereumTxWithNonceAndGas(1, 35000) + + resBlock := &tmrpctypes.ResultBlock{ + Block: types.MakeBlock(1, []types.Tx{txBz1, {0x01}, txBz2}, nil, nil), + } + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 0, + GasUsed: 21000, + Events: []abci.Event{ + { + Type: evmtypes.EventTypeEthereumTx, + Attributes: []abci.EventAttribute{ + {Key: evmtypes.AttributeKeyEthereumTxHash, Value: msg1.Hash().Hex()}, + {Key: evmtypes.AttributeKeyTxIndex, Value: "0"}, + }, + }, + }, + }, + { + Code: 0, + }, + { + Code: 11, + Log: rpctypes.ExceedBlockGasLimitError, + }, + }, + } + + res, ethMsg, err := suite.findReceiptEntry(resBlock, blockRes, msg2.Hash()) + suite.Require().NoError(err) + suite.Require().NotNil(res) + suite.Require().Equal(msg2.Hash(), ethMsg.Hash()) + suite.Require().Equal(uint32(2), res.TxIndex) + suite.Require().Equal(int32(1), res.EthTxIndex) + suite.Require().True(res.Failed) + suite.Require().Equal(msg2.GetGas(), res.GasUsed) +} + +func (suite *BackendTestSuite) TestGetBlockReceipts_BlockGasExceededWithoutIndexer() { + msg1, txBz1 := suite.buildEthereumTxWithNonceAndGas(0, 100000) + msg2, txBz2 := suite.buildEthereumTxWithNonceAndGas(1, 35000) + + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + _, err := RegisterBlockMultipleTxs(client, 1, []types.Tx{txBz1, txBz2}) + suite.Require().NoError(err) + + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 0, + GasUsed: 21000, + Events: []abci.Event{ + { + Type: evmtypes.EventTypeEthereumTx, + Attributes: []abci.EventAttribute{ + {Key: evmtypes.AttributeKeyEthereumTxHash, Value: msg1.Hash().Hex()}, + {Key: evmtypes.AttributeKeyTxIndex, Value: "0"}, + }, + }, + }, + }, + { + Code: 11, + Log: rpctypes.ExceedBlockGasLimitError, + }, + }, + } + client.On("BlockResults", rpctypes.ContextWithHeight(1), mock.AnythingOfType("*int64")). + Return(blockRes, nil) + suite.backend.indexer = nil + + blockNum := rpctypes.BlockNumber(1) + receipts, err := suite.backend.GetBlockReceipts(rpctypes.BlockNumberOrHash{BlockNumber: &blockNum}) + suite.Require().NoError(err) + suite.Require().Len(receipts, 2) + + var exceededReceipt map[string]interface{} + for _, receipt := range receipts { + if receipt["transactionHash"] == msg2.Hash() { + exceededReceipt = receipt + break + } + } + + suite.Require().NotNil(exceededReceipt) + suite.Require().Equal(hexutil.Uint(ethtypes.ReceiptStatusFailed), exceededReceipt["status"]) + suite.Require().Equal(hexutil.Uint64(msg2.GetGas()), exceededReceipt["gasUsed"]) + suite.Require().Equal(hexutil.Uint64(21000+msg2.GetGas()), exceededReceipt["cumulativeGasUsed"]) +} + +func (suite *BackendTestSuite) TestGetBlockReceipts_IgnoresIndexerHashMismatch() { + msgEthereumTx, txBz := suite.buildEthereumTxWithNonceAndGas(0, 45000) + + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + _, err := RegisterBlockMultipleTxs(client, 1, []types.Tx{txBz}) + suite.Require().NoError(err) + + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 11, + Log: rpctypes.ExceedBlockGasLimitError, + }, + }, + } + client.On("BlockResults", rpctypes.ContextWithHeight(1), mock.AnythingOfType("*int64")). + Return(blockRes, nil) + suite.backend.indexer = failingLookupIndexer{} + + blockNum := rpctypes.BlockNumber(1) + receipts, err := suite.backend.GetBlockReceipts(rpctypes.BlockNumberOrHash{BlockNumber: &blockNum}) + suite.Require().NoError(err) + suite.Require().Len(receipts, 1) + suite.Require().Equal(msgEthereumTx.Hash(), receipts[0]["transactionHash"]) +} + +func (suite *BackendTestSuite) TestGetBlockReceipts_ByHash() { + msgEthereumTx, txBz := suite.buildEthereumTxWithNonceAndGas(0, 45000) + hash := common.HexToHash("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef") + + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + RegisterBlockByHash(client, hash, txBz) + + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 11, + Log: rpctypes.ExceedBlockGasLimitError, + }, + }, + } + client.On("BlockResults", rpctypes.ContextWithHeight(1), mock.AnythingOfType("*int64")). + Return(blockRes, nil) + + receipts, err := suite.backend.GetBlockReceipts(rpctypes.BlockNumberOrHash{BlockHash: &hash}) + suite.Require().NoError(err) + suite.Require().Len(receipts, 1) + suite.Require().Equal(msgEthereumTx.Hash(), receipts[0]["transactionHash"]) +} + +func (suite *BackendTestSuite) TestGetBlockReceipts_EmptyBlockNumberOrHashDefaultsToLatest() { + msgEthereumTx, txBz := suite.buildEthereumTxWithNonceAndGas(0, 45000) + + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + _, err := RegisterBlockMultipleTxs(client, 1, []types.Tx{txBz}) + suite.Require().NoError(err) + + blockRes := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 11, + Log: rpctypes.ExceedBlockGasLimitError, + }, + }, + } + client.On("BlockResults", rpctypes.ContextWithHeight(1), mock.AnythingOfType("*int64")). + Return(blockRes, nil) + + receipts, err := suite.backend.GetBlockReceipts(rpctypes.BlockNumberOrHash{}) + suite.Require().NoError(err) + suite.Require().Len(receipts, 1) + suite.Require().Equal(msgEthereumTx.Hash(), receipts[0]["transactionHash"]) +} + +func (suite *BackendTestSuite) TestBuildReceiptDirect_SetCodeTxEffectiveGasPrice() { + msgSetCodeTx := suite.buildSetCodeTx() + + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + RegisterBaseFee(queryClient, sdkmath.NewInt(1)) + + block := &tmrpctypes.ResultBlock{ + Block: types.MakeBlock(1, nil, nil, nil), + } + blockResults := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + { + Code: 0, + GasUsed: 21000, + }, + }, + } + txResult := ðermint.TxResult{ + Height: 1, + TxIndex: 0, + MsgIndex: 0, + EthTxIndex: 0, + GasUsed: 21000, + CumulativeGasUsed: 21000, + } + + receipt, err := suite.backend.buildReceiptDirect(block, blockResults, txResult, msgSetCodeTx) + suite.Require().NoError(err) + suite.Require().Equal(hexutil.Big(*big.NewInt(10001)), receipt["effectiveGasPrice"]) +} + +// TestBuildReceiptDirect_EIP1559_NilBaseFee verifies that effectiveGasPrice is +// omitted when BaseFee is unavailable, not returned as GasFeeCap. +func (suite *BackendTestSuite) TestBuildReceiptDirect_EIP1559_NilBaseFee() { + msgSetCodeTx := suite.buildSetCodeTx() + + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + var header metadata.MD + RegisterParams(queryClient, &header, 1) + RegisterParamsWithoutHeader(queryClient, 1) + RegisterBaseFeeError(queryClient) // pruned node / disabled fee market + + block := &tmrpctypes.ResultBlock{ + Block: types.MakeBlock(1, nil, nil, nil), + } + blockResults := &tmrpctypes.ResultBlockResults{ + Height: 1, + TxsResults: []*abci.ExecTxResult{ + {Code: 0, GasUsed: 21000}, + }, + } + txResult := ðermint.TxResult{ + Height: 1, TxIndex: 0, MsgIndex: 0, EthTxIndex: 0, + GasUsed: 21000, CumulativeGasUsed: 21000, + } + + receipt, err := suite.backend.buildReceiptDirect(block, blockResults, txResult, msgSetCodeTx) + suite.Require().NoError(err) + _, present := receipt["effectiveGasPrice"] + suite.Require().False(present, "effectiveGasPrice must be omitted when baseFee is unavailable for EIP-1559 tx") +} + func (suite *BackendTestSuite) TestGetGasUsed() { origin := suite.backend.cfg.JSONRPC.FixRevertGasRefundHeight testCases := []struct { @@ -648,3 +1117,284 @@ func (suite *BackendTestSuite) TestGetGasUsed() { }) } } + +type failingLookupIndexer struct{} + +func (failingLookupIndexer) LastIndexedBlock() (int64, error) { + return -1, nil +} + +func (failingLookupIndexer) IndexBlock(*types.Block, []*abci.ExecTxResult) error { + return nil +} + +func (failingLookupIndexer) GetByTxHash(common.Hash) (*ethermint.TxResult, error) { + panic("unexpected indexer GetByTxHash call") +} + +func (failingLookupIndexer) GetByBlockAndIndex(int64, int32) (*ethermint.TxResult, error) { + panic("unexpected indexer GetByBlockAndIndex call") +} + +func (suite *BackendTestSuite) TestGetTransactionByHash_SetCodeTxType() { + msgSetCodeTx := suite.buildSetCodeTx() + txBz := suite.signAndEncodeEthTx(msgSetCodeTx) + txHash := msgSetCodeTx.Hash() + block := &types.Block{Header: types.Header{Height: 1, ChainID: "test"}, Data: types.Data{Txs: []types.Tx{txBz}}} + responseDeliver := []*abci.ExecTxResult{ + { + Code: 0, + Events: []abci.Event{ + {Type: evmtypes.EventTypeEthereumTx, Attributes: []abci.EventAttribute{ + {Key: "ethereumTxHash", Value: txHash.Hex()}, + {Key: "txIndex", Value: "0"}, + {Key: "amount", Value: "0"}, + {Key: "txGasUsed", Value: "100000"}, + {Key: "txHash", Value: ""}, + {Key: "recipient", Value: "0x742d35cc6561c9d8f6b1b8e6e2c8b9f8f4a1e2d3"}, + }}, + }, + }, + } + + expectedRPCTx, _ := rpctypes.NewRPCTransaction(msgSetCodeTx, common.Hash{}, 0, 0, 0, big.NewInt(1), suite.backend.chainID) + + testCases := []struct { + name string + registerMock func() + expPass bool + }{ + { + "pass - SetCodeTx transaction found and returned", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterBlock(client, 1, txBz) + RegisterBlockResults(client, 1) + RegisterBaseFee(queryClient, sdkmath.NewInt(1)) + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + tc.registerMock() + + db := dbm.NewMemDB() + suite.backend.indexer = indexer.NewKVIndexer(db, tmlog.NewNopLogger(), suite.backend.clientCtx) + err := suite.backend.indexer.IndexBlock(block, responseDeliver) + suite.Require().NoError(err) + + rpcTx, err := suite.backend.GetTransactionByHash(txHash) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(rpcTx) + + suite.Require().Equal(hexutil.Uint64(ethtypes.SetCodeTxType), rpcTx.Type) + + suite.Require().NotNil(rpcTx.GasFeeCap, "GasFeeCap should be set") + suite.Require().NotNil(rpcTx.GasTipCap, "GasTipCap should be set") + suite.Require().NotNil(rpcTx.ChainID, "ChainID should be set") + suite.Require().NotNil(rpcTx.Accesses, "AccessList should be set") + suite.Require().NotNil(rpcTx.AuthorizationList, "AuthorizationList should be set") + + suite.Require().Equal(expectedRPCTx.Type, rpcTx.Type) + suite.Require().Equal(expectedRPCTx.From, rpcTx.From) + suite.Require().Equal(expectedRPCTx.Hash, rpcTx.Hash) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *BackendTestSuite) buildSetCodeTx() *evmtypes.MsgEthereumTx { + auth := ethtypes.SetCodeAuthorization{ + ChainID: *uint256.MustFromBig(suite.backend.chainID), + Address: common.HexToAddress("0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9"), + Nonce: 1, + V: uint8(27), + R: *uint256.NewInt(1), + S: *uint256.NewInt(1), + } + + setCodeTx := ðtypes.SetCodeTx{ + ChainID: uint256.MustFromBig(suite.backend.chainID), + Nonce: 0, + GasTipCap: uint256.NewInt(10000), + GasFeeCap: uint256.NewInt(1000000000000), + Gas: 100000, + To: common.HexToAddress("0x742d35cc6561c9d8f6b1b8e6e2c8b9f8f4a1e2d3"), + Value: uint256.NewInt(0), + Data: []byte{}, + AccessList: ethtypes.AccessList{}, + AuthList: []ethtypes.SetCodeAuthorization{auth}, + V: uint256.NewInt(1), + R: uint256.NewInt(1), + S: uint256.NewInt(1), + } + + ethTx := ethtypes.NewTx(setCodeTx) + msgEthereumTx := &evmtypes.MsgEthereumTx{} + err := msgEthereumTx.FromSignedEthereumTx(ethTx, ethtypes.LatestSignerForChainID(suite.backend.chainID)) + suite.Require().NoError(err) + + msgEthereumTx.From = suite.signerAddress + + return msgEthereumTx +} + +func (suite *BackendTestSuite) buildEthereumTxWithNonceAndGas(nonce uint64, gasLimit uint64) (*evmtypes.MsgEthereumTx, []byte) { + msgEthereumTx := evmtypes.NewTx( + suite.backend.chainID, + nonce, + &common.Address{}, + big.NewInt(0), + gasLimit, + big.NewInt(1), + nil, + nil, + nil, + nil, + ) + msgEthereumTx.From = suite.signerAddress + err := msgEthereumTx.Sign(ethtypes.LatestSignerForChainID(suite.backend.chainID), suite.signer) + suite.Require().NoError(err) + + tx, err := msgEthereumTx.BuildTx(suite.backend.clientCtx.TxConfig.NewTxBuilder(), "aphoton") + suite.Require().NoError(err) + + bz, err := suite.backend.clientCtx.TxConfig.TxEncoder()(tx) + suite.Require().NoError(err) + + sdkTx, err := suite.backend.clientCtx.TxConfig.TxDecoder()(bz) + suite.Require().NoError(err) + + return sdkTx.GetMsgs()[0].(*evmtypes.MsgEthereumTx), bz +} + +// findReceiptEntry is a test helper that builds all receipt entries from block +// data and returns the one matching the given hash, or nil if not found. +func (suite *BackendTestSuite) findReceiptEntry( + resBlock *tmrpctypes.ResultBlock, + blockRes *tmrpctypes.ResultBlockResults, + hash common.Hash, +) (*ethermint.TxResult, *evmtypes.MsgEthereumTx, error) { + entries, err := suite.backend.collectReceiptEntriesFromBlock(resBlock, blockRes, nil) + if err != nil { + return nil, nil, err + } + for _, entry := range entries { + if entry.hash == hash { + return entry.txResult, entry.ethMsg, nil + } + } + return nil, nil, nil +} + +func (suite *BackendTestSuite) TestCreateAccessList() { + _, bz := suite.buildEthereumTx() + toAddr := tests.GenerateAddress() + chainID := (*hexutil.Big)(suite.backend.chainID) + callArgs := evmtypes.TransactionArgs{ + To: &toAddr, + ChainID: chainID, + } + argsBz, err := json.Marshal(callArgs) + suite.Require().NoError(err) + + baseReq := &evmtypes.EthCallRequest{ + Args: argsBz, + GasCap: suite.backend.RPCGasCap(), + ChainId: suite.backend.chainID.Int64(), + } + + makeData := func(gasUsed uint64, vmErr string) []byte { + al := evmtypes.AccessListResult{AccessList: ethtypes.AccessList{}, GasUsed: hexutil.Uint64(gasUsed), Error: vmErr} + bz, _ := json.Marshal(al) + return bz + } + + testCases := []struct { + name string + registerMock func() + expResult *rpctypes.AccessListResult + expPass bool + }{ + { + "fail - block number resolution fails", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + height := int64(1) + RegisterHeaderError(client, &height) + }, + nil, + false, + }, + { + "fail - grpc returns error", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + height := int64(1) + RegisterHeader(client, &height, bz) + RegisterCreateAccessListError(queryClient, baseReq) + }, + nil, + false, + }, + { + "pass - result fields correctly mapped", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + height := int64(1) + RegisterHeader(client, &height, bz) + RegisterCreateAccessList(queryClient, baseReq, makeData(21000, "")) + }, + &rpctypes.AccessListResult{ + AccessList: ethtypes.AccessList{}, + GasUsed: hexutil.Uint64(21000), + }, + true, + }, + { + "pass - vm error propagated to Error field", + func() { + client := suite.backend.clientCtx.Client.(*mocks.Client) + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + height := int64(1) + RegisterHeader(client, &height, bz) + RegisterCreateAccessList(queryClient, baseReq, makeData(5000, "execution reverted")) + }, + &rpctypes.AccessListResult{ + AccessList: ethtypes.AccessList{}, + GasUsed: hexutil.Uint64(5000), + Error: "execution reverted", + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("case %s", tc.name), func() { + suite.SetupTest() + tc.registerMock() + + blockNrOrHash := rpctypes.BlockNumberOrHash{BlockNumber: func() *rpctypes.BlockNumber { + n := rpctypes.BlockNumber(1) + return &n + }()} + result, err := suite.backend.CreateAccessList(callArgs, blockNrOrHash, nil) + if tc.expPass { + suite.Require().NoError(err) + suite.Require().Equal(tc.expResult, result) + } else { + suite.Require().Error(err) + } + }) + } +} diff --git a/rpc/backend/utils.go b/rpc/backend/utils.go index 46760319f0..5e370682db 100644 --- a/rpc/backend/utils.go +++ b/rpc/backend/utils.go @@ -21,7 +21,7 @@ import ( "sort" "strings" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/pkg/errors" @@ -30,15 +30,16 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" abci "github.com/cometbft/cometbft/abci/types" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" + cmttypes "github.com/cometbft/cometbft/types" "github.com/cometbft/cometbft/proto/tendermint/crypto" "github.com/evmos/ethermint/rpc/types" + ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" ) @@ -145,8 +146,7 @@ func CalcBaseFee(config *params.ChainConfig, parent *ethtypes.Header, p feemarke num.Mul(num, parent.BaseFee) num.Div(num, denom.SetUint64(parentGasTarget)) num.Div(num, denom.SetUint64(uint64(p.BaseFeeChangeDenominator))) - baseFeeDelta := math.BigMax(num, common.Big1) - + baseFeeDelta := ethermint.BigMax(num, common.Big1) return num.Add(parent.BaseFee, baseFeeDelta), nil } @@ -158,7 +158,7 @@ func CalcBaseFee(config *params.ChainConfig, parent *ethtypes.Header, p feemarke num.Div(num, denom.SetUint64(uint64(p.BaseFeeChangeDenominator))) baseFee := num.Sub(parent.BaseFee, num) minGasPrice := p.MinGasPrice.TruncateInt().BigInt() - return math.BigMax(baseFee, minGasPrice), nil + return ethermint.BigMax(baseFee, minGasPrice), nil } // output: targetOneFeeHistory @@ -183,7 +183,7 @@ func (b *Backend) processBlock( return fmt.Errorf("invalid gas limit type: %T", (*ethBlock)["gasLimit"]) } - gasUsedBig, ok := (*ethBlock)["gasUsed"].(*hexutil.Big) + gasUsed, ok := (*ethBlock)["gasUsed"].(hexutil.Uint64) if !ok { return fmt.Errorf("invalid gas used type: %T", (*ethBlock)["gasUsed"]) } @@ -198,7 +198,7 @@ func (b *Backend) processBlock( header.BaseFee = baseFee.ToInt() } header.GasLimit = uint64(gasLimitUint64) - header.GasUsed = gasUsedBig.ToInt().Uint64() + header.GasUsed = uint64(gasUsed) ctx := types.ContextWithHeight(blockHeight) params, err := b.queryClient.FeeMarket.Params(ctx, &feemarkettypes.QueryParamsRequest{}) if err != nil { @@ -212,7 +212,7 @@ func (b *Backend) processBlock( } else { targetOneFeeHistory.NextBaseFee = new(big.Int) } - gasusedfloat, _ := new(big.Float).SetInt(gasUsedBig.ToInt()).Float64() + gasusedfloat := float64(gasUsed) if gasLimitUint64 <= 0 { return fmt.Errorf("gasLimit of block height %d should be bigger than 0 , current gaslimit %d", blockHeight, gasLimitUint64) @@ -244,15 +244,18 @@ func (b *Backend) processBlock( b.logger.Debug("failed to decode transaction in block", "height", blockHeight, "error", err.Error()) continue } - txGasUsed := uint64(eachTendermintTxResult.GasUsed) + txGasUsed, err := ethermint.SafeUint64(eachTendermintTxResult.GasUsed) + if err != nil { + return err + } for _, msg := range tx.GetMsgs() { ethMsg, ok := msg.(*evmtypes.MsgEthereumTx) if !ok { continue } tx := ethMsg.AsTransaction() - reward := tx.EffectiveGasTipValue(blockBaseFee) - if reward == nil { + reward, err := tx.EffectiveGasTip(blockBaseFee) + if err != nil || reward == nil { reward = big.NewInt(0) } sorter = append(sorter, txGasAndReward{gasUsed: txGasUsed, reward: reward}) @@ -290,9 +293,13 @@ func ShouldIgnoreGasUsed(res *abci.ExecTxResult) bool { // GetLogsFromBlockResults returns the list of event logs from the tendermint block result response func GetLogsFromBlockResults(blockRes *tmrpctypes.ResultBlockResults) ([][]*ethtypes.Log, error) { + height, err := ethermint.SafeUint64(blockRes.Height) + if err != nil { + return nil, err + } blockLogs := [][]*ethtypes.Log{} for _, txResult := range blockRes.TxsResults { - logs, err := evmtypes.DecodeTxLogsFromEvents(txResult.Data, txResult.Events, uint64(blockRes.Height)) + logs, err := evmtypes.DecodeTxLogsFromEvents(txResult.Data, txResult.Events, height) if err != nil { return nil, err } @@ -317,3 +324,25 @@ func GetHexProofs(proof *crypto.ProofOps) []string { } return proofs } + +func (b *Backend) getValidatorAccount(header *cmttypes.Header) (sdk.AccAddress, error) { + res, err := b.queryClient.ValidatorAccount( + types.ContextWithHeight(header.Height), + &evmtypes.QueryValidatorAccountRequest{ + ConsAddress: sdk.ConsAddress(header.ProposerAddress).String(), + }, + ) + if err != nil { + return nil, fmt.Errorf("failed to get validator account %w", err) + } + return sdk.AccAddressFromBech32(res.AccountAddress) +} + +// safeBlockTime converts a Unix int64 timestamp to uint64, returning 0 for +// zero or negative values to prevent uint64 wrap-around. +func safeBlockTime(unixSec int64) uint64 { + if unixSec <= 0 { + return 0 + } + return uint64(unixSec) //#nosec G115 -- guarded above +} diff --git a/rpc/namespaces/ethereum/debug/api.go b/rpc/namespaces/ethereum/debug/api.go index bfdae08af9..12b1f8b710 100644 --- a/rpc/namespaces/ethereum/debug/api.go +++ b/rpc/namespaces/ethereum/debug/api.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "io" - "os" "runtime" "runtime/debug" "runtime/pprof" @@ -29,16 +28,15 @@ import ( "github.com/davecgh/go-spew/spew" + ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" - stderrors "github.com/pkg/errors" "github.com/cosmos/cosmos-sdk/server" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/rlp" "github.com/evmos/ethermint/rpc/backend" rpctypes "github.com/evmos/ethermint/rpc/types" @@ -128,26 +126,41 @@ func (a *API) TraceCall( return a.backend.TraceCall(args, blockNrOrHash, config) } +func parseDuration(nsec uint) (time.Duration, error) { + if nsec > uint(time.Duration(1<<63-1)/time.Second) { + return time.Duration(0), fmt.Errorf("value %d exceeds maximum duration for time.Duration", nsec) + } + return time.Duration(nsec) * time.Second, nil +} + // BlockProfile turns on goroutine profiling for nsec seconds and writes profile data to // file. It uses a profile rate of 1 for most accurate information. If a different rate is // desired, set the rate and write the profile manually. func (a *API) BlockProfile(file string, nsec uint) error { + d, err := parseDuration(nsec) + if err != nil { + return err + } a.logger.Debug("debug_blockProfile", "file", file, "nsec", nsec) runtime.SetBlockProfileRate(1) defer runtime.SetBlockProfileRate(0) - time.Sleep(time.Duration(nsec) * time.Second) - return writeProfile("block", file, a.logger) + time.Sleep(d) + return writeProfile("block", file, a.ctx, a.logger) } // CpuProfile turns on CPU profiling for nsec seconds and writes // profile data to file. -func (a *API) CpuProfile(file string, nsec uint) error { //nolint: golint, stylecheck, revive +func (a *API) CpuProfile(file string, nsec uint) error { //nolint: revive + d, err := parseDuration(nsec) + if err != nil { + return err + } a.logger.Debug("debug_cpuProfile", "file", file, "nsec", nsec) if err := a.StartCPUProfile(file); err != nil { return err } - time.Sleep(time.Duration(nsec) * time.Second) + time.Sleep(d) return a.StopCPUProfile() } @@ -162,11 +175,15 @@ func (a *API) GcStats() *debug.GCStats { // GoTrace turns on tracing for nsec seconds and writes // trace data to file. func (a *API) GoTrace(file string, nsec uint) error { + d, err := parseDuration(nsec) + if err != nil { + return err + } a.logger.Debug("debug_goTrace", "file", file, "nsec", nsec) if err := a.StartGoTrace(file); err != nil { return err } - time.Sleep(time.Duration(nsec) * time.Second) + time.Sleep(d) return a.StopGoTrace() } @@ -210,12 +227,12 @@ func (a *API) StartCPUProfile(file string) error { a.logger.Debug("CPU profiling already in progress") return errors.New("CPU profiling already in progress") default: - fp, err := ExpandHome(file) + fp, err := validatePath(a.ctx, file) if err != nil { a.logger.Debug("failed to get filepath for the CPU profile file", "error", err.Error()) return err } - f, err := os.Create(fp) + f, err := restrictedCreate(a.ctx, fp) if err != nil { a.logger.Debug("failed to create CPU profile file", "error", err.Error()) return err @@ -265,7 +282,7 @@ func (a *API) StopCPUProfile() error { // WriteBlockProfile writes a goroutine blocking profile to the given file. func (a *API) WriteBlockProfile(file string) error { a.logger.Debug("debug_writeBlockProfile", "file", file) - return writeProfile("block", file, a.logger) + return writeProfile("block", file, a.ctx, a.logger) } // WriteMemProfile writes an allocation profile to the given file. @@ -273,18 +290,22 @@ func (a *API) WriteBlockProfile(file string) error { // it must be set on the command line. func (a *API) WriteMemProfile(file string) error { a.logger.Debug("debug_writeMemProfile", "file", file) - return writeProfile("heap", file, a.logger) + return writeProfile("heap", file, a.ctx, a.logger) } // MutexProfile turns on mutex profiling for nsec seconds and writes profile data to file. // It uses a profile rate of 1 for most accurate information. If a different rate is // desired, set the rate and write the profile manually. func (a *API) MutexProfile(file string, nsec uint) error { + d, err := parseDuration(nsec) + if err != nil { + return err + } a.logger.Debug("debug_mutexProfile", "file", file, "nsec", nsec) runtime.SetMutexProfileFraction(1) - time.Sleep(time.Duration(nsec) * time.Second) + time.Sleep(d) defer runtime.SetMutexProfileFraction(0) - return writeProfile("mutex", file, a.logger) + return writeProfile("mutex", file, a.ctx, a.logger) } // SetMutexProfileFraction sets the rate of mutex profiling. @@ -296,7 +317,7 @@ func (a *API) SetMutexProfileFraction(rate int) { // WriteMutexProfile writes a goroutine blocking profile to the given file. func (a *API) WriteMutexProfile(file string) error { a.logger.Debug("debug_writeMutexProfile", "file", file) - return writeProfile("mutex", file, a.logger) + return writeProfile("mutex", file, a.ctx, a.logger) } // FreeOSMemory forces a garbage collection. @@ -314,7 +335,11 @@ func (a *API) SetGCPercent(v int) int { // GetHeaderRlp retrieves the RLP encoded for of a single header. func (a *API) GetHeaderRlp(number uint64) (hexutil.Bytes, error) { - header, err := a.backend.HeaderByNumber(rpctypes.BlockNumber(number)) + value, err := ethermint.SafeInt64(number) + if err != nil { + return nil, err + } + header, err := a.backend.HeaderByNumber(rpctypes.BlockNumber(value)) if err != nil { return nil, err } @@ -324,7 +349,11 @@ func (a *API) GetHeaderRlp(number uint64) (hexutil.Bytes, error) { // GetBlockRlp retrieves the RLP encoded for of a single block. func (a *API) GetBlockRlp(number uint64) (hexutil.Bytes, error) { - block, err := a.backend.EthBlockByNumber(rpctypes.BlockNumber(number)) + value, err := ethermint.SafeInt64(number) + if err != nil { + return nil, err + } + block, err := a.backend.EthBlockByNumber(rpctypes.BlockNumber(value)) if err != nil { return nil, err } @@ -334,22 +363,15 @@ func (a *API) GetBlockRlp(number uint64) (hexutil.Bytes, error) { // PrintBlock retrieves a block and returns its pretty printed form. func (a *API) PrintBlock(number uint64) (string, error) { - block, err := a.backend.EthBlockByNumber(rpctypes.BlockNumber(number)) + value, err := ethermint.SafeInt64(number) if err != nil { return "", err } - - return spew.Sdump(block), nil -} - -// SeedHash retrieves the seed hash of a block. -func (a *API) SeedHash(number uint64) (string, error) { - _, err := a.backend.HeaderByNumber(rpctypes.BlockNumber(number)) + block, err := a.backend.EthBlockByNumber(rpctypes.BlockNumber(value)) if err != nil { return "", err } - - return fmt.Sprintf("0x%x", ethash.SeedHash(number)), nil + return spew.Sdump(block), nil } // IntermediateRoots executes a block, and returns a list diff --git a/rpc/namespaces/ethereum/debug/trace.go b/rpc/namespaces/ethereum/debug/trace.go index 6abbd8306b..00e925c7af 100644 --- a/rpc/namespaces/ethereum/debug/trace.go +++ b/rpc/namespaces/ethereum/debug/trace.go @@ -14,14 +14,10 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -//go:build go1.5 -// +build go1.5 - package debug import ( "errors" - "os" "runtime/trace" stderrors "github.com/pkg/errors" @@ -37,12 +33,14 @@ func (a *API) StartGoTrace(file string) error { a.logger.Debug("trace already in progress") return errors.New("trace already in progress") } - fp, err := ExpandHome(file) + + fp, err := validatePath(a.ctx, file) if err != nil { - a.logger.Debug("failed to get filepath for the CPU profile file", "error", err.Error()) + a.logger.Debug("failed to validate trace file path", "error", err.Error()) return err } - f, err := os.Create(fp) + + f, err := restrictedCreate(a.ctx, fp) if err != nil { a.logger.Debug("failed to create go trace file", "error", err.Error()) return err @@ -53,7 +51,6 @@ func (a *API) StartGoTrace(file string) error { a.logger.Debug("failed to close trace file") return stderrors.Wrap(err, "failed to close trace file") } - return err } a.handler.traceFile = f diff --git a/rpc/namespaces/ethereum/debug/utils.go b/rpc/namespaces/ethereum/debug/utils.go index 41675b6176..7b6f327291 100644 --- a/rpc/namespaces/ethereum/debug/utils.go +++ b/rpc/namespaces/ethereum/debug/utils.go @@ -16,14 +16,16 @@ package debug import ( + "errors" "os" "os/user" "path/filepath" "runtime/pprof" "strings" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" "github.com/cosmos/cosmos-sdk/server" + srvflags "github.com/evmos/ethermint/server/flags" ) // isCPUProfileConfigurationActivated checks if cpuprofile was configured via flag @@ -51,15 +53,62 @@ func ExpandHome(p string) (string, error) { return filepath.Clean(p), nil } +// validatePath expands home and resolves to an absolute path. When +// restrict-user-input is enabled it also enforces that the resolved path is +// inside the node's data directory and is not a symlink. +func validatePath(ctx *server.Context, file string) (string, error) { + fp, err := ExpandHome(file) + if err != nil { + return "", err + } + fp, err = filepath.Abs(fp) + if err != nil { + return "", err + } + if ctx.Viper.GetBool(srvflags.JSONRPCRestrictUserInput) { + absDataDir, err := filepath.Abs(ctx.Config.RootDir) + if err != nil { + return "", err + } + realDataDir, err := filepath.EvalSymlinks(absDataDir) + if err != nil { + return "", err + } + // Resolve parent dir symlinks; the file itself may not exist yet. + realParent, err := filepath.EvalSymlinks(filepath.Dir(fp)) + if err != nil { + return "", err + } + fp = filepath.Join(realParent, filepath.Base(fp)) + if !strings.HasPrefix(fp, realDataDir+string(filepath.Separator)) { + return "", errors.New("file path must be in the data directory") + } + // Reject a pre-existing symlink at the final component. + if fi, err := os.Lstat(fp); err == nil && fi.Mode()&os.ModeSymlink != 0 { + return "", errors.New("file path must not be a symlink") + } + } + return fp, nil +} + +// restrictedCreate opens fp for writing. In restricted mode it uses O_EXCL to +// prevent overwriting existing files; otherwise it truncates like os.Create. +func restrictedCreate(ctx *server.Context, fp string) (*os.File, error) { + if ctx.Viper.GetBool(srvflags.JSONRPCRestrictUserInput) { + return os.OpenFile(fp, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o666) + } + return os.Create(fp) +} + // writeProfile writes the data to a file -func writeProfile(name, file string, log log.Logger) error { +func writeProfile(name, file string, ctx *server.Context, log log.Logger) error { p := pprof.Lookup(name) log.Info("Writing profile records", "count", p.Count(), "type", name, "dump", file) - fp, err := ExpandHome(file) + fp, err := validatePath(ctx, file) if err != nil { return err } - f, err := os.Create(fp) + f, err := restrictedCreate(ctx, fp) if err != nil { return err } diff --git a/rpc/namespaces/ethereum/debug/utils_test.go b/rpc/namespaces/ethereum/debug/utils_test.go new file mode 100644 index 0000000000..244347f0cc --- /dev/null +++ b/rpc/namespaces/ethereum/debug/utils_test.go @@ -0,0 +1,172 @@ +package debug + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "github.com/cosmos/cosmos-sdk/server" + "github.com/stretchr/testify/require" + + srvflags "github.com/evmos/ethermint/server/flags" +) + +func newTestContext(t *testing.T, restrictUserInput bool) (*server.Context, string) { + t.Helper() + ctx := server.NewDefaultContext() + dataDir := t.TempDir() + ctx.Config.RootDir = dataDir + ctx.Viper.Set(srvflags.JSONRPCRestrictUserInput, restrictUserInput) + return ctx, dataDir +} + +func TestRestrictedCreate(t *testing.T) { + tests := []struct { + name string + restricted bool + preCreate bool // whether the file already exists + wantErr bool + }{ + { + name: "restricted allows creating new file", + restricted: true, + preCreate: false, + }, + { + name: "restricted rejects overwriting existing file", + restricted: true, + preCreate: true, + wantErr: true, + }, + { + name: "unrestricted allows overwriting existing file", + restricted: false, + preCreate: true, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ctx, dataDir := newTestContext(t, tc.restricted) + fp := filepath.Join(dataDir, "profile.out") + if tc.preCreate { + f, err := os.Create(fp) + require.NoError(t, err) + f.Close() + } + f, err := restrictedCreate(ctx, fp) + if tc.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + f.Close() + } + }) + } +} + +func TestValidatePath(t *testing.T) { + tests := []struct { + name string + restricted bool + pathFn func(dataDir string) string + wantErr bool + checkFn func(t *testing.T, got string) + }{ + { + name: "unrestricted allows path outside data dir", + restricted: false, + pathFn: func(_ string) string { return "/tmp/profile.out" }, + }, + { + name: "unrestricted allows path inside data dir", + restricted: false, + pathFn: func(dataDir string) string { return filepath.Join(dataDir, "profile.out") }, + }, + { + name: "restricted allows path inside data dir", + restricted: true, + pathFn: func(dataDir string) string { return filepath.Join(dataDir, "profile.out") }, + }, + { + name: "restricted allows nested subdir inside data dir", + restricted: true, + pathFn: func(dataDir string) string { + sub := filepath.Join(dataDir, "pprof") + _ = os.MkdirAll(sub, 0o700) + return filepath.Join(sub, "profile.out") + }, + }, + { + name: "restricted rejects path outside data dir", + restricted: true, + pathFn: func(_ string) string { return "/tmp/profile.out" }, + wantErr: true, + }, + { + name: "restricted rejects path using data dir as string prefix (traversal bypass)", + restricted: true, + pathFn: func(dataDir string) string { return dataDir + "-evil/profile.out" }, + wantErr: true, + }, + { + name: "restricted rejects symlink at the final path component pointing outside", + restricted: true, + pathFn: func(dataDir string) string { + outside := t.TempDir() + target := filepath.Join(outside, "profile.out") + link := filepath.Join(dataDir, "profile.out") + _ = os.Symlink(target, link) + return link + }, + wantErr: true, + }, + { + name: "restricted rejects symlink inside data dir pointing outside", + restricted: true, + pathFn: func(dataDir string) string { + outside := filepath.Dir(dataDir) + link := filepath.Join(dataDir, "link") + _ = os.Symlink(outside, link) + return filepath.Join(link, "profile.out") + }, + wantErr: true, + }, + { + name: "restricted allows symlink inside data dir pointing to subdir within data dir", + restricted: true, + pathFn: func(dataDir string) string { + inner := filepath.Join(dataDir, "inner") + _ = os.MkdirAll(inner, 0o700) + link := filepath.Join(dataDir, "link") + _ = os.Symlink(inner, link) + return filepath.Join(link, "profile.out") + }, + }, + { + name: "unrestricted expands home directory", + restricted: false, + pathFn: func(_ string) string { return "~/profile.out" }, + checkFn: func(t *testing.T, got string) { + require.False(t, strings.HasPrefix(got, "~"), "home dir should be expanded, got: %s", got) + }, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ctx, dataDir := newTestContext(t, tc.restricted) + got, err := validatePath(ctx, tc.pathFn(dataDir)) + if tc.wantErr { + require.Error(t, err) + return + } + require.NoError(t, err) + require.NotEmpty(t, got) + if tc.checkFn != nil { + tc.checkFn(t, got) + } + }) + } +} diff --git a/rpc/namespaces/ethereum/eth/api.go b/rpc/namespaces/ethereum/eth/api.go index df9c8577a3..db093ae74f 100644 --- a/rpc/namespaces/ethereum/eth/api.go +++ b/rpc/namespaces/ethereum/eth/api.go @@ -23,7 +23,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -62,7 +62,7 @@ type EthereumAPI interface { GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) GetTransactionByBlockHashAndIndex(hash common.Hash, idx hexutil.Uint) (*rpctypes.RPCTransaction, error) GetTransactionByBlockNumberAndIndex(blockNum rpctypes.BlockNumber, idx hexutil.Uint) (*rpctypes.RPCTransaction, error) - // eth_getBlockReceipts + GetBlockReceipts(blockNrOrHash rpctypes.BlockNumberOrHash) ([]map[string]interface{}, error) // Writing Transactions // @@ -87,13 +87,15 @@ type EthereumAPI interface { // Allows developers to read data from the blockchain which includes executing // smart contracts. However, no data is published to the Ethereum network. Call(args evmtypes.TransactionArgs, blockNrOrHash rpctypes.BlockNumberOrHash, overrides *json.RawMessage) (hexutil.Bytes, error) + // SimulateV1 runs sequential simulated blocks/calls at the given block + SimulateV1(opts rpctypes.SimOpts, blockNrOrHash rpctypes.BlockNumberOrHash) (json.RawMessage, error) // Chain Information // // Returns information on the Ethereum network and internal settings. ProtocolVersion() hexutil.Uint GasPrice() (*hexutil.Big, error) - EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) + EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber, overrides *json.RawMessage) (hexutil.Uint64, error) FeeHistory(blockCount math.HexOrDecimal64, lastBlock rpc.BlockNumber, rewardPercentiles []float64) (*rpctypes.FeeHistoryResult, error) MaxPriorityFeePerGas() (*hexutil.Big, error) ChainId() (*hexutil.Big, error) @@ -106,10 +108,6 @@ type EthereumAPI interface { GetUncleCountByBlockHash(hash common.Hash) hexutil.Uint GetUncleCountByBlockNumber(blockNum rpctypes.BlockNumber) hexutil.Uint - // Proof of Work - Hashrate() hexutil.Uint64 - Mining() bool - // Other Syncing() (interface{}, error) Coinbase() (string, error) @@ -119,6 +117,11 @@ type EthereumAPI interface { FillTransaction(args evmtypes.TransactionArgs) (*rpctypes.SignTransactionResult, error) Resend(ctx context.Context, args evmtypes.TransactionArgs, gasPrice *hexutil.Big, gasLimit *hexutil.Uint64) (common.Hash, error) GetPendingTransactions() ([]*rpctypes.RPCTransaction, error) + CreateAccessList( + args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + overrides *json.RawMessage, + ) (*rpctypes.AccessListResult, error) // eth_signTransaction (on Ethereum.org) // eth_getCompilers (on Ethereum.org) // eth_compileSolidity (on Ethereum.org) @@ -195,7 +198,7 @@ func (e *PublicAPI) GetTransactionCount(address common.Address, blockNrOrHash rp func (e *PublicAPI) GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) { hexTx := hash.Hex() e.logger.Debug("eth_getTransactionReceipt", "hash", hexTx) - return e.backend.GetTransactionReceipt(hash) + return e.backend.GetTransactionReceipt(hash, nil) } // GetBlockTransactionCountByHash returns the number of transactions in the block identified by hash. @@ -222,6 +225,12 @@ func (e *PublicAPI) GetTransactionByBlockNumberAndIndex(blockNum rpctypes.BlockN return e.backend.GetTransactionByBlockNumberAndIndex(blockNum, idx) } +// GetBlockReceipts returns a list of transaction receipts given a block number or hash. +func (e *PublicAPI) GetBlockReceipts(blockNrOrHash rpctypes.BlockNumberOrHash) ([]map[string]interface{}, error) { + e.logger.Debug("eth_getBlockReceipts", "block", blockNrOrHash) + return e.backend.GetBlockReceipts(blockNrOrHash) +} + /////////////////////////////////////////////////////////////////////////////// /// Write Txs /// /////////////////////////////////////////////////////////////////////////////// @@ -320,9 +329,13 @@ func (e *PublicAPI) GasPrice() (*hexutil.Big, error) { } // EstimateGas returns an estimate of gas usage for the given smart contract call. -func (e *PublicAPI) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rpctypes.BlockNumber) (hexutil.Uint64, error) { +func (e *PublicAPI) EstimateGas( + args evmtypes.TransactionArgs, + blockNrOptional *rpctypes.BlockNumber, + overrides *json.RawMessage, +) (hexutil.Uint64, error) { e.logger.Debug("eth_estimateGas") - return e.backend.EstimateGas(args, blockNrOptional) + return e.backend.EstimateGas(args, blockNrOptional, overrides) } func (e *PublicAPI) FeeHistory(blockCount math.HexOrDecimal64, @@ -377,22 +390,6 @@ func (e *PublicAPI) GetUncleCountByBlockNumber(_ rpctypes.BlockNumber) hexutil.U return 0 } -/////////////////////////////////////////////////////////////////////////////// -/// Proof of Work /// -/////////////////////////////////////////////////////////////////////////////// - -// Hashrate returns the current node's hashrate. Always 0. -func (e *PublicAPI) Hashrate() hexutil.Uint64 { - e.logger.Debug("eth_hashrate") - return 0 -} - -// Mining returns whether or not this node is currently mining. Always false. -func (e *PublicAPI) Mining() bool { - e.logger.Debug("eth_mining") - return false -} - /////////////////////////////////////////////////////////////////////////////// /// Other /// /////////////////////////////////////////////////////////////////////////////// @@ -448,13 +445,16 @@ func (e *PublicAPI) GetTransactionLogs(txHash common.Hash) ([]*ethtypes.Log, err e.logger.Debug("block result not found", "number", res.Height, "error", err.Error()) return nil, nil } - + height, err := ethermint.SafeUint64(resBlockResult.Height) + if err != nil { + return nil, err + } // parse tx logs from events logs, err := evmtypes.DecodeMsgLogsFromEvents( resBlockResult.TxsResults[res.TxIndex].Data, resBlockResult.TxsResults[res.TxIndex].Events, int(res.MsgIndex), - uint64(resBlockResult.Height), + height, ) if err != nil { e.logger.Debug("failed to parse tx logs", "error", err.Error()) @@ -505,6 +505,18 @@ func (e *PublicAPI) Resend(_ context.Context, return e.backend.Resend(args, gasPrice, gasLimit) } +// SimulateV1 implements eth_simulateV1. +func (e *PublicAPI) SimulateV1(opts rpctypes.SimOpts, blockNrOrHash rpctypes.BlockNumberOrHash) (json.RawMessage, error) { + e.logger.Debug("eth_simulateV1", "opts", opts, "block number or hash", blockNrOrHash) + + blockNum, err := e.backend.BlockNumberFromTendermint(blockNrOrHash) + if err != nil { + return nil, err + } + + return e.backend.SimulateV1(opts, blockNum) +} + // GetPendingTransactions returns the transactions that are in the transaction pool // and have a from address that is one of the accounts this node manages. func (e *PublicAPI) GetPendingTransactions() ([]*rpctypes.RPCTransaction, error) { @@ -529,6 +541,7 @@ func (e *PublicAPI) GetPendingTransactions() ([]*rpctypes.RPCTransaction, error) common.Hash{}, uint64(0), uint64(0), + uint64(0), nil, e.backend.ChainConfig().ChainID, ) @@ -542,3 +555,17 @@ func (e *PublicAPI) GetPendingTransactions() ([]*rpctypes.RPCTransaction, error) return result, nil } + +// CreateAccessList returns the list of addresses and storage keys used by the transaction (except for the +// sender account and precompiles), plus the estimated gas if the access list were added to the transaction. +func (e *PublicAPI) CreateAccessList( + args evmtypes.TransactionArgs, + blockNrOrHash rpctypes.BlockNumberOrHash, + overrides *json.RawMessage, +) (*rpctypes.AccessListResult, error) { + res, err := e.backend.CreateAccessList(args, blockNrOrHash, overrides) + if err != nil { + return nil, err + } + return res, nil +} diff --git a/rpc/namespaces/ethereum/eth/filters/api.go b/rpc/namespaces/ethereum/eth/filters/api.go index a9dcd34f11..7b6a73fadc 100644 --- a/rpc/namespaces/ethereum/eth/filters/api.go +++ b/rpc/namespaces/ethereum/eth/filters/api.go @@ -23,7 +23,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" coretypes "github.com/cometbft/cometbft/rpc/core/types" @@ -196,6 +196,12 @@ func (api *PublicFilterAPI) NewFilter(criteria filters.FilterCriteria) (rpc.ID, return rpc.ID(""), fmt.Errorf("error creating filter: max limit reached") } + if criteria.FromBlock != nil && criteria.ToBlock != nil && + criteria.FromBlock.Int64() >= 0 && criteria.ToBlock.Int64() >= 0 && + criteria.FromBlock.Int64() > criteria.ToBlock.Int64() { + return rpc.ID(""), &types.InvalidParamsError{Message: "invalid block range params"} + } + id := rpc.NewID() _, offset := api.events.LogStream().ReadNonBlocking(-1) api.filters[id] = &filter{ @@ -284,7 +290,24 @@ func (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*et if f.crit.ToBlock != nil { end = f.crit.ToBlock.Int64() } - // Construct the range filter + if begin < 0 || end < 0 { + header, err := api.backend.HeaderByNumber(types.EthLatestBlockNumber) + if err != nil { + return nil, fmt.Errorf("failed to fetch latest block header: %w", err) + } + if header != nil && header.Number != nil { + head := header.Number.Int64() + if begin < 0 { + begin = head + } + if end < 0 { + end = head + } + } + } + if begin > end { + return nil, &types.InvalidParamsError{Message: "invalid block range params"} + } filter = NewRangeFilter(api.logger, api.backend, begin, end, f.crit.Addresses, f.crit.Topics) } // Run the filter and return all the logs diff --git a/rpc/namespaces/ethereum/eth/filters/filters.go b/rpc/namespaces/ethereum/eth/filters/filters.go index 8d63a8c4c2..cd17b55e31 100644 --- a/rpc/namespaces/ethereum/eth/filters/filters.go +++ b/rpc/namespaces/ethereum/eth/filters/filters.go @@ -24,7 +24,7 @@ import ( "github.com/evmos/ethermint/rpc/backend" "github.com/evmos/ethermint/rpc/types" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" tmrpctypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/pkg/errors" @@ -63,7 +63,7 @@ func NewRangeFilter(logger log.Logger, backend Backend, begin, end int64, addres // Flatten the address and topic filter clauses into a single bloombits filter // system. Since the bloombits are not positional, nil topics are permitted, // which get flattened into a nil byte slice. - var filtersBz [][][]byte //nolint: prealloc + filtersBz := make([][][]byte, 0, 1+len(topics)) if len(addresses) > 0 { filter := make([][]byte, len(addresses)) for i, address := range addresses { @@ -101,10 +101,6 @@ func newFilter(logger log.Logger, backend Backend, criteria filters.FilterCriter } } -const ( - maxToOverhang = 600 -) - // Logs searches the blockchain for matching log entries, returning all from the // first block that contains matches, updating the start of the filter accordingly. func (f *Filter) Logs(_ context.Context, logLimit int, blockLimit int64) ([]*ethtypes.Log, error) { @@ -114,6 +110,9 @@ func (f *Filter) Logs(_ context.Context, logLimit int, blockLimit int64) ([]*eth if err != nil { return nil, fmt.Errorf("failed to fetch header by hash %s: %w", f.criteria.BlockHash, err) } + if resBlock == nil { + return nil, errors.New("unknown block") + } blockRes, err := f.backend.TendermintBlockResultByNumber(&resBlock.Block.Height) if err != nil { @@ -126,7 +125,15 @@ func (f *Filter) Logs(_ context.Context, logLimit int, blockLimit int64) ([]*eth return nil, err } - return f.blockLogs(blockRes, bloom) + logs, err := f.blockLogs(blockRes, bloom) + if err != nil || len(logs) == 0 { + return logs, err + } + blockHash := *f.criteria.BlockHash + for _, l := range logs { + l.BlockHash = blockHash + } + return logs, nil } // Figure out the limits of the filter range @@ -152,15 +159,17 @@ func (f *Filter) Logs(_ context.Context, logLimit int, blockLimit int64) ([]*eth f.criteria.ToBlock = big.NewInt(1) } + if f.criteria.FromBlock.Int64() > f.criteria.ToBlock.Int64() { + return nil, &types.InvalidParamsError{Message: "invalid block range params"} + } + if f.criteria.ToBlock.Int64()-f.criteria.FromBlock.Int64() > blockLimit { return nil, fmt.Errorf("maximum [from, to] blocks distance: %d", blockLimit) } // check bounds - if f.criteria.FromBlock.Int64() > head { - return []*ethtypes.Log{}, nil - } else if f.criteria.ToBlock.Int64() > head+maxToOverhang { - f.criteria.ToBlock = big.NewInt(head + maxToOverhang) + if f.criteria.ToBlock.Int64() > head { + return nil, &types.InvalidParamsError{Message: "block range extends beyond current head block"} } from := f.criteria.FromBlock.Int64() diff --git a/rpc/namespaces/ethereum/eth/filters/filters_test.go b/rpc/namespaces/ethereum/eth/filters/filters_test.go new file mode 100644 index 0000000000..77fd94b47b --- /dev/null +++ b/rpc/namespaces/ethereum/eth/filters/filters_test.go @@ -0,0 +1,244 @@ +package filters + +import ( + "context" + "math/big" + "testing" + "time" + + logv2 "cosmossdk.io/log/v2" + abci "github.com/cometbft/cometbft/abci/types" + coretypes "github.com/cometbft/cometbft/rpc/core/types" + cmttypes "github.com/cometbft/cometbft/types" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + proto "github.com/cosmos/gogoproto/proto" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + gethfilters "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/rpc" + "github.com/evmos/ethermint/rpc/types" + evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/stretchr/testify/require" +) + +// stubBackend satisfies the Backend interface with a fixed chain head. +type stubBackend struct { + head int64 +} + +func (s *stubBackend) HeaderByNumber(_ types.BlockNumber) (*ethtypes.Header, error) { + return ðtypes.Header{Number: big.NewInt(s.head)}, nil +} +func (s *stubBackend) GetBlockByNumber(_ types.BlockNumber, _ bool) (map[string]interface{}, error) { + return nil, nil +} +func (s *stubBackend) HeaderByHash(_ common.Hash) (*ethtypes.Header, error) { return nil, nil } +func (s *stubBackend) TendermintBlockByHash(_ common.Hash) (*coretypes.ResultBlock, error) { + return nil, nil +} +func (s *stubBackend) TendermintBlockResultByNumber(_ *int64) (*coretypes.ResultBlockResults, error) { + return &coretypes.ResultBlockResults{}, nil +} +func (s *stubBackend) GetLogs(_ common.Hash) ([][]*ethtypes.Log, error) { return nil, nil } +func (s *stubBackend) GetLogsByHeight(_ *int64) ([][]*ethtypes.Log, error) { return nil, nil } +func (s *stubBackend) BlockBloom(_ *coretypes.ResultBlockResults) (ethtypes.Bloom, error) { + return ethtypes.Bloom{}, nil +} +func (s *stubBackend) BloomStatus() (uint64, uint64) { return 0, 0 } +func (s *stubBackend) RPCFilterCap() int32 { return 100 } +func (s *stubBackend) RPCLogsCap() int32 { return 10000 } +func (s *stubBackend) RPCBlockRangeCap() int32 { return 2000 } + +func TestGetLogs_ReversedBlockRange(t *testing.T) { + const head = int64(100) + api := &PublicFilterAPI{ + logger: logv2.NewNopLogger(), + backend: &stubBackend{head: head}, + } + + tests := []struct { + name string + from int64 + to int64 + }{ + {"fromBlock > toBlock", 500, 50}, + {"fromBlock == toBlock+1", 51, 50}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + crit := gethfilters.FilterCriteria{ + FromBlock: big.NewInt(tc.from), + ToBlock: big.NewInt(tc.to), + } + _, err := api.GetLogs(context.Background(), crit) + var invalidParams *types.InvalidParamsError + require.ErrorAs(t, err, &invalidParams) + require.Contains(t, err.Error(), "invalid block range params") + }) + } +} + +func TestGetLogs_ToBlockExceedsHead(t *testing.T) { + const head = int64(100) + api := &PublicFilterAPI{ + logger: logv2.NewNopLogger(), + backend: &stubBackend{head: head}, + } + + tests := []struct { + name string + from int64 + to int64 + wantErr bool + }{ + {"toBlock == head, ok", head, head, false}, + {"fromBlock == head-1, toBlock == head, ok", head - 1, head, false}, + {"toBlock == head+1, error", head, head + 1, true}, + {"toBlock == head+100, error", head, head + 100, true}, + {"toBlock == head+600, error (was silently clamped before fix)", head, head + 600, true}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + crit := gethfilters.FilterCriteria{ + FromBlock: big.NewInt(tc.from), + ToBlock: big.NewInt(tc.to), + } + _, err := api.GetLogs(context.Background(), crit) + if tc.wantErr { + var invalidParams *types.InvalidParamsError + require.ErrorAs(t, err, &invalidParams) + require.Contains(t, err.Error(), "block range extends beyond current head block") + } else { + require.NoError(t, err) + } + }) + } +} + +func TestNewFilter_ReversedBlockRange(t *testing.T) { + api := &PublicFilterAPI{ + logger: logv2.NewNopLogger(), + backend: &stubBackend{head: 100}, + filters: make(map[rpc.ID]*filter), + } + + tests := []struct { + name string + from *big.Int + to *big.Int + }{ + {"reversed range", big.NewInt(500), big.NewInt(50)}, + {"from == to+1", big.NewInt(51), big.NewInt(50)}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + crit := gethfilters.FilterCriteria{ + FromBlock: tc.from, + ToBlock: tc.to, + } + _, err := api.NewFilter(crit) + var invalidParams *types.InvalidParamsError + require.ErrorAs(t, err, &invalidParams) + require.Contains(t, err.Error(), "invalid block range params") + }) + } +} + +func TestGetFilterLogs_LatestResolvesReversedRange(t *testing.T) { + const head = int64(100) + api := &PublicFilterAPI{ + logger: logv2.NewNopLogger(), + backend: &stubBackend{head: head}, + filters: make(map[rpc.ID]*filter), + } + id := rpc.NewID() + api.filters[id] = &filter{ + typ: gethfilters.LogsSubscription, + deadline: time.NewTimer(time.Minute), + crit: gethfilters.FilterCriteria{ + FromBlock: nil, + ToBlock: big.NewInt(50), + }, + } + + _, err := api.GetFilterLogs(context.Background(), id) + var invalidParams *types.InvalidParamsError + require.ErrorAs(t, err, &invalidParams) + require.Contains(t, err.Error(), "invalid block range params") +} + +type blockHashFoundBackend struct { + stubBackend + blockHash common.Hash + blockRes *coretypes.ResultBlockResults +} + +func (b *blockHashFoundBackend) TendermintBlockByHash(hash common.Hash) (*coretypes.ResultBlock, error) { + if hash == b.blockHash { + return &coretypes.ResultBlock{ + Block: &cmttypes.Block{Header: cmttypes.Header{Height: 10}}, + }, nil + } + return nil, nil +} + +func (b *blockHashFoundBackend) TendermintBlockResultByNumber(_ *int64) (*coretypes.ResultBlockResults, error) { + return b.blockRes, nil +} + +func buildBlockResultsWithLog(t *testing.T, height int64, addr common.Address) *coretypes.ResultBlockResults { + t.Helper() + anyVal, err := codectypes.NewAnyWithValue(&evmtypes.MsgEthereumTxResponse{ + Logs: []*evmtypes.Log{{Address: addr.Hex()}}, + }) + require.NoError(t, err) + data, err := proto.Marshal(&sdk.TxMsgData{MsgResponses: []*codectypes.Any{anyVal}}) + require.NoError(t, err) + return &coretypes.ResultBlockResults{ + Height: height, + TxsResults: []*abci.ExecTxResult{{Code: 0, Data: data}}, + } +} + +func TestGetLogs_BlockHashNotFound(t *testing.T) { + api := &PublicFilterAPI{ + logger: logv2.NewNopLogger(), + backend: &stubBackend{head: 100}, + } + + blockHash := common.HexToHash("0xdeadbeef") + crit := gethfilters.FilterCriteria{BlockHash: &blockHash} + + logs, err := api.GetLogs(context.Background(), crit) + require.Error(t, err) + require.Nil(t, logs) +} + +func TestGetLogs_BlockHashFound(t *testing.T) { + const height = int64(10) + logAddr := common.HexToAddress("0x1234567890123456789012345678901234567890") + filterHash := common.HexToHash("0xaabbccddaabbccddaabbccddaabbccddaabbccddaabbccddaabbccddaabbccdd") + + blockRes := buildBlockResultsWithLog(t, height, logAddr) + api := &PublicFilterAPI{ + logger: logv2.NewNopLogger(), + backend: &blockHashFoundBackend{ + stubBackend: stubBackend{head: height}, + blockHash: filterHash, + blockRes: blockRes, + }, + } + + crit := gethfilters.FilterCriteria{BlockHash: &filterHash} + logs, err := api.GetLogs(context.Background(), crit) + require.NoError(t, err) + require.NotEmpty(t, logs) + for _, l := range logs { + require.Equal(t, filterHash, l.BlockHash, + "every log must carry the block hash used in the filter") + } +} diff --git a/rpc/namespaces/ethereum/miner/api.go b/rpc/namespaces/ethereum/miner/api.go deleted file mode 100644 index 09f7f692cb..0000000000 --- a/rpc/namespaces/ethereum/miner/api.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 Evmos Foundation -// This file is part of Evmos' Ethermint library. -// -// The Ethermint library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The Ethermint library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package miner - -import ( - "github.com/cosmos/cosmos-sdk/server" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - - "cosmossdk.io/log" - - "github.com/evmos/ethermint/rpc/backend" -) - -// API is the private miner prefixed set of APIs in the Miner JSON-RPC spec. -type API struct { - ctx *server.Context - logger log.Logger - backend backend.EVMBackend -} - -// NewPrivateAPI creates an instance of the Miner API. -func NewPrivateAPI( - ctx *server.Context, - backend backend.EVMBackend, -) *API { - return &API{ - ctx: ctx, - logger: ctx.Logger.With("api", "miner"), - backend: backend, - } -} - -// SetEtherbase sets the etherbase of the miner -func (api *API) SetEtherbase(etherbase common.Address) bool { - api.logger.Debug("miner_setEtherbase") - return api.backend.SetEtherbase(etherbase) -} - -// SetGasPrice sets the minimum accepted gas price for the miner. -func (api *API) SetGasPrice(gasPrice hexutil.Big) bool { - api.logger.Info(api.ctx.Viper.ConfigFileUsed()) - return api.backend.SetGasPrice(gasPrice) -} diff --git a/rpc/namespaces/ethereum/miner/unsupported.go b/rpc/namespaces/ethereum/miner/unsupported.go deleted file mode 100644 index d07ac006ac..0000000000 --- a/rpc/namespaces/ethereum/miner/unsupported.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021 Evmos Foundation -// This file is part of Evmos' Ethermint library. -// -// The Ethermint library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The Ethermint library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE -package miner - -import ( - "errors" - - "github.com/ethereum/go-ethereum/common/hexutil" -) - -// GetHashrate returns the current hashrate for local CPU miner and remote miner. -// Unsupported in Ethermint -func (api *API) GetHashrate() uint64 { - api.logger.Debug("miner_getHashrate") - api.logger.Debug("Unsupported rpc function: miner_getHashrate") - return 0 -} - -// SetExtra sets the extra data string that is included when this miner mines a block. -// Unsupported in Ethermint -func (api *API) SetExtra(_ string) (bool, error) { - api.logger.Debug("miner_setExtra") - api.logger.Debug("Unsupported rpc function: miner_setExtra") - return false, errors.New("unsupported rpc function: miner_setExtra") -} - -// SetGasLimit sets the gaslimit to target towards during mining. -// Unsupported in Ethermint -func (api *API) SetGasLimit(_ hexutil.Uint64) bool { - api.logger.Debug("miner_setGasLimit") - api.logger.Debug("Unsupported rpc function: miner_setGasLimit") - return false -} - -// Start starts the miner with the given number of threads. If threads is nil, -// the number of workers started is equal to the number of logical CPUs that are -// usable by this process. If mining is already running, this method adjust the -// number of threads allowed to use and updates the minimum price required by the -// transaction pool. -// Unsupported in Ethermint -func (api *API) Start(_ *int) error { - api.logger.Debug("miner_start") - api.logger.Debug("Unsupported rpc function: miner_start") - return errors.New("unsupported rpc function: miner_start") -} - -// Stop terminates the miner, both at the consensus engine level as well as at -// the block creation level. -// Unsupported in Ethermint -func (api *API) Stop() { - api.logger.Debug("miner_stop") - api.logger.Debug("Unsupported rpc function: miner_stop") -} diff --git a/rpc/namespaces/ethereum/personal/api.go b/rpc/namespaces/ethereum/personal/api.go index f2a3614618..adf2564bb7 100644 --- a/rpc/namespaces/ethereum/personal/api.go +++ b/rpc/namespaces/ethereum/personal/api.go @@ -26,7 +26,7 @@ import ( "github.com/evmos/ethermint/crypto/hd" ethermint "github.com/evmos/ethermint/types" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/rpc/namespaces/ethereum/txpool/api.go b/rpc/namespaces/ethereum/txpool/api.go index cee9e885cf..30d487865d 100644 --- a/rpc/namespaces/ethereum/txpool/api.go +++ b/rpc/namespaces/ethereum/txpool/api.go @@ -16,7 +16,7 @@ package txpool import ( - "cosmossdk.io/log" + "cosmossdk.io/log/v2" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/rpc/stream/cond.go b/rpc/stream/cond.go index 8f629907ee..cba06d5eaa 100644 --- a/rpc/stream/cond.go +++ b/rpc/stream/cond.go @@ -15,12 +15,18 @@ func NewCond() *Cond { return &Cond{ch: make(chan struct{})} } -// Wait returns true if the condition is signaled, false if the context is canceled -func (c *Cond) Wait(ctx context.Context) bool { +// WaitChan returns the current wait channel. +// Capture this while holding relevant locks to avoid missing broadcasts +// between releasing the lock and starting to wait. +func (c *Cond) WaitChan() <-chan struct{} { c.mu.Lock() ch := c.ch c.mu.Unlock() + return ch +} +// WaitOnChan waits on a previously captured channel, returns true if signaled, false if canceled. +func (c *Cond) WaitOnChan(ctx context.Context, ch <-chan struct{}) bool { select { case <-ch: return true diff --git a/rpc/stream/rpc.go b/rpc/stream/rpc.go index d23388ada7..8b35baac79 100644 --- a/rpc/stream/rpc.go +++ b/rpc/stream/rpc.go @@ -5,7 +5,7 @@ import ( "fmt" "sync" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" cmtquery "github.com/cometbft/cometbft/libs/pubsub/query" rpcclient "github.com/cometbft/cometbft/rpc/client" coretypes "github.com/cometbft/cometbft/rpc/core/types" @@ -14,7 +14,9 @@ import ( "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/evmos/ethermint/rpc/types" + ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" + "google.golang.org/grpc" ) const ( @@ -44,39 +46,57 @@ type RPCHeader struct { Hash common.Hash } +type validatorAccountFunc func( + ctx context.Context, in *evmtypes.QueryValidatorAccountRequest, opts ...grpc.CallOption, +) (*evmtypes.QueryValidatorAccountResponse, error) + // RPCStream provides data streams for newHeads, logs, and pendingTransactions. +// it's only started on demand, so there's no overhead if the filter apis are not called at all. type RPCStream struct { evtClient rpcclient.EventsClient logger log.Logger txDecoder sdk.TxDecoder - headerStream *Stream[RPCHeader] + // headerStream/logStream are backed by cometbft event subscription + headerStream *Stream[RPCHeader] + logStream *Stream[*ethtypes.Log] + + // pendingTxStream is backed by check-tx ante handler pendingTxStream *Stream[common.Hash] - logStream *Stream[*ethtypes.Log] - wg sync.WaitGroup + wg sync.WaitGroup + validatorAccount validatorAccountFunc } func NewRPCStreams( evtClient rpcclient.EventsClient, logger log.Logger, txDecoder sdk.TxDecoder, -) (*RPCStream, error) { - s := &RPCStream{ - evtClient: evtClient, - logger: logger, - txDecoder: txDecoder, - - headerStream: NewStream[RPCHeader](headerStreamSegmentSize, headerStreamCapacity), - pendingTxStream: NewStream[common.Hash](txStreamSegmentSize, txStreamCapacity), - logStream: NewStream[*ethtypes.Log](logStreamSegmentSize, logStreamCapacity), + validatorAccount validatorAccountFunc, +) *RPCStream { + return &RPCStream{ + evtClient: evtClient, + logger: logger, + txDecoder: txDecoder, + validatorAccount: validatorAccount, + pendingTxStream: NewStream[common.Hash](txStreamSegmentSize, txStreamCapacity), + } +} + +func (s *RPCStream) initSubscriptions() { + if s.headerStream != nil { + // already initialized + return } + s.headerStream = NewStream[RPCHeader](headerStreamSegmentSize, headerStreamCapacity) + s.logStream = NewStream[*ethtypes.Log](logStreamSegmentSize, logStreamCapacity) + ctx := context.Background() chBlocks, err := s.evtClient.Subscribe(ctx, streamSubscriberName, blockEvents, subscribBufferSize) if err != nil { - return nil, err + panic(err) } chLogs, err := s.evtClient.Subscribe(ctx, streamSubscriberName, evmEvents, subscribBufferSize) @@ -84,15 +104,18 @@ func NewRPCStreams( if err := s.evtClient.UnsubscribeAll(context.Background(), streamSubscriberName); err != nil { s.logger.Error("failed to unsubscribe", "err", err) } - return nil, err + panic(err) } go s.start(&s.wg, chBlocks, chLogs) - - return s, nil } func (s *RPCStream) Close() error { + if s.headerStream == nil { + // not initialized + return nil + } + if err := s.evtClient.UnsubscribeAll(context.Background(), streamSubscriberName); err != nil { return err } @@ -101,6 +124,7 @@ func (s *RPCStream) Close() error { } func (s *RPCStream) HeaderStream() *Stream[RPCHeader] { + s.initSubscriptions() return s.headerStream } @@ -109,12 +133,13 @@ func (s *RPCStream) PendingTxStream() *Stream[common.Hash] { } func (s *RPCStream) LogStream() *Stream[*ethtypes.Log] { + s.initSubscriptions() return s.logStream } // ListenPendingTx is a callback passed to application to listen for pending transactions in CheckTx. func (s *RPCStream) ListenPendingTx(hash common.Hash) { - s.pendingTxStream.Add(hash) + s.PendingTxStream().Add(hash) } func (s *RPCStream) start( @@ -145,9 +170,23 @@ func (s *RPCStream) start( } baseFee := types.BaseFeeFromEvents(data.ResultFinalizeBlock.Events) - + res, err := s.validatorAccount( + types.ContextWithHeight(data.Block.Height), + &evmtypes.QueryValidatorAccountRequest{ + ConsAddress: sdk.ConsAddress(data.Block.Header.ProposerAddress).String(), + }, + ) + if err != nil { + s.logger.Error("failed to get validator account", "err", err) + continue + } + validator, err := sdk.AccAddressFromBech32(res.AccountAddress) + if err != nil { + s.logger.Error("failed to convert validator account", "err", err) + continue + } // TODO: fetch bloom from events - header := types.EthHeaderFromTendermint(data.Block.Header, ethtypes.Bloom{}, baseFee) + header := types.EthHeaderFromTendermint(data.Block.Header, ethtypes.Bloom{}, baseFee, validator) s.headerStream.Add(RPCHeader{EthHeader: header, Hash: common.BytesToHash(data.Block.Header.Hash())}) case ev, ok := <-chLogs: @@ -167,7 +206,11 @@ func (s *RPCStream) start( s.logger.Error("event data type mismatch", "type", fmt.Sprintf("%T", ev.Data)) continue } - txLogs, err := evmtypes.DecodeTxLogsFromEvents(dataTx.TxResult.Result.Data, dataTx.TxResult.Result.Events, uint64(dataTx.TxResult.Height)) + height, err := ethermint.SafeUint64(dataTx.Height) + if err != nil { + continue + } + txLogs, err := evmtypes.DecodeTxLogsFromEvents(dataTx.Result.Data, dataTx.Result.Events, height) if err != nil { s.logger.Error("fail to decode evm tx response", "error", err.Error()) continue diff --git a/rpc/stream/stream.go b/rpc/stream/stream.go index 794bcb2d5a..eaa11fed59 100644 --- a/rpc/stream/stream.go +++ b/rpc/stream/stream.go @@ -130,8 +130,11 @@ func (s *Stream[V]) ReadBlocking(ctx context.Context, offset int) ([]V, int) { return items, offset } + // Capture the wait channel before releasing the read lock to avoid + // missing a broadcast that happens between unlock and wait. + waitCh := s.cond.WaitChan() s.mutex.RUnlock() - r := s.cond.Wait(ctx) + r := s.cond.WaitOnChan(ctx, waitCh) s.mutex.RLock() if !r { diff --git a/rpc/types/block.go b/rpc/types/block.go index 9f4b533950..e5d1be3d9e 100644 --- a/rpc/types/block.go +++ b/rpc/types/block.go @@ -20,7 +20,6 @@ import ( "encoding/json" "errors" "fmt" - "math" "math/big" "strings" @@ -74,7 +73,7 @@ func ContextWithHeight(height int64) context.Context { } // UnmarshalJSON parses the given JSON fragment into a BlockNumber. It supports: -// - "latest", "finalized", "earliest" or "pending" as string arguments +// - "latest", "finalized", "safe", "earliest" or "pending" as string arguments // - the block number // Returned errors: // - an invalid block number error when the given argument isn't a known strings @@ -103,11 +102,11 @@ func (bn *BlockNumber) UnmarshalJSON(data []byte) error { } else if err != nil { return err } - - if blckNum > math.MaxInt64 { - return fmt.Errorf("block number larger than int64") + b, err := ethermint.SafeInt64(blckNum) + if err != nil { + return err } - *bn = BlockNumber(blckNum) + *bn = BlockNumber(b) return nil } @@ -175,7 +174,7 @@ func (bnh *BlockNumberOrHash) decodeFromString(input string) error { case BlockParamEarliest: bn := EthEarliestBlockNumber bnh.BlockNumber = &bn - case BlockParamLatest, BlockParamFinalized: + case BlockParamLatest, BlockParamFinalized, BlockParamSafe: bn := EthLatestBlockNumber bnh.BlockNumber = &bn case BlockParamPending: diff --git a/rpc/types/block_test.go b/rpc/types/block_test.go index 1cbb11f61e..b11f4c027a 100644 --- a/rpc/types/block_test.go +++ b/rpc/types/block_test.go @@ -78,6 +78,15 @@ func TestUnmarshalBlockNumberOrHash(t *testing.T) { }, true, }, + { + "String input with block number safe", + []byte("\"safe\""), + func() { + require.Equal(t, *bnh.BlockNumber, EthLatestBlockNumber) + require.Nil(t, bnh.BlockHash) + }, + true, + }, { "String input with block number overflow", []byte("\"0xffffffffffffffffffffffffffffffffffffff\""), diff --git a/rpc/types/events.go b/rpc/types/events.go index a0ce40a56a..0b53f5e282 100644 --- a/rpc/types/events.go +++ b/rpc/types/events.go @@ -135,7 +135,11 @@ func ParseTxResult(result *abci.ExecTxResult, tx sdk.Tx) (*ParsedTxs, error) { // some old versions miss some events, fill it with tx result if len(p.Txs) == 1 { - p.Txs[0].GasUsed = uint64(result.GasUsed) + value, err := ethermint.SafeUint64(result.GasUsed) + if err != nil { + return nil, err + } + p.Txs[0].GasUsed = value } // this could only happen if tx exceeds block gas limit @@ -162,11 +166,14 @@ func ParseTxIndexerResult(txResult *tmrpctypes.ResultTx, tx sdk.Tx, getter func( if parsedTx == nil { return nil, fmt.Errorf("ethereum tx not found in msgs: block %d, index %d", txResult.Height, txResult.Index) } - + msgIndex, err := ethermint.SafeUint32(parsedTx.MsgIndex) + if err != nil { + return nil, err + } return ðermint.TxResult{ Height: txResult.Height, TxIndex: txResult.Index, - MsgIndex: uint32(parsedTx.MsgIndex), + MsgIndex: msgIndex, EthTxIndex: parsedTx.EthTxIndex, Failed: parsedTx.Failed, GasUsed: parsedTx.GasUsed, @@ -251,7 +258,11 @@ func fillTxAttribute(tx *ParsedTx, key []byte, value []byte) error { if err != nil { return err } - tx.EthTxIndex = int32(txIndex) + txIdx, err := ethermint.SafeUint64ToInt32(txIndex) + if err != nil { + return err + } + tx.EthTxIndex = txIdx case evmtypes.AttributeKeyTxGasUsed: gasUsed, err := strconv.ParseUint(string(value), 10, 64) if err != nil { diff --git a/rpc/types/simulate.go b/rpc/types/simulate.go new file mode 100644 index 0000000000..212600548a --- /dev/null +++ b/rpc/types/simulate.go @@ -0,0 +1,385 @@ +package types + +import ( + "encoding/json" + "errors" + "fmt" + "maps" + "math" + "math/big" + "slices" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/tracing" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" + ethermint "github.com/evmos/ethermint/types" + "github.com/evmos/ethermint/x/evm/statedb" + "github.com/holiman/uint256" +) + +const ( + // MaxSimulateBlocks is the maximum number of blocks that can be simulated. + MaxSimulateBlocks = 256 + // TimestampIncrement is the default increment between block timestamps. + TimestampIncrement = 1 +) + +// SimOpts are the inputs to eth_simulateV1. +type SimOpts struct { + BlockStateCalls []SimBlock `json:"blockStateCalls"` + TraceTransfers bool `json:"traceTransfers"` + Validation bool `json:"validation"` + ReturnFullTransactions bool `json:"returnFullTransactions"` +} + +// SimulateV1Args is the internal keeper payload for eth_simulateV1. +// It includes the user RPC options plus the resolved canonical base header. +type SimulateV1Args struct { + Opts SimOpts `json:"opts"` + BaseHeader *ethtypes.Header `json:"baseHeader"` +} + +// SimBlock is a batch of calls to be simulated sequentially. +type SimBlock struct { + BlockOverrides *SimBlockOverrides `json:"blockOverrides"` + StateOverrides *SimStateOverride `json:"stateOverrides"` + Calls []json.RawMessage `json:"calls"` +} + +// SimBlockOverrides extends BlockOverrides with additional fields for simulation. +type SimBlockOverrides struct { + Number *hexutil.Big `json:"number"` + Difficulty *hexutil.Big `json:"difficulty"` + Time *hexutil.Uint64 `json:"time"` + GasLimit *hexutil.Uint64 `json:"gasLimit"` + FeeRecipient *common.Address `json:"feeRecipient"` + PrevRandao *common.Hash `json:"prevRandao"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas"` + BlobBaseFee *hexutil.Big `json:"blobBaseFee"` + BeaconRoot *common.Hash `json:"beaconRoot"` + Withdrawals *ethtypes.Withdrawals `json:"withdrawals"` +} + +// MakeHeader returns a new header object with the overridden fields. +func (o *SimBlockOverrides) MakeHeader(header *ethtypes.Header) *ethtypes.Header { + if o == nil { + return header + } + h := ethtypes.CopyHeader(header) + if o.Number != nil { + h.Number = o.Number.ToInt() + } + if o.Difficulty != nil { + h.Difficulty = o.Difficulty.ToInt() + } + if o.Time != nil { + h.Time = uint64(*o.Time) + } + if o.GasLimit != nil { + h.GasLimit = uint64(*o.GasLimit) + } + if o.FeeRecipient != nil { + h.Coinbase = *o.FeeRecipient + } + if o.PrevRandao != nil { + h.MixDigest = *o.PrevRandao + } + if o.BaseFeePerGas != nil { + h.BaseFee = o.BaseFeePerGas.ToInt() + } + return h +} + +// SimOverrideAccount indicates the overriding fields of account during simulation. +// Extends OverrideAccount with MovePrecompileTo support. +type SimOverrideAccount struct { + Nonce *hexutil.Uint64 `json:"nonce"` + Code *hexutil.Bytes `json:"code"` + Balance *hexutil.Big `json:"balance"` + State map[common.Hash]common.Hash `json:"state"` + StateDiff map[common.Hash]common.Hash `json:"stateDiff"` + MovePrecompileTo *common.Address `json:"movePrecompileToAddress"` +} + +// SimStateOverride is the collection of overridden accounts for simulation. +type SimStateOverride map[common.Address]SimOverrideAccount + +func (diff *SimStateOverride) has(address common.Address) bool { + _, ok := (*diff)[address] + return ok +} + +// Apply overrides the fields of specified accounts into the given state. +// Supports precompile moves via MovePrecompileTo. +func (diff *SimStateOverride) Apply(stateDB *statedb.StateDB, precompiles vm.PrecompiledContracts) error { + if diff == nil { + return nil + } + // Iterate in deterministic order. + addrs := slices.SortedFunc(maps.Keys(*diff), common.Address.Cmp) + + // Tracks destinations of precompiles that were moved. + dirtyAddrs := make(map[common.Address]struct{}) + for _, addr := range addrs { + account := (*diff)[addr] + // If a precompile was moved to this address already, it can't be overridden. + if _, ok := dirtyAddrs[addr]; ok { + return &InvalidParamsError{Message: fmt.Sprintf("account %s has already been overridden by a precompile", addr.Hex())} + } + p, isPrecompile := precompiles[addr] + if account.MovePrecompileTo != nil { + if !isPrecompile { + return &ServerError{Message: fmt.Sprintf("account %s is not a precompile", addr.Hex())} + } + if diff.has(*account.MovePrecompileTo) { + return &InvalidParamsError{Message: fmt.Sprintf("account %s is already overridden", account.MovePrecompileTo.Hex())} + } + precompiles[*account.MovePrecompileTo] = p + dirtyAddrs[*account.MovePrecompileTo] = struct{}{} + } + if isPrecompile { + delete(precompiles, addr) + } + // Override account nonce. + if account.Nonce != nil { + stateDB.SetNonce(addr, uint64(*account.Nonce), tracing.NonceChangeUnspecified) + } + // Override account(contract) code. + if account.Code != nil { + stateDB.SetCode(addr, *account.Code, tracing.CodeChangeUnspecified) + } + // Override account balance. + if account.Balance != nil { + u256Balance, overflow := uint256.FromBig((*big.Int)(account.Balance)) + if overflow { + return &InvalidParamsError{Message: fmt.Sprintf("account %s balance overflows uint256", addr.Hex())} + } + stateDB.SetBalance(addr, *u256Balance) + } + if account.State != nil && account.StateDiff != nil { + return &InvalidParamsError{Message: fmt.Sprintf("account %s has both 'state' and 'stateDiff'", addr.Hex())} + } + // Replace entire state if caller requires. + if account.State != nil { + stateDB.SetStorage(addr, account.State) + } + // Apply state diff into specified accounts. + if account.StateDiff != nil { + for key, value := range account.StateDiff { + stateDB.SetState(addr, key, value) + } + } + } + // Finalize overrides so they behave as if applied in a preceding transaction. + //nolint:misspell + stateDB.Finalise(false) + return nil +} + +// SimLog reuses ethtypes.Log JSON encoding and injects blockTimestamp until the +// pinned go-ethereum fork carries BlockTimestamp on ethtypes.Log. +type SimLog struct { + ethtypes.Log + BlockTimestamp hexutil.Uint64 +} + +// NewSimLog converts an ethtypes.Log and block timestamp into a SimLog. +func NewSimLog(l *ethtypes.Log, blockTimestamp uint64) *SimLog { + log := *l + if log.Topics == nil { + log.Topics = []common.Hash{} + } + return &SimLog{ + Log: log, + BlockTimestamp: hexutil.Uint64(blockTimestamp), + } +} + +// MarshalJSON preserves the upstream log JSON shape and adds blockTimestamp for +// eth_simulateV1, avoiding a local copy of every ethtypes.Log field. +func (l *SimLog) MarshalJSON() ([]byte, error) { + bz, err := json.Marshal(l.Log) + if err != nil { + return nil, err + } + fields := make(map[string]json.RawMessage) + if err := json.Unmarshal(bz, &fields); err != nil { + return nil, err + } + blockTimestamp, err := json.Marshal(l.BlockTimestamp) + if err != nil { + return nil, err + } + fields["blockTimestamp"] = blockTimestamp + return json.Marshal(fields) +} + +// SimCallResult is the result of a simulated call. +type SimCallResult struct { + ReturnValue hexutil.Bytes `json:"returnData"` + Logs []*SimLog `json:"logs"` + GasUsed hexutil.Uint64 `json:"gasUsed"` + MaxUsedGas hexutil.Uint64 `json:"maxUsedGas"` + Status hexutil.Uint64 `json:"status"` + Error *CallError `json:"error,omitempty"` +} + +// MarshalJSON ensures logs is an empty array instead of nil when empty. +func (r *SimCallResult) MarshalJSON() ([]byte, error) { + type callResultAlias SimCallResult + if r.Logs == nil { + r.Logs = []*SimLog{} + } + return json.Marshal((*callResultAlias)(r)) +} + +// SimBlockResult is the result of a simulated block. +type SimBlockResult struct { + FullTx bool + ChainConfig *params.ChainConfig + Block *ethtypes.Block + Calls []SimCallResult + // Senders is a map of transaction hashes to their Senders. + Senders map[common.Hash]common.Address +} + +func (r *SimBlockResult) MarshalJSON() ([]byte, error) { + blockData, err := RPCMarshalBlock(r.Block, true, r.FullTx, r.ChainConfig) + if err != nil { + return nil, err + } + blockData["calls"] = r.Calls + // Set tx sender if user requested full tx objects. + if r.FullTx { + if raw, ok := blockData["transactions"].([]any); ok { + for _, tx := range raw { + if tx, ok := tx.(*RPCTransaction); ok { + tx.From = r.Senders[tx.Hash] + } else { + return nil, errors.New("simulated transaction result has invalid type") + } + } + } + } + return json.Marshal(blockData) +} + +// RPCMarshalHeader converts the given header to the RPC output . +func RPCMarshalHeader(head *ethtypes.Header) map[string]interface{} { + result := map[string]interface{}{ + "number": (*hexutil.Big)(head.Number), + "hash": head.Hash(), + "parentHash": head.ParentHash, + "nonce": head.Nonce, + "mixHash": head.MixDigest, + "sha3Uncles": head.UncleHash, + "logsBloom": head.Bloom, + "stateRoot": head.Root, + "miner": head.Coinbase, + "difficulty": (*hexutil.Big)(head.Difficulty), + "extraData": hexutil.Bytes(head.Extra), + "gasLimit": hexutil.Uint64(head.GasLimit), + "gasUsed": hexutil.Uint64(head.GasUsed), + "timestamp": hexutil.Uint64(head.Time), + "transactionsRoot": head.TxHash, + "receiptsRoot": head.ReceiptHash, + } + if head.BaseFee != nil { + result["baseFeePerGas"] = (*hexutil.Big)(head.BaseFee) + } + if head.WithdrawalsHash != nil { + result["withdrawalsRoot"] = head.WithdrawalsHash + } + if head.BlobGasUsed != nil { + result["blobGasUsed"] = hexutil.Uint64(*head.BlobGasUsed) + } + if head.ExcessBlobGas != nil { + result["excessBlobGas"] = hexutil.Uint64(*head.ExcessBlobGas) + } + if head.ParentBeaconRoot != nil { + result["parentBeaconBlockRoot"] = head.ParentBeaconRoot + } + if head.RequestsHash != nil { + result["requestsHash"] = head.RequestsHash + } + + return result +} + +// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are +// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain +// transaction hashes. +func RPCMarshalBlock(block *ethtypes.Block, inclTx bool, fullTx bool, config *params.ChainConfig) (map[string]interface{}, error) { + fields := RPCMarshalHeader(block.Header()) + fields["size"] = hexutil.Uint64(block.Size()) + + if inclTx { + formatTx := func(idx int, tx *ethtypes.Transaction) (interface{}, error) { + return tx.Hash(), nil + } + if fullTx { + formatTx = func(idx int, tx *ethtypes.Transaction) (interface{}, error) { + signer := ethtypes.MakeSigner(config, new(big.Int).SetUint64(block.NumberU64()), block.Time()) + sender, _ := ethtypes.Sender(signer, tx) + index, err := ethermint.SafeIntToUint64(idx) + if err != nil { + return nil, err + } + return NewRPCTransactionFromTx(tx, sender, block.Hash(), block.NumberU64(), block.Time(), index, block.BaseFee(), config.ChainID) + } + } + txs := block.Transactions() + transactions := make([]interface{}, len(txs)) + for i, tx := range txs { + tx, err := formatTx(i, tx) + if err != nil { + return nil, err + } + transactions[i] = tx + } + fields["transactions"] = transactions + } + uncles := block.Uncles() + uncleHashes := make([]common.Hash, len(uncles)) + for i, uncle := range uncles { + uncleHashes[i] = uncle.Hash() + } + fields["uncles"] = uncleHashes + if block.Withdrawals() != nil { + fields["withdrawals"] = block.Withdrawals() + } + return fields, nil +} + +// GasBudget tracks the remaining gas allowed across all simulated blocks. +type GasBudget struct { + remaining uint64 +} + +// NewGasBudget creates a gas budget with the given cap. A cap of 0 is unlimited. +func NewGasBudget(gasCap uint64) *GasBudget { + if gasCap == 0 { + gasCap = math.MaxUint64 + } + return &GasBudget{remaining: gasCap} +} + +// Cap returns the given gas value clamped to the remaining budget. +func (b *GasBudget) Cap(gas uint64) uint64 { + if gas > b.remaining { + return b.remaining + } + return gas +} + +// Consume deducts the given amount from the budget. +func (b *GasBudget) Consume(amount uint64) error { + if amount > b.remaining { + return fmt.Errorf("RPC gas cap exhausted: need %d, remaining %d", amount, b.remaining) + } + b.remaining -= amount + return nil +} diff --git a/rpc/types/simulate_errors.go b/rpc/types/simulate_errors.go new file mode 100644 index 0000000000..03f869b6b1 --- /dev/null +++ b/rpc/types/simulate_errors.go @@ -0,0 +1,130 @@ +package types + +import ( + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/vm" +) + +// CallError is an error type used in simulated call results. +type CallError struct { + Message string `json:"message"` + Code int `json:"code"` + Data string `json:"data,omitempty"` +} + +// InvalidTxError is returned when a transaction fails validation. +type InvalidTxError struct { + Message string `json:"message"` + Code int `json:"code"` +} + +func (e *InvalidTxError) Error() string { return e.Message } +func (e *InvalidTxError) ErrorCode() int { return e.Code } + +// Simulation error codes matching go-ethereum. +const ( + ErrCodeNonceTooLow = -38010 + ErrCodeNonceTooHigh = -38011 + ErrCodeIntrinsicGas = -38013 + ErrCodeInsufficientFunds = -38014 + ErrCodeBlockGasLimitReached = -38015 + ErrCodeBlockNumberInvalid = -38020 + ErrCodeBlockTimestampInvalid = -38021 + ErrCodeSenderIsNotEOA = -38024 + ErrCodeMaxInitCodeSizeExceeded = -38025 + ErrCodeClientLimitExceeded = -38026 + ErrCodeInternalError = -32603 + ErrCodeInvalidParams = -32602 + ErrCodeVMError = -32015 + ErrCodeServerError = -32000 +) + +// TxValidationError maps core transaction validation errors to JSON-RPC error codes. +func TxValidationError(err error) *InvalidTxError { + if err == nil { + return nil + } + switch { + case errors.Is(err, core.ErrNonceTooHigh): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeNonceTooHigh} + case errors.Is(err, core.ErrNonceTooLow): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeNonceTooLow} + case errors.Is(err, core.ErrSenderNoEOA): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeSenderIsNotEOA} + case errors.Is(err, core.ErrFeeCapVeryHigh): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeInvalidParams} + case errors.Is(err, core.ErrTipVeryHigh): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeInvalidParams} + case errors.Is(err, core.ErrTipAboveFeeCap): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeInvalidParams} + case errors.Is(err, core.ErrFeeCapTooLow): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeInvalidParams} + case errors.Is(err, core.ErrInsufficientFunds): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeInsufficientFunds} + case errors.Is(err, core.ErrIntrinsicGas): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeIntrinsicGas} + case errors.Is(err, core.ErrInsufficientFundsForTransfer): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeInsufficientFunds} + case errors.Is(err, core.ErrMaxInitCodeSizeExceeded): + return &InvalidTxError{Message: err.Error(), Code: ErrCodeMaxInitCodeSizeExceeded} + } + return &InvalidTxError{ + Message: err.Error(), + Code: ErrCodeInternalError, + } +} + +// InvalidParamsError is returned for invalid RPC parameters. +type InvalidParamsError struct{ Message string } + +func (e *InvalidParamsError) Error() string { return e.Message } +func (e *InvalidParamsError) ErrorCode() int { return ErrCodeInvalidParams } + +// ClientLimitExceededError is returned when the client limit is exceeded. +type ClientLimitExceededError struct{ Message string } + +func (e *ClientLimitExceededError) Error() string { return e.Message } +func (e *ClientLimitExceededError) ErrorCode() int { return ErrCodeClientLimitExceeded } + +// InvalidBlockNumberError is returned for invalid block numbers. +type InvalidBlockNumberError struct{ Message string } + +func (e *InvalidBlockNumberError) Error() string { return e.Message } +func (e *InvalidBlockNumberError) ErrorCode() int { return ErrCodeBlockNumberInvalid } + +// InvalidBlockTimestampError is returned for invalid block timestamps. +type InvalidBlockTimestampError struct{ Message string } + +func (e *InvalidBlockTimestampError) Error() string { return e.Message } +func (e *InvalidBlockTimestampError) ErrorCode() int { return ErrCodeBlockTimestampInvalid } + +// BlockGasLimitReachedError is returned when block gas limit is reached. +type BlockGasLimitReachedError struct{ Message string } + +func (e *BlockGasLimitReachedError) Error() string { return e.Message } +func (e *BlockGasLimitReachedError) ErrorCode() int { return ErrCodeBlockGasLimitReached } + +type ServerError struct{ Message string } + +func (e *ServerError) Error() string { return e.Message } +func (e *ServerError) ErrorCode() int { return ErrCodeServerError } + +// NewRevertError creates a CallError from EVM revert data. +func NewRevertError(revert []byte) *CallError { + err := vm.ErrExecutionReverted + + reason, errUnpack := abi.UnpackRevert(revert) + if errUnpack == nil { + err = fmt.Errorf("%w: %v", vm.ErrExecutionReverted, reason) + } + return &CallError{ + Message: err.Error(), + Code: 3, + Data: hexutil.Encode(revert), + } +} diff --git a/rpc/types/simulate_test.go b/rpc/types/simulate_test.go new file mode 100644 index 0000000000..5c147eedb0 --- /dev/null +++ b/rpc/types/simulate_test.go @@ -0,0 +1,1024 @@ +package types + +import ( + "crypto/ecdsa" + "encoding/hex" + "encoding/json" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" + "github.com/holiman/uint256" + "github.com/stretchr/testify/require" +) + +// --------------------------------------------------------------------------- +// GasBudget +// --------------------------------------------------------------------------- + +func TestNewGasBudget_Unlimited(t *testing.T) { + b := NewGasBudget(0) + // A zero cap means unlimited – Cap should return any requested amount as-is. + require.Equal(t, uint64(1_000_000), b.Cap(1_000_000)) +} + +func TestNewGasBudget_Cap(t *testing.T) { + b := NewGasBudget(100) + // Requesting more than the budget should clamp to the remaining amount. + require.Equal(t, uint64(100), b.Cap(999)) + // Requesting exactly the budget is fine. + require.Equal(t, uint64(100), b.Cap(100)) + // Requesting less than the budget passes through. + require.Equal(t, uint64(50), b.Cap(50)) +} + +func TestGasBudget_Consume(t *testing.T) { + b := NewGasBudget(100) + + require.NoError(t, b.Consume(30)) + require.Equal(t, uint64(70), b.Cap(999)) + + require.NoError(t, b.Consume(70)) + require.Equal(t, uint64(0), b.Cap(999)) + + // One more consume should exceed the budget. + err := b.Consume(1) + require.Error(t, err) + require.Contains(t, err.Error(), "RPC gas cap exhausted") +} + +func TestGasBudget_ConsumeExact(t *testing.T) { + b := NewGasBudget(50) + require.NoError(t, b.Consume(50)) + require.Error(t, b.Consume(1)) +} + +// --------------------------------------------------------------------------- +// SimBlockOverrides.MakeHeader +// --------------------------------------------------------------------------- + +func TestSimBlockOverrides_MakeHeader_NilOverrides(t *testing.T) { + base := ðtypes.Header{Number: big.NewInt(5), Time: 100} + var o *SimBlockOverrides + result := o.MakeHeader(base) + require.Equal(t, base.Number, result.Number) + require.Equal(t, base.Time, result.Time) +} + +func TestSimBlockOverrides_MakeHeader_AllFields(t *testing.T) { + base := ðtypes.Header{ + Number: big.NewInt(5), + Time: 100, + } + newNumber := (*hexutil.Big)(big.NewInt(42)) + newTime := hexutil.Uint64(200) + newGasLimit := hexutil.Uint64(8_000_000) + feeRecipient := common.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + prevRandao := common.HexToHash("0x1234") + baseFee := (*hexutil.Big)(big.NewInt(1e9)) + + o := &SimBlockOverrides{ + Number: newNumber, + Time: &newTime, + GasLimit: &newGasLimit, + FeeRecipient: &feeRecipient, + PrevRandao: &prevRandao, + BaseFeePerGas: baseFee, + } + + result := o.MakeHeader(base) + + require.Equal(t, big.NewInt(42), result.Number) + require.Equal(t, uint64(200), result.Time) + require.Equal(t, uint64(8_000_000), result.GasLimit) + require.Equal(t, feeRecipient, result.Coinbase) + require.Equal(t, prevRandao, result.MixDigest) + require.Equal(t, big.NewInt(1e9), result.BaseFee) + + // The original header must not be mutated. + require.Equal(t, big.NewInt(5), base.Number) +} + +func TestSimBlockOverrides_MakeHeader_PartialOverride(t *testing.T) { + base := ðtypes.Header{Number: big.NewInt(10), Time: 50} + newTime := hexutil.Uint64(99) + o := &SimBlockOverrides{Time: &newTime} + result := o.MakeHeader(base) + // Number is unchanged, only time is overridden. + require.Equal(t, big.NewInt(10), result.Number) + require.Equal(t, uint64(99), result.Time) +} + +// --------------------------------------------------------------------------- +// SimStateOverride.Apply +// --------------------------------------------------------------------------- + +func TestSimStateOverride_Nil(t *testing.T) { + var diff *SimStateOverride + err := diff.Apply(nil, vm.PrecompiledContracts{}) + require.NoError(t, err) +} + +func TestSimStateOverride_StatePlusStateDiff_Error(t *testing.T) { + addr := common.HexToAddress("0xaabbcc") + stateKey := common.HexToHash("0x01") + stateVal := common.HexToHash("0xff") + + diff := SimStateOverride{ + addr: SimOverrideAccount{ + State: map[common.Hash]common.Hash{stateKey: stateVal}, + StateDiff: map[common.Hash]common.Hash{stateKey: stateVal}, + }, + } + err := diff.Apply(nil, vm.PrecompiledContracts{}) + require.Error(t, err) + require.Contains(t, err.Error(), "both 'state' and 'stateDiff'") +} + +func TestSimStateOverride_MoveNonPrecompileError(t *testing.T) { + addr := common.HexToAddress("0xaabbcc") + dest := common.HexToAddress("0xddeeff") + diff := SimStateOverride{ + addr: SimOverrideAccount{ + MovePrecompileTo: &dest, + }, + } + err := diff.Apply(nil, vm.PrecompiledContracts{}) + require.Error(t, err) + require.Contains(t, err.Error(), "not a precompile") +} + +// TestSimStateOverride_BalanceOverflow verifies that an account balance +// exceeding uint256 max triggers an InvalidParamsError from Apply. +func TestSimStateOverride_BalanceOverflow(t *testing.T) { + addr := common.HexToAddress("0xaabbccdd") + // 2^256 overflows uint256 + overflow := new(big.Int).Lsh(big.NewInt(1), 256) + bal := (*hexutil.Big)(overflow) + diff := SimStateOverride{ + addr: SimOverrideAccount{Balance: bal}, + } + err := diff.Apply(nil, vm.PrecompiledContracts{}) + require.Error(t, err) + require.Contains(t, err.Error(), "overflows uint256") +} + +// --------------------------------------------------------------------------- +// SimCallResult JSON marshalling +// --------------------------------------------------------------------------- + +func TestSimCallResult_MarshalJSON_NilLogs(t *testing.T) { + r := &SimCallResult{ + ReturnValue: hexutil.Bytes{0x01}, + Logs: nil, + GasUsed: hexutil.Uint64(21000), + Status: hexutil.Uint64(1), + } + bz, err := json.Marshal(r) + require.NoError(t, err) + + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + // logs must be an empty array, not null. + require.Equal(t, `[]`, string(decoded["logs"])) +} + +func TestSimCallResult_MarshalJSON_WithLogs(t *testing.T) { + log := ðtypes.Log{ + Address: common.HexToAddress("0xdeadbeef"), + Topics: []common.Hash{common.HexToHash("0x1234")}, + Data: []byte{0xaa, 0xbb}, + } + r := &SimCallResult{ + Logs: []*SimLog{NewSimLog(log, 0x1234)}, + Status: hexutil.Uint64(1), + } + bz, err := json.Marshal(r) + require.NoError(t, err) + + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + + var logs []json.RawMessage + require.NoError(t, json.Unmarshal(decoded["logs"], &logs)) + require.Len(t, logs, 1) + + var logObj map[string]json.RawMessage + require.NoError(t, json.Unmarshal(logs[0], &logObj)) + require.Equal(t, `"0x1234"`, string(logObj["blockTimestamp"])) +} + +func TestNewSimLog_NilTopics(t *testing.T) { + log := ðtypes.Log{ + Address: common.HexToAddress("0xdeadbeef"), + Topics: nil, + } + sl := NewSimLog(log, 100) + bz, err := json.Marshal(sl) + require.NoError(t, err) + + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + require.Equal(t, `[]`, string(decoded["topics"])) +} + +func TestSimCallResult_MarshalJSON_WithError(t *testing.T) { + callErr := &CallError{Message: "execution reverted", Code: 3, Data: "0xdeadbeef"} + r := &SimCallResult{ + Status: hexutil.Uint64(0), + Error: callErr, + } + bz, err := json.Marshal(r) + require.NoError(t, err) + + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + require.Contains(t, string(decoded["error"]), "execution reverted") +} + +// --------------------------------------------------------------------------- +// Error types +// --------------------------------------------------------------------------- + +func TestInvalidParamsError(t *testing.T) { + e := &InvalidParamsError{Message: "bad param"} + require.Equal(t, ErrCodeInvalidParams, e.ErrorCode()) + require.Equal(t, "bad param", e.Error()) +} + +func TestClientLimitExceededError(t *testing.T) { + e := &ClientLimitExceededError{Message: "too many blocks"} + require.Equal(t, ErrCodeClientLimitExceeded, e.ErrorCode()) + require.Equal(t, "too many blocks", e.Error()) +} + +func TestInvalidBlockNumberError(t *testing.T) { + e := &InvalidBlockNumberError{Message: "invalid block"} + require.Equal(t, ErrCodeBlockNumberInvalid, e.ErrorCode()) + require.Equal(t, "invalid block", e.Error()) +} + +func TestInvalidBlockTimestampError(t *testing.T) { + e := &InvalidBlockTimestampError{Message: "timestamp out of order"} + require.Equal(t, ErrCodeBlockTimestampInvalid, e.ErrorCode()) + require.Equal(t, "timestamp out of order", e.Error()) +} + +func TestBlockGasLimitReachedError(t *testing.T) { + e := &BlockGasLimitReachedError{Message: "block gas limit reached"} + require.Equal(t, ErrCodeBlockGasLimitReached, e.ErrorCode()) + require.Equal(t, "block gas limit reached", e.Error()) +} + +func TestInvalidTxError(t *testing.T) { + e := &InvalidTxError{Message: "nonce too low", Code: ErrCodeNonceTooLow} + require.Equal(t, ErrCodeNonceTooLow, e.ErrorCode()) + require.Equal(t, "nonce too low", e.Error()) +} + +// --------------------------------------------------------------------------- +// TxValidationError +// --------------------------------------------------------------------------- + +func TestTxValidationError_Nil(t *testing.T) { + require.Nil(t, TxValidationError(nil)) +} + +func TestTxValidationError_Unknown(t *testing.T) { + unknownErr := &unknownError{msg: "something weird"} + result := TxValidationError(unknownErr) + require.NotNil(t, result) + require.Equal(t, ErrCodeInternalError, result.Code) +} + +// unknownError is a local error type for testing TxValidationError fallback. +type unknownError struct{ msg string } + +func (e *unknownError) Error() string { return e.msg } + +// --------------------------------------------------------------------------- +// NewRevertError +// --------------------------------------------------------------------------- + +func TestNewRevertError_UnpackableData(t *testing.T) { + // Random bytes that can't be ABI-decoded as a revert reason. + data := []byte{0xde, 0xad, 0xbe, 0xef} + e := NewRevertError(data) + require.Equal(t, 3, e.Code) + require.Contains(t, e.Message, vm.ErrExecutionReverted.Error()) + require.Equal(t, hexutil.Encode(data), e.Data) +} + +func TestNewRevertError_EmptyData(t *testing.T) { + e := NewRevertError([]byte{}) + require.Equal(t, 3, e.Code) +} + +// --------------------------------------------------------------------------- +// SimOpts JSON round-trip +// --------------------------------------------------------------------------- + +func TestSimOpts_JSONRoundTrip(t *testing.T) { + opts := SimOpts{ + BlockStateCalls: []SimBlock{{}, {}}, + TraceTransfers: true, + Validation: true, + ReturnFullTransactions: false, + } + bz, err := json.Marshal(opts) + require.NoError(t, err) + + var decoded SimOpts + require.NoError(t, json.Unmarshal(bz, &decoded)) + require.Equal(t, opts.TraceTransfers, decoded.TraceTransfers) + require.Equal(t, opts.Validation, decoded.Validation) + require.Equal(t, opts.ReturnFullTransactions, decoded.ReturnFullTransactions) + require.Len(t, decoded.BlockStateCalls, 2) +} + +// --------------------------------------------------------------------------- +// SimBlock JSON round-trip +// --------------------------------------------------------------------------- + +func TestSimBlock_JSONRoundTrip_WithOverrides(t *testing.T) { + num := (*hexutil.Big)(big.NewInt(99)) + ts := hexutil.Uint64(12345) + block := SimBlock{ + BlockOverrides: &SimBlockOverrides{ + Number: num, + Time: &ts, + }, + } + bz, err := json.Marshal(block) + require.NoError(t, err) + + var decoded SimBlock + require.NoError(t, json.Unmarshal(bz, &decoded)) + require.NotNil(t, decoded.BlockOverrides) + require.Equal(t, big.NewInt(99), decoded.BlockOverrides.Number.ToInt()) + require.Equal(t, hexutil.Uint64(12345), *decoded.BlockOverrides.Time) +} + +// --------------------------------------------------------------------------- +// TxValidationError - all error codes +// --------------------------------------------------------------------------- + +func TestTxValidationError_AllCodes(t *testing.T) { + testCases := []struct { + err error + expCode int + }{ + {core.ErrNonceTooHigh, ErrCodeNonceTooHigh}, + {core.ErrNonceTooLow, ErrCodeNonceTooLow}, + {core.ErrSenderNoEOA, ErrCodeSenderIsNotEOA}, + {core.ErrFeeCapVeryHigh, ErrCodeInvalidParams}, + {core.ErrTipVeryHigh, ErrCodeInvalidParams}, + {core.ErrTipAboveFeeCap, ErrCodeInvalidParams}, + {core.ErrFeeCapTooLow, ErrCodeInvalidParams}, + {core.ErrInsufficientFunds, ErrCodeInsufficientFunds}, + {core.ErrIntrinsicGas, ErrCodeIntrinsicGas}, + {core.ErrInsufficientFundsForTransfer, ErrCodeInsufficientFunds}, + {core.ErrMaxInitCodeSizeExceeded, ErrCodeMaxInitCodeSizeExceeded}, + } + for _, tc := range testCases { + result := TxValidationError(tc.err) + require.NotNil(t, result) + require.Equal(t, tc.expCode, result.Code) + } +} + +// --------------------------------------------------------------------------- +// RPCMarshalHeader +// --------------------------------------------------------------------------- + +func TestRPCMarshalHeader_Basic(t *testing.T) { + header := ðtypes.Header{ + Number: big.NewInt(10), + Time: 12345, + GasLimit: 8_000_000, + GasUsed: 21_000, + Difficulty: big.NewInt(0), + } + result := RPCMarshalHeader(header) + require.Equal(t, (*hexutil.Big)(big.NewInt(10)), result["number"]) + require.Equal(t, hexutil.Uint64(8_000_000), result["gasLimit"]) + require.Equal(t, hexutil.Uint64(21_000), result["gasUsed"]) + require.Equal(t, hexutil.Uint64(12345), result["timestamp"]) +} + +func TestRPCMarshalHeader_WithOptionalFields(t *testing.T) { + baseFee := big.NewInt(1e9) + blobGasUsed := uint64(1000) + excessBlobGas := uint64(2000) + parentBeaconRoot := common.HexToHash("0xdeadbeef") + withdrawalsHash := ethtypes.EmptyWithdrawalsHash + + header := ðtypes.Header{ + Number: big.NewInt(20), + Time: 99999, + Difficulty: big.NewInt(0), + BaseFee: baseFee, + WithdrawalsHash: &withdrawalsHash, + BlobGasUsed: &blobGasUsed, + ExcessBlobGas: &excessBlobGas, + ParentBeaconRoot: &parentBeaconRoot, + } + result := RPCMarshalHeader(header) + require.Equal(t, (*hexutil.Big)(baseFee), result["baseFeePerGas"]) + require.Equal(t, &withdrawalsHash, result["withdrawalsRoot"]) + require.Equal(t, hexutil.Uint64(1000), result["blobGasUsed"]) + require.Equal(t, hexutil.Uint64(2000), result["excessBlobGas"]) + require.Equal(t, &parentBeaconRoot, result["parentBeaconBlockRoot"]) +} + +// --------------------------------------------------------------------------- +// RPCMarshalBlock +// --------------------------------------------------------------------------- + +func TestRPCMarshalBlock_NoTxs(t *testing.T) { + header := ðtypes.Header{ + Number: big.NewInt(5), + Difficulty: big.NewInt(0), + Time: 100, + } + block := ethtypes.NewBlock(header, nil, nil, nil) + result, err := RPCMarshalBlock(block, false, false, params.TestChainConfig) + require.NoError(t, err) + require.NotNil(t, result["number"]) + // inclTx=false means no "transactions" key filled with tx hashes + _, hasTransactions := result["transactions"] + require.False(t, hasTransactions) +} + +func TestRPCMarshalBlock_TxHashes(t *testing.T) { + header := ðtypes.Header{ + Number: big.NewInt(5), + Difficulty: big.NewInt(0), + Time: 100, + } + tx := ethtypes.NewTx(ðtypes.LegacyTx{Nonce: 1, Gas: 21000}) + block := ethtypes.NewBlock( + header, + ðtypes.Body{Transactions: ethtypes.Transactions{tx}}, + nil, trie.NewStackTrie(nil), + ) + result, err := RPCMarshalBlock(block, true, false, params.TestChainConfig) + require.NoError(t, err) + txs, ok := result["transactions"].([]interface{}) + require.True(t, ok) + require.Len(t, txs, 1) + // Hash-only mode: element is a common.Hash + _, isHash := txs[0].(common.Hash) + require.True(t, isHash) +} + +func TestRPCMarshalBlock_FullTxs(t *testing.T) { + chainConfig := params.TestChainConfig + header := ðtypes.Header{ + Number: big.NewInt(5), + Difficulty: big.NewInt(0), + Time: 100, + } + // Sign a legacy tx so it has a valid sender + key, _ := ethKey() + signer := ethtypes.LatestSignerForChainID(chainConfig.ChainID) + legacyTx := ðtypes.LegacyTx{Nonce: 0, Gas: 21000, GasPrice: big.NewInt(1)} + tx, err := ethtypes.SignTx(ethtypes.NewTx(legacyTx), signer, key) + require.NoError(t, err) + + block := ethtypes.NewBlock( + header, + ðtypes.Body{Transactions: ethtypes.Transactions{tx}}, + nil, trie.NewStackTrie(nil), + ) + result, err := RPCMarshalBlock(block, true, true, chainConfig) + require.NoError(t, err) + txs, ok := result["transactions"].([]interface{}) + require.True(t, ok) + require.Len(t, txs, 1) + // Full tx mode: element is *RPCTransaction + _, isRPC := txs[0].(*RPCTransaction) + require.True(t, isRPC) +} + +func TestRPCMarshalBlock_WithWithdrawals(t *testing.T) { + header := ðtypes.Header{ + Number: big.NewInt(5), + Difficulty: big.NewInt(0), + Time: 100, + WithdrawalsHash: ðtypes.EmptyWithdrawalsHash, + } + withdrawals := ethtypes.Withdrawals{{Index: 1, Validator: 1, Address: common.Address{}, Amount: 100}} + block := ethtypes.NewBlock( + header, + ðtypes.Body{Withdrawals: withdrawals}, + nil, trie.NewStackTrie(nil), + ) + result, err := RPCMarshalBlock(block, false, false, params.TestChainConfig) + require.NoError(t, err) + require.NotNil(t, result["withdrawals"]) +} + +// --------------------------------------------------------------------------- +// SimBlockResult.MarshalJSON +// --------------------------------------------------------------------------- + +func TestSimBlockResult_MarshalJSON_TxHashes(t *testing.T) { + header := ðtypes.Header{ + Number: big.NewInt(1), + Difficulty: big.NewInt(0), + Time: 100, + } + block := ethtypes.NewBlock(header, nil, nil, nil) + r := &SimBlockResult{ + FullTx: false, + ChainConfig: params.TestChainConfig, + Block: block, + Calls: []SimCallResult{}, + Senders: map[common.Hash]common.Address{}, + } + bz, err := json.Marshal(r) + require.NoError(t, err) + require.NotNil(t, bz) + + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + require.Contains(t, decoded, "calls") +} + +func TestSimBlockResult_MarshalJSON_FullTx(t *testing.T) { + chainConfig := params.TestChainConfig + header := ðtypes.Header{ + Number: big.NewInt(1), + Difficulty: big.NewInt(0), + Time: 100, + } + + // Build a signed tx so RPCMarshalBlock can recover the sender + key, _ := ethKey() + signer := ethtypes.LatestSignerForChainID(chainConfig.ChainID) + tx, err := ethtypes.SignTx( + ethtypes.NewTx(ðtypes.LegacyTx{Nonce: 0, Gas: 21000, GasPrice: big.NewInt(1)}), + signer, key, + ) + require.NoError(t, err) + + sender, err := ethtypes.Sender(signer, tx) + require.NoError(t, err) + + block := ethtypes.NewBlock( + header, + ðtypes.Body{Transactions: ethtypes.Transactions{tx}}, + nil, trie.NewStackTrie(nil), + ) + + r := &SimBlockResult{ + FullTx: true, + ChainConfig: chainConfig, + Block: block, + Calls: []SimCallResult{}, + Senders: map[common.Hash]common.Address{tx.Hash(): sender}, + } + bz, err := json.Marshal(r) + require.NoError(t, err) + + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + + var txs []json.RawMessage + require.NoError(t, json.Unmarshal(decoded["transactions"], &txs)) + require.Len(t, txs, 1) + + var txObj map[string]json.RawMessage + require.NoError(t, json.Unmarshal(txs[0], &txObj)) + // blockTimestamp must equal block.Time() = 100 = 0x64 + require.Equal(t, `"0x64"`, string(txObj["blockTimestamp"])) +} + +// ethKey generates a throwaway ECDSA key for signing test transactions. +func ethKey() (*ecdsa.PrivateKey, common.Address) { + key, err := crypto.GenerateKey() + if err != nil { + panic(err) + } + return key, crypto.PubkeyToAddress(key.PublicKey) +} + +// --------------------------------------------------------------------------- +// SimStateOverride.has — MovePrecompileTo destination already in diff +// --------------------------------------------------------------------------- + +// fakePrecompile is a minimal vm.PrecompiledContract for testing. +type fakePrecompile struct{ addr common.Address } + +func (p *fakePrecompile) Address() common.Address { return p.addr } +func (p *fakePrecompile) Name() string { return "fake" } +func (p *fakePrecompile) RequiredGas(_ []byte) uint64 { return 0 } +func (p *fakePrecompile) Run(_ *vm.EVM, _ *vm.Contract, _ bool) ([]byte, error) { + return nil, nil +} + +// TestSimStateOverride_MovePrecompile_DestAlreadyInDiff verifies that when +// MovePrecompileTo targets an address that is explicitly listed in the +// SimStateOverride map, Apply returns an "already overridden" error. This +// exercises the diff.has() helper which otherwise has 0% coverage. +func TestSimStateOverride_MovePrecompile_DestAlreadyInDiff(t *testing.T) { + // addr1 is treated as a precompile; addr2 is also in the override map. + addr1 := common.HexToAddress("0x0000000000000000000000000000000000000001") + addr2 := common.HexToAddress("0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") + + diff := SimStateOverride{ + addr1: SimOverrideAccount{MovePrecompileTo: &addr2}, + addr2: SimOverrideAccount{}, + } + precompiles := vm.PrecompiledContracts{ + addr1: &fakePrecompile{addr: addr1}, + } + err := diff.Apply(nil, precompiles) + require.Error(t, err) + require.Contains(t, err.Error(), "already overridden") +} + +// --------------------------------------------------------------------------- +// newRPCTransaction — DynamicFee / AccessList / effectiveGasPrice branches +// --------------------------------------------------------------------------- + +// TestRPCMarshalBlock_DynamicFeeTx exercises newRPCTransaction for +// DynamicFeeTxType (including the effectiveGasPrice path) via +// RPCMarshalBlock with fullTx=true. +func TestRPCMarshalBlock_DynamicFeeTx(t *testing.T) { + chainID := big.NewInt(1) + signer := ethtypes.NewLondonSigner(chainID) + key, _ := ethKey() + + // tip + baseFee == gasFeeCap: fee = min(tip+base, feeCap) = feeCap = baseFee + baseFee := big.NewInt(2e9) + tip := big.NewInt(0) + feeCap := new(big.Int).Add(tip, baseFee) // tip+base == feeCap + + rawTx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: chainID, + Nonce: 0, + Gas: 21000, + GasFeeCap: feeCap, + GasTipCap: tip, + }) + signed, err := ethtypes.SignTx(rawTx, signer, key) + require.NoError(t, err) + + header := ðtypes.Header{ + Number: big.NewInt(10), + Difficulty: big.NewInt(0), + BaseFee: baseFee, + } + body := ðtypes.Body{Transactions: ethtypes.Transactions{signed}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + cfg := params.MainnetChainConfig + fields, err := RPCMarshalBlock(block, true, true, cfg) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + require.Len(t, txs, 1) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + // With baseFee, GasPrice = effectiveGasPrice = min(tip+base, feeCap). + require.NotNil(t, rpcTx.GasFeeCap) + require.NotNil(t, rpcTx.GasTipCap) +} + +// TestRPCMarshalBlock_DynamicFeeTx_CapClamped tests the branch of +// effectiveGasPrice where tip+baseFee > gasFeeCap, so the result is clamped +// to gasFeeCap. +func TestRPCMarshalBlock_DynamicFeeTx_CapClamped(t *testing.T) { + chainID := big.NewInt(1) + signer := ethtypes.NewLondonSigner(chainID) + key, _ := ethKey() + + // tip + baseFee > feeCap → effectiveGasPrice = feeCap + feeCap := big.NewInt(1e9) + tip := big.NewInt(5e8) + baseFee := big.NewInt(2e9) // tip+base = 2.5e9 > 1e9 + + rawTx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: chainID, + Nonce: 0, + Gas: 21000, + GasFeeCap: feeCap, + GasTipCap: tip, + }) + signed, err := ethtypes.SignTx(rawTx, signer, key) + require.NoError(t, err) + + header := ðtypes.Header{ + Number: big.NewInt(10), + Difficulty: big.NewInt(0), + BaseFee: baseFee, + } + body := ðtypes.Body{Transactions: ethtypes.Transactions{signed}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + cfg := params.MainnetChainConfig + fields, err := RPCMarshalBlock(block, true, true, cfg) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + require.Equal(t, (*hexutil.Big)(feeCap), rpcTx.GasPrice) +} + +// TestRPCMarshalBlock_AccessListTx exercises newRPCTransaction for +// AccessListTxType via RPCMarshalBlock with fullTx=true. +func TestRPCMarshalBlock_AccessListTx(t *testing.T) { + chainID := big.NewInt(1) + signer := ethtypes.NewEIP2930Signer(chainID) + key, from := ethKey() + + rawTx := ethtypes.NewTx(ðtypes.AccessListTx{ + ChainID: chainID, + Nonce: 0, + Gas: 21000, + GasPrice: big.NewInt(1e9), + AccessList: ethtypes.AccessList{ + {Address: from, StorageKeys: []common.Hash{{0x01}}}, + }, + }) + signed, err := ethtypes.SignTx(rawTx, signer, key) + require.NoError(t, err) + + header := ðtypes.Header{Number: big.NewInt(5), Difficulty: big.NewInt(0)} + body := ðtypes.Body{Transactions: ethtypes.Transactions{signed}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + cfg := params.MainnetChainConfig + fields, err := RPCMarshalBlock(block, true, true, cfg) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + require.NotNil(t, rpcTx.Accesses) + require.NotNil(t, rpcTx.YParity) +} + +// TestRPCMarshalBlock_LegacyTx_WithChainID exercises newRPCTransaction for +// LegacyTxType with a non-zero chain ID (EIP-155), which sets result.ChainID. +func TestRPCMarshalBlock_LegacyTx_WithChainID(t *testing.T) { + chainID := big.NewInt(1) + signer := ethtypes.NewEIP155Signer(chainID) + key, _ := ethKey() + + rawTx := ethtypes.NewTx(ðtypes.LegacyTx{ + Nonce: 0, + Gas: 21000, + GasPrice: big.NewInt(1e9), + }) + signed, err := ethtypes.SignTx(rawTx, signer, key) + require.NoError(t, err) + + header := ðtypes.Header{Number: big.NewInt(3), Difficulty: big.NewInt(0)} + body := ðtypes.Body{Transactions: ethtypes.Transactions{signed}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + cfg := params.MainnetChainConfig + fields, err := RPCMarshalBlock(block, true, true, cfg) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + require.NotNil(t, rpcTx.ChainID) +} + +// TestRPCMarshalBlock_SetCodeTx exercises newRPCTransaction for SetCodeTxType +// via RPCMarshalBlock with fullTx=true. +func TestRPCMarshalBlock_SetCodeTx(t *testing.T) { + chainID := big.NewInt(1) + baseFee := big.NewInt(1e9) + + // SetCodeTx without signing: sender recovery yields zero address. + rawTx := ethtypes.NewTx(ðtypes.SetCodeTx{ + ChainID: uint256.NewInt(1), + Nonce: 0, + Gas: 21000, + GasFeeCap: uint256.NewInt(2e9), + GasTipCap: uint256.NewInt(1e8), + }) + + header := ðtypes.Header{ + Number: big.NewInt(10), + Difficulty: big.NewInt(0), + BaseFee: baseFee, + } + body := ðtypes.Body{Transactions: ethtypes.Transactions{rawTx}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + cfg := params.ChainConfig{ + ChainID: chainID, + LondonBlock: big.NewInt(0), + CancunTime: new(uint64), + PragueTime: new(uint64), + BerlinBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + } + fields, err := RPCMarshalBlock(block, true, true, &cfg) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + require.Len(t, txs, 1) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + require.NotNil(t, rpcTx.GasFeeCap) + require.NotNil(t, rpcTx.GasTipCap) +} + +// TestRPCMarshalBlock_BlobTx exercises newRPCTransaction for BlobTxType +// via RPCMarshalBlock with fullTx=true. +func TestRPCMarshalBlock_BlobTx(t *testing.T) { + chainID := big.NewInt(1) + baseFee := big.NewInt(1e9) + blobFeeCap := big.NewInt(1e8) + + rawTx := ethtypes.NewTx(ðtypes.BlobTx{ + ChainID: uint256.NewInt(1), + Nonce: 0, + Gas: 21000, + GasFeeCap: uint256.NewInt(2e9), + GasTipCap: uint256.NewInt(1e8), + BlobFeeCap: uint256.MustFromBig(blobFeeCap), + BlobHashes: []common.Hash{common.HexToHash("0xab")}, + }) + + header := ðtypes.Header{ + Number: big.NewInt(10), + Difficulty: big.NewInt(0), + BaseFee: baseFee, + } + body := ðtypes.Body{Transactions: ethtypes.Transactions{rawTx}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + cfg := params.ChainConfig{ + ChainID: chainID, + LondonBlock: big.NewInt(0), + CancunTime: new(uint64), + BerlinBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + } + fields, err := RPCMarshalBlock(block, true, true, &cfg) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + require.Len(t, txs, 1) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + require.NotNil(t, rpcTx.GasFeeCap) + require.NotNil(t, rpcTx.GasTipCap) + require.NotNil(t, rpcTx.MaxFeePerBlobGas) + require.Equal(t, (*hexutil.Big)(blobFeeCap), rpcTx.MaxFeePerBlobGas) + require.Len(t, rpcTx.BlobVersionedHashes, 1) + // blobVersionedHashes must serialize as an array, not null. + bz, err := json.Marshal(rpcTx) + require.NoError(t, err) + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + require.Equal(t, `["0x00000000000000000000000000000000000000000000000000000000000000ab"]`, string(decoded["blobVersionedHashes"])) + // With baseFee set, GasPrice = effectiveGasPrice = min(tip+base, feeCap). + require.NotNil(t, rpcTx.GasPrice) +} + +// TestRPCMarshalBlock_LegacyTx_BlobVersionedHashesAbsent verifies that legacy +// transactions omit the "blobVersionedHashes" field entirely (matching geth behaviour). +func TestRPCMarshalBlock_LegacyTx_BlobVersionedHashesAbsent(t *testing.T) { + chainID := big.NewInt(1) + key, _ := ethKey() + signer := ethtypes.NewEIP155Signer(chainID) + rawTx := ethtypes.NewTx(ðtypes.LegacyTx{Nonce: 0, Gas: 21000, GasPrice: big.NewInt(1e9)}) + tx, err := ethtypes.SignTx(rawTx, signer, key) + require.NoError(t, err) + + header := ðtypes.Header{Number: big.NewInt(3), Difficulty: big.NewInt(0)} + body := ðtypes.Body{Transactions: ethtypes.Transactions{tx}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + + fields, err := RPCMarshalBlock(block, true, true, params.MainnetChainConfig) + require.NoError(t, err) + txs, ok := fields["transactions"].([]any) + require.True(t, ok) + rpcTx, ok := txs[0].(*RPCTransaction) + require.True(t, ok) + require.Nil(t, rpcTx.BlobVersionedHashes) + + bz, err := json.Marshal(rpcTx) + require.NoError(t, err) + var decoded map[string]json.RawMessage + require.NoError(t, json.Unmarshal(bz, &decoded)) + _, present := decoded["blobVersionedHashes"] + require.False(t, present, "blobVersionedHashes must be absent for legacy transactions") +} + +// --------------------------------------------------------------------------- +// RPCMarshalHeader with RequestsHash +// --------------------------------------------------------------------------- + +// TestRPCMarshalHeader_WithRequestsHash covers the RequestsHash non-nil branch. +func TestRPCMarshalHeader_WithRequestsHash(t *testing.T) { + h := common.HexToHash("0xdeadbeef") + header := ðtypes.Header{ + Number: big.NewInt(1), + Difficulty: big.NewInt(0), + RequestsHash: &h, + } + result := RPCMarshalHeader(header) + require.Equal(t, &h, result["requestsHash"]) +} + +// --------------------------------------------------------------------------- +// MakeHeader with Difficulty override +// --------------------------------------------------------------------------- + +// TestMakeHeader_WithDifficulty covers the Difficulty override branch. +func TestMakeHeader_WithDifficulty(t *testing.T) { + base := ðtypes.Header{Number: big.NewInt(1), Difficulty: big.NewInt(0)} + diff := big.NewInt(999) + override := &SimBlockOverrides{Difficulty: (*hexutil.Big)(diff)} + result := override.MakeHeader(base) + require.Equal(t, diff, result.Difficulty) +} + +// --------------------------------------------------------------------------- +// NewRevertError with valid ABI-encoded reason +// --------------------------------------------------------------------------- + +// TestNewRevertError_WithReason covers the errUnpack == nil branch. +func TestNewRevertError_WithReason(t *testing.T) { + // ABI-encoded: Error(string) = selector + offset + length + data + // Selector: 0x08c379a0, reason: "out of gas" + data, _ := hex.DecodeString( + "08c379a0" + + "0000000000000000000000000000000000000000000000000000000000000020" + + "000000000000000000000000000000000000000000000000000000000000000a" + + "6f7574206f662067617300000000000000000000000000000000000000000000", + ) + e := NewRevertError(data) + require.Contains(t, e.Message, "out of gas") + require.Equal(t, 3, e.Code) +} + +// --------------------------------------------------------------------------- +// RPCMarshalBlock with uncle headers +// --------------------------------------------------------------------------- + +// TestRPCMarshalBlock_WithUncles covers the uncle-hash loop. +func TestRPCMarshalBlock_WithUncles(t *testing.T) { + chainID := big.NewInt(1) + cfg := ¶ms.ChainConfig{ + ChainID: chainID, + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + } + uncle := ðtypes.Header{Number: big.NewInt(1), Difficulty: big.NewInt(0)} + header := ðtypes.Header{ + Number: big.NewInt(2), + Difficulty: big.NewInt(0), + } + body := ðtypes.Body{Uncles: []*ethtypes.Header{uncle}} + block := ethtypes.NewBlock(header, body, nil, trie.NewStackTrie(nil)) + fields, err := RPCMarshalBlock(block, false, false, cfg) + require.NoError(t, err) + uncles, ok := fields["uncles"].([]common.Hash) + require.True(t, ok) + require.Len(t, uncles, 1) + require.Equal(t, uncle.Hash(), uncles[0]) +} diff --git a/rpc/types/simulate_tracer.go b/rpc/types/simulate_tracer.go new file mode 100644 index 0000000000..ff7fcb5d66 --- /dev/null +++ b/rpc/types/simulate_tracer.go @@ -0,0 +1,133 @@ +package types + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" +) + +var ( + // keccak256("Transfer(address,address,uint256)") + transferTopic = common.HexToHash("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") + // ERC-7528: synthetic address for traced ETH transfers. + transferAddress = common.HexToAddress("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE") + // TransferTraceAddress is exported so callers can filter traced + // transfer logs out of receipt blooms. + TransferTraceAddress = transferAddress +) + +// SimTracer is a simple tracer that records all logs and +// ether transfers. Transfers are recorded as if they +// were logs following the ERC-7528 standard. +type SimTracer struct { + // logs keeps logs for all open call frames. + // This lets us clear logs for failed calls. + logs [][]*ethtypes.Log + count uint + traceTransfers bool + blockNumber uint64 + blockHash common.Hash + txHash common.Hash + txIdx uint +} + +// NewSimTracer creates a new tracer for simulation. +func NewSimTracer(traceTransfers bool, blockNumber uint64, blockHash, txHash common.Hash, txIndex uint) *SimTracer { + return &SimTracer{ + traceTransfers: traceTransfers, + blockNumber: blockNumber, + blockHash: blockHash, + txHash: txHash, + txIdx: txIndex, + } +} + +// Hooks returns the tracing hooks for this tracer. +func (t *SimTracer) Hooks() *tracing.Hooks { + return &tracing.Hooks{ + OnEnter: t.onEnter, + OnExit: t.onExit, + OnLog: t.onLog, + } +} + +func (t *SimTracer) onEnter(depth int, typ byte, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + t.logs = append(t.logs, make([]*ethtypes.Log, 0)) + if vm.OpCode(typ) != vm.DELEGATECALL && value != nil && value.Cmp(common.Big0) > 0 { + t.captureTransfer(from, to, value) + } +} + +func (t *SimTracer) onExit(depth int, output []byte, gasUsed uint64, err error, reverted bool) { + if depth == 0 { + t.onEnd(reverted) + return + } + size := len(t.logs) + if size <= 1 { + return + } + // pop call + call := t.logs[size-1] + t.logs = t.logs[:size-1] + size-- + + // Clear logs if call failed. + if !reverted { + t.logs[size-1] = append(t.logs[size-1], call...) + } +} + +func (t *SimTracer) onEnd(reverted bool) { + if reverted && len(t.logs) > 0 { + t.logs[0] = nil + } +} + +func (t *SimTracer) onLog(log *ethtypes.Log) { + t.captureLog(log.Address, log.Topics, log.Data) +} + +func (t *SimTracer) captureLog(address common.Address, topics []common.Hash, data []byte) { + t.logs[len(t.logs)-1] = append(t.logs[len(t.logs)-1], ðtypes.Log{ + Address: address, + Topics: topics, + Data: data, + BlockNumber: t.blockNumber, + BlockHash: t.blockHash, + TxHash: t.txHash, + TxIndex: t.txIdx, + Index: t.count, + }) + t.count++ +} + +func (t *SimTracer) captureTransfer(from, to common.Address, value *big.Int) { + if !t.traceTransfers { + return + } + topics := []common.Hash{ + transferTopic, + common.BytesToHash(from.Bytes()), + common.BytesToHash(to.Bytes()), + } + t.captureLog(transferAddress, topics, common.BigToHash(value).Bytes()) +} + +// Reset prepares the tracer for the next transaction. +func (t *SimTracer) Reset(txHash common.Hash, txIdx uint) { + t.logs = nil + t.txHash = txHash + t.txIdx = txIdx +} + +// Logs returns the final logs for the current transaction. +func (t *SimTracer) Logs() []*ethtypes.Log { + if len(t.logs) == 0 { + return nil + } + return t.logs[0] +} diff --git a/rpc/types/simulate_tracer_test.go b/rpc/types/simulate_tracer_test.go new file mode 100644 index 0000000000..fd680b1bd8 --- /dev/null +++ b/rpc/types/simulate_tracer_test.go @@ -0,0 +1,246 @@ +package types + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/stretchr/testify/require" +) + +var ( + simTracerBlockHash = common.HexToHash("0xaabbccdd") + simTracerTxHash = common.HexToHash("0x11223344") + simTracerFrom = common.HexToAddress("0x1111111111111111111111111111111111111111") + simTracerTo = common.HexToAddress("0x2222222222222222222222222222222222222222") +) + +// --------------------------------------------------------------------------- +// Basic log capture +// --------------------------------------------------------------------------- + +func TestSimTracer_CapturesLogs(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + // Simulate entering a call frame. + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + + // Emit a log. + hooks.OnLog(ðtypes.Log{ + Address: simTracerTo, + Topics: []common.Hash{common.HexToHash("0xdeadbeef")}, + Data: []byte{0x01}, + }) + + // Exit the call frame without revert. + hooks.OnExit(0, nil, 21000, nil, false) + + logs := tracer.Logs() + require.Len(t, logs, 1) + require.Equal(t, simTracerTo, logs[0].Address) + require.Equal(t, simTracerBlockHash, logs[0].BlockHash) + require.Equal(t, simTracerTxHash, logs[0].TxHash) +} + +// --------------------------------------------------------------------------- +// Reverted call clears logs +// --------------------------------------------------------------------------- + +func TestSimTracer_RevertClearsLogs(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerTo}) + // Revert the top-level call. + hooks.OnExit(0, nil, 21000, vm.ErrExecutionReverted, true) + + logs := tracer.Logs() + require.Empty(t, logs) +} + +// --------------------------------------------------------------------------- +// Nested call: inner revert should NOT propagate logs to parent +// --------------------------------------------------------------------------- + +func TestSimTracer_NestedRevertDoesNotPropagate(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + // Outer call. + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 100000, big.NewInt(0)) + + // Inner call. + hooks.OnEnter(1, byte(vm.CALL), simTracerTo, simTracerFrom, nil, 50000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerFrom, Topics: []common.Hash{{0x01}}}) + // Inner call reverts – its log should be dropped. + hooks.OnExit(1, nil, 50000, vm.ErrExecutionReverted, true) + + // Outer call emits a log. + hooks.OnLog(ðtypes.Log{Address: simTracerTo, Topics: []common.Hash{{0x02}}}) + hooks.OnExit(0, nil, 100000, nil, false) + + logs := tracer.Logs() + require.Len(t, logs, 1) + require.Equal(t, common.Hash{0x02}, logs[0].Topics[0]) +} + +// --------------------------------------------------------------------------- +// Nested call success: inner logs propagate to parent +// --------------------------------------------------------------------------- + +func TestSimTracer_NestedSuccessPropagate(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 100000, big.NewInt(0)) + hooks.OnEnter(1, byte(vm.CALL), simTracerTo, simTracerFrom, nil, 50000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerFrom, Topics: []common.Hash{{0x01}}}) + hooks.OnExit(1, nil, 50000, nil, false) // inner succeeds + + hooks.OnLog(ðtypes.Log{Address: simTracerTo, Topics: []common.Hash{{0x02}}}) + hooks.OnExit(0, nil, 100000, nil, false) // outer succeeds + + logs := tracer.Logs() + require.Len(t, logs, 2) +} + +// --------------------------------------------------------------------------- +// Transfer tracing (traceTransfers = true) +// --------------------------------------------------------------------------- + +func TestSimTracer_TraceTransfers_Enabled(t *testing.T) { + tracer := NewSimTracer(true, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + value := big.NewInt(1e18) + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, value) + hooks.OnExit(0, nil, 21000, nil, false) + + logs := tracer.Logs() + // Expect exactly one synthetic transfer log (ERC-7528). + require.Len(t, logs, 1) + require.Equal(t, common.HexToAddress("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"), logs[0].Address) + require.Len(t, logs[0].Topics, 3) +} + +func TestSimTracer_TraceTransfers_Disabled(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + value := big.NewInt(1e18) + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, value) + hooks.OnExit(0, nil, 21000, nil, false) + + // No logs expected – transfer tracing is disabled. + logs := tracer.Logs() + require.Empty(t, logs) +} + +func TestSimTracer_TraceTransfers_ZeroValue(t *testing.T) { + tracer := NewSimTracer(true, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + // Zero value transfer – no synthetic log expected. + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + hooks.OnExit(0, nil, 21000, nil, false) + + require.Empty(t, tracer.Logs()) +} + +func TestSimTracer_TraceTransfers_DelegateCall(t *testing.T) { + tracer := NewSimTracer(true, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + // DELEGATECALL with non-zero value should NOT emit a transfer log. + hooks.OnEnter(0, byte(vm.DELEGATECALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(1e18)) + hooks.OnExit(0, nil, 21000, nil, false) + + require.Empty(t, tracer.Logs()) +} + +// --------------------------------------------------------------------------- +// Reset +// --------------------------------------------------------------------------- + +func TestSimTracer_Reset(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerTo}) + hooks.OnExit(0, nil, 21000, nil, false) + require.Len(t, tracer.Logs(), 1) + + newTxHash := common.HexToHash("0x99887766") + tracer.Reset(newTxHash, 1) + require.Empty(t, tracer.Logs()) +} + +// --------------------------------------------------------------------------- +// Log index counter across multiple calls +// --------------------------------------------------------------------------- + +func TestSimTracer_LogIndexIncreases(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerTo}) + hooks.OnLog(ðtypes.Log{Address: simTracerTo}) + hooks.OnExit(0, nil, 21000, nil, false) + + logs := tracer.Logs() + require.Len(t, logs, 2) + require.Equal(t, uint(0), logs[0].Index) + require.Equal(t, uint(1), logs[1].Index) +} + +func TestSimTracer_ResetKeepsCumulativeLogIndex(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerTo}) + hooks.OnExit(0, nil, 21000, nil, false) + require.Equal(t, uint(0), tracer.Logs()[0].Index) + + tracer.Reset(common.HexToHash("0x55"), 1) + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + hooks.OnLog(ðtypes.Log{Address: simTracerTo}) + hooks.OnExit(0, nil, 21000, nil, false) + + require.Equal(t, uint(1), tracer.Logs()[0].Index) +} + +// --------------------------------------------------------------------------- +// No logs returns nil when no frames +// --------------------------------------------------------------------------- + +func TestSimTracer_NoFrames_ReturnsNilLogs(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + require.Nil(t, tracer.Logs()) +} + +// --------------------------------------------------------------------------- +// onExit depth>0 with no nested frames (size <= 1 early return) +// --------------------------------------------------------------------------- + +func TestSimTracer_OnExit_DepthNonzero_SizeOne(t *testing.T) { + tracer := NewSimTracer(false, 1, simTracerBlockHash, simTracerTxHash, 0) + hooks := tracer.Hooks() + + // Enter the top-level call (depth 0): t.logs has 1 element. + hooks.OnEnter(0, byte(vm.CALL), simTracerFrom, simTracerTo, nil, 21000, big.NewInt(0)) + + // Exit at depth=1 without a prior OnEnter(1,...): size == 1 → early return. + hooks.OnExit(1, nil, 21000, nil, false) + + // Top-level exit. + hooks.OnExit(0, nil, 21000, nil, false) + + require.Empty(t, tracer.Logs()) +} diff --git a/rpc/types/types.go b/rpc/types/types.go index 5fdf4ce408..c27bbba026 100644 --- a/rpc/types/types.go +++ b/rpc/types/types.go @@ -22,10 +22,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/evmos/ethermint/x/evm/statedb" evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" ) // Copied the Account and StorageResult types since they are registered under an @@ -51,25 +53,30 @@ type StorageResult struct { // RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction type RPCTransaction struct { - BlockHash *common.Hash `json:"blockHash"` - BlockNumber *hexutil.Big `json:"blockNumber"` - From common.Address `json:"from"` - Gas hexutil.Uint64 `json:"gas"` - GasPrice *hexutil.Big `json:"gasPrice"` - GasFeeCap *hexutil.Big `json:"maxFeePerGas,omitempty"` - GasTipCap *hexutil.Big `json:"maxPriorityFeePerGas,omitempty"` - Hash common.Hash `json:"hash"` - Input hexutil.Bytes `json:"input"` - Nonce hexutil.Uint64 `json:"nonce"` - To *common.Address `json:"to"` - TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` - Value *hexutil.Big `json:"value"` - Type hexutil.Uint64 `json:"type"` - Accesses *ethtypes.AccessList `json:"accessList,omitempty"` - ChainID *hexutil.Big `json:"chainId,omitempty"` - V *hexutil.Big `json:"v"` - R *hexutil.Big `json:"r"` - S *hexutil.Big `json:"s"` + BlockHash *common.Hash `json:"blockHash"` + BlockNumber *hexutil.Big `json:"blockNumber"` + BlockTimestamp *hexutil.Uint64 `json:"blockTimestamp,omitempty"` + From common.Address `json:"from"` + Gas hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + GasFeeCap *hexutil.Big `json:"maxFeePerGas,omitempty"` + GasTipCap *hexutil.Big `json:"maxPriorityFeePerGas,omitempty"` + MaxFeePerBlobGas *hexutil.Big `json:"maxFeePerBlobGas,omitempty"` + Hash common.Hash `json:"hash"` + Input hexutil.Bytes `json:"input"` + Nonce hexutil.Uint64 `json:"nonce"` + To *common.Address `json:"to"` + TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` + Value *hexutil.Big `json:"value"` + Type hexutil.Uint64 `json:"type"` + Accesses *ethtypes.AccessList `json:"accessList,omitempty"` + BlobVersionedHashes []common.Hash `json:"blobVersionedHashes,omitempty"` + ChainID *hexutil.Big `json:"chainId,omitempty"` + AuthorizationList []ethtypes.SetCodeAuthorization `json:"authorizationList,omitempty"` + V *hexutil.Big `json:"v"` + R *hexutil.Big `json:"r"` + S *hexutil.Big `json:"s"` + YParity *hexutil.Uint64 `json:"yParity,omitempty"` } // StateOverride is the collection of overridden accounts. @@ -83,15 +90,16 @@ func (diff *StateOverride) Apply(db *statedb.StateDB) error { for addr, account := range *diff { // Override account nonce. if account.Nonce != nil { - db.SetNonce(addr, uint64(*account.Nonce)) + db.SetNonce(addr, uint64(*account.Nonce), tracing.NonceChangeUnspecified) } // Override account(contract) code. if account.Code != nil { - db.SetCode(addr, *account.Code) + db.SetCode(addr, *account.Code, tracing.CodeChangeUnspecified) } // Override account balance. if account.Balance != nil { - db.SetBalance(addr, (*big.Int)(*account.Balance)) + balance := (*big.Int)(*account.Balance) + db.SetBalance(addr, *uint256.MustFromBig(balance)) } if account.State != nil && account.StateDiff != nil { return fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex()) @@ -112,13 +120,14 @@ func (diff *StateOverride) Apply(db *statedb.StateDB) error { // BlockOverrides is a set of header fields to override. type BlockOverrides struct { - Number *hexutil.Big - Difficulty *hexutil.Big - Time *hexutil.Uint64 - GasLimit *hexutil.Uint64 - Coinbase *common.Address - Random *common.Hash - BaseFee *hexutil.Big + Number *hexutil.Big + Difficulty *hexutil.Big + Time *hexutil.Uint64 + GasLimit *hexutil.Uint64 + Coinbase *common.Address + Random *common.Hash + BaseFee *hexutil.Big + BlobBaseFee *hexutil.Big } // Apply overrides the given header fields into the given block context. @@ -147,6 +156,9 @@ func (diff *BlockOverrides) Apply(blockCtx *vm.BlockContext) { if diff.BaseFee != nil { blockCtx.BaseFee = diff.BaseFee.ToInt() } + if diff.BlobBaseFee != nil { + blockCtx.BlobBaseFee = diff.BlobBaseFee.ToInt() + } } // OverrideAccount indicates the overriding fields of account during the execution of @@ -164,10 +176,12 @@ type OverrideAccount struct { } type FeeHistoryResult struct { - OldestBlock *hexutil.Big `json:"oldestBlock"` - Reward [][]*hexutil.Big `json:"reward,omitempty"` - BaseFee []*hexutil.Big `json:"baseFeePerGas,omitempty"` - GasUsedRatio []float64 `json:"gasUsedRatio"` + OldestBlock *hexutil.Big `json:"oldestBlock"` + Reward [][]*hexutil.Big `json:"reward,omitempty"` + BaseFee []*hexutil.Big `json:"baseFeePerGas,omitempty"` + GasUsedRatio []float64 `json:"gasUsedRatio"` + BlobBaseFee []*hexutil.Big `json:"baseFeePerBlobGas"` + BlobGasUsedRatio []float64 `json:"blobGasUsedRatio"` } // SignTransactionResult represents a RLP encoded signed transaction. @@ -182,6 +196,13 @@ type OneFeeHistory struct { GasUsedRatio float64 // the ratio of gas used to the gas limit for each block } +// AccessListResult represents the access list and gas used for a transaction +type AccessListResult struct { + AccessList ethtypes.AccessList `json:"accessList"` + GasUsed hexutil.Uint64 `json:"gasUsed"` + Error string `json:"error,omitempty"` +} + type TraceConfig struct { evmtypes.TraceConfig TracerConfig json.RawMessage `json:"tracerConfig"` diff --git a/rpc/types/types_test.go b/rpc/types/types_test.go new file mode 100644 index 0000000000..6d12dd4849 --- /dev/null +++ b/rpc/types/types_test.go @@ -0,0 +1,27 @@ +package types + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/stretchr/testify/require" +) + +func TestBlockOverridesApplyBlobBaseFee(t *testing.T) { + t.Run("nil BlobBaseFee override does not change block context", func(t *testing.T) { + blockCtx := vm.BlockContext{BlobBaseFee: big.NewInt(0)} + diff := &BlockOverrides{BlobBaseFee: nil} + diff.Apply(&blockCtx) + require.Equal(t, big.NewInt(0), blockCtx.BlobBaseFee) + }) + + t.Run("non-nil BlobBaseFee override updates block context", func(t *testing.T) { + blockCtx := vm.BlockContext{BlobBaseFee: big.NewInt(0)} + blobBaseFee := (*hexutil.Big)(big.NewInt(42)) + diff := &BlockOverrides{BlobBaseFee: blobBaseFee} + diff.Apply(&blockCtx) + require.Equal(t, big.NewInt(42), blockCtx.BlobBaseFee) + }) +} diff --git a/rpc/types/utils.go b/rpc/types/utils.go index fb7b0facfc..423f25b418 100644 --- a/rpc/types/utils.go +++ b/rpc/types/utils.go @@ -26,6 +26,7 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -34,9 +35,9 @@ import ( tmrpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" + ethermint "github.com/evmos/ethermint/types" ) // ExceedBlockGasLimitError defines the error message when tx execution exceeds the block gas limit. @@ -63,16 +64,30 @@ func RawTxToEthTx(clientCtx client.Context, txBz tmtypes.Tx) ([]*evmtypes.MsgEth // EthHeaderFromTendermint is an util function that returns an Ethereum Header // from a tendermint Header. -func EthHeaderFromTendermint(header tmtypes.Header, bloom ethtypes.Bloom, baseFee *big.Int) *ethtypes.Header { +// +// TODO: TxHash is set from Comet DataHash (all txs), not the EVM-only trie root +// used by RPCBlockFromTendermintBlock. Affects HeaderByNumber, HeaderByHash, +// debug_getHeaderRlp, and newHeads. +func EthHeaderFromTendermint(header tmtypes.Header, bloom ethtypes.Bloom, baseFee *big.Int, miner sdk.AccAddress) *ethtypes.Header { txHash := ethtypes.EmptyRootHash - if len(header.DataHash) == 0 { + if len(header.DataHash) != 0 { txHash = common.BytesToHash(header.DataHash) } - + var ( + blockTime uint64 + err error + ) + time := header.Time + if !time.IsZero() { + blockTime, err = ethermint.SafeUint64(time.Unix()) + if err != nil { + panic(err) + } + } return ðtypes.Header{ ParentHash: common.BytesToHash(header.LastBlockID.Hash.Bytes()), UncleHash: ethtypes.EmptyUncleHash, - Coinbase: common.BytesToAddress(header.ProposerAddress), + Coinbase: common.BytesToAddress(miner), Root: common.BytesToHash(header.AppHash), TxHash: txHash, ReceiptHash: ethtypes.EmptyRootHash, @@ -81,11 +96,17 @@ func EthHeaderFromTendermint(header tmtypes.Header, bloom ethtypes.Bloom, baseFe Number: big.NewInt(header.Height), GasLimit: 0, GasUsed: 0, - Time: uint64(header.Time.UTC().Unix()), + Time: blockTime, Extra: []byte{}, MixDigest: common.Hash{}, Nonce: ethtypes.BlockNonce{}, BaseFee: baseFee, + + WithdrawalsHash: ðtypes.EmptyWithdrawalsHash, // EIP-4895 + BlobGasUsed: new(uint64), // EIP-4844 + ExcessBlobGas: new(uint64), // EIP-4844 + ParentBeaconRoot: ðtypes.EmptyRootHash, // EIP-4788 + RequestsHash: ðtypes.EmptyRequestsHash, // EIP-7685 } } @@ -115,46 +136,30 @@ func BlockMaxGasFromConsensusParams(goCtx context.Context, clientCtx client.Cont // FormatBlock creates an ethereum block from a tendermint header and ethereum-formatted // transactions. func FormatBlock( - header tmtypes.Header, size int, gasLimit int64, - gasUsed *big.Int, transactions []interface{}, bloom ethtypes.Bloom, - validatorAddr common.Address, baseFee *big.Int, + head *ethtypes.Header, + cometHash []byte, + size int, + transactions []interface{}, ) map[string]interface{} { - var transactionsRoot common.Hash - if len(transactions) == 0 { - transactionsRoot = ethtypes.EmptyRootHash - } else { - transactionsRoot = common.BytesToHash(header.DataHash) + s, err := ethermint.SafeIntToUint64(size) + if err != nil { + panic(err) } - result := map[string]interface{}{ - "number": hexutil.Uint64(header.Height), - "hash": hexutil.Bytes(header.Hash()), - "parentHash": common.BytesToHash(header.LastBlockID.Hash.Bytes()), - "nonce": ethtypes.BlockNonce{}, // PoW specific - "sha3Uncles": ethtypes.EmptyUncleHash, // No uncles in Tendermint - "logsBloom": bloom, - "stateRoot": hexutil.Bytes(header.AppHash), - "miner": validatorAddr, - "mixHash": common.Hash{}, - "difficulty": (*hexutil.Big)(big.NewInt(0)), - "extraData": "0x", - "size": hexutil.Uint64(size), - "gasLimit": hexutil.Uint64(gasLimit), // Static gas limit - "gasUsed": (*hexutil.Big)(gasUsed), - "timestamp": hexutil.Uint64(header.Time.Unix()), - "transactionsRoot": transactionsRoot, - "receiptsRoot": ethtypes.EmptyRootHash, - - "uncles": []common.Hash{}, - "transactions": transactions, - "totalDifficulty": (*hexutil.Big)(big.NewInt(0)), - } + fields := RPCMarshalHeader(head) + // Override with the CometBFT hash; RPCMarshalHeader sets "hash" to the + // Ethereum RLP hash which differs from the canonical Tendermint block hash. + fields["hash"] = common.BytesToHash(cometHash) + fields["size"] = hexutil.Uint64(s) + fields["transactions"] = transactions + fields["uncles"] = []common.Hash{} - if baseFee != nil { - result["baseFeePerGas"] = (*hexutil.Big)(baseFee) + // Ethermint has no real withdrawals; emit an empty array post-Shanghai. + if head.WithdrawalsHash != nil { + fields["withdrawals"] = ethtypes.Withdrawals{} } - return result + return fields } // NewTransactionFromMsg returns a transaction that will serialize to the RPC @@ -162,38 +167,21 @@ func FormatBlock( func NewTransactionFromMsg( msg *evmtypes.MsgEthereumTx, blockHash common.Hash, - blockNumber, index uint64, + blockNumber, blockTime, index uint64, baseFee *big.Int, chainID *big.Int, ) (*RPCTransaction, error) { - return NewRPCTransaction(msg, blockHash, blockNumber, index, baseFee, chainID) + return NewRPCTransaction(msg, blockHash, blockNumber, blockTime, index, baseFee, chainID) } -// NewTransactionFromData returns a transaction that will serialize to the RPC -// representation, with the given location metadata set (if available). -func NewRPCTransaction( - msg *evmtypes.MsgEthereumTx, blockHash common.Hash, blockNumber, index uint64, baseFee *big.Int, +func NewRPCTransactionFromTx( + tx *ethtypes.Transaction, sender common.Address, blockHash common.Hash, blockNumber, blockTime, index uint64, baseFee *big.Int, chainID *big.Int, ) (*RPCTransaction, error) { - tx := msg.AsTransaction() - // Determine the signer. For replay-protected transactions, use the most permissive - // signer, because we assume that signers are backwards-compatible with old - // transactions. For non-protected transactions, the frontier signer is used - // because the latest signer will reject the unprotected transactions. - var signer ethtypes.Signer - if tx.Protected() { - signer = ethtypes.LatestSignerForChainID(tx.ChainId()) - } else { - signer = ethtypes.FrontierSigner{} - } - from, err := msg.GetSenderLegacy(signer) - if err != nil { - return nil, err - } v, r, s := tx.RawSignatureValues() result := &RPCTransaction{ Type: hexutil.Uint64(tx.Type()), - From: from, + From: sender, Gas: hexutil.Uint64(tx.Gas()), GasPrice: (*hexutil.Big)(tx.GasPrice()), Hash: tx.Hash(), @@ -209,31 +197,92 @@ func NewRPCTransaction( if blockHash != (common.Hash{}) { result.BlockHash = &blockHash result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber)) + if blockTime > 0 { + result.BlockTimestamp = (*hexutil.Uint64)(&blockTime) + } result.TransactionIndex = (*hexutil.Uint64)(&index) } + yparity := hexutil.Uint64(v.Sign()) //#nosec G115 switch tx.Type() { case ethtypes.AccessListTxType: al := tx.AccessList() result.Accesses = &al result.ChainID = (*hexutil.Big)(tx.ChainId()) + result.YParity = &yparity case ethtypes.DynamicFeeTxType: al := tx.AccessList() result.Accesses = &al result.ChainID = (*hexutil.Big)(tx.ChainId()) + result.YParity = &yparity result.GasFeeCap = (*hexutil.Big)(tx.GasFeeCap()) result.GasTipCap = (*hexutil.Big)(tx.GasTipCap()) // if the transaction has been mined, compute the effective gas price if baseFee != nil && blockHash != (common.Hash{}) { - // price = min(tip, gasFeeCap - baseFee) + baseFee - price := math.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) + // price = min(tip + baseFee, gasFeeCap) + price := ethermint.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) result.GasPrice = (*hexutil.Big)(price) } else { result.GasPrice = (*hexutil.Big)(tx.GasFeeCap()) } + case ethtypes.SetCodeTxType: + al := tx.AccessList() + result.Accesses = &al + result.ChainID = (*hexutil.Big)(tx.ChainId()) + result.YParity = &yparity + result.GasFeeCap = (*hexutil.Big)(tx.GasFeeCap()) + result.GasTipCap = (*hexutil.Big)(tx.GasTipCap()) + if baseFee != nil && blockHash != (common.Hash{}) { + price := ethermint.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) + result.GasPrice = (*hexutil.Big)(price) + } else { + result.GasPrice = (*hexutil.Big)(tx.GasFeeCap()) + } + result.AuthorizationList = tx.SetCodeAuthorizations() + case ethtypes.BlobTxType: + al := tx.AccessList() + result.Accesses = &al + result.ChainID = (*hexutil.Big)(tx.ChainId()) + result.YParity = &yparity + result.GasFeeCap = (*hexutil.Big)(tx.GasFeeCap()) + result.GasTipCap = (*hexutil.Big)(tx.GasTipCap()) + if baseFee != nil && blockHash != (common.Hash{}) { + price := ethermint.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) + result.GasPrice = (*hexutil.Big)(price) + } else { + result.GasPrice = (*hexutil.Big)(tx.GasFeeCap()) + } + result.MaxFeePerBlobGas = (*hexutil.Big)(tx.BlobGasFeeCap()) + if hashes := tx.BlobHashes(); hashes != nil { + result.BlobVersionedHashes = hashes + } } return result, nil } +// NewTransactionFromData returns a transaction that will serialize to the RPC +// representation, with the given location metadata set (if available). +func NewRPCTransaction( + msg *evmtypes.MsgEthereumTx, blockHash common.Hash, blockNumber, blockTime, index uint64, baseFee *big.Int, + chainID *big.Int, +) (*RPCTransaction, error) { + tx := msg.AsTransaction() + // Determine the signer. For replay-protected transactions, use the most permissive + // signer, because we assume that signers are backwards-compatible with old + // transactions. For non-protected transactions, the frontier signer is used + // because the latest signer will reject the unprotected transactions. + var signer ethtypes.Signer + if tx.Protected() { + signer = ethtypes.LatestSignerForChainID(tx.ChainId()) + } else { + signer = ethtypes.FrontierSigner{} + } + from, err := msg.GetSenderLegacy(signer) + if err != nil { + return nil, err + } + return NewRPCTransactionFromTx(tx, from, blockHash, blockNumber, blockTime, index, baseFee, chainID) +} + // BaseFeeFromEvents parses the feemarket basefee from cosmos events func BaseFeeFromEvents(events []abci.Event) *big.Int { for _, event := range events { @@ -257,9 +306,9 @@ func BaseFeeFromEvents(events []abci.Event) *big.Int { // CheckTxFee is an internal function used to check whether the fee of // the given transaction is _reasonable_(under the cap). -func CheckTxFee(gasPrice *big.Int, gas uint64, cap float64) error { +func CheckTxFee(gasPrice *big.Int, gas uint64, feeCap float64) error { // Short circuit if there is no cap for transaction fee at all. - if cap == 0 { + if feeCap == 0 { return nil } totalfee := new(big.Float).SetInt(new(big.Int).Mul(gasPrice, new(big.Int).SetUint64(gas))) @@ -269,8 +318,8 @@ func CheckTxFee(gasPrice *big.Int, gas uint64, cap float64) error { feeEth := new(big.Float).Quo(totalfee, oneToken) // no need to check error from parsing feeFloat, _ := feeEth.Float64() - if feeFloat > cap { - return fmt.Errorf("tx fee (%.2f ether) exceeds the configured cap (%.2f ether)", feeFloat, cap) + if feeFloat > feeCap { + return fmt.Errorf("tx fee (%.2f ether) exceeds the configured cap (%.2f ether)", feeFloat, feeCap) } return nil } diff --git a/rpc/types/utils_test.go b/rpc/types/utils_test.go new file mode 100644 index 0000000000..689896336a --- /dev/null +++ b/rpc/types/utils_test.go @@ -0,0 +1,443 @@ +package types + +import ( + "encoding/json" + "math/big" + "testing" + + tmtypes "github.com/cometbft/cometbft/types" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/ethermint/crypto/ethsecp256k1" + "github.com/evmos/ethermint/tests" + evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" + "github.com/stretchr/testify/require" +) + +var ( + testChainID = big.NewInt(9000) + testAddress = common.HexToAddress("0x1234567890123456789012345678901234567890") + testBlockHash = common.HexToHash("0xa9d32b77fbfe2f9310b9eb8a29138b95ca3da6b04a4432e1d14c360644a9b8c7") + testSigner keyring.Signer + testFromAddr common.Address +) + +func init() { + privKey, _ := ethsecp256k1.GenerateKey() + testSigner = tests.NewSigner(privKey) + testFromAddr = common.BytesToAddress(privKey.PubKey().Address().Bytes()) +} + +func buildLegacyTx(t *testing.T) *evmtypes.MsgEthereumTx { + tx := evmtypes.NewTx( + testChainID, + 0, + &testAddress, + big.NewInt(1000), + 100000, + big.NewInt(1000000000), + nil, + nil, + nil, + nil, + ) + tx.From = testFromAddr.Bytes() + + err := tx.Sign(ethtypes.LatestSignerForChainID(testChainID), testSigner) + require.NoError(t, err) + + return tx +} + +func buildDynamicFeeTx(t *testing.T) *evmtypes.MsgEthereumTx { + tx := evmtypes.NewTx( + testChainID, + 1, + &testAddress, + big.NewInt(2000), + 120000, + nil, + big.NewInt(2000000000), + big.NewInt(1000000000), + []byte("test data"), + ðtypes.AccessList{}, + ) + tx.From = testFromAddr.Bytes() + + err := tx.Sign(ethtypes.LatestSignerForChainID(testChainID), testSigner) + require.NoError(t, err) + + return tx +} + +func buildSetCodeTx(t *testing.T) *evmtypes.MsgEthereumTx { + auth := ethtypes.SetCodeAuthorization{ + ChainID: *uint256.MustFromBig(testChainID), + Address: testAddress, + Nonce: 1, + V: uint8(27), + R: *uint256.NewInt(1), + S: *uint256.NewInt(1), + } + + setCodeTx := ðtypes.SetCodeTx{ + ChainID: uint256.MustFromBig(testChainID), + Nonce: 2, + GasTipCap: uint256.NewInt(1000000000), + GasFeeCap: uint256.NewInt(2000000000), + Gas: 100000, + To: testAddress, + Value: uint256.NewInt(3000), + Data: []byte("setcode data"), + AccessList: ethtypes.AccessList{}, + AuthList: []ethtypes.SetCodeAuthorization{auth}, + V: uint256.NewInt(1), + R: uint256.NewInt(1), + S: uint256.NewInt(1), + } + + ethTx := ethtypes.NewTx(setCodeTx) + msgEthereumTx := &evmtypes.MsgEthereumTx{} + err := msgEthereumTx.FromSignedEthereumTx(ethTx, ethtypes.LatestSignerForChainID(testChainID)) + require.NoError(t, err) + + msgEthereumTx.From = testFromAddr.Bytes() + return msgEthereumTx +} + +func TestNewRPCTransaction(t *testing.T) { + testCases := []struct { + name string + setupTx func() *evmtypes.MsgEthereumTx + blockHash common.Hash + blockNumber uint64 + index uint64 + baseFee *big.Int + chainID *big.Int + expectError bool + validateResult func(t *testing.T, result *RPCTransaction) + }{ + { + name: "Legacy transaction - pending", + setupTx: func() *evmtypes.MsgEthereumTx { return buildLegacyTx(t) }, + blockHash: common.Hash{}, + blockNumber: 0, + index: 0, + baseFee: nil, + chainID: testChainID, + expectError: false, + validateResult: func(t *testing.T, result *RPCTransaction) { + require.Equal(t, hexutil.Uint64(ethtypes.LegacyTxType), result.Type) + require.Equal(t, testFromAddr, result.From) + require.Equal(t, &testAddress, result.To) + require.Equal(t, (*hexutil.Big)(big.NewInt(1000)), result.Value) + require.Equal(t, hexutil.Uint64(100000), result.Gas) + require.Equal(t, (*hexutil.Big)(big.NewInt(1000000000)), result.GasPrice) + require.Nil(t, result.BlockHash) + require.Nil(t, result.BlockNumber) + require.Nil(t, result.TransactionIndex) + require.Nil(t, result.Accesses) + require.Nil(t, result.GasFeeCap) + require.Nil(t, result.GasTipCap) + }, + }, + { + name: "Legacy transaction - mined", + setupTx: func() *evmtypes.MsgEthereumTx { return buildLegacyTx(t) }, + blockHash: testBlockHash, + blockNumber: 100, + index: 5, + baseFee: big.NewInt(500000000), + chainID: testChainID, + expectError: false, + validateResult: func(t *testing.T, result *RPCTransaction) { + require.Equal(t, hexutil.Uint64(ethtypes.LegacyTxType), result.Type) + require.Equal(t, &testBlockHash, result.BlockHash) + require.Equal(t, (*hexutil.Big)(big.NewInt(100)), result.BlockNumber) + idx := hexutil.Uint64(5) + require.Equal(t, &idx, result.TransactionIndex) + }, + }, + { + name: "Dynamic fee transaction - pending", + setupTx: func() *evmtypes.MsgEthereumTx { return buildDynamicFeeTx(t) }, + blockHash: common.Hash{}, + blockNumber: 0, + index: 0, + baseFee: nil, + chainID: testChainID, + expectError: false, + validateResult: func(t *testing.T, result *RPCTransaction) { + require.Equal(t, hexutil.Uint64(ethtypes.DynamicFeeTxType), result.Type) + require.Equal(t, testFromAddr, result.From) + require.Equal(t, &testAddress, result.To) + require.Equal(t, (*hexutil.Big)(big.NewInt(2000)), result.Value) + require.Equal(t, hexutil.Uint64(120000), result.Gas) + require.Equal(t, (*hexutil.Big)(big.NewInt(2000000000)), result.GasFeeCap) + require.Equal(t, (*hexutil.Big)(big.NewInt(1000000000)), result.GasTipCap) + require.NotNil(t, result.Accesses) + require.NotNil(t, result.YParity) + require.Equal(t, hexutil.Bytes([]byte("test data")), result.Input) + }, + }, + { + name: "Dynamic fee transaction - mined with baseFee", + setupTx: func() *evmtypes.MsgEthereumTx { return buildDynamicFeeTx(t) }, + blockHash: testBlockHash, + blockNumber: 200, + index: 3, + baseFee: big.NewInt(500000000), + chainID: testChainID, + expectError: false, + validateResult: func(t *testing.T, result *RPCTransaction) { + require.Equal(t, hexutil.Uint64(ethtypes.DynamicFeeTxType), result.Type) + expectedPrice := big.NewInt(1500000000) + require.Equal(t, (*hexutil.Big)(expectedPrice), result.GasPrice) + require.Equal(t, &testBlockHash, result.BlockHash) + }, + }, + { + name: "SetCode transaction - pending", + setupTx: func() *evmtypes.MsgEthereumTx { return buildSetCodeTx(t) }, + blockHash: common.Hash{}, + blockNumber: 0, + index: 0, + baseFee: nil, + chainID: testChainID, + expectError: false, + validateResult: func(t *testing.T, result *RPCTransaction) { + require.Equal(t, hexutil.Uint64(ethtypes.SetCodeTxType), result.Type) + require.Equal(t, testFromAddr, result.From) + require.Equal(t, &testAddress, result.To) + require.Equal(t, (*hexutil.Big)(big.NewInt(3000)), result.Value) + require.Equal(t, hexutil.Uint64(100000), result.Gas) + require.Equal(t, (*hexutil.Big)(big.NewInt(2000000000)), result.GasFeeCap) + require.Equal(t, (*hexutil.Big)(big.NewInt(1000000000)), result.GasTipCap) + require.NotNil(t, result.Accesses) + require.NotNil(t, result.YParity) + require.NotNil(t, result.AuthorizationList) + require.Len(t, result.AuthorizationList, 1) + auth := result.AuthorizationList[0] + require.Equal(t, testAddress, auth.Address) + require.Equal(t, *uint256.MustFromBig(testChainID), auth.ChainID) + require.Equal(t, uint64(1), auth.Nonce) + require.Equal(t, uint8(27), auth.V) + require.Equal(t, *uint256.NewInt(1), auth.R) + require.Equal(t, *uint256.NewInt(1), auth.S) + require.Equal(t, hexutil.Bytes([]byte("setcode data")), result.Input) + }, + }, + { + name: "SetCode transaction - mined with baseFee", + setupTx: func() *evmtypes.MsgEthereumTx { return buildSetCodeTx(t) }, + blockHash: testBlockHash, + blockNumber: 300, + index: 7, + baseFee: big.NewInt(800000000), + chainID: testChainID, + expectError: false, + validateResult: func(t *testing.T, result *RPCTransaction) { + require.Equal(t, hexutil.Uint64(ethtypes.SetCodeTxType), result.Type) + expectedPrice := big.NewInt(1800000000) + require.Equal(t, (*hexutil.Big)(expectedPrice), result.GasPrice) + require.Equal(t, &testBlockHash, result.BlockHash) + require.NotNil(t, result.AuthorizationList) + require.Len(t, result.AuthorizationList, 1) + auth := result.AuthorizationList[0] + require.Equal(t, testAddress, auth.Address) + require.Equal(t, *uint256.MustFromBig(testChainID), auth.ChainID) + require.Equal(t, uint64(1), auth.Nonce) + require.Equal(t, uint8(27), auth.V) + require.Equal(t, *uint256.NewInt(1), auth.R) + require.Equal(t, *uint256.NewInt(1), auth.S) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + msg := tc.setupTx() + + result, err := NewRPCTransaction( + msg, + tc.blockHash, + tc.blockNumber, + 0, + tc.index, + tc.baseFee, + tc.chainID, + ) + + if tc.expectError { + require.Error(t, err) + require.Nil(t, result) + } else { + require.NoError(t, err) + require.NotNil(t, result) + + require.NotEmpty(t, result.Hash) + require.NotNil(t, result.V) + require.NotNil(t, result.R) + require.NotNil(t, result.S) + + if tc.validateResult != nil { + tc.validateResult(t, result) + } + } + }) + } +} + +func TestNewRPCTransaction_BlockTimestamp(t *testing.T) { + t.Parallel() + + blockHash := common.HexToHash("0xaabb") + const blockTime = uint64(1234567890) + msg := buildLegacyTx(t) + + t.Run("set when in block", func(t *testing.T) { + result, err := NewRPCTransaction(msg, blockHash, 10, blockTime, 0, nil, testChainID) + require.NoError(t, err) + require.NotNil(t, result.BlockTimestamp) + require.Equal(t, hexutil.Uint64(blockTime), *result.BlockTimestamp) + }) + + t.Run("nil for pending tx", func(t *testing.T) { + result, err := NewRPCTransaction(msg, common.Hash{}, 0, 0, 0, nil, testChainID) + require.NoError(t, err) + require.Nil(t, result.BlockTimestamp) + }) + + t.Run("nil for zero block time", func(t *testing.T) { + result, err := NewRPCTransaction(msg, blockHash, 10, 0, 0, nil, testChainID) + require.NoError(t, err) + require.Nil(t, result.BlockTimestamp, "zero blockTime must not produce a bogus timestamp") + }) +} + +func TestEthHeaderFromTendermint(t *testing.T) { + t.Parallel() + + parentHash := common.HexToHash("0xaabbccdd1122334455667788990011aabbccdd1122334455667788990011aabb") + appHash := common.HexToHash("0x1122334455667788990011aabbccdd1122334455667788990011aabbccdd1122") + tmHeader := tmtypes.Header{ + Height: 42, + LastBlockID: tmtypes.BlockID{Hash: parentHash.Bytes()}, + AppHash: appHash.Bytes(), + } + baseFee := big.NewInt(1_000_000_000) + miner := sdk.AccAddress(common.HexToAddress("0xdeadbeef").Bytes()) + + h := EthHeaderFromTendermint(tmHeader, ethtypes.Bloom{}, baseFee, miner) + + require.Equal(t, big.NewInt(42), h.Number) + require.Equal(t, common.BytesToHash(parentHash.Bytes()), h.ParentHash) + require.Equal(t, common.BytesToHash(appHash.Bytes()), h.Root) + require.Equal(t, baseFee, h.BaseFee) + require.Equal(t, common.BytesToAddress(miner), h.Coinbase) + require.Equal(t, ethtypes.EmptyRootHash, h.TxHash) + + require.NotNil(t, h.WithdrawalsHash) + require.Equal(t, ethtypes.EmptyWithdrawalsHash, *h.WithdrawalsHash) + + require.NotNil(t, h.BlobGasUsed) + require.Equal(t, uint64(0), *h.BlobGasUsed) + require.NotNil(t, h.ExcessBlobGas) + require.Equal(t, uint64(0), *h.ExcessBlobGas) + + require.NotNil(t, h.ParentBeaconRoot) + require.Equal(t, ethtypes.EmptyRootHash, *h.ParentBeaconRoot) + + require.NotNil(t, h.RequestsHash) + require.Equal(t, ethtypes.EmptyRequestsHash, *h.RequestsHash) +} + +func TestFormatBlock(t *testing.T) { + t.Parallel() + + var ( + cometHash = common.HexToHash("0xa1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2") + baseFee = big.NewInt(1_000_000_000) + ) + + ethHeader := EthHeaderFromTendermint( + tmtypes.Header{Height: 1}, + ethtypes.Bloom{}, + baseFee, + sdk.AccAddress{}, + ) + ethHeader.GasLimit = 8_000_000 + ethHeader.GasUsed = 21_000 + + const ( + emptyRootHex = `"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"` + emptyRequestsHex = `"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"` + zeroBloom = `"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"` + baseFields = ` + "difficulty": "0x0", + "extraData": "0x", + "gasLimit": "0x7a1200", + "gasUsed": "0x5208", + "hash": "0xa1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2", + "miner": "0x0000000000000000000000000000000000000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "number": "0x1", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x100", + "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x0", + "uncles": [], + "baseFeePerGas": "0x3b9aca00", + "blobGasUsed": "0x0", + "excessBlobGas": "0x0", + "withdrawals": []` + ) + + testCases := []struct { + name string + txs []interface{} + want string + }{ + { + name: "no transactions", + txs: []interface{}{}, + want: `{` + baseFields + `, + "logsBloom": ` + zeroBloom + `, + "receiptsRoot": ` + emptyRootHex + `, + "transactionsRoot": ` + emptyRootHex + `, + "transactions": [], + "withdrawalsRoot": ` + emptyRootHex + `, + "parentBeaconBlockRoot": ` + emptyRootHex + `, + "requestsHash": ` + emptyRequestsHex + ` + }`, + }, + { + name: "transaction hashes", + txs: []interface{}{common.HexToHash("0x1234")}, + want: `{` + baseFields + `, + "logsBloom": ` + zeroBloom + `, + "receiptsRoot": ` + emptyRootHex + `, + "transactionsRoot": ` + emptyRootHex + `, + "transactions": ["0x0000000000000000000000000000000000000000000000000000000000001234"], + "withdrawalsRoot": ` + emptyRootHex + `, + "parentBeaconBlockRoot": ` + emptyRootHex + `, + "requestsHash": ` + emptyRequestsHex + ` + }`, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := FormatBlock(ethHeader, cometHash.Bytes(), 256, tc.txs) + out, err := json.Marshal(result) + require.NoError(t, err) + require.JSONEq(t, tc.want, string(out)) + }) + } +} diff --git a/rpc/websockets.go b/rpc/websockets.go index 0268f9797f..3fca41dcff 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -22,9 +22,9 @@ import ( "fmt" "io" "math/big" - "net" "net/http" "strconv" + "strings" "sync" "github.com/cosmos/cosmos-sdk/client" @@ -33,17 +33,24 @@ import ( "github.com/pkg/errors" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/filters" "github.com/ethereum/go-ethereum/rpc" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" + originutil "github.com/evmos/ethermint/internal/origin" rpcfilters "github.com/evmos/ethermint/rpc/namespaces/ethereum/eth/filters" "github.com/evmos/ethermint/rpc/stream" "github.com/evmos/ethermint/server/config" ) +const ( + methodEthSubscribe = "eth_subscribe" + methodEthUnsubscribe = "eth_unsubscribe" +) + type WebsocketsServer interface { Start() } @@ -83,19 +90,34 @@ type websocketsServer struct { keyFile string api *pubSubAPI logger log.Logger + + wsOriginAllowAll bool + wsOrigins map[string]struct{} + allowedAPIs map[string]struct{} } -func NewWebsocketsServer(clientCtx client.Context, logger log.Logger, stream *stream.RPCStream, cfg *config.Config) WebsocketsServer { +func NewWebsocketsServer( + ctx context.Context, clientCtx client.Context, logger log.Logger, stream *stream.RPCStream, cfg *config.Config, +) WebsocketsServer { logger = logger.With("api", "websocket-server") - _, port, _ := net.SplitHostPort(cfg.JSONRPC.Address) + allowAll, origins, errs := originutil.BuildAllowlist(cfg.JSONRPC.WsOrigins) + if len(errs) > 0 { + // Config validation in JSONRPCConfig.Validate() should prevent this. + // Reaching here means validation was bypassed; panic rather than silently + // starting with a partial or empty allowlist. + panic(fmt.Sprintf("invalid websocket origin allowlist: %v", errs)) + } return &websocketsServer{ - rpcAddr: "localhost:" + port, // FIXME: this shouldn't be hardcoded to localhost - wsAddr: cfg.JSONRPC.WsAddress, - certFile: cfg.TLS.CertificatePath, - keyFile: cfg.TLS.KeyPath, - api: newPubSubAPI(clientCtx, logger, stream), - logger: logger, + rpcAddr: cfg.JSONRPC.Address, + wsAddr: cfg.JSONRPC.WsAddress, + certFile: cfg.TLS.CertificatePath, + keyFile: cfg.TLS.KeyPath, + api: newPubSubAPI(ctx, clientCtx, logger, stream), + logger: logger, + wsOriginAllowAll: allowAll, + wsOrigins: origins, + allowedAPIs: buildAllowedAPIs(cfg.JSONRPC.API), } } @@ -122,8 +144,8 @@ func (s *websocketsServer) Start() { func (s *websocketsServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { upgrader := websocket.Upgrader{ - CheckOrigin: func(_ *http.Request) bool { - return true + CheckOrigin: func(r *http.Request) bool { + return s.isOriginAllowed(r.Header.Get("Origin")) }, } @@ -152,6 +174,19 @@ func (s *websocketsServer) sendErrResponse(wsConn *wsConn, msg string) { _ = wsConn.WriteJSON(res) } +func (s *websocketsServer) sendErrResponseWithID(wsConn *wsConn, id float64, msg string) { + res := &ErrorResponseJSON{ + Jsonrpc: "2.0", + Error: &ErrorMessageJSON{ + Code: big.NewInt(-32600), + Message: msg, + }, + ID: big.NewInt(int64(id)), + } + + _ = wsConn.WriteJSON(res) +} + type wsConn struct { conn *websocket.Conn mux *sync.Mutex @@ -196,6 +231,17 @@ func (s *websocketsServer) readLoop(wsConn *wsConn) { } if isBatch(mb) { + if !s.namespaceAllowed("eth") { + var blocked int + var hasItems bool + mb, blocked, hasItems = filterBatchEthSubscriptions(mb) + for i := 0; i < blocked; i++ { + s.sendErrResponse(wsConn, "eth namespace is disabled") + } + if !hasItems { + continue + } + } if err := s.tcpGetAndSendResponse(wsConn, mb); err != nil { s.sendErrResponse(wsConn, err.Error()) } @@ -236,8 +282,13 @@ func (s *websocketsServer) readLoop(wsConn *wsConn) { continue } + if (method == methodEthSubscribe || method == methodEthUnsubscribe) && !s.namespaceAllowed("eth") { + s.sendErrResponseWithID(wsConn, connID, "eth namespace is disabled") + continue + } + switch method { - case "eth_subscribe": + case methodEthSubscribe: params, ok := s.getParamsAndCheckValid(msg, wsConn) if !ok { continue @@ -260,7 +311,7 @@ func (s *websocketsServer) readLoop(wsConn *wsConn) { if err := wsConn.WriteJSON(res); err != nil { break } - case "eth_unsubscribe": + case methodEthUnsubscribe: params, ok := s.getParamsAndCheckValid(msg, wsConn) if !ok { continue @@ -297,6 +348,76 @@ func (s *websocketsServer) readLoop(wsConn *wsConn) { } } +func buildAllowedAPIs(apis []string) map[string]struct{} { + if len(apis) == 0 { + return nil + } + + allowed := make(map[string]struct{}, len(apis)) + for _, api := range apis { + trimmed := strings.TrimSpace(api) + if trimmed == "" { + continue + } + allowed[strings.ToLower(trimmed)] = struct{}{} + } + + return allowed +} + +// filterBatchEthSubscriptions parses the batch once, separates out any +// eth_subscribe/eth_unsubscribe items, and returns the remaining items +// re-marshaled for forwarding. The second return value is the number of +// blocked items; the third is false when every item was filtered out. +func filterBatchEthSubscriptions(raw []byte) ([]byte, int, bool) { + var items []json.RawMessage + if err := json.Unmarshal(raw, &items); err != nil { + // Unparseable batch: let the RPC server produce the error. + return raw, 0, true + } + + kept := make([]json.RawMessage, 0, len(items)) + blocked := 0 + for _, item := range items { + var peek struct { + Method string `json:"method"` + } + if json.Unmarshal(item, &peek) == nil && + (peek.Method == methodEthSubscribe || peek.Method == methodEthUnsubscribe) { + blocked++ + continue + } + kept = append(kept, item) + } + + if len(kept) == 0 { + return nil, blocked, false + } + if len(kept) == len(items) { + return raw, 0, true + } + marshaled, err := json.Marshal(kept) + if err != nil { + // This path is unreachable in practice (items were already validated by + // the preceding Unmarshal), but fail closed: report one error per blocked + // item and drop the whole batch rather than forwarding blocked methods. + return nil, blocked + len(kept), false + } + return marshaled, blocked, true +} + +func (s *websocketsServer) isOriginAllowed(origin string) bool { + return originutil.IsAllowed(origin, s.wsOriginAllowAll, s.wsOrigins) +} + +func (s *websocketsServer) namespaceAllowed(namespace string) bool { + if len(s.allowedAPIs) == 0 { + return false + } + _, ok := s.allowedAPIs[strings.ToLower(namespace)] + return ok +} + // tcpGetAndSendResponse sends error response to client if params is invalid func (s *websocketsServer) getParamsAndCheckValid(msg map[string]interface{}, wsConn *wsConn) ([]interface{}, bool) { params, ok := msg["params"].([]interface{}) @@ -346,18 +467,20 @@ func (s *websocketsServer) tcpGetAndSendResponse(wsConn *wsConn, mb []byte) erro // pubSubAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec type pubSubAPI struct { - events *stream.RPCStream - logger log.Logger - clientCtx client.Context + events *stream.RPCStream + logger log.Logger + clientCtx client.Context + cancelContext context.Context } // newPubSubAPI creates an instance of the ethereum PubSub API. -func newPubSubAPI(clientCtx client.Context, logger log.Logger, stream *stream.RPCStream) *pubSubAPI { +func newPubSubAPI(ctx context.Context, clientCtx client.Context, logger log.Logger, stream *stream.RPCStream) *pubSubAPI { logger = logger.With("module", "websocket-client") return &pubSubAPI{ - events: stream, - logger: logger, - clientCtx: clientCtx, + events: stream, + logger: logger, + clientCtx: clientCtx, + cancelContext: ctx, } } @@ -385,18 +508,77 @@ func (api *pubSubAPI) subscribe(wsConn *wsConn, subID rpc.ID, params []interface } } +// https://github.com/ethereum/go-ethereum/blob/release/1.11/core/types/gen_header_json.go#L18 +type Header struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"` + // update string avoid lost checksumed miner after MarshalText + Coinbase string `json:"miner"` + Root common.Hash `json:"stateRoot" gencodec:"required"` + TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` + ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` + Bloom ethtypes.Bloom `json:"logsBloom" gencodec:"required"` + Difficulty *hexutil.Big `json:"difficulty" gencodec:"required"` + Number *hexutil.Big `json:"number" gencodec:"required"` + GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Time hexutil.Uint64 `json:"timestamp" gencodec:"required"` + Extra hexutil.Bytes `json:"extraData" gencodec:"required"` + MixDigest common.Hash `json:"mixHash"` + Nonce ethtypes.BlockNonce `json:"nonce"` + BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"` + WithdrawalsHash *common.Hash `json:"withdrawalsRoot,omitempty" rlp:"optional"` + BlobGasUsed *hexutil.Uint64 `json:"blobGasUsed,omitempty" rlp:"optional"` + ExcessBlobGas *hexutil.Uint64 `json:"excessBlobGas,omitempty" rlp:"optional"` + ParentBeaconRoot *common.Hash `json:"parentBeaconBlockRoot,omitempty" rlp:"optional"` + RequestsHash *common.Hash `json:"requestsHash,omitempty" rlp:"optional"` + // overwrite rlpHash + Hash common.Hash `json:"hash"` +} + func (api *pubSubAPI) subscribeNewHeads(wsConn *wsConn, subID rpc.ID) (context.CancelFunc, error) { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(api.cancelContext) + //nolint: errcheck go api.events.HeaderStream().Subscribe(ctx, func(headers []stream.RPCHeader, _ int) error { for _, header := range headers { + h := header.EthHeader + var enc Header + enc.ParentHash = h.ParentHash + enc.UncleHash = h.UncleHash + enc.Coinbase = h.Coinbase.Hex() + enc.Root = h.Root + enc.TxHash = h.TxHash + enc.ReceiptHash = h.ReceiptHash + enc.Bloom = h.Bloom + enc.Difficulty = (*hexutil.Big)(h.Difficulty) + enc.Number = (*hexutil.Big)(h.Number) + enc.GasLimit = hexutil.Uint64(h.GasLimit) + enc.GasUsed = hexutil.Uint64(h.GasUsed) + enc.Time = hexutil.Uint64(h.Time) + enc.Extra = h.Extra + enc.MixDigest = h.MixDigest + enc.Nonce = h.Nonce + enc.BaseFee = (*hexutil.Big)(h.BaseFee) + enc.WithdrawalsHash = h.WithdrawalsHash + if h.BlobGasUsed != nil { + bgu := hexutil.Uint64(*h.BlobGasUsed) + enc.BlobGasUsed = &bgu + } + if h.ExcessBlobGas != nil { + ebg := hexutil.Uint64(*h.ExcessBlobGas) + enc.ExcessBlobGas = &ebg + } + enc.ParentBeaconRoot = h.ParentBeaconRoot + enc.RequestsHash = h.RequestsHash + enc.Hash = header.Hash // write to ws conn res := &SubscriptionNotification{ Jsonrpc: "2.0", Method: "eth_subscription", Params: &SubscriptionResult{ Subscription: subID, - Result: header.EthHeader, + Result: enc, }, } @@ -524,7 +706,7 @@ func (api *pubSubAPI) subscribeLogs(wsConn *wsConn, subID rpc.ID, extra interfac } } - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(api.cancelContext) //nolint: errcheck go api.events.LogStream().Subscribe(ctx, func(txLogs []*ethtypes.Log, _ int) error { logs := rpcfilters.FilterLogs(txLogs, crit.FromBlock, crit.ToBlock, crit.Addresses, crit.Topics) @@ -544,6 +726,7 @@ func (api *pubSubAPI) subscribeLogs(wsConn *wsConn, subID rpc.ID, extra interfac err := wsConn.WriteJSON(res) if err != nil { + api.logger.Error("error writing header, will drop peer", "error", err.Error()) try(func() { if err != websocket.ErrCloseSent { _ = wsConn.Close() @@ -560,7 +743,7 @@ func (api *pubSubAPI) subscribeLogs(wsConn *wsConn, subID rpc.ID, extra interfac } func (api *pubSubAPI) subscribePendingTransactions(wsConn *wsConn, subID rpc.ID) (context.CancelFunc, error) { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(api.cancelContext) //nolint: errcheck go api.events.PendingTxStream().Subscribe(ctx, func(items []common.Hash, _ int) error { for _, hash := range items { diff --git a/rpc/websockets_test.go b/rpc/websockets_test.go new file mode 100644 index 0000000000..b18093f15e --- /dev/null +++ b/rpc/websockets_test.go @@ -0,0 +1,102 @@ +package rpc + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIsOriginAllowed(t *testing.T) { + t.Run("emptyOriginAllowedWhenNoAllowlist", func(t *testing.T) { + s := &websocketsServer{ + wsOriginAllowAll: false, + wsOrigins: map[string]struct{}{}, + } + require.True(t, s.isOriginAllowed("")) + require.False(t, s.isOriginAllowed("http://example.com")) + }) + + t.Run("allowlistEnforced", func(t *testing.T) { + s := &websocketsServer{ + wsOriginAllowAll: false, + wsOrigins: map[string]struct{}{ + "http://allowed.example": {}, + }, + } + require.True(t, s.isOriginAllowed("")) + require.True(t, s.isOriginAllowed("http://allowed.example")) + require.True(t, s.isOriginAllowed("HTTP://ALLOWED.EXAMPLE:80/")) + require.False(t, s.isOriginAllowed("http://blocked.example")) + }) + + t.Run("allowAll", func(t *testing.T) { + s := &websocketsServer{ + wsOriginAllowAll: true, + } + require.True(t, s.isOriginAllowed("")) + require.True(t, s.isOriginAllowed("http://any.example")) + }) +} + +func TestNamespaceAllowed(t *testing.T) { + t.Run("allowed", func(t *testing.T) { + s := &websocketsServer{ + allowedAPIs: buildAllowedAPIs([]string{"eth", "net"}), + } + require.True(t, s.namespaceAllowed("eth")) + require.True(t, s.namespaceAllowed("ETH")) + require.False(t, s.namespaceAllowed("web3")) + }) + + t.Run("empty", func(t *testing.T) { + s := &websocketsServer{} + require.False(t, s.namespaceAllowed("eth")) + }) +} + +func TestFilterBatchEthSubscriptions(t *testing.T) { + t.Run("noSubscriptions_returnedUnchanged", func(t *testing.T) { + raw := []byte(`[{"id":1,"method":"net_version"}]`) + got, blocked, hasItems := filterBatchEthSubscriptions(raw) + require.True(t, hasItems) + require.Equal(t, 0, blocked) + require.Equal(t, raw, got) + }) + + t.Run("onlySubscribe_allFiltered", func(t *testing.T) { + raw := []byte(`[{"id":1,"method":"eth_subscribe","params":["newHeads"]}]`) + _, blocked, hasItems := filterBatchEthSubscriptions(raw) + require.False(t, hasItems) + require.Equal(t, 1, blocked) + }) + + t.Run("onlyUnsubscribe_allFiltered", func(t *testing.T) { + raw := []byte(`[{"id":1,"method":"eth_unsubscribe","params":["0x1"]}]`) + _, blocked, hasItems := filterBatchEthSubscriptions(raw) + require.False(t, hasItems) + require.Equal(t, 1, blocked) + }) + + t.Run("mixed_subscribeFiltered_othersForwarded", func(t *testing.T) { + raw := []byte(`[{"id":1,"method":"net_version"},{"id":2,"method":"eth_subscribe","params":["newHeads"]}]`) + got, blocked, hasItems := filterBatchEthSubscriptions(raw) + require.True(t, hasItems) + require.Equal(t, 1, blocked) + + var items []json.RawMessage + require.NoError(t, json.Unmarshal(got, &items)) + require.Len(t, items, 1) + var item map[string]interface{} + require.NoError(t, json.Unmarshal(items[0], &item)) + require.Equal(t, "net_version", item["method"]) + }) + + t.Run("invalidJson_returnedUnchanged", func(t *testing.T) { + raw := []byte(`[{]`) + got, blocked, hasItems := filterBatchEthSubscriptions(raw) + require.True(t, hasItems) + require.Equal(t, 0, blocked) + require.Equal(t, raw, got) + }) +} diff --git a/scripts/geth-genesis.json b/scripts/geth-genesis.json index 67c762fc3c..dd57def1a1 100755 --- a/scripts/geth-genesis.json +++ b/scripts/geth-genesis.json @@ -12,9 +12,25 @@ "istanbulBlock": 0, "muirGlacierBlock": 0, "berlinBlock": 0, - "yoloV3Block": 0, "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, "shanghaiTime": 0, + "cancunTime": 0, + "pragueTime": 0, + "blobSchedule": { + "cancun": { + "target": 3, + "max": 6, + "baseFeeUpdateFraction": 3338477 + }, + "prague": { + "target": 3, + "max": 6, + "baseFeeUpdateFraction": 3338477 + } + }, + "terminalTotalDifficulty": 0, "clique": { "period": 2, "epoch": 30000 @@ -24,7 +40,7 @@ "timestamp": "0x60ed6d23", "extraData": "0x000000000000000000000000000000000000000000000000000000000000000057f96e6b86cdefdb3d412547816a82e3e0ebf9d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x4db9760", - "difficulty": "0x1", + "difficulty": "0x0", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { diff --git a/scripts/go-mod-tidy-all.sh b/scripts/go-mod-tidy-all.sh new file mode 100644 index 0000000000..72b2b9d0e2 --- /dev/null +++ b/scripts/go-mod-tidy-all.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -euo pipefail + +for modfile in $(find . -name go.mod); do + echo "Updating $modfile" + DIR=$(dirname $modfile) + (cd $DIR; go mod tidy) +done \ No newline at end of file diff --git a/scripts/go-update-dep-all.sh b/scripts/go-update-dep-all.sh new file mode 100644 index 0000000000..f06bb9c6a4 --- /dev/null +++ b/scripts/go-update-dep-all.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [ -z ${1+x} ]; then + echo "USAGE: + ./scripts/go-update-dep-all.sh + This command updates a dependency in all of the go.mod files which import it. + It should be called with a single argument which is the go module path of the dependency, + with an optional version specified by @." + exit +fi + +dependency=$1 +# in case the user explicitly specified a dependency version with @, we separate +# the dependency module name into dependency_mod +IFS='@' read -ra dependency_mod <<< "$dependency" +dependency_mod=${dependency_mod[0]} + +for modfile in $(find . -name go.mod); do + if grep $dependency_mod $modfile &> /dev/null; then + echo "Updating $modfile" + DIR=$(dirname $modfile) + # we want to skip the go.mod of the package we're updating + if [[ "$dependency_mod" == *"$(basename $DIR)" ]]; then + echo "Skipping $DIR" + continue + fi + (cd $DIR; go get -u $dependency) + fi +done \ No newline at end of file diff --git a/scripts/run-integration-tests.sh b/scripts/run-integration-tests.sh index e867e392a9..869b079cf1 100755 --- a/scripts/run-integration-tests.sh +++ b/scripts/run-integration-tests.sh @@ -15,8 +15,8 @@ TESTS_TO_RUN="${TESTS_TO_RUN:-all}" if [[ "$TESTS_TO_RUN" == "all" ]]; then echo "run all tests" - pytest -vv -s + pytest -vv -s --session-timeout=3600 --timeout=3600 else echo "run tests matching $TESTS_TO_RUN" - pytest -vv -s -m "$TESTS_TO_RUN" + pytest -vv -s --session-timeout=1800 --timeout=1800 -m "$TESTS_TO_RUN" fi diff --git a/scripts/start-geth.sh b/scripts/start-geth.sh index 170139341a..3d31a26e34 100755 --- a/scripts/start-geth.sh +++ b/scripts/start-geth.sh @@ -50,9 +50,17 @@ geth --datadir $DATA --password $pwdfile account import $tmpfile rm $tmpfile # start up -geth --networkid 9000 --datadir $DATA --http --http.addr localhost --http.api 'personal,eth,net,web3,txpool,miner' \ --unlock '0x57f96e6b86cdefdb3d412547816a82e3e0ebf9d2' --password $pwdfile \ ---mine --miner.threads 1 --allow-insecure-unlock --ipcdisable \ +geth \ + --dev \ + --dev.period 1 \ + --datadir $DATA \ + --http \ + --http.addr localhost \ + --http.api 'personal,eth,net,web3,txpool,miner,debug' \ + --unlock '0x57f96e6b86cdefdb3d412547816a82e3e0ebf9d2' \ + --password $pwdfile \ + --allow-insecure-unlock \ + --ipcdisable \ $@ rm $pwdfile diff --git a/server/config/config.go b/server/config/config.go index 8e9167719b..4c86b30f1e 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -21,17 +21,14 @@ import ( "path" "time" - sdkmath "cosmossdk.io/math" - "github.com/spf13/viper" - "github.com/cometbft/cometbft/libs/strings" + cmtstrings "github.com/cometbft/cometbft/libs/strings" errorsmod "cosmossdk.io/errors" "github.com/cosmos/cosmos-sdk/server/config" - sdk "github.com/cosmos/cosmos-sdk/types" errortypes "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/rosetta" + originutil "github.com/evmos/ethermint/internal/origin" ) const ( @@ -53,8 +50,6 @@ const ( // DefaultFixRevertGasRefundHeight is the default height at which to overwrite gas refund DefaultFixRevertGasRefundHeight = 0 - DefaultMaxTxGasWanted = 0 - DefaultGasCap uint64 = 25000000 DefaultFilterCap int32 = 200 @@ -83,29 +78,19 @@ const ( // DefaultReturnDataLimit is maximum number of bytes returned from eth_call or similar invocations DefaultReturnDataLimit = 100000 - // DefaultRosettaEnable is the default value for the parameter that defines if the Rosetta API server is enabled - DefaultRosettaEnable = false - - // DefaultRosettaBlockchain defines the default blockchain name for the rosetta server - DefaultRosettaBlockchain = "evmos" - - // DefaultRosettaNetwork defines the default network name for the rosetta server - DefaultRosettaNetwork = "evmos" + // DefaultBatchRequestLimit is the default maximum number of JSON-RPC requests per HTTP batch. + // Matches go-ethereum node.DefaultConfig (node/defaults.go). + DefaultBatchRequestLimit = 1000 - // DefaultRosettaGasToSuggest defines the default gas to suggest for the rosetta server - DefaultRosettaGasToSuggest = 300_000 - - // DefaultRosettaDenomToSuggest defines the default denom for fee suggestion - DefaultRosettaDenomToSuggest = "basecro" + // DefaultBatchResponseMaxSize is the default maximum cumulative response size in bytes for a batch. + DefaultBatchResponseMaxSize = 25 * 1000 * 1000 BlockExecutorSequential = "sequential" BlockExecutorBlockSTM = "block-stm" + DefaultMaxTxs = 3000 ) var ( - // DefaultRosettaGasPrices defines the default list of prices to suggest - DefaultRosettaGasPrices = sdk.NewDecCoins(sdk.NewDecCoin(DefaultRosettaDenomToSuggest, sdkmath.NewInt(4_000_000))) - evmTracers = []string{"json", "markdown", "struct", "access_list"} blockExecutors = []string{BlockExecutorSequential, BlockExecutorBlockSTM} @@ -119,7 +104,6 @@ type Config struct { EVM EVMConfig `mapstructure:"evm"` JSONRPC JSONRPCConfig `mapstructure:"json-rpc"` TLS TLSConfig `mapstructure:"tls"` - Rosetta RosettaConfig `mapstructure:"rosetta"` } // EVMConfig defines the application configuration values for the EVM. @@ -127,12 +111,12 @@ type EVMConfig struct { // Tracer defines vm.Tracer type that the EVM will use if the node is run in // trace mode. Default: 'json'. Tracer string `mapstructure:"tracer"` - // MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode. - MaxTxGasWanted uint64 `mapstructure:"max-tx-gas-wanted"` // BlockExecutor set block executor type, "block-stm" for parallel execution, "sequential" for sequential execution. BlockExecutor string `mapstructure:"block-executor"` // BlockSTMWorkers is the number of workers for block-stm execution, `0` means using all available CPUs. BlockSTMWorkers int `mapstructure:"block-stm-workers"` + // BlockSTMPreEstimate is the flag to enable pre-estimation for block-stm execution. + BlockSTMPreEstimate bool `mapstructure:"block-stm-pre-estimate"` } // JSONRPCConfig defines configuration for the EVM RPC server. @@ -143,6 +127,8 @@ type JSONRPCConfig struct { Address string `mapstructure:"address"` // WsAddress defines the WebSocket server to listen on WsAddress string `mapstructure:"ws-address"` + // WsOrigins defines allowed browser WebSocket origins. Empty list rejects non-empty Origin headers. + WsOrigins []string `mapstructure:"ws-origins"` // GasCap is the global gas cap for eth-call variants. GasCap uint64 `mapstructure:"gas-cap"` // EVMTimeout is the global timeout for eth-call. @@ -163,6 +149,10 @@ type JSONRPCConfig struct { HTTPTimeout time.Duration `mapstructure:"http-timeout"` // HTTPIdleTimeout is the idle timeout of http json-rpc server. HTTPIdleTimeout time.Duration `mapstructure:"http-idle-timeout"` + // BatchRequestLimit is the maximum number of requests in a JSON-RPC batch (0 disables the item limit). + BatchRequestLimit int `mapstructure:"batch-request-limit"` + // BatchResponseMaxSize is the maximum cumulative response size in bytes for a batched call (0 disables the size limit). + BatchResponseMaxSize int `mapstructure:"batch-response-max-size"` // AllowUnprotectedTxs restricts unprotected (non EIP155 signed) transactions to be submitted via // the node's RPC when global parameter is disabled. AllowUnprotectedTxs bool `mapstructure:"allow-unprotected-txs"` @@ -179,6 +169,9 @@ type JSONRPCConfig struct { FixRevertGasRefundHeight int64 `mapstructure:"fix-revert-gas-refund-height"` // ReturnDataLimit defines maximum number of bytes returned from `eth_call` or similar invocations ReturnDataLimit int64 `mapstructure:"return-data-limit"` + // RestrictUserInput will restrict some user input to the JSON-RPC debug apis, + // must be set to true if serving debug namespace to the public. + RestrictUserInput bool `mapstructure:"restrict-user-input"` } // TLSConfig defines the certificate and matching private key for the server. @@ -189,13 +182,6 @@ type TLSConfig struct { KeyPath string `mapstructure:"key-path"` } -// RosettaConfig defines configuration for the Rosetta server. -type RosettaConfig struct { - rosetta.Config - // Enable defines if the Rosetta server should be enabled. - Enable bool `mapstructure:"enable"` -} - // AppConfig helps to override default appConfig template and configs. // return "", nil if no custom configuration is required for the application. func AppConfig(denom string) (string, interface{}) { @@ -238,26 +224,24 @@ func DefaultConfig() *Config { EVM: *DefaultEVMConfig(), JSONRPC: *DefaultJSONRPCConfig(), TLS: *DefaultTLSConfig(), - Rosetta: *DefaultRosettaConfig(), } } // DefaultEVMConfig returns the default EVM configuration func DefaultEVMConfig() *EVMConfig { return &EVMConfig{ - Tracer: DefaultEVMTracer, - MaxTxGasWanted: DefaultMaxTxGasWanted, - BlockExecutor: BlockExecutorSequential, + Tracer: DefaultEVMTracer, + BlockExecutor: BlockExecutorSequential, } } // Validate returns an error if the tracer type is invalid. func (c EVMConfig) Validate() error { - if c.Tracer != "" && !strings.StringInSlice(c.Tracer, evmTracers) { + if c.Tracer != "" && !cmtstrings.StringInSlice(c.Tracer, evmTracers) { return fmt.Errorf("invalid tracer type %s, available types: %v", c.Tracer, evmTracers) } - if !strings.StringInSlice(c.BlockExecutor, blockExecutors) { + if c.BlockExecutor != "" && !cmtstrings.StringInSlice(c.BlockExecutor, blockExecutors) { return fmt.Errorf("invalid block executor type %s, available types: %v", c.BlockExecutor, blockExecutors) } @@ -281,6 +265,7 @@ func DefaultJSONRPCConfig() *JSONRPCConfig { API: GetDefaultAPINamespaces(), Address: DefaultJSONRPCAddress, WsAddress: DefaultJSONRPCWsAddress, + WsOrigins: []string{}, GasCap: DefaultGasCap, EVMTimeout: DefaultEVMTimeout, TxFeeCap: DefaultTxFeeCap, @@ -290,6 +275,8 @@ func DefaultJSONRPCConfig() *JSONRPCConfig { LogsCap: DefaultLogsCap, HTTPTimeout: DefaultHTTPTimeout, HTTPIdleTimeout: DefaultHTTPIdleTimeout, + BatchRequestLimit: DefaultBatchRequestLimit, + BatchResponseMaxSize: DefaultBatchResponseMaxSize, AllowUnprotectedTxs: DefaultAllowUnprotectedTxs, MaxOpenConnections: DefaultMaxOpenConnections, EnableIndexer: false, @@ -297,6 +284,7 @@ func DefaultJSONRPCConfig() *JSONRPCConfig { MetricsAddress: DefaultJSONRPCMetricsAddress, FixRevertGasRefundHeight: DefaultFixRevertGasRefundHeight, ReturnDataLimit: DefaultReturnDataLimit, + RestrictUserInput: false, } } @@ -338,6 +326,18 @@ func (c JSONRPCConfig) Validate() error { return errors.New("JSON-RPC HTTP idle timeout duration cannot be negative") } + if c.BatchRequestLimit < 0 { + return errors.New("JSON-RPC batch request limit cannot be negative") + } + + if c.BatchResponseMaxSize < 0 { + return errors.New("JSON-RPC batch response max size cannot be negative") + } + + if err := validateWsOrigins(c.WsOrigins); err != nil { + return err + } + // check for duplicates seenAPIs := make(map[string]bool) for _, api := range c.API { @@ -351,6 +351,23 @@ func (c JSONRPCConfig) Validate() error { return nil } +func validateWsOrigins(origins []string) error { + _, _, errs := originutil.BuildAllowlist(origins) + if len(errs) > 0 { + return fmt.Errorf("invalid JSON-RPC ws-origins: %w", errs[0]) + } + return nil +} + +// getIntOrDefault returns v's int for key when the key is set; otherwise def. +// Used so existing app.toml files without new keys keep safe defaults (not Go zero). +func getIntOrDefault(v *viper.Viper, key string, def int) int { + if !v.IsSet(key) { + return def + } + return v.GetInt(key) +} + // DefaultTLSConfig returns the default TLS configuration func DefaultTLSConfig() *TLSConfig { return &TLSConfig{ @@ -359,26 +376,6 @@ func DefaultTLSConfig() *TLSConfig { } } -// DefaultEVMConfig returns the default EVM configuration -func DefaultRosettaConfig() *RosettaConfig { - return &RosettaConfig{ - Config: rosetta.Config{ - Blockchain: DefaultRosettaBlockchain, - Network: DefaultRosettaNetwork, - TendermintRPC: rosetta.DefaultCometEndpoint, - GRPCEndpoint: rosetta.DefaultGRPCEndpoint, - Addr: rosetta.DefaultAddr, - Retries: rosetta.DefaultRetries, - Offline: rosetta.DefaultOffline, - EnableFeeSuggestion: rosetta.DefaultEnableFeeSuggestion, - GasToSuggest: DefaultRosettaGasToSuggest, - DenomToSuggest: DefaultRosettaDenomToSuggest, - GasPrices: DefaultRosettaGasPrices, - }, - Enable: DefaultRosettaEnable, - } -} - // Validate returns an error if the TLS certificate and key file extensions are invalid. func (c TLSConfig) Validate() error { certExt := path.Ext(c.CertificatePath) @@ -406,16 +403,17 @@ func GetConfig(v *viper.Viper) (Config, error) { return Config{ Config: cfg, EVM: EVMConfig{ - Tracer: v.GetString("evm.tracer"), - MaxTxGasWanted: v.GetUint64("evm.max-tx-gas-wanted"), - BlockExecutor: v.GetString("evm.block-executor"), - BlockSTMWorkers: v.GetInt("evm.block-stm-workers"), + Tracer: v.GetString("evm.tracer"), + BlockExecutor: v.GetString("evm.block-executor"), + BlockSTMWorkers: v.GetInt("evm.block-stm-workers"), + BlockSTMPreEstimate: v.GetBool("evm.block-stm-pre-estimate"), }, JSONRPC: JSONRPCConfig{ Enable: v.GetBool("json-rpc.enable"), API: v.GetStringSlice("json-rpc.api"), Address: v.GetString("json-rpc.address"), WsAddress: v.GetString("json-rpc.ws-address"), + WsOrigins: v.GetStringSlice("json-rpc.ws-origins"), GasCap: v.GetUint64("json-rpc.gas-cap"), FilterCap: v.GetInt32("json-rpc.filter-cap"), FeeHistoryCap: v.GetInt32("json-rpc.feehistory-cap"), @@ -425,12 +423,16 @@ func GetConfig(v *viper.Viper) (Config, error) { BlockRangeCap: v.GetInt32("json-rpc.block-range-cap"), HTTPTimeout: v.GetDuration("json-rpc.http-timeout"), HTTPIdleTimeout: v.GetDuration("json-rpc.http-idle-timeout"), + BatchRequestLimit: getIntOrDefault(v, "json-rpc.batch-request-limit", DefaultBatchRequestLimit), + BatchResponseMaxSize: getIntOrDefault(v, "json-rpc.batch-response-max-size", DefaultBatchResponseMaxSize), MaxOpenConnections: v.GetInt("json-rpc.max-open-connections"), EnableIndexer: v.GetBool("json-rpc.enable-indexer"), AllowIndexerGap: v.GetBool("json-rpc.allow-indexer-gap"), MetricsAddress: v.GetString("json-rpc.metrics-address"), FixRevertGasRefundHeight: v.GetInt64("json-rpc.fix-revert-gas-refund-height"), ReturnDataLimit: v.GetInt64("json-rpc.return-data-limit"), + RestrictUserInput: v.GetBool("json-rpc.restrict-user-input"), + AllowUnprotectedTxs: v.GetBool("json-rpc.allow-unprotected-txs"), }, TLS: TLSConfig{ CertificatePath: v.GetString("tls.certificate-path"), diff --git a/server/config/config_test.go b/server/config/config_test.go index 9a19e3e997..fae4739cbc 100644 --- a/server/config/config_test.go +++ b/server/config/config_test.go @@ -3,6 +3,7 @@ package config import ( "testing" + "github.com/spf13/viper" "github.com/stretchr/testify/require" ) @@ -11,4 +12,139 @@ func TestDefaultConfig(t *testing.T) { require.True(t, cfg.JSONRPC.Enable) require.Equal(t, cfg.JSONRPC.Address, DefaultJSONRPCAddress) require.Equal(t, cfg.JSONRPC.WsAddress, DefaultJSONRPCWsAddress) + require.Empty(t, cfg.JSONRPC.WsOrigins) + require.Equal(t, cfg.JSONRPC.AllowUnprotectedTxs, DefaultAllowUnprotectedTxs) + require.Equal(t, DefaultBatchRequestLimit, cfg.JSONRPC.BatchRequestLimit) + require.Equal(t, DefaultBatchResponseMaxSize, cfg.JSONRPC.BatchResponseMaxSize) +} + +func TestGetConfig_BatchLimits(t *testing.T) { + v := viper.New() + v.Set("json-rpc.batch-request-limit", 500) + v.Set("json-rpc.batch-response-max-size", 10_000_000) + + cfg, err := GetConfig(v) + require.NoError(t, err) + require.Equal(t, 500, cfg.JSONRPC.BatchRequestLimit) + require.Equal(t, 10_000_000, cfg.JSONRPC.BatchResponseMaxSize) +} + +func TestGetConfig_BatchLimitsDefaultWhenUnset(t *testing.T) { + v := viper.New() + cfg, err := GetConfig(v) + require.NoError(t, err) + require.Equal(t, DefaultBatchRequestLimit, cfg.JSONRPC.BatchRequestLimit) + require.Equal(t, DefaultBatchResponseMaxSize, cfg.JSONRPC.BatchResponseMaxSize) +} + +func TestGetConfig_BatchLimitsExplicitZero(t *testing.T) { + v := viper.New() + v.Set("json-rpc.batch-request-limit", 0) + v.Set("json-rpc.batch-response-max-size", 0) + + cfg, err := GetConfig(v) + require.NoError(t, err) + require.Equal(t, 0, cfg.JSONRPC.BatchRequestLimit) + require.Equal(t, 0, cfg.JSONRPC.BatchResponseMaxSize) +} + +func TestJSONRPCConfig_Validate_BatchLimits(t *testing.T) { + t.Run("rejectsNegativeBatchRequestLimit", func(t *testing.T) { + cfg := DefaultJSONRPCConfig() + cfg.BatchRequestLimit = -1 + require.ErrorContains(t, cfg.Validate(), "batch request limit cannot be negative") + }) + + t.Run("rejectsNegativeBatchResponseMaxSize", func(t *testing.T) { + cfg := DefaultJSONRPCConfig() + cfg.BatchResponseMaxSize = -1 + require.ErrorContains(t, cfg.Validate(), "batch response max size cannot be negative") + }) + + t.Run("allowsZeroToDisableLimits", func(t *testing.T) { + cfg := DefaultJSONRPCConfig() + cfg.BatchRequestLimit = 0 + cfg.BatchResponseMaxSize = 0 + require.NoError(t, cfg.Validate()) + }) +} + +func TestGetConfig_AllowUnprotectedTxs(t *testing.T) { + tests := []struct { + name string + viperVal interface{} + expected bool + }{ + { + name: "allow unprotected txs enabled", + viperVal: true, + expected: true, + }, + { + name: "allow unprotected txs disabled", + viperVal: false, + expected: false, + }, + { + name: "allow unprotected txs not set (default)", + viperVal: nil, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := viper.New() + // Set the test value + if tt.viperVal != nil { + v.Set("json-rpc.allow-unprotected-txs", tt.viperVal) + } + + cfg, err := GetConfig(v) + require.NoError(t, err) + require.Equal(t, tt.expected, cfg.JSONRPC.AllowUnprotectedTxs) + }) + } +} + +func TestJSONRPCWsOriginsValidation(t *testing.T) { + newConfig := func() *JSONRPCConfig { + return DefaultJSONRPCConfig() + } + + t.Run("allowsEmpty", func(t *testing.T) { + cfg := newConfig() + cfg.WsOrigins = nil + require.NoError(t, cfg.Validate()) + }) + + t.Run("allowsStar", func(t *testing.T) { + cfg := newConfig() + cfg.WsOrigins = []string{"*"} + require.NoError(t, cfg.Validate()) + }) + + t.Run("rejectsStarMixedWithOthers", func(t *testing.T) { + cfg := newConfig() + cfg.WsOrigins = []string{"*", "http://example.com"} + require.Error(t, cfg.Validate()) + }) + + t.Run("rejectsInvalidOrigin", func(t *testing.T) { + cfg := newConfig() + cfg.WsOrigins = []string{"not a url"} + require.Error(t, cfg.Validate()) + }) + + t.Run("allowsDuplicateOriginMixedCase", func(t *testing.T) { + cfg := newConfig() + cfg.WsOrigins = []string{"HTTP://Example.COM", "http://example.com/"} + require.NoError(t, cfg.Validate()) + }) + + t.Run("ignoresWhitespaceOnly", func(t *testing.T) { + cfg := newConfig() + cfg.WsOrigins = []string{" \t "} + require.NoError(t, cfg.Validate()) + }) } diff --git a/server/config/toml.go b/server/config/toml.go index b82d492c7f..660c346516 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -28,13 +28,12 @@ const DefaultConfigTemplate = ` # Valid types are: json|struct|access_list|markdown tracer = "{{ .EVM.Tracer }}" -# MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode. -max-tx-gas-wanted = {{ .EVM.MaxTxGasWanted }} - # BlockExecutor set block executor type, "block-stm" for parallel execution, "sequential" for sequential execution. block-executor = "{{ .EVM.BlockExecutor }}" # BlockSTMWorkers is the number of workers for block-stm execution, 0 means using all available CPUs. block-stm-workers = {{ .EVM.BlockSTMWorkers }} +# BlockSTMPreEstimate is the flag to enable pre-estimation for block-stm execution. +block-stm-pre-estimate = {{ .EVM.BlockSTMPreEstimate }} ############################################################################### ### JSON RPC Configuration ### @@ -51,6 +50,11 @@ address = "{{ .JSONRPC.Address }}" # Address defines the EVM WebSocket server address to bind to. ws-address = "{{ .JSONRPC.WsAddress }}" +# WsOrigins defines allowed browser WebSocket origins. Empty list rejects non-empty Origin headers. +# Use "*" to allow all browser origins. +# Example: "https://app.example.com,https://staging.example.com" +ws-origins = "{{range $index, $elmt := .JSONRPC.WsOrigins}}{{if $index}},{{$elmt}}{{else}}{{$elmt}}{{end}}{{end}}" + # API defines a list of JSON-RPC namespaces that should be enabled # Example: "eth,txpool,personal,net,debug,web3" api = "{{range $index, $elmt := .JSONRPC.API}}{{if $index}},{{$elmt}}{{else}}{{$elmt}}{{end}}{{end}}" @@ -82,6 +86,12 @@ http-timeout = "{{ .JSONRPC.HTTPTimeout }}" # HTTPIdleTimeout is the idle timeout of http json-rpc server. http-idle-timeout = "{{ .JSONRPC.HTTPIdleTimeout }}" +# Maximum number of requests in a JSON-RPC batch (0 disables the limit; default matches go-ethereum). +batch-request-limit = {{ .JSONRPC.BatchRequestLimit }} + +# Maximum cumulative response size in bytes for a JSON-RPC batch (0 disables the limit; default matches go-ethereum). +batch-response-max-size = {{ .JSONRPC.BatchResponseMaxSize }} + # AllowUnprotectedTxs restricts unprotected (non EIP155 signed) transactions to be submitted via # the node's RPC when the global parameter is disabled. allow-unprotected-txs = {{ .JSONRPC.AllowUnprotectedTxs }} @@ -106,6 +116,10 @@ fix-revert-gas-refund-height = {{ .JSONRPC.FixRevertGasRefundHeight }} # Maximum number of bytes returned from eth_call or similar invocations. return-data-limit = {{ .JSONRPC.ReturnDataLimit }} +# RestrictUserInput will restrict some user input to the JSON-RPC debug apis, +# must be set to true if serving debug namespace to the public. +restrict-user-input = {{ .JSONRPC.RestrictUserInput }} + ############################################################################### ### TLS Configuration ### ############################################################################### diff --git a/server/flags/flags.go b/server/flags/flags.go index 02dc161342..8863686d94 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -35,11 +35,13 @@ const ( // GRPC-related flags. const ( - GRPCOnly = "grpc-only" - GRPCEnable = "grpc.enable" - GRPCAddress = "grpc.address" - GRPCWebEnable = "grpc-web.enable" - GRPCWebAddress = "grpc-web.address" + GRPCOnly = "grpc-only" + GRPCEnable = "grpc.enable" + GRPCAddress = "grpc.address" + GRPCWebEnable = "grpc-web.enable" + GRPCWebAddress = "grpc-web.address" + GRPCSkipCheckHeader = "grpc.skip-check-header" + GRPCHistoricalAddressBlockRange = "grpc.historical-address-block-range" ) // Cosmos API flags @@ -50,36 +52,40 @@ const ( // JSON-RPC flags const ( - JSONRPCEnable = "json-rpc.enable" - JSONRPCAPI = "json-rpc.api" - JSONRPCAddress = "json-rpc.address" - JSONWsAddress = "json-rpc.ws-address" - JSONRPCGasCap = "json-rpc.gas-cap" - JSONRPCEVMTimeout = "json-rpc.evm-timeout" - JSONRPCTxFeeCap = "json-rpc.txfee-cap" - JSONRPCFilterCap = "json-rpc.filter-cap" - JSONRPCLogsCap = "json-rpc.logs-cap" - JSONRPCBlockRangeCap = "json-rpc.block-range-cap" - JSONRPCHTTPTimeout = "json-rpc.http-timeout" - JSONRPCHTTPIdleTimeout = "json-rpc.http-idle-timeout" - JSONRPCAllowUnprotectedTxs = "json-rpc.allow-unprotected-txs" - JSONRPCMaxOpenConnections = "json-rpc.max-open-connections" - JSONRPCEnableIndexer = "json-rpc.enable-indexer" - JSONRPCAllowIndexerGap = "json-rpc.allow-indexer-gap" + JSONRPCEnable = "json-rpc.enable" + JSONRPCAPI = "json-rpc.api" + JSONRPCAddress = "json-rpc.address" + JSONWsAddress = "json-rpc.ws-address" + JSONRPCWsOrigins = "json-rpc.ws-origins" + JSONRPCGasCap = "json-rpc.gas-cap" + JSONRPCEVMTimeout = "json-rpc.evm-timeout" + JSONRPCTxFeeCap = "json-rpc.txfee-cap" + JSONRPCFilterCap = "json-rpc.filter-cap" + JSONRPCLogsCap = "json-rpc.logs-cap" + JSONRPCBlockRangeCap = "json-rpc.block-range-cap" + JSONRPCHTTPTimeout = "json-rpc.http-timeout" + JSONRPCHTTPIdleTimeout = "json-rpc.http-idle-timeout" + JSONRPCAllowUnprotectedTxs = "json-rpc.allow-unprotected-txs" + JSONRPCMaxOpenConnections = "json-rpc.max-open-connections" + JSONRPCEnableIndexer = "json-rpc.enable-indexer" + JSONRPCBatchRequestLimit = "json-rpc.batch-request-limit" + JSONRPCBatchResponseMaxSize = "json-rpc.batch-response-max-size" + JSONRPCAllowIndexerGap = "json-rpc.allow-indexer-gap" // JSONRPCEnableMetrics enables EVM RPC metrics server. // Set to `metrics` which is hardcoded flag from go-ethereum. // https://github.com/ethereum/go-ethereum/blob/master/metrics/metrics.go#L35-L55 JSONRPCEnableMetrics = "metrics" JSONRPCFixRevertGasRefundHeight = "json-rpc.fix-revert-gas-refund-height" JSONRPCReturnDataLimit = "json-rpc.return-data-limit" + JSONRPCRestrictUserInput = "json-rpc.restrict-user-input" ) // EVM flags const ( - EVMTracer = "evm.tracer" - EVMMaxTxGasWanted = "evm.max-tx-gas-wanted" - EVMBlockExecutor = "evm.block-executor" - EVMBlockSTMWorkers = "evm.block-stm-workers" + EVMTracer = "evm.tracer" + EVMBlockExecutor = "evm.block-executor" + EVMBlockSTMWorkers = "evm.block-stm-workers" + EVMBlockSTMPreEstimate = "evm.block-stm-pre-estimate" ) // TLS flags diff --git a/server/indexer_cmd.go b/server/indexer_cmd.go index 5aebd5c121..a36a98fb30 100644 --- a/server/indexer_cmd.go +++ b/server/indexer_cmd.go @@ -17,6 +17,7 @@ package server import ( "fmt" + "strconv" "github.com/spf13/cobra" @@ -28,18 +29,21 @@ import ( "github.com/evmos/ethermint/indexer" ) +const directionRange = "range" + func NewIndexTxCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "index-eth-tx [backward|forward]", + Use: "index-eth-tx [backward|forward|range ]", Short: "Index historical eth txs", Long: `Index historical eth txs, it only support two traverse direction to avoid creating gaps in the indexer db if using arbitrary block ranges: - backward: index the blocks from the first indexed block to the earliest block in the chain, if indexer db is empty, start from the latest block. - forward: index the blocks from the latest indexed block to latest block in the chain. + - range : re-index a specific inclusive block range, overwriting any existing entries. When start the node, the indexer start from the latest indexed block to avoid creating gap. Backward mode should be used most of the time, so the latest indexed block is always up-to-date. `, - Args: cobra.ExactArgs(1), + Args: cobra.RangeArgs(1, 3), RunE: func(cmd *cobra.Command, args []string) error { serverCtx := server.GetServerContextFromCmd(cmd) clientCtx, err := client.GetClientQueryContext(cmd) @@ -48,8 +52,11 @@ func NewIndexTxCmd() *cobra.Command { } direction := args[0] - if direction != "backward" && direction != "forward" { - return fmt.Errorf("unknown index direction, expect: backward|forward, got: %s", direction) + if direction != "backward" && direction != "forward" && direction != directionRange { + return fmt.Errorf("unknown index direction, expect: backward|forward|range, got: %s", direction) + } + if direction == directionRange && len(args) != 3 { + return fmt.Errorf("range requires exactly two arguments: ") } cfg := serverCtx.Config @@ -122,6 +129,26 @@ func NewIndexTxCmd() *cobra.Command { return err } } + case directionRange: + start, err := strconv.ParseInt(args[1], 10, 64) + if err != nil { + return fmt.Errorf("invalid start block: %w", err) + } + end, err := strconv.ParseInt(args[2], 10, 64) + if err != nil { + return fmt.Errorf("invalid end block: %w", err) + } + if start <= 0 || end < start { + return fmt.Errorf("invalid range: start must be > 0 and end >= start, got %d-%d", start, end) + } + if end > blockStore.Height() { + return fmt.Errorf("end block %d exceeds current chain height %d", end, blockStore.Height()) + } + for i := start; i <= end; i++ { + if err := indexBlock(i); err != nil { + return err + } + } default: return fmt.Errorf("unknown direction %s", args[0]) } diff --git a/server/json_rpc.go b/server/json_rpc.go index 9a18e14333..95e7997ca1 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -16,7 +16,9 @@ package server import ( + "context" "fmt" + "log/slog" "net/http" "time" @@ -27,68 +29,48 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server" - ethlog "github.com/ethereum/go-ethereum/log" ethrpc "github.com/ethereum/go-ethereum/rpc" - "github.com/evmos/ethermint/app/ante" + "github.com/evmos/ethermint/evmd/ante" "github.com/evmos/ethermint/rpc" "github.com/evmos/ethermint/rpc/stream" + rpctypes "github.com/evmos/ethermint/rpc/types" "github.com/evmos/ethermint/server/config" ethermint "github.com/evmos/ethermint/types" ) -const ( - ServerStartTime = 5 * time.Second - MaxRetry = 6 -) +const ServerStartTime = 5 * time.Second -type AppWithPendingTxStream interface { +type PendingTxListener interface { RegisterPendingTxListener(listener ante.PendingTxListener) } // StartJSONRPC starts the JSON-RPC server -func StartJSONRPC(srvCtx *server.Context, +func StartJSONRPC( + ctx context.Context, + srvCtx *server.Context, clientCtx client.Context, g *errgroup.Group, config *config.Config, indexer ethermint.EVMTxIndexer, - app AppWithPendingTxStream, -) (*http.Server, chan struct{}, error) { + app PendingTxListener, +) (*http.Server, error) { logger := srvCtx.Logger.With("module", "geth") + // Set Geth's global logger to use this handler + handler := &CustomSlogHandler{logger: logger} + slog.SetDefault(slog.New(handler)) evtClient, ok := clientCtx.Client.(rpcclient.EventsClient) if !ok { - return nil, nil, fmt.Errorf("client %T does not implement EventsClient", clientCtx.Client) + return nil, fmt.Errorf("client %T does not implement EventsClient", clientCtx.Client) } - var rpcStream *stream.RPCStream - var err error - for i := 0; i < MaxRetry; i++ { - rpcStream, err = stream.NewRPCStreams(evtClient, logger, clientCtx.TxConfig.TxDecoder()) - if err == nil { - break - } - time.Sleep(time.Second) - } - - if err != nil { - return nil, nil, fmt.Errorf("failed to create rpc streams after %d attempts: %w", MaxRetry, err) - } + queryClient := rpctypes.NewQueryClient(clientCtx) + rpcStream := stream.NewRPCStreams(evtClient, logger, clientCtx.TxConfig.TxDecoder(), queryClient.ValidatorAccount) app.RegisterPendingTxListener(rpcStream.ListenPendingTx) - ethlog.Root().SetHandler(ethlog.FuncHandler(func(r *ethlog.Record) error { - switch r.Lvl { - case ethlog.LvlTrace, ethlog.LvlDebug: - logger.Debug(r.Msg, r.Ctx...) - case ethlog.LvlInfo, ethlog.LvlWarn: - logger.Info(r.Msg, r.Ctx...) - case ethlog.LvlError, ethlog.LvlCrit: - logger.Error(r.Msg, r.Ctx...) - } - return nil - })) - rpcServer := ethrpc.NewServer() + rpcServer.SetBatchLimits(config.JSONRPC.BatchRequestLimit, config.JSONRPC.BatchResponseMaxSize) allowUnprotectedTxs := config.JSONRPC.AllowUnprotectedTxs rpcAPIArr := config.JSONRPC.API @@ -102,7 +84,7 @@ func StartJSONRPC(srvCtx *server.Context, "namespace", api.Namespace, "service", api.Service, ) - return nil, nil, err + return nil, err } } @@ -126,12 +108,29 @@ func StartJSONRPC(srvCtx *server.Context, ln, err := Listen(httpSrv.Addr, config) if err != nil { - return nil, nil, err + return nil, err } g.Go(func() error { srvCtx.Logger.Info("Starting JSON-RPC server", "address", config.JSONRPC.Address) - if err := httpSrv.Serve(ln); err != nil { + errCh := make(chan error) + go func() { + errCh <- httpSrv.Serve(ln) + }() + + // Start a blocking select to wait for an indication to stop the server or that + // the server failed to start properly. + select { + case <-ctx.Done(): + // The calling process canceled or closed the provided context, so we must + // gracefully stop the JSON-RPC server. + logger.Info("stopping JSON-RPC server...", "address", config.JSONRPC.Address) + if err := httpSrv.Shutdown(context.Background()); err != nil { + logger.Error("failed to shutdown JSON-RPC server", "error", err.Error()) + } + return nil + + case err := <-errCh: if err == http.ErrServerClosed { close(httpSrvDone) } @@ -139,12 +138,11 @@ func StartJSONRPC(srvCtx *server.Context, srvCtx.Logger.Error("failed to start JSON-RPC server", "error", err.Error()) return err } - return nil }) srvCtx.Logger.Info("Starting JSON WebSocket server", "address", config.JSONRPC.WsAddress) - wsSrv := rpc.NewWebsocketsServer(clientCtx, srvCtx.Logger, rpcStream, config) + wsSrv := rpc.NewWebsocketsServer(ctx, clientCtx, srvCtx.Logger, rpcStream, config) wsSrv.Start() - return httpSrv, httpSrvDone, nil + return httpSrv, nil } diff --git a/server/json_rpc_test.go b/server/json_rpc_test.go new file mode 100644 index 0000000000..41f7bc08c0 --- /dev/null +++ b/server/json_rpc_test.go @@ -0,0 +1,49 @@ +package server + +import ( + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + + ethrpc "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" +) + +type batchLimitTestAPI struct{} + +func (batchLimitTestAPI) Ping() string { return "pong" } + +// TestJSONRPCBatchItemLimitEnforced verifies go-ethereum's SetBatchLimits behavior over HTTP. +// StartJSONRPC applies the same mechanism using config.JSONRPC.BatchRequestLimit / BatchResponseMaxSize. +func TestJSONRPCBatchItemLimitEnforced(t *testing.T) { + srv := ethrpc.NewServer() + srv.SetBatchLimits(4, 25*1000*1000) + require.NoError(t, srv.RegisterName("eth", batchLimitTestAPI{})) + + ts := httptest.NewServer(http.HandlerFunc(srv.ServeHTTP)) + t.Cleanup(ts.Close) + + // Five batched calls exceed item limit of four; expect "batch too large" (go-ethereum rpc). + const batchBody = `[` + + `{"jsonrpc":"2.0","method":"eth_ping","params":[],"id":1},` + + `{"jsonrpc":"2.0","method":"eth_ping","params":[],"id":2},` + + `{"jsonrpc":"2.0","method":"eth_ping","params":[],"id":3},` + + `{"jsonrpc":"2.0","method":"eth_ping","params":[],"id":4},` + + `{"jsonrpc":"2.0","method":"eth_ping","params":[],"id":5}` + + `]` + + req, err := http.NewRequest(http.MethodPost, ts.URL, strings.NewReader(batchBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + t.Cleanup(func() { _ = resp.Body.Close() }) + + require.Equal(t, http.StatusOK, resp.StatusCode) + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Contains(t, string(body), "batch too large") +} diff --git a/server/log_handler.go b/server/log_handler.go new file mode 100644 index 0000000000..767c0c4776 --- /dev/null +++ b/server/log_handler.go @@ -0,0 +1,53 @@ +package server + +import ( + "context" + "log/slog" + + "cosmossdk.io/log/v2" +) + +// CustomSlogHandler bridges Geth's slog logs to the existing Cosmos SDK logger. +type CustomSlogHandler struct { + logger log.Logger +} + +// Handle processes slog records and forwards them to your Cosmos SDK logger. +func (h *CustomSlogHandler) Handle(_ context.Context, r slog.Record) error { + attrs := []interface{}{} + r.Attrs(func(attr slog.Attr) bool { + attrs = append(attrs, attr.Key, attr.Value.Any()) + return true + }) + + // Map slog levels to Cosmos SDK logger + switch r.Level { + case slog.LevelDebug: + h.logger.Debug(r.Message, attrs...) + case slog.LevelInfo: + h.logger.Info(r.Message, attrs...) + case slog.LevelWarn: + h.logger.Warn(r.Message, attrs...) + case slog.LevelError: + h.logger.Error(r.Message, attrs...) + default: + h.logger.Info(r.Message, attrs...) + } + + return nil +} + +// Enabled determines if the handler should log a given level. +func (h *CustomSlogHandler) Enabled(_ context.Context, _ slog.Level) bool { + return true +} + +// WithAttrs allows adding additional attributes. +func (h *CustomSlogHandler) WithAttrs(_ []slog.Attr) slog.Handler { + return h +} + +// WithGroup is required to implement slog.Handler (not used). +func (h *CustomSlogHandler) WithGroup(_ string) slog.Handler { + return h +} diff --git a/server/start.go b/server/start.go index e1a5854ac6..8a1efb17c2 100644 --- a/server/start.go +++ b/server/start.go @@ -18,13 +18,10 @@ package server import ( "context" "fmt" - "io" "net" - "net/http" "os" "path/filepath" "runtime/pprof" - "time" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -47,12 +44,10 @@ import ( cmttypes "github.com/cometbft/cometbft/types" dbm "github.com/cosmos/cosmos-db" - "github.com/cosmos/rosetta" - ethmetricsexp "github.com/ethereum/go-ethereum/metrics/exp" errorsmod "cosmossdk.io/errors" - pruningtypes "cosmossdk.io/store/pruning/types" + "cosmossdk.io/log/v2" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" @@ -61,7 +56,7 @@ import ( servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" servercmtlog "github.com/cosmos/cosmos-sdk/server/log" "github.com/cosmos/cosmos-sdk/server/types" - sdk "github.com/cosmos/cosmos-sdk/types" + pruningtypes "github.com/cosmos/cosmos-sdk/store/v2/pruning/types" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/evmos/ethermint/indexer" @@ -71,9 +66,19 @@ import ( ethermint "github.com/evmos/ethermint/types" ) +const FlagAsyncCheckTx = "async-check-tx" + // DBOpener is a function to open `application.db`, potentially with customized options. type DBOpener func(opts types.AppOptions, rootDir string, backend dbm.BackendType) (dbm.DB, error) +type AppWithPendingTxListener interface { + types.Application + PendingTxListener +} + +// AppCreator lazily builds an application that implements AppWithPendingTxListener. +type AppCreator func(log.Logger, dbm.DB, types.AppOptions) AppWithPendingTxListener + // StartOptions defines options that can be customized in `StartCmd` type StartOptions struct { AppCreator types.AppCreator @@ -81,10 +86,12 @@ type StartOptions struct { DBOpener DBOpener } -// NewDefaultStartOptions use the default db opener provided in tm-db. -func NewDefaultStartOptions(appCreator types.AppCreator, defaultNodeHome string) StartOptions { +// NewDefaultStartOptions wraps appCreator for the SDK server and uses the default openDB opener. +func NewDefaultStartOptions(appCreator AppCreator, defaultNodeHome string) StartOptions { return StartOptions{ - AppCreator: appCreator, + AppCreator: func(l log.Logger, d dbm.DB, ao types.AppOptions) types.Application { + return appCreator(l, d, ao) + }, DefaultNodeHome: defaultNodeHome, DBOpener: openDB, } @@ -178,7 +185,7 @@ which accepts a path for the resulting pprof file. cmd.Flags().Bool(srvflags.WithCometBFT, true, "Run abci app embedded in-process with tendermint") cmd.Flags().String(srvflags.Address, "tcp://0.0.0.0:26658", "Listen address") cmd.Flags().String(srvflags.Transport, "socket", "Transport protocol: socket, grpc") - cmd.Flags().String(srvflags.TraceStore, "", "Enable KVStore tracing to an output file") + cmd.Flags().String(srvflags.TraceStore, "", "[unsupported since SDK v0.54] Enable KVStore tracing to an output file") cmd.Flags().String(server.FlagMinGasPrices, "", "Minimum gas prices to accept for transactions; Any fee in a tx must meet this minimum (e.g. 0.01photon;0.0001stake)") //nolint:lll cmd.Flags().IntSlice(server.FlagUnsafeSkipUpgrades, []int{}, "Skip a set of upgrade heights to continue the old binary") cmd.Flags().Uint64(server.FlagHaltHeight, 0, "Block height at which to gracefully halt the chain and shutdown the node") @@ -196,7 +203,9 @@ which accepts a path for the resulting pprof file. cmd.Flags().Bool(srvflags.GRPCOnly, false, "Start the node in gRPC query only mode without CometBFT process") cmd.Flags().Bool(srvflags.GRPCEnable, true, "Define if the gRPC server should be enabled") cmd.Flags().String(srvflags.GRPCAddress, serverconfig.DefaultGRPCAddress, "the gRPC server address to listen on") + cmd.Flags().Bool(srvflags.GRPCSkipCheckHeader, false, "Define if the gRPC server should bypass check header") cmd.Flags().Bool(srvflags.GRPCWebEnable, true, "Define if the gRPC-Web server should be enabled. (Note: gRPC must also be enabled.)") + cmd.Flags().String(srvflags.GRPCHistoricalAddressBlockRange, "", "Define if historical grpc and block range is available") cmd.Flags().Bool(srvflags.RPCEnable, false, "Defines if Cosmos-sdk REST server should be enabled") cmd.Flags().Bool(srvflags.EnabledUnsafeCors, false, "Defines if CORS should be enabled (unsafe - use it at your own risk)") @@ -205,28 +214,34 @@ which accepts a path for the resulting pprof file. cmd.Flags().StringSlice(srvflags.JSONRPCAPI, config.GetDefaultAPINamespaces(), "Defines a list of JSON-RPC namespaces that should be enabled") cmd.Flags().String(srvflags.JSONRPCAddress, config.DefaultJSONRPCAddress, "the JSON-RPC server address to listen on") cmd.Flags().String(srvflags.JSONWsAddress, config.DefaultJSONRPCWsAddress, "the JSON-RPC WS server address to listen on") - cmd.Flags().Uint64(srvflags.JSONRPCGasCap, config.DefaultGasCap, "Sets a cap on gas that can be used in eth_call/estimateGas unit is aphoton (0=infinite)") //nolint:lll - cmd.Flags().Float64(srvflags.JSONRPCTxFeeCap, config.DefaultTxFeeCap, "Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 photon)") //nolint:lll + cmd.Flags().StringSlice(srvflags.JSONRPCWsOrigins, []string{}, "Defines allowed browser WebSocket origins. Empty list rejects non-empty Origin headers; use '*' to allow all browser origins") //nolint:lll + cmd.Flags().Uint64(srvflags.JSONRPCGasCap, config.DefaultGasCap, "Sets a cap on gas that can be used in eth_call/estimateGas unit is aphoton (0=infinite)") //nolint:lll + cmd.Flags().Float64(srvflags.JSONRPCTxFeeCap, config.DefaultTxFeeCap, "Sets a cap on transaction fee that can be sent via the RPC APIs (1 = default 1 photon)") //nolint:lll cmd.Flags().Int32(srvflags.JSONRPCFilterCap, config.DefaultFilterCap, "Sets the global cap for total number of filters that can be created") cmd.Flags().Duration(srvflags.JSONRPCEVMTimeout, config.DefaultEVMTimeout, "Sets a timeout used for eth_call (0=infinite)") cmd.Flags().Duration(srvflags.JSONRPCHTTPTimeout, config.DefaultHTTPTimeout, "Sets a read/write timeout for json-rpc http server (0=infinite)") cmd.Flags().Duration(srvflags.JSONRPCHTTPIdleTimeout, config.DefaultHTTPIdleTimeout, "Sets a idle timeout for json-rpc http server (0=infinite)") cmd.Flags().Bool(srvflags.JSONRPCAllowUnprotectedTxs, config.DefaultAllowUnprotectedTxs, "Allow for unprotected (non EIP155 signed) transactions to be submitted via the node's RPC when the global parameter is disabled") //nolint:lll + cmd.Flags().Int(srvflags.JSONRPCBatchRequestLimit, config.DefaultBatchRequestLimit, "Maximum number of requests in a batch") + cmd.Flags().Int(srvflags.JSONRPCBatchResponseMaxSize, config.DefaultBatchResponseMaxSize, "Maximum size of server response") cmd.Flags().Int32(srvflags.JSONRPCLogsCap, config.DefaultLogsCap, "Sets the max number of results can be returned from single `eth_getLogs` query") cmd.Flags().Int32(srvflags.JSONRPCBlockRangeCap, config.DefaultBlockRangeCap, "Sets the max block range allowed for `eth_getLogs` query") cmd.Flags().Int(srvflags.JSONRPCMaxOpenConnections, config.DefaultMaxOpenConnections, "Sets the maximum number of simultaneous connections for the server listener") //nolint:lll cmd.Flags().Bool(srvflags.JSONRPCEnableIndexer, false, "Enable the custom tx indexer for json-rpc") cmd.Flags().Bool(srvflags.JSONRPCAllowIndexerGap, true, "Allow block gap for the custom tx indexer for json-rpc") + cmd.Flags().Bool(srvflags.JSONRPCRestrictUserInput, false, "Restrict some user input to the JSON-RPC debug apis, must be set to true if serving debug namespace to the public") //nolint:lll cmd.Flags().Bool(srvflags.JSONRPCEnableMetrics, false, "Define if EVM rpc metrics server should be enabled") - cmd.Flags().String(srvflags.EVMTracer, config.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") //nolint:lll - cmd.Flags().Uint64(srvflags.EVMMaxTxGasWanted, config.DefaultMaxTxGasWanted, "the gas wanted for each eth tx returned in ante handler in check tx mode") //nolint:lll + cmd.Flags().String(srvflags.EVMTracer, config.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") //nolint:lll //nolint:lll cmd.Flags().String(srvflags.TLSCertPath, "", "the cert.pem file path for the server TLS configuration") cmd.Flags().String(srvflags.TLSKeyPath, "", "the key.pem file path for the server TLS configuration") cmd.Flags().Uint64(server.FlagStateSyncSnapshotInterval, 0, "State sync snapshot interval") cmd.Flags().Uint32(server.FlagStateSyncSnapshotKeepRecent, 2, "State sync snapshot to keep") + cmd.Flags().Int(server.FlagMempoolMaxTxs, config.DefaultMaxTxs, "Sets MaxTx value for the app-side mempool") + + cmd.Flags().Bool(FlagAsyncCheckTx, false, "Enable async check tx [experimental]") // add support for all CometBFT-specific command line options tcmd.AddNodeFlags(cmd) @@ -238,24 +253,16 @@ func startStandAlone(svrCtx *server.Context, opts StartOptions) error { transport := svrCtx.Viper.GetString(srvflags.Transport) home := svrCtx.Viper.GetString(flags.FlagHome) - db, err := opts.DBOpener(svrCtx.Viper, home, server.GetAppDBBackend(svrCtx.Viper)) - if err != nil { - return err + if svrCtx.Viper.GetString(srvflags.TraceStore) != "" { + svrCtx.Logger.Error("--trace-store is no longer supported and has no effect; store tracing was removed in the SDK v0.54 migration") } - defer func() { - if err := db.Close(); err != nil { - svrCtx.Logger.Error("error closing db", "error", err.Error()) - } - }() - - traceWriterFile := svrCtx.Viper.GetString(srvflags.TraceStore) - traceWriter, err := openTraceWriter(traceWriterFile) + db, err := opts.DBOpener(svrCtx.Viper, home, server.GetAppDBBackend(svrCtx.Viper)) if err != nil { return err } - app := opts.AppCreator(svrCtx.Logger, db, traceWriter, svrCtx.Viper) + app := opts.AppCreator(svrCtx.Logger, db, svrCtx.Viper) defer func() { if err := app.Close(); err != nil { svrCtx.Logger.Error("close application failed", "error", err.Error()) @@ -310,22 +317,13 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start logger := svrCtx.Logger g, ctx := getCtx(svrCtx, true) - db, err := opts.DBOpener(svrCtx.Viper, home, server.GetAppDBBackend(svrCtx.Viper)) - if err != nil { - logger.Error("failed to open DB", "error", err.Error()) - return err + if svrCtx.Viper.GetString(srvflags.TraceStore) != "" { + logger.Error("--trace-store is no longer supported and has no effect; store tracing was removed in the SDK v0.54 migration") } - defer func() { - if err := db.Close(); err != nil { - logger.With("error", err).Error("error closing db") - } - }() - - traceWriterFile := svrCtx.Viper.GetString(srvflags.TraceStore) - traceWriter, err := openTraceWriter(traceWriterFile) + db, err := opts.DBOpener(svrCtx.Viper, home, server.GetAppDBBackend(svrCtx.Viper)) if err != nil { - logger.Error("failed to open trace writer", "error", err.Error()) + logger.Error("failed to open DB", "error", err.Error()) return err } @@ -340,7 +338,7 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start return err } - app := opts.AppCreator(svrCtx.Logger, db, traceWriter, svrCtx.Viper) + app := opts.AppCreator(svrCtx.Logger, db, svrCtx.Viper) defer func() { if err := app.Close(); err != nil { logger.Error("close application failed", "error", err.Error()) @@ -368,12 +366,21 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start logger.Info("starting node with ABCI CometBFT in-process") cmtApp := server.NewCometABCIWrapper(app) + + var clientCreator proxy.ClientCreator + if svrCtx.Viper.GetBool(FlagAsyncCheckTx) { + logger.Info("enabling async check tx") + clientCreator = proxy.NewConnSyncLocalClientCreator(cmtApp) + } else { + clientCreator = proxy.NewLocalClientCreator(cmtApp) + } + tmNode, err = node.NewNodeWithContext( ctx, cfg, pvm.LoadOrGenFilePV(cfg.PrivValidatorKeyFile(), cfg.PrivValidatorStateFile()), nodeKey, - proxy.NewLocalClientCreator(cmtApp), + clientCreator, genDocProvider, cmtcfg.DefaultDBProvider, node.DefaultMetricsProvider(cfg.Instrumentation), @@ -430,10 +437,11 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start idxer = indexer.NewKVIndexer(idxDB, idxLogger, clientCtx) indexerService := NewEVMIndexerService(idxer, clientCtx.Client.(rpcclient.Client), config.JSONRPC.AllowIndexerGap) indexerService.SetLogger(servercmtlog.CometLoggerWrapper{Logger: idxLogger}) - - g.Go(func() error { - return indexerService.Start() - }) + go func() { + if err := indexerService.Start(); err != nil { + logger.Error("failed to start evm indexer service", "error", err.Error()) + } + }() } if config.API.Enable || config.JSONRPC.Enable { @@ -454,30 +462,12 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start if err != nil { return err } - if grpcSrv != nil { - defer grpcSrv.GracefulStop() - } - apiSrv := startAPIServer(ctx, svrCtx, clientCtx, g, config.Config, app, grpcSrv, metrics) - if apiSrv != nil { - defer apiSrv.Close() - } + startAPIServer(ctx, svrCtx, clientCtx, g, config.Config, app, grpcSrv, metrics) - clientCtx, httpSrv, httpSrvDone, err := startJSONRPCServer(svrCtx, clientCtx, g, config, genDocProvider, idxer, app) - if httpSrv != nil { - defer func() { - shutdownCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) - defer cancelFn() - if err := httpSrv.Shutdown(shutdownCtx); err != nil { - logger.Error("HTTP server shutdown produced a warning", "error", err.Error()) - } else { - logger.Info("HTTP server shut down, waiting 5 sec") - select { - case <-time.Tick(5 * time.Second): - case <-httpSrvDone: - } - } - }() + clientCtx, err = startJSONRPCServer(ctx, svrCtx, clientCtx, g, config, genDocProvider, idxer, app) + if err != nil { + return err } // At this point it is safe to block the process if we're in query only mode as @@ -487,10 +477,6 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start return g.Wait() } - if err := startRosettaServer(svrCtx, clientCtx, g, config); err != nil { - return err - } - return g.Wait() } @@ -505,24 +491,11 @@ func OpenIndexerDB(rootDir string, backendType dbm.BackendType) (dbm.DB, error) return dbm.NewDB("evmindexer", backendType, dataDir) } -func openTraceWriter(traceWriterFile string) (w io.Writer, err error) { - if traceWriterFile == "" { - return - } - - filePath := filepath.Clean(traceWriterFile) - return os.OpenFile( - filePath, - os.O_WRONLY|os.O_APPEND|os.O_CREATE, - 0o600, - ) -} - -func startTelemetry(cfg config.Config) (*telemetry.Metrics, error) { - if !cfg.Telemetry.Enabled { +func startTelemetry(cfg config.Config) (*telemetry.Metrics, error) { //nolint:staticcheck + if !cfg.Telemetry.Enabled { //nolint:staticcheck return nil, nil } - return telemetry.New(cfg.Telemetry) + return telemetry.New(cfg.Telemetry) //nolint:staticcheck } // wrapCPUProfile runs callback in a goroutine, then wait for quit signals. @@ -591,7 +564,7 @@ func startGrpcServer( } // if gRPC is enabled, configure gRPC client for gRPC gateway and json-rpc - grpcClient, err := grpc.Dial( + grpcClient, err := grpc.NewClient( config.Address, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultCallOptions( @@ -629,26 +602,26 @@ func startAPIServer( svrCfg serverconfig.Config, app types.Application, grpcSrv *grpc.Server, - metrics *telemetry.Metrics, -) *api.Server { + metrics *telemetry.Metrics, //nolint:staticcheck +) { if !svrCfg.API.Enable { - return nil + return } apiSrv := api.New(clientCtx, svrCtx.Logger.With("server", "api"), grpcSrv) app.RegisterAPIRoutes(apiSrv, svrCfg.API) - if svrCfg.Telemetry.Enabled { - apiSrv.SetTelemetry(metrics) + if svrCfg.Telemetry.Enabled { //nolint:staticcheck + apiSrv.SetTelemetry(metrics) //nolint:staticcheck } g.Go(func() error { return apiSrv.Start(ctx, svrCfg) }) - return apiSrv } func startJSONRPCServer( + stdCtx context.Context, svrCtx *server.Context, clientCtx client.Context, g *errgroup.Group, @@ -656,76 +629,25 @@ func startJSONRPCServer( genDocProvider node.GenesisDocProvider, idxer ethermint.EVMTxIndexer, app types.Application, -) (ctx client.Context, httpSrv *http.Server, httpSrvDone chan struct{}, err error) { +) (ctx client.Context, err error) { ctx = clientCtx if !config.JSONRPC.Enable { - return + return ctx, err } - txApp, ok := app.(AppWithPendingTxStream) + txApp, ok := app.(PendingTxListener) if !ok { - return ctx, httpSrv, httpSrvDone, fmt.Errorf("json-rpc server requires AppWithPendingTxStream") + return ctx, fmt.Errorf("json-rpc server requires AppWithPendingTxStream") } genDoc, err := genDocProvider() if err != nil { - return ctx, httpSrv, httpSrvDone, err + return ctx, err } ctx = clientCtx.WithChainID(genDoc.ChainID) - g.Go(func() error { - httpSrv, httpSrvDone, err = StartJSONRPC(svrCtx, clientCtx, g, &config, idxer, txApp) - return err - }) - return -} - -func startRosettaServer( - svrCtx *server.Context, - clientCtx client.Context, - g *errgroup.Group, - config config.Config, -) error { - if !config.Rosetta.Enable { - return nil - } - - offlineMode := config.Rosetta.Offline - - // If GRPC is not enabled rosetta cannot work in online mode, so it works in - // offline mode. - if !config.GRPC.Enable { - offlineMode = true - } - - minGasPrices, err := sdk.ParseDecCoins(config.MinGasPrices) - if err != nil { - svrCtx.Logger.Error("failed to parse minimum-gas-prices", "error", err.Error()) - return err - } - - conf := &rosetta.Config{ - Blockchain: config.Rosetta.Blockchain, - Network: config.Rosetta.Network, - TendermintRPC: svrCtx.Config.RPC.ListenAddress, - GRPCEndpoint: config.GRPC.Address, - Addr: config.Rosetta.Addr, - Retries: config.Rosetta.Retries, - Offline: offlineMode, - GasToSuggest: config.Rosetta.GasToSuggest, - EnableFeeSuggestion: config.Rosetta.EnableFeeSuggestion, - GasPrices: minGasPrices.Sort(), - Codec: clientCtx.Codec.(*codec.ProtoCodec), - InterfaceRegistry: clientCtx.InterfaceRegistry, - } - - rosettaSrv, err := rosetta.ServerFromConfig(conf) - if err != nil { - return err - } - - g.Go(rosettaSrv.Start) - return nil + _, err = StartJSONRPC(stdCtx, svrCtx, clientCtx, g, &config, idxer, txApp) + return ctx, err } // returns a function which returns the genesis doc from the genesis file. diff --git a/server/start_test.go b/server/start_test.go new file mode 100644 index 0000000000..c1fb3bbc34 --- /dev/null +++ b/server/start_test.go @@ -0,0 +1,42 @@ +package server + +import ( + "testing" + + "cosmossdk.io/log/v2" + dbm "github.com/cosmos/cosmos-db" + "github.com/cosmos/cosmos-sdk/server/types" + "github.com/evmos/ethermint/evmd/ante" + "github.com/stretchr/testify/require" +) + +type mockApplication struct { + types.Application + pendingTxListeners []ante.PendingTxListener +} + +func (m *mockApplication) RegisterPendingTxListener(listener ante.PendingTxListener) { + m.pendingTxListeners = append(m.pendingTxListeners, listener) +} + +func mockAppCreator(logger log.Logger, db dbm.DB, opts types.AppOptions) AppWithPendingTxListener { + return &mockApplication{} +} + +func TestNewDefaultStartOptions(t *testing.T) { + defaultHome := "/tmp/test" + + opts := NewDefaultStartOptions(mockAppCreator, defaultHome) + + require.NotNil(t, opts.AppCreator) + require.Equal(t, defaultHome, opts.DefaultNodeHome) + require.NotNil(t, opts.DBOpener) + + logger := log.NewNopLogger() + db := dbm.NewMemDB() + var appOpts types.AppOptions + + app := opts.AppCreator(logger, db, appOpts) + require.NotNil(t, app) + +} diff --git a/server/util.go b/server/util.go index 4f9b24837a..78efe0449f 100644 --- a/server/util.go +++ b/server/util.go @@ -34,7 +34,7 @@ import ( "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/version" - tmlog "cosmossdk.io/log" + tmlog "cosmossdk.io/log/v2" cmtcmd "github.com/cometbft/cometbft/cmd/cometbft/commands" ) diff --git a/tests/importer/chain_ctx.go b/tests/importer/chain_ctx.go index e8cb372bd5..b73383ed08 100644 --- a/tests/importer/chain_ctx.go +++ b/tests/importer/chain_ctx.go @@ -20,11 +20,16 @@ import ( "github.com/ethereum/go-ethereum/common" ethcons "github.com/ethereum/go-ethereum/consensus" + ethcore "github.com/ethereum/go-ethereum/core" ethstate "github.com/ethereum/go-ethereum/core/state" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" ethrpc "github.com/ethereum/go-ethereum/rpc" ) +var _ ethcore.ChainContext = &ChainContext{} + // ChainContext implements Ethereum's core.ChainContext and consensus.Engine // interfaces. It is needed in order to apply and process Ethereum // transactions. There should only be a single implementation in Ethermint. For @@ -37,6 +42,8 @@ import ( type ChainContext struct { Coinbase common.Address headersByNumber map[uint64]*ethtypes.Header + headersByHash map[common.Hash]*ethtypes.Header + currentHeader *ethtypes.Header } // NewChainContext generates new ChainContext based on Ethereum's core.ChainContext and @@ -44,6 +51,7 @@ type ChainContext struct { func NewChainContext() *ChainContext { return &ChainContext{ headersByNumber: make(map[uint64]*ethtypes.Header), + headersByHash: make(map[common.Hash]*ethtypes.Header), } } @@ -57,6 +65,13 @@ func (cc *ChainContext) Engine() ethcons.Engine { // header for the given block number. func (cc *ChainContext) SetHeader(number uint64, header *ethtypes.Header) { cc.headersByNumber[number] = header + cc.headersByHash[header.Hash()] = header + cc.currentHeader = header +} + +// CurrentHeader implements Ethereum's consensus.ChainHeaderReader interface. +func (cc *ChainContext) CurrentHeader() *ethtypes.Header { + return cc.currentHeader } // GetHeader implements Ethereum's core.ChainContext interface. @@ -71,6 +86,16 @@ func (cc *ChainContext) GetHeader(_ common.Hash, number uint64) *ethtypes.Header return nil } +// GetHeaderByNumber implements Ethereum's consensus.ChainHeaderReader interface. +func (cc *ChainContext) GetHeaderByNumber(number uint64) *ethtypes.Header { + return cc.GetHeader(common.Hash{}, number) +} + +// GetHeaderByHash implements Ethereum's consensus.ChainHeaderReader interface. +func (cc *ChainContext) GetHeaderByHash(hash common.Hash) *ethtypes.Header { + return cc.headersByHash[hash] +} + // Author implements Ethereum's consensus.Engine interface. It is responsible // for returned the address of the validtor to receive any fees. This function // is only invoked if the given author in the ApplyTransaction call is nil. @@ -101,8 +126,11 @@ func (cc *ChainContext) CalcDifficulty(_ ethcons.ChainHeaderReader, _ uint64, _ // // TODO: Figure out if this needs to be hooked up to any part of the ABCI? func (cc *ChainContext) Finalize( - _ ethcons.ChainHeaderReader, _ *ethtypes.Header, _ *ethstate.StateDB, - _ []*ethtypes.Transaction, _ []*ethtypes.Header, _ []*ethtypes.Withdrawal) { + _ ethcons.ChainHeaderReader, + _ *ethtypes.Header, + _ vm.StateDB, + _ *ethtypes.Body, +) { } // FinalizeAndAssemble runs any post-transaction state modifications (e.g. block @@ -111,13 +139,12 @@ func (cc *ChainContext) Finalize( // Note: The block header and state database might be updated to reflect any // consensus rules that happen at finalization (e.g. block rewards). // TODO: Figure out if this needs to be hooked up to any part of the ABCI? -func (cc *ChainContext) FinalizeAndAssemble(_ ethcons.ChainHeaderReader, +func (cc *ChainContext) FinalizeAndAssemble( + _ ethcons.ChainHeaderReader, _ *ethtypes.Header, _ *ethstate.StateDB, - _ []*ethtypes.Transaction, - _ []*ethtypes.Header, + _ *ethtypes.Body, _ []*ethtypes.Receipt, - _ []*ethtypes.Withdrawal, ) (*ethtypes.Block, error) { return nil, nil } @@ -149,7 +176,7 @@ func (cc *ChainContext) SealHash(_ *ethtypes.Header) common.Hash { // // TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK // handlers? -func (cc *ChainContext) VerifyHeader(_ ethcons.ChainHeaderReader, _ *ethtypes.Header, _ bool) error { +func (cc *ChainContext) VerifyHeader(_ ethcons.ChainHeaderReader, _ *ethtypes.Header) error { return nil } @@ -158,7 +185,7 @@ func (cc *ChainContext) VerifyHeader(_ ethcons.ChainHeaderReader, _ *ethtypes.He // // TODO: Figure out if this needs to be hooked up to any part of the Cosmos SDK // handlers? -func (cc *ChainContext) VerifyHeaders(_ ethcons.ChainHeaderReader, _ []*ethtypes.Header, _ []bool) (chan<- struct{}, <-chan error) { +func (cc *ChainContext) VerifyHeaders(_ ethcons.ChainHeaderReader, _ []*ethtypes.Header) (chan<- struct{}, <-chan error) { return nil, nil } @@ -183,3 +210,7 @@ func (cc *ChainContext) VerifyUncles(_ ethcons.ChainReader, _ *ethtypes.Block) e func (cc *ChainContext) Close() error { return nil } + +func (cc *ChainContext) Config() *params.ChainConfig { + return nil +} diff --git a/tests/importer/chain_ctx_test.go b/tests/importer/chain_ctx_test.go index c694f1c68e..bb2e94c109 100644 --- a/tests/importer/chain_ctx_test.go +++ b/tests/importer/chain_ctx_test.go @@ -72,7 +72,7 @@ func TestChainContextCalcDifficulty(t *testing.T) { func TestChainContextFinalize(t *testing.T) { cc := NewChainContext() - cc.Finalize(nil, nil, nil, nil, nil, nil) + cc.Finalize(nil, nil, nil, nil) } func TestChainContextPrepare(t *testing.T) { @@ -92,14 +92,14 @@ func TestChainContextSeal(t *testing.T) { func TestChainContextVerifyHeader(t *testing.T) { cc := NewChainContext() - err := cc.VerifyHeader(nil, nil, false) + err := cc.VerifyHeader(nil, nil) require.Nil(t, err) } func TestChainContextVerifyHeaders(t *testing.T) { cc := NewChainContext() - ch, err := cc.VerifyHeaders(nil, nil, []bool{false}) + ch, err := cc.VerifyHeaders(nil, nil) require.Nil(t, err) require.Nil(t, ch) } diff --git a/tests/importer/importer_test.go b/tests/importer/importer_test.go index 0d22f641fc..86b922feec 100644 --- a/tests/importer/importer_test.go +++ b/tests/importer/importer_test.go @@ -10,8 +10,9 @@ import ( "time" sdkmath "cosmossdk.io/math" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/testutil" + "github.com/holiman/uint256" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" @@ -24,6 +25,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" ethcore "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" ethvm "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -54,7 +56,7 @@ func init() { type ImporterTestSuite struct { suite.Suite - app *app.EthermintApp + app *evmd.EthermintApp ctx sdk.Context } @@ -187,20 +189,20 @@ func accumulateRewards( } // accumulate the rewards for the miner and any included uncles - reward := new(big.Int).Set(blockReward) + reward := blockReward.ToBig() r := new(big.Int) for _, uncle := range uncles { r.Add(uncle.Number, rewardBig8) r.Sub(r, header.Number) - r.Mul(r, blockReward) + r.Mul(r, blockReward.ToBig()) r.Div(r, rewardBig8) - vmdb.AddBalance(uncle.Coinbase, r) - r.Div(blockReward, rewardBig32) + vmdb.AddBalance(uncle.Coinbase, uint256.MustFromBig(r), tracing.BalanceIncreaseRewardMineUncle) + r.Div(blockReward.ToBig(), rewardBig32) reward.Add(reward, r) } - vmdb.AddBalance(header.Coinbase, reward) + vmdb.AddBalance(header.Coinbase, uint256.MustFromBig(reward), tracing.BalanceIncreaseRewardMineBlock) } // ApplyDAOHardFork modifies the state database according to the DAO hard-fork @@ -217,7 +219,7 @@ func applyDAOHardFork(vmdb ethvm.StateDB) { // Move every DAO account and extra-balance account funds into the refund contract for _, addr := range ethparams.DAODrainList() { - vmdb.AddBalance(ethparams.DAORefundContract, vmdb.GetBalance(addr)) + vmdb.AddBalance(ethparams.DAORefundContract, vmdb.GetBalance(addr), tracing.BalanceIncreaseDaoContract) } } @@ -232,18 +234,17 @@ func applyTransaction( gp *ethcore.GasPool, evmKeeper *evmkeeper.Keeper, vmdb *statedb.StateDB, header *ethtypes.Header, tx *ethtypes.Transaction, usedGas *uint64, cfg ethvm.Config, index uint, ) (*ethtypes.Receipt, uint64, error) { - msg, err := ethcore.TransactionToMessage(tx, ethtypes.MakeSigner(config, header.Number), sdkmath.ZeroInt().BigInt()) + msg, err := ethcore.TransactionToMessage(tx, ethtypes.MakeSigner(config, header.Number, header.Time), sdkmath.ZeroInt().BigInt()) if err != nil { return nil, 0, err } // Create a new context to be used in the EVM environment blockCtx := ethcore.NewEVMBlockContext(header, bc, author) - txCtx := ethcore.NewEVMTxContext(msg) // Create a new environment which holds all relevant information // about the transaction and calling mechanisms. - vmenv := ethvm.NewEVM(blockCtx, txCtx, vmdb, config, cfg) + vmenv := ethvm.NewEVM(blockCtx, vmdb, config, cfg) // Apply the transaction to the current state (included in the env) execResult, err := ethcore.ApplyMessage(vmenv, msg, gp) @@ -268,7 +269,7 @@ func applyTransaction( // Set the receipt logs and create a bloom for filtering receipt.Logs = vmdb.Logs() - receipt.Bloom = ethtypes.CreateBloom(ethtypes.Receipts{receipt}) + receipt.Bloom = ethtypes.CreateBloom(receipt) receipt.BlockHash = header.Hash() receipt.BlockNumber = header.Number receipt.TransactionIndex = index diff --git a/tests/integration_tests/bytecode_deployer.py b/tests/integration_tests/bytecode_deployer.py new file mode 100644 index 0000000000..5c53cbefcb --- /dev/null +++ b/tests/integration_tests/bytecode_deployer.py @@ -0,0 +1,74 @@ +from hexbytes import HexBytes +from web3 import Web3 + +from .utils import CONTRACTS, deploy_contract, send_transaction, w3_wait_for_new_blocks + + +# Given a runtime bytecode X, +# construct initialization (constructor) bytecode that, +# when deployed, results in a contract whose runtime bytecode is exactly X. +# No storage initialization is required. +class BytecodeDeployerHelper: + def __init__(self, w3: Web3, deployer_account=None): + self.w3 = w3 + key = deployer_account.key if deployer_account else None + self.deployer_contract, self.deployer_receipt = deploy_contract( + w3, CONTRACTS["BytecodeDeployer"], key=key + ) + + def deploy_bytecode(self, bytecode: str, sender_account=None) -> str: + tx = self.deployer_contract.functions.deployBytecode( + HexBytes(bytecode) + ).build_transaction() + + key = sender_account.key if sender_account else None + receipt = send_transaction(self.w3, tx, key) + receipt = self.w3.eth.wait_for_transaction_receipt( + receipt.transactionHash, timeout=30 + ) + deployed_event = ( + self.deployer_contract.events.ContractDeployed().process_receipt(receipt)[0] + ) + return deployed_event["args"]["deployedAddress"] + + +# https://ethereum.stackexchange.com/a/167820 +def create_constructor_bytecode(runtime_bytecode: str) -> str: + if not runtime_bytecode.startswith("0x"): + runtime_bytecode = "0x" + runtime_bytecode + + prefix = bytes.fromhex("600b380380600b5f395ff3") + suffix = bytes.fromhex(runtime_bytecode[2:]) + + constructor_bytecode = prefix + suffix + + return constructor_bytecode + + +def deploy_runtime_bytecode( + w3: Web3, runtime_bytecode: str, sender_account=None, deployer_account=None +) -> str: + bytecode_deployer = BytecodeDeployerHelper(w3, deployer_account) + + constructor_bytecode = create_constructor_bytecode(runtime_bytecode) + + deployed_address = bytecode_deployer.deploy_bytecode( + constructor_bytecode, sender_account + ) + + w3_wait_for_new_blocks(w3, 1) + + deployed_code = w3.eth.get_code(deployed_address, "latest") + expected_code = ( + runtime_bytecode + if runtime_bytecode.startswith("0x") + else "0x" + runtime_bytecode + ) + + if deployed_code != HexBytes(expected_code): + raise RuntimeError( + f"Deployment failed: deployed code {Web3.to_hex(deployed_code)} " + f"doesn't match expected {expected_code}" + ) + + return deployed_address diff --git a/tests/integration_tests/configs/broken-ethermintd.nix b/tests/integration_tests/configs/broken-ethermintd.nix index f789646ae8..eec8863086 100644 --- a/tests/integration_tests/configs/broken-ethermintd.nix +++ b/tests/integration_tests/configs/broken-ethermintd.nix @@ -1,5 +1,8 @@ -{ pkgs ? import ../../../nix { } }: -let ethermintd = (pkgs.callPackage ../../../. { }); +{ + pkgs ? import ../../../nix { }, +}: +let + ethermintd = (pkgs.callPackage ../../../. { }); in ethermintd.overrideAttrs (oldAttrs: { patches = oldAttrs.patches or [ ] ++ [ diff --git a/tests/integration_tests/configs/broken-ethermintd.patch b/tests/integration_tests/configs/broken-ethermintd.patch index 20a9a9c283..d209066e6e 100644 --- a/tests/integration_tests/configs/broken-ethermintd.patch +++ b/tests/integration_tests/configs/broken-ethermintd.patch @@ -1,7 +1,7 @@ -diff --git a/app/app.go b/app/app.go +diff --git a/evmd/app.go b/evmd/app.go index d19a465d..f0e63d30 100644 ---- a/app/app.go -+++ b/app/app.go +--- a/evmd/app.go ++++ b/evmd/app.go @@ -861,6 +861,10 @@ func (app *EthermintApp) BeginBlocker(ctx sdk.Context) (sdk.BeginBlock, error) { // EndBlocker updates every end block diff --git a/tests/integration_tests/configs/cosmovisor.jsonnet b/tests/integration_tests/configs/cosmovisor.jsonnet index 4630f9a5ab..34ec86b27c 100644 --- a/tests/integration_tests/configs/cosmovisor.jsonnet +++ b/tests/integration_tests/configs/cosmovisor.jsonnet @@ -13,6 +13,11 @@ config { }, }, app_state+: { + evm+: { + params+: { + header_hash_num:: super.header_hash_num, + }, + }, feemarket+: { params+: { base_fee:: super.base_fee, diff --git a/tests/integration_tests/configs/default.jsonnet b/tests/integration_tests/configs/default.jsonnet index fba86f6d22..e43a490b55 100644 --- a/tests/integration_tests/configs/default.jsonnet +++ b/tests/integration_tests/configs/default.jsonnet @@ -6,9 +6,6 @@ 'app-config': { 'minimum-gas-prices': '0aphoton', 'index-events': ['ethereum_tx.ethereumTxHash'], - evm: { - 'block-executor': 'block-stm', - }, 'json-rpc': { address: '127.0.0.1:{EVMRPC_PORT}', 'ws-address': '127.0.0.1:{EVMRPC_PORT_WS}', @@ -22,11 +19,24 @@ validators: [{ coins: '1000000000000000000stake,10000000000000000000000aphoton', staked: '1000000000000000000stake', - mnemonic: mnemonic, + mnemonic: '${VALIDATOR1_MNEMONIC}', + client_config: { + 'broadcast-mode': 'sync', + }, + 'app-config': { + evm: { + 'block-executor': 'block-stm', + 'block-stm-workers': 32, + }, + }, + }, { + coins: '1000000000000000000stake,10000000000000000000000aphoton', + staked: '1000000000000000000stake', + mnemonic: '${VALIDATOR2_MNEMONIC}', client_config: { 'broadcast-mode': 'sync', }, - } for mnemonic in ['${VALIDATOR1_MNEMONIC}', '${VALIDATOR2_MNEMONIC}']], + }], accounts: [{ name: 'community', coins: '10000000000000000000000aphoton', @@ -47,9 +57,6 @@ max_bytes: '1048576', max_gas: '81500000', }, - abci: { - vote_extensions_enable_height: '1', - }, }, }, app_state: { @@ -81,6 +88,7 @@ params: { no_base_fee: false, base_fee: '100000000000', + min_gas_multiplier: '0.5', }, }, }, diff --git a/tests/integration_tests/configs/simulate.jsonnet b/tests/integration_tests/configs/simulate.jsonnet new file mode 100644 index 0000000000..2c778c1499 --- /dev/null +++ b/tests/integration_tests/configs/simulate.jsonnet @@ -0,0 +1,92 @@ +{ + dotenv: '../../../scripts/env', + 'ethermint_9000-1': { + cmd: 'ethermintd', + 'start-flags': '--trace', + 'app-config': { + 'minimum-gas-prices': '0aphoton', + 'index-events': ['ethereum_tx.ethereumTxHash'], + 'json-rpc': { + address: '127.0.0.1:{EVMRPC_PORT}', + 'ws-address': '127.0.0.1:{EVMRPC_PORT_WS}', + api: 'eth,net,web3,debug', + 'feehistory-cap': 100, + 'block-range-cap': 10000, + 'logs-cap': 10000, + 'fix-revert-gas-refund-height': 1, + 'return-data-limit': 300000, + }, + }, + validators: [{ + coins: '1000000000000000000stake,10000000000000000000000aphoton', + staked: '1000000000000000000stake', + mnemonic: '${VALIDATOR1_MNEMONIC}', + client_config: { + 'broadcast-mode': 'sync', + }, + }, { + coins: '1000000000000000000stake,10000000000000000000000aphoton', + staked: '1000000000000000000stake', + mnemonic: '${VALIDATOR2_MNEMONIC}', + client_config: { + 'broadcast-mode': 'sync', + }, + }], + accounts: [{ + name: 'community', + coins: '10000000000000000000000aphoton', + mnemonic: '${COMMUNITY_MNEMONIC}', + }, { + name: 'signer1', + coins: '20000000000000000000000aphoton', + mnemonic: '${SIGNER1_MNEMONIC}', + }, { + name: 'signer2', + coins: '30000000000000000000000aphoton', + mnemonic: '${SIGNER2_MNEMONIC}', + }], + genesis: { + consensus: { + params: { + block: { + max_bytes: '1048576', + max_gas: '75398208', + }, + }, + }, + app_state: { + evm: { + params: { + evm_denom: 'aphoton', + }, + }, + gov: { + params: { + expedited_voting_period: '1s', + voting_period: '10s', + max_deposit_period: '10s', + min_deposit: [ + { + denom: 'aphoton', + amount: '1', + }, + ], + }, + }, + transfer: { + params: { + receive_enabled: true, + send_enabled: true, + }, + }, + feemarket: { + params: { + no_base_fee: false, + base_fee: '100000000000', + min_gas_multiplier: '0', + }, + }, + }, + }, + }, +} diff --git a/tests/integration_tests/configs/upgrade-test-package.nix b/tests/integration_tests/configs/upgrade-test-package.nix index e356e7a12d..3abd445efd 100644 --- a/tests/integration_tests/configs/upgrade-test-package.nix +++ b/tests/integration_tests/configs/upgrade-test-package.nix @@ -1,16 +1,31 @@ let pkgs = import ../../../nix { }; - fetchFlake = repo: rev: (pkgs.flake-compat { - src = { - outPath = builtins.fetchTarball "https://github.com/${repo}/archive/${rev}.tar.gz"; - inherit rev; - shortRev = builtins.substring 0 7 rev; - }; - }).defaultNix; - released = (fetchFlake "crypto-org-chain/ethermint" "b216a320ac6a60b019c1cbe5a6b730856482f071").default; + fetchFlake = + repo: rev: + (pkgs.flake-compat { + src = { + outPath = builtins.fetchTarball "https://github.com/${repo}/archive/${rev}.tar.gz"; + inherit rev; + shortRev = builtins.substring 0 7 rev; + }; + }).defaultNix; + released = + (fetchFlake "crypto-org-chain/ethermint" "b216a320ac6a60b019c1cbe5a6b730856482f071").default; + sdk50 = + (fetchFlake "crypto-org-chain/ethermint" "9e97913655b02f9fef288e8f85c372115f75d0a3").default; current = pkgs.callPackage ../../../. { }; in pkgs.linkFarm "upgrade-test-package" [ - { name = "genesis"; path = released; } - { name = "sdk50"; path = current; } + { + name = "genesis"; + path = released; + } + { + name = "sdk50"; + path = sdk50; + } + { + name = "sdk53"; + path = current; + } ] diff --git a/tests/integration_tests/conftest.py b/tests/integration_tests/conftest.py index 57e77a0040..9e477161e3 100644 --- a/tests/integration_tests/conftest.py +++ b/tests/integration_tests/conftest.py @@ -18,7 +18,7 @@ def pytest_collection_modifyitems(items, config): @pytest.fixture(scope="session") def ethermint(tmp_path_factory): path = tmp_path_factory.mktemp("ethermint") - yield from setup_ethermint(path, 26650) + yield from setup_ethermint(path, 26600) @pytest.fixture(scope="session") diff --git a/tests/integration_tests/cosmoscli.py b/tests/integration_tests/cosmoscli.py index e6435997c6..b06cfaf665 100644 --- a/tests/integration_tests/cosmoscli.py +++ b/tests/integration_tests/cosmoscli.py @@ -204,6 +204,18 @@ def account(self, addr): ) ) + def account_by_num(self, num): + return json.loads( + self.raw( + "q", + "auth", + "address-by-acc-num", + num, + output="json", + node=self.node_rpc, + ) + ) + def tx_search(self, events: str): "/tx_search" return json.loads( @@ -264,7 +276,7 @@ def staking_pool(self, bonded=True): def transfer(self, from_, to, coins, generate_only=False, **kwargs): kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE) - return json.loads( + rsp = json.loads( self.raw( "tx", "bank", @@ -278,6 +290,9 @@ def transfer(self, from_, to, coins, generate_only=False, **kwargs): **kwargs, ) ) + if not generate_only and rsp["code"] == 0: + rsp = self.event_query_tx_for(rsp["txhash"]) + return rsp def get_delegated_amount(self, which_addr): return json.loads( @@ -384,7 +399,7 @@ def withdraw_all_rewards(self, from_delegator): ) def make_multisig(self, name, signer1, signer2): - self.raw( + return self.raw( "keys", "add", name, @@ -498,9 +513,12 @@ def combine_batch_multisig_tx( def broadcast_tx(self, tx_file, **kwargs): kwargs.setdefault("broadcast_mode", "sync") kwargs.setdefault("output", "json") - return json.loads( + rsp = json.loads( self.raw("tx", "broadcast", tx_file, node=self.node_rpc, **kwargs) ) + if rsp["code"] == 0: + rsp = self.event_query_tx_for(rsp["txhash"]) + return rsp def broadcast_tx_json(self, tx, **kwargs): with tempfile.NamedTemporaryFile("w") as fp: @@ -677,6 +695,35 @@ def gov_propose_legacy(self, proposer, kind, proposal, **kwargs): ) ) + def software_upgrade(self, proposer, proposal, **kwargs): + kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE) + kwargs.setdefault("gas", DEFAULT_GAS) + rsp = json.loads( + self.raw( + "tx", + "upgrade", + "software-upgrade", + proposal["name"], + "-y", + "--no-validate", + from_=proposer, + # content + title=proposal.get("title"), + note=proposal.get("note"), + upgrade_height=proposal.get("upgrade-height"), + upgrade_time=proposal.get("upgrade-time"), + upgrade_info=proposal.get("upgrade-info"), + summary=proposal.get("summary"), + deposit=proposal.get("deposit"), + # basic + home=self.data_dir, + **kwargs, + ) + ) + if rsp["code"] == 0: + rsp = self.event_query_tx_for(rsp["txhash"]) + return rsp + def gov_vote(self, voter, proposal_id, option, **kwargs): kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE) kwargs.setdefault("broadcast_mode", "sync") @@ -857,3 +904,43 @@ def submit_gov_proposal(self, proposal, **kwargs): **(default_kwargs | kwargs), ) ) + + def query_grant(self, granter, grantee): + "query grant details by granter and grantee addresses" + res = json.loads( + self.raw( + "query", + "feegrant", + "grant", + granter, + grantee, + home=self.data_dir, + node=self.node_rpc, + output="json", + ) + ) + res = res.get("allowance") or res + return res + + def grant(self, granter, grantee, limit, **kwargs): + default_kwargs = self.get_default_kwargs() + rsp = json.loads( + self.raw( + "tx", + "feegrant", + "grant", + granter, + grantee, + "--period", + "60", + "--period-limit", + limit, + "-y", + home=self.data_dir, + stderr=subprocess.DEVNULL, + **(default_kwargs | kwargs), + ) + ) + if rsp["code"] == 0: + rsp = self.event_query_tx_for(rsp["txhash"]) + return rsp diff --git a/tests/integration_tests/eip712_legacy_signer.py b/tests/integration_tests/eip712_legacy_signer.py new file mode 100644 index 0000000000..b4607f87b1 --- /dev/null +++ b/tests/integration_tests/eip712_legacy_signer.py @@ -0,0 +1,584 @@ +from __future__ import annotations + +import base64 +import json +import re +from typing import Any, Dict, List, Optional, Tuple + +from eth_keys import keys +from eth_utils import keccak + +# ============================================================================= +# Proto to Amino Type Mapping +# ============================================================================= + +# Maps protobuf type URLs to Amino type names +PROTO_TO_AMINO_TYPE_MAP: Dict[str, str] = { + # Staking + "/cosmos.staking.v1beta1.MsgDelegate": "cosmos-sdk/MsgDelegate", + "/cosmos.staking.v1beta1.MsgUndelegate": "cosmos-sdk/MsgUndelegate", + "/cosmos.staking.v1beta1.MsgBeginRedelegate": "cosmos-sdk/MsgBeginRedelegate", + "/cosmos.staking.v1beta1.MsgCreateValidator": "cosmos-sdk/MsgCreateValidator", + "/cosmos.staking.v1beta1.MsgEditValidator": "cosmos-sdk/MsgEditValidator", + # Bank + "/cosmos.bank.v1beta1.MsgSend": "cosmos-sdk/MsgSend", + "/cosmos.bank.v1beta1.MsgMultiSend": "cosmos-sdk/MsgMultiSend", + # Distribution + "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward": ( + "cosmos-sdk/MsgWithdrawDelegationReward" + ), + "/cosmos.distribution.v1beta1.MsgSetWithdrawAddress": ( + "cosmos-sdk/MsgModifyWithdrawAddress" + ), + "/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission": ( + "cosmos-sdk/MsgWithdrawValidatorCommission" + ), + "/cosmos.distribution.v1beta1.MsgFundCommunityPool": ( + "cosmos-sdk/MsgFundCommunityPool" + ), + # Governance + "/cosmos.gov.v1beta1.MsgVote": "cosmos-sdk/MsgVote", + "/cosmos.gov.v1beta1.MsgDeposit": "cosmos-sdk/MsgDeposit", + "/cosmos.gov.v1beta1.MsgSubmitProposal": "cosmos-sdk/MsgSubmitProposal", + # Slashing + "/cosmos.slashing.v1beta1.MsgUnjail": "cosmos-sdk/MsgUnjail", + # IBC + "/ibc.applications.transfer.v1.MsgTransfer": "cosmos-sdk/MsgTransfer", + # Authz + "/cosmos.authz.v1beta1.MsgGrant": "cosmos-sdk/MsgGrant", + "/cosmos.authz.v1beta1.MsgRevoke": "cosmos-sdk/MsgRevoke", + "/cosmos.authz.v1beta1.MsgExec": "cosmos-sdk/MsgExec", + # Feegrant + "/cosmos.feegrant.v1beta1.MsgGrantAllowance": "cosmos-sdk/MsgGrantAllowance", + "/cosmos.feegrant.v1beta1.MsgRevokeAllowance": "cosmos-sdk/MsgRevokeAllowance", +} + + +def proto_to_amino_type(proto_type: str) -> str: + return PROTO_TO_AMINO_TYPE_MAP.get(proto_type, proto_type) + + +def register_amino_type(proto_type: str, amino_type: str) -> None: + PROTO_TO_AMINO_TYPE_MAP[proto_type] = amino_type + + +def _python_type_to_eip712(value: Any, parent_key: str = "") -> str: + if isinstance(value, bool): + return "bool" + elif isinstance(value, int): + return "uint256" + elif isinstance(value, str): + return "string" + elif isinstance(value, bytes): + return "bytes" + elif isinstance(value, list): + if len(value) == 0: + # Default to string array for empty lists + return "string[]" + # Infer from first element + item_type = _python_type_to_eip712(value[0], parent_key) + return f"{item_type}[]" + elif isinstance(value, dict): + # Complex type - will need separate type definition + # Use capitalized parent key as type name + return _make_type_name(parent_key) + else: + return "string" + + +def _make_type_name(key: str) -> str: + # Handle special cases + if key.lower() == "amount": + return "TypeAmount" + if key.lower() == "value": + return "MsgValue" + + # Convert snake_case to PascalCase + parts = key.split("_") + pascal = "".join(word.capitalize() for word in parts) + + # Add Type prefix if not already there + if not pascal.startswith("Type") and not pascal.startswith("Msg"): + pascal = "Type" + pascal + + return pascal + + +def _extract_types_from_value( + value: Any, + type_name: str, + types_accumulator: Dict[str, List[Dict[str, str]]], + visited: Optional[set] = None, +) -> None: + if visited is None: + visited = set() + + if type_name in visited: + return + visited.add(type_name) + + if not isinstance(value, dict): + return + + fields = [] + for key, val in value.items(): + field_type = _python_type_to_eip712(val, key) + fields.append({"name": key, "type": field_type}) + + # Recursively process nested dicts + if isinstance(val, dict): + nested_type_name = _make_type_name(key) + _extract_types_from_value(val, nested_type_name, types_accumulator, visited) + elif isinstance(val, list) and len(val) > 0 and isinstance(val[0], dict): + # Array of objects + nested_type_name = _make_type_name(key) + _extract_types_from_value( + val[0], nested_type_name, types_accumulator, visited + ) + + types_accumulator[type_name] = fields + + +def infer_msg_types(msg_value: Dict[str, Any]) -> Dict[str, List[Dict[str, str]]]: + types: Dict[str, List[Dict[str, str]]] = {} + _extract_types_from_value(msg_value, "MsgValue", types) + return types + + +# ============================================================================= +# Message Conversion +# ============================================================================= + + +def proto_msg_to_amino(msg: Dict[str, Any]) -> Dict[str, Any]: + msg_type = msg.get("@type", "") + amino_type = proto_to_amino_type(msg_type) + + # Extract value (everything except @type) + value = {k: v for k, v in msg.items() if k != "@type"} + + return { + "type": amino_type, + "value": value, + } + + +# ============================================================================= +# EIP-712 Typed Data Builder +# ============================================================================= + + +def build_eip712_domain(chain_id_num: int) -> Dict[str, Any]: + return { + "name": "Cosmos Web3", + "version": "1.0.0", + "chainId": chain_id_num, + "verifyingContract": "cosmos", + "salt": "0", + } + + +def build_base_types() -> Dict[str, List[Dict[str, str]]]: + return { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "string"}, + {"name": "salt", "type": "string"}, + ], + "Tx": [ + {"name": "account_number", "type": "string"}, + {"name": "chain_id", "type": "string"}, + {"name": "fee", "type": "Fee"}, + {"name": "memo", "type": "string"}, + {"name": "msgs", "type": "Msg[]"}, + {"name": "sequence", "type": "string"}, + ], + "Fee": [ + {"name": "feePayer", "type": "string"}, + {"name": "amount", "type": "Coin[]"}, + {"name": "gas", "type": "string"}, + ], + "Coin": [ + {"name": "denom", "type": "string"}, + {"name": "amount", "type": "string"}, + ], + "Msg": [ + {"name": "type", "type": "string"}, + {"name": "value", "type": "MsgValue"}, + ], + } + + +def build_legacy_eip712_typed_data( + chain_id: str, + chain_id_num: int, + account_number: int, + sequence: int, + fee_payer: str, + fee_amount: str, + fee_denom: str, + gas: int, + msgs: List[Dict[str, Any]], + memo: str = "", + custom_msg_types: Optional[Dict[str, List[Dict[str, str]]]] = None, +) -> Dict[str, Any]: + # Build domain + domain = build_eip712_domain(chain_id_num) + + # Build base types + types = build_base_types() + + # Convert messages to Amino format + amino_msgs = [] + for msg in msgs: + if "@type" in msg: + amino_msgs.append(proto_msg_to_amino(msg)) + elif "type" in msg and "value" in msg: + # Already in amino format + amino_msgs.append(msg) + else: + raise ValueError(f"Unknown message format: {msg}") + + # Determine message value types + if custom_msg_types: + types.update(custom_msg_types) + elif amino_msgs: + # Infer types from first message (legacy behavior) + first_msg_value = amino_msgs[0]["value"] + msg_types = infer_msg_types(first_msg_value) + types.update(msg_types) + + # Build the message payload + message = { + "account_number": str(account_number), + "chain_id": chain_id, + "fee": { + "feePayer": fee_payer, + "amount": [{"denom": fee_denom, "amount": fee_amount}], + "gas": str(gas), + }, + "memo": memo, + "msgs": amino_msgs, + "sequence": str(sequence), + } + + return { + "types": types, + "primaryType": "Tx", + "domain": domain, + "message": message, + } + + +# ============================================================================= +# EIP-712 Encoding (Core Implementation) +# ============================================================================= + + +def _encode_type(type_name: str, types: Dict[str, List[Dict[str, str]]]) -> str: + result = type_name + "(" + fields = types[type_name] + field_strs = [] + for field in fields: + field_strs.append(f"{field['type']} {field['name']}") + result += ",".join(field_strs) + ")" + return result + + +def _find_type_dependencies( + type_name: str, + types: Dict[str, List[Dict[str, str]]], + deps: set, +) -> None: + if type_name in deps or type_name not in types: + return + deps.add(type_name) + for field in types[type_name]: + field_type = field["type"] + # Handle array types + if field_type.endswith("[]"): + field_type = field_type[:-2] + if field_type in types: + _find_type_dependencies(field_type, types, deps) + + +def _encode_type_with_deps( + primary_type: str, + types: Dict[str, List[Dict[str, str]]], +) -> str: + deps: set = set() + _find_type_dependencies(primary_type, types, deps) + deps.discard(primary_type) + + result = _encode_type(primary_type, types) + for dep in sorted(deps): + result += _encode_type(dep, types) + return result + + +def _type_hash(type_name: str, types: Dict[str, List[Dict[str, str]]]) -> bytes: + encoded = _encode_type_with_deps(type_name, types) + return keccak(text=encoded) + + +def _encode_data( + type_name: str, + data: Any, + types: Dict[str, List[Dict[str, str]]], +) -> bytes: + # Handle primitive types + if type_name == "string": + return keccak(text=data if data else "") + elif type_name == "bytes": + if not data: + return keccak(b"") + return keccak(data if isinstance(data, bytes) else bytes.fromhex(data)) + elif type_name == "bool": + return (1 if data else 0).to_bytes(32, "big") + elif type_name == "address": + # For Ethermint legacy, address can be a string like "cosmos" + if isinstance(data, str) and not data.startswith("0x"): + # Non-hex address - hash as string + return keccak(text=data) + # Standard hex address + addr = data[2:] if data.startswith("0x") else data + return bytes.fromhex(addr.zfill(64)) + elif type_name.startswith("uint") or type_name.startswith("int"): + if isinstance(data, str): + if data.startswith("0x"): + val = int(data, 16) + else: + val = int(data) + else: + val = int(data) if data else 0 + return val.to_bytes(32, "big", signed=type_name.startswith("int")) + elif type_name.startswith("bytes") and type_name != "bytes": + # Fixed-size bytes (bytes1, bytes32, etc.) + if isinstance(data, str): + data = bytes.fromhex(data[2:] if data.startswith("0x") else data) + return data.ljust(32, b"\x00") if data else b"\x00" * 32 + elif type_name.endswith("[]"): + # Array type + item_type = type_name[:-2] + encoded_items = b"" + for item in data or []: + if item_type in types: + encoded_items += _hash_struct(item_type, item, types) + else: + encoded_items += _encode_data(item_type, item, types) + return keccak(encoded_items) + elif type_name in types: + # Struct type - return hash + return _hash_struct(type_name, data, types) + else: + # Unknown type - treat as string + return keccak(text=str(data) if data else "") + + +def _hash_struct( + type_name: str, + data: Dict[str, Any], + types: Dict[str, List[Dict[str, str]]], +) -> bytes: + type_hash = _type_hash(type_name, types) + encoded_values = b"" + + for field in types[type_name]: + field_name = field["name"] + field_type = field["type"] + value = data.get(field_name) if data else None + encoded_values += _encode_data(field_type, value, types) + + return keccak(type_hash + encoded_values) + + +def _hash_domain( + domain: Dict[str, Any], types: Dict[str, List[Dict[str, str]]] +) -> bytes: + return _hash_struct("EIP712Domain", domain, types) + + +# ============================================================================= +# Signing +# ============================================================================= + + +def sign_legacy_eip712( + typed_data: Dict[str, Any], + private_key_hex: str, +) -> Tuple[bytes, bytes]: + types = typed_data["types"] + domain = typed_data["domain"] + primary_type = typed_data["primaryType"] + message = typed_data["message"] + + # Compute domain separator + domain_separator = _hash_domain(domain, types) + + # Compute message hash + message_hash = _hash_struct(primary_type, message, types) + + sig_hash = keccak(b"\x19\x01" + domain_separator + message_hash) + + # Sign the hash + private_key_hex = private_key_hex.replace("0x", "") + pk = keys.PrivateKey(bytes.fromhex(private_key_hex)) + signature = pk.sign_msg_hash(sig_hash) + + # Convert to bytes: r (32) + s (32) + v (1) + # v needs to be 27 or 28 for legacy format + v = signature.v + 27 if signature.v < 27 else signature.v + sig_bytes = ( + signature.r.to_bytes(32, "big") + signature.s.to_bytes(32, "big") + bytes([v]) + ) + + return sig_bytes, sig_hash + + +def get_public_key(private_key_hex: str) -> bytes: + private_key_hex = private_key_hex.replace("0x", "") + pk = keys.PrivateKey(bytes.fromhex(private_key_hex)) + return pk.public_key.to_compressed_bytes() + + +def build_cosmos_tx_json( + msgs: List[Dict[str, Any]], + fee_amount: str, + fee_denom: str, + gas: int, + fee_payer: str, + public_key_bytes: bytes, + signature: bytes, + chain_id_num: int, + sequence: int, + memo: str = "", +) -> Dict[str, Any]: + return { + "body": { + "messages": msgs, + "memo": memo, + "timeout_height": "0", + "extension_options": [ + { + "@type": "/ethermint.types.v1.ExtensionOptionsWeb3Tx", + "typedDataChainId": str(chain_id_num), + "feePayer": fee_payer, + "feePayerSig": base64.b64encode(signature).decode("ascii"), + } + ], + "non_critical_extension_options": [], + }, + "auth_info": { + "signer_infos": [ + { + "public_key": { + "@type": "/ethermint.crypto.v1.ethsecp256k1.PubKey", + "key": base64.b64encode(public_key_bytes).decode("ascii"), + }, + "mode_info": { + "single": { + "mode": "SIGN_MODE_LEGACY_AMINO_JSON", + } + }, + "sequence": str(sequence), + } + ], + "fee": { + "amount": [{"denom": fee_denom, "amount": fee_amount}], + "gas_limit": str(gas), + "payer": "", + "granter": "", + }, + }, + "signatures": [""], + } + + +def parse_chain_id(chain_id: str) -> int: + match = re.search(r"_(\d+)-", chain_id) + if match: + return int(match.group(1)) + # Fallback: try to parse as pure number + try: + return int(chain_id) + except ValueError: + raise ValueError(f"Cannot parse chain ID: {chain_id}") + + +class LegacyEIP712Signer: + + def __init__( + self, + private_key: str, + chain_id: str, + fee_denom: str = "aphoton", + ): + self.private_key = private_key.replace("0x", "") + self.chain_id = chain_id + self.chain_id_num = parse_chain_id(chain_id) + self.fee_denom = fee_denom + self.public_key = get_public_key(self.private_key) + + def sign_tx( + self, + msgs: List[Dict[str, Any]], + fee_payer: str, + account_number: int, + sequence: int, + gas: int = 200000, + fee_amount: str = "20000", + fee_denom: Optional[str] = None, + memo: str = "", + custom_msg_types: Optional[Dict[str, List[Dict[str, str]]]] = None, + ) -> Dict[str, Any]: + try: + fee_denom = fee_denom or self.fee_denom + + # Build EIP-712 typed data + typed_data = build_legacy_eip712_typed_data( + chain_id=self.chain_id, + chain_id_num=self.chain_id_num, + account_number=account_number, + sequence=sequence, + fee_payer=fee_payer, + fee_amount=fee_amount, + fee_denom=fee_denom, + gas=gas, + msgs=msgs, + memo=memo, + custom_msg_types=custom_msg_types, + ) + + # Sign + signature, msg_hash = sign_legacy_eip712(typed_data, self.private_key) + + # Build transaction JSON + tx_json = build_cosmos_tx_json( + msgs=msgs, + fee_amount=fee_amount, + fee_denom=fee_denom, + gas=gas, + fee_payer=fee_payer, + public_key_bytes=self.public_key, + signature=signature, + chain_id_num=self.chain_id_num, + sequence=sequence, + memo=memo, + ) + + return { + "success": True, + "tx_json": json.dumps(tx_json, indent=2), + "typed_data": json.dumps(typed_data, indent=2), + "signature_hex": signature.hex(), + "tx": tx_json, + "typed_data_dict": typed_data, + } + + except Exception as e: + return { + "success": False, + "error": str(e), + } diff --git a/tests/integration_tests/eip7702.py b/tests/integration_tests/eip7702.py new file mode 100644 index 0000000000..eadb44a713 --- /dev/null +++ b/tests/integration_tests/eip7702.py @@ -0,0 +1,123 @@ +""" +Shared utilities for EIP-7702 (Set Code Transaction) tests. + +This module contains common helper functions used across EIP-7702 test files +to avoid code duplication. +""" + +from hexbytes import HexBytes +from web3 import Web3 + +DELEGATION_PREFIX = "0xef0100" + + +def address_to_delegation(address: str) -> str: + """ + Convert an Ethereum address to EIP-7702 delegation bytecode format. + + Args: + address: Ethereum address (0x-prefixed hex string) + + Returns: + Delegation bytecode string with format: 0xef0100{address_without_0x} + """ + return DELEGATION_PREFIX + address[2:] + + +def generate_signed_auth(w3, acc, delegate_addr, nonce): + """ + Generate a signed EIP-7702 authorization. + + Args: + w3: Web3 instance + acc: Account object with sign_authorization method + delegate_addr: Address to delegate to + nonce: Nonce for the authorization + + Returns: + Signed authorization object + """ + chain_id = w3.eth.chain_id + auth = { + "chainId": chain_id, + "address": delegate_addr, + "nonce": nonce, + } + return acc.sign_authorization(auth) + + +def send_setcode_tx(w3, sender_acc, to, signed_auth, gas=100000, data=None): + """ + Send an EIP-7702 setcode transaction. + + Args: + w3: Web3 instance + sender_acc: Sender account + to: Target address + signed_auth: Signed authorization + gas: Gas limit (default: 100000) + data: Optional calldata for the transaction + + Returns: + Transaction receipt + """ + setcode_tx = { + "chainId": w3.eth.chain_id, + "type": 4, + "to": to, + "value": 0, + "gas": gas, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": w3.eth.get_transaction_count(sender_acc.address), + "authorizationList": [signed_auth], + } + + if data is not None: + setcode_tx["data"] = data + + signed_tx = sender_acc.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + return receipt + + +def setup_eip7702_delegation(w3, delegator, delegate_addr, gas=500000): + """ + Set up EIP-7702 delegation for an account. + + This is a convenience function that creates and sends a setcode transaction + to delegate an EOA to a contract address. Uses generate_signed_auth and + send_setcode_tx internally. + + Args: + w3: Web3 instance + delegator: Account to be delegated (sender == auth account) + delegate_addr: Address of contract to delegate to + gas: Gas limit for the transaction (default: 500000) + + Returns: + Transaction receipt + + Raises: + AssertionError: If delegation setup fails or verification fails + """ + nonce = w3.eth.get_transaction_count(delegator.address) + + # When sender == auth account, auth nonce must be current + 1 + signed_auth = generate_signed_auth(w3, delegator, delegate_addr, nonce + 1) + + # Send the setcode transaction with higher gas limit + receipt = send_setcode_tx(w3, delegator, delegator.address, signed_auth, gas=gas) + + assert receipt.status == 1, f"SetCode transaction failed: {receipt}" + + # Verify delegation was set correctly + delegator_code = w3.eth.get_code(delegator.address, receipt.blockNumber) + expected_delegation = address_to_delegation(delegate_addr) + assert delegator_code == HexBytes(expected_delegation), ( + f"Delegation not set: got {Web3.to_hex(delegator_code)}, " + f"want {expected_delegation}" + ) + + return receipt diff --git a/tests/integration_tests/expected_constants.py b/tests/integration_tests/expected_constants.py index be2a61cac9..8858459c96 100644 --- a/tests/integration_tests/expected_constants.py +++ b/tests/integration_tests/expected_constants.py @@ -59,6 +59,7 @@ "result": { "blockHash": "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", # noqa: E501 "blockNumber": "0x5daf3b", + "blockTimestamp": "0x0", # placeholder; compare_types checks type only "chainId": "0x1", "from": "0xa7d9ddbe1f17865597fbd27ec712455208b6b76d", "gas": "0xc350", @@ -118,7 +119,7 @@ "blockNumber": "0xa50131", "contractAddress": None, "cumulativeGasUsed": "0xb72e24", - # "effectiveGasPrice": "0x147d357000", + "effectiveGasPrice": "0x147d357000", "from": "0x56ac35db407fe1fb4977edd41f712aa5d8e7eb08", "gasUsed": "0x5208", "logs": [], @@ -145,13 +146,13 @@ EXPECTED_STRUCT_TRACER = { "failed": False, "gas": 21000, - "returnValue": "", + "returnValue": "0x", "structLogs": [], } EXPECTED_CONTRACT_CREATE_TRACER = '{"from": "0xccdfe2eb220b5abea2cc772fa3b48b1ba6101c1a", "gas": "0x966fd", "gasUsed": "0x966fd", "input": "0x608060405234801561001057600080fd5b50604080518082018252600981526805465737445524332360bc1b60208083019182528351808501909452600484526315195cdd60e21b90840152815191929161005c91600391610156565b508051610070906004906020840190610156565b50505061008e336a52b7d2dcc80cd2e400000061009360201b60201c565b610250565b6001600160a01b0382166100ed5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546100ff91906101ef565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805461016290610215565b90600052602060002090601f01602090048101928261018457600085556101ca565b82601f1061019d57805160ff19168380011785556101ca565b828001600101855582156101ca579182015b828111156101ca5782518255916020019190600101906101af565b506101d69291506101da565b5090565b5b808211156101d657600081556001016101db565b6000821982111561021057634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168061022957607f821691505b6020821081141561024a57634e487b7160e01b600052602260045260246000fd5b50919050565b61085d8061025f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610801565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b602082108114156107fb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082257634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220c447581f3bf6675286c79608ec0ee20bbfca295bacc424210a44d456f03ab5fd64736f6c634300080a0033", "output": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610801565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b602082108114156107fb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082257634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220c447581f3bf6675286c79608ec0ee20bbfca295bacc424210a44d456f03ab5fd64736f6c634300080a0033", "to": "0x488cd53a91098c6bd1bc3340591d3ed10405fe6b", "type": "CREATE", "value": "0x0"}' # noqa: E501 -EXPECTED_BLOCK_OVERRIDES_TRACERS = '{"failed": false, "gas": 53020, "returnValue": "", "structLogs": [{"depth": 1, "gas": 12517, "gasCost": 2, "op": "NUMBER", "pc": 0, "stack": []}, {"depth": 1, "gas": 12515, "gasCost": 0, "op": "STOP", "pc": 1, "stack": ["0x1337"]}]}' # noqa: E501 +EXPECTED_BLOCK_OVERRIDES_TRACERS = '{"failed": false, "gas": 53020, "returnValue": "0x", "structLogs": [{"depth": 1, "gas": 12517, "gasCost": 2, "op": "NUMBER", "pc": 0, "stack": []}, {"depth": 1, "gas": 12515, "gasCost": 0, "op": "STOP", "pc": 1, "stack": ["0x1337"]}]}' # noqa: E501 EXPECTED_DEFAULT_GASCAP = 25000000 -EXPECTED_JS_TRACERS = ['{"ADD-ADD": 3, "ADD-AND": 2, "ADD-CALLDATACOPY": 1, "ADD-DUP2": 2, "ADD-DUP3": 1, "ADD-DUP5": 1, "ADD-GT": 1, "ADD-MLOAD": 2, "ADD-MSTORE": 2, "ADD-PUSH1": 3, "ADD-PUSH2": 1, "ADD-SLT": 1, "ADD-SWAP1": 1, "ADD-SWAP2": 2, "ADD-SWAP3": 1, "AND-DUP1": 1, "AND-DUP2": 2, "AND-DUP6": 1, "AND-PUSH1": 2, "AND-SWAP2": 1, "CALLDATACOPY-PUSH0": 1, "CALLDATALOAD-DUP2": 1, "CALLDATALOAD-PUSH1": 1, "CALLDATALOAD-PUSH8": 1, "CALLDATASIZE-LT": 1, "CALLDATASIZE-PUSH1": 1, "CALLER-DUP3": 1, "CALLVALUE-DUP1": 1, "DUP1-DUP3": 1, "DUP1-DUP5": 1, "DUP1-ISZERO": 1, "DUP1-PUSH1": 1, "DUP1-PUSH2": 1, "DUP1-PUSH4": 3, "DUP1-SWAP2": 1, "DUP2-ADD": 3, "DUP2-AND": 1, "DUP2-CALLDATALOAD": 2, "DUP2-DUP2": 4, "DUP2-DUP4": 1, "DUP2-DUP5": 1, "DUP2-DUP6": 1, "DUP2-EQ": 1, "DUP2-GT": 2, "DUP2-LT": 2, "DUP2-MLOAD": 2, "DUP2-MSTORE": 2, "DUP2-PUSH1": 1, "DUP2-PUSH2": 1, "DUP2-SHR": 1, "DUP2-SUB": 1, "DUP2-SWAP1": 1, "DUP3-ADD": 3, "DUP3-AND": 2, "DUP3-DUP2": 1, "DUP3-DUP3": 1, "DUP3-DUP5": 1, "DUP3-DUP7": 1, "DUP3-GT": 3, "DUP3-LT": 1, "DUP3-PUSH1": 2, "DUP3-PUSH2": 1, "DUP4-ADD": 6, "DUP4-AND": 1, "DUP4-DUP3": 1, "DUP4-GT": 1, "DUP4-LT": 1, "DUP5-ADD": 1, "DUP5-DUP8": 1, "DUP5-ISZERO": 1, "DUP5-MSTORE": 1, "DUP5-PUSH1": 1, "DUP5-PUSH2": 2, "DUP5-SLOAD": 1, "DUP5-SUB": 1, "DUP6-ADD": 2, "DUP6-DUP4": 1, "DUP6-SSTORE": 1, "DUP6-SWAP1": 1, "DUP7-ADD": 2, "DUP7-DUP4": 1, "DUP7-SWAP1": 1, "DUP8-ADD": 1, "DUP8-PUSH1": 1, "EQ-PUSH2": 4, "GT-DUP2": 1, "GT-ISZERO": 5, "GT-PUSH1": 1, "ISZERO-PUSH2": 11, "JUMP-JUMPDEST": 16, "JUMPDEST-DUP2": 7, "JUMPDEST-DUP3": 1, "JUMPDEST-DUP5": 1, "JUMPDEST-POP": 7, "JUMPDEST-PUSH0": 3, "JUMPDEST-PUSH1": 8, "JUMPDEST-PUSH2": 3, "JUMPDEST-STOP": 1, "JUMPDEST-SWAP5": 1, "JUMPI-DUP1": 2, "JUMPI-JUMPDEST": 12, "JUMPI-POP": 1, "JUMPI-PUSH0": 2, "JUMPI-PUSH1": 2, "LOG1-POP": 1, "LT-DUP2": 1, "LT-ISZERO": 2, "LT-OR": 1, "LT-PUSH2": 1, "MLOAD-DUP1": 2, "MLOAD-DUP7": 1, "MLOAD-JUMPDEST": 1, "MLOAD-PUSH1": 1, "MLOAD-PUSH2": 1, "MLOAD-PUSH8": 1, "MSTORE-ADD": 1, "MSTORE-CALLVALUE": 1, "MSTORE-DUP3": 1, "MSTORE-DUP8": 1, "MSTORE-POP": 1, "MSTORE-PUSH0": 2, "MSTORE-PUSH1": 2, "NOT-AND": 1, "NOT-PUSH1": 2, "NOT-SWAP1": 1, "OR-DUP6": 1, "OR-ISZERO": 1, "POP-DUP5": 1, "POP-DUP6": 1, "POP-JUMP": 7, "POP-JUMPDEST": 2, "POP-POP": 15, "POP-PUSH0": 1, "POP-PUSH1": 1, "POP-PUSH32": 1, "POP-SWAP2": 1, "POP-SWAP3": 1, "POP-SWAP6": 1, "PUSH0-CALLDATALOAD": 1, "PUSH0-DUP2": 1, "PUSH0-DUP5": 1, "PUSH0-JUMPDEST": 1, "PUSH0-NOT": 1, "PUSH0-PUSH1": 2, "PUSH0-SWAP1": 1, "PUSH0-SWAP3": 1, "PUSH1-ADD": 2, "PUSH1-CALLDATASIZE": 1, "PUSH1-DUP1": 1, "PUSH1-DUP2": 3, "PUSH1-DUP3": 7, "PUSH1-DUP4": 4, "PUSH1-DUP5": 1, "PUSH1-DUP6": 1, "PUSH1-DUP7": 2, "PUSH1-MLOAD": 3, "PUSH1-MSTORE": 2, "PUSH1-NOT": 2, "PUSH1-PUSH1": 5, "PUSH1-PUSH2": 2, "PUSH1-SHL": 1, "PUSH1-SHR": 1, "PUSH2-CALLDATASIZE": 1, "PUSH2-DUP2": 1, "PUSH2-DUP3": 1, "PUSH2-DUP5": 1, "PUSH2-JUMP": 9, "PUSH2-JUMPI": 19, "PUSH2-PUSH2": 1, "PUSH2-SWAP1": 1, "PUSH2-SWAP3": 1, "PUSH32-CALLER": 1, "PUSH4-EQ": 3, "PUSH8-DUP1": 1, "PUSH8-DUP2": 1, "SHL-OR": 1, "SHL-SHR": 1, "SHL-SUB": 1, "SHR-DUP1": 1, "SHR-NOT": 1, "SHR-SWAP1": 1, "SLOAD-PUSH2": 1, "SLT-ISZERO": 1, "SLT-PUSH2": 1, "SSTORE-PUSH2": 1, "SUB-DUP4": 1, "SUB-PUSH2": 1, "SUB-SLT": 1, "SUB-SWAP1": 1, "SWAP1-DUP2": 1, "SWAP1-DUP3": 1, "SWAP1-DUP4": 2, "SWAP1-LOG1": 1, "SWAP1-MSTORE": 1, "SWAP1-POP": 1, "SWAP1-PUSH2": 2, "SWAP1-SHL": 2, "SWAP1-SWAP3": 1, "SWAP2-POP": 4, "SWAP2-SUB": 1, "SWAP2-SWAP1": 2, "SWAP3-DUP2": 1, "SWAP3-MSTORE": 1, "SWAP3-SWAP1": 1, "SWAP3-SWAP2": 2, "SWAP4-POP": 1, "SWAP5-POP": 1, "SWAP5-SWAP4": 1, "SWAP6-SWAP5": 1}', '[{"depth": 1, "len": 2, "op": 96, "result": ["80"]}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 52, "result": ["0"]}, {"depth": 1, "op": 128, "result": ["0", "0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["f"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 15, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["4"]}, {"depth": 1, "op": 54, "result": ["64"]}, {"depth": 1, "op": 16, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["55"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 53, "result": ["a413686200000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "len": 2, "op": 96, "result": ["e0"]}, {"depth": 1, "op": 28, "result": []}, {"depth": 1, "op": 128, "result": ["a4136862", "a4136862"]}, {"depth": 1, "len": 5, "op": 99, "result": ["c4dae88"]}, {"depth": 1, "op": 20, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["59"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 128, "result": ["a4136862", "a4136862"]}, {"depth": 1, "len": 5, "op": 99, "result": ["2e52d606"]}, {"depth": 1, "op": 20, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["6f"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 128, "result": ["a4136862", "a4136862"]}, {"depth": 1, "len": 5, "op": 99, "result": ["a4136862"]}, {"depth": 1, "op": 20, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["77"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 119, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["8a"]}, {"depth": 1, "len": 3, "op": 97, "result": ["85"]}, {"depth": 1, "op": 54, "result": ["64"]}, {"depth": 1, "len": 2, "op": 96, "result": ["4"]}, {"depth": 1, "len": 3, "op": 97, "result": ["222"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 546, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["4", "20", "0", "4"]}, {"depth": 1, "op": 132, "result": ["64", "4", "20", "0", "4", "64"]}, {"depth": 1, "op": 3, "result": ["60"]}, {"depth": 1, "op": 18, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["232"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 562, "result": []}, {"depth": 1, "op": 129, "result": ["4", "0", "4"]}, {"depth": 1, "op": 53, "result": ["20"]}, {"depth": 1, "len": 9, "op": 103, "result": ["ffffffffffffffff"]}, {"depth": 1, "op": 128, "result": ["ffffffffffffffff", "ffffffffffffffff"]}, {"depth": 1, "op": 130, "result": ["20", "ffffffffffffffff", "ffffffffffffffff", "20"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["249"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 585, "result": []}, {"depth": 1, "op": 129, "result": ["20", "ffffffffffffffff", "20"]}, {"depth": 1, "op": 132, "result": ["4", "20", "ffffffffffffffff", "20", "0", "4"]}, {"depth": 1, "op": 1, "result": ["24"]}, {"depth": 1, "op": 145, "result": ["20", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 132, "result": ["64", "ffffffffffffffff", "24", "0", "4", "64"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 131, "result": ["24", "1f", "64", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 1, "result": ["43"]}, {"depth": 1, "op": 18, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["25c"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 604, "result": []}, {"depth": 1, "op": 129, "result": ["24", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 53, "result": ["5"]}, {"depth": 1, "op": 129, "result": ["ffffffffffffffff", "5", "ffffffffffffffff"]}, {"depth": 1, "op": 129, "result": ["5", "ffffffffffffffff", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["26e"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 622, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 81, "result": ["80"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 130, "result": ["5", "1f", "80", "5"]}, {"depth": 1, "op": 1, "result": ["24"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 25, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "op": 144, "result": ["24", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "op": 129, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", "24", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "op": 22, "result": ["20"]}, {"depth": 1, "len": 2, "op": 96, "result": ["3f"]}, {"depth": 1, "op": 1, "result": ["5f"]}, {"depth": 1, "op": 22, "result": ["40"]}, {"depth": 1, "op": 129, "result": ["80", "40", "80"]}, {"depth": 1, "op": 1, "result": ["c0"]}, {"depth": 1, "op": 144, "result": ["80", "c0"]}, {"depth": 1, "op": 131, "result": ["ffffffffffffffff", "80", "c0", "5", "ffffffffffffffff"]}, {"depth": 1, "op": 130, "result": ["c0", "ffffffffffffffff", "80", "c0"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 129, "result": ["80", "0", "80"]}, {"depth": 1, "op": 131, "result": ["c0", "80", "0", "80", "c0"]}, {"depth": 1, "op": 16, "result": ["0"]}, {"depth": 1, "op": 23, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["296"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 662, "result": []}, {"depth": 1, "op": 129, "result": ["c0", "80", "c0"]}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 130, "result": ["5", "80", "c0", "5"]}, {"depth": 1, "op": 129, "result": ["80", "5", "80"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 135, "result": ["64", "80", "c0", "5", "ffffffffffffffff", "24", "0", "4", "64"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 132, "result": ["5", "20", "64", "80", "c0", "5"]}, {"depth": 1, "op": 135, "result": ["24", "5", "20", "64", "80", "c0", "5", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 1, "result": ["29"]}, {"depth": 1, "op": 1, "result": ["49"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2ae"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 686, "result": []}, {"depth": 1, "op": 130, "result": ["5", "80", "c0", "5"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 134, "result": ["24", "20", "5", "80", "c0", "5", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 1, "result": ["44"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 131, "result": ["80", "20", "44", "5", "80"]}, {"depth": 1, "op": 1, "result": ["a0"]}, {"depth": 1, "op": 55, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 146, "result": ["5", "80", "c0", "0"]}, {"depth": 1, "op": 129, "result": ["80", "5", "80"]}, {"depth": 1, "op": 1, "result": ["85"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 1, "result": ["a5"]}, {"depth": 1, "op": 146, "result": ["0", "80", "c0", "a5"]}, {"depth": 1, "op": 144, "result": ["80", "0"]}, {"depth": 1, "op": 146, "result": ["a5", "0", "c0", "80"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 149, "result": ["85", "ffffffffffffffff", "24", "0", "4", "64", "80"]}, {"depth": 1, "op": 148, "result": ["64", "ffffffffffffffff", "24", "0", "4", "85"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 133, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["a9"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 169, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["b5"]}, {"depth": 1, "op": 130, "result": ["80", "b5", "1", "80"]}, {"depth": 1, "op": 130, "result": ["1", "80", "b5", "1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3af"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 943, "result": []}, {"depth": 1, "op": 129, "result": ["80", "1", "80"]}, {"depth": 1, "op": 81, "result": ["5"]}, {"depth": 1, "len": 9, "op": 103, "result": ["ffffffffffffffff"]}, {"depth": 1, "op": 129, "result": ["5", "ffffffffffffffff", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3c9"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 969, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["3dd"]}, {"depth": 1, "op": 129, "result": ["5", "3dd", "5"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3d7"]}, {"depth": 1, "op": 132, "result": ["1", "3d7", "5", "3dd", "5", "1"]}, {"depth": 1, "op": 84, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "len": 3, "op": 97, "result": ["329"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 809, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "op": 129, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a", "1", "48656c6c6f00000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "op": 129, "result": ["1", "48656c6c6f00000000000000000000000000000000000000000000000000000a", "1"]}, {"depth": 1, "op": 28, "result": []}, {"depth": 1, "op": 144, "result": ["1", "2432b63637800000000000000000000000000000000000000000000000000005"]}, {"depth": 1, "op": 130, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a", "1", "2432b63637800000000000000000000000000000000000000000000000000005", "48656c6c6f00000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "op": 22, "result": ["0"]}, {"depth": 1, "op": 128, "result": ["0", "0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["33d"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["7f"]}, {"depth": 1, "op": 130, "result": ["2432b63637800000000000000000000000000000000000000000000000000005", "7f", "0", "2432b63637800000000000000000000000000000000000000000000000000005"]}, {"depth": 1, "op": 22, "result": ["5"]}, {"depth": 1, "op": 145, "result": ["2432b63637800000000000000000000000000000000000000000000000000005", "0", "5"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 91, "pc": 829, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["5", "20", "0", "5"]}, {"depth": 1, "op": 16, "result": ["1"]}, {"depth": 1, "op": 129, "result": ["0", "1", "0"]}, {"depth": 1, "op": 3, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"]}, {"depth": 1, "len": 3, "op": 97, "result": ["35b"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 859, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 145, "result": ["3d7", "48656c6c6f00000000000000000000000000000000000000000000000000000a", "5"]}, {"depth": 1, "op": 144, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a", "3d7"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 983, "result": []}, {"depth": 1, "op": 132, "result": ["1", "5", "5", "3dd", "5", "1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["361"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 865, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 130, "result": ["5", "1f", "1", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3aa"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 938, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 989, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 128, "result": ["20", "20"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 131, "result": ["5", "1f", "20", "20", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "op": 129, "result": ["0", "1", "0"]}, {"depth": 1, "op": 20, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["410"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 132, "result": ["5", "0", "0", "20", "20", "5"]}, {"depth": 1, "op": 21, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3f9"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 133, "result": ["80", "0", "20", "20", "5", "1", "80"]}, {"depth": 1, "op": 131, "result": ["20", "80", "0", "20", "20"]}, {"depth": 1, "op": 1, "result": ["a0"]}, {"depth": 1, "op": 81, "result": ["776f726c64000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "op": 91, "pc": 1017, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 25, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"]}, {"depth": 1, "len": 2, "op": 96, "result": ["3"]}, {"depth": 1, "op": 134, "result": ["5", "3", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "776f726c64000000000000000000000000000000000000000000000000000000", "0", "20", "20", "5"]}, {"depth": 1, "op": 144, "result": ["3", "5"]}, {"depth": 1, "op": 27, "result": []}, {"depth": 1, "op": 28, "result": []}, {"depth": 1, "op": 25, "result": ["ffffffffff000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "op": 22, "result": ["776f726c64000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "op": 133, "result": ["5", "1", "776f726c64000000000000000000000000000000000000000000000000000000", "0", "20", "20", "5"]}, {"depth": 1, "op": 144, "result": ["1", "5"]}, {"depth": 1, "op": 27, "result": []}, {"depth": 1, "op": 23, "result": ["776f726c6400000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "op": 133, "result": ["1", "776f726c6400000000000000000000000000000000000000000000000000000a", "0", "20", "20", "5", "1"]}, {"depth": 1, "op": 85, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["3a6"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 934, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 91, "pc": 938, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 181, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "len": 33, "op": 127, "result": ["61ae4cbae83f72235cd9fa781d18fcb08ff5fa4a44fcc1630fde673bb0041151"]}, {"depth": 1, "op": 51, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 130, "result": ["80", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "61ae4cbae83f72235cd9fa781d18fcb08ff5fa4a44fcc1630fde673bb0041151", "80"]}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 81, "result": ["c0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["e7"]}, {"depth": 1, "op": 146, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "c0", "80", "e7"]}, {"depth": 1, "op": 145, "result": ["80", "c0", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 144, "result": ["c0", "80"]}, {"depth": 1, "len": 3, "op": 97, "result": ["46b"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 1131, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "len": 2, "op": 96, "result": ["a0"]}, {"depth": 1, "op": 27, "result": []}, {"depth": 1, "op": 3, "result": ["ffffffffffffffffffffffffffffffffffffffff"]}, {"depth": 1, "op": 131, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "ffffffffffffffffffffffffffffffffffffffff", "c0", "80", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 22, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 129, "result": ["c0", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "c0"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["c0", "20", "40", "c0"]}, {"depth": 1, "op": 1, "result": ["e0"]}, {"depth": 1, "op": 129, "result": ["40", "e0", "40"]}, {"depth": 1, "op": 144, "result": ["e0", "40"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 144, "result": ["40", "0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["48e"]}, {"depth": 1, "op": 144, "result": ["40", "48e"]}, {"depth": 1, "op": 131, "result": ["c0", "40", "48e", "0", "c0"]}, {"depth": 1, "op": 1, "result": ["100"]}, {"depth": 1, "op": 132, "result": ["80", "100", "48e", "0", "c0", "80"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2cd"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 717, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 129, "result": ["80", "0", "80"]}, {"depth": 1, "op": 81, "result": ["5"]}, {"depth": 1, "op": 128, "result": ["5", "5"]}, {"depth": 1, "op": 132, "result": ["100", "5", "5", "0", "80", "100"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "op": 91, "pc": 725, "result": []}, {"depth": 1, "op": 129, "result": ["5", "0", "5"]}, {"depth": 1, "op": 129, "result": ["0", "5", "0"]}, {"depth": 1, "op": 16, "result": ["1"]}, {"depth": 1, "op": 21, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2f1"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 129, "result": ["0", "20", "0"]}, {"depth": 1, "op": 133, "result": ["80", "0", "20", "0", "5", "0", "80"]}, {"depth": 1, "op": 1, "result": ["80"]}, {"depth": 1, "op": 129, "result": ["20", "80", "20"]}, {"depth": 1, "op": 1, "result": ["a0"]}, {"depth": 1, "op": 81, "result": ["776f726c64000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "op": 134, "result": ["100", "776f726c64000000000000000000000000000000000000000000000000000000", "20", "0", "5", "0", "80", "100"]}, {"depth": 1, "op": 131, "result": ["0", "100", "776f726c64000000000000000000000000000000000000000000000000000000", "20", "0"]}, {"depth": 1, "op": 1, "result": ["100"]}, {"depth": 1, "op": 130, "result": ["20", "100", "776f726c64000000000000000000000000000000000000000000000000000000", "20"]}, {"depth": 1, "op": 1, "result": ["120"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 1, "result": ["20"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2d5"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 725, "result": []}, {"depth": 1, "op": 129, "result": ["5", "20", "5"]}, {"depth": 1, "op": 129, "result": ["20", "5", "20"]}, {"depth": 1, "op": 16, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2f1"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 753, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 95, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["5", "20", "0", "5"]}, {"depth": 1, "op": 134, "result": ["100", "5", "20", "0", "5", "0", "80", "100"]}, {"depth": 1, "op": 1, "result": ["105"]}, {"depth": 1, "op": 1, "result": ["125"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 25, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 131, "result": ["5", "1f", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", "20", "5"]}, {"depth": 1, "op": 1, "result": ["24"]}, {"depth": 1, "op": 22, "result": ["20"]}, {"depth": 1, "op": 133, "result": ["100", "20", "20", "5", "0", "80", "100"]}, {"depth": 1, "op": 1, "result": ["120"]}, {"depth": 1, "op": 1, "result": ["140"]}, {"depth": 1, "op": 145, "result": ["0", "5", "140"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 146, "result": ["48e", "80", "100", "140"]}, {"depth": 1, "op": 145, "result": ["100", "80", "48e"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 1166, "result": []}, {"depth": 1, "op": 148, "result": ["e7", "0", "c0", "80", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "140"]}, {"depth": 1, "op": 147, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "0", "c0", "80", "e7"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 231, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 81, "result": ["c0"]}, {"depth": 1, "op": 128, "result": ["c0", "c0"]}, {"depth": 1, "op": 145, "result": ["140", "c0", "c0"]}, {"depth": 1, "op": 3, "result": ["80"]}, {"depth": 1, "op": 144, "result": ["c0", "80"]}, {"depth": 1, "op": 161, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 138, "result": []}, {"depth": 1, "op": 0, "result": []}]', '401', '{"--PUSH1": 1, "-PUSH1-MSTORE": 1, "ADD-ADD-GT": 1, "ADD-ADD-MSTORE": 1, "ADD-ADD-SWAP2": 1, "ADD-AND-DUP2": 1, "ADD-AND-DUP6": 1, "ADD-CALLDATACOPY-PUSH0": 1, "ADD-DUP2-ADD": 1, "ADD-DUP2-SWAP1": 1, "ADD-DUP3-ADD": 1, "ADD-DUP5-PUSH2": 1, "ADD-GT-ISZERO": 1, "ADD-MLOAD-DUP7": 1, "ADD-MLOAD-JUMPDEST": 1, "ADD-MSTORE-ADD": 1, "ADD-MSTORE-PUSH1": 1, "ADD-PUSH1-ADD": 1, "ADD-PUSH1-DUP4": 1, "ADD-PUSH1-NOT": 1, "ADD-PUSH2-JUMP": 1, "ADD-SLT-PUSH2": 1, "ADD-SWAP1-DUP4": 1, "ADD-SWAP2-POP": 2, "ADD-SWAP3-SWAP1": 1, "AND-DUP1-PUSH2": 1, "AND-DUP2-ADD": 1, "AND-DUP2-MSTORE": 1, "AND-DUP6-ADD": 1, "AND-PUSH1-ADD": 1, "AND-PUSH1-DUP6": 1, "AND-SWAP2-POP": 1, "CALLDATACOPY-PUSH0-SWAP3": 1, "CALLDATALOAD-DUP2-DUP2": 1, "CALLDATALOAD-PUSH1-SHR": 1, "CALLDATALOAD-PUSH8-DUP1": 1, "CALLDATASIZE-LT-PUSH2": 1, "CALLDATASIZE-PUSH1-PUSH2": 1, "CALLER-DUP3-PUSH1": 1, "CALLVALUE-DUP1-ISZERO": 1, "DUP1-DUP3-GT": 1, "DUP1-DUP5-MSTORE": 1, "DUP1-ISZERO-PUSH2": 1, "DUP1-PUSH1-DUP4": 1, "DUP1-PUSH2-JUMPI": 1, "DUP1-PUSH4-EQ": 3, "DUP1-SWAP2-SUB": 1, "DUP2-ADD-MLOAD": 1, "DUP2-ADD-PUSH1": 1, "DUP2-ADD-SWAP1": 1, "DUP2-AND-PUSH1": 1, "DUP2-CALLDATALOAD-DUP2": 1, "DUP2-CALLDATALOAD-PUSH8": 1, "DUP2-DUP2-GT": 1, "DUP2-DUP2-LT": 2, "DUP2-DUP2-SHR": 1, "DUP2-DUP4-LT": 1, "DUP2-DUP5-ADD": 1, "DUP2-DUP6-ADD": 1, "DUP2-EQ-PUSH2": 1, "DUP2-GT-ISZERO": 2, "DUP2-LT-ISZERO": 2, "DUP2-MLOAD-DUP1": 1, "DUP2-MLOAD-PUSH8": 1, "DUP2-MSTORE-DUP8": 1, "DUP2-MSTORE-PUSH1": 1, "DUP2-PUSH1-MSTORE": 1, "DUP2-PUSH2-DUP5": 1, "DUP2-SHR-SWAP1": 1, "DUP2-SUB-PUSH2": 1, "DUP2-SWAP1-MSTORE": 1, "DUP3-ADD-DUP2": 1, "DUP3-ADD-MSTORE": 1, "DUP3-ADD-PUSH1": 1, "DUP3-AND-DUP1": 1, "DUP3-AND-SWAP2": 1, "DUP3-DUP2-MSTORE": 1, "DUP3-DUP3-PUSH2": 1, "DUP3-DUP5-SUB": 1, "DUP3-DUP7-ADD": 1, "DUP3-GT-DUP2": 1, "DUP3-GT-ISZERO": 2, "DUP3-LT-DUP2": 1, "DUP3-PUSH1-DUP7": 1, "DUP3-PUSH1-MLOAD": 1, "DUP3-PUSH2-JUMP": 1, "DUP4-ADD-AND": 1, "DUP4-ADD-CALLDATACOPY": 1, "DUP4-ADD-DUP3": 1, "DUP4-ADD-DUP5": 1, "DUP4-ADD-MLOAD": 1, "DUP4-ADD-SLT": 1, "DUP4-AND-DUP2": 1, "DUP4-DUP3-GT": 1, "DUP4-GT-PUSH1": 1, "DUP4-LT-OR": 1, "DUP5-ADD-SWAP2": 1, "DUP5-DUP8-ADD": 1, "DUP5-ISZERO-PUSH2": 1, "DUP5-MSTORE-PUSH0": 1, "DUP5-PUSH1-DUP4": 1, "DUP5-PUSH2-JUMP": 2, "DUP5-SLOAD-PUSH2": 1, "DUP5-SUB-SLT": 1, "DUP6-ADD-ADD": 1, "DUP6-ADD-DUP2": 1, "DUP6-DUP4-ADD": 1, "DUP6-SSTORE-PUSH2": 1, "DUP6-SWAP1-SHL": 1, "DUP7-ADD-ADD": 1, "DUP7-ADD-PUSH1": 1, "DUP7-DUP4-ADD": 1, "DUP7-SWAP1-SHL": 1, "DUP8-ADD-ADD": 1, "DUP8-PUSH1-DUP5": 1, "EQ-PUSH2-JUMPI": 4, "GT-DUP2-DUP4": 1, "GT-ISZERO-PUSH2": 5, "GT-PUSH1-DUP2": 1, "ISZERO-PUSH2-JUMPI": 11, "JUMP-JUMPDEST-DUP2": 2, "JUMP-JUMPDEST-DUP5": 1, "JUMP-JUMPDEST-POP": 2, "JUMP-JUMPDEST-PUSH0": 2, "JUMP-JUMPDEST-PUSH1": 6, "JUMP-JUMPDEST-PUSH2": 1, "JUMP-JUMPDEST-STOP": 1, "JUMP-JUMPDEST-SWAP5": 1, "JUMPDEST-DUP2-CALLDATALOAD": 2, "JUMPDEST-DUP2-DUP2": 2, "JUMPDEST-DUP2-DUP5": 1, "JUMPDEST-DUP2-MLOAD": 1, "JUMPDEST-DUP2-PUSH1": 1, "JUMPDEST-DUP3-PUSH1": 1, "JUMPDEST-DUP5-PUSH2": 1, "JUMPDEST-POP-POP": 3, "JUMPDEST-POP-PUSH0": 1, "JUMPDEST-POP-PUSH1": 1, "JUMPDEST-POP-PUSH32": 1, "JUMPDEST-POP-SWAP2": 1, "JUMPDEST-PUSH0-DUP2": 1, "JUMPDEST-PUSH0-NOT": 1, "JUMPDEST-PUSH0-PUSH1": 1, "JUMPDEST-PUSH1-DUP1": 1, "JUMPDEST-PUSH1-DUP2": 1, "JUMPDEST-PUSH1-DUP3": 2, "JUMPDEST-PUSH1-MLOAD": 2, "JUMPDEST-PUSH1-PUSH1": 1, "JUMPDEST-PUSH1-PUSH2": 1, "JUMPDEST-PUSH2-DUP2": 1, "JUMPDEST-PUSH2-JUMP": 1, "JUMPDEST-PUSH2-PUSH2": 1, "JUMPDEST-SWAP5-SWAP4": 1, "JUMPI-DUP1-PUSH4": 2, "JUMPI-JUMPDEST-DUP2": 4, "JUMPI-JUMPDEST-DUP3": 1, "JUMPI-JUMPDEST-POP": 4, "JUMPI-JUMPDEST-PUSH1": 1, "JUMPI-JUMPDEST-PUSH2": 2, "JUMPI-POP-DUP6": 1, "JUMPI-PUSH0-CALLDATALOAD": 1, "JUMPI-PUSH0-DUP5": 1, "JUMPI-PUSH1-DUP2": 1, "JUMPI-PUSH1-DUP3": 1, "LOG1-POP-JUMP": 1, "LT-DUP2-SUB": 1, "LT-ISZERO-PUSH2": 2, "LT-OR-ISZERO": 1, "LT-PUSH2-JUMPI": 1, "MLOAD-DUP1-DUP5": 1, "MLOAD-DUP1-SWAP2": 1, "MLOAD-DUP7-DUP4": 1, "MLOAD-JUMPDEST-PUSH0": 1, "MLOAD-PUSH1-DUP3": 1, "MLOAD-PUSH2-SWAP3": 1, "MLOAD-PUSH8-DUP2": 1, "MSTORE-ADD-PUSH2": 1, "MSTORE-CALLVALUE-DUP1": 1, "MSTORE-DUP3-DUP2": 1, "MSTORE-DUP8-PUSH1": 1, "MSTORE-POP-SWAP6": 1, "MSTORE-PUSH0-JUMPDEST": 1, "MSTORE-PUSH0-SWAP1": 1, "MSTORE-PUSH1-PUSH1": 2, "NOT-AND-PUSH1": 1, "NOT-PUSH1-DUP4": 1, "NOT-PUSH1-DUP7": 1, "NOT-SWAP1-DUP2": 1, "OR-DUP6-SSTORE": 1, "OR-ISZERO-PUSH2": 1, "POP-DUP5-PUSH1": 1, "POP-DUP6-DUP4": 1, "POP-JUMP-JUMPDEST": 7, "POP-JUMPDEST-POP": 1, "POP-JUMPDEST-PUSH1": 1, "POP-POP-JUMP": 5, "POP-POP-JUMPDEST": 1, "POP-POP-POP": 8, "POP-POP-SWAP3": 1, "POP-PUSH0-PUSH1": 1, "POP-PUSH1-CALLDATASIZE": 1, "POP-PUSH32-CALLER": 1, "POP-SWAP2-SWAP1": 1, "POP-SWAP3-SWAP2": 1, "POP-SWAP6-SWAP5": 1, "PUSH0-CALLDATALOAD-PUSH1": 1, "PUSH0-DUP2-MLOAD": 1, "PUSH0-DUP5-ISZERO": 1, "PUSH0-JUMPDEST-DUP2": 1, "PUSH0-NOT-PUSH1": 1, "PUSH0-PUSH1-DUP3": 2, "PUSH0-SWAP1-PUSH2": 1, "PUSH0-SWAP3-DUP2": 1, "PUSH1-ADD-AND": 1, "PUSH1-ADD-SWAP3": 1, "PUSH1-CALLDATASIZE-LT": 1, "PUSH1-DUP1-PUSH1": 1, "PUSH1-DUP2-DUP2": 1, "PUSH1-DUP2-DUP6": 1, "PUSH1-DUP2-EQ": 1, "PUSH1-DUP3-ADD": 2, "PUSH1-DUP3-AND": 1, "PUSH1-DUP3-DUP5": 1, "PUSH1-DUP3-DUP7": 1, "PUSH1-DUP3-GT": 1, "PUSH1-DUP3-LT": 1, "PUSH1-DUP4-ADD": 3, "PUSH1-DUP4-GT": 1, "PUSH1-DUP5-DUP8": 1, "PUSH1-DUP6-SWAP1": 1, "PUSH1-DUP7-ADD": 1, "PUSH1-DUP7-SWAP1": 1, "PUSH1-MLOAD-DUP1": 1, "PUSH1-MLOAD-PUSH1": 1, "PUSH1-MLOAD-PUSH2": 1, "PUSH1-MSTORE-CALLVALUE": 1, "PUSH1-MSTORE-DUP3": 1, "PUSH1-NOT-PUSH1": 1, "PUSH1-NOT-SWAP1": 1, "PUSH1-PUSH1-DUP3": 1, "PUSH1-PUSH1-NOT": 1, "PUSH1-PUSH1-PUSH1": 1, "PUSH1-PUSH1-SHL": 1, "PUSH1-PUSH2-DUP3": 1, "PUSH1-PUSH2-JUMP": 1, "PUSH1-SHL-SUB": 1, "PUSH1-SHR-DUP1": 1, "PUSH2-CALLDATASIZE-PUSH1": 1, "PUSH2-DUP2-PUSH2": 1, "PUSH2-DUP3-DUP3": 1, "PUSH2-DUP5-SLOAD": 1, "PUSH2-JUMP-JUMPDEST": 9, "PUSH2-JUMPI-DUP1": 2, "PUSH2-JUMPI-JUMPDEST": 12, "PUSH2-JUMPI-POP": 1, "PUSH2-JUMPI-PUSH0": 2, "PUSH2-JUMPI-PUSH1": 2, "PUSH2-PUSH2-CALLDATASIZE": 1, "PUSH2-SWAP1-DUP4": 1, "PUSH2-SWAP3-SWAP2": 1, "PUSH32-CALLER-DUP3": 1, "PUSH4-EQ-PUSH2": 3, "PUSH8-DUP1-DUP3": 1, "PUSH8-DUP2-GT": 1, "SHL-OR-DUP6": 1, "SHL-SHR-NOT": 1, "SHL-SUB-DUP4": 1, "SHR-DUP1-PUSH4": 1, "SHR-NOT-AND": 1, "SHR-SWAP1-DUP3": 1, "SLOAD-PUSH2-JUMP": 1, "SLT-ISZERO-PUSH2": 1, "SLT-PUSH2-JUMPI": 1, "SSTORE-PUSH2-JUMP": 1, "SUB-DUP4-AND": 1, "SUB-PUSH2-JUMPI": 1, "SUB-SLT-ISZERO": 1, "SUB-SWAP1-LOG1": 1, "SWAP1-DUP2-AND": 1, "SWAP1-DUP3-AND": 1, "SWAP1-DUP4-ADD": 1, "SWAP1-DUP4-DUP3": 1, "SWAP1-LOG1-POP": 1, "SWAP1-MSTORE-PUSH0": 1, "SWAP1-POP-JUMP": 1, "SWAP1-PUSH2-JUMP": 1, "SWAP1-PUSH2-SWAP1": 1, "SWAP1-SHL-OR": 1, "SWAP1-SHL-SHR": 1, "SWAP1-SWAP3-MSTORE": 1, "SWAP2-POP-DUP5": 1, "SWAP2-POP-JUMPDEST": 1, "SWAP2-POP-POP": 2, "SWAP2-SUB-SWAP1": 1, "SWAP2-SWAP1-POP": 1, "SWAP2-SWAP1-PUSH2": 1, "SWAP3-DUP2-ADD": 1, "SWAP3-MSTORE-POP": 1, "SWAP3-SWAP1-SWAP3": 1, "SWAP3-SWAP2-POP": 1, "SWAP3-SWAP2-SWAP1": 1, "SWAP4-POP-POP": 1, "SWAP5-POP-POP": 1, "SWAP5-SWAP4-POP": 1, "SWAP6-SWAP5-POP": 1}', '{"ADD": 24, "AND": 7, "CALLDATACOPY": 1, "CALLDATALOAD": 3, "CALLDATASIZE": 2, "CALLER": 1, "CALLVALUE": 1, "DUP1": 9, "DUP2": 27, "DUP3": 16, "DUP4": 10, "DUP5": 9, "DUP6": 5, "DUP7": 4, "DUP8": 2, "EQ": 4, "GT": 7, "ISZERO": 11, "JUMP": 16, "JUMPDEST": 32, "JUMPI": 19, "LOG1": 1, "LT": 5, "MLOAD": 7, "MSTORE": 9, "NOT": 4, "OR": 2, "POP": 32, "PUSH0": 9, "PUSH1": 38, "PUSH2": 35, "PUSH32": 1, "PUSH4": 3, "PUSH8": 2, "SHL": 3, "SHR": 3, "SLOAD": 1, "SLT": 2, "SSTORE": 1, "STOP": 1, "SUB": 4, "SWAP1": 12, "SWAP2": 7, "SWAP3": 5, "SWAP4": 1, "SWAP5": 2, "SWAP6": 1}', '["0", "32", "192", "100", "18446744073709551615", "36", "0", "4", "16372862481753577294267620541204082621793577260386896888229232294795359027205", "0", "32745724963507154588535241082408165243587154520773793776458464589590718054410", "1", "5", "5", "0", "0", "32", "32", "5", "1", "128", "1", "32", "0", "5", "256", "128", "1042670065772417531265339626254010608318119686474", "0", "192", "128", "128"]', '["0:PUSH1", "2:PUSH1", "4:MSTORE", "5:CALLVALUE", "6:DUP1", "7:ISZERO", "8:PUSH2", "11:JUMPI", "15:JUMPDEST", "16:POP", "17:PUSH1", "19:CALLDATASIZE", "20:LT", "21:PUSH2", "24:JUMPI", "25:PUSH0", "26:CALLDATALOAD", "27:PUSH1", "29:SHR", "30:DUP1", "31:PUSH4", "36:EQ", "37:PUSH2", "40:JUMPI", "41:DUP1", "42:PUSH4", "47:EQ", "48:PUSH2", "51:JUMPI", "52:DUP1", "53:PUSH4", "58:EQ", "59:PUSH2", "62:JUMPI", "119:JUMPDEST", "120:PUSH2", "123:PUSH2", "126:CALLDATASIZE", "127:PUSH1", "129:PUSH2", "132:JUMP", "546:JUMPDEST", "547:PUSH0", "548:PUSH1", "550:DUP3", "551:DUP5", "552:SUB", "553:SLT", "554:ISZERO", "555:PUSH2", "558:JUMPI", "562:JUMPDEST", "563:DUP2", "564:CALLDATALOAD", "565:PUSH8", "574:DUP1", "575:DUP3", "576:GT", "577:ISZERO", "578:PUSH2", "581:JUMPI", "585:JUMPDEST", "586:DUP2", "587:DUP5", "588:ADD", "589:SWAP2", "590:POP", "591:DUP5", "592:PUSH1", "594:DUP4", "595:ADD", "596:SLT", "597:PUSH2", "600:JUMPI", "604:JUMPDEST", "605:DUP2", "606:CALLDATALOAD", "607:DUP2", "608:DUP2", "609:GT", "610:ISZERO", "611:PUSH2", "614:JUMPI", "622:JUMPDEST", "623:PUSH1", "625:MLOAD", "626:PUSH1", "628:DUP3", "629:ADD", "630:PUSH1", "632:NOT", "633:SWAP1", "634:DUP2", "635:AND", "636:PUSH1", "638:ADD", "639:AND", "640:DUP2", "641:ADD", "642:SWAP1", "643:DUP4", "644:DUP3", "645:GT", "646:DUP2", "647:DUP4", "648:LT", "649:OR", "650:ISZERO", "651:PUSH2", "654:JUMPI", "662:JUMPDEST", "663:DUP2", "664:PUSH1", "666:MSTORE", "667:DUP3", "668:DUP2", "669:MSTORE", "670:DUP8", "671:PUSH1", "673:DUP5", "674:DUP8", "675:ADD", "676:ADD", "677:GT", "678:ISZERO", "679:PUSH2", "682:JUMPI", "686:JUMPDEST", "687:DUP3", "688:PUSH1", "690:DUP7", "691:ADD", "692:PUSH1", "694:DUP4", "695:ADD", "696:CALLDATACOPY", "697:PUSH0", "698:SWAP3", "699:DUP2", "700:ADD", "701:PUSH1", "703:ADD", "704:SWAP3", "705:SWAP1", "706:SWAP3", "707:MSTORE", "708:POP", "709:SWAP6", "710:SWAP5", "711:POP", "712:POP", "713:POP", "714:POP", "715:POP", "716:JUMP", "133:JUMPDEST", "134:PUSH2", "137:JUMP", "169:JUMPDEST", "170:PUSH1", "172:PUSH2", "175:DUP3", "176:DUP3", "177:PUSH2", "180:JUMP", "943:JUMPDEST", "944:DUP2", "945:MLOAD", "946:PUSH8", "955:DUP2", "956:GT", "957:ISZERO", "958:PUSH2", "961:JUMPI", "969:JUMPDEST", "970:PUSH2", "973:DUP2", "974:PUSH2", "977:DUP5", "978:SLOAD", "979:PUSH2", "982:JUMP", "809:JUMPDEST", "810:PUSH1", "812:DUP2", "813:DUP2", "814:SHR", "815:SWAP1", "816:DUP3", "817:AND", "818:DUP1", "819:PUSH2", "822:JUMPI", "823:PUSH1", "825:DUP3", "826:AND", "827:SWAP2", "828:POP", "829:JUMPDEST", "830:PUSH1", "832:DUP3", "833:LT", "834:DUP2", "835:SUB", "836:PUSH2", "839:JUMPI", "859:JUMPDEST", "860:POP", "861:SWAP2", "862:SWAP1", "863:POP", "864:JUMP", "983:JUMPDEST", "984:DUP5", "985:PUSH2", "988:JUMP", "865:JUMPDEST", "866:PUSH1", "868:DUP3", "869:GT", "870:ISZERO", "871:PUSH2", "874:JUMPI", "938:JUMPDEST", "939:POP", "940:POP", "941:POP", "942:JUMP", "989:JUMPDEST", "990:PUSH1", "992:DUP1", "993:PUSH1", "995:DUP4", "996:GT", "997:PUSH1", "999:DUP2", "1000:EQ", "1001:PUSH2", "1004:JUMPI", "1005:PUSH0", "1006:DUP5", "1007:ISZERO", "1008:PUSH2", "1011:JUMPI", "1012:POP", "1013:DUP6", "1014:DUP4", "1015:ADD", "1016:MLOAD", "1017:JUMPDEST", "1018:PUSH0", "1019:NOT", "1020:PUSH1", "1022:DUP7", "1023:SWAP1", "1024:SHL", "1025:SHR", "1026:NOT", "1027:AND", "1028:PUSH1", "1030:DUP6", "1031:SWAP1", "1032:SHL", "1033:OR", "1034:DUP6", "1035:SSTORE", "1036:PUSH2", "1039:JUMP", "934:JUMPDEST", "935:POP", "936:POP", "937:POP", "938:JUMPDEST", "939:POP", "940:POP", "941:POP", "942:JUMP", "181:JUMPDEST", "182:POP", "183:PUSH32", "216:CALLER", "217:DUP3", "218:PUSH1", "220:MLOAD", "221:PUSH2", "224:SWAP3", "225:SWAP2", "226:SWAP1", "227:PUSH2", "230:JUMP", "1131:JUMPDEST", "1132:PUSH1", "1134:PUSH1", "1136:PUSH1", "1138:SHL", "1139:SUB", "1140:DUP4", "1141:AND", "1142:DUP2", "1143:MSTORE", "1144:PUSH1", "1146:PUSH1", "1148:DUP3", "1149:ADD", "1150:DUP2", "1151:SWAP1", "1152:MSTORE", "1153:PUSH0", "1154:SWAP1", "1155:PUSH2", "1158:SWAP1", "1159:DUP4", "1160:ADD", "1161:DUP5", "1162:PUSH2", "1165:JUMP", "717:JUMPDEST", "718:PUSH0", "719:DUP2", "720:MLOAD", "721:DUP1", "722:DUP5", "723:MSTORE", "724:PUSH0", "725:JUMPDEST", "726:DUP2", "727:DUP2", "728:LT", "729:ISZERO", "730:PUSH2", "733:JUMPI", "734:PUSH1", "736:DUP2", "737:DUP6", "738:ADD", "739:DUP2", "740:ADD", "741:MLOAD", "742:DUP7", "743:DUP4", "744:ADD", "745:DUP3", "746:ADD", "747:MSTORE", "748:ADD", "749:PUSH2", "752:JUMP", "725:JUMPDEST", "726:DUP2", "727:DUP2", "728:LT", "729:ISZERO", "730:PUSH2", "733:JUMPI", "753:JUMPDEST", "754:POP", "755:PUSH0", "756:PUSH1", "758:DUP3", "759:DUP7", "760:ADD", "761:ADD", "762:MSTORE", "763:PUSH1", "765:PUSH1", "767:NOT", "768:PUSH1", "770:DUP4", "771:ADD", "772:AND", "773:DUP6", "774:ADD", "775:ADD", "776:SWAP2", "777:POP", "778:POP", "779:SWAP3", "780:SWAP2", "781:POP", "782:POP", "783:JUMP", "1166:JUMPDEST", "1167:SWAP5", "1168:SWAP4", "1169:POP", "1170:POP", "1171:POP", "1172:POP", "1173:JUMP", "231:JUMPDEST", "232:PUSH1", "234:MLOAD", "235:DUP1", "236:SWAP2", "237:SUB", "238:SWAP1", "239:LOG1", "240:POP", "241:JUMP", "138:JUMPDEST", "139:STOP"]'] # noqa: E501 +EXPECTED_JS_TRACERS = ['{"ADD-ADD": 3, "ADD-AND": 2, "ADD-CALLDATACOPY": 1, "ADD-DUP2": 2, "ADD-DUP3": 1, "ADD-DUP5": 1, "ADD-GT": 1, "ADD-MLOAD": 2, "ADD-MSTORE": 2, "ADD-PUSH1": 3, "ADD-PUSH2": 1, "ADD-SLT": 1, "ADD-SWAP1": 1, "ADD-SWAP2": 2, "ADD-SWAP3": 1, "AND-DUP1": 1, "AND-DUP2": 2, "AND-DUP6": 1, "AND-PUSH1": 2, "AND-SWAP2": 1, "CALLDATACOPY-PUSH0": 1, "CALLDATALOAD-DUP2": 1, "CALLDATALOAD-PUSH1": 1, "CALLDATALOAD-PUSH8": 1, "CALLDATASIZE-LT": 1, "CALLDATASIZE-PUSH1": 1, "CALLER-DUP3": 1, "CALLVALUE-DUP1": 1, "DUP1-DUP3": 1, "DUP1-DUP5": 1, "DUP1-ISZERO": 1, "DUP1-PUSH1": 1, "DUP1-PUSH2": 1, "DUP1-PUSH4": 3, "DUP1-SWAP2": 1, "DUP2-ADD": 3, "DUP2-AND": 1, "DUP2-CALLDATALOAD": 2, "DUP2-DUP2": 4, "DUP2-DUP4": 1, "DUP2-DUP5": 1, "DUP2-DUP6": 1, "DUP2-EQ": 1, "DUP2-GT": 2, "DUP2-LT": 2, "DUP2-MLOAD": 2, "DUP2-MSTORE": 2, "DUP2-PUSH1": 1, "DUP2-PUSH2": 1, "DUP2-SHR": 1, "DUP2-SUB": 1, "DUP2-SWAP1": 1, "DUP3-ADD": 3, "DUP3-AND": 2, "DUP3-DUP2": 1, "DUP3-DUP3": 1, "DUP3-DUP5": 1, "DUP3-DUP7": 1, "DUP3-GT": 3, "DUP3-LT": 1, "DUP3-PUSH1": 2, "DUP3-PUSH2": 1, "DUP4-ADD": 6, "DUP4-AND": 1, "DUP4-DUP3": 1, "DUP4-GT": 1, "DUP4-LT": 1, "DUP5-ADD": 1, "DUP5-DUP8": 1, "DUP5-ISZERO": 1, "DUP5-MSTORE": 1, "DUP5-PUSH1": 1, "DUP5-PUSH2": 2, "DUP5-SLOAD": 1, "DUP5-SUB": 1, "DUP6-ADD": 2, "DUP6-DUP4": 1, "DUP6-SSTORE": 1, "DUP6-SWAP1": 1, "DUP7-ADD": 2, "DUP7-DUP4": 1, "DUP7-SWAP1": 1, "DUP8-ADD": 1, "DUP8-PUSH1": 1, "EQ-PUSH2": 4, "GT-DUP2": 1, "GT-ISZERO": 5, "GT-PUSH1": 1, "ISZERO-PUSH2": 11, "JUMP-JUMPDEST": 16, "JUMPDEST-DUP2": 7, "JUMPDEST-DUP3": 1, "JUMPDEST-DUP5": 1, "JUMPDEST-POP": 7, "JUMPDEST-PUSH0": 3, "JUMPDEST-PUSH1": 8, "JUMPDEST-PUSH2": 3, "JUMPDEST-STOP": 1, "JUMPDEST-SWAP5": 1, "JUMPI-DUP1": 2, "JUMPI-JUMPDEST": 12, "JUMPI-POP": 1, "JUMPI-PUSH0": 2, "JUMPI-PUSH1": 2, "LOG1-POP": 1, "LT-DUP2": 1, "LT-ISZERO": 2, "LT-OR": 1, "LT-PUSH2": 1, "MLOAD-DUP1": 2, "MLOAD-DUP7": 1, "MLOAD-JUMPDEST": 1, "MLOAD-PUSH1": 1, "MLOAD-PUSH2": 1, "MLOAD-PUSH8": 1, "MSTORE-ADD": 1, "MSTORE-CALLVALUE": 1, "MSTORE-DUP3": 1, "MSTORE-DUP8": 1, "MSTORE-POP": 1, "MSTORE-PUSH0": 2, "MSTORE-PUSH1": 2, "NOT-AND": 1, "NOT-PUSH1": 2, "NOT-SWAP1": 1, "OR-DUP6": 1, "OR-ISZERO": 1, "POP-DUP5": 1, "POP-DUP6": 1, "POP-JUMP": 7, "POP-JUMPDEST": 2, "POP-POP": 15, "POP-PUSH0": 1, "POP-PUSH1": 1, "POP-PUSH32": 1, "POP-SWAP2": 1, "POP-SWAP3": 1, "POP-SWAP6": 1, "PUSH0-CALLDATALOAD": 1, "PUSH0-DUP2": 1, "PUSH0-DUP5": 1, "PUSH0-JUMPDEST": 1, "PUSH0-NOT": 1, "PUSH0-PUSH1": 2, "PUSH0-SWAP1": 1, "PUSH0-SWAP3": 1, "PUSH1-ADD": 2, "PUSH1-CALLDATASIZE": 1, "PUSH1-DUP1": 1, "PUSH1-DUP2": 3, "PUSH1-DUP3": 7, "PUSH1-DUP4": 4, "PUSH1-DUP5": 1, "PUSH1-DUP6": 1, "PUSH1-DUP7": 2, "PUSH1-MLOAD": 3, "PUSH1-MSTORE": 2, "PUSH1-NOT": 2, "PUSH1-PUSH1": 5, "PUSH1-PUSH2": 2, "PUSH1-SHL": 1, "PUSH1-SHR": 1, "PUSH2-CALLDATASIZE": 1, "PUSH2-DUP2": 1, "PUSH2-DUP3": 1, "PUSH2-DUP5": 1, "PUSH2-JUMP": 9, "PUSH2-JUMPI": 19, "PUSH2-PUSH2": 1, "PUSH2-SWAP1": 1, "PUSH2-SWAP3": 1, "PUSH32-CALLER": 1, "PUSH4-EQ": 3, "PUSH8-DUP1": 1, "PUSH8-DUP2": 1, "SHL-OR": 1, "SHL-SHR": 1, "SHL-SUB": 1, "SHR-DUP1": 1, "SHR-NOT": 1, "SHR-SWAP1": 1, "SLOAD-PUSH2": 1, "SLT-ISZERO": 1, "SLT-PUSH2": 1, "SSTORE-PUSH2": 1, "SUB-DUP4": 1, "SUB-PUSH2": 1, "SUB-SLT": 1, "SUB-SWAP1": 1, "SWAP1-DUP2": 1, "SWAP1-DUP3": 1, "SWAP1-DUP4": 2, "SWAP1-LOG1": 1, "SWAP1-MSTORE": 1, "SWAP1-POP": 1, "SWAP1-PUSH2": 2, "SWAP1-SHL": 2, "SWAP1-SWAP3": 1, "SWAP2-POP": 4, "SWAP2-SUB": 1, "SWAP2-SWAP1": 2, "SWAP3-DUP2": 1, "SWAP3-MSTORE": 1, "SWAP3-SWAP1": 1, "SWAP3-SWAP2": 2, "SWAP4-POP": 1, "SWAP5-POP": 1, "SWAP5-SWAP4": 1, "SWAP6-SWAP5": 1}', '[{"depth": 1, "len": 2, "op": 96, "result": ["80"]}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 52, "result": ["0"]}, {"depth": 1, "op": 128, "result": ["0", "0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["f"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 15, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["4"]}, {"depth": 1, "op": 54, "result": ["64"]}, {"depth": 1, "op": 16, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["55"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 53, "result": ["a413686200000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "len": 2, "op": 96, "result": ["e0"]}, {"depth": 1, "op": 28, "result": []}, {"depth": 1, "op": 128, "result": ["a4136862", "a4136862"]}, {"depth": 1, "len": 5, "op": 99, "result": ["c4dae88"]}, {"depth": 1, "op": 20, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["59"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 128, "result": ["a4136862", "a4136862"]}, {"depth": 1, "len": 5, "op": 99, "result": ["2e52d606"]}, {"depth": 1, "op": 20, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["6f"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 128, "result": ["a4136862", "a4136862"]}, {"depth": 1, "len": 5, "op": 99, "result": ["a4136862"]}, {"depth": 1, "op": 20, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["77"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 119, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["8a"]}, {"depth": 1, "len": 3, "op": 97, "result": ["85"]}, {"depth": 1, "op": 54, "result": ["64"]}, {"depth": 1, "len": 2, "op": 96, "result": ["4"]}, {"depth": 1, "len": 3, "op": 97, "result": ["222"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 546, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["4", "20", "0", "4"]}, {"depth": 1, "op": 132, "result": ["64", "4", "20", "0", "4", "64"]}, {"depth": 1, "op": 3, "result": ["60"]}, {"depth": 1, "op": 18, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["232"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 562, "result": []}, {"depth": 1, "op": 129, "result": ["4", "0", "4"]}, {"depth": 1, "op": 53, "result": ["20"]}, {"depth": 1, "len": 9, "op": 103, "result": ["ffffffffffffffff"]}, {"depth": 1, "op": 128, "result": ["ffffffffffffffff", "ffffffffffffffff"]}, {"depth": 1, "op": 130, "result": ["20", "ffffffffffffffff", "ffffffffffffffff", "20"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["249"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 585, "result": []}, {"depth": 1, "op": 129, "result": ["20", "ffffffffffffffff", "20"]}, {"depth": 1, "op": 132, "result": ["4", "20", "ffffffffffffffff", "20", "0", "4"]}, {"depth": 1, "op": 1, "result": ["24"]}, {"depth": 1, "op": 145, "result": ["20", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 132, "result": ["64", "ffffffffffffffff", "24", "0", "4", "64"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 131, "result": ["24", "1f", "64", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 1, "result": ["43"]}, {"depth": 1, "op": 18, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["25c"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 604, "result": []}, {"depth": 1, "op": 129, "result": ["24", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 53, "result": ["5"]}, {"depth": 1, "op": 129, "result": ["ffffffffffffffff", "5", "ffffffffffffffff"]}, {"depth": 1, "op": 129, "result": ["5", "ffffffffffffffff", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["26e"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 622, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 81, "result": ["80"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 130, "result": ["5", "1f", "80", "5"]}, {"depth": 1, "op": 1, "result": ["24"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 25, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "op": 144, "result": ["24", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "op": 129, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", "24", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "op": 22, "result": ["20"]}, {"depth": 1, "len": 2, "op": 96, "result": ["3f"]}, {"depth": 1, "op": 1, "result": ["5f"]}, {"depth": 1, "op": 22, "result": ["40"]}, {"depth": 1, "op": 129, "result": ["80", "40", "80"]}, {"depth": 1, "op": 1, "result": ["c0"]}, {"depth": 1, "op": 144, "result": ["80", "c0"]}, {"depth": 1, "op": 131, "result": ["ffffffffffffffff", "80", "c0", "5", "ffffffffffffffff"]}, {"depth": 1, "op": 130, "result": ["c0", "ffffffffffffffff", "80", "c0"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 129, "result": ["80", "0", "80"]}, {"depth": 1, "op": 131, "result": ["c0", "80", "0", "80", "c0"]}, {"depth": 1, "op": 16, "result": ["0"]}, {"depth": 1, "op": 23, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["296"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 662, "result": []}, {"depth": 1, "op": 129, "result": ["c0", "80", "c0"]}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 130, "result": ["5", "80", "c0", "5"]}, {"depth": 1, "op": 129, "result": ["80", "5", "80"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 135, "result": ["64", "80", "c0", "5", "ffffffffffffffff", "24", "0", "4", "64"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 132, "result": ["5", "20", "64", "80", "c0", "5"]}, {"depth": 1, "op": 135, "result": ["24", "5", "20", "64", "80", "c0", "5", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 1, "result": ["29"]}, {"depth": 1, "op": 1, "result": ["49"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2ae"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 686, "result": []}, {"depth": 1, "op": 130, "result": ["5", "80", "c0", "5"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 134, "result": ["24", "20", "5", "80", "c0", "5", "ffffffffffffffff", "24"]}, {"depth": 1, "op": 1, "result": ["44"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 131, "result": ["80", "20", "44", "5", "80"]}, {"depth": 1, "op": 1, "result": ["a0"]}, {"depth": 1, "op": 55, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 146, "result": ["5", "80", "c0", "0"]}, {"depth": 1, "op": 129, "result": ["80", "5", "80"]}, {"depth": 1, "op": 1, "result": ["85"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 1, "result": ["a5"]}, {"depth": 1, "op": 146, "result": ["0", "80", "c0", "a5"]}, {"depth": 1, "op": 144, "result": ["80", "0"]}, {"depth": 1, "op": 146, "result": ["a5", "0", "c0", "80"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 149, "result": ["85", "ffffffffffffffff", "24", "0", "4", "64", "80"]}, {"depth": 1, "op": 148, "result": ["64", "ffffffffffffffff", "24", "0", "4", "85"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 133, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["a9"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 169, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["b5"]}, {"depth": 1, "op": 130, "result": ["80", "b5", "1", "80"]}, {"depth": 1, "op": 130, "result": ["1", "80", "b5", "1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3af"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 943, "result": []}, {"depth": 1, "op": 129, "result": ["80", "1", "80"]}, {"depth": 1, "op": 81, "result": ["5"]}, {"depth": 1, "len": 9, "op": 103, "result": ["ffffffffffffffff"]}, {"depth": 1, "op": 129, "result": ["5", "ffffffffffffffff", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3c9"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 969, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["3dd"]}, {"depth": 1, "op": 129, "result": ["5", "3dd", "5"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3d7"]}, {"depth": 1, "op": 132, "result": ["1", "3d7", "5", "3dd", "5", "1"]}, {"depth": 1, "op": 84, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "len": 3, "op": 97, "result": ["329"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 809, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "op": 129, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a", "1", "48656c6c6f00000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "op": 129, "result": ["1", "48656c6c6f00000000000000000000000000000000000000000000000000000a", "1"]}, {"depth": 1, "op": 28, "result": []}, {"depth": 1, "op": 144, "result": ["1", "2432b63637800000000000000000000000000000000000000000000000000005"]}, {"depth": 1, "op": 130, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a", "1", "2432b63637800000000000000000000000000000000000000000000000000005", "48656c6c6f00000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "op": 22, "result": ["0"]}, {"depth": 1, "op": 128, "result": ["0", "0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["33d"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["7f"]}, {"depth": 1, "op": 130, "result": ["2432b63637800000000000000000000000000000000000000000000000000005", "7f", "0", "2432b63637800000000000000000000000000000000000000000000000000005"]}, {"depth": 1, "op": 22, "result": ["5"]}, {"depth": 1, "op": 145, "result": ["2432b63637800000000000000000000000000000000000000000000000000005", "0", "5"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 91, "pc": 829, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["5", "20", "0", "5"]}, {"depth": 1, "op": 16, "result": ["1"]}, {"depth": 1, "op": 129, "result": ["0", "1", "0"]}, {"depth": 1, "op": 3, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"]}, {"depth": 1, "len": 3, "op": 97, "result": ["35b"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 859, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 145, "result": ["3d7", "48656c6c6f00000000000000000000000000000000000000000000000000000a", "5"]}, {"depth": 1, "op": 144, "result": ["48656c6c6f00000000000000000000000000000000000000000000000000000a", "3d7"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 983, "result": []}, {"depth": 1, "op": 132, "result": ["1", "5", "5", "3dd", "5", "1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["361"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 865, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 130, "result": ["5", "1f", "1", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3aa"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 938, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 989, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 128, "result": ["20", "20"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 131, "result": ["5", "1f", "20", "20", "5"]}, {"depth": 1, "op": 17, "result": ["0"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "op": 129, "result": ["0", "1", "0"]}, {"depth": 1, "op": 20, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["410"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 132, "result": ["5", "0", "0", "20", "20", "5"]}, {"depth": 1, "op": 21, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["3f9"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 133, "result": ["80", "0", "20", "20", "5", "1", "80"]}, {"depth": 1, "op": 131, "result": ["20", "80", "0", "20", "20"]}, {"depth": 1, "op": 1, "result": ["a0"]}, {"depth": 1, "op": 81, "result": ["776f726c64000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "op": 91, "pc": 1017, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 25, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"]}, {"depth": 1, "len": 2, "op": 96, "result": ["3"]}, {"depth": 1, "op": 134, "result": ["5", "3", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "776f726c64000000000000000000000000000000000000000000000000000000", "0", "20", "20", "5"]}, {"depth": 1, "op": 144, "result": ["3", "5"]}, {"depth": 1, "op": 27, "result": []}, {"depth": 1, "op": 28, "result": []}, {"depth": 1, "op": 25, "result": ["ffffffffff000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "op": 22, "result": ["776f726c64000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "op": 133, "result": ["5", "1", "776f726c64000000000000000000000000000000000000000000000000000000", "0", "20", "20", "5"]}, {"depth": 1, "op": 144, "result": ["1", "5"]}, {"depth": 1, "op": 27, "result": []}, {"depth": 1, "op": 23, "result": ["776f726c6400000000000000000000000000000000000000000000000000000a"]}, {"depth": 1, "op": 133, "result": ["1", "776f726c6400000000000000000000000000000000000000000000000000000a", "0", "20", "20", "5", "1"]}, {"depth": 1, "op": 85, "result": []}, {"depth": 1, "len": 3, "op": 97, "result": ["3a6"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 934, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 91, "pc": 938, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 181, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "len": 33, "op": 127, "result": ["61ae4cbae83f72235cd9fa781d18fcb08ff5fa4a44fcc1630fde673bb0041151"]}, {"depth": 1, "op": 51, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 130, "result": ["80", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "61ae4cbae83f72235cd9fa781d18fcb08ff5fa4a44fcc1630fde673bb0041151", "80"]}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 81, "result": ["c0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["e7"]}, {"depth": 1, "op": 146, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "c0", "80", "e7"]}, {"depth": 1, "op": 145, "result": ["80", "c0", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 144, "result": ["c0", "80"]}, {"depth": 1, "len": 3, "op": 97, "result": ["46b"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 1131, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1"]}, {"depth": 1, "len": 2, "op": 96, "result": ["a0"]}, {"depth": 1, "op": 27, "result": []}, {"depth": 1, "op": 3, "result": ["ffffffffffffffffffffffffffffffffffffffff"]}, {"depth": 1, "op": 131, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "ffffffffffffffffffffffffffffffffffffffff", "c0", "80", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 22, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a"]}, {"depth": 1, "op": 129, "result": ["c0", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "c0"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["c0", "20", "40", "c0"]}, {"depth": 1, "op": 1, "result": ["e0"]}, {"depth": 1, "op": 129, "result": ["40", "e0", "40"]}, {"depth": 1, "op": 144, "result": ["e0", "40"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 144, "result": ["40", "0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["48e"]}, {"depth": 1, "op": 144, "result": ["40", "48e"]}, {"depth": 1, "op": 131, "result": ["c0", "40", "48e", "0", "c0"]}, {"depth": 1, "op": 1, "result": ["100"]}, {"depth": 1, "op": 132, "result": ["80", "100", "48e", "0", "c0", "80"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2cd"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 717, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 129, "result": ["80", "0", "80"]}, {"depth": 1, "op": 81, "result": ["5"]}, {"depth": 1, "op": 128, "result": ["5", "5"]}, {"depth": 1, "op": 132, "result": ["100", "5", "5", "0", "80", "100"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "op": 91, "pc": 725, "result": []}, {"depth": 1, "op": 129, "result": ["5", "0", "5"]}, {"depth": 1, "op": 129, "result": ["0", "5", "0"]}, {"depth": 1, "op": 16, "result": ["1"]}, {"depth": 1, "op": 21, "result": ["0"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2f1"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 129, "result": ["0", "20", "0"]}, {"depth": 1, "op": 133, "result": ["80", "0", "20", "0", "5", "0", "80"]}, {"depth": 1, "op": 1, "result": ["80"]}, {"depth": 1, "op": 129, "result": ["20", "80", "20"]}, {"depth": 1, "op": 1, "result": ["a0"]}, {"depth": 1, "op": 81, "result": ["776f726c64000000000000000000000000000000000000000000000000000000"]}, {"depth": 1, "op": 134, "result": ["100", "776f726c64000000000000000000000000000000000000000000000000000000", "20", "0", "5", "0", "80", "100"]}, {"depth": 1, "op": 131, "result": ["0", "100", "776f726c64000000000000000000000000000000000000000000000000000000", "20", "0"]}, {"depth": 1, "op": 1, "result": ["100"]}, {"depth": 1, "op": 130, "result": ["20", "100", "776f726c64000000000000000000000000000000000000000000000000000000", "20"]}, {"depth": 1, "op": 1, "result": ["120"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "op": 1, "result": ["20"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2d5"]}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 725, "result": []}, {"depth": 1, "op": 129, "result": ["5", "20", "5"]}, {"depth": 1, "op": 129, "result": ["20", "5", "20"]}, {"depth": 1, "op": 16, "result": ["0"]}, {"depth": 1, "op": 21, "result": ["1"]}, {"depth": 1, "len": 3, "op": 97, "result": ["2f1"]}, {"depth": 1, "op": 87, "result": []}, {"depth": 1, "op": 91, "pc": 753, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "len": 1, "op": 95, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "op": 130, "result": ["5", "20", "0", "5"]}, {"depth": 1, "op": 134, "result": ["100", "5", "20", "0", "5", "0", "80", "100"]}, {"depth": 1, "op": 1, "result": ["105"]}, {"depth": 1, "op": 1, "result": ["125"]}, {"depth": 1, "op": 82, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["20"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 25, "result": ["ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"]}, {"depth": 1, "len": 2, "op": 96, "result": ["1f"]}, {"depth": 1, "op": 131, "result": ["5", "1f", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", "20", "5"]}, {"depth": 1, "op": 1, "result": ["24"]}, {"depth": 1, "op": 22, "result": ["20"]}, {"depth": 1, "op": 133, "result": ["100", "20", "20", "5", "0", "80", "100"]}, {"depth": 1, "op": 1, "result": ["120"]}, {"depth": 1, "op": 1, "result": ["140"]}, {"depth": 1, "op": 145, "result": ["0", "5", "140"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 146, "result": ["48e", "80", "100", "140"]}, {"depth": 1, "op": 145, "result": ["100", "80", "48e"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 1166, "result": []}, {"depth": 1, "op": 148, "result": ["e7", "0", "c0", "80", "b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "140"]}, {"depth": 1, "op": 147, "result": ["b6a2f15a37aac3b6fdd39afa356b64f51ca8314a", "0", "c0", "80", "e7"]}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 231, "result": []}, {"depth": 1, "len": 2, "op": 96, "result": ["40"]}, {"depth": 1, "op": 81, "result": ["c0"]}, {"depth": 1, "op": 128, "result": ["c0", "c0"]}, {"depth": 1, "op": 145, "result": ["140", "c0", "c0"]}, {"depth": 1, "op": 3, "result": ["80"]}, {"depth": 1, "op": 144, "result": ["c0", "80"]}, {"depth": 1, "op": 161, "result": []}, {"depth": 1, "op": 80, "result": []}, {"depth": 1, "op": 86, "result": []}, {"depth": 1, "op": 91, "pc": 138, "result": []}, {"depth": 1, "op": 0, "result": []}]', '401', '{"--PUSH1": 1, "-PUSH1-MSTORE": 1, "ADD-ADD-GT": 1, "ADD-ADD-MSTORE": 1, "ADD-ADD-SWAP2": 1, "ADD-AND-DUP2": 1, "ADD-AND-DUP6": 1, "ADD-CALLDATACOPY-PUSH0": 1, "ADD-DUP2-ADD": 1, "ADD-DUP2-SWAP1": 1, "ADD-DUP3-ADD": 1, "ADD-DUP5-PUSH2": 1, "ADD-GT-ISZERO": 1, "ADD-MLOAD-DUP7": 1, "ADD-MLOAD-JUMPDEST": 1, "ADD-MSTORE-ADD": 1, "ADD-MSTORE-PUSH1": 1, "ADD-PUSH1-ADD": 1, "ADD-PUSH1-DUP4": 1, "ADD-PUSH1-NOT": 1, "ADD-PUSH2-JUMP": 1, "ADD-SLT-PUSH2": 1, "ADD-SWAP1-DUP4": 1, "ADD-SWAP2-POP": 2, "ADD-SWAP3-SWAP1": 1, "AND-DUP1-PUSH2": 1, "AND-DUP2-ADD": 1, "AND-DUP2-MSTORE": 1, "AND-DUP6-ADD": 1, "AND-PUSH1-ADD": 1, "AND-PUSH1-DUP6": 1, "AND-SWAP2-POP": 1, "CALLDATACOPY-PUSH0-SWAP3": 1, "CALLDATALOAD-DUP2-DUP2": 1, "CALLDATALOAD-PUSH1-SHR": 1, "CALLDATALOAD-PUSH8-DUP1": 1, "CALLDATASIZE-LT-PUSH2": 1, "CALLDATASIZE-PUSH1-PUSH2": 1, "CALLER-DUP3-PUSH1": 1, "CALLVALUE-DUP1-ISZERO": 1, "DUP1-DUP3-GT": 1, "DUP1-DUP5-MSTORE": 1, "DUP1-ISZERO-PUSH2": 1, "DUP1-PUSH1-DUP4": 1, "DUP1-PUSH2-JUMPI": 1, "DUP1-PUSH4-EQ": 3, "DUP1-SWAP2-SUB": 1, "DUP2-ADD-MLOAD": 1, "DUP2-ADD-PUSH1": 1, "DUP2-ADD-SWAP1": 1, "DUP2-AND-PUSH1": 1, "DUP2-CALLDATALOAD-DUP2": 1, "DUP2-CALLDATALOAD-PUSH8": 1, "DUP2-DUP2-GT": 1, "DUP2-DUP2-LT": 2, "DUP2-DUP2-SHR": 1, "DUP2-DUP4-LT": 1, "DUP2-DUP5-ADD": 1, "DUP2-DUP6-ADD": 1, "DUP2-EQ-PUSH2": 1, "DUP2-GT-ISZERO": 2, "DUP2-LT-ISZERO": 2, "DUP2-MLOAD-DUP1": 1, "DUP2-MLOAD-PUSH8": 1, "DUP2-MSTORE-DUP8": 1, "DUP2-MSTORE-PUSH1": 1, "DUP2-PUSH1-MSTORE": 1, "DUP2-PUSH2-DUP5": 1, "DUP2-SHR-SWAP1": 1, "DUP2-SUB-PUSH2": 1, "DUP2-SWAP1-MSTORE": 1, "DUP3-ADD-DUP2": 1, "DUP3-ADD-MSTORE": 1, "DUP3-ADD-PUSH1": 1, "DUP3-AND-DUP1": 1, "DUP3-AND-SWAP2": 1, "DUP3-DUP2-MSTORE": 1, "DUP3-DUP3-PUSH2": 1, "DUP3-DUP5-SUB": 1, "DUP3-DUP7-ADD": 1, "DUP3-GT-DUP2": 1, "DUP3-GT-ISZERO": 2, "DUP3-LT-DUP2": 1, "DUP3-PUSH1-DUP7": 1, "DUP3-PUSH1-MLOAD": 1, "DUP3-PUSH2-JUMP": 1, "DUP4-ADD-AND": 1, "DUP4-ADD-CALLDATACOPY": 1, "DUP4-ADD-DUP3": 1, "DUP4-ADD-DUP5": 1, "DUP4-ADD-MLOAD": 1, "DUP4-ADD-SLT": 1, "DUP4-AND-DUP2": 1, "DUP4-DUP3-GT": 1, "DUP4-GT-PUSH1": 1, "DUP4-LT-OR": 1, "DUP5-ADD-SWAP2": 1, "DUP5-DUP8-ADD": 1, "DUP5-ISZERO-PUSH2": 1, "DUP5-MSTORE-PUSH0": 1, "DUP5-PUSH1-DUP4": 1, "DUP5-PUSH2-JUMP": 2, "DUP5-SLOAD-PUSH2": 1, "DUP5-SUB-SLT": 1, "DUP6-ADD-ADD": 1, "DUP6-ADD-DUP2": 1, "DUP6-DUP4-ADD": 1, "DUP6-SSTORE-PUSH2": 1, "DUP6-SWAP1-SHL": 1, "DUP7-ADD-ADD": 1, "DUP7-ADD-PUSH1": 1, "DUP7-DUP4-ADD": 1, "DUP7-SWAP1-SHL": 1, "DUP8-ADD-ADD": 1, "DUP8-PUSH1-DUP5": 1, "EQ-PUSH2-JUMPI": 4, "GT-DUP2-DUP4": 1, "GT-ISZERO-PUSH2": 5, "GT-PUSH1-DUP2": 1, "ISZERO-PUSH2-JUMPI": 11, "JUMP-JUMPDEST-DUP2": 2, "JUMP-JUMPDEST-DUP5": 1, "JUMP-JUMPDEST-POP": 2, "JUMP-JUMPDEST-PUSH0": 2, "JUMP-JUMPDEST-PUSH1": 6, "JUMP-JUMPDEST-PUSH2": 1, "JUMP-JUMPDEST-STOP": 1, "JUMP-JUMPDEST-SWAP5": 1, "JUMPDEST-DUP2-CALLDATALOAD": 2, "JUMPDEST-DUP2-DUP2": 2, "JUMPDEST-DUP2-DUP5": 1, "JUMPDEST-DUP2-MLOAD": 1, "JUMPDEST-DUP2-PUSH1": 1, "JUMPDEST-DUP3-PUSH1": 1, "JUMPDEST-DUP5-PUSH2": 1, "JUMPDEST-POP-POP": 3, "JUMPDEST-POP-PUSH0": 1, "JUMPDEST-POP-PUSH1": 1, "JUMPDEST-POP-PUSH32": 1, "JUMPDEST-POP-SWAP2": 1, "JUMPDEST-PUSH0-DUP2": 1, "JUMPDEST-PUSH0-NOT": 1, "JUMPDEST-PUSH0-PUSH1": 1, "JUMPDEST-PUSH1-DUP1": 1, "JUMPDEST-PUSH1-DUP2": 1, "JUMPDEST-PUSH1-DUP3": 2, "JUMPDEST-PUSH1-MLOAD": 2, "JUMPDEST-PUSH1-PUSH1": 1, "JUMPDEST-PUSH1-PUSH2": 1, "JUMPDEST-PUSH2-DUP2": 1, "JUMPDEST-PUSH2-JUMP": 1, "JUMPDEST-PUSH2-PUSH2": 1, "JUMPDEST-SWAP5-SWAP4": 1, "JUMPI-DUP1-PUSH4": 2, "JUMPI-JUMPDEST-DUP2": 4, "JUMPI-JUMPDEST-DUP3": 1, "JUMPI-JUMPDEST-POP": 4, "JUMPI-JUMPDEST-PUSH1": 1, "JUMPI-JUMPDEST-PUSH2": 2, "JUMPI-POP-DUP6": 1, "JUMPI-PUSH0-CALLDATALOAD": 1, "JUMPI-PUSH0-DUP5": 1, "JUMPI-PUSH1-DUP2": 1, "JUMPI-PUSH1-DUP3": 1, "LOG1-POP-JUMP": 1, "LT-DUP2-SUB": 1, "LT-ISZERO-PUSH2": 2, "LT-OR-ISZERO": 1, "LT-PUSH2-JUMPI": 1, "MLOAD-DUP1-DUP5": 1, "MLOAD-DUP1-SWAP2": 1, "MLOAD-DUP7-DUP4": 1, "MLOAD-JUMPDEST-PUSH0": 1, "MLOAD-PUSH1-DUP3": 1, "MLOAD-PUSH2-SWAP3": 1, "MLOAD-PUSH8-DUP2": 1, "MSTORE-ADD-PUSH2": 1, "MSTORE-CALLVALUE-DUP1": 1, "MSTORE-DUP3-DUP2": 1, "MSTORE-DUP8-PUSH1": 1, "MSTORE-POP-SWAP6": 1, "MSTORE-PUSH0-JUMPDEST": 1, "MSTORE-PUSH0-SWAP1": 1, "MSTORE-PUSH1-PUSH1": 2, "NOT-AND-PUSH1": 1, "NOT-PUSH1-DUP4": 1, "NOT-PUSH1-DUP7": 1, "NOT-SWAP1-DUP2": 1, "OR-DUP6-SSTORE": 1, "OR-ISZERO-PUSH2": 1, "POP-DUP5-PUSH1": 1, "POP-DUP6-DUP4": 1, "POP-JUMP-JUMPDEST": 7, "POP-JUMPDEST-POP": 1, "POP-JUMPDEST-PUSH1": 1, "POP-POP-JUMP": 5, "POP-POP-JUMPDEST": 1, "POP-POP-POP": 8, "POP-POP-SWAP3": 1, "POP-PUSH0-PUSH1": 1, "POP-PUSH1-CALLDATASIZE": 1, "POP-PUSH32-CALLER": 1, "POP-SWAP2-SWAP1": 1, "POP-SWAP3-SWAP2": 1, "POP-SWAP6-SWAP5": 1, "PUSH0-CALLDATALOAD-PUSH1": 1, "PUSH0-DUP2-MLOAD": 1, "PUSH0-DUP5-ISZERO": 1, "PUSH0-JUMPDEST-DUP2": 1, "PUSH0-NOT-PUSH1": 1, "PUSH0-PUSH1-DUP3": 2, "PUSH0-SWAP1-PUSH2": 1, "PUSH0-SWAP3-DUP2": 1, "PUSH1-ADD-AND": 1, "PUSH1-ADD-SWAP3": 1, "PUSH1-CALLDATASIZE-LT": 1, "PUSH1-DUP1-PUSH1": 1, "PUSH1-DUP2-DUP2": 1, "PUSH1-DUP2-DUP6": 1, "PUSH1-DUP2-EQ": 1, "PUSH1-DUP3-ADD": 2, "PUSH1-DUP3-AND": 1, "PUSH1-DUP3-DUP5": 1, "PUSH1-DUP3-DUP7": 1, "PUSH1-DUP3-GT": 1, "PUSH1-DUP3-LT": 1, "PUSH1-DUP4-ADD": 3, "PUSH1-DUP4-GT": 1, "PUSH1-DUP5-DUP8": 1, "PUSH1-DUP6-SWAP1": 1, "PUSH1-DUP7-ADD": 1, "PUSH1-DUP7-SWAP1": 1, "PUSH1-MLOAD-DUP1": 1, "PUSH1-MLOAD-PUSH1": 1, "PUSH1-MLOAD-PUSH2": 1, "PUSH1-MSTORE-CALLVALUE": 1, "PUSH1-MSTORE-DUP3": 1, "PUSH1-NOT-PUSH1": 1, "PUSH1-NOT-SWAP1": 1, "PUSH1-PUSH1-DUP3": 1, "PUSH1-PUSH1-NOT": 1, "PUSH1-PUSH1-PUSH1": 1, "PUSH1-PUSH1-SHL": 1, "PUSH1-PUSH2-DUP3": 1, "PUSH1-PUSH2-JUMP": 1, "PUSH1-SHL-SUB": 1, "PUSH1-SHR-DUP1": 1, "PUSH2-CALLDATASIZE-PUSH1": 1, "PUSH2-DUP2-PUSH2": 1, "PUSH2-DUP3-DUP3": 1, "PUSH2-DUP5-SLOAD": 1, "PUSH2-JUMP-JUMPDEST": 9, "PUSH2-JUMPI-DUP1": 2, "PUSH2-JUMPI-JUMPDEST": 12, "PUSH2-JUMPI-POP": 1, "PUSH2-JUMPI-PUSH0": 2, "PUSH2-JUMPI-PUSH1": 2, "PUSH2-PUSH2-CALLDATASIZE": 1, "PUSH2-SWAP1-DUP4": 1, "PUSH2-SWAP3-SWAP2": 1, "PUSH32-CALLER-DUP3": 1, "PUSH4-EQ-PUSH2": 3, "PUSH8-DUP1-DUP3": 1, "PUSH8-DUP2-GT": 1, "SHL-OR-DUP6": 1, "SHL-SHR-NOT": 1, "SHL-SUB-DUP4": 1, "SHR-DUP1-PUSH4": 1, "SHR-NOT-AND": 1, "SHR-SWAP1-DUP3": 1, "SLOAD-PUSH2-JUMP": 1, "SLT-ISZERO-PUSH2": 1, "SLT-PUSH2-JUMPI": 1, "SSTORE-PUSH2-JUMP": 1, "SUB-DUP4-AND": 1, "SUB-PUSH2-JUMPI": 1, "SUB-SLT-ISZERO": 1, "SUB-SWAP1-LOG1": 1, "SWAP1-DUP2-AND": 1, "SWAP1-DUP3-AND": 1, "SWAP1-DUP4-ADD": 1, "SWAP1-DUP4-DUP3": 1, "SWAP1-LOG1-POP": 1, "SWAP1-MSTORE-PUSH0": 1, "SWAP1-POP-JUMP": 1, "SWAP1-PUSH2-JUMP": 1, "SWAP1-PUSH2-SWAP1": 1, "SWAP1-SHL-OR": 1, "SWAP1-SHL-SHR": 1, "SWAP1-SWAP3-MSTORE": 1, "SWAP2-POP-DUP5": 1, "SWAP2-POP-JUMPDEST": 1, "SWAP2-POP-POP": 2, "SWAP2-SUB-SWAP1": 1, "SWAP2-SWAP1-POP": 1, "SWAP2-SWAP1-PUSH2": 1, "SWAP3-DUP2-ADD": 1, "SWAP3-MSTORE-POP": 1, "SWAP3-SWAP1-SWAP3": 1, "SWAP3-SWAP2-POP": 1, "SWAP3-SWAP2-SWAP1": 1, "SWAP4-POP-POP": 1, "SWAP5-POP-POP": 1, "SWAP5-SWAP4-POP": 1, "SWAP6-SWAP5-POP": 1}', '{"ADD": 24, "AND": 7, "CALLDATACOPY": 1, "CALLDATALOAD": 3, "CALLDATASIZE": 2, "CALLER": 1, "CALLVALUE": 1, "DUP1": 9, "DUP2": 27, "DUP3": 16, "DUP4": 10, "DUP5": 9, "DUP6": 5, "DUP7": 4, "DUP8": 2, "EQ": 4, "GT": 7, "ISZERO": 11, "JUMP": 16, "JUMPDEST": 32, "JUMPI": 19, "LOG1": 1, "LT": 5, "MLOAD": 7, "MSTORE": 9, "NOT": 4, "OR": 2, "POP": 32, "PUSH0": 9, "PUSH1": 38, "PUSH2": 35, "PUSH32": 1, "PUSH4": 3, "PUSH8": 2, "SHL": 3, "SHR": 3, "SLOAD": 1, "SLT": 2, "SSTORE": 1, "STOP": 1, "SUB": 4, "SWAP1": 12, "SWAP2": 7, "SWAP3": 5, "SWAP4": 1, "SWAP5": 2, "SWAP6": 1}', '["0", "32", "192", "100", "18446744073709551615", "36", "0", "4", "16372862481753577294267620541204082621793577260386896888229232294795359027205", "0", "32745724963507154588535241082408165243587154520773793776458464589590718054410", "1", "5", "5", "0", "0", "32", "32", "5", "1", "128", "1", "32", "0", "5", "256", "128", "1042670065772417531265339626254010608318119686474", "0", "192", "128", "128"]', '["0:PUSH1", "2:PUSH1", "4:MSTORE", "5:CALLVALUE", "6:DUP1", "7:ISZERO", "8:PUSH2", "11:JUMPI", "15:JUMPDEST", "16:POP", "17:PUSH1", "19:CALLDATASIZE", "20:LT", "21:PUSH2", "24:JUMPI", "25:PUSH0", "26:CALLDATALOAD", "27:PUSH1", "29:SHR", "30:DUP1", "31:PUSH4", "36:EQ", "37:PUSH2", "40:JUMPI", "41:DUP1", "42:PUSH4", "47:EQ", "48:PUSH2", "51:JUMPI", "52:DUP1", "53:PUSH4", "58:EQ", "59:PUSH2", "62:JUMPI", "119:JUMPDEST", "120:PUSH2", "123:PUSH2", "126:CALLDATASIZE", "127:PUSH1", "129:PUSH2", "132:JUMP", "546:JUMPDEST", "547:PUSH0", "548:PUSH1", "550:DUP3", "551:DUP5", "552:SUB", "553:SLT", "554:ISZERO", "555:PUSH2", "558:JUMPI", "562:JUMPDEST", "563:DUP2", "564:CALLDATALOAD", "565:PUSH8", "574:DUP1", "575:DUP3", "576:GT", "577:ISZERO", "578:PUSH2", "581:JUMPI", "585:JUMPDEST", "586:DUP2", "587:DUP5", "588:ADD", "589:SWAP2", "590:POP", "591:DUP5", "592:PUSH1", "594:DUP4", "595:ADD", "596:SLT", "597:PUSH2", "600:JUMPI", "604:JUMPDEST", "605:DUP2", "606:CALLDATALOAD", "607:DUP2", "608:DUP2", "609:GT", "610:ISZERO", "611:PUSH2", "614:JUMPI", "622:JUMPDEST", "623:PUSH1", "625:MLOAD", "626:PUSH1", "628:DUP3", "629:ADD", "630:PUSH1", "632:NOT", "633:SWAP1", "634:DUP2", "635:AND", "636:PUSH1", "638:ADD", "639:AND", "640:DUP2", "641:ADD", "642:SWAP1", "643:DUP4", "644:DUP3", "645:GT", "646:DUP2", "647:DUP4", "648:LT", "649:OR", "650:ISZERO", "651:PUSH2", "654:JUMPI", "662:JUMPDEST", "663:DUP2", "664:PUSH1", "666:MSTORE", "667:DUP3", "668:DUP2", "669:MSTORE", "670:DUP8", "671:PUSH1", "673:DUP5", "674:DUP8", "675:ADD", "676:ADD", "677:GT", "678:ISZERO", "679:PUSH2", "682:JUMPI", "686:JUMPDEST", "687:DUP3", "688:PUSH1", "690:DUP7", "691:ADD", "692:PUSH1", "694:DUP4", "695:ADD", "696:CALLDATACOPY", "697:PUSH0", "698:SWAP3", "699:DUP2", "700:ADD", "701:PUSH1", "703:ADD", "704:SWAP3", "705:SWAP1", "706:SWAP3", "707:MSTORE", "708:POP", "709:SWAP6", "710:SWAP5", "711:POP", "712:POP", "713:POP", "714:POP", "715:POP", "716:JUMP", "133:JUMPDEST", "134:PUSH2", "137:JUMP", "169:JUMPDEST", "170:PUSH1", "172:PUSH2", "175:DUP3", "176:DUP3", "177:PUSH2", "180:JUMP", "943:JUMPDEST", "944:DUP2", "945:MLOAD", "946:PUSH8", "955:DUP2", "956:GT", "957:ISZERO", "958:PUSH2", "961:JUMPI", "969:JUMPDEST", "970:PUSH2", "973:DUP2", "974:PUSH2", "977:DUP5", "978:SLOAD", "979:PUSH2", "982:JUMP", "809:JUMPDEST", "810:PUSH1", "812:DUP2", "813:DUP2", "814:SHR", "815:SWAP1", "816:DUP3", "817:AND", "818:DUP1", "819:PUSH2", "822:JUMPI", "823:PUSH1", "825:DUP3", "826:AND", "827:SWAP2", "828:POP", "829:JUMPDEST", "830:PUSH1", "832:DUP3", "833:LT", "834:DUP2", "835:SUB", "836:PUSH2", "839:JUMPI", "859:JUMPDEST", "860:POP", "861:SWAP2", "862:SWAP1", "863:POP", "864:JUMP", "983:JUMPDEST", "984:DUP5", "985:PUSH2", "988:JUMP", "865:JUMPDEST", "866:PUSH1", "868:DUP3", "869:GT", "870:ISZERO", "871:PUSH2", "874:JUMPI", "938:JUMPDEST", "939:POP", "940:POP", "941:POP", "942:JUMP", "989:JUMPDEST", "990:PUSH1", "992:DUP1", "993:PUSH1", "995:DUP4", "996:GT", "997:PUSH1", "999:DUP2", "1000:EQ", "1001:PUSH2", "1004:JUMPI", "1005:PUSH0", "1006:DUP5", "1007:ISZERO", "1008:PUSH2", "1011:JUMPI", "1012:POP", "1013:DUP6", "1014:DUP4", "1015:ADD", "1016:MLOAD", "1017:JUMPDEST", "1018:PUSH0", "1019:NOT", "1020:PUSH1", "1022:DUP7", "1023:SWAP1", "1024:SHL", "1025:SHR", "1026:NOT", "1027:AND", "1028:PUSH1", "1030:DUP6", "1031:SWAP1", "1032:SHL", "1033:OR", "1034:DUP6", "1035:SSTORE", "1036:PUSH2", "1039:JUMP", "934:JUMPDEST", "935:POP", "936:POP", "937:POP", "938:JUMPDEST", "939:POP", "940:POP", "941:POP", "942:JUMP", "181:JUMPDEST", "182:POP", "183:PUSH32", "216:CALLER", "217:DUP3", "218:PUSH1", "220:MLOAD", "221:PUSH2", "224:SWAP3", "225:SWAP2", "226:SWAP1", "227:PUSH2", "230:JUMP", "1131:JUMPDEST", "1132:PUSH1", "1134:PUSH1", "1136:PUSH1", "1138:SHL", "1139:SUB", "1140:DUP4", "1141:AND", "1142:DUP2", "1143:MSTORE", "1144:PUSH1", "1146:PUSH1", "1148:DUP3", "1149:ADD", "1150:DUP2", "1151:SWAP1", "1152:MSTORE", "1153:PUSH0", "1154:SWAP1", "1155:PUSH2", "1158:SWAP1", "1159:DUP4", "1160:ADD", "1161:DUP5", "1162:PUSH2", "1165:JUMP", "717:JUMPDEST", "718:PUSH0", "719:DUP2", "720:MLOAD", "721:DUP1", "722:DUP5", "723:MSTORE", "724:PUSH0", "725:JUMPDEST", "726:DUP2", "727:DUP2", "728:LT", "729:ISZERO", "730:PUSH2", "733:JUMPI", "734:PUSH1", "736:DUP2", "737:DUP6", "738:ADD", "739:DUP2", "740:ADD", "741:MLOAD", "742:DUP7", "743:DUP4", "744:ADD", "745:DUP3", "746:ADD", "747:MSTORE", "748:ADD", "749:PUSH2", "752:JUMP", "725:JUMPDEST", "726:DUP2", "727:DUP2", "728:LT", "729:ISZERO", "730:PUSH2", "733:JUMPI", "753:JUMPDEST", "754:POP", "755:PUSH0", "756:PUSH1", "758:DUP3", "759:DUP7", "760:ADD", "761:ADD", "762:MSTORE", "763:PUSH1", "765:PUSH1", "767:NOT", "768:PUSH1", "770:DUP4", "771:ADD", "772:AND", "773:DUP6", "774:ADD", "775:ADD", "776:SWAP2", "777:POP", "778:POP", "779:SWAP3", "780:SWAP2", "781:POP", "782:POP", "783:JUMP", "1166:JUMPDEST", "1167:SWAP5", "1168:SWAP4", "1169:POP", "1170:POP", "1171:POP", "1172:POP", "1173:JUMP", "231:JUMPDEST", "232:PUSH1", "234:MLOAD", "235:DUP1", "236:SWAP2", "237:SUB", "238:SWAP1", "239:LOG1", "240:POP", "241:JUMP", "138:JUMPDEST", "139:STOP"]'] # noqa: E501 diff --git a/tests/integration_tests/hardhat/contracts/BytecodeDeployer.sol b/tests/integration_tests/hardhat/contracts/BytecodeDeployer.sol new file mode 100644 index 0000000000..77d74405d4 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/BytecodeDeployer.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title BytecodeDeployer + * @dev A factory contract that can deploy arbitrary bytecode to create contracts + * Used for EIP-7702 SetCode transaction testing where specific contracts need to be deployed + * at predetermined addresses (like 0xaaaa and 0xbbbb) + */ +contract BytecodeDeployer { + event ContractDeployed(address indexed deployedAddress, address indexed deployer); + + /** + * @dev Deploy bytecode using CREATE opcode + * @param bytecode The contract bytecode to deploy + * @return deployedAddress The address of the deployed contract + */ + function deployBytecode(bytes memory bytecode) public returns (address deployedAddress) { + assembly { + deployedAddress := create(0, add(bytecode, 0x20), mload(bytecode)) + } + require(deployedAddress != address(0), "Deployment failed"); + emit ContractDeployed(deployedAddress, msg.sender); + } + + /** + * @dev Deploy bytecode using CREATE2 opcode with a salt + * @param bytecode The contract bytecode to deploy + * @param salt The salt value for CREATE2 + * @return deployedAddress The address of the deployed contract + */ + function deployBytecodeWithSalt(bytes memory bytecode, bytes32 salt) public returns (address deployedAddress) { + assembly { + deployedAddress := create2(0, add(bytecode, 0x20), mload(bytecode), salt) + } + require(deployedAddress != address(0), "Deployment failed"); + emit ContractDeployed(deployedAddress, msg.sender); + } + + /** + * @dev Predict the address for CREATE2 deployment + * @param bytecode The contract bytecode to deploy + * @param salt The salt value for CREATE2 + * @return predictedAddress The predicted address of the contract + */ + function predictCreate2Address(bytes memory bytecode, bytes32 salt) public view returns (address predictedAddress) { + bytes32 hash = keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + salt, + keccak256(bytecode) + ) + ); + predictedAddress = address(uint160(uint256(hash))); + } + + /** + * @dev Deploy bytecode and call a function on the deployed contract + * @param bytecode The contract bytecode to deploy + * @param callData The function call data to execute on the deployed contract + * @return deployedAddress The address of the deployed contract + * @return result The result of the function call + */ + function deployAndCall(bytes memory bytecode, bytes memory callData) public returns (address deployedAddress, bytes memory result) { + deployedAddress = deployBytecode(bytecode); + + if (callData.length > 0) { + (bool success, bytes memory returnData) = deployedAddress.call(callData); + require(success, "Call to deployed contract failed"); + result = returnData; + } + } +} \ No newline at end of file diff --git a/tests/integration_tests/hardhat/contracts/DelegationTarget.sol b/tests/integration_tests/hardhat/contracts/DelegationTarget.sol new file mode 100644 index 0000000000..b236d1cb28 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/DelegationTarget.sol @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/** + * @title DelegationTarget + * @notice Minimal contract for EIP-7702 delegation that allows deploying other contracts + * @dev This contract can be set as a delegation target for an EOA via EIP-7702 + */ +contract DelegationTarget { + // Storage slot where the counter (last offset) is stored + uint256 constant COUNTER_SLOT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + event ContractDeployed(address indexed deployed, bytes32 salt); + event ContractDestroyed(address indexed destroyed, uint256 index, bool success); + event CodeHash(address indexed deployed, bytes32 codeHash); + + /** + * @notice Deploy a contract using CREATE + * @param bytecode The bytecode of the contract to deploy + * @return deployed The address of the deployed contract + * @dev Stores deployed addresses at slots 0, 1, 2, ... and counter at COUNTER_SLOT + */ + function deploy(bytes memory bytecode) external returns (address deployed) { + assembly { + deployed := create(0, add(bytecode, 0x20), mload(bytecode)) + // Load current counter from COUNTER_SLOT + let currentSlot := sload(COUNTER_SLOT) + // Store deployed address at slot currentSlot (0, 1, 2, ...) + sstore(currentSlot, deployed) + // Increment counter and store back + sstore(COUNTER_SLOT, add(currentSlot, 1)) + } + require(deployed != address(0), "Deployment failed"); + emit ContractDeployed(deployed, bytes32(0)); + } + + /** + * @notice Get the deployed address at a given index + * @param index The index (slot) to read from + * @return addr The deployed address + */ + function getDeployedAt(uint256 index) external view returns (address addr) { + assembly { + addr := sload(index) + } + } + + /** + * @notice Get the current counter (number of deployments) + * @return count The number of deployed contracts + */ + function getDeploymentCount() external view returns (uint256 count) { + assembly { + count := sload(COUNTER_SLOT) + } + } + + /** + * @notice Selfdestruct all deployed contracts + * @dev Calls destroy() on each deployed contract. Contracts must implement destroy() with selfdestruct + */ + function selfdestructAll() external { + uint256 count; + assembly { + count := sload(COUNTER_SLOT) + } + + for (uint256 i = 0; i < count; i++) { + address target; + assembly { + target := sload(i) + } + // Call destroy() selector: 0x83197ef0 + (bool success,) = target.call(abi.encodeWithSelector(MinimalContract.selfDestruct.selector)); + emit ContractDestroyed(target, i, success); + } + } + + function emitAllCodeHashes() external { + uint256 count; + assembly { + count := sload(COUNTER_SLOT) + } + + for (uint256 i = 0; i < count; i++) { + address target; + assembly { + target := sload(i) + } + bytes32 codeHash; + assembly { + codeHash := extcodehash(target) + } + emit CodeHash(target, codeHash); + } + } + + /** + * @notice Execute arbitrary call (useful for delegated EOA) + * @param target The target address + * @param data The calldata + * @return success Whether the call succeeded + * @return result The return data + */ + function execute(address target, bytes calldata data) external payable returns (bool success, bytes memory result) { + (success, result) = target.call{value: msg.value}(data); + } + + receive() external payable {} +} + + + + +/** + * @title MinimalContract + * @notice A minimal contract that gets deployed by MaliciousDeployer + */ +contract MinimalContract { + address public immutable creator; + uint256 public value; + + constructor() { + creator = msg.sender; + } + + function setValue(uint256 _value) external { + value = _value; + } + + function selfDestruct() external { + selfdestruct(payable(creator)); + } +} + +/** + * @title FinalContract + * @notice The final contract that gets deployed by MaliciousDeployer + */ +contract FinalContract { + address public immutable creator; + uint256 public value; + + constructor() { + creator = msg.sender; + } + + function singletonFunction() external pure returns (string memory) { + return "I am the final contract!"; + } +} \ No newline at end of file diff --git a/tests/integration_tests/hardhat/contracts/FeeCollector.sol b/tests/integration_tests/hardhat/contracts/FeeCollector.sol new file mode 100644 index 0000000000..71027eed74 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/FeeCollector.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract FeeCollector { + event TokensMinted(address indexed to, uint256 amount); + + function mint(uint256 amount) public payable { + emit TokensMinted(msg.sender, amount); + } +} diff --git a/tests/integration_tests/hardhat/contracts/GasConsumerTryCatch.sol b/tests/integration_tests/hardhat/contracts/GasConsumerTryCatch.sol new file mode 100644 index 0000000000..8aad97a283 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/GasConsumerTryCatch.sol @@ -0,0 +1,68 @@ +pragma solidity ^0.8.10; + +/** + * @title GasConsumerTryCatch + * @notice A contract to test try-catch behavior with high gas consumption using a single contract + */ +contract GasConsumerTryCatch { + mapping(uint256 => uint256) public data; + uint256 public totalWrites; + uint256 public lastResult; + uint256 public callCount; + + event TrySuccess(uint256 result, uint256 gasUsed); + event TryCatchFailed(string reason, uint256 gasUsed); + event TryCatchFailedBytes(bytes reason, uint256 gasUsed); + + error GasConsumerReverted(uint256 iterationsCompleted); + + /** + * @notice Consumes gas by writing to storage. + * Must be external to be called via this.consumeGas() in try-catch. + * @param iterations Number of storage writes (~20,000 gas each) + * @param shouldRevert If true, reverts after consuming gas + * @return The total number of writes performed + */ + function consumeGas(uint256 iterations, bool shouldRevert) external returns (uint256) { + uint256 startValue = totalWrites; + + // Each SSTORE costs ~20,000 gas for a new slot (cold access) + // To consume ~400,000 gas, we need about 20 iterations + for (uint256 i = 0; i < iterations; i++) { + data[startValue + i] = block.timestamp + i; + totalWrites++; + } + + if (shouldRevert) { + revert GasConsumerReverted(iterations); + } + + return totalWrites; + } + + /** + * @notice Calls the gas-consuming function with try-catch + * @param iterations Number of storage write iterations + * @param shouldRevert If true, the try block will revert after consuming gas + */ + function callWithTryCatch(uint256 iterations, bool shouldRevert) external returns (bool success) { + uint256 gasBefore = gasleft(); + callCount++; + + // using "this" to make an external call, enabling try-catch + try this.consumeGas(iterations, shouldRevert) returns (uint256 result) { + uint256 gasUsed = gasBefore - gasleft(); + lastResult = result; + emit TrySuccess(result, gasUsed); + return true; + } catch Error(string memory reason) { + uint256 gasUsed = gasBefore - gasleft(); + emit TryCatchFailed(reason, gasUsed); + return false; + } catch (bytes memory reason) { + uint256 gasUsed = gasBefore - gasleft(); + emit TryCatchFailedBytes(reason, gasUsed); + return false; + } + } +} \ No newline at end of file diff --git a/tests/integration_tests/hardhat/contracts/MaliciousDeployer.sol b/tests/integration_tests/hardhat/contracts/MaliciousDeployer.sol new file mode 100644 index 0000000000..6664fc4c73 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/MaliciousDeployer.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./DelegationTarget.sol"; + +/** + * @title MaliciousDeployer + * @notice Contract that during deployment calls back the deployer (with EIP-7702 delegation) + * and deploys contracts through the delegated EOA + * @dev The constructor performs the callback attack during deployment + */ +contract MaliciousDeployer { + address public immutable deployer; + address[] public deployedContracts; + + event CallbackExecuted(address indexed delegatedEOA, bool success); + event ContractDeployedViaCallback(address indexed deployed); + + /** + * @notice Constructor that calls back the deployer and deploys contracts + * @param delegatedEOA The EOA with EIP-7702 delegation (should be tx.origin or specified) + * @param numContracts Number of contracts to deploy via callback + */ + constructor(address delegatedEOA, uint256 numContracts, uint256 step) { + deployer = msg.sender; + + // Attempt to call back the delegated EOA and deploy contracts through it + for (uint256 i = 0; i < numContracts; i++) { + // Get bytecode for MinimalContract + bytes memory bytecode; + if (step == 1) { + bytecode = type(MinimalContract).creationCode; + } else { + bytecode = type(FinalContract).creationCode; + } + + // Call the deploy function on the delegated EOA (which has DelegationTarget code) + (bool success, bytes memory result) = delegatedEOA.call( + abi.encodeWithSelector(DelegationTarget.deploy.selector, bytecode) + ); + + emit CallbackExecuted(delegatedEOA, success); + address deployed; + if (success && result.length >= 32) { + deployed = abi.decode(result, (address)); + deployedContracts.push(deployed); + } + } + + delegatedEOA.call(abi.encodeWithSelector(DelegationTarget.emitAllCodeHashes.selector)); + + + // @audit at this point, the attacker can make external calls + + + // Call the deploy function on the delegated EOA (which has DelegationTarget code) + if (step == 1) { + delegatedEOA.call( + abi.encodeWithSelector(DelegationTarget.selfdestructAll.selector) + ); + } + } + + /** + * @notice Get the number of contracts deployed via callback + */ + function getDeployedCount() external view returns (uint256) { + return deployedContracts.length; + } + + /** + * @notice Get all deployed contract addresses + */ + function getDeployedContracts() external view returns (address[] memory) { + return deployedContracts; + } +} \ No newline at end of file diff --git a/tests/integration_tests/hardhat/contracts/Osaka.sol b/tests/integration_tests/hardhat/contracts/Osaka.sol new file mode 100644 index 0000000000..415ee79e57 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/Osaka.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.21; + +contract Osaka { + address internal constant P256VERIFY = + 0x0000000000000000000000000000000000000100; + + event ClzContractDeployed(address deployedAddress); + + function deployClzContract() external returns (address deployedAddress) { + // Init prefix copies the appended runtime bytecode and returns it: + // PUSH1 0x0b CODESIZE SUB DUP1 PUSH1 0x0b PUSH0 CODECOPY PUSH0 RETURN. + // Runtime reads one uint256 calldata word, executes CLZ (0x1e), and returns + // the 32-byte result: + // PUSH1 0 CALLDATALOAD CLZ PUSH1 0 MSTORE PUSH1 32 PUSH1 0 RETURN. + bytes memory initCode = abi.encodePacked( + hex"600b380380600b5f395ff3", + hex"6000351e60005260206000f3" + ); + + assembly { + deployedAddress := create(0, add(initCode, 32), mload(initCode)) + } + + require(deployedAddress != address(0), "CLZ deploy failed"); + emit ClzContractDeployed(deployedAddress); + } + + function verifyP256(bytes calldata input) external view returns (bool) { + (bool ok, bytes memory output) = P256VERIFY.staticcall(input); + return ok && output.length == 32 && abi.decode(output, (uint256)) == 1; + } +} diff --git a/tests/integration_tests/hardhat/contracts/SelfDestruct.sol b/tests/integration_tests/hardhat/contracts/SelfDestruct.sol new file mode 100644 index 0000000000..b14f72c560 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/SelfDestruct.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract SelfDestruct { + address payable recipient = payable(0x0F0cb39319129BA867227e5Aae1abe9e7dd5f861); + address payable owner; + + constructor() { + owner = payable(msg.sender); + } + + receive() external payable {} + + function execute() public payable { + require(msg.sender == owner, string(abi.encodePacked("Unauthorized caller: ", msg.sender, " Owner: ", owner))); + payable(recipient).transfer(msg.value); + selfdestruct(owner); + } +} diff --git a/tests/integration_tests/hardhat/contracts/SelfDestructExploit.sol b/tests/integration_tests/hardhat/contracts/SelfDestructExploit.sol new file mode 100644 index 0000000000..1035e0c7b1 --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/SelfDestructExploit.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +// Child contract deployed via CREATE2. +// - Accepts ETH unconditionally. +// - Exposes destroy() to SELFDESTRUCT (valid under EIP-6780 when created in same tx). +// - Exposes drain() to transfer its entire balance to tx.origin. +contract SelfDestructTarget { + receive() external payable {} + + function destroy() external { + // solhint-disable-next-line + selfdestruct(payable(msg.sender)); + } + + function drain() external { + uint256 bal = address(this).balance; + if (bal > 0) { + payable(tx.origin).transfer(bal); + } + } +} + +// Factory that executes the SELFDESTRUCT balance-preservation exploit in a single +// on-chain transaction, enabling deterministic integration-test verification. +contract SelfDestructExploitFactory { + // Stored init code so CREATE2 address predictions remain stable across calls. + bytes public targetInitCode; + + constructor() { + targetInitCode = type(SelfDestructTarget).creationCode; + } + + // Predict the CREATE2 address for a given salt without deploying. + function predictChildAddress(bytes32 salt) public view returns (address) { + bytes32 initHash = keccak256(targetInitCode); + return address( + uint160( + uint256( + keccak256( + abi.encodePacked(bytes1(0xff), address(this), salt, initHash) + ) + ) + ) + ); + } + + // Execute the exploit scenario in a single transaction: + // a) Deploy child via CREATE2. + // b) Trigger SELFDESTRUCT on the child. + // (EIP-6780: deletion applies because the child was created in this same tx.) + // c) Forward msg.value to the now-destroyed child address. + // This leaves post-destruction funds in the bank layer, which Ethermint must burn. + function attackInOneTx(bytes32 salt) external payable returns (address childAddr) { + bytes memory initCode = targetInitCode; + assembly { + childAddr := create2(0, add(initCode, 0x20), mload(initCode), salt) + } + require(childAddr != address(0), "Create2 deployment failed"); + + SelfDestructTarget(payable(childAddr)).destroy(); + + (bool ok, ) = childAddr.call{value: msg.value}(""); + require(ok, "Post-selfdestruct value transfer failed"); + } + + // Attempt to recover orphaned funds by recreating the child at the same address. + // With the fix, the bank balance is already 0 so nothing is recoverable. + function redeployChild(bytes32 salt) external returns (address childAddr) { + bytes memory initCode = targetInitCode; + assembly { + childAddr := create2(0, add(initCode, 0x20), mload(initCode), salt) + } + require(childAddr != address(0), "Redeployment failed"); + + // Attempt drain; with the fix applied upstream, child.balance is already 0. + SelfDestructTarget(payable(childAddr)).drain(); + } +} diff --git a/tests/integration_tests/hardhat/contracts/TestBlockTxProperties.sol b/tests/integration_tests/hardhat/contracts/TestBlockTxProperties.sol new file mode 100644 index 0000000000..5ea6f3397b --- /dev/null +++ b/tests/integration_tests/hardhat/contracts/TestBlockTxProperties.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract TestBlockTxProperties { + event TxDetailsEvent( + address indexed origin, + address indexed sender, + uint value, + bytes data, + uint gas, + uint gasprice, + bytes4 sig + ); + + function emitTxDetails() public payable { + emit TxDetailsEvent(tx.origin, msg.sender, msg.value, msg.data, gasleft(), tx.gasprice, msg.sig); + } + + function getBlockHash(uint256 blockNumber) public view returns (bytes32) { + return blockhash(blockNumber); + } +} diff --git a/tests/integration_tests/hardhat/hardhat.config.ts b/tests/integration_tests/hardhat/hardhat.config.ts index 6ee4be22bc..1ce3eada73 100644 --- a/tests/integration_tests/hardhat/hardhat.config.ts +++ b/tests/integration_tests/hardhat/hardhat.config.ts @@ -1,7 +1,7 @@ import type { HardhatUserConfig } from "hardhat/config"; -import "hardhat-typechain"; +import "@typechain/hardhat"; import "@openzeppelin/hardhat-upgrades"; -import "@nomiclabs/hardhat-ethers"; +import "@nomicfoundation/hardhat-ethers"; const config: HardhatUserConfig = { solidity: { @@ -27,7 +27,7 @@ const config: HardhatUserConfig = { }, typechain: { outDir: "typechain", - target: "ethers-v5", + target: "ethers-v6", }, }; diff --git a/tests/integration_tests/hardhat/package-lock.json b/tests/integration_tests/hardhat/package-lock.json index 7e178ca74d..cf4fe5c25b 100644 --- a/tests/integration_tests/hardhat/package-lock.json +++ b/tests/integration_tests/hardhat/package-lock.json @@ -1,7 +1,7 @@ { "name": "contracts", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,596 +9,965 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@nomiclabs/hardhat-ethers": "^2.2.1", - "@nomiclabs/hardhat-waffle": "^2.0.3", + "@nomicfoundation/hardhat-ethers": "^3.0.0", "@openzeppelin/contracts": "^4.8.0", "@openzeppelin/contracts-upgradeable": "^4.3.1", - "@openzeppelin/hardhat-upgrades": "^1.21.0", - "@typechain/ethers-v5": "^5.0.0", - "hardhat": "^2.10.1", - "hardhat-typechain": "^0.3.5", - "ts-generator": "^0.1.1", - "typechain": "^4.0.3" + "@openzeppelin/hardhat-upgrades": "^3.9.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^6.0.0", + "ethers": "^5.8.0", + "hardhat": "^3.4.5", + "typechain": "^8.3.2" }, "devDependencies": { "ts-node": "^10.9.1", "typescript": "^4.7.4" } }, - "node_modules/@aws-crypto/sha256-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", - "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^1.2.2", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-crypto/util": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", - "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/types": { - "version": "3.496.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.496.0.tgz", - "integrity": "sha512-umkGadK4QuNQaMoDICMm7NKRI/mYSXiyPjcn3d53BhsuArYU/52CebGQKdt4At7SwwsiVJZw9RNBHyN5Mm0HVw==", + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/types/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "node_modules/@aws-sdk/client-lambda": { + "version": "3.1046.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1046.0.tgz", + "integrity": "sha512-g997Ks9pIxUWrc+BRlbkEXCIsYiW60lVSvSt38UXu50XG6DAH63l+ALiwzBk47TA2XlFO7z/IufklQCnCBaQnQ==", + "license": "Apache-2.0", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/credential-provider-node": "^3.972.40", + "@aws-sdk/middleware-host-header": "^3.972.11", + "@aws-sdk/middleware-logger": "^3.972.10", + "@aws-sdk/middleware-recursion-detection": "^3.972.12", + "@aws-sdk/middleware-user-agent": "^3.972.39", + "@aws-sdk/region-config-resolver": "^3.972.14", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.9", + "@aws-sdk/util-user-agent-browser": "^3.972.11", + "@aws-sdk/util-user-agent-node": "^3.973.25", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/node-http-handler": "^4.7.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.974.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.9.tgz", + "integrity": "sha512-bXxosFunr+v/kqNb99r1NRkrVBha7CG036fRSpWGbC1A/e363XFQN6wcZMx7MYTdRr1tYwNnkrWX2xc1rT3BCQ==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/xml-builder": "^3.972.23", + "@smithy/core": "^3.24.1", + "@smithy/signature-v4": "^5.4.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", - "peer": true, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.35.tgz", + "integrity": "sha512-WkFQ8BedszVomhh/Zzs8WwnE/XBmTqZjoQVB8u/4zH6kZCjouXZpPpb93gD8m0EZmzAl7dxHE/y+yDpuKzNCMw==", + "license": "Apache-2.0", "dependencies": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - } - }, - "node_modules/@ensdomains/ens/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "peer": true, + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.37.tgz", + "integrity": "sha512-ylx0ZJTU+2eNcvXQ69VNR3TVSYa/ibpvdK717/NxqR9aXRMn2QRWZaiI8aa5yY/fOWZ5mknSmxGaVxxtdwv3EA==", + "license": "Apache-2.0", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "peer": true, + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/node-http-handler": "^4.7.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.39.tgz", + "integrity": "sha512-QhRSrdkk+Gq0AFIylpiI0N6lcJqFYV9Jtr4Luz5FpYOYbjJSfyTG6iLhnK/UPIgN1Jnon8WAmSC//16XYGvwkA==", + "license": "Apache-2.0", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/credential-provider-env": "^3.972.35", + "@aws-sdk/credential-provider-http": "^3.972.37", + "@aws-sdk/credential-provider-login": "^3.972.39", + "@aws-sdk/credential-provider-process": "^3.972.35", + "@aws-sdk/credential-provider-sso": "^3.972.39", + "@aws-sdk/credential-provider-web-identity": "^3.972.39", + "@aws-sdk/nested-clients": "^3.997.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/credential-provider-imds": "^4.3.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "peer": true - }, - "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.39.tgz", + "integrity": "sha512-1hU0NtC04QbFIuoBuF4aQ2A97GsSE5/A0ZJpDijwexsBREIQ4KPRYl3v/FfKCPBYsaTeGjkOFx5nLhWHY24LOw==", + "license": "Apache-2.0", "dependencies": { - "number-is-nan": "^1.0.0" + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/nested-clients": "^3.997.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@ensdomains/ens/node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.40.tgz", + "integrity": "sha512-ZgrQaGkpyTlVSCCsffzijVg+KgftTAWYvI5Otc36J/4jNiHb+7MmBiJIR0a5AHLvifC92PiYHt5pijP0dswd1w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.35", + "@aws-sdk/credential-provider-http": "^3.972.37", + "@aws-sdk/credential-provider-ini": "^3.972.39", + "@aws-sdk/credential-provider-process": "^3.972.35", + "@aws-sdk/credential-provider-sso": "^3.972.39", + "@aws-sdk/credential-provider-web-identity": "^3.972.39", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/credential-provider-imds": "^4.3.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.35.tgz", + "integrity": "sha512-hNj1rAwZWT1vfz54BwH8FUWxZuqStrM25Q5LEIwn2erHPMRVAjLlpZqEbCEEqS99eEEOhdeetnS0WeNa3iYeEQ==", + "license": "Apache-2.0", "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, - "bin": { - "solcjs": "solcjs" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.39.tgz", + "integrity": "sha512-mwIPNPldyCZkvHozb6E0X/vuQLN1UCjcA6MwUf1gaO7EwghCmuNZXatq0L3zptKFvPC4Nds7+WFUkifI1XmbSw==", + "license": "Apache-2.0", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/nested-clients": "^3.997.7", + "@aws-sdk/token-providers": "3.1046.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "peer": true, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.39.tgz", + "integrity": "sha512-b9HT8CnpyPVn1hU14Q7ihjwSPlRzToYmRYJxRd5jNHEZ43lrIhoLaTT8JmfQQt5j5M8rTX1iN1X8mvu0SM1dXA==", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^2.0.0" + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/nested-clients": "^3.997.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "peer": true, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.11.tgz", + "integrity": "sha512-CBC6+tVYaOJo7QXgN1zJ4Ba2f3/Cpy4eRViYFimXW/O5Mn8hBmgXXzHu4vy4ubT80YWnp8aCFygr7dTOa14yQg==", + "license": "Apache-2.0", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/ens/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "peer": true - }, - "node_modules/@ensdomains/ens/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "peer": true, - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "peer": true, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz", + "integrity": "sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==", + "license": "Apache-2.0", "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts", - "peer": true - }, - "node_modules/@ethereum-waffle/chai": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", - "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", - "peer": true, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.12.tgz", + "integrity": "sha512-5eltYxKB4MfdQv7/VhWxRbAVQKow5dz9votRFigTYrWJHMQXwLMltlbk7KFWSZh5NDBySfmjT7Jv/DWfYCmDng==", + "license": "Apache-2.0", "dependencies": { - "@ethereum-waffle/provider": "4.0.5", - "debug": "^4.3.4", - "json-bigint": "^1.0.0" + "@aws-sdk/types": "^3.973.8", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" + "node": ">=20.0.0" } }, - "node_modules/@ethereum-waffle/ens": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", - "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", - "peer": true, - "engines": { - "node": ">=10.0" + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.39", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.39.tgz", + "integrity": "sha512-MlNSvNsSVlMKKWaCzA0GP1nS4Cuq3WCXUN1vmMvd+Ctztib5kmRcpmTtKx9kikN8szAc+gcdp7uqJJervV2nQg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.9", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@ensdomains/ens": "^0.4.4", - "@ensdomains/resolver": "^0.2.4", - "ethers": "*" - } - }, - "node_modules/@ethereum-waffle/mock-contract": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", - "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", - "peer": true, "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" + "node": ">=20.0.0" } }, - "node_modules/@ethereum-waffle/provider": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", - "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", - "peer": true, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.7.tgz", + "integrity": "sha512-jT2AXOODobQfTYGC2SChMSnZ/voIcRV/LHlY1suyhY1bdgP/voKkhEg8Ci1jiGQ4lBiaso5BEAV3ZWWpPTfmYA==", + "license": "Apache-2.0", "dependencies": { - "@ethereum-waffle/ens": "4.0.3", - "@ganache/ethereum-options": "0.1.4", - "debug": "^4.3.4", - "ganache": "7.4.3" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/middleware-host-header": "^3.972.11", + "@aws-sdk/middleware-logger": "^3.972.10", + "@aws-sdk/middleware-recursion-detection": "^3.972.12", + "@aws-sdk/middleware-user-agent": "^3.972.39", + "@aws-sdk/region-config-resolver": "^3.972.14", + "@aws-sdk/signature-v4-multi-region": "^3.996.26", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.9", + "@aws-sdk/util-user-agent-browser": "^3.972.11", + "@aws-sdk/util-user-agent-node": "^3.973.25", + "@smithy/core": "^3.24.1", + "@smithy/fetch-http-handler": "^5.4.1", + "@smithy/node-http-handler": "^4.7.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.14", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.14.tgz", + "integrity": "sha512-VuLXVmm7+lKVxqFcOItPkXhjbJ02iUfxkxheRu41SfWf6/xrZup2A2SwHZos/LeQGu3SBHeqTQht80Uo3ienPA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "peer": true, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.26.tgz", + "integrity": "sha512-2N62veqdMZBCwQUHsbhtnaovOFjOa5Dn3dAD1nRqFTUXR4QmirT3HZnfus/L1DS08Vm5CkoKmL0iMVt6YbqEag==", + "license": "Apache-2.0", "dependencies": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/signature-v4": "^5.4.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/block/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "peer": true, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1046.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1046.0.tgz", + "integrity": "sha512-9je8nZt+ntB8IjhpGNayU/AkBgvq/f4aFO2bH1LSNC5JX6K8zY4LUnr/ymqunePrwq+B5OVBpL7ILjYzMFSZAw==", + "license": "Apache-2.0", "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "@aws-sdk/core": "^3.974.9", + "@aws-sdk/nested-clients": "^3.997.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/block/node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "peer": true, + "node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "license": "Apache-2.0", "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "peer": true, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.996.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.9.tgz", + "integrity": "sha512-ibx8Vd73rCTHekNGeXX8cpGWoBKbNAlwKHL3yjSxxttu5QnNDaSAM7/0MFYDjU31/F4lyrPoQcGirT0ew61xcg==", + "license": "Apache-2.0", "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/blockchain/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "peer": true, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/common": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", - "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", - "peer": true, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.11.tgz", + "integrity": "sha512-kq3RS6XQtHMrLFShbkem6h+8fxazB3jEIsbMC6aaSInOciRGE+eGAqTgJ+obO7Euo/pjM8thVqLiLISEH9X9DA==", + "license": "Apache-2.0", "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.3" + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, - "node_modules/@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", - "peer": true, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.973.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.25.tgz", + "integrity": "sha512-066hKH/0nvV7x4ofV/iK9kz8r/qNfcR6rzuEOFqI2vQL/fcTTsDAbTw0jmXkyMzANK8ltQdALj19ns3zuOJiUw==", + "license": "Apache-2.0", "dependencies": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "peer": true, - "bin": { - "rlp": "bin/rlp" + "@aws-sdk/middleware-user-agent": "^3.972.39", + "@aws-sdk/types": "^3.973.8", + "@smithy/core": "^3.24.1", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@ethereumjs/tx": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", - "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", - "peer": true, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "license": "Apache-2.0", "dependencies": { - "@ethereumjs/common": "^2.6.0", - "ethereumjs-util": "^7.1.3" + "tslib": "^2.3.1" } }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "peer": true, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.23", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.23.tgz", + "integrity": "sha512-A0YmgYFv+hTI9c17Ntvd2hSehm9bmJfkb+ggADBwVKA8H/3+Jx94SzR2qOB9bAA9WFeDqnfz9PKKQ+D+YAKomA==", + "license": "Apache-2.0", "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" + "@nodable/entities": "2.1.0", + "@smithy/types": "^4.14.1", + "fast-xml-parser": "5.7.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" + "node": ">=20.0.0" } }, - "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", - "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", - "peer": true, - "dependencies": { - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@scure/bip32": "1.3.3", - "@scure/bip39": "1.2.2" + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@ethereumjs/vm": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", - "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", - "peer": true, - "dependencies": { - "@ethereumjs/block": "^3.6.0", - "@ethereumjs/blockchain": "^5.5.0", - "@ethereumjs/common": "^2.6.0", - "@ethereumjs/tx": "^3.4.0", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^2.2.0", - "ethereumjs-util": "^7.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.2", - "rustbn.js": "~0.2.0" - } - }, - "node_modules/@ethereumjs/vm/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.0.tgz", + "integrity": "sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==", + "license": "(Apache-2.0 WITH LLVM-exception)" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/vm/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", + "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", "funding": [ { "type": "individual", @@ -609,18 +978,23 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "node_modules/@ethersproject/abstract-provider": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", + "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", "funding": [ { "type": "individual", @@ -631,18 +1005,21 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0" } }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "node_modules/@ethersproject/abstract-signer": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", + "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", "funding": [ { "type": "individual", @@ -653,14 +1030,19 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "node_modules/@ethersproject/address": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", + "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", "funding": [ { "type": "individual", @@ -671,15 +1053,19 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/rlp": "^5.8.0" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "node_modules/@ethersproject/base64": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", + "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", "funding": [ { "type": "individual", @@ -690,16 +1076,56 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" + "@ethersproject/bytes": "^5.8.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", + "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/properties": "^5.8.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", + "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "bn.js": "^5.2.1" } }, "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", + "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", "funding": [ { "type": "individual", @@ -710,14 +1136,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", + "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", "funding": [ { "type": "individual", @@ -728,14 +1155,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0" } }, "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", + "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", "funding": [ { "type": "individual", @@ -746,23 +1174,24 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" + "@ethersproject/abi": "^5.8.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0" } }, "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", + "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", "funding": [ { "type": "individual", @@ -773,22 +1202,23 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", + "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", "funding": [ { "type": "individual", @@ -799,25 +1229,26 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", + "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", "funding": [ { "type": "individual", @@ -828,26 +1259,27 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", + "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", "funding": [ { "type": "individual", @@ -858,15 +1290,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", + "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", "funding": [ { "type": "individual", @@ -876,12 +1309,13 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "license": "MIT" }, "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", + "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", "funding": [ { "type": "individual", @@ -892,14 +1326,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", + "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", "funding": [ { "type": "individual", @@ -910,15 +1345,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/sha2": "^5.8.0" } }, "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", + "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", "funding": [ { "type": "individual", @@ -929,14 +1365,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", + "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", "funding": [ { "type": "individual", @@ -947,33 +1384,34 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0", "bech32": "1.1.4", - "ws": "7.4.6" + "ws": "8.18.0" } }, "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", + "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", "funding": [ { "type": "individual", @@ -984,15 +1422,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", + "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", "funding": [ { "type": "individual", @@ -1003,15 +1442,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", + "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", "funding": [ { "type": "individual", @@ -1022,16 +1462,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", + "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", "funding": [ { "type": "individual", @@ -1042,19 +1483,20 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", - "elliptic": "6.5.4", + "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", + "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", "funding": [ { "type": "individual", @@ -1065,19 +1507,20 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", + "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", "funding": [ { "type": "individual", @@ -1088,16 +1531,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", + "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", "funding": [ { "type": "individual", @@ -1108,22 +1552,23 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0" } }, "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", "funding": [ { "type": "individual", @@ -1134,16 +1579,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", + "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", "funding": [ { "type": "individual", @@ -1154,28 +1600,29 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/json-wallets": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", + "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", "funding": [ { "type": "individual", @@ -1186,18 +1633,19 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", + "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", "funding": [ { "type": "individual", @@ -1208,197 +1656,60 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@ganache/ethereum-address": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", - "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", - "peer": true, - "dependencies": { - "@ganache/utils": "0.1.4" - } - }, - "node_modules/@ganache/ethereum-options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", - "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", - "peer": true, - "dependencies": { - "@ganache/ethereum-address": "0.1.4", - "@ganache/ethereum-utils": "0.1.4", - "@ganache/options": "0.1.4", - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "node_modules/@ganache/ethereum-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", - "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", - "peer": true, - "dependencies": { - "@ethereumjs/common": "2.6.0", - "@ethereumjs/tx": "3.4.0", - "@ethereumjs/vm": "5.6.0", - "@ganache/ethereum-address": "0.1.4", - "@ganache/rlp": "0.1.4", - "@ganache/utils": "0.1.4", - "emittery": "0.10.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-util": "7.1.3" - } - }, - "node_modules/@ganache/ethereum-utils/node_modules/ethereumjs-util": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", - "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", - "peer": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ganache/options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", - "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", - "peer": true, - "dependencies": { - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "node_modules/@ganache/rlp": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", - "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", - "peer": true, - "dependencies": { - "@ganache/utils": "0.1.4", - "rlp": "2.2.6" - } - }, - "node_modules/@ganache/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", - "peer": true, - "dependencies": { - "emittery": "0.10.0", - "keccak": "3.0.1", - "seedrandom": "3.0.5" - }, - "optionalDependencies": { - "@trufflesuite/bigint-buffer": "1.1.9" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "devOptional": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "devOptional": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "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" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, "node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "peer": true, + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.3" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "peer": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", "engines": { "node": ">= 16" }, @@ -1406,1080 +1717,896 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", "funding": [ { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "github", + "url": "https://github.com/sponsors/nodable" } - ] + ], + "license": "MIT" }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", + "node_modules/@nomicfoundation/edr": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.32.tgz", + "integrity": "sha512-syVtyDOyJv/IqfpmFsM6/rlpoq6XYl9j9urBLYGDci8pv/ow6vAdOxTrR9x2wE+cQi02TjeODG6QHMyr3B9Z2g==", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" + "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.32", + "@nomicfoundation/edr-darwin-x64": "0.12.0-next.32", + "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.32", + "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.32", + "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.32", + "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.32", + "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.32" }, "engines": { - "node": ">=14" + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.32.tgz", + "integrity": "sha512-uTJEmtlD7ZoULS2cE2CNunOirWxTML/c1k8CJBkMogtE33ArG0CzgL2OACEcZlsyje/PGBwUrsF1+WNjKZWxPA==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.32.tgz", + "integrity": "sha512-kWuTWKodlEbDjxWAern+bV67gdS6Tx0nE5izolt2jfAQ1KimYlMlKCtTnOIKmAn8NdXPrjmsPfTVMGdFSlvqdA==", + "license": "MIT", + "engines": { + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.32.tgz", + "integrity": "sha512-kMy/tvVf/FVebNaoFxtVW3NACBeipkqF+AV3hdzOx1Qsz/rXZkGgFD4Yf/F8TVMwLgWKvgV+QtCIAZ2E8CCXKw==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.32.tgz", + "integrity": "sha512-H/6SX6vrlvtEe1WIA6KSWeBig0ZSrHekE+beowDBfPjb0zgOAwbNvi0LSvXkYPCZPjInxonX4B7gGF2g2pULww==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", - "bin": { - "rlp": "bin/rlp" - }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.32.tgz", + "integrity": "sha512-jsCbYwPd5aezApKo6rBpngHTdAZSEkQtsf0/s84XZpGo4gCc4+5eWL6fSrqzJH/WopCS9BFQE6XCiylxYV8Elw==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.32.tgz", + "integrity": "sha512-TyZqLiroByNWe3Gr/qJ6q5FpRcwTIXUHENv0PMfpj88BvJnBg879iwag5wtNYRrwx429e3SD6R3O8pgIcikldg==", + "license": "MIT", + "engines": { + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.12.0-next.32", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.32.tgz", + "integrity": "sha512-PySTZVVWsRB0h008O6Ey5kdsGo/L+DoxAP7vypv1R9zw0BKFiQ9XhuCFx1sMu28sQ12OOXzOhDjhhZ87Tbfwbg==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 20" } }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", + "node_modules/@nomicfoundation/hardhat-errors": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-errors/-/hardhat-errors-3.0.12.tgz", + "integrity": "sha512-2viEq1D19FHWKpfB2vVeL0R6d+iZR2E5h0EhKQQMc1ukDUV2fel/7fRjlWuCOx2CFC+5mHL2saRcN8KlYsX8hg==", + "license": "MIT", "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" + "@nomicfoundation/hardhat-utils": "^4.1.0" } }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.3.tgz", + "integrity": "sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==", + "license": "MIT", "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "ethers": "^6.14.0", + "hardhat": "^2.28.0" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "node_modules/@nomicfoundation/hardhat-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-utils/-/hardhat-utils-4.1.1.tgz", + "integrity": "sha512-yKUMIhwzNlrl9wfe0WlAjXjRPfHh8JdCu6Iv4o+oi6Q9ovyCGj+66JzFsALNIMBo6L19Nf40DFICqUZef02Yrg==", + "license": "MIT", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "@streamparser/json-node": "^0.0.22", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^2.2.1", + "fast-equals": "^5.4.0", + "json-stream-stringify": "^3.1.6", + "rfdc": "^1.3.1", + "undici": "^6.16.1" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "node_modules/@nomicfoundation/hardhat-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", + "node_modules/@nomicfoundation/hardhat-vendored": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-vendored/-/hardhat-vendored-3.0.3.tgz", + "integrity": "sha512-VzxwR1Yz8zAztiSIkjFai/XyqfuMMvX95ppXxWlJ1ci0TiHu6sut1oOAD+VJVCq+LHNpr2fWMUcugZq9uKbicg==", + "license": "MIT" + }, + "node_modules/@nomicfoundation/hardhat-zod-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-zod-utils/-/hardhat-zod-utils-3.0.4.tgz", + "integrity": "sha512-yCiycXDEEjbNgNVQaUoGYOee6+ljYUnIOWMtYc/dYDuwlHutWr9xg/KgkgMkiZZ1R2WrZAEqsSaeZTnH7Oyz9Q==", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "@nomicfoundation/hardhat-errors": "^3.0.11", + "@nomicfoundation/hardhat-utils": "^4.0.3" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@nomicfoundation/slang": { + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/slang/-/slang-0.18.3.tgz", + "integrity": "sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==", + "license": "MIT", + "dependencies": { + "@bytecodealliance/preview2-shim": "0.17.0" } }, "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "license": "MIT", "engines": { "node": ">= 12" }, "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + "@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" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "license": "MIT", "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "license": "MIT", "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } + "node_modules/@openzeppelin/contracts": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", + "license": "MIT" }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", + "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==", + "license": "MIT" }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz", - "integrity": "sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==", - "deprecated": "The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead", - "peer": true, + "node_modules/@openzeppelin/defender-sdk-base-client": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-2.7.1.tgz", + "integrity": "sha512-7gFCteA+V3396A3McgqzmirwmbPXuHJYN896O3AbsHX9XcxInN74C5Zv3tFHld0GmIX/VlaIvILNMhOpdISZjA==", + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" + "@aws-sdk/client-lambda": "^3.563.0", + "amazon-cognito-identity-js": "^6.3.6", + "async-retry": "^1.3.3", + "axios": "^1.7.4" } }, - "node_modules/@nomiclabs/hardhat-waffle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz", - "integrity": "sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==", - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@types/sinon-chai": "^3.2.3", - "ethereum-waffle": "*", - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "node_modules/@openzeppelin/defender-sdk-deploy-client": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-2.7.1.tgz", + "integrity": "sha512-vFkDupn8ATW83KjZlY5U7UdsvSo9YZwOMQoVaHJO3S+Z6h0wa6cTzuQV9C0AKYq524quQkFsQ4AQq5CgsgdEkQ==", + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.7.1", + "axios": "^1.7.4", + "lodash": "^4.17.21" } }, - "node_modules/@openzeppelin/contracts": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", - "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" - }, - "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz", - "integrity": "sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg==" - }, - "node_modules/@openzeppelin/defender-base-client": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz", - "integrity": "sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw==", + "node_modules/@openzeppelin/defender-sdk-network-client": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-2.7.1.tgz", + "integrity": "sha512-AWJKT9YKv9wH3/1AJZCztF3VIsg1sX+v8fjtyFLROqtVAzmhB8WKBRVt9GHAZ+PmsixAKDMOEbH6R1cipTIVHQ==", + "license": "MIT", "dependencies": { - "amazon-cognito-identity-js": "^6.0.1", - "async-retry": "^1.3.3", - "axios": "^1.4.0", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" + "@openzeppelin/defender-sdk-base-client": "^2.7.1", + "axios": "^1.7.4", + "lodash": "^4.17.21" } }, "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.28.0.tgz", - "integrity": "sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.9.0.tgz", + "integrity": "sha512-7YYBSxRnO/X+tsQkVgtz3/YbwZuQPjbjQ3m0A/8+vgQzdPfulR93NaFKgZfMonnrriXb5O/ULjIDPI+8nuqtyQ==", + "license": "MIT", "dependencies": { - "@openzeppelin/defender-base-client": "^1.46.0", - "@openzeppelin/platform-deploy-client": "^0.8.0", - "@openzeppelin/upgrades-core": "^1.27.0", + "@openzeppelin/defender-sdk-base-client": "^2.1.0", + "@openzeppelin/defender-sdk-deploy-client": "^2.1.0", + "@openzeppelin/defender-sdk-network-client": "^2.1.0", + "@openzeppelin/upgrades-core": "^1.41.0", "chalk": "^4.1.0", "debug": "^4.1.1", - "proper-lockfile": "^4.1.1" + "ethereumjs-util": "^7.1.5", + "proper-lockfile": "^4.1.1", + "undici": "^6.11.1" }, "bin": { "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" }, "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "ethers": "^5.0.5", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "ethers": "^6.6.0", "hardhat": "^2.0.2" }, "peerDependenciesMeta": { - "@nomiclabs/harhdat-etherscan": { + "@nomicfoundation/hardhat-verify": { "optional": true } } }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.44.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.44.2.tgz", + "integrity": "sha512-m6iorjyhPK9ow5/trNs7qsBC/SOzJCO51pvvAF2W9nOiZ1t0RtCd+rlRmRmlWTv4M33V0wzIUeamJ2BPbzgUXA==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@nomicfoundation/slang": "^0.18.3", + "bignumber.js": "^9.1.2", + "cbor": "^10.0.0", + "chalk": "^4.1.0", + "compare-versions": "^6.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "minimatch": "^9.0.5", + "minimist": "^1.2.7", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.60" }, + "bin": { + "openzeppelin-upgrades-core": "dist/cli/cli.js" + } + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@sentry/core": { + "version": "9.47.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.47.1.tgz", + "integrity": "sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@smithy/core": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.2.tgz", + "integrity": "sha512-IKS7qX59fAGCYBmt5JChcDswQDupZqT2Yn2ZBA3UgTlsjRNNkQzZobbn95xoAAdtTyJmBiJB3Y02qR3rgy3Zog==", + "license": "Apache-2.0", "dependencies": { - "has-flag": "^4.0.0" + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/platform-deploy-client": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.8.0.tgz", - "integrity": "sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==", - "deprecated": "@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "@openzeppelin/defender-base-client": "^1.46.0", - "axios": "^0.21.2", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" + "node": ">=18.0.0" } }, - "node_modules/@openzeppelin/platform-deploy-client/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.2.tgz", + "integrity": "sha512-iYr9ekBjmZ+FwkiHEopqGscBbl78X62cq3p5Dd0eC+gNd7fybNZFQQdDuOQjTVmFymleuA8YRWZnuXWZ8B3kKA==", + "license": "Apache-2.0", "dependencies": { - "follow-redirects": "^1.14.0" + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@openzeppelin/upgrades-core": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.32.3.tgz", - "integrity": "sha512-v04RbrBOTRiIhfkTRfY4M34I2wIcuz+K1cUk/6duulsMXvRpM6/IPWeXh+1Xr1K+xedJi7gcS/pNSXfYhYNXIg==", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.2.tgz", + "integrity": "sha512-3wF40g8OOCA5BnwQUvwtzZqYBbWWftDjpAlWIUo6Yld3ZzJaMAKqg7MWQBPjE8oLaqvZQUE7tVGlZPsae6A4bQ==", + "license": "Apache-2.0", "dependencies": { - "cbor": "^9.0.0", - "chalk": "^4.1.0", - "compare-versions": "^6.0.0", - "debug": "^4.1.1", - "ethereumjs-util": "^7.0.3", - "minimist": "^1.2.7", - "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.51" + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, - "bin": { - "openzeppelin-upgrades-core": "dist/cli/cli.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=14.0.0" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", - "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", + "node_modules/@smithy/node-http-handler": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.2.tgz", + "integrity": "sha512-EdksTZ8UXYxGUgQ4mpIKrHoaj9WVGsp66TpZuixLAz1Jex8YDLnS4RH9ktGED5aOpN0OJlEtrsC9IGt76go1eA==", + "license": "Apache-2.0", "dependencies": { - "nofilter": "^3.1.0" + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@smithy/signature-v4": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.2.tgz", + "integrity": "sha512-1km1OjdLRFuITWpCPofjFqzZ+tbeWuB72ZhcYjbjkCxZ21tTPfIs4GUxRrelMyKMLxLghGD58RENnXorU/O8cw==", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@smithy/core": "^3.24.2", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18.0.0" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@smithy/types": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", + "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", + "license": "Apache-2.0", "dependencies": { - "color-name": "~1.1.4" + "tslib": "^2.6.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=18.0.0" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "has-flag": "^4.0.0" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/@resolver-engine/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", - "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", - "peer": true, - "dependencies": { - "debug": "^3.1.0", - "is-url": "^1.2.4", - "request": "^2.85.0" - } + "node_modules/@streamparser/json": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.22.tgz", + "integrity": "sha512-b6gTSBjJ8G8SuO3Gbbj+zXbVx8NSs1EbpbMKpzGLWMdkR+98McH9bEjSz3+0mPJf68c5nxa3CrJHp5EQNXM6zQ==", + "license": "MIT" }, - "node_modules/@resolver-engine/core/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, + "node_modules/@streamparser/json-node": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@streamparser/json-node/-/json-node-0.0.22.tgz", + "integrity": "sha512-sJT2ptNRwqB1lIsQrQlCoWk5rF4tif9wDh+7yluAGijJamAhrHGYpFB/Zg3hJeceoZypi74ftXk8DHzwYpbZSg==", + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@streamparser/json": "^0.0.22" } }, - "node_modules/@resolver-engine/fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", - "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", - "peer": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" }, - "node_modules/@resolver-engine/fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "license": "MIT", "peer": true, "dependencies": { - "ms": "^2.1.1" + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" } }, - "node_modules/@resolver-engine/imports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", - "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", - "peer": true, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", + "license": "MIT", "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0", - "path-browserify": "^1.0.0", - "url": "^0.11.0" + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" } }, - "node_modules/@resolver-engine/imports-fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", - "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", - "peer": true, + "node_modules/@typechain/hardhat": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.0.0.tgz", + "integrity": "sha512-AnhwODKHxx3+st5uc1j2NQh79Lv2OuvDQe4dKn8ZxhqYsAsTPnHTLBeI8KPZ+mfdE7v13D2QYssRTIkkGhK35A==", + "license": "MIT", "dependencies": { - "@resolver-engine/fs": "^0.3.3", - "@resolver-engine/imports": "^0.3.3", - "debug": "^3.1.0" + "fs-extra": "^9.1.0", + "lodash": "^4.17.15" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@typechain/ethers-v5": "^10.0.0", + "ethers": "^5.4.7", + "hardhat": "^2.0.10", + "typechain": "^8.0.0" } }, - "node_modules/@resolver-engine/imports-fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, + "node_modules/@types/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@types/node": "*" } }, - "node_modules/@resolver-engine/imports/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, + "node_modules/@types/node": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.7.0.tgz", + "integrity": "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==", + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "undici-types": "~7.21.0" } }, - "node_modules/@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@scure/bip32": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", - "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", - "peer": true, - "dependencies": { - "@noble/curves": "~1.3.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", - "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", - "peer": true, - "dependencies": { - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "node_modules/@types/secp256k1": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz", + "integrity": "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==", + "license": "MIT", "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" + "@types/node": "*" } }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "acorn": "^8.11.0" }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.3.0" } }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "engines": { - "node": ">=6" - } + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "debug": "4" }, "engines": { - "node": ">=6" + "node": ">= 6.0.0" } }, - "node_modules/@smithy/types": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.1.tgz", - "integrity": "sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==", + "node_modules/amazon-cognito-identity-js": { + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.16.tgz", + "integrity": "sha512-HPGSBGD6Q36t99puWh0LnptxO/4icnk2kqIQ9cTJ2tFQo5NMUnWQIgtrTAk8nm+caqUbjDzXzG56GBjI2tS6jQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@aws-crypto/sha256-js": "1.2.2", + "buffer": "4.9.2", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" } }, - "node_modules/@smithy/types/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", - "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", - "hasInstallScript": true, - "optional": true, - "peer": true, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", + "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", + "license": "Apache-2.0", "dependencies": { - "node-gyp-build": "4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true - }, - "node_modules/@typechain/ethers-v5": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-5.0.0.tgz", - "integrity": "sha512-SnLnq6BCq2NBgm5xsQP8kRIawJ7gppLux8EOMb2ceoB5EuoW87AOyi6r1J5LTYe65/J59HjOVtaGCqsO+38Xrw==", - "peerDependencies": { - "ethers": "^5.0.0", - "typechain": "^4.0.0", - "typescript": ">=3.8.0" + "@aws-crypto/util": "^1.2.2", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" } }, - "node_modules/@types/abstract-leveldown": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz", - "integrity": "sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==", - "peer": true - }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", + "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "peer": true - }, - "node_modules/@types/level-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.2.tgz", - "integrity": "sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==", - "peer": true + "node_modules/amazon-cognito-identity-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, - "node_modules/@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "peer": true, - "dependencies": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" - }, - "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "dependencies": { - "@types/node": "*" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@types/node": { - "version": "20.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", - "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "peer": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", - "dependencies": { - "@types/node": "*" + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" + "retry": "0.13.1" } }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dependencies": { - "@types/node": "*" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, - "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", - "dependencies": { - "@types/node": "*" + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/@types/sinon": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", - "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", - "peer": true, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { - "@types/sinonjs__fake-timers": "*" + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/sinon-chai": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", - "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", - "peer": true, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "license": "MIT", "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "peer": true + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, - "node_modules/abstract-level": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", - "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" + "safe-buffer": "^5.0.1" } }, - "node_modules/abstract-level/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -2494,8803 +2621,384 @@ "url": "https://feross.org/support" } ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } + "license": "MIT" }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/abstract-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "license": "MIT" + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "balanced-match": "^1.0.0" } }, - "node_modules/abstract-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "devOptional": true, - "engines": { - "node": ">=0.4.0" + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "engines": { - "node": ">=0.3.0" + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "license": "MIT" }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", "dependencies": { - "debug": "4" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "peer": true, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/amazon-cognito-identity-js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz", - "integrity": "sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==", + "node_modules/cbor": { + "version": "10.0.12", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.12.tgz", + "integrity": "sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA==", + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-js": "1.2.2", - "buffer": "4.9.2", - "fast-base64-decode": "^1.0.0", - "isomorphic-unfetch": "^3.0.0", - "js-cookie": "^2.2.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "nofilter": "^3.0.2" + }, "engines": { - "node": ">=6" + "node": ">=20" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=4" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.10" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true - }, - "node_modules/argparse": { + "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "typical": "^2.6.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "delayed-stream": "~1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz", - "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==", + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0.0" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "peer": true, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "peer": true, + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=0.8" + "node": ">=4" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "peer": true, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "peer": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "peer": true, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "peer": true - }, - "node_modules/axios": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.6.tgz", - "integrity": "sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "peer": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "peer": true - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "peer": true, - "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } - }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "peer": true - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "peer": true - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-aes/node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "peer": true - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "peer": true, - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/classic-level": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", - "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "node_modules/command-line-args": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", - "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", - "dependencies": { - "array-back": "^2.0.0", - "find-replace": "^1.0.3", - "typical": "^2.6.1" - }, - "bin": { - "command-line-args": "bin/cli.js" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "peer": true, - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "peer": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-js-pure": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz", - "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "peer": true - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "peer": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/deferred-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "peer": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "peer": true, - "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "peer": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "peer": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "peer": true, - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "peer": true - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "peer": true, - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereum-waffle": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", - "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", - "peer": true, - "dependencies": { - "@ethereum-waffle/chai": "4.0.10", - "@ethereum-waffle/compiler": "4.0.3", - "@ethereum-waffle/mock-contract": "4.0.4", - "@ethereum-waffle/provider": "4.0.5", - "solc": "0.8.15", - "typechain": "^8.0.0" - }, - "bin": { - "waffle": "bin/waffle" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, - "node_modules/ethereum-waffle/node_modules/@ethereum-waffle/compiler": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", - "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", - "peer": true, - "dependencies": { - "@resolver-engine/imports": "^0.3.3", - "@resolver-engine/imports-fs": "^0.3.3", - "@typechain/ethers-v5": "^10.0.0", - "@types/mkdirp": "^0.5.2", - "@types/node-fetch": "^2.6.1", - "mkdirp": "^0.5.1", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*", - "solc": "*", - "typechain": "^8.0.0" - } - }, - "node_modules/ethereum-waffle/node_modules/@typechain/ethers-v5": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", - "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", - "peer": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/ethereum-waffle/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ethereum-waffle/node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "peer": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ethereum-waffle/node_modules/typechain": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", - "peer": true, - "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - }, - "peerDependencies": { - "typescript": ">=4.3.0" - } - }, - "node_modules/ethereum-waffle/node_modules/typechain/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "peer": true, - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "peer": true - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "peer": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "peer": true - }, - "node_modules/fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "peer": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "peer": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-replace": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", - "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", - "dependencies": { - "array-back": "^1.0.4", - "test-value": "^2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-replace/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", - "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", - "bundleDependencies": [ - "@trufflesuite/bigint-buffer", - "emittery", - "keccak", - "leveldown", - "secp256k1", - "@types/bn.js", - "@types/lru-cache", - "@types/seedrandom" - ], - "hasShrinkwrap": true, - "peer": true, - "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", - "hasInstallScript": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "node-gyp-build": "4.4.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache/node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "queue-tick": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/ganache/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/ganache/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "peer": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true - }, - "node_modules/hardhat": { - "version": "2.19.4", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.4.tgz", - "integrity": "sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ==", - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "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.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/hardhat-typechain": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/hardhat-typechain/-/hardhat-typechain-0.3.5.tgz", - "integrity": "sha512-w9lm8sxqTJACY+V7vijiH+NkPExnmtiQEjsV9JKD1KgMdVk2q8y+RhvU/c4B7+7b1+HylRUCxpOIvFuB3rE4+w==", - "peerDependencies": { - "hardhat": "^2.0.10", - "ts-generator": "^0.1.1", - "typechain": "^4.0.1" - } - }, - "node_modules/hardhat/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/hardhat/node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/hardhat/node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/hardhat/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/hardhat/node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "peer": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "peer": true, - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "peer": true - }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dependencies": { - "fp-ts": "^1.0.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "peer": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "peer": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "peer": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "peer": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "peer": true - }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "peer": true - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "peer": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "peer": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "peer": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "peer": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "peer": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "peer": true, - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-codec/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "peer": true, - "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "peer": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", - "peer": true, - "dependencies": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "peer": true, - "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "peer": true, - "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levelup/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "peer": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "peer": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "peer": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "peer": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memdown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "peer": true - }, - "node_modules/memdown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", - "peer": true, - "dependencies": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" - } - }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "peer": true - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "peer": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "peer": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dependencies": { - "obliterator": "^2.0.0" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "engines": { - "node": ">=12.19" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "peer": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "peer": true, - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "peer": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "peer": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "peer": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "peer": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "peer": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "peer": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "peer": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "peer": true - }, - "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "peer": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "peer": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "peer": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "peer": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "peer": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "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.", - "peer": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "peer": true - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "dependencies": { - "bn.js": "^4.11.1" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/rlp/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "peer": true - }, - "node_modules/semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", - "peer": true, - "engines": { - "node": ">=4.1" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "peer": true - }, - "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/solc": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", - "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", - "peer": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solidity-ast": { - "version": "0.4.55", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.55.tgz", - "integrity": "sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA==", - "dependencies": { - "array.prototype.findlast": "^1.2.2" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", - "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", - "peer": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "peer": true - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "peer": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "peer": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "peer": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "peer": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "peer": true, - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", - "dependencies": { - "array-back": "^1.0.3", - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/test-value/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", - "peer": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "peer": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-command-line-args/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-command-line-args/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-command-line-args/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/ts-command-line-args/node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "peer": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ts-command-line-args/node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "peer": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ts-command-line-args/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-command-line-args/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-command-line-args/node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-essentials": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", - "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==" - }, - "node_modules/ts-generator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", - "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", - "dependencies": { - "@types/mkdirp": "^0.5.2", - "@types/prettier": "^2.1.1", - "@types/resolve": "^0.0.8", - "chalk": "^2.4.1", - "glob": "^7.1.2", - "mkdirp": "^0.5.1", - "prettier": "^2.1.2", - "resolve": "^1.8.1", - "ts-essentials": "^1.0.0" - }, - "bin": { - "ts-generator": "dist/cli/run.js" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "peer": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typechain": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-4.0.3.tgz", - "integrity": "sha512-tmoHQeXZWHxIdeLK+i6dU0CU0vOd9Cndr3jFTZIMzak5/YpFZ8XoiYpTZcngygGBqZo+Z1EUmttLbW9KkFZLgQ==", - "dependencies": { - "command-line-args": "^4.0.7", - "debug": "^4.1.1", - "fs-extra": "^7.0.0", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1", - "ts-generator": "^0.1.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - } - }, - "node_modules/typechain/node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "peer": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "peer": true - }, - "node_modules/url/node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "peer": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "peer": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/web3-utils": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz", - "integrity": "sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==", - "peer": true, - "dependencies": { - "@ethereumjs/util": "^8.1.0", - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereum-cryptography": "^2.1.2", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", - "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", - "peer": true, - "dependencies": { - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@scure/bip32": "1.3.3", - "@scure/bip39": "1.2.2" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "peer": true - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "peer": true, - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "peer": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "peer": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", - "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", - "requires": { - "@aws-crypto/util": "^1.2.2", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" - } - }, - "@aws-crypto/util": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", - "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", - "requires": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "@aws-sdk/types": { - "version": "3.496.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.496.0.tgz", - "integrity": "sha512-umkGadK4QuNQaMoDICMm7NKRI/mYSXiyPjcn3d53BhsuArYU/52CebGQKdt4At7SwwsiVJZw9RNBHyN5Mm0HVw==", - "requires": { - "@smithy/types": "^2.9.1", - "tslib": "^2.5.0" - }, - "dependencies": { - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - } - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "requires": { - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - } - } - }, - "@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" - }, - "@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "peer": true, - "requires": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "peer": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "peer": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "peer": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "peer": true - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "peer": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "peer": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "peer": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "peer": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", - "peer": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true - }, - "solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "peer": true, - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "peer": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "peer": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "peer": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "peer": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "peer": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "peer": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - } - } - }, - "@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "peer": true - }, - "@ethereum-waffle/chai": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", - "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", - "peer": true, - "requires": { - "@ethereum-waffle/provider": "4.0.5", - "debug": "^4.3.4", - "json-bigint": "^1.0.0" - } - }, - "@ethereum-waffle/ens": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", - "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", - "peer": true, - "requires": {} - }, - "@ethereum-waffle/mock-contract": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", - "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", - "peer": true, - "requires": {} - }, - "@ethereum-waffle/provider": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", - "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", - "peer": true, - "requires": { - "@ethereum-waffle/ens": "4.0.3", - "@ganache/ethereum-options": "0.1.4", - "debug": "^4.3.4", - "ganache": "7.4.3" - } - }, - "@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "peer": true, - "requires": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "peer": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "peer": true, - "requires": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - } - } - }, - "@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "peer": true, - "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "peer": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - } - } - }, - "@ethereumjs/common": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", - "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", - "peer": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.3" - } - }, - "@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", - "peer": true, - "requires": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" - } - }, - "@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "peer": true - }, - "@ethereumjs/tx": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", - "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", - "peer": true, - "requires": { - "@ethereumjs/common": "^2.6.0", - "ethereumjs-util": "^7.1.3" - } - }, - "@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "peer": true, - "requires": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", - "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", - "peer": true, - "requires": { - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@scure/bip32": "1.3.3", - "@scure/bip39": "1.2.2" - } - } - } - }, - "@ethereumjs/vm": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", - "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", - "peer": true, - "requires": { - "@ethereumjs/block": "^3.6.0", - "@ethereumjs/blockchain": "^5.5.0", - "@ethereumjs/common": "^2.6.0", - "@ethereumjs/tx": "^3.4.0", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^2.2.0", - "ethereumjs-util": "^7.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.2", - "rustbn.js": "~0.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - } - } - }, - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==" - }, - "@ganache/ethereum-address": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", - "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", - "peer": true, - "requires": { - "@ganache/utils": "0.1.4" - } - }, - "@ganache/ethereum-options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", - "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", - "peer": true, - "requires": { - "@ganache/ethereum-address": "0.1.4", - "@ganache/ethereum-utils": "0.1.4", - "@ganache/options": "0.1.4", - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "@ganache/ethereum-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", - "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", - "peer": true, - "requires": { - "@ethereumjs/common": "2.6.0", - "@ethereumjs/tx": "3.4.0", - "@ethereumjs/vm": "5.6.0", - "@ganache/ethereum-address": "0.1.4", - "@ganache/rlp": "0.1.4", - "@ganache/utils": "0.1.4", - "emittery": "0.10.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-util": "7.1.3" - }, - "dependencies": { - "ethereumjs-util": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", - "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", - "peer": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - } - } - }, - "@ganache/options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", - "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", - "peer": true, - "requires": { - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "@ganache/rlp": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", - "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", - "peer": true, - "requires": { - "@ganache/utils": "0.1.4", - "rlp": "2.2.6" - } - }, - "@ganache/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", - "peer": true, - "requires": { - "@trufflesuite/bigint-buffer": "1.1.9", - "emittery": "0.10.0", - "keccak": "3.0.1", - "seedrandom": "3.0.5" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "devOptional": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "devOptional": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "peer": true, - "requires": { - "@noble/hashes": "1.3.3" - } - }, - "@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "peer": true - }, - "@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" - }, - "@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - } - }, - "@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - } - }, - "@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", - "requires": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" - } - }, - "@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "requires": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==" - }, - "@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", - "requires": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - } - }, - "@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", - "requires": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", - "requires": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - } - } - }, - "@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "requires": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "optional": true - }, - "@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "requires": {} - }, - "@nomiclabs/hardhat-etherscan": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz", - "integrity": "sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==", - "peer": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - } - }, - "@nomiclabs/hardhat-waffle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz", - "integrity": "sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==", - "requires": {} - }, - "@openzeppelin/contracts": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", - "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" - }, - "@openzeppelin/contracts-upgradeable": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz", - "integrity": "sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg==" - }, - "@openzeppelin/defender-base-client": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz", - "integrity": "sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw==", - "requires": { - "amazon-cognito-identity-js": "^6.0.1", - "async-retry": "^1.3.3", - "axios": "^1.4.0", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" - } - }, - "@openzeppelin/hardhat-upgrades": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.28.0.tgz", - "integrity": "sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==", - "requires": { - "@openzeppelin/defender-base-client": "^1.46.0", - "@openzeppelin/platform-deploy-client": "^0.8.0", - "@openzeppelin/upgrades-core": "^1.27.0", - "chalk": "^4.1.0", - "debug": "^4.1.1", - "proper-lockfile": "^4.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@openzeppelin/platform-deploy-client": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.8.0.tgz", - "integrity": "sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==", - "requires": { - "@ethersproject/abi": "^5.6.3", - "@openzeppelin/defender-base-client": "^1.46.0", - "axios": "^0.21.2", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - } - } - }, - "@openzeppelin/upgrades-core": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.32.3.tgz", - "integrity": "sha512-v04RbrBOTRiIhfkTRfY4M34I2wIcuz+K1cUk/6duulsMXvRpM6/IPWeXh+1Xr1K+xedJi7gcS/pNSXfYhYNXIg==", - "requires": { - "cbor": "^9.0.0", - "chalk": "^4.1.0", - "compare-versions": "^6.0.0", - "debug": "^4.1.1", - "ethereumjs-util": "^7.0.3", - "minimist": "^1.2.7", - "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.51" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "cbor": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", - "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", - "requires": { - "nofilter": "^3.1.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@resolver-engine/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", - "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", - "peer": true, - "requires": { - "debug": "^3.1.0", - "is-url": "^1.2.4", - "request": "^2.85.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@resolver-engine/fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", - "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", - "peer": true, - "requires": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@resolver-engine/imports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", - "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", - "peer": true, - "requires": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0", - "path-browserify": "^1.0.0", - "url": "^0.11.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@resolver-engine/imports-fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", - "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", - "peer": true, - "requires": { - "@resolver-engine/fs": "^0.3.3", - "@resolver-engine/imports": "^0.3.3", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==" - }, - "@scure/bip32": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", - "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", - "peer": true, - "requires": { - "@noble/curves": "~1.3.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - } - }, - "@scure/bip39": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", - "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", - "peer": true, - "requires": { - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - } - }, - "@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "requires": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "requires": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - } - }, - "@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==" - }, - "@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "requires": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@smithy/types": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.1.tgz", - "integrity": "sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==", - "requires": { - "tslib": "^2.5.0" - }, - "dependencies": { - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - } - } - }, - "@trufflesuite/bigint-buffer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", - "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "4.3.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true - }, - "@typechain/ethers-v5": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-5.0.0.tgz", - "integrity": "sha512-SnLnq6BCq2NBgm5xsQP8kRIawJ7gppLux8EOMb2ceoB5EuoW87AOyi6r1J5LTYe65/J59HjOVtaGCqsO+38Xrw==", - "requires": {} - }, - "@types/abstract-leveldown": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz", - "integrity": "sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==", - "peer": true - }, - "@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", - "requires": { - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "peer": true - }, - "@types/level-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.2.tgz", - "integrity": "sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==", - "peer": true - }, - "@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "peer": true, - "requires": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, - "@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" - }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "20.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", - "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "peer": true, - "requires": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", - "requires": { - "@types/node": "*" - } - }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - }, - "@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "requires": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", - "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", - "peer": true, - "requires": { - "@types/sinonjs__fake-timers": "*" - } - }, - "@types/sinon-chai": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", - "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", - "peer": true, - "requires": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "peer": true - }, - "abstract-level": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", - "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", - "requires": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "peer": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "devOptional": true - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "amazon-cognito-identity-js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz", - "integrity": "sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==", - "requires": { - "@aws-crypto/sha256-js": "1.2.2", - "buffer": "4.9.2", - "fast-base64-decode": "^1.0.0", - "isomorphic-unfetch": "^3.0.0", - "js-cookie": "^2.2.1" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "requires": { - "typical": "^2.6.1" - } - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array.prototype.findlast": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz", - "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "peer": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "peer": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "peer": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "peer": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "peer": true, - "requires": { - "async": "^2.4.0" - } - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "peer": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "peer": true - }, - "axios": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.6.tgz", - "integrity": "sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==", - "requires": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "peer": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "peer": true - } - } - }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==" - }, - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "peer": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "peer": true, - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "peer": true - } - } - }, - "blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "peer": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - } - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", - "peer": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "peer": true - }, - "catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==" - }, - "cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "peer": true, - "requires": { - "nofilter": "^3.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "classic-level": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", - "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "peer": true - }, - "color-convert": { + "node_modules/command-line-usage/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { + "license": "MIT", + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/command-line-usage/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" } }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "command-line-args": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", - "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", - "requires": { - "array-back": "^2.0.0", - "find-replace": "^1.0.3", - "typical": "^2.6.1" + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "peer": true, - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "peer": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "peer": true - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "peer": true + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - }, - "core-js-pure": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz", - "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==", - "peer": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "peer": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, - "create-hash": { + "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { + "license": "MIT", + "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", @@ -11298,11 +3006,12 @@ "sha.js": "^2.4.0" } }, - "create-hmac": { + "node_modules/create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { + "license": "MIT", + "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", @@ -11311,134 +3020,85 @@ "sha.js": "^2.4.8" } }, - "create-require": { + "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0" - } + "dev": true, + "license": "MIT" }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" - }, - "deep-extend": { + "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "peer": true - }, - "deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "peer": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "peer": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=4.0.0" } }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "peer": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", @@ -11446,186 +3106,128 @@ "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } } }, - "emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "peer": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "peer": true, - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - } + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" }, - "enquirer": { + "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "requires": { + "license": "MIT", + "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" } }, - "env-paths": { + "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "peer": true, - "requires": { - "prr": "~1.0.1" + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "peer": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - } - }, - "es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "requires": { - "hasown": "^2.0.0" + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "peer": true, - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "peer": true - } + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "peer": true, - "requires": { - "js-sha3": "^0.8.0" + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" } }, - "ethereum-cryptography": { + "node_modules/ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { + "license": "MIT", + "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", "blakejs": "^1.1.0", @@ -11643,3182 +3245,1295 @@ "setimmediate": "^1.0.5" } }, - "ethereum-waffle": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", - "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", - "peer": true, - "requires": { - "@ethereum-waffle/chai": "4.0.10", - "@ethereum-waffle/compiler": "4.0.3", - "@ethereum-waffle/mock-contract": "4.0.4", - "@ethereum-waffle/provider": "4.0.5", - "solc": "0.8.15", - "typechain": "^8.0.0" - }, - "dependencies": { - "@ethereum-waffle/compiler": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", - "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", - "peer": true, - "requires": { - "@resolver-engine/imports": "^0.3.3", - "@resolver-engine/imports-fs": "^0.3.3", - "@typechain/ethers-v5": "^10.0.0", - "@types/mkdirp": "^0.5.2", - "@types/node-fetch": "^2.6.1", - "mkdirp": "^0.5.1", - "node-fetch": "^2.6.7" - } - }, - "@typechain/ethers-v5": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", - "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", - "peer": true, - "requires": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "peer": true, - "requires": {} - }, - "typechain": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", - "peer": true, - "requires": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "peer": true - } - } - } - } - }, - "ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "ethereumjs-util": { + "node_modules/ethereumjs-util": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "requires": { + "license": "MPL-2.0", + "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", "create-hash": "^1.1.2", "ethereum-cryptography": "^0.1.3", "rlp": "^2.2.4" - } - }, - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "peer": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "peer": true - } + "engines": { + "node": ">=10.0.0" } }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, - "evp_bytestokey": { + "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { + "license": "MIT", + "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "peer": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "peer": true - }, - "fast-base64-decode": { + "node_modules/fast-base64-decode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "peer": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "peer": true + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "license": "MIT" }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "find-replace": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", - "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", - "requires": { - "array-back": "^1.0.4", - "test-value": "^2.1.0" - }, - "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "requires": { - "typical": "^2.6.0" - } + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "requires": { - "locate-path": "^2.0.0" + "node_modules/fast-xml-parser": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" } }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - }, - "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "peer": true + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "ganache": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", - "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", - "peer": true, - "requires": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "bufferutil": "4.0.5", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3", - "utf-8-validate": "5.0.7" - }, - "dependencies": { - "@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", - "bundled": true, - "peer": true, - "requires": { - "node-gyp-build": "4.4.0" - }, - "dependencies": { - "node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "bundled": true, - "peer": true - } - } - }, - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "bundled": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "bundled": true, - "peer": true - }, - "@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "bundled": true, - "peer": true - }, - "@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "bundled": true, - "peer": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "bundled": true, - "peer": true - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "bundled": true, - "peer": true - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "bundled": true, - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "bundled": true, - "peer": true, - "requires": { - "queue-tick": "^1.0.0" - } - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "bundled": true, - "peer": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "bundled": true, - "peer": true - } - } - }, - "emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "bundled": true, - "peer": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "bundled": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "bundled": true, - "peer": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "bundled": true, - "peer": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "bundled": true, - "peer": true - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "bundled": true, - "peer": true - }, - "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "bundled": true, - "peer": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "bundled": true, - "peer": true, - "requires": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "bundled": true, - "peer": true, - "requires": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - } - }, - "level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "bundled": true, - "peer": true, - "requires": { - "catering": "^2.1.0" - } - }, - "level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "bundled": true, - "peer": true - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "bundled": true, - "peer": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "bundled": true, - "peer": true - }, - "napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "bundled": true, - "peer": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "bundled": true, - "peer": true - }, - "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "bundled": true, - "peer": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "bundled": true, - "peer": true - }, - "queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "bundled": true, - "peer": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "bundled": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "bundled": true, - "peer": true - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "bundled": true, - "peer": true, - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "bundled": true, - "peer": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "bundled": true, - "peer": true - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "requires": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "get-symbol-description": { + "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0" + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "peer": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "peer": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true - } - } + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, - "hardhat": { - "version": "2.19.4", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.4.tgz", - "integrity": "sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ==", - "requires": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", + "node_modules/hardhat": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-3.4.5.tgz", + "integrity": "sha512-smx65ClZttrZRKqagNSDEAlQAyAxJhh+c+07NDdlGmNK6ccNeDE9DVLB6td+JiPB9VvWSEy0UDY4WiBA47WbpQ==", + "license": "MIT", + "dependencies": { + "@nomicfoundation/edr": "0.12.0-next.32", + "@nomicfoundation/hardhat-errors": "^3.0.12", + "@nomicfoundation/hardhat-utils": "^4.1.1", + "@nomicfoundation/hardhat-vendored": "^3.0.3", + "@nomicfoundation/hardhat-zod-utils": "^3.0.4", + "@nomicfoundation/solidity-analyzer": "^0.1.1", + "@sentry/core": "^9.4.0", "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", + "chokidar": "^4.0.3", "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "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.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==" - }, - "@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "requires": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "requires": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "requires": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - } + "ethereum-cryptography": "^2.2.1", + "micro-eth-signer": "^0.14.0", + "p-map": "^7.0.2", + "resolve.exports": "^2.0.3", + "semver": "^7.6.3", + "tsx": "^4.19.3", + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "bin": { + "hardhat": "dist/src/cli.js" } }, - "hardhat-typechain": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/hardhat-typechain/-/hardhat-typechain-0.3.5.tgz", - "integrity": "sha512-w9lm8sxqTJACY+V7vijiH+NkPExnmtiQEjsV9JKD1KgMdVk2q8y+RhvU/c4B7+7b1+HylRUCxpOIvFuB3rE4+w==", - "requires": {} + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "requires": { - "get-intrinsic": "^1.2.2" + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "hash.js": { + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { + "license": "MIT", + "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "requires": { + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hmac-drbg": { + "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { + "license": "MIT", + "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "peer": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { + "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { + "license": "MIT", + "dependencies": { "agent-base": "6", "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "peer": true, - "requires": { - "punycode": "2.1.0" - } - }, - "ieee754": { + "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "peer": true - }, - "immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "requires": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "peer": true - }, - "io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "requires": { - "fp-ts": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "peer": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "requires": { - "which-typed-array": "^1.1.11" + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "peer": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "peer": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "peer": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, - "isomorphic-unfetch": { + "node_modules/isomorphic-unfetch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "requires": { + "license": "MIT", + "dependencies": { "node-fetch": "^2.6.1", "unfetch": "^4.2.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "peer": true - }, - "js-cookie": { + "node_modules/js-cookie": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, - "js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==" + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "license": "MIT" }, - "js-sha3": { + "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "peer": true + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "peer": true, - "requires": { - "bignumber.js": "^9.0.0" + "node_modules/json-stream-stringify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "license": "MIT", + "engines": { + "node": ">=7.10.1" } }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "peer": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "peer": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "peer": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "requires": { + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "peer": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "requires": { + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "peer": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "requires": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - } - }, - "level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "peer": true, - "requires": { - "buffer": "^5.6.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "peer": true - }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "peer": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "peer": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - } - }, - "level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", - "peer": true, - "requires": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - } - }, - "level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "peer": true, - "requires": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - } - }, - "level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==" - }, - "level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "requires": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", - "peer": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "peer": true, - "requires": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "peer": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "peer": true + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, - "lodash.camelcase": { + "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "peer": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "peer": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } + "license": "MIT" }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "peer": true + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "dev": true, + "license": "ISC" }, - "mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==" + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "md5.js": { + "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { + "license": "MIT", + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "peer": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, + "node_modules/micro-eth-signer": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz", + "integrity": "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==", + "license": "MIT", "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "peer": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "peer": true - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "peer": true, - "requires": { - "xtend": "^4.0.2" - } - } + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "micro-packed": "~0.7.2" } }, - "memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "requires": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" - }, - "merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", - "peer": true, - "requires": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" - } - }, - "micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "peer": true - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "peer": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "node_modules/micro-eth-signer/node_modules/@noble/curves": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.2" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-packed": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", + "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "license": "MIT", "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "peer": true - } + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "license": "MIT", + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "minimalistic-assert": { + "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, - "minimalistic-crypto-utils": { + "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "requires": { - "obliterator": "^2.0.0" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "node-addon-api": { + "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" }, - "node-fetch": { + "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { + "license": "MIT", + "dependencies": { "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" - }, - "nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "peer": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "peer": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "peer": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "peer": true + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true } } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "peer": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "license": "MIT", + "engines": { + "node": ">=12.19" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { + "license": "ISC", + "dependencies": { "wrappy": "1" } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "peer": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "peer": true, - "requires": { - "error-ex": "^1.2.0" + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "peer": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "peer": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.10" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "peer": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "peer": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "peer": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "peer": true, - "requires": { - "pinkie": "^2.0.0" + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "prettier": { + "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, - "proper-lockfile": { + "node_modules/proper-lockfile": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "requires": { + "license": "MIT", + "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" - } } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "peer": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "peer": true + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "punycode": { + "node_modules/proxy-from-env": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "peer": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "peer": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "randombytes": { + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { + "license": "MIT", + "dependencies": { "safe-buffer": "^5.1.0" } }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "peer": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "peer": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "peer": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "peer": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { + "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { + "license": "MIT", + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "reduce-flatten": { + "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "peer": true - }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "peer": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "peer": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "peer": true - } + "license": "MIT", + "engines": { + "node": ">=6" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "peer": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" } }, - "retry": { + "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" }, - "rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "requires": { - "bn.js": "^4.11.1" - }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "license": "MIT", "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "requires": { - "queue-microtask": "^1.2.2" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" } }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "scrypt-js": { + "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "node_modules/secp256k1": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "peer": true - }, - "semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", - "peer": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "peer": true - }, - "set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "requires": { - "define-data-property": "^1.1.1", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - } - }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "setimmediate": { + "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - } - } - }, - "solc": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", - "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", - "peer": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true - } - } - }, - "solidity-ast": { - "version": "0.4.55", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.55.tgz", - "integrity": "sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA==", - "requires": { - "array.prototype.findlast": "^1.2.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "peer": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, - "spdx-exceptions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", - "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", - "peer": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "peer": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "peer": true - }, - "sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "peer": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "peer": true - } - } - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "node_modules/solidity-ast": { + "version": "0.4.62", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.62.tgz", + "integrity": "sha512-jSC7msQCkJXIzM8LlDjRZ5cif5w40g6THlXHFk3zchbL5dm3YLoBETvqPGo5KndYkftjhcs5kz1fnTu4d34lVQ==", + "license": "MIT" }, - "string_decoder": { + "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { + "license": "MIT", + "dependencies": { "safe-buffer": "~5.2.0" } }, - "string-format": { + "node_modules/string-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "peer": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } + "license": "WTFPL OR MIT" }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { + "license": "MIT", + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "peer": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } + "node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "peer": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "table-layout": { + "node_modules/table-layout": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "peer": true, - "requires": { + "license": "MIT", + "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", "typical": "^5.2.0", "wordwrapjs": "^4.0.0" }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "peer": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "peer": true - } - } - }, - "test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", - "requires": { - "array-back": "^1.0.3", - "typical": "^2.6.0" - }, - "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "requires": { - "typical": "^2.6.0" - } - } + "engines": { + "node": ">=8.0.0" } }, - "testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "peer": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "peer": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", "dependencies": { - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "peer": true - } + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" } }, - "tr46": { + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, - "ts-command-line-args": { + "node_modules/ts-command-line-args": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "peer": true, - "requires": { + "license": "ISC", + "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-usage": "^6.1.0", "string-format": "^2.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "peer": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "peer": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "peer": true, - "requires": { - "array-back": "^3.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "peer": true - } + "bin": { + "write-markdown": "dist/write-markdown.js" } }, - "ts-essentials": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", - "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==" - }, - "ts-generator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", - "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", - "requires": { - "@types/mkdirp": "^0.5.2", - "@types/prettier": "^2.1.1", - "@types/resolve": "^0.0.8", - "chalk": "^2.4.1", - "glob": "^7.1.2", - "mkdirp": "^0.5.1", - "prettier": "^2.1.2", - "resolve": "^1.8.1", - "ts-essentials": "^1.0.0" + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=3.7.0" } }, - "ts-node": { + "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", @@ -14833,445 +4548,360 @@ "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true } } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "peer": true, - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.3.tgz", + "integrity": "sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } }, - "typechain": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-4.0.3.tgz", - "integrity": "sha512-tmoHQeXZWHxIdeLK+i6dU0CU0vOd9Cndr3jFTZIMzak5/YpFZ8XoiYpTZcngygGBqZo+Z1EUmttLbW9KkFZLgQ==", - "requires": { - "command-line-args": "^4.0.7", - "debug": "^4.1.1", + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "license": "MIT", + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", "fs-extra": "^7.0.0", + "glob": "7.1.7", "js-sha3": "^0.8.0", "lodash": "^4.17.15", - "ts-essentials": "^7.0.1", - "ts-generator": "^0.1.1" + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", "dependencies": { - "ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "requires": {} - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" } }, - "typescript": { + "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - }, - "typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==" + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "requires": { - "@fastify/busboy": "^2.0.0" + "node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "license": "MIT", + "engines": { + "node": ">=18.17" } }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "node_modules/undici-types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.21.0.tgz", + "integrity": "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==", + "license": "MIT" }, - "unfetch": { + "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "peer": true, - "requires": { - "punycode": "^2.1.0" - } + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", + "license": "MIT" }, - "url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "peer": true, - "requires": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "peer": true - }, - "qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "peer": true, - "requires": { - "side-channel": "^1.0.4" - } - } + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "peer": true - }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, - "v8-compile-cache-lib": { + "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "peer": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "web3-utils": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz", - "integrity": "sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==", - "peer": true, - "requires": { - "@ethereumjs/util": "^8.1.0", - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereum-cryptography": "^2.1.2", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", - "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", - "peer": true, - "requires": { - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@scure/bip32": "1.3.3", - "@scure/bip39": "1.2.2" - } - } - } + "dev": true, + "license": "MIT" }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { + "license": "MIT", + "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "peer": true - }, - "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "peer": true - }, - "wordwrapjs": { + "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "peer": true, - "requires": { + "license": "MIT", + "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "peer": true - } + "engines": { + "node": ">=8.0.0" } }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "peer": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/tests/integration_tests/hardhat/package.json b/tests/integration_tests/hardhat/package.json index 9ec406a480..eb93fe5974 100644 --- a/tests/integration_tests/hardhat/package.json +++ b/tests/integration_tests/hardhat/package.json @@ -10,16 +10,15 @@ "author": "", "license": "ISC", "dependencies": { - "@nomiclabs/hardhat-waffle": "^2.0.3", "@openzeppelin/contracts": "^4.8.0", - "@nomiclabs/hardhat-ethers": "^2.2.1", - "@openzeppelin/hardhat-upgrades": "^1.21.0", "@openzeppelin/contracts-upgradeable": "^4.3.1", - "@typechain/ethers-v5": "^5.0.0", - "hardhat": "^2.10.1", - "hardhat-typechain": "^0.3.5", - "ts-generator": "^0.1.1", - "typechain": "^4.0.3" + "@openzeppelin/hardhat-upgrades": "^3.9.1", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", + "ethers": "^6.14.0", + "hardhat": "^2.22.0", + "typechain": "^8.3.2" }, "devDependencies": { "ts-node": "^10.9.1", diff --git a/tests/integration_tests/network.py b/tests/integration_tests/network.py index 1552faa7d1..3995dd61d6 100644 --- a/tests/integration_tests/network.py +++ b/tests/integration_tests/network.py @@ -6,7 +6,7 @@ import web3 from pystarport import ports -from web3.middleware import geth_poa_middleware +from web3.middleware import ExtraDataToPOAMiddleware from .cosmoscli import CosmosCLI from .utils import supervisorctl, w3_wait_for_block, wait_for_port @@ -41,7 +41,7 @@ def w3(self, i=0): if self._w3 is None: if self._use_websockets: self._w3 = web3.Web3( - web3.providers.WebsocketProvider(self.w3_ws_endpoint) + web3.providers.LegacyWebSocketProvider(self.w3_ws_endpoint) ) else: self._w3 = web3.Web3(web3.providers.HTTPProvider(self.w3_http_endpoint)) @@ -104,7 +104,7 @@ def setup_geth(path, base_port): try: wait_for_port(base_port) w3 = web3.Web3(web3.providers.HTTPProvider(f"http://127.0.0.1:{base_port}")) - w3.middleware_onion.inject(geth_poa_middleware, layer=0) + w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) yield Geth(w3) finally: os.killpg(os.getpgid(proc.pid), signal.SIGTERM) diff --git a/tests/integration_tests/poetry.lock b/tests/integration_tests/poetry.lock index eec61d6f31..065ba5e5ba 100644 --- a/tests/integration_tests/poetry.lock +++ b/tests/integration_tests/poetry.lock @@ -1,114 +1,187 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, + {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, +] [[package]] name = "aiohttp" -version = "3.9.3" +version = "3.13.3" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, - {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, - {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, - {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, - {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, - {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, - {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, - {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, - {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, - {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, - {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, - {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821"}, + {file = "aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455"}, + {file = "aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29"}, + {file = "aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11"}, + {file = "aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd"}, + {file = "aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64"}, + {file = "aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1"}, + {file = "aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4"}, + {file = "aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29"}, + {file = "aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239"}, + {file = "aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168"}, + {file = "aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc"}, + {file = "aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce"}, + {file = "aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a"}, + {file = "aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046"}, + {file = "aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9"}, + {file = "aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0"}, + {file = "aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591"}, + {file = "aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf"}, + {file = "aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415"}, + {file = "aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1"}, + {file = "aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c"}, + {file = "aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43"}, + {file = "aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1"}, + {file = "aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592"}, + {file = "aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8"}, + {file = "aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df"}, + {file = "aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767"}, + {file = "aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31a83ea4aead760dfcb6962efb1d861db48c34379f2ff72db9ddddd4cda9ea2e"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:988a8c5e317544fdf0d39871559e67b6341065b87fceac641108c2096d5506b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b174f267b5cfb9a7dba9ee6859cecd234e9a681841eb85068059bc867fb8f02"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:947c26539750deeaee933b000fb6517cc770bbd064bad6033f1cff4803881e43"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9ebf57d09e131f5323464bd347135a88622d1c0976e88ce15b670e7ad57e4bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4ae5b5a0e1926e504c81c5b84353e7a5516d8778fbbff00429fe7b05bb25cbce"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2ba0eea45eb5cc3172dbfc497c066f19c41bac70963ea1a67d51fc92e4cf9a80"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bae5c2ed2eae26cc382020edad80d01f36cb8e746da40b292e68fec40421dc6a"}, + {file = "aiohttp-3.13.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a60e60746623925eab7d25823329941aee7242d559baa119ca2b253c88a7bd6"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e50a2e1404f063427c9d027378472316201a2290959a295169bcf25992d04558"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:9a9dc347e5a3dc7dfdbc1f82da0ef29e388ddb2ed281bfce9dd8248a313e62b7"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b46020d11d23fe16551466c77823df9cc2f2c1e63cc965daf67fa5eec6ca1877"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:69c56fbc1993fa17043e24a546959c0178fe2b5782405ad4559e6c13975c15e3"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b99281b0704c103d4e11e72a76f1b543d4946fea7dd10767e7e1b5f00d4e5704"}, + {file = "aiohttp-3.13.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:40c5e40ecc29ba010656c18052b877a1c28f84344825efa106705e835c28530f"}, + {file = "aiohttp-3.13.3-cp39-cp39-win32.whl", hash = "sha256:56339a36b9f1fc708260c76c87e593e2afb30d26de9ae1eb445b5e051b98a7a1"}, + {file = "aiohttp-3.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:c6b8568a3bb5819a0ad087f16d40e5a3fb6099f39ea1d5625a3edc1e923fc538"}, + {file = "aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88"}, ] [package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +aiohappyeyeballs = ">=2.5.0" +aiosignal = ">=1.4.0" +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] [[package]] name = "aiosignal" -version = "1.3.1" +version = "1.4.0" description = "aiosignal: a list of registered asynchronous callbacks" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, + {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, + {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, ] [package.dependencies] frozenlist = ">=1.1.0" +typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] [[package]] name = "async-timeout" @@ -116,6 +189,8 @@ version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, @@ -127,6 +202,7 @@ version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -137,8 +213,8 @@ cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6) ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.8\""] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "bech32" @@ -146,6 +222,7 @@ version = "1.2.0" description = "Reference implementation for Bech32 and segwit addresses." optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "bech32-1.2.0-py3-none-any.whl", hash = "sha256:990dc8e5a5e4feabbdf55207b5315fdd9b73db40be294a19b3752cde9e79d981"}, {file = "bech32-1.2.0.tar.gz", hash = "sha256:7d6db8214603bd7871fcfa6c0826ef68b85b0abd90fa21c285a9c5e21d2bd899"}, @@ -157,6 +234,7 @@ version = "2.9.2" description = "efficient arrays of booleans -- C extension" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "bitarray-2.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:917905de565d9576eb20f53c797c15ba88b9f4f19728acabec8d01eee1d3756a"}, {file = "bitarray-2.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b35bfcb08b7693ab4bf9059111a6e9f14e07d57ac93cd967c420db58ab9b71e1"}, @@ -284,33 +362,34 @@ files = [ [[package]] name = "black" -version = "24.2.0" +version = "24.3.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" -files = [ - {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, - {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, - {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, - {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, - {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, - {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, - {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, - {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, - {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, - {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, - {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, - {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, - {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, - {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, - {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, - {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, - {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, - {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, - {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, - {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, - {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, - {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, +groups = ["main"] +files = [ + {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, + {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, + {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, + {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, + {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, + {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, + {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, + {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, + {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, + {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, + {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, + {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, + {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, + {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, + {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, + {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, + {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, + {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, + {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, + {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, + {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, + {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, ] [package.dependencies] @@ -324,7 +403,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -334,6 +413,7 @@ version = "23.2.3" description = "Composable complex class support for attrs and dataclasses." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108"}, {file = "cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f"}, @@ -348,7 +428,7 @@ typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_ver bson = ["pymongo (>=4.4.0)"] cbor2 = ["cbor2 (>=5.4.6)"] msgpack = ["msgpack (>=1.0.5)"] -orjson = ["orjson (>=3.9.2)"] +orjson = ["orjson (>=3.9.2) ; implementation_name == \"cpython\""] pyyaml = ["pyyaml (>=6.0)"] tomlkit = ["tomlkit (>=0.11.8)"] ujson = ["ujson (>=5.7.0)"] @@ -359,6 +439,7 @@ version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, @@ -370,6 +451,7 @@ version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, @@ -463,12 +545,123 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "ckzg" +version = "2.1.1" +description = "Python bindings for C-KZG-4844" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "ckzg-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b9825a1458219e8b4b023012b8ef027ef1f47e903f9541cbca4615f80132730"}, + {file = "ckzg-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2a40a3ba65cca4b52825d26829e6f7eb464aa27a9e9efb6b8b2ce183442c741"}, + {file = "ckzg-2.1.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1d753fbe85be7c21602eddc2d40e0915e25fce10329f4f801a0002a4f886cc7"}, + {file = "ckzg-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d76b50527f1d12430bf118aff6fa4051e9860eada43f29177258b8d399448ea"}, + {file = "ckzg-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44c8603e43c021d100f355f50189183135d1df3cbbddb8881552d57fbf421dde"}, + {file = "ckzg-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:38707a638c9d715b3c30b29352b969f78d8fc10faed7db5faf517f04359895c0"}, + {file = "ckzg-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:52c4d257bdcbe822d20c5cd24c8154ec5aac33c49a8f5a19e716d9107a1c8785"}, + {file = "ckzg-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1507f7bfb9bcf51d816db5d8d0f0ed53c8289605137820d437b69daea8333e16"}, + {file = "ckzg-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d02eaaf4f841910133552b3a051dea53bcfe60cd98199fc4cf80b27609d8baa2"}, + {file = "ckzg-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:465e2b71cf9dc383f66f1979269420a0da9274a3a9e98b1a4455e84927dfe491"}, + {file = "ckzg-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ee2f26f17a64ad0aab833d637b276f28486b82a29e34f32cf54b237b8f8ab72d"}, + {file = "ckzg-2.1.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99cc2c4e9fb8c62e3e0862c7f4df9142f07ba640da17fded5f6e0fd09f75909f"}, + {file = "ckzg-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773dd016693d74aca1f5d7982db2bad7dde2e147563aeb16a783f7e5f69c01fe"}, + {file = "ckzg-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af2b2144f87ba218d8db01382a961b3ecbdde5ede4fa0d9428d35f8c8a595ba"}, + {file = "ckzg-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f55e63d3f7c934a2cb53728ed1d815479e177aca8c84efe991c2920977cff6"}, + {file = "ckzg-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ecb42aaa0ffa427ff14a9dde9356ba69e5ae6014650b397af55b31bdae7a9b6e"}, + {file = "ckzg-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a01514239f12fb1a7ad9009c20062a4496e13b09541c1a65f97e295da648c70"}, + {file = "ckzg-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:6516b9684aae262c85cf7fddd8b585b8139ad20e08ec03994e219663abbb0916"}, + {file = "ckzg-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c60e8903344ce98ce036f0fabacce952abb714cad4607198b2f0961c28b8aa72"}, + {file = "ckzg-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4299149dd72448e5a8d2d1cc6cc7472c92fc9d9f00b1377f5b017c089d9cd92"}, + {file = "ckzg-2.1.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:025dd31ffdcc799f3ff842570a2a6683b6c5b01567da0109c0c05d11768729c4"}, + {file = "ckzg-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b42ab8385c273f40a693657c09d2bba40cb4f4666141e263906ba2e519e80bd"}, + {file = "ckzg-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be3890fc1543f4fcfc0063e4baf5c036eb14bcf736dabdc6171ab017e0f1671"}, + {file = "ckzg-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b754210ded172968b201e2d7252573af6bf52d6ad127ddd13d0b9a45a51dae7b"}, + {file = "ckzg-2.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2f8fda87865897a269c4e951e3826c2e814427a6cdfed6731cccfe548f12b36"}, + {file = "ckzg-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98e70b5923d77c7359432490145e9d1ab0bf873eb5de56ec53f4a551d7eaec79"}, + {file = "ckzg-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:42af7bde4ca45469cd93a96c3d15d69d51d40e7f0d30e3a20711ebd639465fcb"}, + {file = "ckzg-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e4edfdaf87825ff43b9885fabfdea408737a714f4ce5467100d9d1d0a03b673"}, + {file = "ckzg-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:815fd2a87d6d6c57d669fda30c150bc9bf387d47e67d84535aa42b909fdc28ea"}, + {file = "ckzg-2.1.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32466e809b1ab3ff01d3b0bb0b9912f61dcf72957885615595f75e3f7cc10e5"}, + {file = "ckzg-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11b73ccf37b12993f39a7dbace159c6d580aacacde6ee17282848476550ddbc"}, + {file = "ckzg-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3b9433a1f2604bd9ac1646d3c83ad84a850d454d3ac589fe8e70c94b38a6b0"}, + {file = "ckzg-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b7d7e1b5ea06234558cd95c483666fd785a629b720a7f1622b3cbffebdc62033"}, + {file = "ckzg-2.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9f5556e6675866040cc4335907be6c537051e7f668da289fa660fdd8a30c9ddb"}, + {file = "ckzg-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55b2ba30c5c9daac0c55f1aac851f1b7bf1f7aa0028c2db4440e963dd5b866d6"}, + {file = "ckzg-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:10d201601fc8f28c0e8cec3406676797024dd374c367bbeec5a7a9eac9147237"}, + {file = "ckzg-2.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5f46c8fd5914db62b446baf62c8599da07e6f91335779a9709c554ef300a7b60"}, + {file = "ckzg-2.1.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60f14612c2be84f405755d734b0ad4e445db8af357378b95b72339b59e1f4fcf"}, + {file = "ckzg-2.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:929e6e793039f42325988004a90d16b0ef4fc7e1330142e180f0298f2ed4527c"}, + {file = "ckzg-2.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2beac2af53ea181118179570ecc81d8a8fc52c529553d7fd8786fd100a2aa39b"}, + {file = "ckzg-2.1.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:2432d48aec296baee79556bfde3bddd2799bcc7753cd1f0d0c9a3b0333935637"}, + {file = "ckzg-2.1.1-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4c2e8180b54261ccae2bf8acd003ccee7394d88d073271af19c5f2ac4a54c607"}, + {file = "ckzg-2.1.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:c44e36bd53d9dd0ab29bd6ed2d67ea43c48eecd57f8197854a75742213938bf5"}, + {file = "ckzg-2.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:10befd86e643d38ac468151cdfb71e79b2d46aa6397b81db4224f4f6995262eb"}, + {file = "ckzg-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:138a9324ad8e8a9ade464043dc3a84afe12996516788f2ed841bdbe5d123af81"}, + {file = "ckzg-2.1.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:635af0a33a10c9ac275f3efc142880a6b46ac63f4495f600aae05266af4fadff"}, + {file = "ckzg-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:360e263677ee5aedb279b42cf54b51c905ddcac9181c65d89ec0b298d3f31ec0"}, + {file = "ckzg-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f81395f77bfd069831cbb1de9d473c7044abe9ce6cd562ef6ccd76d23abcef43"}, + {file = "ckzg-2.1.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:db1ff122f8dc10c9500a00a4d680c3c38f4e19b01d95f38e0f5bc55a77c8ab98"}, + {file = "ckzg-2.1.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:1f82f539949ff3c6a5accfdd211919a3e374d354b3665d062395ebdbf8befaeb"}, + {file = "ckzg-2.1.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:5bc8ae85df97467e84abb491b516e25dbca36079e766eafce94d1bc45e4aaa35"}, + {file = "ckzg-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e749ce9fcb26e37101f2af8ba9c6376b66eb598880d35e457890044ba77c1cf7"}, + {file = "ckzg-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b00201979a64fd7e6029f64d791af42374febb42452537933e881b49d4e8c77"}, + {file = "ckzg-2.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c61c437ba714ab7c802b51fb30125e8f8550e1320fe9050d20777420c153a2b3"}, + {file = "ckzg-2.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bd54394376598a7c081df009cfde3cc447beb640b6c6b7534582a31e6290ac7"}, + {file = "ckzg-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67d8c6680a7b370718af59cc17a983752706407cfbcace013ee707646d1f7b00"}, + {file = "ckzg-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f6c57b24bc4fe16b1b50324ef8548f2a5053ad76bf90c618e2f88c040120d7"}, + {file = "ckzg-2.1.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f55fc10fb1b217c66bfe14e05535e5e61cfbb2a95dbb9b93a80984fa2ab4a7c0"}, + {file = "ckzg-2.1.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2e23e3198f8933f0140ef8b2aeba717d8de03ec7b8fb1ee946f8d39986ce0811"}, + {file = "ckzg-2.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2f9caf88bf216756bb1361b92616c750a933c9afb67972ad05c212649a9be520"}, + {file = "ckzg-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:30e0c2d258bbc0c099c2d1854c6ffa2fd9abf6138b9c81f855e1936f6cb259aa"}, + {file = "ckzg-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6239d3d2e30cb894ca4e7765b1097eb6a70c0ecbe5f8e0b023fbf059472d4ac"}, + {file = "ckzg-2.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:909ebabc253a98d9dc1d51f93dc75990134bfe296c947e1ecf3b7142aba5108e"}, + {file = "ckzg-2.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0700dace6559b288b42ca8622be89c2a43509881ed6f4f0bfb6312bcceed0cb9"}, + {file = "ckzg-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a36aeabd243e906314694b4a107de99b0c4473ff1825fcb06acd147ffb1951a"}, + {file = "ckzg-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d884e8f9c7d7839f1a95561f4479096dce21d45b0c5dd013dc0842550cea1cad"}, + {file = "ckzg-2.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:338fdf4a0b463973fc7b7e4dc289739db929e61d7cb9ba984ebbe9c49d3aa6f9"}, + {file = "ckzg-2.1.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c594036d3408eebdcd8ab2c7aab7308239ed4df3d94f3211b7cf253f228fb0b7"}, + {file = "ckzg-2.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b0912ebb328ced510250a2325b095917db19c1a014792a0bf4c389f0493e39de"}, + {file = "ckzg-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:5046aceb03482ddf7200f2f5c643787b100e6fb96919852faf1c79f8870c80a1"}, + {file = "ckzg-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:375918e25eafb9bafe5215ab91698504cba3fe51b4fe92f5896af6c5663f50c6"}, + {file = "ckzg-2.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:38b3b7802c76d4ad015db2b7a79a49c193babae50ee5f77e9ac2865c9e9ddb09"}, + {file = "ckzg-2.1.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438a5009fd254ace0bc1ad974d524547f1a41e6aa5e778c5cd41f4ee3106bcd6"}, + {file = "ckzg-2.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ce11cc163a2e0dab3af7455aca7053f9d5bb8d157f231acc7665fd230565d48"}, + {file = "ckzg-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b53964c07f6a076e97eaa1ef35045e935d7040aff14f80bae7e9105717702d05"}, + {file = "ckzg-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cf085f15ae52ab2599c9b5a3d5842794bcf5613b7f58661fbfb0c5d9eac988b9"}, + {file = "ckzg-2.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4b0c850bd6cad22ac79b2a2ab884e0e7cd2b54a67d643cd616c145ebdb535a11"}, + {file = "ckzg-2.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:26951f36bb60c9150bbd38110f5e1625596f9779dad54d1d492d8ec38bc84e3a"}, + {file = "ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe12445e49c4bee67746b7b958e90a973b0de116d0390749b0df351d94e9a8c"}, + {file = "ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c5d4f66f09de4a99271acac74d2acb3559a77de77a366b34a91e99e8822667"}, + {file = "ckzg-2.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42673c1d007372a4e8b48f6ef8f0ce31a9688a463317a98539757d1e2fb1ecc7"}, + {file = "ckzg-2.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:57a7dc41ec6b69c1d9117eb61cf001295e6b4f67a736020442e71fb4367fb1a5"}, + {file = "ckzg-2.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:22e4606857660b2ffca2f7b96c01d0b18b427776d8a93320caf2b1c7342881fe"}, + {file = "ckzg-2.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b55475126a9efc82d61718b2d2323502e33d9733b7368c407954592ccac87faf"}, + {file = "ckzg-2.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5939ae021557c64935a7649b13f4a58f1bd35c39998fd70d0cefb5cbaf77d1be"}, + {file = "ckzg-2.1.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad1ec5f9726a9946508a4a2aace298172aa778de9ebbe97e21c873c3688cc87"}, + {file = "ckzg-2.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93d7edea3bb1602b18b394ebeec231d89dfd8d48fdd06571cb7656107aa62226"}, + {file = "ckzg-2.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c450d77af61011ced3777f97431d5f1bc148ca5362c67caf516aa2f6ef7e4817"}, + {file = "ckzg-2.1.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fc8df4e17e08974961d6c14f6c57ccfd3ad5aede74598292ec6e5d6fc2dbcac"}, + {file = "ckzg-2.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93338da8011790ef53a68475678bc951fa7b337db027d8edbf1889e59691161c"}, + {file = "ckzg-2.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4889f24b4ff614f39e3584709de1a3b0f1556675b33e360dbcb28cda827296d4"}, + {file = "ckzg-2.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b58fbb1a9be4ae959feede8f103e12d80ef8453bdc6483bfdaf164879a2b80"}, + {file = "ckzg-2.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6136c5b5377c7f7033323b25bc2c7b43c025d44ed73e338c02f9f59df9460e5b"}, + {file = "ckzg-2.1.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fa419b92a0e8766deb7157fb28b6542c1c3f8dde35d2a69d1f91ec8e41047d35"}, + {file = "ckzg-2.1.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:95cd6c8eb3ab5148cd97ab5bf44b84fd7f01adf4b36ffd070340ad2d9309b3f9"}, + {file = "ckzg-2.1.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:848191201052b48bdde18680ebb77bf8da99989270e5aea8b0290051f5ac9468"}, + {file = "ckzg-2.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4716c0564131b0d609fb8856966e83892b9809cf6719c7edd6495b960451f8b"}, + {file = "ckzg-2.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c399168ba199827dee3104b00cdc7418d4dbdf47a5fcbe7cf938fc928037534"}, + {file = "ckzg-2.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:724f29f9f110d9ef42a6a1a1a7439548c61070604055ef96b2ab7a884cad4192"}, + {file = "ckzg-2.1.1.tar.gz", hash = "sha256:d6b306b7ec93a24e4346aa53d07f7f75053bc0afc7398e35fa649e5f9d48fcc4"}, +] + [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -483,6 +676,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -494,6 +689,7 @@ version = "0.1.11" description = "pythonic and high performance protocol buffer implementation." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "cprotobuf-0.1.11.tar.gz", hash = "sha256:d2d88c8de840275205e64e530052c653dd25a0fb9e5cd9f7e39ce8f762d7c0a4"}, ] @@ -504,6 +700,8 @@ version = "0.12.3" description = "Cython implementation of Toolz: High performance functional utilities" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "implementation_name == \"cpython\"" files = [ {file = "cytoolz-0.12.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bbe58e26c84b163beba0fbeacf6b065feabc8f75c6d3fe305550d33f24a2d346"}, {file = "cytoolz-0.12.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c51b66ada9bfdb88cf711bf350fcc46f82b83a4683cf2413e633c31a64df6201"}, @@ -623,6 +821,7 @@ version = "7.0.0" description = "A Python library for the Docker Engine API." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "docker-7.0.0-py3-none-any.whl", hash = "sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b"}, {file = "docker-7.0.0.tar.gz", hash = "sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3"}, @@ -644,6 +843,7 @@ version = "0.15" description = "On the fly conversion of Python docstrings to markdown" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "docstring-to-markdown-0.15.tar.gz", hash = "sha256:e146114d9c50c181b1d25505054a8d0f7a476837f0da2c19f07e06eaed52b73d"}, {file = "docstring_to_markdown-0.15-py3-none-any.whl", hash = "sha256:27afb3faedba81e34c33521c32bbd258d7fbb79eedf7d29bc4e81080e854aec0"}, @@ -655,57 +855,62 @@ version = "0.3.3" description = "UNKNOWN" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "durations-0.3.3.tar.gz", hash = "sha256:820ffe09c390469dc621b6a0aa46d3a624b6dadf09b439e175696b6f6b77ef2f"}, ] [[package]] name = "eth-abi" -version = "5.0.0" +version = "5.2.0" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "eth_abi-5.0.0-py3-none-any.whl", hash = "sha256:936a715d7366ac13cac665cbdaf01cc4aabbe8c2d810d716287a9634f9665e01"}, - {file = "eth_abi-5.0.0.tar.gz", hash = "sha256:89c4454d794d9ed92ad5cb2794698c5cee6b7b3ca6009187d0e282adc7f9b6dc"}, + {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, + {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, ] [package.dependencies] eth-typing = ">=3.0.0" eth-utils = ">=2.0.0" -parsimonious = ">=0.9.0,<0.10.0" +parsimonious = ">=0.10.0,<0.11.0" [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hypothesis (>=4.18.2,<5.0.0)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["eth-hash[pycryptodome]", "hypothesis (>=4.18.2,<5.0.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (>=2.4.0)"] -tools = ["hypothesis (>=4.18.2,<5.0.0)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)"] +tools = ["hypothesis (>=6.22.0,<6.108.7)"] [[package]] name = "eth-account" -version = "0.11.0" +version = "0.13.7" description = "eth-account: Sign Ethereum transactions and messages with local private keys" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "eth-account-0.11.0.tar.gz", hash = "sha256:2ffc7a0c7538053a06a7d11495c16c7ad9897dd42be0f64ca7551e9f6e0738c3"}, - {file = "eth_account-0.11.0-py3-none-any.whl", hash = "sha256:76dd261ea096ee09e51455b0a4c99f22185516fdc062f63df0817c28f605e430"}, + {file = "eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24"}, + {file = "eth_account-0.13.7.tar.gz", hash = "sha256:5853ecbcbb22e65411176f121f5f24b8afeeaf13492359d254b16d8b18c77a46"}, ] [package.dependencies] bitarray = ">=2.4.0" +ckzg = ">=2.0.0" eth-abi = ">=4.0.0-b.2" -eth-keyfile = ">=0.6.0" +eth-keyfile = ">=0.7.0,<0.9.0" eth-keys = ">=0.4.0" -eth-rlp = ">=0.3.0" +eth-rlp = ">=2.1.0" eth-utils = ">=2.0.0" -hexbytes = ">=0.1.0,<0.4.0" +hexbytes = ">=1.2.0" +pydantic = ">=2.0.0" rlp = ">=1.0.0" [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "coverage", "hypothesis (>=4.18.0,<5)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "coverage", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["coverage", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-bloom" @@ -713,6 +918,7 @@ version = "3.0.0" description = "A python implementation of the bloom filter used by Ethereum" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth-bloom-3.0.0.tar.gz", hash = "sha256:94bab384b01f2eb1012abbd6bb504e4c743878414d8695ee5a5d25f4247b3886"}, {file = "eth_bloom-3.0.0-py3-none-any.whl", hash = "sha256:bb884ece93d292dfbbe4696744db874a88ac5bfc45f6f1b0ee147d801604a46c"}, @@ -732,6 +938,7 @@ version = "0.6.0" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth-hash-0.6.0.tar.gz", hash = "sha256:ae72889e60db6acbb3872c288cfa02ed157f4c27630fcd7f9c8442302c31e478"}, {file = "eth_hash-0.6.0-py3-none-any.whl", hash = "sha256:9f8daaa345764f8871dc461855049ac54ae4291d780279bce6fce7f24e3f17d3"}, @@ -744,7 +951,7 @@ pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"p dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] pycryptodome = ["pycryptodome (>=3.6.6,<4)"] -pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0) ; python_version < \"3.9\"", "safe-pysha3 (>=1.0.0) ; python_version >= \"3.9\""] test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] @@ -753,6 +960,7 @@ version = "0.7.0" description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth-keyfile-0.7.0.tar.gz", hash = "sha256:6bdb8110c3a50439deb68a04c93c9d5ddd5402353bfae1bf4cfca1d6dff14fcf"}, {file = "eth_keyfile-0.7.0-py3-none-any.whl", hash = "sha256:6a89b231a2fe250c3a8f924f2695bb9cce33ddd0d6f7ebbcdacd183d7f83d537"}, @@ -774,6 +982,7 @@ version = "0.5.0" description = "eth-keys: Common API for Ethereum key operations" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "eth-keys-0.5.0.tar.gz", hash = "sha256:a0abccb83f3d84322591a2c047a1e3aa52ea86b185fa3e82ce311d120ca2791e"}, {file = "eth_keys-0.5.0-py3-none-any.whl", hash = "sha256:b2bed3ff3bcede68cc0cd4458c7147baaeaac1211a1efdb6ca019f9d3d989f2b"}, @@ -791,63 +1000,70 @@ test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "h [[package]] name = "eth-rlp" -version = "1.0.1" +version = "2.2.0" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "eth-rlp-1.0.1.tar.gz", hash = "sha256:d61dbda892ee1220f28fb3663c08f6383c305db9f1f5624dc585c9cd05115027"}, - {file = "eth_rlp-1.0.1-py3-none-any.whl", hash = "sha256:dd76515d71654277377d48876b88e839d61553aaf56952e580bb7cebef2b1517"}, + {file = "eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47"}, + {file = "eth_rlp-2.2.0.tar.gz", hash = "sha256:5e4b2eb1b8213e303d6a232dfe35ab8c29e2d3051b86e8d359def80cd21db83d"}, ] [package.dependencies] eth-utils = ">=2.0.0" -hexbytes = ">=0.1.0,<1" +hexbytes = ">=1.2.0" rlp = ">=0.6.0" -typing-extensions = {version = ">=4.0.1", markers = "python_version <= \"3.11\""} +typing_extensions = {version = ">=4.0.1", markers = "python_version <= \"3.10\""} [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-typing" -version = "4.0.0" +version = "5.2.1" description = "eth-typing: Common type annotations for ethereum python packages" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "eth-typing-4.0.0.tar.gz", hash = "sha256:9af0b6beafbc5c2e18daf19da5f5a68315023172c4e79d149e12ad10a3d3f731"}, - {file = "eth_typing-4.0.0-py3-none-any.whl", hash = "sha256:7e556bea322b6e8c0a231547b736c258e10ce9eed5ddc254f51031b12af66a16"}, + {file = "eth_typing-5.2.1-py3-none-any.whl", hash = "sha256:b0c2812ff978267563b80e9d701f487dd926f1d376d674f3b535cfe28b665d3d"}, + {file = "eth_typing-5.2.1.tar.gz", hash = "sha256:7557300dbf02a93c70fa44af352b5c4a58f94e997a0fd6797fb7d1c29d9538ee"}, ] +[package.dependencies] +typing_extensions = ">=4.5.0" + [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-utils" -version = "3.0.0" +version = "5.3.0" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" optional = false -python-versions = ">=3.8, <4" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "eth-utils-3.0.0.tar.gz", hash = "sha256:8721869568448349bceae63c277b75758d11e0dc190e7ef31e161b89619458f1"}, - {file = "eth_utils-3.0.0-py3-none-any.whl", hash = "sha256:9a284106acf6f6ce91ddf792489cf8bd4c681fd5ae7653d2f3d5d100be5c3905"}, + {file = "eth_utils-5.3.0-py3-none-any.whl", hash = "sha256:ac184883ab299d923428bbe25dae5e356979a3993e0ef695a864db0a20bc262d"}, + {file = "eth_utils-5.3.0.tar.gz", hash = "sha256:1f096867ac6be895f456fa3acb26e9573ae66e753abad9208f316d24d6178156"}, ] [package.dependencies] cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} eth-hash = ">=0.3.1" -eth-typing = ">=3.0.0" +eth-typing = ">=5.0.0" +pydantic = ">=2.0.0,<3" toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.5.1)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["hypothesis (>=4.43.0)", "mypy (==1.5.1)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.10.0)", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["hypothesis (>=4.43.0)", "mypy (==1.10.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "exceptiongroup" @@ -855,6 +1071,8 @@ version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, @@ -869,6 +1087,7 @@ version = "0.4.0" description = "A library for automatically generating command line interfaces." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "fire-0.4.0.tar.gz", hash = "sha256:c5e2b8763699d1142393a46d0e3e790c5eb2f0706082df8f647878842c216a62"}, ] @@ -883,6 +1102,7 @@ version = "7.0.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" +groups = ["main"] files = [ {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, @@ -899,6 +1119,7 @@ version = "0.3.6" description = "flake8 plugin to call black as a code style validator" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "flake8-black-0.3.6.tar.gz", hash = "sha256:0dfbca3274777792a5bcb2af887a4cad72c72d0e86c94e08e3a3de151bb41c34"}, {file = "flake8_black-0.3.6-py3-none-any.whl", hash = "sha256:fe8ea2eca98d8a504f22040d9117347f6b367458366952862ac3586e7d4eeaca"}, @@ -918,6 +1139,7 @@ version = "6.1.1" description = "flake8 plugin that integrates isort" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "flake8_isort-6.1.1-py3-none-any.whl", hash = "sha256:0fec4dc3a15aefbdbe4012e51d5531a2eb5fa8b981cdfbc882296a59b54ede12"}, {file = "flake8_isort-6.1.1.tar.gz", hash = "sha256:c1f82f3cf06a80c13e1d09bfae460e9666255d5c780b859f19f8318d420370b3"}, @@ -936,6 +1158,7 @@ version = "3.7.0" description = "Plugin for nose or pytest that automatically reruns flaky tests." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] files = [ {file = "flaky-3.7.0-py2.py3-none-any.whl", hash = "sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c"}, {file = "flaky-3.7.0.tar.gz", hash = "sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d"}, @@ -947,6 +1170,7 @@ version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, @@ -1029,30 +1253,31 @@ files = [ [[package]] name = "hexbytes" -version = "0.3.1" +version = "1.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" optional = false -python-versions = ">=3.7, <4" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "hexbytes-0.3.1-py3-none-any.whl", hash = "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59"}, - {file = "hexbytes-0.3.1.tar.gz", hash = "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d"}, + {file = "hexbytes-1.3.1-py3-none-any.whl", hash = "sha256:da01ff24a1a9a2b1881c4b85f0e9f9b0f51b526b379ffa23832ae7899d29c2c7"}, + {file = "hexbytes-1.3.1.tar.gz", hash = "sha256:a657eebebdfe27254336f98d8af6e2236f3f83aed164b87466b6cf6c5f5a4765"}, ] [package.extras] -dev = ["black (>=22)", "bumpversion (>=0.5.3)", "eth-utils (>=1.0.1,<3)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -lint = ["black (>=22)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)"] -test = ["eth-utils (>=1.0.1,<3)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth_utils (>=2.0.0)", "hypothesis (>=3.44.24)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["eth_utils (>=2.0.0)", "hypothesis (>=3.44.24)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -1061,6 +1286,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1072,6 +1298,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["main"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1086,6 +1313,7 @@ version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, @@ -1105,6 +1333,7 @@ version = "0.41.3" description = "A language server for Jedi!" optional = false python-versions = ">=3.8,<4.0" +groups = ["main"] files = [ {file = "jedi_language_server-0.41.3-py3-none-any.whl", hash = "sha256:7411f7479cdc9e9ea495f91e20b182a5d00170c0a8a4a87d3a147462282c06af"}, {file = "jedi_language_server-0.41.3.tar.gz", hash = "sha256:113ec22b95fadaceefbb704b5f365384bed296b82ede59026be375ecc97a9f8a"}, @@ -1124,6 +1353,7 @@ version = "1.9.2" description = "Merge a series of JSON documents." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "jsonmerge-1.9.2-py3-none-any.whl", hash = "sha256:cab93ee7763fb51a4a09bbdab2eacf499ffb208ab94247ae86acea3e0e823b05"}, {file = "jsonmerge-1.9.2.tar.gz", hash = "sha256:c43757e0180b0e19b7ae4c130ad42a07cc580c31912f61f4823e8eaf2fa394a3"}, @@ -1138,6 +1368,7 @@ version = "0.20.0" description = "Python bindings for Jsonnet - The data templating language" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "jsonnet-0.20.0.tar.gz", hash = "sha256:7e770c7bf3a366b97b650a39430450f77612e74406731eb75c5bd59f3f104d4f"}, ] @@ -1148,6 +1379,7 @@ version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, @@ -1169,6 +1401,7 @@ version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, @@ -1177,106 +1410,13 @@ files = [ [package.dependencies] referencing = ">=0.31.0" -[[package]] -name = "lru-dict" -version = "1.2.0" -description = "An Dict like LRU container." -optional = false -python-versions = "*" -files = [ - {file = "lru-dict-1.2.0.tar.gz", hash = "sha256:13c56782f19d68ddf4d8db0170041192859616514c706b126d0df2ec72a11bd7"}, - {file = "lru_dict-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:de906e5486b5c053d15b7731583c25e3c9147c288ac8152a6d1f9bccdec72641"}, - {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604d07c7604b20b3130405d137cae61579578b0e8377daae4125098feebcb970"}, - {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:203b3e78d03d88f491fa134f85a42919020686b6e6f2d09759b2f5517260c651"}, - {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020b93870f8c7195774cbd94f033b96c14f51c57537969965c3af300331724fe"}, - {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1184d91cfebd5d1e659d47f17a60185bbf621635ca56dcdc46c6a1745d25df5c"}, - {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc42882b554a86e564e0b662da47b8a4b32fa966920bd165e27bb8079a323bc1"}, - {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:18ee88ada65bd2ffd483023be0fa1c0a6a051ef666d1cd89e921dcce134149f2"}, - {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:756230c22257597b7557eaef7f90484c489e9ba78e5bb6ab5a5bcfb6b03cb075"}, - {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4da599af36618881748b5db457d937955bb2b4800db891647d46767d636c408"}, - {file = "lru_dict-1.2.0-cp310-cp310-win32.whl", hash = "sha256:35a142a7d1a4fd5d5799cc4f8ab2fff50a598d8cee1d1c611f50722b3e27874f"}, - {file = "lru_dict-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6da5b8099766c4da3bf1ed6e7d7f5eff1681aff6b5987d1258a13bd2ed54f0c9"}, - {file = "lru_dict-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b20b7c9beb481e92e07368ebfaa363ed7ef61e65ffe6e0edbdbaceb33e134124"}, - {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22147367b296be31cc858bf167c448af02435cac44806b228c9be8117f1bfce4"}, - {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a3091abeb95e707f381a8b5b7dc8e4ee016316c659c49b726857b0d6d1bd7a"}, - {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:877801a20f05c467126b55338a4e9fa30e2a141eb7b0b740794571b7d619ee11"}, - {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d3336e901acec897bcd318c42c2b93d5f1d038e67688f497045fc6bad2c0be7"}, - {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8dafc481d2defb381f19b22cc51837e8a42631e98e34b9e0892245cc96593deb"}, - {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:87bbad3f5c3de8897b8c1263a9af73bbb6469fb90e7b57225dad89b8ef62cd8d"}, - {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:25f9e0bc2fe8f41c2711ccefd2871f8a5f50a39e6293b68c3dec576112937aad"}, - {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ae301c282a499dc1968dd633cfef8771dd84228ae9d40002a3ea990e4ff0c469"}, - {file = "lru_dict-1.2.0-cp311-cp311-win32.whl", hash = "sha256:c9617583173a29048e11397f165501edc5ae223504a404b2532a212a71ecc9ed"}, - {file = "lru_dict-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6b7a031e47421d4b7aa626b8c91c180a9f037f89e5d0a71c4bb7afcf4036c774"}, - {file = "lru_dict-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ea2ac3f7a7a2f32f194c84d82a034e66780057fd908b421becd2f173504d040e"}, - {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd46c94966f631a81ffe33eee928db58e9fbee15baba5923d284aeadc0e0fa76"}, - {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:086ce993414f0b28530ded7e004c77dc57c5748fa6da488602aa6e7f79e6210e"}, - {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df25a426446197488a6702954dcc1de511deee20c9db730499a2aa83fddf0df1"}, - {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c53b12b89bd7a6c79f0536ff0d0a84fdf4ab5f6252d94b24b9b753bd9ada2ddf"}, - {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f9484016e6765bd295708cccc9def49f708ce07ac003808f69efa386633affb9"}, - {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0f7ec902a0097ac39f1922c89be9eaccf00eb87751e28915320b4f72912d057"}, - {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:981ef3edc82da38d39eb60eae225b88a538d47b90cce2e5808846fd2cf64384b"}, - {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e25b2e90a032dc248213af7f3f3e975e1934b204f3b16aeeaeaff27a3b65e128"}, - {file = "lru_dict-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:59f3df78e94e07959f17764e7fa7ca6b54e9296953d2626a112eab08e1beb2db"}, - {file = "lru_dict-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:de24b47159e07833aeab517d9cb1c3c5c2d6445cc378b1c2f1d8d15fb4841d63"}, - {file = "lru_dict-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d0dd4cd58220351233002f910e35cc01d30337696b55c6578f71318b137770f9"}, - {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87bdc291718bbdf9ea4be12ae7af26cbf0706fa62c2ac332748e3116c5510a7"}, - {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05fb8744f91f58479cbe07ed80ada6696ec7df21ea1740891d4107a8dd99a970"}, - {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f6e8a3fc91481b40395316a14c94daa0f0a5de62e7e01a7d589f8d29224052"}, - {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b172fce0a0ffc0fa6d282c14256d5a68b5db1e64719c2915e69084c4b6bf555"}, - {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e707d93bae8f0a14e6df1ae8b0f076532b35f00e691995f33132d806a88e5c18"}, - {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b9ec7a4a0d6b8297102aa56758434fb1fca276a82ed7362e37817407185c3abb"}, - {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f404dcc8172da1f28da9b1f0087009578e608a4899b96d244925c4f463201f2a"}, - {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1171ad3bff32aa8086778be4a3bdff595cc2692e78685bcce9cb06b96b22dcc2"}, - {file = "lru_dict-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:0c316dfa3897fabaa1fe08aae89352a3b109e5f88b25529bc01e98ac029bf878"}, - {file = "lru_dict-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5919dd04446bc1ee8d6ecda2187deeebfff5903538ae71083e069bc678599446"}, - {file = "lru_dict-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbf36c5a220a85187cacc1fcb7dd87070e04b5fc28df7a43f6842f7c8224a388"}, - {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712e71b64da181e1c0a2eaa76cd860265980cd15cb0e0498602b8aa35d5db9f8"}, - {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f54908bf91280a9b8fa6a8c8f3c2f65850ce6acae2852bbe292391628ebca42f"}, - {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3838e33710935da2ade1dd404a8b936d571e29268a70ff4ca5ba758abb3850df"}, - {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5d5a5f976b39af73324f2b793862859902ccb9542621856d51a5993064f25e4"}, - {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bda3a9afd241ee0181661decaae25e5336ce513ac268ab57da737eacaa7871f"}, - {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd2cd1b998ea4c8c1dad829fc4fa88aeed4dee555b5e03c132fc618e6123f168"}, - {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b55753ee23028ba8644fd22e50de7b8f85fa60b562a0fafaad788701d6131ff8"}, - {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e51fa6a203fa91d415f3b2900e5748ec8e06ad75777c98cc3aeb3983ca416d7"}, - {file = "lru_dict-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cd6806313606559e6c7adfa0dbeb30fc5ab625f00958c3d93f84831e7a32b71e"}, - {file = "lru_dict-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d90a70c53b0566084447c3ef9374cc5a9be886e867b36f89495f211baabd322"}, - {file = "lru_dict-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3ea7571b6bf2090a85ff037e6593bbafe1a8598d5c3b4560eb56187bcccb4dc"}, - {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287c2115a59c1c9ed0d5d8ae7671e594b1206c36ea9df2fca6b17b86c468ff99"}, - {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ccfd2291c93746a286c87c3f895165b697399969d24c54804ec3ec559d4e43"}, - {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b710f0f4d7ec4f9fa89dfde7002f80bcd77de8024017e70706b0911ea086e2ef"}, - {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5345bf50e127bd2767e9fd42393635bbc0146eac01f6baf6ef12c332d1a6a329"}, - {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:291d13f85224551913a78fe695cde04cbca9dcb1d84c540167c443eb913603c9"}, - {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5bb41bc74b321789803d45b124fc2145c1b3353b4ad43296d9d1d242574969b"}, - {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0facf49b053bf4926d92d8d5a46fe07eecd2af0441add0182c7432d53d6da667"}, - {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:987b73a06bcf5a95d7dc296241c6b1f9bc6cda42586948c9dabf386dc2bef1cd"}, - {file = "lru_dict-1.2.0-cp39-cp39-win32.whl", hash = "sha256:231d7608f029dda42f9610e5723614a35b1fff035a8060cf7d2be19f1711ace8"}, - {file = "lru_dict-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:71da89e134747e20ed5b8ad5b4ee93fc5b31022c2b71e8176e73c5a44699061b"}, - {file = "lru_dict-1.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:21b3090928c7b6cec509e755cc3ab742154b33660a9b433923bd12c37c448e3e"}, - {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaecd7085212d0aa4cd855f38b9d61803d6509731138bf798a9594745953245b"}, - {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead83ac59a29d6439ddff46e205ce32f8b7f71a6bd8062347f77e232825e3d0a"}, - {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b6b2a30188586fe71358f0f33e4bac882d33f5e5019b26f084363f42f986f"}, - {file = "lru_dict-1.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b30122e098c80e36d0117810d46459a46313421ce3298709170b687dc1240b02"}, - {file = "lru_dict-1.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f010cfad3ab10676e44dc72a813c968cd586f37b466d27cde73d1f7f1ba158c2"}, - {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20f5f411f7751ad9a2c02e80287cedf69ae032edd321fe696e310d32dd30a1f8"}, - {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afdadd73304c9befaed02eb42f5f09fdc16288de0a08b32b8080f0f0f6350aa6"}, - {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ab0c10c4fa99dc9e26b04e6b62ac32d2bcaea3aad9b81ec8ce9a7aa32b7b1b"}, - {file = "lru_dict-1.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:edad398d5d402c43d2adada390dd83c74e46e020945ff4df801166047013617e"}, - {file = "lru_dict-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91d577a11b84387013815b1ad0bb6e604558d646003b44c92b3ddf886ad0f879"}, - {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb12f19cdf9c4f2d9aa259562e19b188ff34afab28dd9509ff32a3f1c2c29326"}, - {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e4c85aa8844bdca3c8abac3b7f78da1531c74e9f8b3e4890c6e6d86a5a3f6c0"}, - {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6acbd097b15bead4de8e83e8a1030bb4d8257723669097eac643a301a952f0"}, - {file = "lru_dict-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6613daa851745dd22b860651de930275be9d3e9373283a2164992abacb75b62"}, -] - -[package.extras] -test = ["pytest"] - [[package]] name = "lsprotocol" version = "2023.0.1" description = "Python implementation of the Language Server Protocol." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "lsprotocol-2023.0.1-py3-none-any.whl", hash = "sha256:c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2"}, {file = "lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d"}, @@ -1292,6 +1432,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -1303,6 +1444,7 @@ version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, @@ -1402,6 +1544,7 @@ version = "1.5.2" description = "Enables following multiple files for new lines at once, automatically handling file creation/deletion/rotation" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "multitail2-1.5.2.tar.gz", hash = "sha256:7086598c1cd1901ec79ce3c1eda9420299e3778f6c18464958c1f74ffd1950c9"}, ] @@ -1415,6 +1558,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -1426,6 +1570,7 @@ version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, @@ -1433,12 +1578,14 @@ files = [ [[package]] name = "parsimonious" -version = "0.9.0" +version = "0.10.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "parsimonious-0.9.0.tar.gz", hash = "sha256:b2ad1ae63a2f65bd78f5e0a8ac510a98f3607a43f1db2a8d46636a5d9e4a30c1"}, + {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, + {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, ] [package.dependencies] @@ -1450,6 +1597,7 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1465,6 +1613,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1476,6 +1625,7 @@ version = "0.13.3" description = "Check PEP-8 naming conventions, plugin for flake8" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, @@ -1490,6 +1640,7 @@ version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, @@ -1505,6 +1656,7 @@ version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, @@ -1514,24 +1666,157 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "propcache" +version = "0.4.1" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, + {file = "propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db"}, + {file = "propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900"}, + {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c"}, + {file = "propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb"}, + {file = "propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37"}, + {file = "propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5"}, + {file = "propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc"}, + {file = "propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757"}, + {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f"}, + {file = "propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1"}, + {file = "propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6"}, + {file = "propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403"}, + {file = "propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4"}, + {file = "propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9"}, + {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75"}, + {file = "propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8"}, + {file = "propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db"}, + {file = "propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311"}, + {file = "propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c"}, + {file = "propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61"}, + {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66"}, + {file = "propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81"}, + {file = "propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e"}, + {file = "propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566"}, + {file = "propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b"}, + {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7"}, + {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1"}, + {file = "propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717"}, + {file = "propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37"}, + {file = "propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c"}, + {file = "propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44"}, + {file = "propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49"}, + {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144"}, + {file = "propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f"}, + {file = "propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153"}, + {file = "propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393"}, + {file = "propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc"}, + {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36"}, + {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455"}, + {file = "propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85"}, + {file = "propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1"}, + {file = "propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb"}, + {file = "propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a"}, + {file = "propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"}, + {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183"}, + {file = "propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19"}, + {file = "propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f"}, + {file = "propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938"}, + {file = "propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237"}, + {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, +] + [[package]] name = "protobuf" -version = "4.25.3" +version = "5.29.6" description = "" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1"}, + {file = "protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda"}, + {file = "protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9"}, + {file = "protobuf-5.29.6-cp38-cp38-win32.whl", hash = "sha256:36ade6ff88212e91aef4e687a971a11d7d24d6948a66751abc1b3238648f5d05"}, + {file = "protobuf-5.29.6-cp38-cp38-win_amd64.whl", hash = "sha256:831e2da16b6cc9d8f1654c041dd594eda43391affd3c03a91bea7f7f6da106d6"}, + {file = "protobuf-5.29.6-cp39-cp39-win32.whl", hash = "sha256:cb4c86de9cd8a7f3a256b9744220d87b847371c6b2f10bde87768918ef33ba49"}, + {file = "protobuf-5.29.6-cp39-cp39-win_amd64.whl", hash = "sha256:76e07e6567f8baf827137e8d5b8204b6c7b6488bbbff1bf0a72b383f77999c18"}, + {file = "protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86"}, + {file = "protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723"}, ] [[package]] @@ -1540,6 +1825,7 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -1551,6 +1837,7 @@ version = "3.20.0" description = "Cryptographic library for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] files = [ {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, @@ -1586,12 +1873,139 @@ files = [ {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, ] +[[package]] +name = "pydantic" +version = "2.9.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and sys_platform == \"win32\""] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + [[package]] name = "pyflakes" version = "3.2.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, @@ -1603,6 +2017,7 @@ version = "1.3.1" description = "A pythonic generic language server (pronounced like 'pie glass')" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pygls-1.3.1-py3-none-any.whl", hash = "sha256:6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e"}, {file = "pygls-1.3.1.tar.gz", hash = "sha256:140edceefa0da0e9b3c533547c892a42a7d2fd9217ae848c330c53d266a55018"}, @@ -1621,6 +2036,7 @@ version = "0.2.5" description = "Spawn local devnets for cosmos-sdk chains" optional = false python-versions = "^3.9" +groups = ["main"] files = [] develop = false @@ -1636,7 +2052,6 @@ python-dateutil = "^2.8" python-dotenv = "^1.0" pyyaml = "^6.0" pyyaml-include = "^1.3" -rpds-py = "^0.17.0" supervisor = "^4.2" tomlkit = "^0" @@ -1644,7 +2059,7 @@ tomlkit = "^0" type = "git" url = "https://github.com/crypto-com/pystarport.git" reference = "main" -resolved_reference = "4704c4a27b159eaa4d434ef44b9bf1046e81da1b" +resolved_reference = "a7dac7f485b9acef30540d803b53fadaf1a1850a" [[package]] name = "pytest" @@ -1652,6 +2067,7 @@ version = "8.0.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, @@ -1674,6 +2090,7 @@ version = "0.2.0" description = "pytest plugin to annotate failed tests with a workflow command for GitHub Actions" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pytest-github-actions-annotate-failures-0.2.0.tar.gz", hash = "sha256:844ab626d389496e44f960b42f0a72cce29ae06d363426d17ea9ae1b4bef2288"}, {file = "pytest_github_actions_annotate_failures-0.2.0-py3-none-any.whl", hash = "sha256:8bcef65fed503faaa0524b59cfeccc8995130972dd7b008d64193cc41b9cde85"}, @@ -1682,12 +2099,28 @@ files = [ [package.dependencies] pytest = ">=4.0.0" +[[package]] +name = "pytest-timeout" +version = "2.3.1" +description = "pytest plugin to abort hanging tests" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9"}, + {file = "pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + [[package]] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, @@ -1702,6 +2135,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1716,6 +2150,7 @@ version = "15.1.0" description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent from the Python core Unicode database." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "pyunormalize-15.1.0.tar.gz", hash = "sha256:cf4a87451a0f1cb76911aa97f432f4579e1f564a2f0c84ce488c73a73901b6c1"}, ] @@ -1726,6 +2161,8 @@ version = "306" description = "Python for Window Extensions" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Windows\" or sys_platform == \"win32\"" files = [ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, @@ -1745,62 +2182,65 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1809,6 +2249,7 @@ version = "1.3.2" description = "Extending PyYAML with a custom constructor for including YAML files within YAML files" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pyyaml-include-1.3.2.tar.gz", hash = "sha256:a516d5172092ec110a427dafe171da9341fe488eb6d1c78fb52f1f0414dec26d"}, {file = "pyyaml_include-1.3.2-py3-none-any.whl", hash = "sha256:cc0c0a1e4c2a91e4f0b1aea83634fe8b622fe90fc3be8e8293f1e47c5ed6001b"}, @@ -1818,7 +2259,7 @@ files = [ PyYAML = ">=6.0,<7.0" [package.extras] -toml = ["toml"] +toml = ["toml ; python_version <= \"3.11\""] [[package]] name = "referencing" @@ -1826,6 +2267,7 @@ version = "0.33.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, @@ -1841,6 +2283,7 @@ version = "2023.12.25" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, @@ -1939,18 +2382,19 @@ files = [ [[package]] name = "requests" -version = "2.31.0" +version = "2.32.4" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -1964,6 +2408,7 @@ version = "4.0.0" description = "rlp: A package for Recursive Length Prefix encoding and decoding" optional = false python-versions = ">=3.8, <4" +groups = ["main"] files = [ {file = "rlp-4.0.0-py3-none-any.whl", hash = "sha256:1747fd933e054e6d25abfe591be92e19a4193a56c93981c05bd0f84dfe279f14"}, {file = "rlp-4.0.0.tar.gz", hash = "sha256:61a5541f86e4684ab145cb849a5929d2ced8222930a570b3941cf4af16b72a78"}, @@ -1984,6 +2429,7 @@ version = "0.17.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, @@ -2088,19 +2534,24 @@ files = [ [[package]] name = "setuptools" -version = "69.1.0" +version = "78.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, + {file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"}, + {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "six" @@ -2108,6 +2559,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2119,6 +2571,7 @@ version = "4.2.5" description = "A system for controlling process state under UNIX" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "supervisor-4.2.5-py2.py3-none-any.whl", hash = "sha256:2ecaede32fc25af814696374b79e42644ecaba5c09494c51016ffda9602d0f08"}, {file = "supervisor-4.2.5.tar.gz", hash = "sha256:34761bae1a23c58192281a5115fb07fbf22c9b0133c08166beffc70fed3ebc12"}, @@ -2136,6 +2589,7 @@ version = "2.4.0" description = "ANSI color formatting for output in terminal" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, @@ -2150,6 +2604,7 @@ version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -2161,6 +2616,8 @@ version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -2172,6 +2629,7 @@ version = "0.7.2" description = "Style preserving TOML library" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] files = [ {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, @@ -2183,73 +2641,91 @@ version = "0.12.1" description = "List processing tools and functional utilities" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "implementation_name == \"pypy\" or implementation_name == \"cpython\"" files = [ {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] +[[package]] +name = "types-requests" +version = "2.32.4.20250611" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "types_requests-2.32.4.20250611-py3-none-any.whl", hash = "sha256:ad2fe5d3b0cb3c2c902c8815a70e7fb2302c4b8c1f77bdcd738192cdb3878072"}, + {file = "types_requests-2.32.4.20250611.tar.gz", hash = "sha256:741c8777ed6425830bf51e54d6abe245f79b4dcb9019f1622b773463946bf826"}, +] + +[package.dependencies] +urllib3 = ">=2" + [[package]] name = "typing-extensions" -version = "4.9.0" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "web3" -version = "6.15.1" -description = "web3.py" +version = "7.13.0" +description = "web3: A Python library for interacting with Ethereum" optional = false -python-versions = ">=3.7.2" +python-versions = "<4,>=3.8" +groups = ["main"] files = [ - {file = "web3-6.15.1-py3-none-any.whl", hash = "sha256:4e4a8313aa4556ecde61c852a62405b853b667498b07da6ff05c29fe8c79096b"}, - {file = "web3-6.15.1.tar.gz", hash = "sha256:f9e7eefc1b3c3d194868a4ef9583b625c18ea3f31a48ebe143183db74898f381"}, + {file = "web3-7.13.0-py3-none-any.whl", hash = "sha256:4da7e953300577b7dadbaf430e5fd4479b127b1ad4910234b230fdcb8a49f735"}, + {file = "web3-7.13.0.tar.gz", hash = "sha256:281795e0f5d404c1374e1771f6710bb43e0c975f3141366eb1680763edfb4806"}, ] [package.dependencies] aiohttp = ">=3.7.4.post0" -eth-abi = ">=4.0.0" -eth-account = ">=0.8.0" +eth-abi = ">=5.0.1" +eth-account = ">=0.13.6" eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]} -eth-typing = ">=3.0.0" -eth-utils = ">=2.1.0" -hexbytes = ">=0.1.0,<0.4.0" -jsonschema = ">=4.0.0" -lru-dict = ">=1.1.6,<1.3.0" -protobuf = ">=4.21.6" +eth-typing = ">=5.0.0" +eth-utils = ">=5.0.0" +hexbytes = ">=1.2.0" +pydantic = ">=2.4.0" pyunormalize = ">=15.0.0" pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} -requests = ">=2.16.0" +requests = ">=2.23.0" +types-requests = ">=2.0.0" typing-extensions = ">=4.0.1" -websockets = ">=10.0.0" +websockets = ">=10.0.0,<16.0.0" [package.extras] -dev = ["black (>=22.1.0)", "build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (==v0.9.1-b.2)", "flake8 (==3.8.3)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "isort (>=5.11.0)", "mypy (==1.4.1)", "py-geth (>=3.14.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)", "when-changed (>=0.3.0)"] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -ipfs = ["ipfshttpclient (==0.8.0a2)"] -linter = ["black (>=22.1.0)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==1.4.1)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)"] -tester = ["eth-tester[py-evm] (==v0.9.1-b.2)", "py-geth (>=3.14.0)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-tester[py-evm] (>=0.13.0b1,<0.14.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-geth (>=5.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-xdist (>=2.4.0)", "setuptools (>=38.6.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "tqdm (>4.32)", "twine (>=1.13)", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["eth-tester[py-evm] (>=0.13.0b1,<0.14.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-geth (>=5.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-xdist (>=2.4.0)", "tox (>=4.0.0)"] +tester = ["eth-tester[py-evm] (>=0.13.0b1,<0.14.0b1)", "py-geth (>=5.1.0)"] [[package]] name = "websockets" @@ -2257,6 +2733,7 @@ version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, @@ -2334,108 +2811,150 @@ files = [ [[package]] name = "yarl" -version = "1.9.4" +version = "1.22.0" description = "Yet another URL library" optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, + {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, + {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, + {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, + {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, + {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, + {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, + {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, + {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, + {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, + {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, + {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, + {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, + {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, + {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, + {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, + {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, + {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, + {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, + {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, + {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, + {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, + {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, + {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, + {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, + {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, + {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, + {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, + {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, + {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, + {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, + {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, + {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, + {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, + {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, + {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, + {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, + {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, + {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, + {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, + {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, + {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, + {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, + {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, + {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, + {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, + {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, + {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, + {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, + {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, + {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.1" [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.9" -content-hash = "e2b24f3af2972f3799b6b7877084e48158b3dde1833c5837d32701f7ce81c42c" +content-hash = "65ca89e3ff6463580302cb10ca75f4dffbd54e481f3e9afc39113f7d6d377072" diff --git a/tests/integration_tests/pyproject.toml b/tests/integration_tests/pyproject.toml index 01528df262..319b0bb9ad 100644 --- a/tests/integration_tests/pyproject.toml +++ b/tests/integration_tests/pyproject.toml @@ -9,24 +9,26 @@ python = "^3.9" pytest = "^8.0" pytest-github-actions-annotate-failures = "^0.2" flake8 = "^7.0" -black = "^24.2" +black = "^24.3" flake8-black = "^0.3" flake8-isort = "^6.1" pep8-naming = "^0.13" -protobuf = "^4.25" +protobuf = "^5.29" python-dateutil = "^2.8" -web3 = "^6.15" +web3 = "^7.13.0" python-dotenv = "^1.0" pystarport = { git = "https://github.com/crypto-com/pystarport.git", branch = "main" } websockets = "^12.0" toml = "^0" jsonnet = "^0" -eth-account = "^0.11" +eth-account = "^0.13" cprotobuf = "^0.1.11" flaky = "^3.7" eth-bloom = "^3.0" eth-hash = "^0" jedi-language-server = "^0.41.3" +pytest-timeout = "^2.3.1" +pyyaml = "^6.0.2rc1" [tool.poetry.dev-dependencies] diff --git a/tests/integration_tests/shell.nix b/tests/integration_tests/shell.nix index 6cfe1604b5..eec9957dc2 100644 --- a/tests/integration_tests/shell.nix +++ b/tests/integration_tests/shell.nix @@ -1,4 +1,7 @@ -{ system ? builtins.currentSystem, pkgs ? import ../../nix { inherit system; } }: +{ + system ? builtins.currentSystem, + pkgs ? import ../../nix { inherit system; }, +}: pkgs.mkShell { buildInputs = [ pkgs.jq @@ -12,5 +15,9 @@ pkgs.mkShell { ]; shellHook = '' . ${../../scripts/env} + # Fix poetry2nix Python environment in nixpkgs 25.11 + # The wrapper binary doesn't set PYTHONHOME, causing sys.prefix to point + # to the base python instead of the poetry environment + export PYTHONHOME="${pkgs.test-env}" ''; } diff --git a/tests/integration_tests/spec/README.md b/tests/integration_tests/spec/README.md new file mode 100644 index 0000000000..6686d24743 --- /dev/null +++ b/tests/integration_tests/spec/README.md @@ -0,0 +1,3 @@ +# execution-apis + +The specs are copied from the [ethereum/execution-apis](https://github.com/ethereum/execution-apis/tree/main/tests) repository. diff --git a/tests/integration_tests/spec/conftest.py b/tests/integration_tests/spec/conftest.py new file mode 100644 index 0000000000..c17f890483 --- /dev/null +++ b/tests/integration_tests/spec/conftest.py @@ -0,0 +1,86 @@ +import os +import signal +import subprocess +from pathlib import Path + +import pytest +from pystarport import ports +from web3 import Web3 +from web3.middleware import ExtraDataToPOAMiddleware + +SIMULATE_CONFIG = Path(__file__).parent.parent / "configs" / "simulate.jsonnet" + + +def _w3_wait_for_block(w3, target=1, timeout=240): + import time + + for _ in range(timeout * 2): + try: + if w3.eth.block_number >= target: + return + except Exception: + pass + time.sleep(0.5) + raise TimeoutError(f"chain did not reach block {target}") + + +class _Ethermint: + def __init__(self, base_dir): + self._w3 = None + self.base_dir = base_dir + + @property + def w3_http_endpoint(self, i=0): + import json + + config = json.loads((self.base_dir / "config.json").read_text()) + port = ports.evmrpc_port(config["validators"][i]["base_port"]) + return f"http://localhost:{port}" + + @property + def w3(self): + if self._w3 is None: + self._w3 = Web3(Web3.HTTPProvider(self.w3_http_endpoint)) + self._w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0) + return self._w3 + + +def _wait_for_port(port, host="127.0.0.1", timeout=40): + import socket + import time + + start = time.time() + while time.time() - start < timeout: + try: + with socket.create_connection((host, port), timeout=1): + return + except OSError: + time.sleep(0.1) + raise TimeoutError(f"port {port} not open after {timeout}s") + + +@pytest.fixture(scope="module") +def ethermint(tmp_path_factory): + path = tmp_path_factory.mktemp("ethermint") + base_port = 26750 + cmd = [ + "pystarport", "init", + "--config", str(SIMULATE_CONFIG), + "--data", str(path), + "--base_port", str(base_port), + "--no_remove", + ] + subprocess.run(cmd, check=True) + proc = subprocess.Popen( + ["pystarport", "start", "--data", str(path), "--quiet"], + preexec_fn=os.setsid, + ) + try: + _wait_for_port(ports.evmrpc_port(base_port)) + _wait_for_port(ports.evmrpc_ws_port(base_port)) + e = _Ethermint(path / "ethermint_9000-1") + _w3_wait_for_block(e.w3, 1) + yield e + finally: + os.killpg(os.getpgid(proc.pid), signal.SIGTERM) + proc.wait() diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-add-more-non-defined-BlockStateCalls-than-fit-but-now-with-fit.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-add-more-non-defined-BlockStateCalls-than-fit-but-now-with-fit.io new file mode 100644 index 0000000000..aac8b5e1ec --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-add-more-non-defined-BlockStateCalls-than-fit-but-now-with-fit.io @@ -0,0 +1,3 @@ +// Not all block numbers are defined +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x96"},"stateOverrides":{"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"blockOverrides":{"number":"0xa5"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x93b583ed05f454a78c9279625a3e2871ff3324507e6418e29e53416acc88900d","timestamp":"0x1da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb22b7c9857930782d7a92e282059b1653b643efb6f09a9aff1d65fedfce438b8","timestamp":"0x1e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6005795fd04dd3670db5e14ae6425052c6ee82ff22080293ee3d83c180d65bcc","timestamp":"0x1f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8843675f3b9eec18a5acf116df90a26fae9ef70f21d3cffc4992b760cfdc23cf","timestamp":"0x1fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8601822b6dff617cf93178957c0162d95c7cc411278934e676b2271d9364bfe0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x04238f2fad5e4b9820daf76c60946eb702d35577d2d1e6d5fc2c07d229e75689","timestamp":"0x20a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd482916837d0d43b8cd15d00d4c0f50ad019311d1c7e6fb220e053548dc08181","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x34","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8601822b6dff617cf93178957c0162d95c7cc411278934e676b2271d9364bfe0","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3d5f58fbf02276461b11687866a4a1389fad17ca6ea7fdf4c7f2c5afa8cc546f","timestamp":"0x216","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66c675d5b1ae5453cbf525ac2d1a071256605445d474af3764a36783e90b342d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x35","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd482916837d0d43b8cd15d00d4c0f50ad019311d1c7e6fb220e053548dc08181","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x429c0581461d0048471b1d8d85f7d129cf493114e4ca1e11a154bb649521f932","timestamp":"0x222","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdaeb4e1610aaeb576bc75667c8ab9d27f6985f41880ddf71b3ecc8c31b617def","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x36","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66c675d5b1ae5453cbf525ac2d1a071256605445d474af3764a36783e90b342d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9ad06fa7f19d678709c797246788f30a9a8d50083b9174a8f684e578c1b337bd","timestamp":"0x22e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x29e75d34d78b5ce656144d6a6c3bf4202c6675bd377d4d524642f9974242dc53","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x37","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdaeb4e1610aaeb576bc75667c8ab9d27f6985f41880ddf71b3ecc8c31b617def","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb257cd80dcf19266611330111a884c035949b733ae11293ee7f2f413c040eb00","timestamp":"0x23a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0133115003249877758a0a7b4b2cb3abbd588dfd288d65ce526dd846093ebf1f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x38","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x29e75d34d78b5ce656144d6a6c3bf4202c6675bd377d4d524642f9974242dc53","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x748a1144b73935425b353cc1b3e9dc52b65185d16805f7ae49c9848314783fb8","timestamp":"0x246","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xfdd9cc30b33f9c3a2b97b68be9ddd6e81ff1a07a2be726ac0febaa5f2392d459","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x39","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0133115003249877758a0a7b4b2cb3abbd588dfd288d65ce526dd846093ebf1f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x76ec1c536859428dc30369bc138debb3452821ff276a3325de5f42652f444d26","timestamp":"0x252","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xfe78d6efb5c8530530155c3668c21e44f60186b1d5a00a16156d61b43be303ef","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xfdd9cc30b33f9c3a2b97b68be9ddd6e81ff1a07a2be726ac0febaa5f2392d459","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xfdf8609e246603461119428ebaac69550bd3c36ff86ef30165990adff6d2be6e","timestamp":"0x25e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0729266199133c339d73a4634dd23ea464b07d1c9fe428ce0918872f95c63391","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xfe78d6efb5c8530530155c3668c21e44f60186b1d5a00a16156d61b43be303ef","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x81ebfa0bb0b1b70d20ddb4a67246208eeefbb10891cbebf856743d7b3f6c9908","timestamp":"0x26a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xcd2e233fb7d2872b90df087cef5924d56c32392efcc395852af0406f11ae31b9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0729266199133c339d73a4634dd23ea464b07d1c9fe428ce0918872f95c63391","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xbaaa8eb896e5147550b114e6af3978e8ba594df1bba083237f6a20b6786690e8","timestamp":"0x276","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x52dda0b06d564d39e2024606386a20c2b3683d73d9414dfd2291328c63e8bfbe","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xcd2e233fb7d2872b90df087cef5924d56c32392efcc395852af0406f11ae31b9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3570aa758c5308988ccc5dddc7eefffb8c68658b714f57cd401985088f7bbd8f","timestamp":"0x282","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xac50ebdb20acbd21ab85b43de531b7391d0488f0c4691f065c5bb0f539ae2544","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x52dda0b06d564d39e2024606386a20c2b3683d73d9414dfd2291328c63e8bfbe","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x76d37fb5fbdc3604cd1e01b6dca67d64b48419181ef85ed359fe5fdaeb749f4e","timestamp":"0x28e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2c72f0e8f9879e87afcf5b7cf14c577292c3756d96fdb96be1a0db19a3fe2138","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xac50ebdb20acbd21ab85b43de531b7391d0488f0c4691f065c5bb0f539ae2544","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x33ef6631f64ff5962a0a9217a5c4246e03df7f11c178e42739d5c7c1ccf302af","timestamp":"0x29a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6a73f2efa3e6e4e78bd42d49676ae0eed56e81343c866121d82dcdd5de62253b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x40","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2c72f0e8f9879e87afcf5b7cf14c577292c3756d96fdb96be1a0db19a3fe2138","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x159e1083679b7cd1bf74536e5120fe2350067b825590f228123d4592853a9d7d","timestamp":"0x2a6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xabaa9c3986d6105185af688327caa0504d5e99139dc06849239adacdc581430b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x41","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6a73f2efa3e6e4e78bd42d49676ae0eed56e81343c866121d82dcdd5de62253b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8d9789e2e5c3083a76bcb3e2d6795d5d2337cff0c9a4f368906d489dd7ba5705","timestamp":"0x2b2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x98fcd914f7d54e04e8dbc668e507f0cfed33bf09a5be8e4b5f93eb3b345964cc","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x42","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xabaa9c3986d6105185af688327caa0504d5e99139dc06849239adacdc581430b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x809eb555a0a33d348d57b34ac3f31d6b433341f144c4455bb2fc5a0113467048","timestamp":"0x2be","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8cc815a4cba5f7dbc78039f7ad9f7d7226344ff94e5caffae7c1f9cfe6d89871","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x43","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x98fcd914f7d54e04e8dbc668e507f0cfed33bf09a5be8e4b5f93eb3b345964cc","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9653b693ffb5fd8adbebd8f9568fe095de3c209bf99d8fb3b60fc90bf2a6f0f3","timestamp":"0x2ca","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2894f323e2bb9ca56314e82afac65edc4805f0ba81b7fd5e8b657e83f62a506a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x44","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8cc815a4cba5f7dbc78039f7ad9f7d7226344ff94e5caffae7c1f9cfe6d89871","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3d0254e08d717894ac89fffede73c9f663a7f385486a69513080781c1713f14e","timestamp":"0x2d6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x161373dd1560ae657ce48bcccc83b701ed3cfcbc523804b929f0332141ad9d10","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x45","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2894f323e2bb9ca56314e82afac65edc4805f0ba81b7fd5e8b657e83f62a506a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x0e37e1b277f1cee1cde82f3ba1420d4552a6f47a1b322b2c3a3d64ae5a0bfa4e","timestamp":"0x2e2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xca8b69c317b7fab2378e640bd8d6ca19df14f6760954c13a8ba84c611deed43b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x46","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x161373dd1560ae657ce48bcccc83b701ed3cfcbc523804b929f0332141ad9d10","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8faf3dc0bfc13b14cf660b310da1cc58f1264037dd33cc93a62f6fe6521099c9","timestamp":"0x2ee","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6b0ac21041bdeb4aedc2a35989cf2b4cf1bfb96b5dc27fd8466d1b958cbe146d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x47","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xca8b69c317b7fab2378e640bd8d6ca19df14f6760954c13a8ba84c611deed43b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6db98a08c2240d8d1a002fc9fe3cdd691c5a18f902ff85cdbdb23470f45eea97","timestamp":"0x2fa","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xbaad6455bfe19ccfdc72465faec5c5e804aa1347fcf0efb551ab515fbe04ebf1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x48","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6b0ac21041bdeb4aedc2a35989cf2b4cf1bfb96b5dc27fd8466d1b958cbe146d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe7569b65712f364f434197edaecee81790e303e191ad2c3cfa29a4ad561f68be","timestamp":"0x306","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4f805c3054143e26caa77edde793d043f917e08d52648a0105ac55724322500a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x49","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xbaad6455bfe19ccfdc72465faec5c5e804aa1347fcf0efb551ab515fbe04ebf1","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x506c939d3211b0462ec8df49618242bbad5d825c5dbafe84734c6ad4dccace6c","timestamp":"0x312","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5435103be096885dfdd7ebe0c7aba47763400c274a75ee3697f20c591c0a1088","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4f805c3054143e26caa77edde793d043f917e08d52648a0105ac55724322500a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xeb2c561b1ec1d89b201fc8a8e1e36ef6652996f5cc57d0215784a2dedf64e7eb","timestamp":"0x31e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa6b1ed1f38fe02e7292b64cecae4798d0bb9550d3526864008082032ca765352","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5435103be096885dfdd7ebe0c7aba47763400c274a75ee3697f20c591c0a1088","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x11b6e13e95c9a0164247e80ba4136be5ecf188c3d9d117f00fa5c26e01d9b437","timestamp":"0x32a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4e3242bfe68953efdc239a89081e2bc20e6e219583578c11c8d9514417fd18d3","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa6b1ed1f38fe02e7292b64cecae4798d0bb9550d3526864008082032ca765352","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x02ef58478ca6a7a505a614dbd4614aae007923f2f14fd2075cfcc5150a9ef7d9","timestamp":"0x336","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x96c812ede9927b0e0a88363779a7d21bd9063872ce27e4193af7dd5b2b2d1a21","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4e3242bfe68953efdc239a89081e2bc20e6e219583578c11c8d9514417fd18d3","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xbb6492e7b50c2dc91683b89626df1470bd68b52abf02376ecaf3f22031a7d0cb","timestamp":"0x342","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd3e86890b88430849a1ea2d93eb62c1a53cceecd07db8edd105982aba57a7d50","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x96c812ede9927b0e0a88363779a7d21bd9063872ce27e4193af7dd5b2b2d1a21","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb9e86a2d0f3ced199ce9f288e5d25cb6082d0e15ee697f07fd99ff50713187cb","timestamp":"0x34e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x3155a2060b592699b644476cf85c31fe9626e4ed5e33485b02a92efb7b24629a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd3e86890b88430849a1ea2d93eb62c1a53cceecd07db8edd105982aba57a7d50","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x1f594f957a0cf52f05e652fc0762e0dec220326e4651c78267d0c7867ae1d54d","timestamp":"0x35a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5a7b1e7d6395816156a2e17507897b680377a66fdbd0e366c86f3af74c93fad9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x50","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x3155a2060b592699b644476cf85c31fe9626e4ed5e33485b02a92efb7b24629a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6a1811e88d4977966f819202df26d41af836e01f103783be18391449f85a5125","timestamp":"0x366","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x38906bc69a277fa416c893b94302d802f5723ede945eba2418e820d41f0d6d0a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x51","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5a7b1e7d6395816156a2e17507897b680377a66fdbd0e366c86f3af74c93fad9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xcf8d4f7d609556b41f7528247cd27b96e18ff390624c05788790683af5e41960","timestamp":"0x372","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5b2ad1a071ed6464624b3034ad9b3749b3895ba2852470b8f491347a0f32a2a2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x52","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x38906bc69a277fa416c893b94302d802f5723ede945eba2418e820d41f0d6d0a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x7ab86be47c96bd5d0e7211291e21035e3452aa3a294bf452d7d59f0bd530252b","timestamp":"0x37e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x3fcef7f17588fb889ed49e2374999a756bbaa704d9d57db002c86a5f5ecc4177","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x53","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5b2ad1a071ed6464624b3034ad9b3749b3895ba2852470b8f491347a0f32a2a2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3d22f887ab26489745f15a660a1637db776a3b04e7d57382067537435e41781e","timestamp":"0x38a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd5f086069738bb8f727e58f7aac29bef55ba54f82f918ebae8a01670c5e70c27","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x54","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x3fcef7f17588fb889ed49e2374999a756bbaa704d9d57db002c86a5f5ecc4177","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xefea0016c1558fcc4c609cc011714c36ac2b9abbd68266c3dd7f00d02eeef7bf","timestamp":"0x396","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x730fa5fa1f2f1e27765f37f320899772a8023fc63a835b05c0350ba2560a5424","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x55","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd5f086069738bb8f727e58f7aac29bef55ba54f82f918ebae8a01670c5e70c27","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x51a38a30f9653f68b51ef4a177646e6ff548c712fd514103fbd330b76048f7e0","timestamp":"0x3a2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2d385b07b824c9d311f65d72e96a86eff377a0be776f551c77098776ffac679c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x56","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x730fa5fa1f2f1e27765f37f320899772a8023fc63a835b05c0350ba2560a5424","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x2dc72e9a5d09644162872b029f78c3ed626bb13f136e7ea72ea083b0164ca668","timestamp":"0x3ae","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x74e579629ba4222639df07b5d89bdd43bdb95818f161b27051b967dc9ecebe89","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x57","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2d385b07b824c9d311f65d72e96a86eff377a0be776f551c77098776ffac679c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xf9e46a58054da72b6303c7768f56888612a981073ac70a63d7419276ef220af0","timestamp":"0x3ba","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x143a1308be8a167dd13242d905372be062773068118e3a602dcf3cfc375b8a9e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x58","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x74e579629ba4222639df07b5d89bdd43bdb95818f161b27051b967dc9ecebe89","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe55a73dd6589cefc19b930daf3a5a8482d90618d2295da8376c7af1b163a5230","timestamp":"0x3c6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4e066e66baf309426fd9241a3f74215912db75afd3a34c195097344df3f92dfc","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x59","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x143a1308be8a167dd13242d905372be062773068118e3a602dcf3cfc375b8a9e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x4b4404de4327f07f33cfaee5a0b8b78e066977b5957fe27bdfe11a226efc9e27","timestamp":"0x3d2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x59a4139c0e218e0d38df2862cea8994a9cee78e3bb598d81ad4c29eac8aca0fd","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x5a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4e066e66baf309426fd9241a3f74215912db75afd3a34c195097344df3f92dfc","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xf64eaa92a63079482d9e17353f3763dde2df9f68694c2f49ad46da052d265ed3","timestamp":"0x3de","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xfb41dd07d240a8c621a73dba6fe264ed6816e425e8fb6b8257e99892d4d3c780","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x5b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x59a4139c0e218e0d38df2862cea8994a9cee78e3bb598d81ad4c29eac8aca0fd","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x71594a7b5342b6a6eb67f3ba70b14f4f161824eca2f17a22121d16a2d4716499","timestamp":"0x3ea","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xcd5168b94d44bf496ba8080621aefd6cc0f2fe6efc6f9c7c440523ce9057330b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x5c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xfb41dd07d240a8c621a73dba6fe264ed6816e425e8fb6b8257e99892d4d3c780","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc7bb13002649011b1d422e60b90175b8474e854505fd0b6fce8ac3cd043ead14","timestamp":"0x3f6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd663ad59ec5a050320a6222e037e3a5fa36707c3a35e6104b1548f80ebfe7fd2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x5d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xcd5168b94d44bf496ba8080621aefd6cc0f2fe6efc6f9c7c440523ce9057330b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xbccc8a445165c3a648433301879fa6d90f3a7b8377859588d9ce3c3cf626f64d","timestamp":"0x402","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x96ba0d494d51cb4c7cbca32b78a15ec58c8dc24a12e5a0ae1cf5cec0115cfb27","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x5e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd663ad59ec5a050320a6222e037e3a5fa36707c3a35e6104b1548f80ebfe7fd2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xef47e2db30672ed3024b25a45c5d09e0d8012c5eecd964658ff8dd14c623fe79","timestamp":"0x40e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2feac344d9a632fbf5f0c7fb55108136c70e834cdc26601cd5d8639961e0ca9a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x5f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x96ba0d494d51cb4c7cbca32b78a15ec58c8dc24a12e5a0ae1cf5cec0115cfb27","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xd636efd6557fc2b86d14daee78cafbc2972b6e74e6f79826b6197abcad6401f2","timestamp":"0x41a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x01233c8dec067ebd8841148fe40489c0136e1d3d15c0b63252fca3f43b329545","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x60","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2feac344d9a632fbf5f0c7fb55108136c70e834cdc26601cd5d8639961e0ca9a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xd80989a16125b3b3e27a6754a05e178b75c0ce4cf55f0986a404d7cc5461956b","timestamp":"0x426","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5b0edfd58d134f1e2a7788e80d973828f6f1cae1e2f7e9ac359854b17c8bb792","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x61","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x01233c8dec067ebd8841148fe40489c0136e1d3d15c0b63252fca3f43b329545","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x825f9d354b6795b777c35856f47c0233fb1da27787cd8440edb95a6cabfbe3e5","timestamp":"0x432","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe4227d7f49b348ecd099abdb5deef23f492fbd3f751445a4e5b8827532e0cdd7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x62","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5b0edfd58d134f1e2a7788e80d973828f6f1cae1e2f7e9ac359854b17c8bb792","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc500e9ed060b4aa130a93bac09c1faa51a9c9ca313b21f6c0ed0883059682847","timestamp":"0x43e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2828e0d7ba7cebb6e2c440d8fa1603ebd4601645aacd636e374b93df3e633e2e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x63","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe4227d7f49b348ecd099abdb5deef23f492fbd3f751445a4e5b8827532e0cdd7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xca6a826d5b09fd094437817a82f58231069adfe17fc9e883ec0828d4ae93535f","timestamp":"0x44a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x40256e01c837d48f6a4ae6544416310de89f55e37cf69599d565667d039dc52f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x64","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2828e0d7ba7cebb6e2c440d8fa1603ebd4601645aacd636e374b93df3e633e2e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x0eac1146a203c5b13b5d0801d407cc63fddd23cbb84dae3a44e6278f97f13c94","timestamp":"0x456","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1b05c128a34c69336a5406823240204bf8ab250f68c42b77496955ba9b873e02","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x65","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x40256e01c837d48f6a4ae6544416310de89f55e37cf69599d565667d039dc52f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x4c3c6ee9c66b6b246021c1e66b3e6b415edc3e4234ffb8ab7a67ae99f23974c3","timestamp":"0x462","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xc3798244790b1ecc03e3c9ad1ade72c37b31032a99554360c25992d5f3512064","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x66","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1b05c128a34c69336a5406823240204bf8ab250f68c42b77496955ba9b873e02","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3a72e2b9e7fcbd0a083115cf66dfb8de9c96477050d0d92e5a0ba3cef091ebdd","timestamp":"0x46e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdebbf1e0124eb0f52896e6e9f324a56ad26243bb58d8b5efe7ddc20c99ad5020","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x67","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc3798244790b1ecc03e3c9ad1ade72c37b31032a99554360c25992d5f3512064","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x1a31efa2d557d1f57e593156b8b9f178350d73cdaabefd86cc9d34547f48eae1","timestamp":"0x47a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0cf6a561ead5d232dcf17585b479492a941c47f02bda5f918396858accb2ebe2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x68","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdebbf1e0124eb0f52896e6e9f324a56ad26243bb58d8b5efe7ddc20c99ad5020","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x2e6dfee195ead4bf3a64f2068fb5d24697ca24ce8159263f982d38cbf4657f2c","timestamp":"0x486","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x053a799411e3784064352a6a635c0136d75ffbbf1cac31415e2366a371c15365","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x69","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0cf6a561ead5d232dcf17585b479492a941c47f02bda5f918396858accb2ebe2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa28ab426381aa543fb066dcf86eda916297a82fc946f3545b20d0c6fe2d6e8d5","timestamp":"0x492","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4d8480a33371c1eb329242f94ed3919f7c0d0a0df2a9f6f6e524d340471ad5cd","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x6a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x053a799411e3784064352a6a635c0136d75ffbbf1cac31415e2366a371c15365","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xebf486946e91a3aa9d050a7d9aa9705f262886ccea929fd7132150ad049a6981","timestamp":"0x49e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xbe38b6a00fe455ca4d5d8dec162978560cb6b20aa30bb2259fc615f26a888496","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x6b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4d8480a33371c1eb329242f94ed3919f7c0d0a0df2a9f6f6e524d340471ad5cd","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3d79a5305192abbb922e2c5f6b43347acc94c45aa6ec1fc0226ea41c3fc2bd32","timestamp":"0x4aa","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5585134bf72101b6f228df4b43fccbe1f66934de2c92c8ccf8a7c04373edd000","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x6c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xbe38b6a00fe455ca4d5d8dec162978560cb6b20aa30bb2259fc615f26a888496","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9c2fb38c8640f7426844eabc67bce60548093b583d1355ef177c3ec039b324c1","timestamp":"0x4b6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xfa10d28f1feb0b6a7c6daf6cdf520186ac9472563b8307f772b061d72d0f2f21","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x6d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5585134bf72101b6f228df4b43fccbe1f66934de2c92c8ccf8a7c04373edd000","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x0cc15d9ef9f6b01dd147001dc81b61e1194512bf52498e8cb9a4880ad705d575","timestamp":"0x4c2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4c667d06615e076a8717a147a7395fa157e547944443a62c93d09c7e8de24d54","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x6e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xfa10d28f1feb0b6a7c6daf6cdf520186ac9472563b8307f772b061d72d0f2f21","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x2be05cf3cf6c8b3aa3a7d8074d9796ddaff486269e25f078cc1234f96c92bd5b","timestamp":"0x4ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9de833ad7c5bf914e7002ee77f3e36b54f76832dc9ff46cd1461de889aa99d87","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x6f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4c667d06615e076a8717a147a7395fa157e547944443a62c93d09c7e8de24d54","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3cf3beea65064a3713c9c75563d11b37ee7d468c527e11c42b475fdfde7612fd","timestamp":"0x4da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6fef64d516b540a494ea2dc1a525dce99113cfb45a36323edc670e28188058f2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x70","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9de833ad7c5bf914e7002ee77f3e36b54f76832dc9ff46cd1461de889aa99d87","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x98513b7d13519ff6ca446ed2de20023d73e56c18c9aedf3d04a318aa8488724b","timestamp":"0x4e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x7f8899899e27c9878d3d88de43f6c7bbe0ff75e476035a184daf4ba6010a17ac","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x71","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6fef64d516b540a494ea2dc1a525dce99113cfb45a36323edc670e28188058f2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x478eb4cf1d418ba7b006a355edbdcb916b2bfa5b1d49663b4bec69989c8c59da","timestamp":"0x4f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0b63b1eac0584ae20d661a2eae52d11a3729d08d6bd1e00d4b1542ad97972834","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x72","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7f8899899e27c9878d3d88de43f6c7bbe0ff75e476035a184daf4ba6010a17ac","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xf6a6f96a677156e50eb38b91966b98fa6c65a4c7d704596611698267008432c6","timestamp":"0x4fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd51c3a7359d2f58067fbad5f9f4e0f8b1dc372342084a6baa041c47b57804dbb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x73","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0b63b1eac0584ae20d661a2eae52d11a3729d08d6bd1e00d4b1542ad97972834","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc7b508220e954a079a84675c6abca844791d17369d5dcbeac4cd01637ee8fff2","timestamp":"0x50a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xaa2167ae5cf4f16cdc15bd8bb41b3932e9d1e447cd62de439b6bd61ca63eb8ac","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x74","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd51c3a7359d2f58067fbad5f9f4e0f8b1dc372342084a6baa041c47b57804dbb","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x74349c0088772cd45108e4958c6a68aaa8228b357aebdde84bca26127889e07d","timestamp":"0x516","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdfad11357982ecced31d3a3c2150646b1c448bbd5f00ec31d1dffb245e525ec4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x75","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xaa2167ae5cf4f16cdc15bd8bb41b3932e9d1e447cd62de439b6bd61ca63eb8ac","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xef4d8de779336f7b44bd8f8c1a7d41c0193d6f8f7d38e63db1fb5b8fcbdc476a","timestamp":"0x522","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9aba1d24c718ca0681104aaf3cd90595482483a78152e305e5763e06ca6bd4c1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x76","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdfad11357982ecced31d3a3c2150646b1c448bbd5f00ec31d1dffb245e525ec4","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x0399bfa9a7288563cfb6fb98d5d41065ce28a249fcd906dc199904118c89c8f2","timestamp":"0x52e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x34bc89d51081eb1b4d4e4f0ee911d4c348031161687505e552dc96400ca3e7ba","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x77","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9aba1d24c718ca0681104aaf3cd90595482483a78152e305e5763e06ca6bd4c1","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa148ecd85beeab6927f4b1b1f33941410f8ef1b907b0c2e1e509e6ef1c5fb02a","timestamp":"0x53a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2a8f433e1657ea32c2f53b6f59686dfa09845a178f37b661029a6a7dd0a67d24","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x78","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x34bc89d51081eb1b4d4e4f0ee911d4c348031161687505e552dc96400ca3e7ba","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x71955f97419711ebe69b2cd72c7c10c100044ce0dd34f48882f72e70fa42dd9a","timestamp":"0x546","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x7de53d54ffe755cde66cdedaa439895b803aaaa1835d7fd9224c6a80895c2196","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x79","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2a8f433e1657ea32c2f53b6f59686dfa09845a178f37b661029a6a7dd0a67d24","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x732e44ad1a534ce008fc5b31a17cbd8ea8828608d6250e82d6d4b511d5780fb0","timestamp":"0x552","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x216db9dd629bd5c69880e642589eccdef8db157b7e8a33c21c5f47521e433b36","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x7a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7de53d54ffe755cde66cdedaa439895b803aaaa1835d7fd9224c6a80895c2196","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xebb64aef4f64e2e7e5c1d6bd17b70bd54fa1a592b54adde63f2f521b719e2d3e","timestamp":"0x55e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x92174f386965a45989ebf07ec582ea1581dea76da87244241d5f6f3c70f3bf20","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x7b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x216db9dd629bd5c69880e642589eccdef8db157b7e8a33c21c5f47521e433b36","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb8f69bd43a9d6a2b63a946310fdc8327e5ca2127c0180a9098d97c0453243610","timestamp":"0x56a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa8351bc3e24640ded05055e4c808594ad8f2ca5b565dc5e39898396d5ef1db6a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x7c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x92174f386965a45989ebf07ec582ea1581dea76da87244241d5f6f3c70f3bf20","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3efe50b5e34fa933ed611cb6c4d16e4fc1075cf3f06d4bf3ba06c506cc9a5c07","timestamp":"0x576","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x406d24834ddc3d58805a56a08c00e095e9c45e27a26f9af11f1805a13ca274fb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x7d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa8351bc3e24640ded05055e4c808594ad8f2ca5b565dc5e39898396d5ef1db6a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6d257dc3421d1cd174fc9c8e0c83331a457096a3d76f79ee29c495dd4524252d","timestamp":"0x582","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x01e54daa280730c0e9d06bc90f06915a31c5b817e9c0ed53fe76f1c2f3e8f438","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x7e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x406d24834ddc3d58805a56a08c00e095e9c45e27a26f9af11f1805a13ca274fb","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9c3153330fc376f880fdebbd9f2b29ca6bcbf3fc284f30c4bf97412b1813d9b7","timestamp":"0x58e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb72449437136651826f1852dfe184b11e9e3d4af4f65b70c03c3e77925f9ac50","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x7f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x01e54daa280730c0e9d06bc90f06915a31c5b817e9c0ed53fe76f1c2f3e8f438","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8ba288e7d0696d95a37365aab4f754241da654bdbcdb7f36639d77b8db2f9e1c","timestamp":"0x59a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe17981e873d874f816c712bd7533b5d650e0f81e5934a44f71adacf24c34cf38","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x80","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb72449437136651826f1852dfe184b11e9e3d4af4f65b70c03c3e77925f9ac50","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x5bb446ffebb1d66070eadfb2680b366d8902476a656b1519c542d653602e901d","timestamp":"0x5a6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x90e3f8915dd4eb3263bf73a824fa8118da142e366eabee4e045aaf9a2fe0e10f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x81","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe17981e873d874f816c712bd7533b5d650e0f81e5934a44f71adacf24c34cf38","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x88ed54a5e889f9328008c5db4d7073395388d508cafcfd0b0b8beb02436b75c6","timestamp":"0x5b2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x11907302c494a7fcd10a0027d74fcb6d23ce37809f87d22b726a33faf9e7febb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x82","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x90e3f8915dd4eb3263bf73a824fa8118da142e366eabee4e045aaf9a2fe0e10f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xe1c0e3846d05d6c9c87026d21761e1b294068fac4fa2844c3f6059becdbd9395","timestamp":"0x5be","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9581c63938dcd901502de608230e2855184d7660be854b9945ff7e2de48d0acc","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x83","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x11907302c494a7fcd10a0027d74fcb6d23ce37809f87d22b726a33faf9e7febb","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xce764fbc656a7921a2ed157f081aa8d2d93ce22c7bd8ec9aa27f4433e0f92257","timestamp":"0x5ca","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x7bd7abaf06daa580c09c40cd1a013b3430c2ce49e124d957c939a08f223e404f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x84","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9581c63938dcd901502de608230e2855184d7660be854b9945ff7e2de48d0acc","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xa0540811d9e7e55a58ab654db18113f2c9f5d03cbd437865f7e7b220b198c559","timestamp":"0x5d6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x41bcf40cd6e9276ea825647e5227a233ced4eb1070cc6d8a16061a454ba9e1dd","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x85","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7bd7abaf06daa580c09c40cd1a013b3430c2ce49e124d957c939a08f223e404f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x8c4160af3af5147d1affd92f99b93c161ea818edb675f8baf5b84cda06a72dfa","timestamp":"0x5e2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x68868e48fe2273f5373cab5c13ea1aeee7b38b3b0138a72c32e9a2112527c98a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x86","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x41bcf40cd6e9276ea825647e5227a233ced4eb1070cc6d8a16061a454ba9e1dd","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x31d93ba8c2131c2f5660a33ec714ae7f8e4e2c5747a2b3c306d3cae9b13a528d","timestamp":"0x5ee","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa5ce895fc4e246b041ce85df13efa9588944d2e29ae7271bbfad399e55299424","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x87","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x68868e48fe2273f5373cab5c13ea1aeee7b38b3b0138a72c32e9a2112527c98a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x38daa69b761a2db24d31e3b66cceaa8e884ce65c97cc1701f039c1828ccb6411","timestamp":"0x5fa","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xea849fafe7e42d844e5afea64bf25bf1d4fc076eeb379f3cd7eedc295c2003aa","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x88","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa5ce895fc4e246b041ce85df13efa9588944d2e29ae7271bbfad399e55299424","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x17b5618fcd61ebea4988466e211a751ced4f7ff186e0ec44c63adec9b52f49ab","timestamp":"0x606","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8fca19d2070db1044fe298a459412239a6faf40c713f3602cb306145ece1bc38","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x89","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xea849fafe7e42d844e5afea64bf25bf1d4fc076eeb379f3cd7eedc295c2003aa","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xaa2cb5c35e41fd84892bee3069951500d6edd414ae208e1037263ab6e6922502","timestamp":"0x612","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb03d13d295807f7dbb6fe0950d016a7bbbd1c5a1b1e00842532569d7a4cc806d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x8a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8fca19d2070db1044fe298a459412239a6faf40c713f3602cb306145ece1bc38","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x9c26394425f830c6f3d84e85b53357fff767a32f9371f30a370245df91b4671c","timestamp":"0x61e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe1724ca84d26e7cfca11b64a2269624881e233cf5ec52f3479d3ef55322aacc5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x8b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb03d13d295807f7dbb6fe0950d016a7bbbd1c5a1b1e00842532569d7a4cc806d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x50a1b27d61ea58175a48b7ccc5b55bb2be4544788f239e582bdfe97b67d060de","timestamp":"0x62a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xf4fa618f799973158be14d26f38ba08426ad7eb3ad44231c090edbef7433f8b9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x8c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe1724ca84d26e7cfca11b64a2269624881e233cf5ec52f3479d3ef55322aacc5","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x613f21528323b62230d426a227e4ee13fb7f0839a24b83c6eb63dfe905612c1b","timestamp":"0x636","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x7e7b20110193be07d3816cbf005c36d0d4eff2b23aee82b6d37013eb6f83ff24","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x8d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xf4fa618f799973158be14d26f38ba08426ad7eb3ad44231c090edbef7433f8b9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x9a8470d71fea8d20ea0f5e2e3077ed30fc9e9003d90d97ca7c0105a9ba206304","timestamp":"0x642","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x82679e6d554799aeea0d316856355466e4245f2e2638e832be6a6f8f519a1b54","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x8e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7e7b20110193be07d3816cbf005c36d0d4eff2b23aee82b6d37013eb6f83ff24","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xe3b28dc3078f3343038fdfb4b428d0705744cd216500cdbf7a9380391697bb66","timestamp":"0x64e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x631581fc1b6993258ccefda0168c9fb77c6d473a05953cd054fb7fe8139ccb04","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x8f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x82679e6d554799aeea0d316856355466e4245f2e2638e832be6a6f8f519a1b54","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xd87fc2d44756340dfc85baefa0fbb7700a9fc3e5b916f2047e13ccf833da03a0","timestamp":"0x65a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5fa47217d16f75327fd372237dac0178f1e7910c6db8534ef381565f88e32a4a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x90","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x631581fc1b6993258ccefda0168c9fb77c6d473a05953cd054fb7fe8139ccb04","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x24ff4f25d7ebac43a0a72dba1326ade5204573c41aa0bc91c20e3a2c35ae165d","timestamp":"0x666","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8a813ad89e948a689d969839e3441197029cdbd7dd0cc0cf16b750942405e4de","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x91","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5fa47217d16f75327fd372237dac0178f1e7910c6db8534ef381565f88e32a4a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xed056a17af9f5cfa8f78b273d2adde926ba9d12bf2157c4c1ba1f31382cb5fb3","timestamp":"0x672","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2041fa8ad520218f6ef6dd2617592efa1cfb0cbb0c23b7f390725caefbffb6a0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x92","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8a813ad89e948a689d969839e3441197029cdbd7dd0cc0cf16b750942405e4de","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x09678b7808fc56e72fd76fd3fbabb9693f27dcc766ca971e247e2f0e747aea6d","timestamp":"0x67e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xbc7b581403a389f45d63ed87f2847c9d72e113dd766b12baef2fc2e876602c8c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x93","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2041fa8ad520218f6ef6dd2617592efa1cfb0cbb0c23b7f390725caefbffb6a0","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x70c3994c765d840f42a98a702c44bd391baa2ed22a0d05d84c01b542f293574c","timestamp":"0x68a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x96c93b0b8af9dd67495bba9946392b9661dcdb12379daeed041c63cca2a7c4ed","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x94","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xbc7b581403a389f45d63ed87f2847c9d72e113dd766b12baef2fc2e876602c8c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x50d902c610a18a4aa7917c8a31a13ba05d03e8141beb0bfe7bfb6a792d2e4201","timestamp":"0x696","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x21d72a0552fec10790b948afc164e5c0f09a74bcfd5010a3da1eddfb051f5f0b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x95","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x96c93b0b8af9dd67495bba9946392b9661dcdb12379daeed041c63cca2a7c4ed","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x522b15d727d0f8b4733b9c25901a6547a0ee1bd53186863f9f621bb45f84601b","timestamp":"0x6a2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c40000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000006ae0000000000000000000000000000000000000000000000000000000002fa9e36000000000000000000000000000000000000000000000000000000000000000021d72a0552fec10790b948afc164e5c0f09a74bcfd5010a3da1eddfb051f5f0b","logs":[],"gasUsed":"0x57bc","maxUsedGas":"0x57bc","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x57bc","hash":"0x509cc589402b0effcc69d60867cb7206bf33e85630bfd245af0678d2ea5539f9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x96","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x21d72a0552fec10790b948afc164e5c0f09a74bcfd5010a3da1eddfb051f5f0b","receiptsRoot":"0xe74486ea84ef8b10f828f52661656b006a7ff4ebe2dcf9830f985d1fc73c710f","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x293","stateRoot":"0x24ae40003fc410ae62bba0f60000cc2a36f57975c4a30f705ea6f510a7845156","timestamp":"0x6ae","transactions":["0x234a1d9897819c206fdeb6af312d742010a91b5b4159978a902c9a0b90e7bee5"],"transactionsRoot":"0xed81b1bfe79c8c81d3fe874f7214a9fb9dd186e8243abfeabc506550a532c09a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c40000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000006ba0000000000000000000000000000000000000000000000000000000002fa467a0000000000000000000000000000000000000000000000000000000000000000509cc589402b0effcc69d60867cb7206bf33e85630bfd245af0678d2ea5539f9","logs":[],"gasUsed":"0x57bc","maxUsedGas":"0x57bc","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x57bc","hash":"0x7aa556a410fadc6d4e9c7ed5143d7c4629182123d3023543b32250e4e5bab517","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x97","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x509cc589402b0effcc69d60867cb7206bf33e85630bfd245af0678d2ea5539f9","receiptsRoot":"0xe74486ea84ef8b10f828f52661656b006a7ff4ebe2dcf9830f985d1fc73c710f","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x293","stateRoot":"0x13dbc55bd0816f1698082389566557a773bb43ec0858b8b59e6494b6676ccbe2","timestamp":"0x6ba","transactions":["0x6ce88f983eaae4b847945d3f970c97950a25d002ea517fa0fc033c363ce4f6ec"],"transactionsRoot":"0x4fc32bd4b557c1dd259db629f1ee51f2584efc64ede702c95479e36c1cebe63f","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x415377386648e11f2753d65f4f28158e4d981f795705e55f3ec2cdf795ff811e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x98","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7aa556a410fadc6d4e9c7ed5143d7c4629182123d3023543b32250e4e5bab517","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x62138749ed517e114abd411b9043aaed4eb3fbf5f787fb105dfeaf965cc21e35","timestamp":"0x6c6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x458f18465eb6fd638b68c9bc977da2c7913eacbf06a063f512e460f2739e965a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x99","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x415377386648e11f2753d65f4f28158e4d981f795705e55f3ec2cdf795ff811e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xd26b2ece523284fa154eee3d045a2dd607efe5ed3f49427ea3e7f28665fbae48","timestamp":"0x6d2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x7984c522ab3fe78b0e4a46db75fffdf5dbdfd537578cf6170fe38d16540500c1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x458f18465eb6fd638b68c9bc977da2c7913eacbf06a063f512e460f2739e965a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x39e2e111bbe7a7c109afc5bcc7cceeeebe0b895fbe04915b365d2eb2f9a80c25","timestamp":"0x6de","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa77d33422919139f95d651be059f2987e1abb063d20d9c07cd2d92079db73212","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7984c522ab3fe78b0e4a46db75fffdf5dbdfd537578cf6170fe38d16540500c1","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x46c5fd8862d41a313faa6a7ccfdd9fb4fa7e492e72ebefa8a54ede1af80b456f","timestamp":"0x6ea","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2ae4de02ee3a119b00379da82b8d5ac1c41d64dd62bc65dfa733c00d684f0e3b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa77d33422919139f95d651be059f2987e1abb063d20d9c07cd2d92079db73212","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x5f576e1bd82fa316b1b22214dfbf091ef7e7d2ada0b70e01ed0ad4b8e7cd0eb4","timestamp":"0x6f6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x396148dc8932c54f35ea835bdffcb531d0f01924ab3b1a4d793f6c8a09647c48","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2ae4de02ee3a119b00379da82b8d5ac1c41d64dd62bc65dfa733c00d684f0e3b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x5e288b4a795a6dc5323f2bb67637d4dabcce5ce76c04f806e93f657aae916360","timestamp":"0x702","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x79e8ef6ab77864e6201855212fb99793678555ca5f2ac0ee9a41217c927ed313","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x396148dc8932c54f35ea835bdffcb531d0f01924ab3b1a4d793f6c8a09647c48","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x0583bd33b7f5f838d0139493087c3fb4c4dfc394392f3359a504ab55dd68b592","timestamp":"0x70e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b179ff6d2e94dcbafbfa5caf67e899b04ae8e885a0ea2b21c84c711d0a5e41a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x9f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x79e8ef6ab77864e6201855212fb99793678555ca5f2ac0ee9a41217c927ed313","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x8e13045c380aef2bc954d329d0024a3051d8bcde18bf4cc7f97f1b3963324150","timestamp":"0x71a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6ca1d3d7e42fcf6a54481d689f2e0101ff6252859090b688a066473d5a3b7248","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa0","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8b179ff6d2e94dcbafbfa5caf67e899b04ae8e885a0ea2b21c84c711d0a5e41a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xb6d20641ee90e76bb233f38d1cf01d999a5d06c8c1c96271f5179c1115eba3e4","timestamp":"0x726","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb4cc708d4b5038a8d276df5e7e9922eebc8cc35985200eb39493526571758051","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa1","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6ca1d3d7e42fcf6a54481d689f2e0101ff6252859090b688a066473d5a3b7248","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xda8245a0ddffa5ffb746b525ff0972e0a70e1f605bb7851ab4ce0f79fa9055f7","timestamp":"0x732","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8ed227cdd4eeff572932fda063f67fb3f2ae86a2734ee1d0a6cad22d21f967db","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa2","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb4cc708d4b5038a8d276df5e7e9922eebc8cc35985200eb39493526571758051","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0x2c02d4da70cca9dc0e4a3c95fe7546019b8f94fdf25ebad80098cf189a29d488","timestamp":"0x73e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb80aec4d267aa12f578b51fd792c43e81103b68df686a34b12f38bd398af55d5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa3","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8ed227cdd4eeff572932fda063f67fb3f2ae86a2734ee1d0a6cad22d21f967db","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xa4c9906d267098b03d195d9f19f4c99d80697c7372402db0d946be6453dd5d76","timestamp":"0x74a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5992b85b9e0aa5b37888d0f314531d318ba24d416e364b27c2c4fc33a69f66e2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa4","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb80aec4d267aa12f578b51fd792c43e81103b68df686a34b12f38bd398af55d5","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x263","stateRoot":"0xbf9cc827ff2b8a5f51ca579bfbbcd1b01591c02a44d5ab0d5f0edec66621690f","timestamp":"0x756","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c4000000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000007620000000000000000000000000000000000000000000000000000000002f9eebe00000000000000000000000000000000000000000000000000000000000000005992b85b9e0aa5b37888d0f314531d318ba24d416e364b27c2c4fc33a69f66e2","logs":[],"gasUsed":"0x57bc","maxUsedGas":"0x57bc","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x57bc","hash":"0x09d609fb517dfefab69d137c47a82e2ce3ee8bb1d90736ed79e2b29884373bb5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa5","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5992b85b9e0aa5b37888d0f314531d318ba24d416e364b27c2c4fc33a69f66e2","receiptsRoot":"0xe74486ea84ef8b10f828f52661656b006a7ff4ebe2dcf9830f985d1fc73c710f","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x293","stateRoot":"0x1f4bb9089f7fa291ebce51e4915f8057bc149189762c83e89c1a45a940eb89a1","timestamp":"0x762","transactions":["0xd1e30e6aa6e9a03761f08100c2430fa79ebbb9aa788f79776852887142c31745"],"transactionsRoot":"0xb757ec4956f6d80fd632ae9ae475d0c1d9c5db0eb09ef6ccf72c21a07b6e9887","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c4000000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000076e0000000000000000000000000000000000000000000000000000000002f99702000000000000000000000000000000000000000000000000000000000000000009d609fb517dfefab69d137c47a82e2ce3ee8bb1d90736ed79e2b29884373bb5","logs":[],"gasUsed":"0x57bc","maxUsedGas":"0x57bc","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x57bc","hash":"0x7226fa65fc0417c50b64de8b2151d085714b7ab041b43cbd15b0936e682cb087","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0xa6","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x09d609fb517dfefab69d137c47a82e2ce3ee8bb1d90736ed79e2b29884373bb5","receiptsRoot":"0xe74486ea84ef8b10f828f52661656b006a7ff4ebe2dcf9830f985d1fc73c710f","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x293","stateRoot":"0x3dca8f595333023f152555e7cc7c4c9262c250cd6e01e0ea04f167c03a31284c","timestamp":"0x76e","transactions":["0x7fa554c14bc98ac8f5ef8d1ded87f28859dc0265561764e7144aae355b41723d"],"transactionsRoot":"0x498f20a97534c74dfe1180f607e531c2fc0ef8d0bc65af61cecaa6028e18eb08","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-add-more-non-defined-BlockStateCalls-than-fit.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-add-more-non-defined-BlockStateCalls-than-fit.io new file mode 100644 index 0000000000..d3df0f3715 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-add-more-non-defined-BlockStateCalls-than-fit.io @@ -0,0 +1,3 @@ +// Add more BlockStateCalls between two BlockStateCalls than it actually fits there +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x91"},"stateOverrides":{"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"blockOverrides":{"number":"0x92"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38020,"message":"block numbers must be in order: 146 \u003c= 146"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-with-validation-38012.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-with-validation-38012.io new file mode 100644 index 0000000000..be55ff6dfd --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-with-validation-38012.io @@ -0,0 +1,3 @@ +// Error: BaseFeePerGas too low with validation (-38012) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0xa"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"err: max fee per gas less than block base fee: address 0xC000000000000000000000000000000000000000, maxFeePerGas: 0, baseFee: 10 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-without-validation-38012-without-basefee-override.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-without-validation-38012-without-basefee-override.io new file mode 100644 index 0000000000..11bbbe9818 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-without-validation-38012-without-basefee-override.io @@ -0,0 +1,3 @@ +// tries to send transaction with zero basefee +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0x35c6daf9a8582b54df84e1a28c0be2f1daa461bcbb8d7c57663d471fff19ae4a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0xe7b5ff27a7c9d623622f9a91238004305f5d07d06b8aac9f8f6236cd0bc18eb7","timestamp":"0x1ce","transactions":["0x234a1d9897819c206fdeb6af312d742010a91b5b4159978a902c9a0b90e7bee5"],"transactionsRoot":"0xed81b1bfe79c8c81d3fe874f7214a9fb9dd186e8243abfeabc506550a532c09a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-without-validation-38012.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-without-validation-38012.io new file mode 100644 index 0000000000..b32629663f --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-basefee-too-low-without-validation-38012.io @@ -0,0 +1,3 @@ +// Error: BaseFeePerGas too low with no validation (-38012) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0xa"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0xa","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0x19575431a2adf8c9b1863aeaf4cd2bd841daea413e5d86e06b74e6d060c3cb17","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0xc139a58f9dd5b0c8b193b762a64bf24733af8c7d6e0c03db4d94ad5afac85404","timestamp":"0x1ce","transactions":["0x234a1d9897819c206fdeb6af312d742010a91b5b4159978a902c9a0b90e7bee5"],"transactionsRoot":"0xed81b1bfe79c8c81d3fe874f7214a9fb9dd186e8243abfeabc506550a532c09a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-big-block-state-calls-array.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-big-block-state-calls-array.io new file mode 100644 index 0000000000..51b9d70cfb --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-big-block-state-calls-array.io @@ -0,0 +1,3 @@ +// Have a block state calls with 300 blocks +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38026,"message":"too many blocks"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blobs.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blobs.io new file mode 100644 index 0000000000..bc312327a4 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blobs.io @@ -0,0 +1,3 @@ +// simulates a simple blob transaction +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0xf","blobBaseFee":"0x0"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x3b9aca00"},"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600e575f80fd5b505f3660605f49600149600249604051602001602b93929190605d565b6040516020818303038152906040529050915050805190602001f35b5f819050919050565b6057816047565b82525050565b5f606082019050606e5f8301866050565b607960208301856050565b608460408301846050565b94935050505056fea26469706673582212206284471b14925acedc8cf50c596b6850cfda0372471ee8893750f3e61bf3778164736f6c634300081a0033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","maxFeePerGas":"0x10","maxFeePerBlobGas":"0xa","blobVersionedHashes":["0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014"]}]},{"blockOverrides":{"blobBaseFee":"0x1"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","maxFeePerGas":"0x10","maxFeePerBlobGas":"0xa","blobVersionedHashes":["0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014"]}]}],"validation":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0xf","blobGasUsed":"0x20000","calls":[{"returnData":"0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x53f6","maxUsedGas":"0x53f6","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x53f6","hash":"0x1d53fb01e88918e1dc15bb74f4deb245bde91fe973ae6ce36172c6e3f7879451","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x61d638ad6837c75ea2c4a8e413d9c5a2c2bcf40979e6ba9293a113b6769d2fa6","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0xbbeb8f574e71f3b63fefe39dbe1b8401b65fba74fd52839bc1dd4d032fc8215b","timestamp":"0x1ce","transactions":[{"blockHash":"0x1d53fb01e88918e1dc15bb74f4deb245bde91fe973ae6ce36172c6e3f7879451","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0xf","maxFeePerGas":"0x10","maxPriorityFeePerGas":"0x0","maxFeePerBlobGas":"0xa","hash":"0x6dd302137bafa6817cdd92b1157be1eb7b884b32e9bcab7f4084ee4c05a5dba3","input":"0x","nonce":"0x0","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x3","accessList":[],"chainId":"0xc72dd9d5e883e","blobVersionedHashes":["0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014"],"v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x7dd14954593162835c846350d8da40d6164b21bcee321e835d00b902adc4fa2d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xe","blobGasUsed":"0x20000","calls":[{"returnData":"0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x53f6","maxUsedGas":"0x53f6","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x53f6","hash":"0x65e6f877822314293d3335a87b89758b95776b33988572046a3ca9fa8938572e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1d53fb01e88918e1dc15bb74f4deb245bde91fe973ae6ce36172c6e3f7879451","receiptsRoot":"0x61d638ad6837c75ea2c4a8e413d9c5a2c2bcf40979e6ba9293a113b6769d2fa6","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0x51afb5d3ae399f33bd7fba43859e92326a66c44f5d56e953ef457b63f1a98f7a","timestamp":"0x1da","transactions":[{"blockHash":"0x65e6f877822314293d3335a87b89758b95776b33988572046a3ca9fa8938572e","blockNumber":"0x2f","blockTimestamp":"0x1da","from":"0xc000000000000000000000000000000000000000","gas":"0x2fa9c8a","gasPrice":"0xe","maxFeePerGas":"0x10","maxPriorityFeePerGas":"0x0","maxFeePerBlobGas":"0xa","hash":"0x08fae926ea323fb66e5cd130bc2d656f5cc51fcd8a13899c98c6037b7dad36af","input":"0x","nonce":"0x1","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x3","accessList":[],"chainId":"0xc72dd9d5e883e","blobVersionedHashes":["0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014"],"v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x8364e744eb2e6d7e3c2e87ba7e3306b4ded112e46dbaa09e577ea118beb7078d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-num-order-38020.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-num-order-38020.io new file mode 100644 index 0000000000..ebf848655e --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-num-order-38020.io @@ -0,0 +1,3 @@ +// simulates calls with invalid block num order (-38020) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x91"},"calls":[{"from":"0xc100000000000000000000000000000000000000","input":"0x4360005260206000f3"}]},{"blockOverrides":{"number":"0x87"},"calls":[{"from":"0xc000000000000000000000000000000000000000","input":"0x4360005260206000f3"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38020,"message":"block numbers must be in order: 135 \u003c= 145"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-override-reflected-in-contract-simple.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-override-reflected-in-contract-simple.io new file mode 100644 index 0000000000..7c8c865d6c --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-override-reflected-in-contract-simple.io @@ -0,0 +1,3 @@ +// Checks that block overrides are true in contract for block number and time +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x32","time":"0x1cc"}},{"blockOverrides":{"number":"0x37","time":"0x1d6"}},{"blockOverrides":{"number":"0x41","time":"0x1e0"}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38021,"message":"block timestamps must be in order: 460 \u003c= 498"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-override-reflected-in-contract.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-override-reflected-in-contract.io new file mode 100644 index 0000000000..cbc463d4f0 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-override-reflected-in-contract.io @@ -0,0 +1,3 @@ +// Checks that block overrides are true in contract +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x32","time":"0x1cc","gasLimit":"0x2e630","feeRecipient":"0xc000000000000000000000000000000000000000","prevRandao":"0x0000000000000000000000000000000000000000000000000000000000000012","baseFeePerGas":"0xa"},"stateOverrides":{"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"blockOverrides":{"number":"0x37","time":"0x1cc","gasLimit":"0x493e0","feeRecipient":"0xc100000000000000000000000000000000000000","prevRandao":"0x0000000000000000000000000000000000000000000000000000000000001234","baseFeePerGas":"0x14"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]},{"blockOverrides":{"number":"0x3c","time":"0x1d6","gasLimit":"0x2e632","feeRecipient":"0xc200000000000000000000000000000000000000","prevRandao":"0x0000000000000000000000000000000000000000000000000000000000001234","baseFeePerGas":"0x1e"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38021,"message":"block timestamps must be in order: 460 \u003c= 498"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-auto-increment.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-auto-increment.io new file mode 100644 index 0000000000..2c4e29a390 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-auto-increment.io @@ -0,0 +1,3 @@ +// Error: simulates calls with timestamp incrementing over another +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"time":"0x1cd"}},{"blockOverrides":{}},{"blockOverrides":{"time":"0x1ce"}},{"blockOverrides":{}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38021,"message":"block timestamps must be in order: 462 \u003c= 473"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-non-increment.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-non-increment.io new file mode 100644 index 0000000000..6891223e12 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-non-increment.io @@ -0,0 +1,3 @@ +// Error: simulates calls with timestamp staying the same +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"time":"0x1ce"}},{"blockOverrides":{"time":"0x1ce"}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38021,"message":"block timestamps must be in order: 462 \u003c= 462"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-order-38021.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-order-38021.io new file mode 100644 index 0000000000..f99fba8060 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamp-order-38021.io @@ -0,0 +1,3 @@ +// Error: simulates calls with invalid timestamp order (-38021) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"time":"0x1ce"}},{"blockOverrides":{"time":"0x1cd"}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38021,"message":"block timestamps must be in order: 461 \u003c= 462"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamps-incrementing.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamps-incrementing.io new file mode 100644 index 0000000000..80a94ed79e --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-block-timestamps-incrementing.io @@ -0,0 +1,3 @@ +// checks that you can set timestamp and increment it in next block +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"time":"0x1cd"}},{"blockOverrides":{"time":"0x1ce"}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xcf01ecb40ba9f2e72b396d928170222a28d0140c5d0aa3df7f2e29a38d0218f8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x38d165db78b0dd127270a6ef188c4c40159e72df01b570c0764056731be9c384","timestamp":"0x1cd","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x28a9a36f62a93b3d546faf74f54f3796a40bc7143836c4496afbcc83ea50cbc0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xcf01ecb40ba9f2e72b396d928170222a28d0140c5d0aa3df7f2e29a38d0218f8","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe78d320f887b4bfa810e667adacf192e63c40a59cf3ab0257251090b75aae995","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-complex.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-complex.io new file mode 100644 index 0000000000..521b3b23f4 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-complex.io @@ -0,0 +1,3 @@ +// gets blockhash of simulated block +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063ee82ac5e1461002d575b5f80fd5b610047600480360381019061004291906100a9565b61005d565b60405161005491906100ec565b60405180910390f35b5f814361006a9190610132565b409050919050565b5f80fd5b5f819050919050565b61008881610076565b8114610092575f80fd5b50565b5f813590506100a38161007f565b92915050565b5f602082840312156100be576100bd610072565b5b5f6100cb84828501610095565b91505092915050565b5f819050919050565b6100e6816100d4565b82525050565b5f6020820190506100ff5f8301846100dd565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61013c82610076565b915061014783610076565b925082820390508181111561015f5761015e610105565b5b9291505056fea2646970667358221220aababd81a84b4a0f5ad0954d4fdc5bcd9ff987213f6ccb35f853b08225e3408164736f6c634300081a0033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000001"}]},{"blockOverrides":{"number":"0x4b"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e000000000000000000000000000000000000000000000000000000000000000f"}]},{"blockOverrides":{"number":"0x55"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e000000000000000000000000000000000000000000000000000000000000001d"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","logs":[],"gasUsed":"0x55db","maxUsedGas":"0x55db","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55db","hash":"0x915ce5ac2ed09f5fbe461a2789a7b9370cc34e81b3603e3ffd9368139c11b2a8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x9ac0612f5f3c543713f1330e3fee9e96ddbd002d0d7bd8d86c6e2c3565d07088","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0xd47a94a29974a3e04fe37da6a10134027d6002544eeb692de702ded6484dc138","timestamp":"0x1ce","transactions":["0x787d9e779daf6302f4ea22b909a3020ed3a038ef2f45dd47578ef4cd20a57a25"],"transactionsRoot":"0x365bd04cd2be3125aea6d41eb7f2b59038ad66404df8f2c1ae2510579c87ac0b","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xf706c0811da20101331bd0e0385959eb80152d14abdb1ac6aea51dd14eb9d45a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x915ce5ac2ed09f5fbe461a2789a7b9370cc34e81b3603e3ffd9368139c11b2a8","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xf6dc061dab64eff0f23046ef5d2cfb8367639e69412552e96ebd81d274e0eacf","timestamp":"0x1da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xda74d24d389c62df75ff3f12cfa8c70c5258f124f26af04fc92d23ccce7a1417","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xf706c0811da20101331bd0e0385959eb80152d14abdb1ac6aea51dd14eb9d45a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x38d5f7a6c4db08f723f8b3b15363d7f89c0effa722e1054073783f815dc78f0e","timestamp":"0x1e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x404a55c4d6ea8bc7f53e42162f8283912f0a171342e03799d23d9a05b73d140b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xda74d24d389c62df75ff3f12cfa8c70c5258f124f26af04fc92d23ccce7a1417","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x76934e7ebe439a97c5e1ff3a423044c820ae37d99b3d08e81f36025de8835a87","timestamp":"0x1f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6b4bf548167544f665e77b7946e03370527e1fdc055ded84b967e450c5a16a56","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x404a55c4d6ea8bc7f53e42162f8283912f0a171342e03799d23d9a05b73d140b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe95d54802f700d104778e725f6e641cc9b0646804fb7fb0371676fef12e8ab95","timestamp":"0x1fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe51b6e14aafd0fe2ae1979d6d1c94b09438544ca465f95ab780dcf5efddf5b69","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6b4bf548167544f665e77b7946e03370527e1fdc055ded84b967e450c5a16a56","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc9134b530a4c6c34bfe4e37a4c426ce479c4feb579c71b97a3e32677989f947f","timestamp":"0x20a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5b9b7adeea747434340404d2fca813a7b8630b29181bc9fb8a323d0e1681f129","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x34","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe51b6e14aafd0fe2ae1979d6d1c94b09438544ca465f95ab780dcf5efddf5b69","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xece2915f382e0971f1f44092d96efdfb915534a58a6f188d45b8d39423ccdc1a","timestamp":"0x216","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x899d4b230f535abdc50d314e45f65c1b63d5f8a26ed87f0f99e09386ee207d2c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x35","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5b9b7adeea747434340404d2fca813a7b8630b29181bc9fb8a323d0e1681f129","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x5f1e4180ee875fe233768257202b25436cb2dd6f5097dffd78a98c18ae936255","timestamp":"0x222","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2347d5025e8edbda0a72198d5f3abd0d9d39b6bbd7e1357b36dbe11f8b6f3cc9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x36","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x899d4b230f535abdc50d314e45f65c1b63d5f8a26ed87f0f99e09386ee207d2c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa2ccce78c01d90951f82da0f183ff593e89f9e619f2ef7bd3e881e5d9a7f2c2b","timestamp":"0x22e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x76dc03e9891088a9fd75d7aaabea71b4947b8d9441ea382ba8b837d59bf1ff0f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x37","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2347d5025e8edbda0a72198d5f3abd0d9d39b6bbd7e1357b36dbe11f8b6f3cc9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x27574f29316bff80003c3e920487243cc8f8fa7d99eb23fac95739191ead9d8f","timestamp":"0x23a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1d6845cf393c0d3012e03a5e0982f2fd74ae3c257ee9475275ffed10dd1f6207","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x38","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x76dc03e9891088a9fd75d7aaabea71b4947b8d9441ea382ba8b837d59bf1ff0f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa2bdd8d989afb4a19beb477774e326c224d5ada6797de05fe30c1b00c5f86862","timestamp":"0x246","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd4a2c02fdd80c4671a8a42136bc835055ead97ea6aa2ac1102af1d2412e44ab4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x39","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1d6845cf393c0d3012e03a5e0982f2fd74ae3c257ee9475275ffed10dd1f6207","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x29603f66d31b06cc6cfb30e05e2c79fc37b3217fb2d885675fef8847d9b4cb31","timestamp":"0x252","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0abe9905a986903c69894c36d9a76427dfe4e669d52bb69992759d4a69a86714","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd4a2c02fdd80c4671a8a42136bc835055ead97ea6aa2ac1102af1d2412e44ab4","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x2239c8ffd19e906ace9321fed710c471d47f34f5bd71289759fc8ace569a8e7d","timestamp":"0x25e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xf6b4ded6229ed50de2ec10dc9a3de6411740fb8cf4724396b621d4593d16175c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0abe9905a986903c69894c36d9a76427dfe4e669d52bb69992759d4a69a86714","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x573af52dc6c29b430bab11b0843cd6a2daba1ca88506ec5024a4e8885b553fd6","timestamp":"0x26a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x3fe089b4db800c7a9ec79608c3625951e158266357364ac24b7130d1ea09293f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xf6b4ded6229ed50de2ec10dc9a3de6411740fb8cf4724396b621d4593d16175c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x21b8d0d0aea90e0d42b22dc8a1b128a7a0ab95d9ce3d5286311553c03072b395","timestamp":"0x276","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa988300a643b52010ff0a0d294cad9d6dab8b88f4a6476f5650b50c7012fa4e8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x3fe089b4db800c7a9ec79608c3625951e158266357364ac24b7130d1ea09293f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xfcdfdead03a574f0712ecc24f07e7fbc9c9499cbe779ddbecb05f08f9a91ea63","timestamp":"0x282","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x25aee7b83de18b0bcd480d455d240268936748642d0d4778734b1304a562ceb4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa988300a643b52010ff0a0d294cad9d6dab8b88f4a6476f5650b50c7012fa4e8","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa2afaf214556b47d3c723ad34b89b1f0ed3e07e670fca16eb604534f97b7c385","timestamp":"0x28e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4d2a73e47ee760afb19e488d1be09149cfb7865dc489792b90580c4ca1847d73","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x25aee7b83de18b0bcd480d455d240268936748642d0d4778734b1304a562ceb4","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x0c59a0da874316a4d826ca5465474dec8566ec6fa41fd8fffe18b302d9df6f58","timestamp":"0x29a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0a8dcc28895aff2a03181e14c50607023f116ee655f2535e19669933c79dd709","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x40","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4d2a73e47ee760afb19e488d1be09149cfb7865dc489792b90580c4ca1847d73","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x729c7933f277b43ec8a8c3b32b707ed5d79501764f9c09ec51ea64bc304c5362","timestamp":"0x2a6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x755e81078f7d4a438b833496c608e0592dd970becc31cb0ecfb8311f04bdc4ee","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x41","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0a8dcc28895aff2a03181e14c50607023f116ee655f2535e19669933c79dd709","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xcc38fbd9462feef07e97bf8e96abfb9c6a7d421c17b799a3a76c7ad1ec008596","timestamp":"0x2b2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5bf58e2a173d32bb9e5d9c1b16500a73faf72f568a47f0f95f2d476f64273106","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x42","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x755e81078f7d4a438b833496c608e0592dd970becc31cb0ecfb8311f04bdc4ee","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe37674ebc1f2ad30f2047407289784fb7ea986204060f82e0fc8f8650847e25d","timestamp":"0x2be","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0abb6e19ddb7909858c29a63df6524a116a6aba7ddfbe0bb877514cbcd97d66b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x43","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5bf58e2a173d32bb9e5d9c1b16500a73faf72f568a47f0f95f2d476f64273106","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x4481d267e25bd5cd1c887dc3948cd1fe229ae49ca496931fdf9cd0debe270d7a","timestamp":"0x2ca","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xbf82b064bfaae62bf63c93867a6408e25ac49a65a671b7b9ad7e85cff8d83704","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x44","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0abb6e19ddb7909858c29a63df6524a116a6aba7ddfbe0bb877514cbcd97d66b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xd23fc5a905b8f1fa4c3d362604183567899b21bd49a706ba699f2e82356e2d49","timestamp":"0x2d6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xf0d78e9b96955dccee803191cfd6094291981e39b7da40ecfe07276663496f42","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x45","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xbf82b064bfaae62bf63c93867a6408e25ac49a65a671b7b9ad7e85cff8d83704","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa0c63d533e9d4196f980183278ee0ce89ee59a9749eb6f2c24121b67c367e260","timestamp":"0x2e2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb84f1096dd5f1c1d98d20d30d31f61f4b83cd8a4a4fe4eeae2f86457d6f215ba","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x46","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xf0d78e9b96955dccee803191cfd6094291981e39b7da40ecfe07276663496f42","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x77bcffa1e418127df2cd92497bd33c54aa6dd38e595d4842491894a69f3c3a01","timestamp":"0x2ee","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8a8dd8aea1c085b335099b2a15c83397120f0d3791008694b2d837162b07ea47","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x47","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb84f1096dd5f1c1d98d20d30d31f61f4b83cd8a4a4fe4eeae2f86457d6f215ba","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x88a150847c24d86f5e6bf69c2280f6227832d94a11d71c0be47215e19608f37f","timestamp":"0x2fa","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1e606dadeeb7a8e43c6eca1ba6a6f9e3f43bb7dff67acd74d48b658532cafea4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x48","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8a8dd8aea1c085b335099b2a15c83397120f0d3791008694b2d837162b07ea47","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe13a93485f5f9002869cdb5f1a40592e50f9fe5fe8ee4a6bfbb3cbe9a7a16d55","timestamp":"0x306","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1e377715ad03d7c2558a9f1ec9194d45ea60023ab7b082ce13c002a7b48ac44d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x49","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1e606dadeeb7a8e43c6eca1ba6a6f9e3f43bb7dff67acd74d48b658532cafea4","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x68eb0fac3d33585a99b772e260f7789ca4989387a7aea2e7037c861b9ec5e120","timestamp":"0x312","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xcb8d51ecf485e4fbbf12806d66d2c9b2e33c681b1b4ed0e7afd3d47bb9867ca1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1e377715ad03d7c2558a9f1ec9194d45ea60023ab7b082ce13c002a7b48ac44d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x7f7c6c03fa7bd8e93813100dc56dc63d4668de5811ad49ccddbfb140748e632d","timestamp":"0x31e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x3fe089b4db800c7a9ec79608c3625951e158266357364ac24b7130d1ea09293f","logs":[],"gasUsed":"0x55db","maxUsedGas":"0x55db","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55db","hash":"0xb7a69976be36b5d9747e5c73dc6be9e5edb5610b053070aa921be05443718cbb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xcb8d51ecf485e4fbbf12806d66d2c9b2e33c681b1b4ed0e7afd3d47bb9867ca1","receiptsRoot":"0x9ac0612f5f3c543713f1330e3fee9e96ddbd002d0d7bd8d86c6e2c3565d07088","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0xbc0c28e5623a31bfbaa154f4642dadee03a89bfa00dcf807f7187ce0284e5d34","timestamp":"0x32a","transactions":["0x42cded20a711ee7f9d4137be6c568868ac999cb2ff107595a6373f727541ee9f"],"transactionsRoot":"0x3628dd82cf05581bf15f7326dfbbc0aea24364a321aadc4d12eb54ca25afea1f","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x69389baa86ac7d5d5c2acc1dd69f03fc2eff4b4206bd14da9c1242eef1a2ea24","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb7a69976be36b5d9747e5c73dc6be9e5edb5610b053070aa921be05443718cbb","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9d1fc997f6f88a2f42458f95dac35439932b4afef1ae6a84e881bb728ca09dfd","timestamp":"0x336","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xaa801210e1b7061472e6be7fb2f40568e462134ae7be486eecb301a37e1c35e3","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x69389baa86ac7d5d5c2acc1dd69f03fc2eff4b4206bd14da9c1242eef1a2ea24","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x19e46b474f33cc8a21b47d648fbf7f7a5bd40eccaac96beb59005afd8e174320","timestamp":"0x342","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9da1480c64e89cc7fb37686e033339b38b5819b59cbbd6d6959a35591910697b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xaa801210e1b7061472e6be7fb2f40568e462134ae7be486eecb301a37e1c35e3","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x30a192749d0b6dfb59c884c1e75496129ec3385f8c3f2d64badbb1034de92b07","timestamp":"0x34e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd216de8153ee5d7de91f0f18ce90daa00671c11f2704ee0cd21c7e53efa00aa8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9da1480c64e89cc7fb37686e033339b38b5819b59cbbd6d6959a35591910697b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x1d43fd6fbbbf7108f1d894a92d93bb1e23c670ee39a055fd8043819cfecdbc23","timestamp":"0x35a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9a84a654648edc6de555508c2a7fe8064dfe6f5ee02d7c858cd2b70665929014","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x50","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd216de8153ee5d7de91f0f18ce90daa00671c11f2704ee0cd21c7e53efa00aa8","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xae17696b0feab22f3f5e9f6d517aa1f27c41e7d64efabcd7d823499ed936baf2","timestamp":"0x366","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x05e249b213afa3d482755eb7026c8ca5d37051836af6158c6a74324092f8442d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x51","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9a84a654648edc6de555508c2a7fe8064dfe6f5ee02d7c858cd2b70665929014","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x5808daf8b33ddcf76963c367b9cace89fecafbb3e3684e5899938eee3e86c770","timestamp":"0x372","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5fc615e855b8c5b26aa5187c921b89c37888aa4686f4fb0ed4742a9166bab58c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x52","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x05e249b213afa3d482755eb7026c8ca5d37051836af6158c6a74324092f8442d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x4eb3efdc8b22a2b1c041853e14e727df4c9fb53c68c8edb19d14ade8a65c5aa4","timestamp":"0x37e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa841a239db59c4c82db52e33c60c77bc2566fccbc12e94a5f5137dc99ee38d2a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x53","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5fc615e855b8c5b26aa5187c921b89c37888aa4686f4fb0ed4742a9166bab58c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x443dbf6b32650a5e2435053f756f5b6426c8fe6df800f2bedd8a058a14f953fc","timestamp":"0x38a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x73530fd05c1e669b0638b81c5d8a97303653cfd8c64dc20e29c05cf71c1e1130","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x54","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa841a239db59c4c82db52e33c60c77bc2566fccbc12e94a5f5137dc99ee38d2a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xbe64e3438bd5d4544f3ee1768e5b2c025e47f2e4858d154105c8c06f6d764383","timestamp":"0x396","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x1d6845cf393c0d3012e03a5e0982f2fd74ae3c257ee9475275ffed10dd1f6207","logs":[],"gasUsed":"0x55db","maxUsedGas":"0x55db","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55db","hash":"0x8345e70689570e0ad9ea7bfea908a16bf0fe8e7324aa3029fd3fbfa66404d910","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x55","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x73530fd05c1e669b0638b81c5d8a97303653cfd8c64dc20e29c05cf71c1e1130","receiptsRoot":"0x9ac0612f5f3c543713f1330e3fee9e96ddbd002d0d7bd8d86c6e2c3565d07088","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0xa8ae46263c04c49c5be654e31e4216998e58192c2aff620b2ad1e45e0a521062","timestamp":"0x3a2","transactions":["0x1baacab8678d906af212f58de68e14002c37e980e6563d68e82cb473680b5e93"],"transactionsRoot":"0x35710e49bcd1fe66f483df7e8a3dd42d83b8eea67883f27b0548f732d8c3b95f","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-simple.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-simple.io new file mode 100644 index 0000000000..5dbe1f1e29 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-simple.io @@ -0,0 +1,3 @@ +// gets blockhash of block 1 (included in original chain) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063ee82ac5e14602d575b600080fd5b60436004803603810190603f91906098565b6057565b604051604e919060d7565b60405180910390f35b600081409050919050565b600080fd5b6000819050919050565b6078816067565b8114608257600080fd5b50565b6000813590506092816071565b92915050565b60006020828403121560ab5760aa6062565b5b600060b7848285016085565b91505092915050565b6000819050919050565b60d18160c0565b82525050565b600060208201905060ea600083018460ca565b9291505056fea2646970667358221220a4d7face162688805e99e86526524ac3dadfb01cc29366d0d68b70dadcf01afe64736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000001"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x79ba0368c2c6563a7d263695b583dcc6d1c25d4988daa0105804d38bdd987f2f","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x552c","hash":"0xec6accfc15ed8b629a16e155fbdb4bfe2202027dcb2b2b439f2294a01f631233","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x65ac9bf671324010044befd5fd2e352d24f2089021f1bcbc1890c3ef35255125","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0xee3aa3eda9007a150b89b8e07ba4473f669dcbd6050c8a70a7932a00faabb531","timestamp":"0x1ce","transactions":["0x787d9e779daf6302f4ea22b909a3020ed3a038ef2f45dd47578ef4cd20a57a25"],"transactionsRoot":"0x365bd04cd2be3125aea6d41eb7f2b59038ad66404df8f2c1ae2510579c87ac0b","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-start-before-head.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-start-before-head.io new file mode 100644 index 0000000000..d820295f0c --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blockhash-start-before-head.io @@ -0,0 +1,3 @@ +// gets blockhash of simulated block +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x32"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063ee82ac5e1461002d575b5f80fd5b610047600480360381019061004291906100a9565b61005d565b60405161005491906100ec565b60405180910390f35b5f814361006a9190610132565b409050919050565b5f80fd5b5f819050919050565b61008881610076565b8114610092575f80fd5b50565b5f813590506100a38161007f565b92915050565b5f602082840312156100be576100bd610072565b5b5f6100cb84828501610095565b91505092915050565b5f819050919050565b6100e6816100d4565b82525050565b5f6020820190506100ff5f8301846100dd565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61013c82610076565b915061014783610076565b925082820390508181111561015f5761015e610105565b5b9291505056fea2646970667358221220aababd81a84b4a0f5ad0954d4fdc5bcd9ff987213f6ccb35f853b08225e3408164736f6c634300081a0033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000001"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000002"}]},{"blockOverrides":{"number":"0x33"},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000013"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x93b583ed05f454a78c9279625a3e2871ff3324507e6418e29e53416acc88900d","timestamp":"0x1da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb22b7c9857930782d7a92e282059b1653b643efb6f09a9aff1d65fedfce438b8","timestamp":"0x1e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6005795fd04dd3670db5e14ae6425052c6ee82ff22080293ee3d83c180d65bcc","timestamp":"0x1f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","logs":[],"gasUsed":"0x55db","maxUsedGas":"0x55db","status":"0x1"},{"returnData":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","logs":[],"gasUsed":"0x55db","maxUsedGas":"0x55db","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xabb6","hash":"0x5f1f885181d2c3c6d35e02928ad3b1776f2473181dcfd84e81b62988134f2265","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","receiptsRoot":"0x44dac218513aae9429065abe0788e382fc40d34083388bfb22774c7119fb3210","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30d","stateRoot":"0x3460a8fc4a923703762814a38a6ac921211aa22a8f1c40ce86d5022b4f90a07e","timestamp":"0x1fe","transactions":["0x787d9e779daf6302f4ea22b909a3020ed3a038ef2f45dd47578ef4cd20a57a25","0x995c3fb889ed05db015a40f7004ba3bb6149e780ddd434222f05a261e230e537"],"transactionsRoot":"0x81815678ca812c255f9fd1044be1f514c86d4fddd66dc6e9093cb73153827d35","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x6d7e4ff4d66668263c39b861620d5049bd3d2a8d1d4e543fac1bbbab66fd218f","logs":[],"gasUsed":"0x55db","maxUsedGas":"0x55db","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55db","hash":"0xd3e17ee60cee716f5e468ace757fae4d3db50b8e5b6cd9ce94c65788cfe6a8c5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5f1f885181d2c3c6d35e02928ad3b1776f2473181dcfd84e81b62988134f2265","receiptsRoot":"0x9ac0612f5f3c543713f1330e3fee9e96ddbd002d0d7bd8d86c6e2c3565d07088","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x5ba6652fe8952604fccadaa0fb4c6763b00a918776b47a62633606d2553b5de0","timestamp":"0x20a","transactions":["0x7aa42a79f5a54abd178d5dae431c290a559f3d937cc1445251e9623834ae72dd"],"transactionsRoot":"0x290574566c78b78a9d53f97ba44ec8c130f8c881e0f968378d6589d76ea6ab0d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blocknumber-increment.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blocknumber-increment.io new file mode 100644 index 0000000000..df4d985265 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-blocknumber-increment.io @@ -0,0 +1,3 @@ +// blocknumbers should increment +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x37","time":"0x3b6"}},{},{},{},{},{},{"blockOverrides":{"number":"0x4b"}},{},{},{}],"traceTransfers":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x93b583ed05f454a78c9279625a3e2871ff3324507e6418e29e53416acc88900d","timestamp":"0x1da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb22b7c9857930782d7a92e282059b1653b643efb6f09a9aff1d65fedfce438b8","timestamp":"0x1e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6005795fd04dd3670db5e14ae6425052c6ee82ff22080293ee3d83c180d65bcc","timestamp":"0x1f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8843675f3b9eec18a5acf116df90a26fae9ef70f21d3cffc4992b760cfdc23cf","timestamp":"0x1fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8601822b6dff617cf93178957c0162d95c7cc411278934e676b2271d9364bfe0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x04238f2fad5e4b9820daf76c60946eb702d35577d2d1e6d5fc2c07d229e75689","timestamp":"0x20a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd482916837d0d43b8cd15d00d4c0f50ad019311d1c7e6fb220e053548dc08181","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x34","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8601822b6dff617cf93178957c0162d95c7cc411278934e676b2271d9364bfe0","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3d5f58fbf02276461b11687866a4a1389fad17ca6ea7fdf4c7f2c5afa8cc546f","timestamp":"0x216","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66c675d5b1ae5453cbf525ac2d1a071256605445d474af3764a36783e90b342d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x35","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd482916837d0d43b8cd15d00d4c0f50ad019311d1c7e6fb220e053548dc08181","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x429c0581461d0048471b1d8d85f7d129cf493114e4ca1e11a154bb649521f932","timestamp":"0x222","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdaeb4e1610aaeb576bc75667c8ab9d27f6985f41880ddf71b3ecc8c31b617def","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x36","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66c675d5b1ae5453cbf525ac2d1a071256605445d474af3764a36783e90b342d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9ad06fa7f19d678709c797246788f30a9a8d50083b9174a8f684e578c1b337bd","timestamp":"0x22e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdc459bb077a0e6e8582e642f0222d14c9929d48ad5e3655b8378d4a9928d1c97","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x37","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdaeb4e1610aaeb576bc75667c8ab9d27f6985f41880ddf71b3ecc8c31b617def","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xdb86e581ebb390ef9ee519848eb3e0be7171667c9b1ba707fee5739b1784ffe5","timestamp":"0x3b6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe5e0d8ba363b6e49ed1ef1318bddc8923df0063d8259f8f8a52e346bcaa7844a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x38","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdc459bb077a0e6e8582e642f0222d14c9929d48ad5e3655b8378d4a9928d1c97","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x7164d06ec5bdddf2e3c4c4e7975d27a8ac6da2f6000ee74d3eac237e6d481eeb","timestamp":"0x3c2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6c5823bbe4f530417fb10bb5e7a880fd817be0d4ecf8596a3c6712393c2dcf33","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x39","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe5e0d8ba363b6e49ed1ef1318bddc8923df0063d8259f8f8a52e346bcaa7844a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x36b709f50233e21283d150a2c305c8654e950041ce0c6bebdd4c2908747eb44d","timestamp":"0x3ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x485f36be7b6d73527fb5d2a5fde17d329699cd51d945d26a21e0ebb5d4524c3a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6c5823bbe4f530417fb10bb5e7a880fd817be0d4ecf8596a3c6712393c2dcf33","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x2b4e5d1368837a76f56beac7b6cd126bc10955f661030b79e6105cfe19f19ed7","timestamp":"0x3da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x10e87cc4984bf30da44f85fd7cdf1a185d813db9aaa4bd1d3f5b19d56c213e52","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x485f36be7b6d73527fb5d2a5fde17d329699cd51d945d26a21e0ebb5d4524c3a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xd43a8c3162f6e91e72aee6503e0d270cf4de7fe3574e49c2108bc30f5cb3454a","timestamp":"0x3e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x591a258b5a53a56ea41813d55e1c000eba4ff1a4c5db6e494572815795cab0c1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x10e87cc4984bf30da44f85fd7cdf1a185d813db9aaa4bd1d3f5b19d56c213e52","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x5115e87ce837e63fde2c33ca9deb22f74ba060f637e4405a97dd7e86500006b9","timestamp":"0x3f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xc825128bae45bb0ee56d33f75e03c9bdff5ad18608510eff4215f4fc26242b29","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x591a258b5a53a56ea41813d55e1c000eba4ff1a4c5db6e494572815795cab0c1","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x5bb85df55054ddd38209b4d2c041f99ac434151697554c4a2d2022d0a1d6d85d","timestamp":"0x3fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe77e1b4e143c88684351b7da80fd5a0a3674340379c4478cfb2d7f78f14ff43f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc825128bae45bb0ee56d33f75e03c9bdff5ad18608510eff4215f4fc26242b29","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xbfc71a01f9cbf561a7fa51480036223b25708992a5689fc3b82eef6cae9edaaa","timestamp":"0x40a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x107b9a854adfc25ea15c2149ca3354aac811d7b2fd692473c842bc055493dcbf","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe77e1b4e143c88684351b7da80fd5a0a3674340379c4478cfb2d7f78f14ff43f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xcad83eec2b1937026b92adcb115ebc580c96cec9ddc91233724e7c337f7e1c78","timestamp":"0x416","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1524f1c1a3b9f8ec1962e6027a40811051dc0a0a8376b3dfac22344c8f973ac6","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x40","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x107b9a854adfc25ea15c2149ca3354aac811d7b2fd692473c842bc055493dcbf","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc72c3518fe093900d42502268b58f0859feed5375db0d97142444dd6ea1bfd00","timestamp":"0x422","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa63df96c2351dbe72ac17ceecdee455cdb0ed25cc69c7e0f309df9183252e9f8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x41","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1524f1c1a3b9f8ec1962e6027a40811051dc0a0a8376b3dfac22344c8f973ac6","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9cac7cf580cbef6f21817636f7b6d1f2446e7ad4321faf271383192444e6c2ac","timestamp":"0x42e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xc7090298fe92baa5fb6ddce8978b6b76ec52f2832cfa0aab81916032791dbb87","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x42","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa63df96c2351dbe72ac17ceecdee455cdb0ed25cc69c7e0f309df9183252e9f8","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x194359f77e2cbfdd14d67b5ab29c3d7e8daffedb72296b19833323d059a047e2","timestamp":"0x43a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1091780f0436ddcf54f17058f9150a1fbd217cf010e0e8e4fcf84f257608cee6","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x43","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc7090298fe92baa5fb6ddce8978b6b76ec52f2832cfa0aab81916032791dbb87","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x041708ef11eb61d16e566bc991af175380969f7e53fdb49578a75be6c2d20452","timestamp":"0x446","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2d042fb22987d9cb65b7e516047e765a6d82c4512660ca1b3a87e5e854ddb367","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x44","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1091780f0436ddcf54f17058f9150a1fbd217cf010e0e8e4fcf84f257608cee6","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb3d7a4fc2bbaf63d153ff7df2c9751c7e22a8b7ae07177969c9e47b635278351","timestamp":"0x452","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x19d497878a1de133d021685d282b583b1dfc15fd768d78958ee43a4644b34fca","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x45","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2d042fb22987d9cb65b7e516047e765a6d82c4512660ca1b3a87e5e854ddb367","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x5fb8a411e734872007d717723adabd91fd4f2f3b18b0b9c7186b89e9e46bd58a","timestamp":"0x45e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xed8b35718fba2578af4da92cb423dbbe836baf9f79a16a2af45ce4e48eff5998","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x46","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x19d497878a1de133d021685d282b583b1dfc15fd768d78958ee43a4644b34fca","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x88e9a8ec1633eb197a16af6adf115d1048097618144aa49a7988ce834be30e06","timestamp":"0x46a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xec9e21147426c22343e96b90c17baf8bafbc92a8fc0cb728f6c5f8745eaa7d41","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x47","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xed8b35718fba2578af4da92cb423dbbe836baf9f79a16a2af45ce4e48eff5998","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc1a104896b12f22978a818b3b2f3f93c4b13d9d8ac3dd3676ad1f306fe0bec25","timestamp":"0x476","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb376c0be226646c9b8a6ba59a657caa0bbe42d2bfe814c9403bbcdcddd1bd7a7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x48","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xec9e21147426c22343e96b90c17baf8bafbc92a8fc0cb728f6c5f8745eaa7d41","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x55617a67b68de7d3ac69b7dc8a5216f1a5ef370bfa7028328635ada4540e482b","timestamp":"0x482","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1df1bf26e74e111de600703af7b08bc3b3f423887228e04d33eb57bf1f6037a7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x49","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb376c0be226646c9b8a6ba59a657caa0bbe42d2bfe814c9403bbcdcddd1bd7a7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc08130255e537f3020b9622e1aae95094a69fe895599594f56684fb7d9521726","timestamp":"0x48e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xc69f283da46d19c15dfebf6e9b8c2fd4599602d27f9faa7e6fd0ea5caf83c546","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1df1bf26e74e111de600703af7b08bc3b3f423887228e04d33eb57bf1f6037a7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc1f4ef18d053b98882047ddba61dc604dc6121abe9426fb1cb7a2b0adab236b7","timestamp":"0x49a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9dc5bf655289ffe8d621acf5360aca2c209ff3b6d3289586c05ec05ac5cb78ed","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc69f283da46d19c15dfebf6e9b8c2fd4599602d27f9faa7e6fd0ea5caf83c546","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x287b5f354f177b32e83c03aaef3c7a84b552103cca1b93914b19dc30071b580b","timestamp":"0x4a6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6304634c6352b3beef71d04f9b750ad5ad0620f3a3fa631ef207aad0b5ba7b99","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9dc5bf655289ffe8d621acf5360aca2c209ff3b6d3289586c05ec05ac5cb78ed","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x591407667df99177fbae238474d7fe4115f34e7adcf8d87127022e52702c9373","timestamp":"0x4b2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb5c4a7a7eb2af6abbfe4cbfe5b40671d9df8ee74049fe290346f5af5b2ade7d9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6304634c6352b3beef71d04f9b750ad5ad0620f3a3fa631ef207aad0b5ba7b99","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xdc45a2093fac4a2fcb2f68dcb5b25ff9ac396495ad727e8ea07ebb5c79b35f6c","timestamp":"0x4be","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xefce23b52f83b44cb2d26e566eec12828deeb3072a37c6b95a71d4cab0ef6609","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb5c4a7a7eb2af6abbfe4cbfe5b40671d9df8ee74049fe290346f5af5b2ade7d9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x60d3ed094e2c34a613aa61844ac5a15318733722d30033d21b0b56fd3bb1b17c","timestamp":"0x4ca","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-invalid-nonce.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-invalid-nonce.io new file mode 100644 index 0000000000..54c853f41b --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-invalid-nonce.io @@ -0,0 +1,3 @@ +// check that nonce cannot decrease +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0x1"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x4e20"}}},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","nonce":"0x0"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","nonce":"0x1"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","nonce":"0x0"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"err: max fee per gas less than block base fee: address 0xC000000000000000000000000000000000000000, maxFeePerGas: 0, baseFee: 1 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-that-balance-is-there-after-new-block.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-that-balance-is-there-after-new-block.io new file mode 100644 index 0000000000..7b6fefb27f --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-that-balance-is-there-after-new-block.io @@ -0,0 +1,3 @@ +// checks that balances are kept to next block +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x2710"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8b2cb4f14610030575b600080fd5b61004a600480360381019061004591906100e4565b610060565b604051610057919061012a565b60405180910390f35b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100b182610086565b9050919050565b6100c1816100a6565b81146100cc57600080fd5b50565b6000813590506100de816100b8565b92915050565b6000602082840312156100fa576100f9610081565b5b6000610108848285016100cf565b91505092915050565b6000819050919050565b61012481610111565b82525050565b600060208201905061013f600083018461011b565b9291505056fea2646970667358221220172c443a163d8a43e018c339d1b749c312c94b6de22835953d960985daf228c764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c100000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c100000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000002710","logs":[],"gasUsed":"0x55b3","maxUsedGas":"0x55b3","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5f77","maxUsedGas":"0x5f77","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x10732","hash":"0x6ba6af36accc23e5df43949c3757c3e5cd9eccba592f6e5d10cded3a5c5d630d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf882fb631cdb150506d5089edab93c9b0ab7cdb571e0d036fbf93a8c767c1ead","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x33e","stateRoot":"0xa61751929d5b03d6b40f5deca329689538b8b5fc618f8ac77381eab137f049b4","timestamp":"0x1ce","transactions":["0x2d6292c91effa19cd9955e04f5bc2f8babfc2cbab7ffe92d5d54ed5bd8e1c3f7","0x03e8112411c7e5fe41379f456be39998bd079d51b85c1d9e6fc125affc9b044c","0xd211f4c3edfe60b9f79d2bfa4dbc3a9e8f605b46631251ef743368a1380ba227"],"transactionsRoot":"0x719fc74d9cd56fda9e73e1bee8571f7b53914a19c2993a533d439504ff2c2e41","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000002328","logs":[],"gasUsed":"0x55b3","maxUsedGas":"0x55b3","status":"0x1"},{"returnData":"0x00000000000000000000000000000000000000000000000000000000000003e8","logs":[],"gasUsed":"0x5f77","maxUsedGas":"0x5f77","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x10732","hash":"0x53384d1d2263b6882b1b0cbc25c611da0c4091dbfcb5a44ece067b4c9dc91717","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6ba6af36accc23e5df43949c3757c3e5cd9eccba592f6e5d10cded3a5c5d630d","receiptsRoot":"0xf882fb631cdb150506d5089edab93c9b0ab7cdb571e0d036fbf93a8c767c1ead","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x33e","stateRoot":"0x97ade77fe0174b5a2f22ee5480a3b8e87620b976bd7bba42a29487e2129848e0","timestamp":"0x1da","transactions":["0xcb0ed690e07be5ba497d133766567d273fcc65cb9c839e5619e64e6bfd25be87","0xbd599161f2d019dc75e3ea6aae8b5f567df1968dda104969ae5f0138c560c092","0xd4cdf1fec371c24cb56f65f490f6b2a2d80c7428bd5a5022f3ebf762f38c314e"],"transactionsRoot":"0x0af9230f3d15a8a7746780dc441b067a9d43826cb42721d07b53a4f29a0b2022","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-that-nonce-increases.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-that-nonce-increases.io new file mode 100644 index 0000000000..3911dd7b0b --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-check-that-nonce-increases.io @@ -0,0 +1,3 @@ +// check that nonce increases +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0x9"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x4a817c800"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","maxFeePerGas":"0xf","nonce":"0x0"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","maxFeePerGas":"0xf","nonce":"0x1"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","maxFeePerGas":"0xf","nonce":"0x2"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x9","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xf618","hash":"0x449d9bfd7f58240c3dd43f3ef1511a7ca3b58e8c8b0a4311a3b31c4247bc1aa6","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x25e6b7af647c519a27cc13276a1e6abc46154b51414d174b072698df1f6c19df","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2ef","stateRoot":"0xf1c098ae1835c8d176f097773452108ea379ca732c251aa225a75ddb96def179","timestamp":"0x1ce","transactions":["0xef434245460c19514129624e5ebdc6852ba4e9e2222f8c3e2359609418d302ed","0x2425c2b21ce7071ac113bf7c7aec626c4efc1903a50ea16402902b8bca360054","0x5e86626cc1f44f83fd17d2816a4e7d0423cb18c840cdd111681de6773ebe0f9f"],"transactionsRoot":"0x38b58d1a71e30024371ce1004dc7a6196c3ec8f146ef39c3676d69ccdb1e968e","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-contract-calls-itself.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-contract-calls-itself.io new file mode 100644 index 0000000000..bf6a71e703 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-contract-calls-itself.io @@ -0,0 +1,3 @@ +// contract calls itself +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c40000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000001ce0000000000000000000000000000000000000000000000000000000002fa9e360000000000000000000000000000000000000000000000000000000000000000e27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","logs":[],"gasUsed":"0x57bc","maxUsedGas":"0x57bc","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x57bc","hash":"0x7446146a10443e02f381f5fdfa52dd841ddbfd823091177eeecc069c86d0d0d1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xe74486ea84ef8b10f828f52661656b006a7ff4ebe2dcf9830f985d1fc73c710f","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0xad1bbb2327dc01cd2358e3dc0b3ee2fe300f533b590b0b75263e4629d672cc87","timestamp":"0x1ce","transactions":["0x0ebea6745338caaba719752fd4c20f73c8582b5fe4d41e6aae53cf0755850e4b"],"transactionsRoot":"0x5d0e30903b218b6634ef7967cce4218efdd14cbcc8750447269ea4340829c2d1","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-calls-and-overrides-ethSimulate.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-calls-and-overrides-ethSimulate.io new file mode 100644 index 0000000000..7db3fe8f3e --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-calls-and-overrides-ethSimulate.io @@ -0,0 +1,3 @@ +// ethSimulate with state overrides and calls but they are empty +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{},"calls":[{}]},{"stateOverrides":{},"calls":[{}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xcf08","maxUsedGas":"0xcf08","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xcf08","hash":"0xa02276791c39e6662cd8019a2cbb8a075403153067431795cee1b21de5c3b048","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xc508745f9f8b6847a127bbc58b7c6b2c0f073c7ca778b6f020138f0d6d782adf","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x27e","stateRoot":"0xe475c130ff1da56c619eb0e0606662f2c8d71bbeb4e9e9988fe4dd77a46b5592","timestamp":"0x1ce","transactions":["0xaab6995ceb3fb6183ef81e8cdaa904e2c96f3907215d19771607e47dec9f8c14"],"transactionsRoot":"0x1fa13b004aa237b7b76c85ee7eabebdf1185ce59372063945dd7d8b633be6a9d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xcf08","maxUsedGas":"0xcf08","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xcf08","hash":"0x6b815df465db753531df8a7a1635024a68090d535d06925eefa1c1bcb94ef043","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa02276791c39e6662cd8019a2cbb8a075403153067431795cee1b21de5c3b048","receiptsRoot":"0xc508745f9f8b6847a127bbc58b7c6b2c0f073c7ca778b6f020138f0d6d782adf","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x27e","stateRoot":"0xb1b1f9033f5d5ca5768a5e83a870314ac7e4be705023819dfe5fe87ac0cf2d58","timestamp":"0x1da","transactions":["0xed1bb5dac61f5f86e0d94f1de1126e1c1e5ed425f1f8c94bdd22fe450cd04fd8"],"transactionsRoot":"0x852ebbbf52bca5ef4d1996d2caaea9f601bd85893573c3278923d9cf4d20b80b","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-validation.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-validation.io new file mode 100644 index 0000000000..78604ef0e5 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-validation.io @@ -0,0 +1,3 @@ +// simulates empty with validation +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{}],"validation":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x4c9114a","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xae7cbe8ec3881788fc4c4eee069f4f71783af27cf8308fff5203dc862744529b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-current.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-current.io new file mode 100644 index 0000000000..a81e8ed9a1 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-current.io @@ -0,0 +1,3 @@ +// set block number otherwise empty with latest +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{}]},"0x2d"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-firstblock.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-firstblock.io new file mode 100644 index 0000000000..ad6183b1df --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-firstblock.io @@ -0,0 +1,3 @@ +// set block number otherwise empty +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{}]},"0x1"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"calls":[],"difficulty":"0x20000","extraData":"0x","gasLimit":"0x23f3e20","gasUsed":"0x0","hash":"0xd1c03d8586b7b759ee51a9705bf8459d4a02f83cce627426323f5c632dbcd0bd","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2","parentHash":"0x79ba0368c2c6563a7d263695b583dcc6d1c25d4988daa0105804d38bdd987f2f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x1fc","stateRoot":"0x283987661dff30976050c10b25ba46b4f8afc16da2cf67cd459d14a9ab43ec67","timestamp":"0x16","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[]}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-minusone.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-minusone.io new file mode 100644 index 0000000000..c0dc3c79d9 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-minusone.io @@ -0,0 +1,3 @@ +// set block number otherwise empty with latest - 1 +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{}]},"0x2c"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4f064f08c3402fda462a0f8b86b19c68df63b8f1b18d99d73e568b6ca056e792","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4b9d85c6787612e87e0659e11a347d415040465e492358f79cc7e2e293f38aa7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xc1c98781685e12602d5f1fdbdbbc6a818062e0d90caab6e9eb6fafa32456674e","timestamp":"0x1c4","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-plus1.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-plus1.io new file mode 100644 index 0000000000..0bd9d75b7e --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty-with-block-num-set-plus1.io @@ -0,0 +1,3 @@ +// set block number otherwise empty with latest + 1 +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{}]},"0x2e"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"header not found"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty.io new file mode 100644 index 0000000000..a70e4771b0 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-empty.io @@ -0,0 +1,3 @@ +// simulates empty +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{}],"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-not-produce-logs-by-default.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-not-produce-logs-by-default.io new file mode 100644 index 0000000000..8d04084f34 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-not-produce-logs-by-default.io @@ -0,0 +1,3 @@ +// when sending eth we should not get ETH logs by default +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xd568b74dd9ae10031741a45a142f7dcb2625d2e31b552a6fef3a87542daef335","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xb502e202e53b7160ce4bca5518a81910aa6193601fee6a25a17ee8f7ffcba2dc","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d"],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-not-produce-logs-on-revert.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-not-produce-logs-on-revert.io new file mode 100644 index 0000000000..13ee5cce04 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-not-produce-logs-on-revert.io @@ -0,0 +1,3 @@ +// we should not be producing eth logs if the transaction reverts and ETH is not sent +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405260006042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401603990609d565b60405180910390fd5b005b600082825260208201905092915050565b7f416c7761797320726576657274696e6720636f6e747261637400000000000000600082015250565b600060896019836044565b91506092826055565b602082019050919050565b6000602082019050818103600083015260b481607e565b905091905056fea264697066735822122005cbbbc709291f66fadc17416c1b0ed4d72941840db11468a21b8e1a0362024c64736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5355","maxUsedGas":"0x5355","status":"0x0","error":{"message":"execution reverted: Always reverting contract","code":3,"data":"0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019416c7761797320726576657274696e6720636f6e747261637400000000000000"}}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5355","hash":"0xb7cfb541a3b6f803652183bcfc9c05f4ef620de2b3f311b456fc3278c331f594","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x7b5229be4e7c4e3dbbc8e3720721cab89e102f1140ee3b3b771fcca12348c2d7","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0x8720fac65ec640e5735116f80db8a191a79e690af9f490612929f7f8c531b5dd","timestamp":"0x1ce","transactions":[{"blockHash":"0xb7cfb541a3b6f803652183bcfc9c05f4ef620de2b3f311b456fc3278c331f594","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","input":"0x","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x3e8","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-logs.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-logs.io new file mode 100644 index 0000000000..c8a589521f --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-logs.io @@ -0,0 +1,3 @@ +// when sending eth we should get ETH logs when traceTransfers is set +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","transactionIndex":"0x0","blockHash":"0xd568b74dd9ae10031741a45a142f7dcb2625d2e31b552a6fef3a87542daef335","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xd568b74dd9ae10031741a45a142f7dcb2625d2e31b552a6fef3a87542daef335","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xb502e202e53b7160ce4bca5518a81910aa6193601fee6a25a17ee8f7ffcba2dc","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d"],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-more-logs-on-forward.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-more-logs-on-forward.io new file mode 100644 index 0000000000..8fb00ad6c8 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-more-logs-on-forward.io @@ -0,0 +1,3 @@ +// we should be getting more logs if eth is forwarded +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"},"0xc100000000000000000000000000000000000000":{"code":"0x60806040526004361061001e5760003560e01c80634b64e49214610023575b600080fd5b61003d6004803603810190610038919061011f565b61003f565b005b60008173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050509050806100b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100af906101a9565b60405180910390fd5b5050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100ec826100c1565b9050919050565b6100fc816100e1565b811461010757600080fd5b50565b600081359050610119816100f3565b92915050565b600060208284031215610135576101346100bc565b5b60006101438482850161010a565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061019360148361014c565b915061019e8261015d565b602082019050919050565b600060208201905081810360008301526101c281610186565b905091905056fea2646970667358221220563acd6f5b8ad06a3faf5c27fddd0ecbc198408b99290ce50d15c2cf7043694964736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x4b64e4920000000000000000000000000000000000000000000000000000000000000100"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xef0d02bf15d1cb59d4df1d6eb5f31f6876145330ec4022deba14011c2214dff2","transactionIndex":"0x0","blockHash":"0x96170f8aaab9189090c70caa999c5bd57728df2cd7be3b5080bcabac85b7eb89","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false},{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c100000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000100"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xef0d02bf15d1cb59d4df1d6eb5f31f6876145330ec4022deba14011c2214dff2","transactionIndex":"0x0","blockHash":"0x96170f8aaab9189090c70caa999c5bd57728df2cd7be3b5080bcabac85b7eb89","blockTimestamp":"0x1ce","logIndex":"0x1","removed":false}],"gasUsed":"0xdad2","maxUsedGas":"0xdad2","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xdad2","hash":"0x96170f8aaab9189090c70caa999c5bd57728df2cd7be3b5080bcabac85b7eb89","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x5d13901976e7d7b948d96a4d04f33384035d0b9e82da61f0c616cdc3ef97ec1d","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0x09cb784f1a32517b14e2a5ced437f52f606732b5c401da78e0c1a0d0d90fce34","timestamp":"0x1ce","transactions":["0xef0d02bf15d1cb59d4df1d6eb5f31f6876145330ec4022deba14011c2214dff2"],"transactionsRoot":"0x89aff3b87fc87c69e68d7fff65e2934359d86900800522d052f6d62b85250cb4","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-no-logs-on-forward-revert.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-no-logs-on-forward-revert.io new file mode 100644 index 0000000000..bea373f94d --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-eth-send-should-produce-no-logs-on-forward-revert.io @@ -0,0 +1,3 @@ +// we should be getting no logs if eth is forwarded but then the tx reverts +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"},"0xc100000000000000000000000000000000000000":{"code":"0x60806040526004361061001e5760003560e01c80634b64e49214610023575b600080fd5b61003d6004803603810190610038919061011f565b61003f565b005b60008173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050509050806100b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100af906101a9565b60405180910390fd5b5050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100ec826100c1565b9050919050565b6100fc816100e1565b811461010757600080fd5b50565b600081359050610119816100f3565b92915050565b600060208284031215610135576101346100bc565b5b60006101438482850161010a565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061019360148361014c565b915061019e8261015d565b602082019050919050565b600060208201905081810360008301526101c281610186565b905091905056fea2646970667358221220563acd6f5b8ad06a3faf5c27fddd0ecbc198408b99290ce50d15c2cf7043694964736f6c63430008120033"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405260006042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401603990609d565b60405180910390fd5b005b600082825260208201905092915050565b7f416c7761797320726576657274696e6720636f6e747261637400000000000000600082015250565b600060896019836044565b91506092826055565b602082019050919050565b6000602082019050818103600083015260b481607e565b905091905056fea264697066735822122005cbbbc709291f66fadc17416c1b0ed4d72941840db11468a21b8e1a0362024c64736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x4b64e492c200000000000000000000000000000000000000000000000000000000000000"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5423","maxUsedGas":"0x5423","status":"0x0","error":{"message":"execution reverted","code":3,"data":"0x"}}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5423","hash":"0x1774ab32d009caa27df2208a68938a82b0fec8cc9f256939e2085059f5fc8a38","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xd18db8835dc75ed86273afd95200dec80ef2c2323698a57e7126e29d08e3c267","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0x20e627f998d1c96e660f1e268ae7a8b9866c6ff7071cf03727be027c3f4bf23f","timestamp":"0x1ce","transactions":["0xe10ffbfdb475f70a7d4c338db15233a37e3ffa87f8180c7117265fff4f5ba9c6"],"transactionsRoot":"0xfa8a26404b6db562feecd5faba5380c73525dae3eb86f1e2dbed903561507563","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-existing-contract.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-existing-contract.io new file mode 100644 index 0000000000..e17615d2a1 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-existing-contract.io @@ -0,0 +1,3 @@ +// test extcodehash getting of existing contract and then overriding it +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631627905514610043578063b9724d6314610073578063dce4a447146100a3575b5f80fd5b61005d600480360381019061005891906101b3565b6100d3565b60405161006a91906101f8565b60405180910390f35b61008d600480360381019061008891906101b3565b61011a565b60405161009a9190610229565b60405180910390f35b6100bd60048036038101906100b891906101b3565b610129565b6040516100ca91906102cc565b60405180910390f35b5f807fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f1b90505f833f905081811415801561011157505f801b8114155b92505050919050565b5f80823f905080915050919050565b6060813b60405191505f19601f18601f6020830101168201604052808252805f60208401853c50919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018282610159565b9050919050565b61019281610178565b811461019c575f80fd5b50565b5f813590506101ad81610189565b92915050565b5f602082840312156101c8576101c7610155565b5b5f6101d58482850161019f565b91505092915050565b5f8115159050919050565b6101f2816101de565b82525050565b5f60208201905061020b5f8301846101e9565b92915050565b5f819050919050565b61022381610211565b82525050565b5f60208201905061023c5f83018461021a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561027957808201518184015260208101905061025e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61029e82610242565b6102a8818561024c565b93506102b881856020860161025c565b6102c181610284565b840191505092915050565b5f6020820190508181035f8301526102e48184610294565b90509291505056fea26469706673582212206a23e83d04cb5f5ab00353d719afd8181b39baa39277b8cfa111197637a4f26064736f6c63430008160033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0xb9724d630000000000000000000000000000000000000000000000000000000000031ec7"}]},{"stateOverrides":{"0x0000000000000000000000000000000000031ec7":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0xb9724d630000000000000000000000000000000000000000000000000000000000031ec7"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5fa2","maxUsedGas":"0x5fa2","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5fa2","hash":"0x25463d062bd7382d0b701903210384f5f708d4c5e680de26dd0f443f4596b0fa","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x303c397062fdc304cea9ad1c29c08ca745e6aab61a335543b2f38bfe6d9962c4","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0xdb8f86639940c4edd240112577ddf89b607a06d90b00c46660a671b659f69161","timestamp":"0x1ce","transactions":["0xa559678897c685bf88aa818e7cc93acf16306d5262b5c399bbcee04a73ead535"],"transactionsRoot":"0xe4f367a72308a1ebd9cf3d8fa9c9542346728880c82c8aa9c6adcc16410feaf8","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x175483145411027d5c8d8e7c3f1133ac003e209c71f42b373f7fcdf9ed500278","logs":[],"gasUsed":"0x5fa2","maxUsedGas":"0x5fa2","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5fa2","hash":"0x4aefda86395aa92c15a4e3011cc8706562a6c659fcd3855ff8a076e74c77584f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x25463d062bd7382d0b701903210384f5f708d4c5e680de26dd0f443f4596b0fa","receiptsRoot":"0x303c397062fdc304cea9ad1c29c08ca745e6aab61a335543b2f38bfe6d9962c4","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x2ccd4bf5a3d3dea8d215d5ca713f60e8a6dbe5bef62bb76577a1607c91e6e093","timestamp":"0x1da","transactions":["0x05c57c5cea5fd6fed8baffe29e878893b4904c8703a878ccbb21caed07713a94"],"transactionsRoot":"0xdb8baea5403a6508522030660fadfef5ae5bc658cd44b5f9e4d672afcb4f53a2","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-override.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-override.io new file mode 100644 index 0000000000..2e2976dbbd --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-override.io @@ -0,0 +1,3 @@ +// test extcodehash getting of overriden contract +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631627905514610043578063b9724d6314610073578063dce4a447146100a3575b5f80fd5b61005d600480360381019061005891906101b3565b6100d3565b60405161006a91906101f8565b60405180910390f35b61008d600480360381019061008891906101b3565b61011a565b60405161009a9190610229565b60405180910390f35b6100bd60048036038101906100b891906101b3565b610129565b6040516100ca91906102cc565b60405180910390f35b5f807fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f1b90505f833f905081811415801561011157505f801b8114155b92505050919050565b5f80823f905080915050919050565b6060813b60405191505f19601f18601f6020830101168201604052808252805f60208401853c50919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018282610159565b9050919050565b61019281610178565b811461019c575f80fd5b50565b5f813590506101ad81610189565b92915050565b5f602082840312156101c8576101c7610155565b5b5f6101d58482850161019f565b91505092915050565b5f8115159050919050565b6101f2816101de565b82525050565b5f60208201905061020b5f8301846101e9565b92915050565b5f819050919050565b61022381610211565b82525050565b5f60208201905061023c5f83018461021a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561027957808201518184015260208101905061025e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61029e82610242565b6102a8818561024c565b93506102b881856020860161025c565b6102c181610284565b840191505092915050565b5f6020820190508181035f8301526102e48184610294565b90509291505056fea26469706673582212206a23e83d04cb5f5ab00353d719afd8181b39baa39277b8cfa111197637a4f26064736f6c63430008160033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0xb9724d63000000000000000000000000c200000000000000000000000000000000000000"}]},{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0xb9724d63000000000000000000000000c200000000000000000000000000000000000000"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5f8a","maxUsedGas":"0x5f8a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5f8a","hash":"0x1408aa17740a8938238c6d8e3f0ce6cf54245a1aeaac2430aa2872f8bcb80ce8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x7f41d2066b53110d43b701cc7609ec0ead70917ddea03741056b7a3f3ed430f3","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x90c928709259621bf260ef2bb65d276e25b48a873a00e5b8b8c48a85a5b4eb3b","timestamp":"0x1ce","transactions":["0x0022f5d33b93c9ad474e42b0879e7123a0b8c06078d8319a89d8d52ba5d5ced7"],"transactionsRoot":"0x726990cfa59e9e15d28c37321db01e871c6d87f8781d0c83e3c8d54bfcdd19de","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x175483145411027d5c8d8e7c3f1133ac003e209c71f42b373f7fcdf9ed500278","logs":[],"gasUsed":"0x5f8a","maxUsedGas":"0x5f8a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5f8a","hash":"0x18123b9614dd5c4d5d67c41a7edc358d75542aea5c2818a319b88f39d7723237","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1408aa17740a8938238c6d8e3f0ce6cf54245a1aeaac2430aa2872f8bcb80ce8","receiptsRoot":"0x7f41d2066b53110d43b701cc7609ec0ead70917ddea03741056b7a3f3ed430f3","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x54897f4b7abd30e7e81de420d8358879f10a2b5505adfe94d3a58063302f2d2f","timestamp":"0x1da","transactions":["0x1a314159c3d96dfa92bd608be1daec75d7ed2c07ad106e4b5a2af343543ef580"],"transactionsRoot":"0x220b5e729b7a81b6fb0d7000e41643a5ca35fd9bf3d271fd8c24e96f0f7531ac","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-precompile.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-precompile.io new file mode 100644 index 0000000000..9d673c4827 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-extcodehash-precompile.io @@ -0,0 +1,3 @@ +// test extcodehash getting of precompile and then again after override +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631627905514610043578063b9724d6314610073578063dce4a447146100a3575b5f80fd5b61005d600480360381019061005891906101b3565b6100d3565b60405161006a91906101f8565b60405180910390f35b61008d600480360381019061008891906101b3565b61011a565b60405161009a9190610229565b60405180910390f35b6100bd60048036038101906100b891906101b3565b610129565b6040516100ca91906102cc565b60405180910390f35b5f807fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f1b90505f833f905081811415801561011157505f801b8114155b92505050919050565b5f80823f905080915050919050565b6060813b60405191505f19601f18601f6020830101168201604052808252805f60208401853c50919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018282610159565b9050919050565b61019281610178565b811461019c575f80fd5b50565b5f813590506101ad81610189565b92915050565b5f602082840312156101c8576101c7610155565b5b5f6101d58482850161019f565b91505092915050565b5f8115159050919050565b6101f2816101de565b82525050565b5f60208201905061020b5f8301846101e9565b92915050565b5f819050919050565b61022381610211565b82525050565b5f60208201905061023c5f83018461021a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561027957808201518184015260208101905061025e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61029e82610242565b6102a8818561024c565b93506102b881856020860161025c565b6102c181610284565b840191505092915050565b5f6020820190508181035f8301526102e48184610294565b90509291505056fea26469706673582212206a23e83d04cb5f5ab00353d719afd8181b39baa39277b8cfa111197637a4f26064736f6c63430008160033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0xb9724d630000000000000000000000000000000000000000000000000000000000000001"}]},{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0xb9724d630000000000000000000000000000000000000000000000000000000000000001"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x55c6","maxUsedGas":"0x55c6","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55c6","hash":"0xd2a322ead13d19c78d742e254f398dc7f6273fff88fd39cb95e8bd83d2ac5d4d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xbc6b1a24e538cf7f3a32465399f9d58673ccde8c7271ec6033bdc632bdfbbe01","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0xdb8f86639940c4edd240112577ddf89b607a06d90b00c46660a671b659f69161","timestamp":"0x1ce","transactions":["0xc643654ad3382dc260c0b3b36999eccfec3e2f0c35841582f966e4bc2c7d7e99"],"transactionsRoot":"0x4bb68e7f6729b2b9853b5dbd55473ca8b42c13e3e8731077eacbbdcea0f9ea99","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x175483145411027d5c8d8e7c3f1133ac003e209c71f42b373f7fcdf9ed500278","logs":[],"gasUsed":"0x55c6","maxUsedGas":"0x55c6","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55c6","hash":"0x0b6104d628d29a542fcf106876fefd03faee742c91cd7b3a9d87bd31e9289122","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd2a322ead13d19c78d742e254f398dc7f6273fff88fd39cb95e8bd83d2ac5d4d","receiptsRoot":"0xbc6b1a24e538cf7f3a32465399f9d58673ccde8c7271ec6033bdc632bdfbbe01","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x0fc5fafd77089768c182a6893717333d3838b34d2a3c3c6a15eb3598f0772e61","timestamp":"0x1da","transactions":["0x81dd55afaa683e0bf3aee55c0e7d2a389ebf96d3c19dad08baa6ab583b6fc66f"],"transactionsRoot":"0xdfb43ca14f8b2320ec926cae5b841c54502db3acc8f866aac23769e631747ae1","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-fee-recipient-receiving-funds.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-fee-recipient-receiving-funds.io new file mode 100644 index 0000000000..dfdb4ff3b8 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-fee-recipient-receiving-funds.io @@ -0,0 +1,3 @@ +// Check that fee recipient gets funds +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x57","feeRecipient":"0xc200000000000000000000000000000000000000","baseFeePerGas":"0xa"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1dcd6500"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8b2cb4f14610030575b600080fd5b61004a600480360381019061004591906100e4565b610060565b604051610057919061012a565b60405180910390f35b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100b182610086565b9050919050565b6100c1816100a6565b81146100cc57600080fd5b50565b6000813590506100de816100b8565b92915050565b6000602082840312156100fa576100f9610081565b5b6000610108848285016100cf565b91505092915050565b6000819050919050565b61012481610111565b82525050565b600060208201905061013f600083018461011b565b9291505056fea2646970667358221220172c443a163d8a43e018c339d1b749c312c94b6de22835953d960985daf228c764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0xa","maxPriorityFeePerGas":"0xa","nonce":"0x0","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0xa","nonce":"0x1","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0xa","nonce":"0x2","input":"0xf8b2cb4f000000000000000000000000c200000000000000000000000000000000000000"}]}],"traceTransfers":true,"validation":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x4c9114a","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xae7cbe8ec3881788fc4c4eee069f4f71783af27cf8308fff5203dc862744529b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x42fef21","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xc0556f586e1eb3aebd88532018fca4921099c8c2eeee8215e68594402942b3b4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xae7cbe8ec3881788fc4c4eee069f4f71783af27cf8308fff5203dc862744529b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x1f6e2afa585cf425209e0bc9d58b31c245ffadf4a695fdb70b8a489f2c8d9bea","timestamp":"0x1da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x3a9f13d","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8c3a80a6ff4423fa33390167efff4e615c506e3911132a6370ca10507c4977b5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc0556f586e1eb3aebd88532018fca4921099c8c2eeee8215e68594402942b3b4","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x15d9d48c9647f8f97dfd18614079965adedb1e358d197eabc0c775a046770ea3","timestamp":"0x1e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x334b316","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x7d4aa4b6e6d8000171758c56d3055a270508c68411d66f7e11a60040f9d810e8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8c3a80a6ff4423fa33390167efff4e615c506e3911132a6370ca10507c4977b5","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0xe1719ea1b037df6f7c42cad8143987944b6359c13dcc4e0da9ca974c5e68b11a","timestamp":"0x1f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x2ce1cb4","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xea97f94bd0813c302a23eff4fa5f3fa1dd11f6b29b765ceb13b8dd7ead0d1890","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x7d4aa4b6e6d8000171758c56d3055a270508c68411d66f7e11a60040f9d810e8","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x9eed60f7b85ef57e0b85a3f34f3b9f505cba15c9f1c0aa6a1a27bb0d70c83db3","timestamp":"0x1fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x274591e","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x525353c709d2b17af5627a83753543a5d7a3317e560aa251634f984601d9875f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xea97f94bd0813c302a23eff4fa5f3fa1dd11f6b29b765ceb13b8dd7ead0d1890","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x41e2702e2476a8534044a0c5648e268a2bd90697393e86bad424f9e4f4453f4f","timestamp":"0x20a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x225cdfb","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xad190d8758f3b9ccd5cfd836421225d3d9b90735a802e1608f506f06ebe8067e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x34","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x525353c709d2b17af5627a83753543a5d7a3317e560aa251634f984601d9875f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0xc8242bb46e70daef5cd7ecd88c2ada206dc6aae50a3ce02e3d6f27e5dd252d8d","timestamp":"0x216","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x1e1143c","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd91f3fa194152b01151487f6f355fdd961089a687c350699fca0b1584dd3cf9c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x35","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xad190d8758f3b9ccd5cfd836421225d3d9b90735a802e1608f506f06ebe8067e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x291d2d10e1e3982910e8083477ca9e7aebccb280def9ebaafc4110aa74a45ffb","timestamp":"0x222","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x1a4f1b5","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1d1e2d94d38c02bbe2d2d99fd2068707d43ce0fc089c80e1c74d3f92ad2aed08","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x36","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd91f3fa194152b01151487f6f355fdd961089a687c350699fca0b1584dd3cf9c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x5c6584a2b92b1861e932348194a829b1cdb0669b0c8c65b8ddfc7e4c1bba90a3","timestamp":"0x22e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x170537f","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1e4d347329722bd59e3d312d71775c93fd6cf1cdb4832fa8b619e93c8edf011c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x37","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1d1e2d94d38c02bbe2d2d99fd2068707d43ce0fc089c80e1c74d3f92ad2aed08","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x3df7206fa7d8ab6e8833e8750c16ad3fe6a7acd362dfa1561bf65f138f461bd7","timestamp":"0x23a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x1424910","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0db059057cc9c0dbcda5566388e9219dd2ce732a31f4a9a5184f76ed1bc1b039","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x38","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1e4d347329722bd59e3d312d71775c93fd6cf1cdb4832fa8b619e93c8edf011c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0xfec43586803e800debb0e3e3fa4b0dabbdf37bfd2ca8cf15a22b37b9e8658835","timestamp":"0x246","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x119ffee","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8c8b2e64193e66c362530a48d30f10cde3b4edfbd9f1a6e1809ecff3f932acac","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x39","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0db059057cc9c0dbcda5566388e9219dd2ce732a31f4a9a5184f76ed1bc1b039","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x266","stateRoot":"0x15a4e5da153555539fde1a13ca4e90f3ef92add7116d2349f8d20690422aa6e0","timestamp":"0x252","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xf6bff1","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2dd54a641970b0049375d8874e3623fa137c1be33527d2b4f09a162b4d983793","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8c8b2e64193e66c362530a48d30f10cde3b4edfbd9f1a6e1809ecff3f932acac","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xa053521698afc700d271203a3777471086ed014a7b84511aff3168e196f0d1da","timestamp":"0x25e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xd7e7f3","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x29cc99ad8dcf91aeb041093b7f1b2e8249069eb45140dfc3b8c4910095d15b23","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2dd54a641970b0049375d8874e3623fa137c1be33527d2b4f09a162b4d983793","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x9eda860774d1a621429e103fd325bdef4320ccbbca9b52d200c601cd72d56206","timestamp":"0x26a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xbceaf5","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x17bf1d8ff78aebcc3b4d676385ccbd7a182e0f47bf8ea02ca4dd2bd52375e6da","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x29cc99ad8dcf91aeb041093b7f1b2e8249069eb45140dfc3b8c4910095d15b23","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xd63110ac76237ead9d414c2789f4ab044bc35d624b27898221ec783a6c6c0a6e","timestamp":"0x276","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xa54d97","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0c9c2e2adfd5ea981baa8da7b689e18abda6c06274d230c2c04591f02a251e40","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x17bf1d8ff78aebcc3b4d676385ccbd7a182e0f47bf8ea02ca4dd2bd52375e6da","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x7d183d6a03776089db9366379b1f4c82b930272de8b7a9b02303392df685a7da","timestamp":"0x282","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x90a3e5","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x0d2788ed1344e1c591bd8404d6d3b6129f39cc789909913e4332f992a310ad51","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0c9c2e2adfd5ea981baa8da7b689e18abda6c06274d230c2c04591f02a251e40","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x86c2b99793eaadea26fc2c5ea2cb9b7e6635b6dbd399d785dfa222d93f8a1e04","timestamp":"0x28e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x7e8f69","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x984371fed8c4a8655229f284dc14d7c594ec6b202d5651c7a660ef79e31d599b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0d2788ed1344e1c591bd8404d6d3b6129f39cc789909913e4332f992a310ad51","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x60afc218442a35f93df2bb8714f1e780a0ea18c3ee23fbe6a3ad249acde8e80e","timestamp":"0x29a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x6ebd7c","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb605836b3790de23c231359f7b93607d35bf524c205513c2e8d6488b863cfe1f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x40","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x984371fed8c4a8655229f284dc14d7c594ec6b202d5651c7a660ef79e31d599b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x3ed873c199ee77adccb8f0a187099bf75a81142c5ae276b7a89d82802332c31f","timestamp":"0x2a6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x60e5cd","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2e2b5aae19a2104d494bcbf5f1b026b284290d2af1c729a70e42995814205e0b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x41","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb605836b3790de23c231359f7b93607d35bf524c205513c2e8d6488b863cfe1f","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x6475e415ce00dd79b5e6b23320f29b8bd75855602b65bf2e14f5df4b4fa43c0d","timestamp":"0x2b2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x54c914","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x51aeebf54f01fefc3b80e51f5e8e55b138b4656f432a1bfa58bab1e6b5f41a2a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x42","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2e2b5aae19a2104d494bcbf5f1b026b284290d2af1c729a70e42995814205e0b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xc13f7fe0343051b8a59cc39cfdc641d1b9b5e2a85fad1b55ce0c82f4dfce6b8e","timestamp":"0x2be","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x4a2ff2","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa0208b9ba78f6df18e337d30a5959d417dfa8d60a7115feb0bc44a844f0cd479","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x43","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x51aeebf54f01fefc3b80e51f5e8e55b138b4656f432a1bfa58bab1e6b5f41a2a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x0f88ca02f52462b9dea31158175ce321a713973095a854042b42034c9b2db4b7","timestamp":"0x2ca","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x40e9f4","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6bfdb9ee34974fd7cbe5441ae494642f75fe93d778896716ba16bb4f95220f5e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x44","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa0208b9ba78f6df18e337d30a5959d417dfa8d60a7115feb0bc44a844f0cd479","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x829ce43bce6d301bc16962126a2d6811ef6337800105be8d8ae047d5a8f2c5bc","timestamp":"0x2d6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x38ccb6","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4f4558ab09df741dd7e5b7a28e2e108ba57d1c50f0025e3956b5b942cde83ac9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x45","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6bfdb9ee34974fd7cbe5441ae494642f75fe93d778896716ba16bb4f95220f5e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x884dfc7a4e5651002c5d94209c16fa95d2fb767c09ec5dbacab99c5fb3bfadb4","timestamp":"0x2e2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x31b320","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x9c305b7ea0ec477a144616d09fa93e2b9a67564750487ee791b1fdb5c6677671","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x46","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4f4558ab09df741dd7e5b7a28e2e108ba57d1c50f0025e3956b5b942cde83ac9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x880f209a02e56b44703a8f3ec2e6cc3bf13f4b7ecea397d59b25ba4cd5f70b80","timestamp":"0x2ee","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x2b7cbc","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x48b80cac3f34663ed329780c8b9ab23d5b6e3add1dd3f6e9977ad463d9dd23fb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x47","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9c305b7ea0ec477a144616d09fa93e2b9a67564750487ee791b1fdb5c6677671","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x010505db555bbc6cd4c9b98b93b0e108e8bcea17678a9692fbb7b83b04fb75cb","timestamp":"0x2fa","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x260d25","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2a67a2add1d2462355d0ad10ed343ee2fd07eebb611ad082e7e8cf53376308fb","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x48","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x48b80cac3f34663ed329780c8b9ab23d5b6e3add1dd3f6e9977ad463d9dd23fb","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x1b3c376088013f5cfd23a0458e4686124c564d6f5d542db7fd094e5db5d006a4","timestamp":"0x306","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x214b81","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xfe96ead059a016fde694afd2c52d7006c8225d9a7d605efbff7b2849d97de70b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x49","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2a67a2add1d2462355d0ad10ed343ee2fd07eebb611ad082e7e8cf53376308fb","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x1eab80c7018eed10309025b9262ac74126089bb13dd2691cc358f2f935b7447d","timestamp":"0x312","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x1d2211","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb301c3a05882a2546034ac3a0a8f838ff8c567429f9291c9edbe77eebbe68763","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xfe96ead059a016fde694afd2c52d7006c8225d9a7d605efbff7b2849d97de70b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x756b91f425cf49ec2237b7525e839b7f927280eced33755192438fe59080bf0a","timestamp":"0x31e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x197dcf","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xf5ffa923c88f8a0e4b6ae424b6ab0bc370b9eb485e41f5e2bb53f3d648170ad5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb301c3a05882a2546034ac3a0a8f838ff8c567429f9291c9edbe77eebbe68763","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x104f509a3b4bb4aa90b1348bf075e7dfd1ee291b329d76cd997af32940b5d338","timestamp":"0x32a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x164e16","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x38e80dcc628ee9f187209cd9bb25b68fc7096aed58641a45cfe64a4f5320c5af","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xf5ffa923c88f8a0e4b6ae424b6ab0bc370b9eb485e41f5e2bb53f3d648170ad5","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xf0ea73345989f140cf3943d32409571b6cd8cb25aa4a215702aadcfd5a217f25","timestamp":"0x336","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x138454","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x5a2396330c4e26021da5e8906d7a15368121484d8b6f8e986f79de0f1d04546d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x38e80dcc628ee9f187209cd9bb25b68fc7096aed58641a45cfe64a4f5320c5af","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x0ef977d10af6ad107823ccfe8dce3133c895ea1a4adf4454a678a4572c72202e","timestamp":"0x342","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x1113ca","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb0ea9f765ae53c988ae3fc6568c07d7ee5bc9c193bb224d1bfeeb20690785f27","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5a2396330c4e26021da5e8906d7a15368121484d8b6f8e986f79de0f1d04546d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xd2d05dad73e15f058eaa70dd21faddd531738ee5e3fcd1163f65fe208f0fb63c","timestamp":"0x34e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xef151","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x799241ed71f6a238c9ba6ce403e8c5c397a8269a779feb61afe5efd5411d2d21","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb0ea9f765ae53c988ae3fc6568c07d7ee5bc9c193bb224d1bfeeb20690785f27","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x44f45f22f4da11b24602dff91f999d2ac265d9c8a91ea7da25be75860b65539b","timestamp":"0x35a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xd1327","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdf68fe126eb24c46ad80f64c01a92a1b3540671069d0e2411131ba16bf0a96b3","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x50","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x799241ed71f6a238c9ba6ce403e8c5c397a8269a779feb61afe5efd5411d2d21","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xb2d9cbd4f8379b8762e8fe08ae5738dc518f81d3d8c3e67c8f9774e41f0a1f00","timestamp":"0x366","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xb70c3","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xc8f7c8243aa16c00ad0d9c8d7c250a320c88e175f73889ce1c5e5b314ebac57e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x51","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdf68fe126eb24c46ad80f64c01a92a1b3540671069d0e2411131ba16bf0a96b3","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x16bf531a50291daaaf0142cbdf8db253ceb4a2255f084f994c42a590b8463a86","timestamp":"0x372","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xa02ab","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x062483edb68e7a65feb247c0909aa1b7b71de0a518cb405abedf6a51f10515ea","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x52","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc8f7c8243aa16c00ad0d9c8d7c250a320c88e175f73889ce1c5e5b314ebac57e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x049d263085f9b11b8377c6157508a6630a892252429b8ba841fe52cb33ad1566","timestamp":"0x37e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x8c256","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x4d816e8efa5a45729220136b7d54ae1b67df1d7f544ba8a30a6a34ecaf7c2654","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x53","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x062483edb68e7a65feb247c0909aa1b7b71de0a518cb405abedf6a51f10515ea","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xfaa9bb71f0450f96e3f188297302ae0b51c04195a4cdda705f632a36c7b8f1bd","timestamp":"0x38a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x7aa0c","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xcec2dccd51f9cb6aaa1fea24aa774ae6798941a79a9af022e94e2901a1e41f8c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x54","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x4d816e8efa5a45729220136b7d54ae1b67df1d7f544ba8a30a6a34ecaf7c2654","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x9130d41f21229d59dbab528734efb16ad51f3bdd66050713148e0508bd5aaedc","timestamp":"0x396","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x6b4cb","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1668c230a9274e9298be45349248e081db5c05f455afcb8a07a3eda88d987bbe","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x55","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xcec2dccd51f9cb6aaa1fea24aa774ae6798941a79a9af022e94e2901a1e41f8c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0x5dfae6c51c9265b86b704f6a83017275d4f645305143af9ec28d5b4574a73b15","timestamp":"0x3a2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x5de32","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x6a892e535109de66c1ec7d595f0ddeef4453a03bef997f2681d2ac052f888c4a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x56","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1668c230a9274e9298be45349248e081db5c05f455afcb8a07a3eda88d987bbe","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x265","stateRoot":"0xc576c4445cc599908086f6a9913eb93e45e1a1135e3a2360a6a2e0547027fcc6","timestamp":"0x3ae","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0xa","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x524e","maxUsedGas":"0x524e","status":"0x0","error":{"message":"execution reverted","code":3,"data":"0x"}},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x55b3","maxUsedGas":"0x55b3","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x55b3","maxUsedGas":"0x55b3","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xfdb4","hash":"0xde56fb201a11f4fa91f41380cf6bb164997609cafd5b92ec889b740a5555d2c0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x57","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x6a892e535109de66c1ec7d595f0ddeef4453a03bef997f2681d2ac052f888c4a","receiptsRoot":"0x808a8f9a75b802c4e574d31f6c70bfa9fb7432872a370793c367602d80761b99","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x33b","stateRoot":"0x84b70818a6a1a5013f0ceb6a6397186dded75c655823186febcdac79be2bc12b","timestamp":"0x3ba","transactions":[{"blockHash":"0xde56fb201a11f4fa91f41380cf6bb164997609cafd5b92ec889b740a5555d2c0","blockNumber":"0x57","blockTimestamp":"0x3ba","from":"0xc000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0xa","maxFeePerGas":"0xa","maxPriorityFeePerGas":"0xa","hash":"0x6944bece9a47ff930a37b5e6aff275d54cf6e7778dfc179f1e5b73b34a227c3d","input":"0x","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xde56fb201a11f4fa91f41380cf6bb164997609cafd5b92ec889b740a5555d2c0","blockNumber":"0x57","blockTimestamp":"0x3ba","from":"0xc000000000000000000000000000000000000000","gas":"0x2fa9e32","gasPrice":"0xa","maxFeePerGas":"0xa","maxPriorityFeePerGas":"0x0","hash":"0xeb77c2b0c2c6ee658a2916cee082cabfe6c48248b798c5ec0fafca263facf197","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000","nonce":"0x1","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xde56fb201a11f4fa91f41380cf6bb164997609cafd5b92ec889b740a5555d2c0","blockNumber":"0x57","blockTimestamp":"0x3ba","from":"0xc000000000000000000000000000000000000000","gas":"0x2fa487f","gasPrice":"0xa","maxFeePerGas":"0xa","maxPriorityFeePerGas":"0x0","hash":"0xf6d241c31f35a3ff4343446e45bdd6e5ef31890ccca372f5ff84c20b8fd7a0b8","input":"0xf8b2cb4f000000000000000000000000c200000000000000000000000000000000000000","nonce":"0x2","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0xd24c40d6fb8341cef958e93b47b5aba59d3c80094c9bd7d02d927ffaa3ed1a59","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-gas-fees-and-value-error-38014-with-validation.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-gas-fees-and-value-error-38014-with-validation.io new file mode 100644 index 0000000000..e9b28d13fd --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-gas-fees-and-value-error-38014-with-validation.io @@ -0,0 +1,3 @@ +// Error: Insufficient funds to pay for gas fees and value (-38014) with validation +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"err: max fee per gas less than block base fee: address 0xC000000000000000000000000000000000000000, maxFeePerGas: 0, baseFee: 80286026 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-gas-fees-and-value-error-38014.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-gas-fees-and-value-error-38014.io new file mode 100644 index 0000000000..a31166ed8d --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-gas-fees-and-value-error-38014.io @@ -0,0 +1,3 @@ +// Error: Insufficient funds to pay for gas fees and value (-38014) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38014,"message":"err: insufficient funds for gas * price + value: address 0xC000000000000000000000000000000000000000 have 0 want 1000 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-get-block-properties.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-get-block-properties.io new file mode 100644 index 0000000000..716e95b370 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-get-block-properties.io @@ -0,0 +1,3 @@ +// gets various block properties from chain +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c40000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000001ce0000000000000000000000000000000000000000000000000000000002fa9e360000000000000000000000000000000000000000000000000000000000000000e27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","logs":[],"gasUsed":"0x57bc","maxUsedGas":"0x57bc","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x57bc","hash":"0x1be8439d07496650ac45bbcf51d8c71baddc66e3b280b9ed7c9c0ad9117c9f4d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xe74486ea84ef8b10f828f52661656b006a7ff4ebe2dcf9830f985d1fc73c710f","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0x484c49a4d02cddc2494727bc585f2376e3c4f806d9a3f15cf41fd3dcec3de79d","timestamp":"0x1ce","transactions":["0x234a1d9897819c206fdeb6af312d742010a91b5b4159978a902c9a0b90e7bee5"],"transactionsRoot":"0xed81b1bfe79c8c81d3fe874f7214a9fb9dd186e8243abfeabc506550a532c09a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-instrict-gas-38013.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-instrict-gas-38013.io new file mode 100644 index 0000000000..9c9162913b --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-instrict-gas-38013.io @@ -0,0 +1,3 @@ +// Error: Not enough gas provided to pay for intrinsic gas (-38013) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x0"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38013,"message":"err: intrinsic gas too low: have 0, want 21000 (supplied gas 0)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-logs.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-logs.io new file mode 100644 index 0000000000..6011a8b866 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-logs.io @@ -0,0 +1,3 @@ +// simulates calls with logs +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600080a1600080f3"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x6057361d0000000000000000000000000000000000000000000000000000000000000005"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xc200000000000000000000000000000000000000","topics":["0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"],"data":"0x","blockNumber":"0x2e","transactionHash":"0x0c316124563c91479e019be7b012995015f22f6a150c1f42a78bc25e12cd00f7","transactionIndex":"0x0","blockHash":"0xfaa100e70c062fd170cb7a46cecc34c7aed732d1d59325aa41ff09d35d2d1e01","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x55d4","maxUsedGas":"0x55d4","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x55d4","hash":"0xfaa100e70c062fd170cb7a46cecc34c7aed732d1d59325aa41ff09d35d2d1e01","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000000000000000000000000000000000080000000000000000000000000000000000000000010000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x4287aeb00e17dccbeb1e50061a9ce4bf01cc943641c2583aef0441a7a5e471cd","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x0cd4ba3b47c16cc785fd0abd80ad0d734a53c498688be94204157deb484abfaf","timestamp":"0x1ce","transactions":["0x0c316124563c91479e019be7b012995015f22f6a150c1f42a78bc25e12cd00f7"],"transactionsRoot":"0x993f97c4f2a75df90d5e253e74875b9f81fea247fc0d5040e1a9d39a3967990c","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-make-call-with-future-block.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-make-call-with-future-block.io new file mode 100644 index 0000000000..e8f770062d --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-make-call-with-future-block.io @@ -0,0 +1,3 @@ +// start ethSimulate with future block +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000"}]}],"validation":true},"0x111"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"header not found"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-and-call-old-and-new.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-and-call-old-and-new.io new file mode 100644 index 0000000000..16cbc7f7ee --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-and-call-old-and-new.io @@ -0,0 +1,3 @@ +// move ecrecover and try calling the moved and non-moved version +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"movePrecompileToAddress":"0x0000000000000000000000000000000000123456"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5834","maxUsedGas":"0x5834","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x6266","maxUsedGas":"0x6266","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x17f1e","hash":"0x507f377a5cec5c8d8c1f0547eed5dc3aaad55e8ff2bc40320daac59c2efe0f50","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x7caac73517bb065f397e7c35f92140170f38a468fa3fa6cb9990cfc0ce14829e","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x52b","stateRoot":"0xf013e577ffa7498f6d0f2970858f541e56f2cf007e4e825d6ace613bcc207055","timestamp":"0x1ce","transactions":["0xedf77a4ff7a818e1e32ed4224d633b44fc9ea2f46454c684f341f536f00dbddd","0xaa5c34e49f0c569b197d7cd74000bb6b7a234343415c18d56948ffd1ff560178","0xb531b55ff4917d559dbab6150efb6fc180d2ffe06f7411eb2764c45996c65297","0x3fc1936bcdaf5e9e62d0ce846aedcf101cab5bf2ac8f1c5f2ca79cf29f61ac90"],"transactionsRoot":"0xd4f562b3ce8e5df52ea5b24630d4a047dcf31dd7e85801dc833a2b5937ac56cd","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-and-call.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-and-call.io new file mode 100644 index 0000000000..f51a493bb0 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-and-call.io @@ -0,0 +1,3 @@ +// move ecrecover and try calling it +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]},{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"movePrecompileToAddress":"0x0000000000000000000000000000000000123456"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xc484","hash":"0x1c8f863191bba6eba14ffa375f176ca3f05f2d0907cbeca2f8efcade39a77821","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xe7e5e1065fa5ff9117f0cb1c9dfcd1dbcfcc27d9c2bb0f28bdab3122a54fa411","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x3c8","stateRoot":"0xee4edd3bd009c2eb4f8f6f24b7e6981c2e77aba0660f4c064dff712b621d308c","timestamp":"0x1ce","transactions":["0xcf1bd2318ed0876dfcc473fdd4fbb1628c6149d26ae10651d1ba5c81b40bd343","0xce9c0063634779a5dbd101e03e78b781bd82c2c0c5b2b6a578436b6221447f90"],"transactionsRoot":"0x1cbedee6bedd859d3ba78f7be45f5920271d430ae9a3bad4adce7d4e5cf06940","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x6266","maxUsedGas":"0x6266","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x126ea","hash":"0x57f77362baa5d316d9a3d34f9d91df7a50f4c97ce5d38214b9ea7ee62fb48de7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1c8f863191bba6eba14ffa375f176ca3f05f2d0907cbeca2f8efcade39a77821","receiptsRoot":"0xb0864511e526165945eaf5efb38cc8b2b705d55cf210fcb629e3e43b73715474","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x47a","stateRoot":"0x0c064996832fb403576a4c4add025b94bff31df2d14746050f0387eeefc128eb","timestamp":"0x1da","transactions":["0x67a7155335c4dd6ac90c54c5173cb566946d142665369f0fa7dd3a31b5a3f4a7","0x5d0959210b1d084858519707fe8eb708347b78aa221036b11eddc27b6f9b9f6a","0x24bbc3d58e381184d7b52d73df83f5a412e507a41f622b9ba922ed2a51705270"],"transactionsRoot":"0x8c2cd1365eeebdbf28b9ba74416761d095cfd1187e1136f2ebda8e86fc65c8cd","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-twice-and-call.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-twice-and-call.io new file mode 100644 index 0000000000..e38efa6673 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-ecrecover-twice-and-call.io @@ -0,0 +1,3 @@ +// move ecrecover and try calling it, then move it again and call it +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]},{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"movePrecompileToAddress":"0x0000000000000000000000000000000000123456"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]},{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"movePrecompileToAddress":"0x0000000000000000000000000000000000123457"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123457","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xc484","hash":"0x1c8f863191bba6eba14ffa375f176ca3f05f2d0907cbeca2f8efcade39a77821","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xe7e5e1065fa5ff9117f0cb1c9dfcd1dbcfcc27d9c2bb0f28bdab3122a54fa411","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x3c8","stateRoot":"0xee4edd3bd009c2eb4f8f6f24b7e6981c2e77aba0660f4c064dff712b621d308c","timestamp":"0x1ce","transactions":["0xcf1bd2318ed0876dfcc473fdd4fbb1628c6149d26ae10651d1ba5c81b40bd343","0xce9c0063634779a5dbd101e03e78b781bd82c2c0c5b2b6a578436b6221447f90"],"transactionsRoot":"0x1cbedee6bedd859d3ba78f7be45f5920271d430ae9a3bad4adce7d4e5cf06940","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x6266","maxUsedGas":"0x6266","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x126ea","hash":"0x57f77362baa5d316d9a3d34f9d91df7a50f4c97ce5d38214b9ea7ee62fb48de7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1c8f863191bba6eba14ffa375f176ca3f05f2d0907cbeca2f8efcade39a77821","receiptsRoot":"0xb0864511e526165945eaf5efb38cc8b2b705d55cf210fcb629e3e43b73715474","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x47a","stateRoot":"0x0c064996832fb403576a4c4add025b94bff31df2d14746050f0387eeefc128eb","timestamp":"0x1da","transactions":["0x67a7155335c4dd6ac90c54c5173cb566946d142665369f0fa7dd3a31b5a3f4a7","0x5d0959210b1d084858519707fe8eb708347b78aa221036b11eddc27b6f9b9f6a","0x24bbc3d58e381184d7b52d73df83f5a412e507a41f622b9ba922ed2a51705270"],"transactionsRoot":"0x8c2cd1365eeebdbf28b9ba74416761d095cfd1187e1136f2ebda8e86fc65c8cd","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5834","maxUsedGas":"0x5834","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x6266","maxUsedGas":"0x6266","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x6266","maxUsedGas":"0x6266","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x1814c","hash":"0x9646b82741477d84110641110438c39fd4d704b8a700b2ca9e222b352dc30c68","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x57f77362baa5d316d9a3d34f9d91df7a50f4c97ce5d38214b9ea7ee62fb48de7","receiptsRoot":"0x83692e4f79390def87704bf5eb97a88a25fe8de18600086d4e810a2cc21dd45b","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x52b","stateRoot":"0xee553fbba54a7964158b7e422e372070efcd51adb34cf9174ecbea8c730f09d4","timestamp":"0x1e6","transactions":["0xdfd99dc829a092d0fc8febbcacc220ce0620cae37207c0575511ec67987424bc","0xa486f13c185a1f9c92aee1af35dd58dad58928d65b6f3a533fe5016491e1f445","0x1581796a2416a385b32e60f90d855c09f5c5ca063adfcc0df46b850cc9edec1e","0x693a6b344ae3581ff995c3a032f4c9180cc5a538ad8da5d3d88b5982ff66eb31"],"transactionsRoot":"0x502789900a5d33e6917e7c1c75bbb2a28e3a1ee134d3c18f3ebe88a29ab61605","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-to-address-itself-reference-38022.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-to-address-itself-reference-38022.io new file mode 100644 index 0000000000..eefe2cee45 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-to-address-itself-reference-38022.io @@ -0,0 +1,3 @@ +// Error: MovePrecompileToAddress referenced itself in replacement (-38022) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x30d40"},"0xc100000000000000000000000000000000000000":{"movePrecompileToAddress":"0xc100000000000000000000000000000000000000"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x1"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"account 0xc100000000000000000000000000000000000000 is not a precompile"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-two-accounts-to-same-38023.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-two-accounts-to-same-38023.io new file mode 100644 index 0000000000..ef5d47e6fe --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-two-accounts-to-same-38023.io @@ -0,0 +1,3 @@ +// Move two accounts to the same destination (-38023) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"movePrecompileToAddress":"0xc200000000000000000000000000000000000000"},"0x0000000000000000000000000000000000000002":{"movePrecompileToAddress":"0xc200000000000000000000000000000000000000"}}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-two-non-precompiles-accounts-to-same.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-two-non-precompiles-accounts-to-same.io new file mode 100644 index 0000000000..7a4ea16f1d --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-move-two-non-precompiles-accounts-to-same.io @@ -0,0 +1,3 @@ +// Move two non-precompiles to same adddress +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0x0100000000000000000000000000000000000000":{"movePrecompileToAddress":"0xc200000000000000000000000000000000000000"},"0x0200000000000000000000000000000000000000":{"movePrecompileToAddress":"0xc200000000000000000000000000000000000000"}}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"account 0x0100000000000000000000000000000000000000 is not a precompile"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-no-fields-call.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-no-fields-call.io new file mode 100644 index 0000000000..91b8c45fde --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-no-fields-call.io @@ -0,0 +1,3 @@ +// make a call with no fields +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{}]}],"traceTransfers":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xcf08","maxUsedGas":"0xcf08","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xcf08","hash":"0xa02276791c39e6662cd8019a2cbb8a075403153067431795cee1b21de5c3b048","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xc508745f9f8b6847a127bbc58b7c6b2c0f073c7ca778b6f020138f0d6d782adf","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x27e","stateRoot":"0xe475c130ff1da56c619eb0e0606662f2c8d71bbeb4e9e9988fe4dd77a46b5592","timestamp":"0x1ce","transactions":[{"blockHash":"0xa02276791c39e6662cd8019a2cbb8a075403153067431795cee1b21de5c3b048","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0x0000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xaab6995ceb3fb6183ef81e8cdaa904e2c96f3907215d19771607e47dec9f8c14","input":"0x","nonce":"0x0","to":null,"transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x1fa13b004aa237b7b76c85ee7eabebdf1185ce59372063945dd7d8b633be6a9d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-only-from-to-transaction.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-only-from-to-transaction.io new file mode 100644 index 0000000000..a4ea621918 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-only-from-to-transaction.io @@ -0,0 +1,3 @@ +// make a call with only from and to fields +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xa02dee1781ed473f5518af69d9085e9585c192d80b7c05e52ccc1bcb85376ecf","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0x13686e8b63d4a7c67e6a33cbe18053ad0d64f0cb8dc60a36cd07dbb06cc6e680","timestamp":"0x1ce","transactions":["0x234a1d9897819c206fdeb6af312d742010a91b5b4159978a902c9a0b90e7bee5"],"transactionsRoot":"0xed81b1bfe79c8c81d3fe874f7214a9fb9dd186e8243abfeabc506550a532c09a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-only-from-transaction.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-only-from-transaction.io new file mode 100644 index 0000000000..142338075c --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-only-from-transaction.io @@ -0,0 +1,3 @@ +// make a call with only from field +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xcf08","maxUsedGas":"0xcf08","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xcf08","hash":"0x3181cac8d1e2dbe04d0c1eccc795a060696b820e26a468dd21430179589d05e5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xc508745f9f8b6847a127bbc58b7c6b2c0f073c7ca778b6f020138f0d6d782adf","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x27e","stateRoot":"0x5d2cf344c6bda58ea32433d061c2ee638a9ccff938cfbf315097fc8e11a4282e","timestamp":"0x1ce","transactions":["0xaab6995ceb3fb6183ef81e8cdaa904e2c96f3907215d19771607e47dec9f8c14"],"transactionsRoot":"0x1fa13b004aa237b7b76c85ee7eabebdf1185ce59372063945dd7d8b633be6a9d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overflow-nonce-validation.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overflow-nonce-validation.io new file mode 100644 index 0000000000..eb170cadf4 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overflow-nonce-validation.io @@ -0,0 +1,3 @@ +// test to overflow nonce-validation +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"nonce":"0xffffffffffffffff"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"err: nonce has max value: address 0xC000000000000000000000000000000000000000, nonce: 18446744073709551615 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overflow-nonce.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overflow-nonce.io new file mode 100644 index 0000000000..c5f911b7b5 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overflow-nonce.io @@ -0,0 +1,3 @@ +// test to overflow nonce +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"nonce":"0xffffffffffffffff"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa410","hash":"0x17d8cd17183a8a3d02fab69bb644d8d11f27cd51eec5ba8748a9bb051e434027","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x75308898d571eafb5cd8cde8278bf5b3d13c5f6ec074926de3bb895b519264e1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c9","stateRoot":"0x13686e8b63d4a7c67e6a33cbe18053ad0d64f0cb8dc60a36cd07dbb06cc6e680","timestamp":"0x1ce","transactions":["0x477a61e1243f3b2c6a206477ecfca9f57a099a152a08fda53d8cee470d6c5fb8","0xd43781826f6cf87596228fb58a268cf2147d652bf2dc63e0e2df763efa03f709"],"transactionsRoot":"0x688f222130d7e2e8db322778c82709b89b350a0842acb53fc7e618fd3fa17955","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-address-twice-in-separate-BlockStateCalls.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-address-twice-in-separate-BlockStateCalls.io new file mode 100644 index 0000000000..f0c098fe94 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-address-twice-in-separate-BlockStateCalls.io @@ -0,0 +1,3 @@ +// override address twice in separate BlockStateCalls +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]},{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","transactionIndex":"0x0","blockHash":"0xd568b74dd9ae10031741a45a142f7dcb2625d2e31b552a6fef3a87542daef335","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xd568b74dd9ae10031741a45a142f7dcb2625d2e31b552a6fef3a87542daef335","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xb502e202e53b7160ce4bca5518a81910aa6193601fee6a25a17ee8f7ffcba2dc","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d"],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2f","transactionHash":"0x5a3d1e7294b916949bca4334586b3ef6304b2afe01abf182dabde437301a10ae","transactionIndex":"0x0","blockHash":"0x4cec6ed1c52f464bf3306a8becb6798d0d963ba305421333fce2764fd018a939","blockTimestamp":"0x1da","logIndex":"0x0","removed":false}],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0x4cec6ed1c52f464bf3306a8becb6798d0d963ba305421333fce2764fd018a939","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd568b74dd9ae10031741a45a142f7dcb2625d2e31b552a6fef3a87542daef335","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xaabaef35f9771099be2345e086577ba002c01669f572e89edefbaf200281a872","timestamp":"0x1da","transactions":["0x5a3d1e7294b916949bca4334586b3ef6304b2afe01abf182dabde437301a10ae"],"transactionsRoot":"0xb59725eea844ad560959ebeb1a5d8e138c77f3d658401988f2d28ca091280507","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-address-twice.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-address-twice.io new file mode 100644 index 0000000000..dd97a246d6 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-address-twice.io @@ -0,0 +1,3 @@ +// override address twice +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"code":"0x608060405260006042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401603990609d565b60405180910390fd5b005b600082825260208201905092915050565b7f416c7761797320726576657274696e6720636f6e747261637400000000000000600082015250565b600060896019836044565b91506092826055565b602082019050919050565b6000602082019050818103600083015260b481607e565b905091905056fea264697066735822122005cbbbc709291f66fadc17416c1b0ed4d72941840db11468a21b8e1a0362024c64736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38014,"message":"err: insufficient funds for gas * price + value: address 0xC000000000000000000000000000000000000000 have 0 want 1000 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-all-in-BlockStateCalls.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-all-in-BlockStateCalls.io new file mode 100644 index 0000000000..7d29d3719a --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-all-in-BlockStateCalls.io @@ -0,0 +1,3 @@ +// override all values in block and see that they are set in return value +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x37","time":"0x1cc","gasLimit":"0x3ec","feeRecipient":"0xc200000000000000000000000000000000000000","prevRandao":"0xc300000000000000000000000000000000000000000000000000000000000000","baseFeePerGas":"0x3ef"}}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38021,"message":"block timestamps must be in order: 460 \u003c= 558"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-block-num.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-block-num.io new file mode 100644 index 0000000000..601c7fa697 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-block-num.io @@ -0,0 +1,3 @@ +// simulates calls overriding the block num +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x2e"},"calls":[{"from":"0xc000000000000000000000000000000000000000","input":"0x4360005260206000f3"}]},{"blockOverrides":{"number":"0x2f"},"calls":[{"from":"0xc100000000000000000000000000000000000000","input":"0x4360005260206000f3"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000002e","logs":[],"gasUsed":"0xe893","maxUsedGas":"0xe893","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xe893","hash":"0x5df0e15a2a5e5616803230a2428c7309da63042da3b1dfa7ec7f94f00becebf8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x272f9721d2518637583443bb497e8fd6399c10a298960c41f6f17d2c2b3a2aa2","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x287","stateRoot":"0x358225a76e512340cad5d1e127c1f1db66fb16b6da180d7fd72298fef0bc1641","timestamp":"0x1ce","transactions":["0x03fa04bc5a2a8476e394b62c6e6aa235b8686f9a4ae6dd95c1e0911329e6aef4"],"transactionsRoot":"0xb6e8499b87fc080641e8e363bed32f711431265437c76dbe9875f94d475c51df","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000002f","logs":[],"gasUsed":"0xe893","maxUsedGas":"0xe893","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xe893","hash":"0x0c31ba2d519b14550780d1226b291de1efae3d5667765a01ecf42315ed636aa3","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5df0e15a2a5e5616803230a2428c7309da63042da3b1dfa7ec7f94f00becebf8","receiptsRoot":"0x272f9721d2518637583443bb497e8fd6399c10a298960c41f6f17d2c2b3a2aa2","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x287","stateRoot":"0x3065d625a5362aa26653f40fa7850803aff28c2c94055eb214fddcf82f587cb4","timestamp":"0x1da","transactions":["0xcc3c0d445c5435444cbe6f3d754ff89d494b5ba7672f7f66a3d1a520acce8e61"],"transactionsRoot":"0xe0383bee6b1459b6260a77b1ae8d4d102d6463635db23682bd53c7f87a1b5eb4","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-ecrecover.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-ecrecover.io new file mode 100644 index 0000000000..5efdba44e1 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-ecrecover.io @@ -0,0 +1,3 @@ +// override ecrecover +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"code":"0x608060405234801561001057600080fd5b506004361061003a5760003560e01c806305fdbc81146101ee578063c00692601461020a5761003b565b5b600036606060008060008086868101906100559190610462565b93509350935093506000806000868686866040516020016100799493929190610520565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101bb576000806212345673ffffffffffffffffffffffffffffffffffffffff166127108b8b6040516101249291906105ad565b60006040518083038160008787f1925050503d8060008114610162576040519150601f19603f3d011682016040523d82523d6000602084013e610167565b606091505b5091509150816101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a39061066f565b60405180910390fd5b809750505050505050506101e3565b806040516020016101cc9190610709565b604051602081830303815290604052955050505050505b915050805190602001f35b6102086004803603810190610203919061093a565b610226565b005b610224600480360381019061021f9190610983565b6102ec565b005b60005b81518110156102e8576102d5828281518110610248576102476109fe565b5b602002602001015160000151838381518110610267576102666109fe565b5b602002602001015160200151848481518110610286576102856109fe565b5b6020026020010151604001518585815181106102a5576102a46109fe565b5b6020026020010151606001518686815181106102c4576102c36109fe565b5b6020026020010151608001516102ec565b80806102e090610a66565b915050610229565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361035b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035290610afa565b60405180910390fd5b80600080878787876040516020016103769493929190610520565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610406816103f3565b811461041157600080fd5b50565b600081359050610423816103fd565b92915050565b600060ff82169050919050565b61043f81610429565b811461044a57600080fd5b50565b60008135905061045c81610436565b92915050565b6000806000806080858703121561047c5761047b6103e9565b5b600061048a87828801610414565b945050602061049b8782880161044d565b93505060406104ac87828801610414565b92505060606104bd87828801610414565b91505092959194509250565b6000819050919050565b6104e46104df826103f3565b6104c9565b82525050565b60008160f81b9050919050565b6000610502826104ea565b9050919050565b61051a61051582610429565b6104f7565b82525050565b600061052c82876104d3565b60208201915061053c8286610509565b60018201915061054c82856104d3565b60208201915061055c82846104d3565b60208201915081905095945050505050565b600081905092915050565b82818337600083830152505050565b6000610594838561056e565b93506105a1838584610579565b82840190509392505050565b60006105ba828486610588565b91508190509392505050565b600082825260208201905092915050565b7f6661696c656420746f2063616c6c206d6f7665642065637265636f766572206160008201527f742061646472657373203078303030303030303030303030303030303030303060208201527f3030303030303030303030303030313233343536000000000000000000000000604082015250565b60006106596054836105c6565b9150610664826105d7565b606082019050919050565b600060208201905081810360008301526106888161064c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106ba8261068f565b9050919050565b60008160601b9050919050565b60006106d9826106c1565b9050919050565b60006106eb826106ce565b9050919050565b6107036106fe826106af565b6106e0565b82525050565b600061071582846106f2565b60148201915081905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61077282610729565b810181811067ffffffffffffffff821117156107915761079061073a565b5b80604052505050565b60006107a46103df565b90506107b08282610769565b919050565b600067ffffffffffffffff8211156107d0576107cf61073a565b5b602082029050602081019050919050565b600080fd5b600080fd5b6107f4816106af565b81146107ff57600080fd5b50565b600081359050610811816107eb565b92915050565b600060a0828403121561082d5761082c6107e6565b5b61083760a061079a565b9050600061084784828501610414565b600083015250602061085b8482850161044d565b602083015250604061086f84828501610414565b604083015250606061088384828501610414565b606083015250608061089784828501610802565b60808301525092915050565b60006108b66108b1846107b5565b61079a565b90508083825260208201905060a084028301858111156108d9576108d86107e1565b5b835b8181101561090257806108ee8882610817565b84526020840193505060a0810190506108db565b5050509392505050565b600082601f83011261092157610920610724565b5b81356109318482602086016108a3565b91505092915050565b6000602082840312156109505761094f6103e9565b5b600082013567ffffffffffffffff81111561096e5761096d6103ee565b5b61097a8482850161090c565b91505092915050565b600080600080600060a0868803121561099f5761099e6103e9565b5b60006109ad88828901610414565b95505060206109be8882890161044d565b94505060406109cf88828901610414565b93505060606109e088828901610414565b92505060806109f188828901610802565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000610a7182610a5c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610aa357610aa2610a2d565b5b600182019050919050565b7f72657475726e20616464726573732063616e6e6f742062652030783000000000600082015250565b6000610ae4601c836105c6565b9150610aef82610aae565b602082019050919050565b60006020820190508181036000830152610b1381610ad7565b905091905056fea2646970667358221220154f5b68ccfa5be744e7245765a3530dac4035052284a68b5dded1945b45075e64736f6c63430008120033","movePrecompileToAddress":"0x0000000000000000000000000000000000123456"},"0xc100000000000000000000000000000000000000":{"balance":"0x30d40"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0xc00692604554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554490000000000000000000000000000000000000000000000000000000000"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0xb4fe","maxUsedGas":"0xb4fe","status":"0x1"},{"returnData":"0xd8da6bf26964af9d7eed9e03e53415d37aa96045","logs":[],"gasUsed":"0x65f8","maxUsedGas":"0x65f8","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x8052","maxUsedGas":"0x8052","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x7bf8","maxUsedGas":"0x7bf8","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x2dbc4","hash":"0x52e67e82683557c127befde7b24d3966ee3bc0bf11a9ebb8742f549c0c46d08b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x1d8af8c22f8cd24d75f4aa7448359a56b6206b7c20098b8f910eabeddd8da7f5","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x6b1","stateRoot":"0x1b662b308351d8d7c445f7e330b53475ec59e53ea031c17a5ce6c5c72cd6c86a","timestamp":"0x1ce","transactions":["0xedf77a4ff7a818e1e32ed4224d633b44fc9ea2f46454c684f341f536f00dbddd","0xaa5c34e49f0c569b197d7cd74000bb6b7a234343415c18d56948ffd1ff560178","0x37762a521271a008b7144043bd02518a9a6281dccad8388a3d60543f2994c672","0x54831ac9dccc09b40ae06c3bb299b5e85a690bd2a158d3100b43d6c96a13c4ad","0x6a3c922c15fa87899371acbdeede4b09e11403578c2dd80da095ac262cada2e3","0xe133d70cd2257ecfb5077d32c53423da6e45b20f6e5c7b803ef2295fa74268b9"],"transactionsRoot":"0xc1e6f7b2e45042bed7219ab8c25b53dc1706f7981367e771031a13b5b524c1d4","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-identity.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-identity.io new file mode 100644 index 0000000000..0ffc7d3505 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-identity.io @@ -0,0 +1,3 @@ +// override identity precompile +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0x0000000000000000000000000000000000000004":{"code":"0x","movePrecompileToAddress":"0x0000000000000000000000000000000000123456"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1234"},{"from":"0xc000000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000004","input":"0x1234"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x1234","logs":[],"gasUsed":"0x5258","maxUsedGas":"0x5258","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5258","maxUsedGas":"0x5258","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa4b0","hash":"0x81a448e5c347a0929d66bb5f5626ed53c8db99a101fffcff59c54fdb150b9899","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xd4263b4f8bc6337d6751b03db4192a544872db8beeb3be926d891e8910842eb1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c5","stateRoot":"0x5b3d05387c9d54317fece26aca8c36dbab07602a6c6c7fd9e00242d858a0be16","timestamp":"0x1ce","transactions":["0x585ff9d542135f4f16fe0728f3bdd7bf2c302ff703b50e64ecf35eb42894f7ae","0x977b45a89fc7eb6215211829ba0fccb0ea5bbcd9dd88ee0e96808ce1489f27dd"],"transactionsRoot":"0xfaf0a9a3d964a97c9e6c42d759535296437d265e0615efebe1887dbe6d09c5be","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-sha256.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-sha256.io new file mode 100644 index 0000000000..0e0d0e030f --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-sha256.io @@ -0,0 +1,3 @@ +// override sha256 precompile +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0x0000000000000000000000000000000000000002":{"code":"0x","movePrecompileToAddress":"0x0000000000000000000000000000000000123456"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1234"},{"from":"0xc000000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000002","input":"0x1234"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x3a103a4e5729ad68c02a678ae39accfbc0ae208096437401b7ceab63cca0622f","logs":[],"gasUsed":"0x5270","maxUsedGas":"0x5270","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5258","maxUsedGas":"0x5258","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa4c8","hash":"0xa9cb77604da85aac711397140907e94f1c91a51f32e94e442a168b711f0fd399","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x921be37108920799d1ddfdb00a45044f1ed75ce556b49b95e47dc17ad5a3ac30","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c5","stateRoot":"0x5b3d05387c9d54317fece26aca8c36dbab07602a6c6c7fd9e00242d858a0be16","timestamp":"0x1ce","transactions":["0x585ff9d542135f4f16fe0728f3bdd7bf2c302ff703b50e64ecf35eb42894f7ae","0x986035b499a212f917cde46f7754765f936c78b9a145c6a8cbc20dffb1ccd590"],"transactionsRoot":"0x966f4292b5a052e9afe974ec41e573ed01e8cbbc65c8f2a1a07c14425f164187","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-storage-slots.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-storage-slots.io new file mode 100644 index 0000000000..b46217d9cf --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-override-storage-slots.io @@ -0,0 +1,3 @@ +// override storage slots +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630ff4c916146100515780633033413b1461008157806344e12f871461009f5780637b8d56e3146100bd575b600080fd5b61006b600480360381019061006691906101f6565b6100d9565b6040516100789190610232565b60405180910390f35b61008961013f565b6040516100969190610232565b60405180910390f35b6100a7610145565b6040516100b49190610232565b60405180910390f35b6100d760048036038101906100d2919061024d565b61014b565b005b60006002821061011e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610115906102ea565b60405180910390fd5b6000820361012c5760005490505b6001820361013a5760015490505b919050565b60015481565b60005481565b6002821061018e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610185906102ea565b60405180910390fd5b600082036101a257806000819055506101b7565b600182036101b657806001819055506101b7565b5b5050565b600080fd5b6000819050919050565b6101d3816101c0565b81146101de57600080fd5b50565b6000813590506101f0816101ca565b92915050565b60006020828403121561020c5761020b6101bb565b5b600061021a848285016101e1565b91505092915050565b61022c816101c0565b82525050565b60006020820190506102476000830184610223565b92915050565b60008060408385031215610264576102636101bb565b5b6000610272858286016101e1565b9250506020610283858286016101e1565b9150509250929050565b600082825260208201905092915050565b7f746f6f2062696720736c6f740000000000000000000000000000000000000000600082015250565b60006102d4600c8361028d565b91506102df8261029e565b602082019050919050565b60006020820190508181036000830152610303816102c7565b905091905056fea2646970667358221220ceea194bb66b5b9f52c83e5bf5a1989255de8cb7157838eff98f970c3a04cb3064736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001"}]},{"stateOverrides":{"0xc100000000000000000000000000000000000000":{"stateDiff":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x1200000000000000000000000000000000000000000000000000000000000000"}}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001"}]},{"stateOverrides":{"0xc100000000000000000000000000000000000000":{"state":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x1200000000000000000000000000000000000000000000000000000000000000"}}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001"}]}],"traceTransfers":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xac5e","maxUsedGas":"0xac5e","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0xac81","maxUsedGas":"0xac81","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000001","logs":[],"gasUsed":"0x5d85","maxUsedGas":"0x5d85","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000002","logs":[],"gasUsed":"0x5d91","maxUsedGas":"0x5d91","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x213f5","hash":"0xb0847d208be75ff71bf4f4558ec8f280a708a0d9ccfb3c77f8439d2e91b2887e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x04d3a0b5a27adba7e4ab427e47586257cf7f9391455686a8e5de02d6369fe729","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x3f9","stateRoot":"0xba0c713d06a0d617712e28de90c3d0ff17a3ce5e90b1451c864a64a780ad26bd","timestamp":"0x1ce","transactions":[{"blockHash":"0xb0847d208be75ff71bf4f4558ec8f280a708a0d9ccfb3c77f8439d2e91b2887e","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x59bf9b0327340e44f86849c3b2020559d4567410efc30030c708202ccb78f677","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xb0847d208be75ff71bf4f4558ec8f280a708a0d9ccfb3c77f8439d2e91b2887e","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2fa4422","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xe31ee6882d314903e7ff23726e5c90731af6531a54dbc327cc3cedd1a031837f","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002","nonce":"0x1","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xb0847d208be75ff71bf4f4558ec8f280a708a0d9ccfb3c77f8439d2e91b2887e","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2f997a1","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xee53c20604e25066c0a8bd533e9fbac7ab0c37a81852f58de5bf335b27324de7","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000","nonce":"0x2","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xb0847d208be75ff71bf4f4558ec8f280a708a0d9ccfb3c77f8439d2e91b2887e","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2f93a1c","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xca745694b08804be88f48ec7657ead992b8ff844cfe176925f42cdc335af7690","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001","nonce":"0x3","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x3","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x230cb1e46119630e223c03c9466d894e091fedade7c70963742901ee95fe4c0b","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x1200000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5d85","maxUsedGas":"0x5d85","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000002","logs":[],"gasUsed":"0x5d91","maxUsedGas":"0x5d91","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xbb16","hash":"0x0613545ce0fac79bd5d12e8cac51dedcef496406f354c515291920c7866d622e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb0847d208be75ff71bf4f4558ec8f280a708a0d9ccfb3c77f8439d2e91b2887e","receiptsRoot":"0xbb2a8473e55a4e9ae2ac7201f52b44253a3bd950e553ea82694f338087d2a2d3","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30d","stateRoot":"0xfe84daeffeb392d9f227f98152d95bd6d27643af87e741fa85bef7ac1c86ecba","timestamp":"0x1da","transactions":[{"blockHash":"0x0613545ce0fac79bd5d12e8cac51dedcef496406f354c515291920c7866d622e","blockNumber":"0x2f","blockTimestamp":"0x1da","from":"0xc000000000000000000000000000000000000000","gas":"0x2f8dc8b","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x163779f68fa214fa1b1fdc8340f741a0af7160cc3aad80fea6ebcad3917728c0","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000","nonce":"0x4","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x0613545ce0fac79bd5d12e8cac51dedcef496406f354c515291920c7866d622e","blockNumber":"0x2f","blockTimestamp":"0x1da","from":"0xc000000000000000000000000000000000000000","gas":"0x2f87f06","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x3fc70d519865cbdf5198e19949f30057802c4f6eed83d46c62bf543a1d2f045d","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001","nonce":"0x5","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x70b3072a6191ba2fd31bd29a9af7db527a3b683b3a7275d6dcde52a49ab94fc5","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x1200000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5d85","maxUsedGas":"0x5d85","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5d91","maxUsedGas":"0x5d91","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xbb16","hash":"0xfce8719402d9c1f7429e10c83fa79252fec85bb28d9f3afb2d055eb52905180c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0613545ce0fac79bd5d12e8cac51dedcef496406f354c515291920c7866d622e","receiptsRoot":"0xbb2a8473e55a4e9ae2ac7201f52b44253a3bd950e553ea82694f338087d2a2d3","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30d","stateRoot":"0x09553723f9270e7776083598fd04a6968c6abbe268b9ce1f14ac73d8700c141b","timestamp":"0x1e6","transactions":[{"blockHash":"0xfce8719402d9c1f7429e10c83fa79252fec85bb28d9f3afb2d055eb52905180c","blockNumber":"0x30","blockTimestamp":"0x1e6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f82175","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xed91410cdcd641090365fe30cdc58f16411d677aade4adefe88173f85ace3f1e","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000","nonce":"0x6","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xfce8719402d9c1f7429e10c83fa79252fec85bb28d9f3afb2d055eb52905180c","blockNumber":"0x30","blockTimestamp":"0x1e6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f7c3f0","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x81399a009d1431a2930964a644b5dc933327855251e4bd3ea863918ed179ba74","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001","nonce":"0x7","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x88f833b3d75b7e7fc98ec1cdd5032ce6a339d795283fbe2060100072def32eb3","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overwrite-existing-contract.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overwrite-existing-contract.io new file mode 100644 index 0000000000..f66b230cc9 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-overwrite-existing-contract.io @@ -0,0 +1,3 @@ +// overwrites existing contract with new contract +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000031ec7","input":"0xa9059cbb0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000a"}]},{"stateOverrides":{"0x0000000000000000000000000000000000031ec7":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000031ec7","input":"0xa9059cbb0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000a"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5564","maxUsedGas":"0x5564","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5564","hash":"0xb5007b5f67f34d49615428b555c82ec50f9bca65ec221807ac9705579727d9ab","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xb22722bd6c57f300c573c6ab3dd1ba778c14752faa49cf44f153d39b394b4500","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2da","stateRoot":"0x13686e8b63d4a7c67e6a33cbe18053ad0d64f0cb8dc60a36cd07dbb06cc6e680","timestamp":"0x1ce","transactions":["0x3280b9ad0a9859c47b1fa76de3e24e73f2d3f4a66330f2501ac09092eff7eb1d"],"transactionsRoot":"0xbef7c2281127af88451a4109430bfef9c388028f1b1fd9b375676323031880c0","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c72dd9d5e883e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047e7c40000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000001da0000000000000000000000000000000000000000000000000000000002fa477a0000000000000000000000000000000000000000000000000000000000000000b5007b5f67f34d49615428b555c82ec50f9bca65ec221807ac9705579727d9ab","logs":[],"gasUsed":"0x5914","maxUsedGas":"0x5914","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5914","hash":"0x46be361aee054365eeb9f5028669e9d8d0c7ab147ddb809d4be4416e5a1a8403","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb5007b5f67f34d49615428b555c82ec50f9bca65ec221807ac9705579727d9ab","receiptsRoot":"0x135a287d95f5563462f3b034debbc0fd3f71a5816b49ad9d46e053b366de0f75","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2da","stateRoot":"0x25a3b749bb4b768b7024be7b73e3a6180f8dec56bb4d9b6d32f922cc58bd9ae4","timestamp":"0x1da","transactions":["0xce9246c6df06b19cc1d43f03d0442c02871853c20d7c8367d6bb1c03385785c3"],"transactionsRoot":"0xbe029ec4cc7f84a7f5e24f9a01c89c3a08bebe69b00788e638e1bd786fd1a680","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-precompile-is-sending-transaction.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-precompile-is-sending-transaction.io new file mode 100644 index 0000000000..13809ede1f --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-precompile-is-sending-transaction.io @@ -0,0 +1,3 @@ +// send transaction from a precompile +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0x0000000000000000000000000000000000000004","to":"0x0000000000000000000000000000000000000002","input":"0x1234"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x3a103a4e5729ad68c02a678ae39accfbc0ae208096437401b7ceab63cca0622f","logs":[],"gasUsed":"0x5270","maxUsedGas":"0x5270","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5270","hash":"0x92dc3fd0b575d48f815030e6289d0736cc1ef2e7ce84cd7847aa68d0058c9b5b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xd6049c50ce5e85aa419ac8865b260d9756c7bdece9a8110377c8527dde5e62de","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xce6137ad9fe34be79d56e51838183986daa5d1928a49240244f30e93348bfbbd","timestamp":"0x1ce","transactions":["0x7f497e3a61ff8fcc36a09e3ad36c94349ff9ccb9818177571a8ed89df8cae980"],"transactionsRoot":"0xaba41f3c118ea976c7202226288faefc0174b4472749e026309f6f98dca7dd0c","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-run-gas-spending.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-run-gas-spending.io new file mode 100644 index 0000000000..2f15066218 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-run-gas-spending.io @@ -0,0 +1,3 @@ +// spend a lot gas in separate blocks +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"gasLimit":"0x16e360"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063815b8ab414610030575b600080fd5b61004a600480360381019061004591906100b6565b61004c565b005b60005a90505b60011561007657815a826100669190610112565b106100715750610078565b610052565b505b50565b600080fd5b6000819050919050565b61009381610080565b811461009e57600080fd5b50565b6000813590506100b08161008a565b92915050565b6000602082840312156100cc576100cb61007b565b5b60006100da848285016100a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061011d82610080565b915061012883610080565b92508282039050818111156101405761013f6100e3565b5b9291505056fea2646970667358221220a659ba4db729a6ee4db02fcc5c1118db53246b0e5e686534fc9add6f2e93faec64736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab40000000000000000000000000000000000000000000000000000000000000000"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab40000000000000000000000000000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab400000000000000000000000000000000000000000000000000000000000f4240"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab40000000000000000000000000000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab400000000000000000000000000000000000000000000000000000000000f4240"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5545","maxUsedGas":"0x5545","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x16e360","gasUsed":"0x5545","hash":"0xc0e422f2740b5b3b9d8fdc64d75337b3e06f365ed42490af259e7b4c3b3a963d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xfecfac291a1f0f4fd2b7b3625942d53077dc241c302619b8d23ceb4dfdaa65ab","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b7","stateRoot":"0x8cd3af182b7c74ae96dc2ce7d219ccd8cdb0efe1f09c7812f71dbec453458c97","timestamp":"0x1ce","transactions":["0xeee5b06a0cbade5ba2e8026e28547646a6fdbf46a26ee6b35d4b6d7348a032b3"],"transactionsRoot":"0xcb8bae5efcd6a4a06b788279d02c1919cdf9ff19c79a159b6869f0742f952a78","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5545","maxUsedGas":"0x5545","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0xf983f","maxUsedGas":"0xf983f","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x16e360","gasUsed":"0xfed84","hash":"0x9e795c69320dbe20aa91ac2f9f8d36980ebf39938e100a228962c574e2baf023","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc0e422f2740b5b3b9d8fdc64d75337b3e06f365ed42490af259e7b4c3b3a963d","receiptsRoot":"0x988bbfca68bd95ead7343b0bee646d64c2f71924e7906ca85a1d3d8b6a8ddd89","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30b","stateRoot":"0x810a93963fe16ade03c17f1b3640d61080284a825bef84c86123e9909bded770","timestamp":"0x1da","transactions":["0x3988125f3d82c08622964f81fe4296e4a4a3cf397a15abb3e26071883ce023e2","0x49e4b43e34f2c3dffab911e75bc357d4f05c0bb4476736ea948afa744acfd190"],"transactionsRoot":"0x41016673bb3dead778440012273958df153ce37130d5c654d0219847174b5172","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5545","maxUsedGas":"0x5545","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0xf983f","maxUsedGas":"0xf983f","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x16e360","gasUsed":"0xfed84","hash":"0x0cd479552aa51e026dcaf216fd10b7e3ac4f6683798f7ab99d676ccbfbb9f826","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9e795c69320dbe20aa91ac2f9f8d36980ebf39938e100a228962c574e2baf023","receiptsRoot":"0x988bbfca68bd95ead7343b0bee646d64c2f71924e7906ca85a1d3d8b6a8ddd89","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30b","stateRoot":"0x083e38e4eea0ffe0427a67539f15f4ec8332a40fc6f1abede3c8ae1a9d52b423","timestamp":"0x1e6","transactions":["0x5096d3bfcf33b71a3b7b5bbd5dcc62645ec007938ebac047dd0ea01750dce232","0xb88f3e2c3697c1c5049a49e531099b9eac18d47c17c222fe8c407b1b7daef929"],"transactionsRoot":"0x286828e26e06a7d570e1a7c078f0f34d450ce239eb138d34c924f07bd69cb9d0","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-run-out-of-gas-in-block-38015.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-run-out-of-gas-in-block-38015.io new file mode 100644 index 0000000000..d16588e97c --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-run-out-of-gas-in-block-38015.io @@ -0,0 +1,3 @@ +// we should get out of gas error if a block consumes too much gas (-38015) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"gasLimit":"0x16e360"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063815b8ab414610030575b600080fd5b61004a600480360381019061004591906100b6565b61004c565b005b60005a90505b60011561007657815a826100669190610112565b106100715750610078565b610052565b505b50565b600080fd5b6000819050919050565b61009381610080565b811461009e57600080fd5b50565b6000813590506100b08161008a565b92915050565b6000602082840312156100cc576100cb61007b565b5b60006100da848285016100a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061011d82610080565b915061012883610080565b92508282039050818111156101405761013f6100e3565b5b9291505056fea2646970667358221220a659ba4db729a6ee4db02fcc5c1118db53246b0e5e686534fc9add6f2e93faec64736f6c63430008120033"}}},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab400000000000000000000000000000000000000000000000000000000000f4240"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x815b8ab400000000000000000000000000000000000000000000000000000000000f4240"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x16e360","gasUsed":"0x0","hash":"0xc3d0be9b772c1a4a209c91b86dfe1171a6b7ba7f3e613017d36139ad34f616f1","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x261","stateRoot":"0x46c62b18a1070b51926b280f9029b771c6adec58735d2a37dc799e75ab1f8274","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xf983f","maxUsedGas":"0xf983f","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x74b21","maxUsedGas":"0x74b21","status":"0x0","error":{"message":"out of gas","code":-32015}}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x16e360","gasUsed":"0x16e360","hash":"0x1a51b2f283dcf94e68717f6492c0e279a9c1e173676232e72ca75593a028219c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xc3d0be9b772c1a4a209c91b86dfe1171a6b7ba7f3e613017d36139ad34f616f1","receiptsRoot":"0xde8fb4841c98c24eca61ebcf6e28621506da5add36752582b8e6c40a4080aacd","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30b","stateRoot":"0xd0579701a4e1935b9e0830e2421a453d17dcd2b4ef58333e3e5097629b857217","timestamp":"0x1da","transactions":["0x02332c506791156b28c7f5682a9e07ffe9600ee55cc411ee62c6f1344ceec51c","0xe25438525e88d23b473ea69cc32a0001516836befab3cf98205fcbb3688bcb1f"],"transactionsRoot":"0x27e68fcd6bd3ca51f05221398f894cc6da401597166560b08025ad663caaeae2","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-self-destructing-state-override.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-self-destructing-state-override.io new file mode 100644 index 0000000000..82ec0f0758 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-self-destructing-state-override.io @@ -0,0 +1,3 @@ +// when selfdestructing a state override, the state override should go away +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033"},"0xc300000000000000000000000000000000000000":{"code":"0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063dce4a4471461003a575b600080fd5b610054600480360381019061004f91906100f8565b61006a565b60405161006191906101b5565b60405180910390f35b6060813b6040519150601f19601f602083010116820160405280825280600060208401853c50919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100c58261009a565b9050919050565b6100d5816100ba565b81146100e057600080fd5b50565b6000813590506100f2816100cc565b92915050565b60006020828403121561010e5761010d610095565b5b600061011c848285016100e3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561015f578082015181840152602081019050610144565b60008484015250505050565b6000601f19601f8301169050919050565b600061018782610125565b6101918185610130565b93506101a1818560208601610141565b6101aa8161016b565b840191505092915050565b600060208201905081810360008301526101cf818461017c565b90509291505056fea26469706673582212206a5f0cd9f230619fa520fc4b9d4b518643258cad412f2fa33945ce528b4b895164736f6c63430008120033"}}},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc300000000000000000000000000000000000000","input":"0xdce4a447000000000000000000000000c200000000000000000000000000000000000000"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x83197ef0"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc300000000000000000000000000000000000000","input":"0xdce4a447000000000000000000000000c200000000000000000000000000000000000000"}]},{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033"}}},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc300000000000000000000000000000000000000","input":"0xdce4a447000000000000000000000000c200000000000000000000000000000000000000"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xb9e10196e927656651630e37791bec8738b795281ef805f287d56b837f938705","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x0e5eaa61213087edf0f09983b3deedb336b736b00dcf6d3787acff18252ca57e","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000856080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x62c0","maxUsedGas":"0x62c0","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x62c0","hash":"0x9d41e491006b843831524a2541074dd7ccb00e9af1e4c9847f38da0e3f841c34","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xb9e10196e927656651630e37791bec8738b795281ef805f287d56b837f938705","receiptsRoot":"0x2daac3b758b867b7648cea8349af380bd28e8adede8d9b42a0a7bcf150ae9d9e","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x5b4af7aafe158f2f0c7124840cac33ea71be4e983de8452689a2306da3dab07b","timestamp":"0x1da","transactions":["0x0affb3ab0c18491b058cc2a3fe834bf2b4b37a04ec18471eb3365811eb026729"],"transactionsRoot":"0xca9f7a139a472f8e0200a80998c7f8fef5a3445ddb817394283a992fa3f185ab","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x664a","maxUsedGas":"0x664a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x664a","hash":"0x78dce5e3e105352a40e1e9b5faed01ed6201358cd71e9502d905be9d0a80c5ce","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9d41e491006b843831524a2541074dd7ccb00e9af1e4c9847f38da0e3f841c34","receiptsRoot":"0xe53cac8ba7c4639309c7959eb884c607e179624f118940ac558ff2cdbf4df3aa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x296","stateRoot":"0xc8198beb6b0e6eb3a5dc77545992a4abf0541d66e78fb7da86e57ba773f9e891","timestamp":"0x1e6","transactions":["0x7f5440a59455b300515f9552d9ac922e80e1c04002af27ccc1c2e059d11d3e28"],"transactionsRoot":"0xdf373e2e2df9cb2f4f4b6349e5f2025927bef109f7feca88bcaf4d1834a63d94","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000856080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x62c0","maxUsedGas":"0x62c0","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x62c0","hash":"0x08bbe1959d225dc7a19df974d4e8fcc72faf05cd543672c0a40ebc38b4c80eac","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x78dce5e3e105352a40e1e9b5faed01ed6201358cd71e9502d905be9d0a80c5ce","receiptsRoot":"0x2daac3b758b867b7648cea8349af380bd28e8adede8d9b42a0a7bcf150ae9d9e","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x0870c44a0817bd40d32e895b75f475706b5e61990229c0ed40435a59e175e917","timestamp":"0x1f2","transactions":["0xd0f9eeb20ddc1721aeef6191b9560bb06f8ab4963a22ef75cdcd7b0aa33f5856"],"transactionsRoot":"0x246cedb2c426782102f89161ce5b0d7b308347529029381ed09815c20fed4292","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x91b4edae528f9928842b54ba54e9906f53115d50c555607c5d3f142c4600981e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x08bbe1959d225dc7a19df974d4e8fcc72faf05cd543672c0a40ebc38b4c80eac","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x4028ccdc0bd692d233008937639a4ee34bc264c427fd2e34be1ed6310b2d292c","timestamp":"0x1fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000856080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x62c0","maxUsedGas":"0x62c0","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x62c0","hash":"0x4db544f0f7ee3f73a13b51fd0ac42040c8158d71dc230cecf478b3dedbe66451","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x91b4edae528f9928842b54ba54e9906f53115d50c555607c5d3f142c4600981e","receiptsRoot":"0x2daac3b758b867b7648cea8349af380bd28e8adede8d9b42a0a7bcf150ae9d9e","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2b9","stateRoot":"0x6e45b5b18c2b3053131c89d2cc133773347ce27a9ea449100712749290e23563","timestamp":"0x20a","transactions":["0xb853dbf19ca040ed91fa474961197cdd5a0fb6fcb91923cf86385348d8caa75e"],"transactionsRoot":"0xf03c3cb5aa0636553f8fe7f0b35da5d7e7e77d1cb68847c8dd9654787978828b","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-self-destructive-contract-produces-logs.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-self-destructive-contract-produces-logs.io new file mode 100644 index 0000000000..ef1489fe9d --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-self-destructive-contract-produces-logs.io @@ -0,0 +1,3 @@ +// self destructive contract produces logs +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033","balance":"0x1e8480"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x83197ef0"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c200000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000001e8480","blockNumber":"0x2e","transactionHash":"0x601cd1b2f9161ebf790d5a555cdcf9620763b8d75469d8ca58432bcf6f1b6e23","transactionIndex":"0x0","blockHash":"0xa69fb01427760dfee11e9bcab83cb43c0bc3af3d2509bb24116e4c2077a64e2a","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x664a","maxUsedGas":"0x664a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x664a","hash":"0xa69fb01427760dfee11e9bcab83cb43c0bc3af3d2509bb24116e4c2077a64e2a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xe53cac8ba7c4639309c7959eb884c607e179624f118940ac558ff2cdbf4df3aa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x296","stateRoot":"0x5827d0c83b4c0eb865ea33d3da8778c4c3701ffd377cf01df654257d90005741","timestamp":"0x1ce","transactions":["0x601cd1b2f9161ebf790d5a555cdcf9620763b8d75469d8ca58432bcf6f1b6e23"],"transactionsRoot":"0xd9f6c56fb68a52f5583f9be950cb93274e6c4c1714fb47a25c8d003b5fd577fb","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call-to-eoa.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call-to-eoa.io new file mode 100644 index 0000000000..72f6f04e6a --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call-to-eoa.io @@ -0,0 +1,3 @@ +// sending eth and delegate calling a eoa should only produce one log +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405273ffffffffffffffffffffffffffffffffffffffff73c200000000000000000000000000000000000000167fa619486e000000000000000000000000000000000000000000000000000000005f3503605e57805f5260205ff35b365f80375f80365f845af43d5f803e5f81036077573d5ffd5b3d5ff3fea26469706673582212206b787fe3e60b14a5c449d37005afac7b1803ee7c87e12d2740b96a158f34802a64736f6c63430008160033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","transactionIndex":"0x0","blockHash":"0x574d39aec2e1ee68064eb51a9da5441ee259ddb09a9de0d12b1e7113fa9fd280","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x5ca0","maxUsedGas":"0x5ca0","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5ca0","hash":"0x574d39aec2e1ee68064eb51a9da5441ee259ddb09a9de0d12b1e7113fa9fd280","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xbdd8e6637191b852715bd7c3c3e6bc98e9d2df8f696606f17cc80393ccd17837","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0x3e205e9659e66dd750961c7eae3fb9d9dbf1cb9c05018d66817b5b0cd3317c74","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d"],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call-to-payble-contract.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call-to-payble-contract.io new file mode 100644 index 0000000000..b3c36a3234 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call-to-payble-contract.io @@ -0,0 +1,3 @@ +// sending eth and delegate calling a payable contract should only produce one log +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405273ffffffffffffffffffffffffffffffffffffffff73c200000000000000000000000000000000000000167fa619486e000000000000000000000000000000000000000000000000000000005f3503605e57805f5260205ff35b365f80375f80365f845af43d5f803e5f81036077573d5ffd5b3d5ff3fea26469706673582212206b787fe3e60b14a5c449d37005afac7b1803ee7c87e12d2740b96a158f34802a64736f6c63430008160033"},"0xc200000000000000000000000000000000000000":{"code":"0x60806040525f366060915050805190602001f3fea2646970667358221220a6fbca1301e2861ff1227c7478f4351a0978cca210732aaf5d036123a0d2f68664736f6c63430008160033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","transactionIndex":"0x0","blockHash":"0x73b0430b38e222140652e3d84fb2ab6e073350a6b07d46c25fc241097eef8411","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x5cd2","maxUsedGas":"0x5cd2","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5cd2","hash":"0x73b0430b38e222140652e3d84fb2ab6e073350a6b07d46c25fc241097eef8411","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xb58970d533a21cc92bd172f330ce93767aade1f6388829d569cc7c96cb3c0c01","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xff13d5fe0fb3d7355b972a715a51b9a330d923da2649b79af2618e06b4ceff6d","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d"],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call.io new file mode 100644 index 0000000000..77fbfa4e50 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-send-eth-and-delegate-call.io @@ -0,0 +1,3 @@ +// sending eth and delegate calling should only produce one log +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1e8480"},"0xc100000000000000000000000000000000000000":{"code":"0x60806040526004361061001d575f3560e01c80635c19a95c14610021575b5f80fd5b61003b6004803603810190610036919061011d565b610052565b6040516100499291906101ec565b60405180910390f35b5f60608273ffffffffffffffffffffffffffffffffffffffff1660405161007890610247565b5f60405180830381855af49150503d805f81146100b0576040519150601f19603f3d011682016040523d82523d5f602084013e6100b5565b606091505b5091509150915091565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ec826100c3565b9050919050565b6100fc816100e2565b8114610106575f80fd5b50565b5f81359050610117816100f3565b92915050565b5f60208284031215610132576101316100bf565b5b5f61013f84828501610109565b91505092915050565b5f8115159050919050565b61015c81610148565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561019957808201518184015260208101905061017e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6101be82610162565b6101c8818561016c565b93506101d881856020860161017c565b6101e1816101a4565b840191505092915050565b5f6040820190506101ff5f830185610153565b818103602083015261021181846101b4565b90509392505050565b5f81905092915050565b50565b5f6102325f8361021a565b915061023d82610224565b5f82019050919050565b5f61025182610227565b915081905091905056fea2646970667358221220c79623409cf56de66f689f36463cb9aa88ed853501e557889625b16b1a602b2764736f6c63430008160033"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0x3ac519845f15d5a0b5a87eaa2d3141b73972ce4a556f67c5f0a7ed4f05a55a43","transactionIndex":"0x0","blockHash":"0xf6c3b02217036186e452a1cac27c1ff33fdb7269bbb4b2bfe05ec2605989da4c","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x61fe","maxUsedGas":"0x61fe","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x61fe","hash":"0xf6c3b02217036186e452a1cac27c1ff33fdb7269bbb4b2bfe05ec2605989da4c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x3e3e6e5b7b740d3fc4d6237faf7808ff487855b2512263b96d0c0895356ba195","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0x060ac072ffd38b22a14dc2b83df540d2e95c6f2133db87eae4ccba10c69ef965","timestamp":"0x1ce","transactions":["0x3ac519845f15d5a0b5a87eaa2d3141b73972ce4a556f67c5f0a7ed4f05a55a43"],"transactionsRoot":"0x07ae8f1503764c4548f258e0d73e49b356b8d8c66d5bd581c6b1cb3349f696e7","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-set-read-storage.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-set-read-storage.io new file mode 100644 index 0000000000..519fb5c6c3 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-set-read-storage.io @@ -0,0 +1,3 @@ +// simulates calls setting and reading from storage contract +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100d9565b60405180910390f35b610073600480360381019061006e919061009d565b61007e565b005b60008054905090565b8060008190555050565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea2646970667358221220404e37f487a89a932dca5e77faaf6ca2de3b991f93d230604b1b8daaef64766264736f6c63430008070033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x6057361d0000000000000000000000000000000000000000000000000000000000000005"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x2e64cec1"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xaacc","maxUsedGas":"0xaacc","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000005","logs":[],"gasUsed":"0x5bb7","maxUsedGas":"0x5bb7","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x10683","hash":"0xfa5eeb7678b73b2279140df9f725e31d8b1fe5cb2ab2222b5c24279224f1006c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x697ac2662c8fbfe62b7bbd866618c7efad9cc044e66da184d2b29330cef91dc8","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2ec","stateRoot":"0xb984833061a30121d676bebfcf88b0f45a1d1e44c5df0e73e062425c68ef76a3","timestamp":"0x1ce","transactions":["0x0c316124563c91479e019be7b012995015f22f6a150c1f42a78bc25e12cd00f7","0x5e33cfd9b2db6b1ddd99c8cb323858b3844afd154d229233167378f507998721"],"transactionsRoot":"0xc3dc8ec8eece695a22e6d38b1ad40f633ee8f96ec5684741f684fbacc170b9b8","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-more-params-validate.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-more-params-validate.io new file mode 100644 index 0000000000..e2c35156a6 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-more-params-validate.io @@ -0,0 +1,3 @@ +// simulates a simple do-nothing transaction with more fields set +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0x0"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x334500"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x52080","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","maxFeePerBlobGas":"0x0","value":"0x0","nonce":"0x0","input":"0x"}]}],"validation":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xa3a3d70ae2c417b80811d448cc6c2a27b5b0151fb93de5fa3dfa16303a70e2f8","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x291","stateRoot":"0xa71c9323ee8ea101844ff13303d5a75dda6be0900d6bd6771695822747822e93","timestamp":"0x1ce","transactions":[{"blockHash":"0xa3a3d70ae2c417b80811d448cc6c2a27b5b0151fb93de5fa3dfa16303a70e2f8","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x52080","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xc47b561911853c4423198465f9b845f6729cab26a5c64cc8bd75fdbfb8739a75","input":"0x","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0xde9fa8090280362f587efae3cfa656f60585b18b0a548b2e802a7ac9c0869b5b","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-balance-querying.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-balance-querying.io new file mode 100644 index 0000000000..93789da085 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-balance-querying.io @@ -0,0 +1,3 @@ +// simulates a simple ethSimulate transfer when account has no funds with querying balances before and after +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8b2cb4f14610030575b600080fd5b61004a600480360381019061004591906100e4565b610060565b604051610057919061012a565b60405180910390f35b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100b182610086565b9050919050565b6100c1816100a6565b81146100cc57600080fd5b50565b6000813590506100de816100b8565b92915050565b6000602082840312156100fa576100f9610081565b5b6000610108848285016100cf565b91505092915050565b6000819050919050565b61012481610111565b82525050565b600060208201905061013f600083018461011b565b9291505056fea2646970667358221220172c443a163d8a43e018c339d1b749c312c94b6de22835953d960985daf228c764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c100000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c100000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xf8b2cb4f000000000000000000000000c100000000000000000000000000000000000000"}]}],"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38014,"message":"err: insufficient funds for gas * price + value: address 0xC000000000000000000000000000000000000000 have 0 want 1000 (supplied gas 49953622)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-validation-without-nonces.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-validation-without-nonces.io new file mode 100644 index 0000000000..7dabc88d05 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-validation-without-nonces.io @@ -0,0 +1,3 @@ +// simulates a simple ethSimulate transfer when account has no funds with validation. This should fail as the nonce is not set for the second transaction. +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","nonce":"0x0"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"err: max fee per gas less than block base fee: address 0xC000000000000000000000000000000000000000, maxFeePerGas: 0, baseFee: 80286026 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-validation.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-validation.io new file mode 100644 index 0000000000..3b447574f4 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds-with-validation.io @@ -0,0 +1,3 @@ +// simulates a simple ethSimulate transfer when account has no funds with validation +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","nonce":"0x0"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8","nonce":"0x1"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"err: max fee per gas less than block base fee: address 0xC000000000000000000000000000000000000000, maxFeePerGas: 0, baseFee: 80286026 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds.io new file mode 100644 index 0000000000..6ccace6a3a --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-no-funds.io @@ -0,0 +1,3 @@ +// simulates a simple ethSimulate transfer when account has no funds +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38014,"message":"err: insufficient funds for gas * price + value: address 0xC000000000000000000000000000000000000000 have 0 want 1000 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract-no-balance.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract-no-balance.io new file mode 100644 index 0000000000..989b4926d8 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract-no-balance.io @@ -0,0 +1,3 @@ +// Sending eth from contract without balance +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"code":"0x60806040526004361061001e5760003560e01c80634b64e49214610023575b600080fd5b61003d6004803603810190610038919061011f565b61003f565b005b60008173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050509050806100b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100af906101a9565b60405180910390fd5b5050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100ec826100c1565b9050919050565b6100fc816100e1565b811461010757600080fd5b50565b600081359050610119816100f3565b92915050565b600060208284031215610135576101346100bc565b5b60006101438482850161010a565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061019360148361014c565b915061019e8261015d565b602082019050919050565b600060208201905081810360008301526101c281610186565b905091905056fea2646970667358221220563acd6f5b8ad06a3faf5c27fddd0ecbc198408b99290ce50d15c2cf7043694964736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-38014,"message":"err: insufficient funds for gas * price + value: address 0xC000000000000000000000000000000000000000 have 0 want 1000 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract-with-validation.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract-with-validation.io new file mode 100644 index 0000000000..d5f5a24538 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract-with-validation.io @@ -0,0 +1,3 @@ +// Sending eth from contract with validation enabled +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"code":"0x60806040526004361061001e5760003560e01c80634b64e49214610023575b600080fd5b61003d6004803603810190610038919061011f565b61003f565b005b60008173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050509050806100b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100af906101a9565b60405180910390fd5b5050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100ec826100c1565b9050919050565b6100fc816100e1565b811461010757600080fd5b50565b600081359050610119816100f3565b92915050565b600060208284031215610135576101346100bc565b5b60006101438482850161010a565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061019360148361014c565b915061019e8261015d565b602082019050919050565b600060208201905081810360008301526101c281610186565b905091905056fea2646970667358221220563acd6f5b8ad06a3faf5c27fddd0ecbc198408b99290ce50d15c2cf7043694964736f6c63430008120033","balance":"0x3e8"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true,"validation":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"err: max fee per gas less than block base fee: address 0xC000000000000000000000000000000000000000, maxFeePerGas: 0, baseFee: 80286026 (supplied gas 50000000)"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract.io new file mode 100644 index 0000000000..20139ff9dc --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-send-from-contract.io @@ -0,0 +1,3 @@ +// Sending eth from contract +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"code":"0x60806040526004361061001e5760003560e01c80634b64e49214610023575b600080fd5b61003d6004803603810190610038919061011f565b61003f565b005b60008173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050509050806100b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100af906101a9565b60405180910390fd5b5050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100ec826100c1565b9050919050565b6100fc816100e1565b811461010757600080fd5b50565b600081359050610119816100f3565b92915050565b600060208284031215610135576101346100bc565b5b60006101438482850161010a565b91505092915050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061019360148361014c565b915061019e8261015d565b602082019050919050565b600060208201905081810360008301526101c281610186565b905091905056fea2646970667358221220563acd6f5b8ad06a3faf5c27fddd0ecbc198408b99290ce50d15c2cf7043694964736f6c63430008120033","balance":"0x3e8"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"}]}],"traceTransfers":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x2e","transactionHash":"0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","transactionIndex":"0x0","blockHash":"0xce84cb5045a5f7d65e35bb92e10cbf5fa3d959994a8f4dc9bd0d6a44522af799","blockTimestamp":"0x1ce","logIndex":"0x0","removed":false}],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xce84cb5045a5f7d65e35bb92e10cbf5fa3d959994a8f4dc9bd0d6a44522af799","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x294","stateRoot":"0xd3920f396a9fb79010fb955d21d00139aedca22e07d0de4c43f2a75d2ce47ee4","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d"],"transactionsRoot":"0x153033b7bf79591032a757961da3656789d4bf0873801108ff81449dfe8df202","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-state-diff.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-state-diff.io new file mode 100644 index 0000000000..2f6536a6f1 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-state-diff.io @@ -0,0 +1,3 @@ +// override one state variable with state +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x7d0"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630ff4c916146100515780633033413b1461008157806344e12f871461009f5780637b8d56e3146100bd575b600080fd5b61006b600480360381019061006691906101f6565b6100d9565b6040516100789190610232565b60405180910390f35b61008961013f565b6040516100969190610232565b60405180910390f35b6100a7610145565b6040516100b49190610232565b60405180910390f35b6100d760048036038101906100d2919061024d565b61014b565b005b60006002821061011e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610115906102ea565b60405180910390fd5b6000820361012c5760005490505b6001820361013a5760015490505b919050565b60015481565b60005481565b6002821061018e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610185906102ea565b60405180910390fd5b600082036101a257806000819055506101b7565b600182036101b657806001819055506101b7565b5b5050565b600080fd5b6000819050919050565b6101d3816101c0565b81146101de57600080fd5b50565b6000813590506101f0816101ca565b92915050565b60006020828403121561020c5761020b6101bb565b5b600061021a848285016101e1565b91505092915050565b61022c816101c0565b82525050565b60006020820190506102476000830184610223565b92915050565b60008060408385031215610264576102636101bb565b5b6000610272858286016101e1565b9250506020610283858286016101e1565b9150509250929050565b600082825260208201905092915050565b7f746f6f2062696720736c6f740000000000000000000000000000000000000000600082015250565b60006102d4600c8361028d565b91506102df8261029e565b602082019050919050565b60006020820190508181036000830152610303816102c7565b905091905056fea2646970667358221220ceea194bb66b5b9f52c83e5bf5a1989255de8cb7157838eff98f970c3a04cb3064736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"}]},{"stateOverrides":{"0xc100000000000000000000000000000000000000":{"state":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x1200000000000000000000000000000000000000000000000000000000000000"}}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001"}]}],"traceTransfers":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xac5e","maxUsedGas":"0xac5e","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0xac81","maxUsedGas":"0xac81","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x158df","hash":"0x83aa7f840a38169664a657aa0d1a9b2ccd7b4a403da369a6521cb785861b692a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x559239b7a32c83cdcc1e03ba2070d7d6b5a104015077c9ac40fab83764f4e231","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x350","stateRoot":"0xc33c42af6d38f88490c4dbf094c6742daf787623d158ea3a85b67087656092d7","timestamp":"0x1ce","transactions":[{"blockHash":"0x83aa7f840a38169664a657aa0d1a9b2ccd7b4a403da369a6521cb785861b692a","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x59bf9b0327340e44f86849c3b2020559d4567410efc30030c708202ccb78f677","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x83aa7f840a38169664a657aa0d1a9b2ccd7b4a403da369a6521cb785861b692a","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2fa4422","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xe31ee6882d314903e7ff23726e5c90731af6531a54dbc327cc3cedd1a031837f","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002","nonce":"0x1","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x4f9b387ae022ce326bec432f80e46223608a03d6745e9a2f081a7c06d1ac1a27","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x1200000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5d85","maxUsedGas":"0x5d85","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5d91","maxUsedGas":"0x5d91","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xbb16","hash":"0x10b782fad50f5f87dd2a54d98acfbe9ce8ccc1bb383e47655dcbf32b59a5acbd","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x83aa7f840a38169664a657aa0d1a9b2ccd7b4a403da369a6521cb785861b692a","receiptsRoot":"0xbb2a8473e55a4e9ae2ac7201f52b44253a3bd950e553ea82694f338087d2a2d3","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x30d","stateRoot":"0x5d36c7dfb384091a7a44b2b368df2351ea53162838365b14f5ed47b3104cb162","timestamp":"0x1da","transactions":[{"blockHash":"0x10b782fad50f5f87dd2a54d98acfbe9ce8ccc1bb383e47655dcbf32b59a5acbd","blockNumber":"0x2f","blockTimestamp":"0x1da","from":"0xc000000000000000000000000000000000000000","gas":"0x2f997a1","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xee53c20604e25066c0a8bd533e9fbac7ab0c37a81852f58de5bf335b27324de7","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000000","nonce":"0x2","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x10b782fad50f5f87dd2a54d98acfbe9ce8ccc1bb383e47655dcbf32b59a5acbd","blockNumber":"0x2f","blockTimestamp":"0x1da","from":"0xc000000000000000000000000000000000000000","gas":"0x2f93a1c","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xca745694b08804be88f48ec7657ead992b8ff844cfe176925f42cdc335af7690","input":"0x0ff4c9160000000000000000000000000000000000000000000000000000000000000001","nonce":"0x3","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x960735af31a3cb9eaec9329526e9c469970b15cd7fd345a826923a10cb5700ef","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-validation-fulltx.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-validation-fulltx.io new file mode 100644 index 0000000000..4650682ee6 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-validation-fulltx.io @@ -0,0 +1,3 @@ +// simulates a ethSimulate transfer +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0xf"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xe8d4a51000"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x10","value":"0x2540be400"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","maxFeePerGas":"0x10","value":"0x3e8"}]}],"validation":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0xf","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa410","hash":"0x9e227e02fd9f3b7e8b839446122206cd08bf1fb812ea922576f732d33289027b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x75308898d571eafb5cd8cde8278bf5b3d13c5f6ec074926de3bb895b519264e1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c8","stateRoot":"0x375829e5373817d26b84d5314208af86f54a32669d9a82495b3f11aa9e98ad22","timestamp":"0x1ce","transactions":[{"blockHash":"0x9e227e02fd9f3b7e8b839446122206cd08bf1fb812ea922576f732d33289027b","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2faf080","gasPrice":"0xf","maxFeePerGas":"0x10","maxPriorityFeePerGas":"0x0","hash":"0xc2df7444d2b0604cdfaa20cad5855422b575d8d2ec02868ed9eb45eb20490f66","input":"0x","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x2540be400","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9e227e02fd9f3b7e8b839446122206cd08bf1fb812ea922576f732d33289027b","blockNumber":"0x2e","blockTimestamp":"0x1ce","from":"0xc100000000000000000000000000000000000000","gas":"0x2fa9e78","gasPrice":"0xf","maxFeePerGas":"0x10","maxPriorityFeePerGas":"0x0","hash":"0x5c78719d6ce3bf5b515e9fc3a41ab755c007645928bf35eba1a318721b774595","input":"0x","nonce":"0x0","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x3e8","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x9e80508f974bbf713b286fe5a4d0fae2f54f17e33b742176cc4c5bb7e0942762","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-with-validation-no-funds.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-with-validation-no-funds.io new file mode 100644 index 0000000000..77530d4f41 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple-with-validation-no-funds.io @@ -0,0 +1,3 @@ +// simulates a ethSimulate transfer with validation and not enough funds +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x3e8"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa410","hash":"0xe67b3e473ef02a1d6ddbfc033835c199873dc3d1a777707d6f6c530dfe45b4f5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x75308898d571eafb5cd8cde8278bf5b3d13c5f6ec074926de3bb895b519264e1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c5","stateRoot":"0x147e5101af51b06bae5b89d574a38f6711ecb3582a465a9a4e2aa9e7a1dbc345","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","0xbc123d32ae457d4a444af60d1aef663c2f4a77c44a52bec0eef8ac81b53549cb"],"transactionsRoot":"0x6d79cfd6f20bf10a0b3831acf15402528b00992cb9a71302596de7fbb4ebfb07","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple.io new file mode 100644 index 0000000000..1b86891c74 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-simple.io @@ -0,0 +1,3 @@ +// simulates a ethSimulate transfer +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x3e8"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa410","hash":"0xe67b3e473ef02a1d6ddbfc033835c199873dc3d1a777707d6f6c530dfe45b4f5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x75308898d571eafb5cd8cde8278bf5b3d13c5f6ec074926de3bb895b519264e1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c5","stateRoot":"0x147e5101af51b06bae5b89d574a38f6711ecb3582a465a9a4e2aa9e7a1dbc345","timestamp":"0x1ce","transactions":["0xf1c5abb08809ef760f87aeabe7a87284c60797192dab6d2f0d26c27c9c038e9d","0xbc123d32ae457d4a444af60d1aef663c2f4a77c44a52bec0eef8ac81b53549cb"],"transactionsRoot":"0x6d79cfd6f20bf10a0b3831acf15402528b00992cb9a71302596de7fbb4ebfb07","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transaction-too-high-nonce.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transaction-too-high-nonce.io new file mode 100644 index 0000000000..371ec6f738 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transaction-too-high-nonce.io @@ -0,0 +1,3 @@ +// Error: Nonce too high +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","nonce":"0x64"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0xf0546297fcee62b4d2c62138f1404670bf310ecee74b275f67f1ef4c7d7c910d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0xe7b5ff27a7c9d623622f9a91238004305f5d07d06b8aac9f8f6236cd0bc18eb7","timestamp":"0x1ce","transactions":["0x5502e2f81918bf15546115259aa912e0af477580be84d8f09be4bb8dd2d5667c"],"transactionsRoot":"0x22efe8e840f139e6194b50ce3c218db4aed270a03c5577d1487b134d2b4680e9","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transaction-too-low-nonce-38010.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transaction-too-low-nonce-38010.io new file mode 100644 index 0000000000..df45e738b5 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transaction-too-low-nonce-38010.io @@ -0,0 +1,3 @@ +// Error: Nonce too low (-38010) +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"nonce":"0xa"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","nonce":"0x0"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x5208","hash":"0x0950b3e11994eccf3c4c0c5b5909be07503752773e38b32982a6d358beaf675e","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x292","stateRoot":"0x44398afaa9eaab2fea8d863b3a5ded77712ab42b0eea0cc617ef32635a0f28f5","timestamp":"0x1ce","transactions":["0x234a1d9897819c206fdeb6af312d742010a91b5b4159978a902c9a0b90e7bee5"],"transactionsRoot":"0xed81b1bfe79c8c81d3fe874f7214a9fb9dd186e8243abfeabc506550a532c09a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transfer-over-BlockStateCalls.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transfer-over-BlockStateCalls.io new file mode 100644 index 0000000000..8dba9b5cd0 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-transfer-over-BlockStateCalls.io @@ -0,0 +1,3 @@ +// simulates a transfering value over multiple BlockStateCalls +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x1388"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x7d0"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc300000000000000000000000000000000000000","value":"0x7d0"}]},{"stateOverrides":{"0xc300000000000000000000000000000000000000":{"balance":"0x1388"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8"},{"from":"0xc300000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","value":"0x3e8"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa410","hash":"0x8153c1797f6b58244a52bc33f7b5c1e0a4ee804454ef1abc8a936dbf4aa1285f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x75308898d571eafb5cd8cde8278bf5b3d13c5f6ec074926de3bb895b519264e1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c5","stateRoot":"0x69999a6506553301a33e6dfc731f852206f7577fad36e766af815ef885ef0962","timestamp":"0x1ce","transactions":["0xd65bf8e445fc53d2d0f1b806f3112fab667a5915dcc01a618d62ee1dad017b89","0x24202f93e05f3de5f6484cc15276ffb3c47dfb07ea2ccfd4d73b4045d72cdc97"],"transactionsRoot":"0x30aaf0016a0db1d0b0f3e530dec1daa06864d2eb7a3d9fadce1de091b8945d7c","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xa410","hash":"0x89241873ae1c8d16b1d5eb7c8e309b44f8f12d9343d65ef8b3efad8bdcbb065f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8153c1797f6b58244a52bc33f7b5c1e0a4ee804454ef1abc8a936dbf4aa1285f","receiptsRoot":"0x75308898d571eafb5cd8cde8278bf5b3d13c5f6ec074926de3bb895b519264e1","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2c5","stateRoot":"0x97b46950ff2fac72bde4e00dca03db1449480bbf106d973ca12e5b09aff2311c","timestamp":"0x1da","transactions":["0xfeb278aaa0517bfefde3279dbdf5b44a7e4f47046fbfa287026ee2d8f54fe64f","0xed9a286c764637a4501c9c59c4ab32c12b7125c56bad90f1362997b8be1087d9"],"transactionsRoot":"0xcd1a137fbf0584c9088148b94d63dbd29cdc21e9001783de447b198b9820629d","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-try-to-move-non-precompile.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-try-to-move-non-precompile.io new file mode 100644 index 0000000000..97bc192fdc --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-try-to-move-non-precompile.io @@ -0,0 +1,3 @@ +// try to move non-precompile +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"nonce":"0x5"}}},{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"movePrecompileToAddress":"0xc100000000000000000000000000000000000000"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc000000000000000000000000000000000000000","nonce":"0x0"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","nonce":"0x5"}]}],"validation":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"account 0xC000000000000000000000000000000000000000 is not a precompile"}} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-two-blocks-with-complete-eth-sends.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-two-blocks-with-complete-eth-sends.io new file mode 100644 index 0000000000..8c311f4651 --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-two-blocks-with-complete-eth-sends.io @@ -0,0 +1,3 @@ +// two blocks with eth sends +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"baseFeePerGas":"0xa"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0x35a4ece8"},"0xc100000000000000000000000000000000000000":{"balance":"0x35a4f0d0"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x65","nonce":"0x0","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x66","nonce":"0x1","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x67","nonce":"0x2","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x68","nonce":"0x3","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x69","nonce":"0x4","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0x5","input":"0x"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0x0","input":"0x"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x65","nonce":"0x6","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x66","nonce":"0x7","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x67","nonce":"0x8","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x68","nonce":"0x9","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x69","nonce":"0xa","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0xb","input":"0x"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x14","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0x1","input":"0x"}]}]},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0xa","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x23e38","hash":"0x5a0c0971115652bf35cbc894a1f4996fa04d7071ca7317e4b0af4f1a48f336f5","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x9876b41ba412e30252e0c01dd31bf9b5a0ec8c66253b5d0fabdcb9f112b66803","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x39b","stateRoot":"0xf704081149c8f5e4ab74d4eed4fef7bc0537e6462469e9026333d314f348f80f","timestamp":"0x1ce","transactions":["0xeb7436a384260a8a2f0718c37caf93bce973825ba711f04e51a6ee9099677ae2","0xda45a6efedad658153f68e999e893fe7764a81b614919c02da6c18a43afe50c4","0x33da1e595ae11a27fc5fd7d789ea170aa60914ed3466b1d1dcb68b2404d220a7","0x64aa4feba36c81c84f0cf067b1d984c71c01753c2235b301ebe885c0ca8a7571","0x044216d790aa32233305780b73b38b285deac22cde75808edf954cfe98b09d3d","0xe767571cdf3fe5c6d3df10efe61cf5fc7e3890b351d8b7fc927bc31fa259ac09","0x0abec4f589f3590a6db5b382ffb1b5edd9dfaf206fcc2735e5df55f6c785c9e6"],"transactionsRoot":"0xdb9e985db5c9eecf36177eb7ec3fffeb3c8228143d57f5f721cb95cf5f4c1a86","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x23e38","hash":"0xfa4e05b3f68635933fee7dffa5196b1e89d15788ce22972172a7018a2960dbc4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x5a0c0971115652bf35cbc894a1f4996fa04d7071ca7317e4b0af4f1a48f336f5","receiptsRoot":"0x9876b41ba412e30252e0c01dd31bf9b5a0ec8c66253b5d0fabdcb9f112b66803","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x39b","stateRoot":"0x2daf71c3d41bd8c346d91885c5861114fb8337aad440b8786cddc482d18441f7","timestamp":"0x1da","transactions":["0x6f11c8c470bdf97e90ae15685a0726c7f07f621f1dcb44716967bf1a8a5eaa0b","0x3c777ae3700de0a219a5aebced3b0d12be4b75866e04ca4bf75387382fc52d48","0xf1fef2c7d86a620e3b406378d3cfc7fcdb1d62937379f5803075b0c24b92573d","0xc1a94e99e81c68362c70b727ff975baeac02f0ccedc04d67dede2b6cd355eda5","0xf1a72470daf5a847bde6601c70d8b104468d3dcdcced4dc2a37ecbd7a92c7943","0x94393ef67af6a94cd43868e65a86dc88eebf4138bf9d3051186904ca5f309a5c","0x8b74ca93bce67e268bbb846bed626f59df9e75bf671adf424a07dadf270b92ac"],"transactionsRoot":"0x218ff1514e7186f46ab8fbdf34ff72cd158e5393811340844bb9e82f291b45d6","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/eth_simulateV1/ethSimulate-use-as-many-features-as-possible.io b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-use-as-many-features-as-possible.io new file mode 100644 index 0000000000..f18204c5cc --- /dev/null +++ b/tests/integration_tests/spec/eth_simulateV1/ethSimulate-use-as-many-features-as-possible.io @@ -0,0 +1,3 @@ +// try using all eth simulates features at once +>> {"jsonrpc":"2.0","id":1,"method":"eth_simulateV1","params":[{"blockStateCalls":[{"blockOverrides":{"number":"0x37","time":"0x3b6","feeRecipient":"0xc200000000000000000000000000000000000000","prevRandao":"0x0000000000000000000000000000000000000000000000000000000000001234","baseFeePerGas":"0x3ef"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xd18c3d6a40"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c80631627905514610043578063b9724d6314610073578063dce4a447146100a3575b5f80fd5b61005d600480360381019061005891906101b3565b6100d3565b60405161006a91906101f8565b60405180910390f35b61008d600480360381019061008891906101b3565b61011a565b60405161009a9190610229565b60405180910390f35b6100bd60048036038101906100b891906101b3565b610129565b6040516100ca91906102cc565b60405180910390f35b5f807fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f1b90505f833f905081811415801561011157505f801b8114155b92505050919050565b5f80823f905080915050919050565b6060813b60405191505f19601f18601f6020830101168201604052808252805f60208401853c50919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018282610159565b9050919050565b61019281610178565b811461019c575f80fd5b50565b5f813590506101ad81610189565b92915050565b5f602082840312156101c8576101c7610155565b5b5f6101d58482850161019f565b91505092915050565b5f8115159050919050565b6101f2816101de565b82525050565b5f60208201905061020b5f8301846101e9565b92915050565b5f819050919050565b61022381610211565b82525050565b5f60208201905061023c5f83018461021a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561027957808201518184015260208101905061025e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61029e82610242565b6102a8818561024c565b93506102b881856020860161025c565b6102c181610284565b840191505092915050565b5f6020820190508181035f8301526102e48184610294565b90509291505056fea26469706673582212206a23e83d04cb5f5ab00353d719afd8181b39baa39277b8cfa111197637a4f26064736f6c63430008160033","balance":"0xd18c4cac80"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x65","nonce":"0x0","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x66","nonce":"0x1","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x67","nonce":"0x2","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x68","nonce":"0x3","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x69","nonce":"0x4","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0x5","input":"0x"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0x0","input":"0x"}]},{"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x65","nonce":"0x6","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x66","nonce":"0x7","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x67","nonce":"0x8","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x68","nonce":"0x9","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x69","nonce":"0xa","input":"0x"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0xb","input":"0x"},{"from":"0xc100000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","gas":"0x5208","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","maxFeePerBlobGas":"0x0","value":"0x6a","nonce":"0x1","input":"0x"}]},{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xd18c3d6a40"},"0xc100000000000000000000000000000000000000":{"code":"0x60806040526004361061001d575f3560e01c80635c19a95c14610021575b5f80fd5b61003b6004803603810190610036919061011d565b610052565b6040516100499291906101ec565b60405180910390f35b5f60608273ffffffffffffffffffffffffffffffffffffffff1660405161007890610247565b5f60405180830381855af49150503d805f81146100b0576040519150601f19603f3d011682016040523d82523d5f602084013e6100b5565b606091505b5091509150915091565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ec826100c3565b9050919050565b6100fc816100e2565b8114610106575f80fd5b50565b5f81359050610117816100f3565b92915050565b5f60208284031215610132576101316100bf565b5b5f61013f84828501610109565b91505092915050565b5f8115159050919050565b61015c81610148565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561019957808201518184015260208101905061017e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6101be82610162565b6101c8818561016c565b93506101d881856020860161017c565b6101e1816101a4565b840191505092915050565b5f6040820190506101ff5f830185610153565b818103602083015261021181846101b4565b90509392505050565b5f81905092915050565b50565b5f6102325f8361021a565b915061023d82610224565b5f82019050919050565b5f61025182610227565b915081905091905056fea2646970667358221220c79623409cf56de66f689f36463cb9aa88ed853501e557889625b16b1a602b2764736f6c63430008160033"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x7d0","value":"0x3e8","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000"}]},{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xd18c3d6a40"},"0xc100000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630ff4c916146100515780633033413b1461008157806344e12f871461009f5780637b8d56e3146100bd575b600080fd5b61006b600480360381019061006691906101f6565b6100d9565b6040516100789190610232565b60405180910390f35b61008961013f565b6040516100969190610232565b60405180910390f35b6100a7610145565b6040516100b49190610232565b60405180910390f35b6100d760048036038101906100d2919061024d565b61014b565b005b60006002821061011e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610115906102ea565b60405180910390fd5b6000820361012c5760005490505b6001820361013a5760015490505b919050565b60015481565b60005481565b6002821061018e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610185906102ea565b60405180910390fd5b600082036101a257806000819055506101b7565b600182036101b657806001819055506101b7565b5b5050565b600080fd5b6000819050919050565b6101d3816101c0565b81146101de57600080fd5b50565b6000813590506101f0816101ca565b92915050565b60006020828403121561020c5761020b6101bb565b5b600061021a848285016101e1565b91505092915050565b61022c816101c0565b82525050565b60006020820190506102476000830184610223565b92915050565b60008060408385031215610264576102636101bb565b5b6000610272858286016101e1565b9250506020610283858286016101e1565b9150509250929050565b600082825260208201905092915050565b7f746f6f2062696720736c6f740000000000000000000000000000000000000000600082015250565b60006102d4600c8361028d565b91506102df8261029e565b602082019050919050565b60006020820190508181036000830152610303816102c7565b905091905056fea2646970667358221220ceea194bb66b5b9f52c83e5bf5a1989255de8cb7157838eff98f970c3a04cb3064736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x7d0","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","maxFeePerGas":"0x7d0","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"}]},{"stateOverrides":{"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c806383197ef014602d575b600080fd5b60336035565b005b600073ffffffffffffffffffffffffffffffffffffffff16fffea26469706673582212208e566fde20a17fff9658b9b1db37e27876fd8934ccf9b2aa308cabd37698681f64736f6c63430008120033","balance":"0xd18c3d6a40"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0x83197ef0"}]},{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xd18c3d6a40"},"0xc100000000000000000000000000000000000000":{"code":"0x60806040526004361061001d575f3560e01c80635c19a95c14610021575b5f80fd5b61003b6004803603810190610036919061011d565b610052565b6040516100499291906101ec565b60405180910390f35b5f60608273ffffffffffffffffffffffffffffffffffffffff1660405161007890610247565b5f60405180830381855af49150503d805f81146100b0576040519150601f19603f3d011682016040523d82523d5f602084013e6100b5565b606091505b5091509150915091565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ec826100c3565b9050919050565b6100fc816100e2565b8114610106575f80fd5b50565b5f81359050610117816100f3565b92915050565b5f60208284031215610132576101316100bf565b5b5f61013f84828501610109565b91505092915050565b5f8115159050919050565b61015c81610148565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561019957808201518184015260208101905061017e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6101be82610162565b6101c8818561016c565b93506101d881856020860161017c565b6101e1816101a4565b840191505092915050565b5f6040820190506101ff5f830185610153565b818103602083015261021181846101b4565b90509392505050565b5f81905092915050565b50565b5f6102325f8361021a565b915061023d82610224565b5f82019050919050565b5f61025182610227565b915081905091905056fea2646970667358221220c79623409cf56de66f689f36463cb9aa88ed853501e557889625b16b1a602b2764736f6c63430008160033"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000"}]},{"blockOverrides":{"number":"0x4b"},"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xd18c3d6a40"},"0xc200000000000000000000000000000000000000":{"code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063ee82ac5e14602d575b600080fd5b60436004803603810190603f91906098565b6057565b604051604e919060d7565b60405180910390f35b600081409050919050565b600080fd5b6000819050919050565b6078816067565b8114608257600080fd5b50565b6000813590506092816071565b92915050565b60006020828403121560ab5760aa6062565b5b600060b7848285016085565b91505092915050565b6000819050919050565b60d18160c0565b82525050565b600060208201905060ea600083018460ca565b9291505056fea2646970667358221220a4d7face162688805e99e86526524ac3dadfb01cc29366d0d68b70dadcf01afe64736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000001"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000002"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000004"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000008"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000016"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000032"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000064"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000128"},{"from":"0xc000000000000000000000000000000000000000","to":"0xc200000000000000000000000000000000000000","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000256"}]},{"stateOverrides":{"0xc000000000000000000000000000000000000000":{"balance":"0xd18c3d6a40"},"0xc100000000000000000000000000000000000000":{"code":"0x60806040526004361061001d575f3560e01c80635c19a95c14610021575b5f80fd5b61003b6004803603810190610036919061011d565b610052565b6040516100499291906101ec565b60405180910390f35b5f60608273ffffffffffffffffffffffffffffffffffffffff1660405161007890610247565b5f60405180830381855af49150503d805f81146100b0576040519150601f19603f3d011682016040523d82523d5f602084013e6100b5565b606091505b5091509150915091565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ec826100c3565b9050919050565b6100fc816100e2565b8114610106575f80fd5b50565b5f81359050610117816100f3565b92915050565b5f60208284031215610132576101316100bf565b5b5f61013f84828501610109565b91505092915050565b5f8115159050919050565b61015c81610148565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561019957808201518184015260208101905061017e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6101be82610162565b6101c8818561016c565b93506101d881856020860161017c565b6101e1816101a4565b840191505092915050565b5f6040820190506101ff5f830185610153565b818103602083015261021181846101b4565b90509392505050565b5f81905092915050565b50565b5f6102325f8361021a565b915061023d82610224565b5f82019050919050565b5f61025182610227565b915081905091905056fea2646970667358221220c79623409cf56de66f689f36463cb9aa88ed853501e557889625b16b1a602b2764736f6c63430008160033"},"0xc200000000000000000000000000000000000000":{"code":"0x608060405234801561001057600080fd5b506000366060484641444543425a3a60014361002c919061009b565b406040516020016100469a99989796959493929190610138565b6040516020818303038152906040529050915050805190602001f35b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006100a682610062565b91506100b183610062565b92508282039050818111156100c9576100c861006c565b5b92915050565b6100d881610062565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610109826100de565b9050919050565b610119816100fe565b82525050565b6000819050919050565b6101328161011f565b82525050565b60006101408201905061014e600083018d6100cf565b61015b602083018c6100cf565b610168604083018b610110565b610175606083018a6100cf565b61018260808301896100cf565b61018f60a08301886100cf565b61019c60c08301876100cf565b6101a960e08301866100cf565b6101b76101008301856100cf565b6101c5610120830184610129565b9b9a505050505050505050505056fea26469706673582212205139ae3ba8d46d11c29815d001b725f9840c90e330884ed070958d5af4813d8764736f6c63430008120033"}},"calls":[{"from":"0xc000000000000000000000000000000000000000","to":"0xc100000000000000000000000000000000000000","value":"0x3e8","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000"}]},{"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]},{"stateOverrides":{"0x0000000000000000000000000000000000000001":{"movePrecompileToAddress":"0x0000000000000000000000000000000000123456"}},"calls":[{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000123456","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"},{"from":"0xc100000000000000000000000000000000000000","to":"0x0000000000000000000000000000000000000001","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9"}]}],"traceTransfers":true,"returnFullTransactions":true},"latest"]} +<< {"jsonrpc":"2.0","id":1,"result":[{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe27a3e81bd7cfe2aec2cc9e832c73a17c93e7efcf659cf4b39883b96c48708c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x59c231f009f82ec35460b3cf0d9b715d1a35a690c3da0f6003b7842c3d498a26","timestamp":"0x1ce","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x2f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8b8964bfcf7d8e280ed6812a581f67beda47d2b0f6316e1709bcff7d093e02b7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x93b583ed05f454a78c9279625a3e2871ff3324507e6418e29e53416acc88900d","timestamp":"0x1da","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x30","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd3682b7341c0549d85b73600e4b9fc0eead01643f3ce7279caaa5145df71fe0b","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xb22b7c9857930782d7a92e282059b1653b643efb6f09a9aff1d65fedfce438b8","timestamp":"0x1e6","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x31","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66a8499f82d7a7203544fefebaece243b302f55d24dd97be71d97d503b10fbe9","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6005795fd04dd3670db5e14ae6425052c6ee82ff22080293ee3d83c180d65bcc","timestamp":"0x1f2","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x32","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1ea03bc2ea7e70947269e14de3883459eb81a64780c99da31804a73f9f4cdfc7","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8843675f3b9eec18a5acf116df90a26fae9ef70f21d3cffc4992b760cfdc23cf","timestamp":"0x1fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x8601822b6dff617cf93178957c0162d95c7cc411278934e676b2271d9364bfe0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x33","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x04238f2fad5e4b9820daf76c60946eb702d35577d2d1e6d5fc2c07d229e75689","timestamp":"0x20a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xd482916837d0d43b8cd15d00d4c0f50ad019311d1c7e6fb220e053548dc08181","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x34","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x8601822b6dff617cf93178957c0162d95c7cc411278934e676b2271d9364bfe0","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x3d5f58fbf02276461b11687866a4a1389fad17ca6ea7fdf4c7f2c5afa8cc546f","timestamp":"0x216","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x66c675d5b1ae5453cbf525ac2d1a071256605445d474af3764a36783e90b342d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x35","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd482916837d0d43b8cd15d00d4c0f50ad019311d1c7e6fb220e053548dc08181","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x429c0581461d0048471b1d8d85f7d129cf493114e4ca1e11a154bb649521f932","timestamp":"0x222","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdaeb4e1610aaeb576bc75667c8ab9d27f6985f41880ddf71b3ecc8c31b617def","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x36","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x66c675d5b1ae5453cbf525ac2d1a071256605445d474af3764a36783e90b342d","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x9ad06fa7f19d678709c797246788f30a9a8d50083b9174a8f684e578c1b337bd","timestamp":"0x22e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x3ef","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c100000000000000000000000000000000000000","0x000000000000000000000000c200000000000000000000000000000000000000"],"data":"0x000000000000000000000000000000000000000000000000000000000000006a","blockNumber":"0x37","transactionHash":"0x168c39679202357711bb160d315f53c5f6754b588ef7994b41fc817930400215","transactionIndex":"0x6","blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockTimestamp":"0x3b6","logIndex":"0x6","removed":false}],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x23e38","hash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000001234","nonce":"0x0000000000000000","number":"0x37","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdaeb4e1610aaeb576bc75667c8ab9d27f6985f41880ddf71b3ecc8c31b617def","receiptsRoot":"0x6f98626ffbd82b9ff47e4b1a94a36508f9233ca57f502e51b0cf1fc8ed58a041","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x3ab","stateRoot":"0x52877a345459eb520efbc1695bd3be5865822d33a7c6115e770540b3adde99ea","timestamp":"0x3b6","transactions":[{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x8852636084a44e737fdeea0c542629a3cfe1ea06af8ec0e1e8e1ef158032668b","input":"0x","nonce":"0x0","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x65","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x87025f6996b7230ff2966687eebe8e09b0200aade62aba2e005add2dd4ebd419","input":"0x","nonce":"0x1","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x66","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x509e622651a8fe784cd5e7f230c3a0917f7be13c87d91dc3e36e21872f3e7488","input":"0x","nonce":"0x2","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x2","value":"0x67","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0xd5c985e7dd86653006e5cd08a0afd4f829ac4e9822f533cfd3553ce22c5254a8","input":"0x","nonce":"0x3","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x3","value":"0x68","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x2d9fd4a65ffb6730fd102fb37ab59c27f97daad2b5fac3a7d9d0c68d09f5f2b4","input":"0x","nonce":"0x4","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x4","value":"0x69","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x8d69815dee99be99ae713b0a9118f33bb79be90cf67c61b812379c986b3986d9","input":"0x","nonce":"0x5","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x5","value":"0x6a","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","blockNumber":"0x37","blockTimestamp":"0x3b6","from":"0xc100000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x3f0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x168c39679202357711bb160d315f53c5f6754b588ef7994b41fc817930400215","input":"0x","nonce":"0x0","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x6","value":"0x6a","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x847b1cdefcad343b77cf23dc25a32d40d8fcfa41be4b14418b125b5f5bf04cf9","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x0","error":{"message":"out of gas","code":-32015}},{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c100000000000000000000000000000000000000","0x000000000000000000000000c200000000000000000000000000000000000000"],"data":"0x000000000000000000000000000000000000000000000000000000000000006a","blockNumber":"0x38","transactionHash":"0x3647fd5523395b7a571d386acc0b30e984e9e54fb7f0d171e657126ae0f7cda2","transactionIndex":"0x6","blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockTimestamp":"0x3c2","logIndex":"0x6","removed":false}],"gasUsed":"0x5208","maxUsedGas":"0x5208","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x23e38","hash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x38","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x9cce22b9f12729367122c270614cc5a498741269e5f6dbd74be343d602b35fcc","receiptsRoot":"0x6f98626ffbd82b9ff47e4b1a94a36508f9233ca57f502e51b0cf1fc8ed58a041","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x3a9","stateRoot":"0x9d73f0692f5bf5f3558620933bee9ff333c60acd2863820dcc6e50dac13374b8","timestamp":"0x3c2","transactions":[{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x60d9053a100885eec66f45ed40c451681e2506779e69cfeeea9725d4f5c2388e","input":"0x","nonce":"0x6","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x65","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0xea48fe3838720fe557da318e0ee0dfb2908705abc9b4a7287ee9856c21ee9784","input":"0x","nonce":"0x7","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x66","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x07aedf39dc871f71bf5cd55c0f9a687298081281d83f8f136cebd5bf687e56ef","input":"0x","nonce":"0x8","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x2","value":"0x67","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x4675c7fae70d9854c4e8026d08706508a1ffadbee81870ccd4b9fe7cf1cd8d4c","input":"0x","nonce":"0x9","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x3","value":"0x68","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0xf23c72098f5d5ca4c1fc487f310a0cdcf1161b7f2e6985f3a266d24f93d58711","input":"0x","nonce":"0xa","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x4","value":"0x69","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc000000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0xe3af0856d4f87ea3f699039e9b9244e9f7d6ac68fc7012d13e88197f4a63e56d","input":"0x","nonce":"0xb","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x5","value":"0x6a","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","blockNumber":"0x38","blockTimestamp":"0x3c2","from":"0xc100000000000000000000000000000000000000","gas":"0x5208","gasPrice":"0x1","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x1","hash":"0x3647fd5523395b7a571d386acc0b30e984e9e54fb7f0d171e657126ae0f7cda2","input":"0x","nonce":"0x1","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x6","value":"0x6a","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x55ef66f630fdc5aae641206d3a320b01e4490511881766d6ddc0bb0262011f0a","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x39","transactionHash":"0xe95ea9d87c0aa815b81acf25c7f7d222be7d74ddee583a3247a131ae6ac16485","transactionIndex":"0x0","blockHash":"0x1898110a509a7d1283ef221b2dc1bfc5b93740a2998ed5c6627be7e81683a53c","blockTimestamp":"0x3ce","logIndex":"0x0","removed":false}],"gasUsed":"0x583a","maxUsedGas":"0x583a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x583a","hash":"0x1898110a509a7d1283ef221b2dc1bfc5b93740a2998ed5c6627be7e81683a53c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x39","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x58e17ccd70c638914a5981bd56938fd9602c204697d1f7178185b70695aaf0e2","receiptsRoot":"0x31a4a1c53003df7f84438f41f286e63a023d3a77f96b2dcd61424349c45d9c97","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bd","stateRoot":"0x38fd1011637e0de3a11462de7591a4ae26a11165346fe7e2e86150d17473a072","timestamp":"0x3ce","transactions":[{"blockHash":"0x1898110a509a7d1283ef221b2dc1bfc5b93740a2998ed5c6627be7e81683a53c","blockNumber":"0x39","blockTimestamp":"0x3ce","from":"0xc000000000000000000000000000000000000000","gas":"0x2f67410","gasPrice":"0x0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x0","hash":"0xe95ea9d87c0aa815b81acf25c7f7d222be7d74ddee583a3247a131ae6ac16485","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000","nonce":"0xc","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x3e8","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0xd6a037e652a67a6fba456d039836331799aae26fd90f0a6e8c8bcad587e4f3c9","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0xac5e","maxUsedGas":"0xac5e","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0xac81","maxUsedGas":"0xac81","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x158df","hash":"0x558725694d8b229d42fdd699e5cdb40d34f9146bb15dbc0fd895175b0280847f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1898110a509a7d1283ef221b2dc1bfc5b93740a2998ed5c6627be7e81683a53c","receiptsRoot":"0x559239b7a32c83cdcc1e03ba2070d7d6b5a104015077c9ac40fab83764f4e231","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x354","stateRoot":"0x4ac4df4e9ab3a7fb5d90b3cddc5843de3ed8982559bf12ccbf7c2c73428fe820","timestamp":"0x3da","transactions":[{"blockHash":"0x558725694d8b229d42fdd699e5cdb40d34f9146bb15dbc0fd895175b0280847f","blockNumber":"0x3a","blockTimestamp":"0x3da","from":"0xc000000000000000000000000000000000000000","gas":"0x2f61bd6","gasPrice":"0x0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x0","hash":"0xbe33f0f7befd427fbc2e13948402613024f0a4a53191e1182f7d07ca5aed0713","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001","nonce":"0xd","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x558725694d8b229d42fdd699e5cdb40d34f9146bb15dbc0fd895175b0280847f","blockNumber":"0x3a","blockTimestamp":"0x3da","from":"0xc000000000000000000000000000000000000000","gas":"0x2f56f78","gasPrice":"0x0","maxFeePerGas":"0x7d0","maxPriorityFeePerGas":"0x0","hash":"0xab5da24d21f330623627f90912ba59cc727e5cb4bb840721349fa8e9a7482505","input":"0x7b8d56e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002","nonce":"0xe","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x87c83a3f7199320ba1c6b3bdd0890014718200f34c282777d956b1c0f37b3b83","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c200000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"data":"0x000000000000000000000000000000000000000000000000000000d18c3d6a40","blockNumber":"0x3b","transactionHash":"0xf6f4fb5a311b133810e781a48aafa6d9b7bc49be508f1cb9112764173c0c113f","transactionIndex":"0x0","blockHash":"0x14b7cef92acdc8d5276fb1be8b48dfa7658de5f012ba54bdc3058ba17249771f","blockTimestamp":"0x3e6","logIndex":"0x0","removed":false}],"gasUsed":"0x7072","maxUsedGas":"0x7072","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x7072","hash":"0x14b7cef92acdc8d5276fb1be8b48dfa7658de5f012ba54bdc3058ba17249771f","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x558725694d8b229d42fdd699e5cdb40d34f9146bb15dbc0fd895175b0280847f","receiptsRoot":"0xe8246ead1770a79f7847cd058f7e490967d4b750336d2e8974f1254cbf6809a6","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x296","stateRoot":"0x296d9c75cfb399c4a78ed0b39f9d03d1ce58b3ab9892383a9fab447957cde080","timestamp":"0x3e6","transactions":[{"blockHash":"0x14b7cef92acdc8d5276fb1be8b48dfa7658de5f012ba54bdc3058ba17249771f","blockNumber":"0x3b","blockTimestamp":"0x3e6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f4c2f7","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xf6f4fb5a311b133810e781a48aafa6d9b7bc49be508f1cb9112764173c0c113f","input":"0x83197ef0","nonce":"0xf","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x2cf04bd1115392d6b1ae8ecd1f2f2681147426211b7e2236e6e369a801be2b6f","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x3c","transactionHash":"0xb7d0b6f4422356a6a50afca8758017db9117eb53fdcaaad946104665aa488b01","transactionIndex":"0x0","blockHash":"0x1ae8fd7f57464c3ee9171a1df234849b49e07cc57979aa563b10105dd9194555","blockTimestamp":"0x3f2","logIndex":"0x0","removed":false}],"gasUsed":"0x583a","maxUsedGas":"0x583a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x583a","hash":"0x1ae8fd7f57464c3ee9171a1df234849b49e07cc57979aa563b10105dd9194555","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x14b7cef92acdc8d5276fb1be8b48dfa7658de5f012ba54bdc3058ba17249771f","receiptsRoot":"0x31a4a1c53003df7f84438f41f286e63a023d3a77f96b2dcd61424349c45d9c97","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0xc1269a682b68764d1925cd4bd5c805ec3dd4245fa78f13a734d30069259af72f","timestamp":"0x3f2","transactions":[{"blockHash":"0x1ae8fd7f57464c3ee9171a1df234849b49e07cc57979aa563b10105dd9194555","blockNumber":"0x3c","blockTimestamp":"0x3f2","from":"0xc000000000000000000000000000000000000000","gas":"0x2f45285","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xb7d0b6f4422356a6a50afca8758017db9117eb53fdcaaad946104665aa488b01","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000","nonce":"0x10","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x3e8","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x232fae869f7782ad9e6b3fcb713308fb5321aaa44577e86ad0f41f30cf478900","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xdf34597644b129f7dbcf04485fea8dc46f6ce5e817ebf9e10f1850c4f4f816a4","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1ae8fd7f57464c3ee9171a1df234849b49e07cc57979aa563b10105dd9194555","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x95929dd797db9c416d36a00d6302490143e313045914e4b921d8c0ff9bfa6246","timestamp":"0x3fe","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x3fc808db3557d56cd8c4dabdecb07b5dfe791b769daea6d1c20381a839670355","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xdf34597644b129f7dbcf04485fea8dc46f6ce5e817ebf9e10f1850c4f4f816a4","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x7116fb44579d7c96d73afd2771b0a7b0e2bad3331f4e476ee0b70eac139393b6","timestamp":"0x40a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x64ad3b4d4846cb511355af347a668164116adb16ccc659106e591614a044a612","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x3f","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x3fc808db3557d56cd8c4dabdecb07b5dfe791b769daea6d1c20381a839670355","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xe488877383fbc163e07ed037a40b54195b8d80d2db23465159d1d987f7f60c8d","timestamp":"0x416","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xab558817f41976be7c48843f9d75ff50bab4f862ea11da773ea18b242ec39181","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x40","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x64ad3b4d4846cb511355af347a668164116adb16ccc659106e591614a044a612","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x1ffaec4764e980553b31252c481a628c19ebb5dfb8e36e320a1ce977aa00466a","timestamp":"0x422","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x2402d38d9d10ffba80e67c22c6e76407dd11a9de14c6ba87318308fdfacf0943","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x41","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xab558817f41976be7c48843f9d75ff50bab4f862ea11da773ea18b242ec39181","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xcc689d88900b2bc7e99586178b80a3a2d5d5605d245b745f6643f637d43f01e0","timestamp":"0x42e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x1e2938a75662de8a57076741bc611096704c5dd8dd3a823cfe427551cb20e92a","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x42","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x2402d38d9d10ffba80e67c22c6e76407dd11a9de14c6ba87318308fdfacf0943","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x1b7e5c5ae7c5a27416376d2dec744ca67abd884e2db290a4b551d6bedd51c983","timestamp":"0x43a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x91b83e105abed9e3049eca22237143315afb859392a239f3318f156e581316b0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x43","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x1e2938a75662de8a57076741bc611096704c5dd8dd3a823cfe427551cb20e92a","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x517c8c9507105a64e4a08a6379118c870865c0f1bbac09173b9ca19a3a64879b","timestamp":"0x446","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa46710aa8b51158d9f7d3a651b23f7aee586e33e09ff800ec4172223aeb828c2","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x44","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x91b83e105abed9e3049eca22237143315afb859392a239f3318f156e581316b0","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x2d4bfcb4e73a916bb12af2b6b04611304b9cd6c535e0a511e941bc083947eb43","timestamp":"0x452","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xcecdc741489f7c1d8f69feb8d6bb525fa41feb21851e0fa81d31964a503125ce","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x45","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa46710aa8b51158d9f7d3a651b23f7aee586e33e09ff800ec4172223aeb828c2","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x8d18dc0d7a3560805ba6d68dcc4d3725615b3604b9545de45c779a71ec419dc7","timestamp":"0x45e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x081eea6b1fcd2f8c05ece80f98e4387cb2298b908f08343d3281720aec191d71","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x46","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xcecdc741489f7c1d8f69feb8d6bb525fa41feb21851e0fa81d31964a503125ce","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xa98779d4756e679004ffe0700bd11b2084ae958ea4f0808a7f31bf2ee55fea17","timestamp":"0x46a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0x401429c67e8a589d0dfa0e81ecd73df2617147b12779ede3db1e10716f0ffb61","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x47","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x081eea6b1fcd2f8c05ece80f98e4387cb2298b908f08343d3281720aec191d71","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x6addc344797a9bd213511672bc1ac37248cd04cf8a378b06613bca5d5df669ea","timestamp":"0x476","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xe035c15ceb7f20591fea4b278d3fbe4215cc5e29055cfc7692328ab37dc5fd64","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x48","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x401429c67e8a589d0dfa0e81ecd73df2617147b12779ede3db1e10716f0ffb61","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0x5c62303a7c1a4b487833efa96a9bd95f81ca2906a1a418b2d76a644de51656e6","timestamp":"0x482","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa0475723f0de70498d58a53c0f7283f304eae866b86ff53df4e4da93c2f03a0c","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x49","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xe035c15ceb7f20591fea4b278d3fbe4215cc5e29055cfc7692328ab37dc5fd64","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xd3150d89c107d16830b1d9c6f143f4a69603e5cfb20d2c8d413bb56c17304ef0","timestamp":"0x48e","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x0","hash":"0xa8b96fa44f7cda08270386d2414f36307c816ab12e869218de93d298ba0c30c0","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4a","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa0475723f0de70498d58a53c0f7283f304eae866b86ff53df4e4da93c2f03a0c","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x262","stateRoot":"0xdce968c18a07b697358b1234c4336e52b9040a979ff73dd4a9023a76b08edde0","timestamp":"0x49a","transactions":[],"transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x79ba0368c2c6563a7d263695b583dcc6d1c25d4988daa0105804d38bdd987f2f","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0x558340736256a3a431f7340546850dfd1451171a5c990308f86c47e4f41aed1a","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0x29cc6f97784c864cbe29b3502934ad874f48ddc89580018f5a32e01652c88f0a","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0x9c4461c739c4b7a2850bafd38462047a2eb360a769ceafb77d7a3492ddec426c","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0xbde548af8553199b6c155a1c65539aecc4d5fe22dc9cdb0cbdb31a23bdcc6272","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0x18001f54d69705c7e84cf45b9abb6aa371ce440bb7fdad8021070661e0695912","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x552c","maxUsedGas":"0x552c","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5538","maxUsedGas":"0x5538","status":"0x1"},{"returnData":"0x0000000000000000000000000000000000000000000000000000000000000000","logs":[],"gasUsed":"0x5538","maxUsedGas":"0x5538","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x2fea4","hash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4b","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xa8b96fa44f7cda08270386d2414f36307c816ab12e869218de93d298ba0c30c0","receiptsRoot":"0xd87afaf96c48fb5e94b4180bb2a6836506da41342fc3f436175dc02283bdc712","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x55b","stateRoot":"0x05f3051a4059006827960f3038d6a8fbb3ae6084ca25a54bf630d3dfdf0eb579","timestamp":"0x4a6","transactions":[{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f3fa4b","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x4a0901507cc3ea253c7fdb77757318ffc3aa2f269f3dfafe891af4f6d2425e15","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000001","nonce":"0x11","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f3a51f","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x94cf06f240cb01d4b58f0e349aca3e858bfd2073f5d50f8eaecbc3454987961a","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000002","nonce":"0x12","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f34ff3","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x981c520c191746d96d66a786a4093a6d67b7d85a5df31cddc86b7a530d9e3730","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000004","nonce":"0x13","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f2fac7","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x608fae81d356c3750c6fc533699a4a78ae2d91b384442e94ccbd588cfda12795","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000008","nonce":"0x14","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x3","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f2a59b","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x8ef5186aec392f3b847c669d35b67c49674424fceea62bb5014bd1dfbef6bbd4","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000016","nonce":"0x15","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x4","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f2506f","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x1e899de990a676b8f4285d971794bf4209a21a28383fb23fcfa5d1e0dce5aff8","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000032","nonce":"0x16","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x5","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f1fb43","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x788063835f19f7451c6fa59b6a9ecf922840a113a170926bd942ebdf26482e01","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000064","nonce":"0x17","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x6","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f1a617","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xbd9a976e2076816391816f808e84cd5e99a5b54a4e8a3fede528955c8ba265b5","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000128","nonce":"0x18","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x7","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","blockNumber":"0x4b","blockTimestamp":"0x4a6","from":"0xc000000000000000000000000000000000000000","gas":"0x2f150df","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x9267174309f2bf535064ac08f4f93e1767e4f92a8458322010eb0950cd9b91c6","input":"0xee82ac5e0000000000000000000000000000000000000000000000000000000000000256","nonce":"0x19","to":"0xc200000000000000000000000000000000000000","transactionIndex":"0x8","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x9081f7d0a8588468bfc581572503c3dfe6794a67224c78beb1773005d7f64037","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000","logs":[{"address":"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000c000000000000000000000000000000000000000","0x000000000000000000000000c100000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000000000000003e8","blockNumber":"0x4c","transactionHash":"0x8e16b613b4cf042afae1afaefb08a91d4d83bcdab1966e2ff2c1476fee2c19f6","transactionIndex":"0x0","blockHash":"0x024266fdf79811c63c00db547fc9365c1021c8bd9e83b75fffc66ef895113b66","blockTimestamp":"0x4b2","logIndex":"0x0","removed":false}],"gasUsed":"0x583a","maxUsedGas":"0x583a","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x583a","hash":"0x024266fdf79811c63c00db547fc9365c1021c8bd9e83b75fffc66ef895113b66","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4c","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xaedf26d7883abe6d78231e94492bbb3891131f2d88f6c731e4f0717eb738b747","receiptsRoot":"0x31a4a1c53003df7f84438f41f286e63a023d3a77f96b2dcd61424349c45d9c97","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2bb","stateRoot":"0xa4f8032a35a4644a9f4ffe0a2cf578f9e9e0c929fa5c826f21b500be0522edd3","timestamp":"0x4b2","transactions":[{"blockHash":"0x024266fdf79811c63c00db547fc9365c1021c8bd9e83b75fffc66ef895113b66","blockNumber":"0x4c","blockTimestamp":"0x4b2","from":"0xc000000000000000000000000000000000000000","gas":"0x2f0fba7","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x8e16b613b4cf042afae1afaefb08a91d4d83bcdab1966e2ff2c1476fee2c19f6","input":"0x5c19a95c000000000000000000000000c200000000000000000000000000000000000000","nonce":"0x1a","to":"0xc100000000000000000000000000000000000000","transactionIndex":"0x0","value":"0x3e8","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x809462a48d8173bb83069f0febeefc6eed7970f0117d51388032a58affa31cf1","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0xc484","hash":"0xd0c5fd33e2d9e01d2104ecd458fdccd824e92c21e42517df31a90c2bc2439112","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4d","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x024266fdf79811c63c00db547fc9365c1021c8bd9e83b75fffc66ef895113b66","receiptsRoot":"0xe7e5e1065fa5ff9117f0cb1c9dfcd1dbcfcc27d9c2bb0f28bdab3122a54fa411","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x3c8","stateRoot":"0xe63e34df4a04cf6dcc54370e801658ed0593ea910857b1efa096b9f199dababf","timestamp":"0x4be","transactions":[{"blockHash":"0xd0c5fd33e2d9e01d2104ecd458fdccd824e92c21e42517df31a90c2bc2439112","blockNumber":"0x4d","blockTimestamp":"0x4be","from":"0xc100000000000000000000000000000000000000","gas":"0x2f0a36d","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xef4339abaf9be9d7504baa57679f107e1b05a0e39e5d32a7810d4885e14454d9","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000","nonce":"0x2","to":"0x0000000000000000000000000000000000000001","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0xd0c5fd33e2d9e01d2104ecd458fdccd824e92c21e42517df31a90c2bc2439112","blockNumber":"0x4d","blockTimestamp":"0x4be","from":"0xc100000000000000000000000000000000000000","gas":"0x2f04335","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x241b9eecf0b43310ffe71171abc8332092776352698879f2acf6819f24c9f407","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9","nonce":"0x3","to":"0x0000000000000000000000000000000000000001","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0x8c162537281b9a14a0890408516022080e6336d3928114291b95dcdf750fcd60","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},{"baseFeePerGas":"0x0","blobGasUsed":"0x0","calls":[{"returnData":"0x","logs":[],"gasUsed":"0x6038","maxUsedGas":"0x6038","status":"0x1"},{"returnData":"0x000000000000000000000000b11cad98ad3f8114e0b3a1f6e7228bc8424df48a","logs":[],"gasUsed":"0x644c","maxUsedGas":"0x644c","status":"0x1"},{"returnData":"0x","logs":[],"gasUsed":"0x6266","maxUsedGas":"0x6266","status":"0x1"}],"difficulty":"0x0","excessBlobGas":"0x0","extraData":"0x","gasLimit":"0x47e7c40","gasUsed":"0x126ea","hash":"0x2439f272a07e6283cc8629d9a68f0b9c15f770f9b5fbd9b446b145bb82a2cb9d","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0xc200000000000000000000000000000000000000","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","number":"0x4e","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0xd0c5fd33e2d9e01d2104ecd458fdccd824e92c21e42517df31a90c2bc2439112","receiptsRoot":"0xb0864511e526165945eaf5efb38cc8b2b705d55cf210fcb629e3e43b73715474","requestsHash":"0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x47a","stateRoot":"0xbf65a272c42abd238cacb311f374968bae35ccba7d2f83b5dbe4c9e8f1879e06","timestamp":"0x4ca","transactions":[{"blockHash":"0x2439f272a07e6283cc8629d9a68f0b9c15f770f9b5fbd9b446b145bb82a2cb9d","blockNumber":"0x4e","blockTimestamp":"0x4ca","from":"0xc100000000000000000000000000000000000000","gas":"0x2efdee9","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x8cffcefa3b5b59ca8e7a7984aad6c903e7b8bfa641c30e1633f3407c47bc5094","input":"0x4554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b45544800000000000000000000000000000000000000000000000000000000004554480000000000000000000000000000000000000000000000000000000000","nonce":"0x4","to":"0x0000000000000000000000000000000000123456","transactionIndex":"0x0","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x2439f272a07e6283cc8629d9a68f0b9c15f770f9b5fbd9b446b145bb82a2cb9d","blockNumber":"0x4e","blockTimestamp":"0x4ca","from":"0xc100000000000000000000000000000000000000","gas":"0x2ef7eb1","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0x804c006d30183864672cbfd1195b0e0c813b1bcdf11ea4b5b67e0cafa9ecc9cf","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9","nonce":"0x5","to":"0x0000000000000000000000000000000000123456","transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"},{"blockHash":"0x2439f272a07e6283cc8629d9a68f0b9c15f770f9b5fbd9b446b145bb82a2cb9d","blockNumber":"0x4e","blockTimestamp":"0x4ca","from":"0xc100000000000000000000000000000000000000","gas":"0x2ef1a65","gasPrice":"0x0","maxFeePerGas":"0x0","maxPriorityFeePerGas":"0x0","hash":"0xea5843904756a9a6eb1ab9174124b1affba4d522e52e6f1c3d43e42b061a174e","input":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8000000000000000000000000000000000000000000000000000000000000001cb7cf302145348387b9e69fde82d8e634a0f8761e78da3bfa059efced97cbed0d2a66b69167cafe0ccfc726aec6ee393fea3cf0e4f3f9c394705e0f56d9bfe1c9","nonce":"0x6","to":"0x0000000000000000000000000000000000000001","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0xc72dd9d5e883e","v":"0x0","r":"0x0","s":"0x0","yParity":"0x0"}],"transactionsRoot":"0xc3f74dba35bc91d16bf23077a7d68abfd4d5d77d4af5d399182222c96cf86980","uncles":[],"withdrawals":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"}]} diff --git a/tests/integration_tests/spec/test_simulate.py b/tests/integration_tests/spec/test_simulate.py new file mode 100644 index 0000000000..f51cc8b611 --- /dev/null +++ b/tests/integration_tests/spec/test_simulate.py @@ -0,0 +1,174 @@ +import json +import os +import time +import urllib.request + +import pytest + +SPEC_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "eth_simulateV1") + + +def _collect_spec_files(): + if not os.path.isdir(SPEC_DIR): + return [] + return sorted(f[:-3] for f in os.listdir(SPEC_DIR) if f.endswith(".io")) + + +SPEC_FILES = _collect_spec_files() + + +def _parse_spec_file(spec_name): + filepath = os.path.join(SPEC_DIR, spec_name + ".io") + request_line = None + expected_line = None + with open(filepath) as f: + for line in f: + line = line.strip() + if line.startswith(">> "): + request_line = line[3:] + elif line.startswith("<< "): + expected_line = line[3:] + return request_line, expected_line + + +def _send_rpc(endpoint, request_body): + req = urllib.request.Request( + endpoint, + data=request_body.encode(), + headers={"Content-Type": "application/json"}, + ) + with urllib.request.urlopen(req, timeout=30) as resp: + return json.loads(resp.read().decode()) + + +def _compare_results(expected, actual): + """Structurally compare eth_simulateV1 responses. + + Returns None on match, or a human-readable mismatch description. + """ + exp_type = "result" if "result" in expected else "error" + act_type = "result" if "result" in actual else "error" + + if exp_type != act_type: + return f"expected {exp_type} response, got {act_type}" + + if exp_type == "result": + er = expected.get("result", []) + ar = actual.get("result", []) + if len(er) != len(ar): + return f"block count: expected={len(er)} got={len(ar)}" + + for i, (eb, ab) in enumerate(zip(er, ar)): + ec = eb.get("calls", []) + ac = ab.get("calls", []) + if len(ec) != len(ac): + return f"block[{i}] call count: expected={len(ec)} got={len(ac)}" + for j, (ecall, acall) in enumerate(zip(ec, ac)): + es = ecall.get("status", "") + as_ = acall.get("status", "") + if es != as_: + return f"block[{i}].call[{j}] status: expected={es} got={as_}" + return None + else: + ec = expected.get("error", {}).get("code", 0) + ac = actual.get("error", {}).get("code", 0) + if ec != ac: + return f"error code: expected={ec} got={ac}" + return None + + +def _get_base_timestamp(endpoint): + """Fetch the latest block's timestamp from the chain.""" + resp = _send_rpc( + endpoint, + json.dumps( + { + "jsonrpc": "2.0", + "id": 99, + "method": "eth_getBlockByNumber", + "params": ["latest", False], + } + ), + ) + return int(resp["result"]["timestamp"], 16) + + +def _adjust_timestamps(request_body, base_timestamp): + """Offset explicit blockOverrides.time values so they are above base_timestamp. + + Spec files were authored against geth whose blocks have very low + timestamps (~0-50). Ethermint uses real wall-clock timestamps. If + any explicit timestamp in the request is at or below the base block + timestamp, we shift ALL explicit timestamps upward by a constant + delta so that relative ordering between blocks is preserved while + the first timestamp exceeds the base. + """ + req = json.loads(request_body) + params = req.get("params", []) + if not params or not isinstance(params[0], dict): + return request_body + + block_state_calls = params[0].get("blockStateCalls", []) + explicit_times = [] + for bsc in block_state_calls: + bo = bsc.get("blockOverrides") or {} + t = bo.get("time") + if t is not None: + explicit_times.append(int(t, 16) if isinstance(t, str) else t) + + if not explicit_times: + return request_body + + min_time = min(explicit_times) + if min_time > base_timestamp: + return request_body + + delta = base_timestamp - min_time + 12 + + for bsc in block_state_calls: + bo = bsc.get("blockOverrides") or {} + t = bo.get("time") + if t is not None: + old_val = int(t, 16) if isinstance(t, str) else t + bo["time"] = hex(old_val + delta) + bsc["blockOverrides"] = bo + + return json.dumps(req) + + +@pytest.fixture(scope="module") +def rpc_endpoint(ethermint): + """Wait for the chain to reach block 45, then return the JSON-RPC URL.""" + w3 = ethermint.w3 + for _ in range(480): + try: + if w3.eth.block_number >= 45: + break + except Exception: + pass + time.sleep(0.5) + else: + raise TimeoutError("ethermint did not reach block 45 within timeout") + return ethermint.w3_http_endpoint + + +@pytest.fixture(scope="module") +def base_timestamp(rpc_endpoint): + """Cache the base block timestamp once per module.""" + return _get_base_timestamp(rpc_endpoint) + + +@pytest.mark.parametrize("spec_name", SPEC_FILES) +def test_eth_simulate_spec(rpc_endpoint, base_timestamp, spec_name): + request_body, expected_body = _parse_spec_file(spec_name) + assert request_body, f"no request line (>> ...) in {spec_name}.io" + assert expected_body, f"no expected response line (<< ...) in {spec_name}.io" + + expected = json.loads(expected_body) + + if "result" in expected: + request_body = _adjust_timestamps(request_body, base_timestamp) + actual = _send_rpc(rpc_endpoint, request_body) + + mismatch = _compare_results(expected, actual) + assert mismatch is None, f"{spec_name}: {mismatch}" diff --git a/tests/integration_tests/test_account.py b/tests/integration_tests/test_account.py index b18028f7a7..3dc58b19f4 100644 --- a/tests/integration_tests/test_account.py +++ b/tests/integration_tests/test_account.py @@ -1,5 +1,5 @@ import pytest -from web3 import Web3 +from web3 import Web3, exceptions from .network import setup_ethermint from .utils import ADDRS, derive_new_account, w3_wait_for_new_blocks @@ -51,7 +51,7 @@ def test_query_future_blk(cluster): acc = derive_new_account(2).address current = w3.eth.block_number future = current + 1000 - with pytest.raises(ValueError) as exc: + with pytest.raises(exceptions.Web3RPCError) as exc: w3.eth.get_transaction_count(acc, hex(future)) print(acc, str(exc)) assert "-32000" in str(exc) diff --git a/tests/integration_tests/test_batch.py b/tests/integration_tests/test_batch.py index ce006669a3..010e1a6bb2 100644 --- a/tests/integration_tests/test_batch.py +++ b/tests/integration_tests/test_batch.py @@ -1,5 +1,7 @@ import json +from web3 import Web3 + from .utils import ADDRS, CONTRACTS, build_batch_tx, contract_address @@ -51,9 +53,12 @@ def test_batch_tx(ethermint): == receipts[0].gasUsed + receipts[1].gasUsed + receipts[2].gasUsed ) + # check nonce + assert w3.eth.get_transaction_count(sender) == nonce + 3 + # check traceTransaction rsps = [ - w3.provider.make_request("debug_traceTransaction", [h.hex()])["result"] + w3.provider.make_request("debug_traceTransaction", [Web3.to_hex(h)])["result"] for h in tx_hashes ] @@ -72,3 +77,62 @@ def test_batch_tx(ethermint): txs = w3.eth.get_block(receipts[0].blockNumber, True).transactions for i in range(3): assert txs[i].transactionIndex == i + + +def test_multisig(ethermint, tmp_path): + cli = ethermint.cosmos_cli() + cli.make_multisig("multitest1", "signer1", "signer2") + multi_addr = cli.address("multitest1") + signer1 = cli.address("signer1") + denom = "aphoton" + amt = 2000000000000000000 + rsp = cli.transfer(signer1, multi_addr, f"{amt}{denom}") + assert rsp["code"] == 0, rsp["raw_log"] + assert cli.balance(multi_addr, denom=denom) == amt + + acc = cli.account(multi_addr)["account"]["value"]["base_account"] + res = cli.account_by_num(acc["account_number"]) + assert res["account_address"] == multi_addr + + m_txt = tmp_path / "m.txt" + p1_txt = tmp_path / "p1.txt" + p2_txt = tmp_path / "p2.txt" + tx_txt = tmp_path / "tx.txt" + amt = 1 + signer2 = cli.address("signer2") + multi_tx = cli.transfer( + multi_addr, + signer2, + f"{amt}{denom}", + generate_only=True, + ) + json.dump(multi_tx, m_txt.open("w")) + signature1 = cli.sign_multisig_tx(m_txt, multi_addr, "signer1") + json.dump(signature1, p1_txt.open("w")) + signature2 = cli.sign_multisig_tx(m_txt, multi_addr, "signer2") + json.dump(signature2, p2_txt.open("w")) + final_multi_tx = cli.combine_multisig_tx( + m_txt, + "multitest1", + p1_txt, + p2_txt, + ) + json.dump(final_multi_tx, tx_txt.open("w")) + rsp = cli.broadcast_tx(tx_txt) + assert rsp["code"] == 0, rsp["raw_log"] + assert ( + cli.account(multi_addr)["account"]["value"]["base_account"]["address"] + == acc["address"] + ) + + +def test_textual(ethermint): + cli = ethermint.cosmos_cli() + rsp = cli.transfer( + cli.address("validator"), + cli.address("signer2"), + "1aphoton", + sign_mode="textual", + ) + print("mm-rsp", rsp) + assert rsp["code"] == 0, rsp["raw_log"] diff --git a/tests/integration_tests/test_block.py b/tests/integration_tests/test_block.py new file mode 100644 index 0000000000..68c97ac3cb --- /dev/null +++ b/tests/integration_tests/test_block.py @@ -0,0 +1,36 @@ +from eth_utils.crypto import keccak +from web3 import Web3 + +from .utils import ADDRS, CONTRACTS, deploy_contract, w3_wait_for_new_blocks + + +def test_call(ethermint): + w3 = ethermint.w3 + contract, res = deploy_contract(w3, CONTRACTS["TestBlockTxProperties"]) + height = w3.eth.get_block_number() + w3_wait_for_new_blocks(w3, 1) + res = Web3.to_hex(contract.caller.getBlockHash(height)) + blk = w3.eth.get_block(height) + assert res == Web3.to_hex(blk.hash), res + + +def test_block_tx_properties(ethermint): + w3 = ethermint.w3 + contract, _ = deploy_contract(w3, CONTRACTS["TestBlockTxProperties"]) + acc = ADDRS["community"] + gas_price = w3.eth.gas_price + tx_hash = contract.functions.emitTxDetails().transact( + {"from": acc, "gas": 200000, "gasPrice": gas_price} + ) + tx_hash = Web3.to_hex(tx_hash) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + tx_details_event = contract.events.TxDetailsEvent().process_receipt(tx_receipt) + assert tx_details_event is not None + data = tx_details_event[0]["args"] + print("event_data: ", data) + assert data["origin"].lower() == acc.lower() + assert data["sender"].lower() == acc.lower() + assert data["value"] == 0 + expected_sig = keccak(b"emitTxDetails()")[:4] + assert data["sig"] == data["data"] == expected_sig + assert data["gasprice"] == gas_price diff --git a/tests/integration_tests/test_call.py b/tests/integration_tests/test_call.py index cb49d253a9..cbb1a5d0b2 100644 --- a/tests/integration_tests/test_call.py +++ b/tests/integration_tests/test_call.py @@ -1,26 +1,40 @@ import json -from hexbytes import HexBytes from web3 import Web3 from web3._utils.contracts import encode_transaction_data -from .utils import CONTRACTS, deploy_contract +from .bytecode_deployer import deploy_runtime_bytecode +from .utils import ACCOUNTS, CONTRACTS, deploy_contract, send_transaction + +EVM_WORD_BITS = 256 + +# Known-good P256VERIFY vector from go-ethereum's p256Verify precompile tests. +# Input layout is message_hash || signature_r || signature_s || public_key_x || +# public_key_y, each encoded as one 32-byte big-endian word. +P256VERIFY_VALID_VECTOR = { + "message_hash": "4cee90eb86eaa050036147a12d49004b6b9c72bd725d39d4785011fe190f0b4d", + "signature_r": "a73bd4903f0ce3b639bbbf6e8e80d16931ff4bcf5993d58468e8fb19086e8cac", + "signature_s": "36dbcd03009df8c59286b162af3bd7fcc0450c9aa81be5d10d312af6c66b1d60", + "public_key_x": "4aebd3099c618202fcfe16ae7770b0c49ab5eadf74b754204a3bb6060e44eff3", + "public_key_y": "7618b065f9832de4ca6ca971a7a1adc826d0f7c00181a5fb2ddf79ae00b4e10e", +} +P256VERIFY_INPUT_LENGTH = 5 * 32 def test_temporary_contract_code(ethermint): state = 100 w3: Web3 = ethermint.w3 info = json.loads(CONTRACTS["Greeter"].read_text()) - data = encode_transaction_data(w3, "intValue", info["abi"]) + data = encode_transaction_data( + w3, "intValue", contract_abi=info["abi"], args=[], kwargs={} + ) # call an arbitrary address address = w3.to_checksum_address("0x0000000000000000000000000000ffffffffffff") overrides = { address: { "code": info["deployedBytecode"], "state": { - ("0x" + "0" * 64): HexBytes( - w3.codec.encode(("uint256",), (state,)) - ).hex(), + ("0x" + "0" * 64): Web3.to_hex(w3.codec.encode(("uint256",), (state,))), }, }, } @@ -45,12 +59,14 @@ def test_override_state(ethermint): info = json.loads(CONTRACTS["Greeter"].read_text()) int_value = 100 state = { - ("0x" + "0" * 64): HexBytes(w3.codec.encode(("uint256",), (int_value,))).hex(), + ("0x" + "0" * 64): Web3.to_hex(w3.codec.encode(("uint256",), (int_value,))), } result = w3.eth.call( { "to": contract.address, - "data": encode_transaction_data(w3, "intValue", info["abi"]), + "data": encode_transaction_data( + w3, "intValue", contract_abi=info["abi"], args=[], kwargs={} + ), }, "latest", { @@ -66,7 +82,9 @@ def test_override_state(ethermint): result = w3.eth.call( { "to": contract.address, - "data": encode_transaction_data(w3, "greet", info["abi"]), + "data": encode_transaction_data( + w3, "greet", contract_abi=info["abi"], args=[], kwargs={} + ), }, "latest", { @@ -82,7 +100,9 @@ def test_override_state(ethermint): result = w3.eth.call( { "to": contract.address, - "data": encode_transaction_data(w3, "greet", info["abi"]), + "data": encode_transaction_data( + w3, "greet", contract_abi=info["abi"], args=[], kwargs={} + ), }, "latest", { @@ -102,3 +122,80 @@ def test_opcode(ethermint): ) res = contract.caller.randomTokenId() assert res > 0, res + + +def test_blob_base_fee_opcode(ethermint): + w3 = ethermint.w3 + # Bytecode: BLOBBASEFEE(0x4a), PUSH1 0, MSTORE, PUSH1 32, PUSH1 0, RETURN + code = "0x4a60005260206000f3" + address = w3.to_checksum_address("0x0000000000000000000000000000000000000042") + overrides = {address: {"code": code}} + result = w3.eth.call({"to": address, "data": "0x"}, "latest", overrides) + assert ( + int.from_bytes(result, "big") == 0 + ), f"expected BLOBBASEFEE to return 0, got {result.hex()}" + + +def test_blob_base_fee_deployed_contract(ethermint): + w3 = ethermint.w3 + # Runtime bytecode: BLOBBASEFEE PUSH1 0 MSTORE PUSH1 32 PUSH1 0 RETURN + runtime_bytecode = "0x4a60005260206000f3" + + sender = ACCOUNTS["validator"] + contract_address = deploy_runtime_bytecode(w3, runtime_bytecode, sender, sender) + + deployed_code = w3.eth.get_code(contract_address, "latest") + assert ( + deployed_code.hex() == runtime_bytecode[2:] + ), f"unexpected deployed code: {deployed_code.hex()}" + + result = w3.eth.call({"to": contract_address, "data": "0x"}, "latest") + assert len(result) == 32, f"expected 32-byte return value, got {len(result)} bytes" + assert ( + int.from_bytes(result, "big") == 0 + ), f"expected BLOBBASEFEE to return 0, got {result.hex()}" + + +def test_osaka_clz_opcode_and_p256verify_precompile(ethermint): + def evm_word(value): + return value.to_bytes(32, "big") + + def clz_expected(value): + return EVM_WORD_BITS - value.bit_length() + + def p256verify_input(vector): + return bytes.fromhex("".join(vector.values())) + + w3 = ethermint.w3 + contract, _ = deploy_contract( + w3, + CONTRACTS["Osaka"], + ) + + tx = contract.functions.deployClzContract().build_transaction() + receipt = send_transaction(w3, tx) + deployed_event = contract.events.ClzContractDeployed().process_receipt(receipt)[0] + clz_address = deployed_event["args"]["deployedAddress"] + + clz_inputs = ( + 0, + 1, + 1 << 128, + 1 << (EVM_WORD_BITS - 1), + (1 << EVM_WORD_BITS) - 1, + ) + for value in clz_inputs: + result = w3.eth.call( + {"to": clz_address, "data": evm_word(value)}, + "latest", + ) + assert int.from_bytes(result, "big") == clz_expected(value) + + p256_valid_input = p256verify_input(P256VERIFY_VALID_VECTOR) + assert len(p256_valid_input) == P256VERIFY_INPUT_LENGTH + + assert contract.functions.verifyP256(p256_valid_input).call(), ( + "expected Osaka P256VERIFY precompile at " + "0x0000000000000000000000000000000000000100 to verify the secp256r1 " + "signature" + ) diff --git a/tests/integration_tests/test_debug_traceblock.py b/tests/integration_tests/test_debug_traceblock.py index 2e83fdd069..57bec4dfcb 100644 --- a/tests/integration_tests/test_debug_traceblock.py +++ b/tests/integration_tests/test_debug_traceblock.py @@ -5,6 +5,7 @@ derive_new_account, send_transaction, sign_transaction, + w3_wait_for_block, wait_for_new_blocks, ) @@ -33,7 +34,7 @@ def test_traceblock(ethermint): "nonce": nonce + n, } signed = sign_transaction(w3, tx, acc.key) - txhash = w3.eth.send_raw_transaction(signed.rawTransaction) + txhash = w3.eth.send_raw_transaction(signed.raw_transaction) txhashes.append(txhash) for txhash in txhashes[0 : total - 1]: res = w3.eth.wait_for_transaction_receipt(txhash) @@ -56,3 +57,4 @@ def trace_blk(blk): if total < expected: total += len(trace_blk(blk + 1)) assert total == expected + w3_wait_for_block(w3, w3.eth.block_number + 3, timeout=30) diff --git a/tests/integration_tests/test_estimate_gas.py b/tests/integration_tests/test_estimate_gas.py index 9db5876d40..e931ff1040 100644 --- a/tests/integration_tests/test_estimate_gas.py +++ b/tests/integration_tests/test_estimate_gas.py @@ -39,8 +39,9 @@ def process(w3): def test_out_of_gas_error(ethermint, geth): - iterations = 1 - gas = 21204 + # increase gas to pass EIP-7623: Floor Data Gas + iterations = 10 + gas = 21510 def process(w3): contract, _ = deploy_contract(w3, CONTRACTS["TestMessageCall"]) diff --git a/tests/integration_tests/test_fee_history.py b/tests/integration_tests/test_fee_history.py index 22f21d5b9b..e4fd9ba7d5 100644 --- a/tests/integration_tests/test_fee_history.py +++ b/tests/integration_tests/test_fee_history.py @@ -1,5 +1,4 @@ import hashlib -import json from concurrent.futures import ThreadPoolExecutor, as_completed from pathlib import Path @@ -9,9 +8,9 @@ from .network import setup_custom_ethermint from .utils import ( ADDRS, - approve_proposal, eth_to_bech32, send_transaction, + submit_gov_proposal, w3_wait_for_block, w3_wait_for_new_blocks, ) @@ -167,29 +166,22 @@ def update_feemarket_param(node, tmp_path, new_multiplier=2, new_denominator=200 p["base_fee"] = new_base_fee p["elasticity_multiplier"] = new_multiplier p["base_fee_change_denominator"] = new_denominator - proposal = tmp_path / "proposal.json" + # governance module account as signer data = hashlib.sha256("gov".encode()).digest()[:20] - signer = eth_to_bech32(data) - proposal_src = { - "messages": [ + authority = eth_to_bech32(data) + submit_gov_proposal( + node, + tmp_path, + messages=[ { "@type": "/ethermint.feemarket.v1.MsgUpdateParams", - "authority": signer, + "authority": authority, "params": p, } ], - "deposit": "2aphoton", - "title": "title", - "summary": "summary", - } - proposal.write_text(json.dumps(proposal_src)) - rsp = cli.submit_gov_proposal(proposal, from_="community") - assert rsp["code"] == 0, rsp["raw_log"] - approve_proposal(node, rsp) - print("check params have been updated now") + ) p = cli.get_params("feemarket")["params"] - assert p["base_fee"] == new_base_fee assert p["elasticity_multiplier"] == new_multiplier assert p["base_fee_change_denominator"] == new_denominator diff --git a/tests/integration_tests/test_filters.py b/tests/integration_tests/test_filters.py index 2f30339b93..32cb059cef 100644 --- a/tests/integration_tests/test_filters.py +++ b/tests/integration_tests/test_filters.py @@ -85,25 +85,24 @@ def test_get_logs_by_topic(cluster): # The getLogs method under the hood works as a filter # with the specified topics and a block range. # If the block range is not specified, it defaults - # to fromBlock: "latest", toBlock: "latest". + # to from_block: "latest", toBlock: "latest". # Then, if we make a getLogs call within the same block that the tx # happened, we will get a log in the result. However, if we make the call # one or more blocks later, the result will be an empty array. - logs = w3.eth.get_logs({"topics": [topic.hex()]}) + logs = w3.eth.get_logs({"topics": [Web3.to_hex(topic)]}) assert len(logs) == 1 assert logs[0]["address"] == contract.address w3_wait_for_new_blocks(w3, 2) - logs = w3.eth.get_logs({"topics": [topic.hex()]}) + logs = w3.eth.get_logs({"topics": [Web3.to_hex(topic)]}) assert len(logs) == 0 - # return logs when to block is newer than latest - end = start + 2000 + end = "latest" logs = w3.eth.get_logs( { - "fromBlock": hex(start), - "toBlock": hex(end), + "fromBlock": start, + "toBlock": end, "address": [contract.address], } ) @@ -159,7 +158,7 @@ def test_event_log_filter_by_contract(cluster): # Create new filter from contract current_height = hex(w3.eth.get_block_number()) - flt = contract.events.ChangeGreeting.create_filter(fromBlock=current_height) + flt = contract.events.ChangeGreeting.create_filter(from_block=current_height) # without tx assert flt.get_new_entries() == [] # GetFilterChanges @@ -224,11 +223,11 @@ def test_event_log_filter_by_topic(cluster): { "name": "one contract emiting one topic", "filters": [ - {"topics": [CHANGE_GREETING_TOPIC.hex()]}, + {"topics": [Web3.to_hex(CHANGE_GREETING_TOPIC)]}, { "fromBlock": 1, "toBlock": "latest", - "topics": [CHANGE_GREETING_TOPIC.hex()], + "topics": [Web3.to_hex(CHANGE_GREETING_TOPIC)], }, ], "exp_len": 1, @@ -239,12 +238,12 @@ def test_event_log_filter_by_topic(cluster): "name": "multiple contracts emitting same topic", "filters": [ { - "topics": [CHANGE_GREETING_TOPIC.hex()], + "topics": [Web3.to_hex(CHANGE_GREETING_TOPIC)], }, { "fromBlock": 1, "toBlock": "latest", - "topics": [CHANGE_GREETING_TOPIC.hex()], + "topics": [Web3.to_hex(CHANGE_GREETING_TOPIC)], }, ], "exp_len": 5, @@ -255,12 +254,22 @@ def test_event_log_filter_by_topic(cluster): "name": "multiple contracts emitting different topics", "filters": [ { - "topics": [[CHANGE_GREETING_TOPIC.hex(), TRANSFER_TOPIC.hex()]], + "topics": [ + [ + Web3.to_hex(CHANGE_GREETING_TOPIC), + Web3.to_hex(TRANSFER_TOPIC), + ] + ], }, { "fromBlock": 1, "toBlock": "latest", - "topics": [[CHANGE_GREETING_TOPIC.hex(), TRANSFER_TOPIC.hex()]], + "topics": [ + [ + Web3.to_hex(CHANGE_GREETING_TOPIC), + Web3.to_hex(TRANSFER_TOPIC), + ] + ], }, ], "exp_len": 3, # 2 transfer events, mint&transfer on deploy (2)tx in test @@ -354,14 +363,14 @@ def test_multiple_filters(cluster): "exp_len": 1, }, { - "params": {"topics": [topic.hex()]}, + "params": {"topics": [Web3.to_hex(topic)]}, "exp_len": 1, }, { "params": { "topics": [ - topic.hex(), - another_topic.hex(), + Web3.to_hex(topic), + Web3.to_hex(another_topic), ], # 'with all topics' condition }, "exp_len": 0, @@ -369,7 +378,7 @@ def test_multiple_filters(cluster): { "params": { "topics": [ - [topic.hex(), another_topic.hex()] + [Web3.to_hex(topic), Web3.to_hex(another_topic)] ], # 'with any topic' condition }, "exp_len": 1, @@ -377,7 +386,7 @@ def test_multiple_filters(cluster): { "params": { "address": contract.address, - "topics": [[topic.hex(), another_topic.hex()]], + "topics": [[Web3.to_hex(topic), Web3.to_hex(another_topic)]], }, "exp_len": 1, }, @@ -386,7 +395,7 @@ def test_multiple_filters(cluster): "fromBlock": 1, "toBlock": 2, "address": contract.address, - "topics": [[topic.hex(), another_topic.hex()]], + "topics": [[Web3.to_hex(topic), Web3.to_hex(another_topic)]], }, "exp_len": 0, }, @@ -395,7 +404,7 @@ def test_multiple_filters(cluster): "fromBlock": 1, "toBlock": "latest", "address": contract.address, - "topics": [[topic.hex(), another_topic.hex()]], + "topics": [[Web3.to_hex(topic), Web3.to_hex(another_topic)]], }, "exp_len": 1, }, @@ -403,7 +412,7 @@ def test_multiple_filters(cluster): "params": { "fromBlock": 1, "toBlock": "latest", - "topics": [[topic.hex(), another_topic.hex()]], + "topics": [[Web3.to_hex(topic), Web3.to_hex(another_topic)]], }, "exp_len": 1, }, @@ -513,14 +522,14 @@ def test_register_filters_before_contract_deploy(cluster): filters = [ { - "params": {"topics": [topic.hex()]}, + "params": {"topics": [Web3.to_hex(topic)]}, "exp_len": 1, }, { "params": { "topics": [ - topic.hex(), - another_topic.hex(), + Web3.to_hex(topic), + Web3.to_hex(another_topic), ], # 'with all topics' condition }, "exp_len": 0, @@ -528,7 +537,7 @@ def test_register_filters_before_contract_deploy(cluster): { "params": { "topics": [ - [topic.hex(), another_topic.hex()] + [Web3.to_hex(topic), Web3.to_hex(another_topic)] ], # 'with any topic' condition }, "exp_len": 1, @@ -537,7 +546,7 @@ def test_register_filters_before_contract_deploy(cluster): "params": { "fromBlock": 1, "toBlock": "latest", - "topics": [[topic.hex(), another_topic.hex()]], + "topics": [[Web3.to_hex(topic), Web3.to_hex(another_topic)]], }, "exp_len": 1, }, @@ -633,13 +642,13 @@ def test_get_logs(cluster): }, { "name": "get logs by topic", - "logs": w3.eth.get_logs({"topics": [topic.hex()]}), + "logs": w3.eth.get_logs({"topics": [Web3.to_hex(topic)]}), "exp_log": True, "exp_len": 1, }, { "name": "get logs by incorrect topic - should not have logs", - "logs": w3.eth.get_logs({"topics": [another_topic.hex()]}), + "logs": w3.eth.get_logs({"topics": [Web3.to_hex(another_topic)]}), "exp_log": False, "exp_len": 0, }, @@ -648,8 +657,8 @@ def test_get_logs(cluster): "logs": w3.eth.get_logs( { "topics": [ - topic.hex(), - another_topic.hex(), + Web3.to_hex(topic), + Web3.to_hex(another_topic), ] } ), @@ -658,7 +667,9 @@ def test_get_logs(cluster): }, { "name": "get logs by multiple topics ('match any' condition)", - "logs": w3.eth.get_logs({"topics": [[topic.hex(), another_topic.hex()]]}), + "logs": w3.eth.get_logs( + {"topics": [[Web3.to_hex(topic), Web3.to_hex(another_topic)]]} + ), "exp_log": True, "exp_len": 1, }, @@ -668,7 +679,7 @@ def test_get_logs(cluster): { "fromBlock": tx_block_num, "toBlock": "latest", - "topics": [topic.hex()], + "topics": [Web3.to_hex(topic)], } ), "exp_log": True, diff --git a/tests/integration_tests/test_gas.py b/tests/integration_tests/test_gas.py index 9ab4c5480f..7bbe845599 100644 --- a/tests/integration_tests/test_gas.py +++ b/tests/integration_tests/test_gas.py @@ -1,6 +1,7 @@ from pathlib import Path import pytest +from web3 import exceptions from .network import setup_custom_ethermint from .utils import ( @@ -8,6 +9,8 @@ CONTRACTS, KEYS, deploy_contract, + derive_random_account, + fund_acc, send_transaction, w3_wait_for_new_blocks, ) @@ -108,6 +111,34 @@ def test_block_gas_limit(ethermint): return +# EIP-7623: Floor Data Gas +def test_floor_data_gas_error(ethermint, geth): + iterations = 1 + acc = derive_random_account() + gas = 21204 + + def process(w3): + fund_acc(w3, acc) + contract, _ = deploy_contract(w3, CONTRACTS["TestMessageCall"], key=acc.key) + tx = contract.functions.test(iterations).build_transaction({"gas": gas}) + res = send_transaction(w3, tx) + return res + + providers = [ethermint.w3, geth.w3] + exceptions = [] + for w3 in providers: + try: + process(w3) + except Exception as e: + exceptions.append(e) + + assert len(exceptions) == len(providers) + expected_substring = "insufficient gas for floor data gas cost" + for exception in exceptions: + assert exception is not None, "Expected an exception but none was raised" + assert expected_substring in str(exception), exception + + @pytest.fixture(scope="module") def discard(request, tmp_path_factory): path = tmp_path_factory.mktemp("discard") @@ -117,6 +148,6 @@ def discard(request, tmp_path_factory): def test_discard_abci_responses(discard): - with pytest.raises(ValueError) as exc: + with pytest.raises(exceptions.Web3RPCError) as exc: discard.w3.eth.gas_price - assert "block result not found for height" in str(exc) + assert "header result not found for height" in str(exc) diff --git a/tests/integration_tests/test_grpc_only.py b/tests/integration_tests/test_grpc_only.py index 1fb0105c30..569e96d324 100644 --- a/tests/integration_tests/test_grpc_only.py +++ b/tests/integration_tests/test_grpc_only.py @@ -73,12 +73,12 @@ def test_grpc_mode(custom_ethermint): msg = { "to": contract.address, - "data": contract.encodeABI(fn_name="currentChainID"), + "data": contract.encode_abi(abi_element_identifier="currentChainID"), } api_port = ports.api_port(custom_ethermint.base_port(1)) def expect_cb(rsp): - ret = rsp["ret"] + ret = rsp.get("ret") valid = ret is not None return valid and 9000 == int.from_bytes(base64.b64decode(ret.encode()), "big") @@ -98,6 +98,7 @@ def expect_cb(rsp): "ethermintd", "start", "--grpc-only", + "--grpc.skip-check-header", "--home", custom_ethermint.base_dir / "node1", ], diff --git a/tests/integration_tests/test_indexer.py b/tests/integration_tests/test_indexer.py index 335773cc96..31b0b2c24e 100644 --- a/tests/integration_tests/test_indexer.py +++ b/tests/integration_tests/test_indexer.py @@ -28,7 +28,10 @@ def test_basic(pruned): def edit_app_cfgs(enable): pruned.supervisorctl("stop", "all") - overwrite = {"json-rpc": {"enable-indexer": enable}} + overwrite = { + "json-rpc": {"enable-indexer": enable}, + "grpc": {"skip-check-header": True}, + } for i in range(2): cluster.edit_app_cfg( pruned.cosmos_cli(i).data_dir / "config/app.toml", diff --git a/tests/integration_tests/test_legacy_eip712.py b/tests/integration_tests/test_legacy_eip712.py new file mode 100644 index 0000000000..57c0923ca6 --- /dev/null +++ b/tests/integration_tests/test_legacy_eip712.py @@ -0,0 +1,130 @@ +import json +from pathlib import Path +from typing import Any, Dict + +import pytest + +from .eip712_legacy_signer import LegacyEIP712Signer +from .network import setup_custom_ethermint +from .utils import KEYS + + +def generate_legacy_eip712_signed_tx( + private_key_hex: str, + chain_id: str, + account_number: int, + sequence: int, + delegator_address: str, + validator_address: str, + delegation_amount: str, + delegation_denom: str, + fee_amount: str, + fee_denom: str, + gas: int, +) -> Dict[str, Any]: + msgs = [ + { + "@type": "/cosmos.staking.v1beta1.MsgDelegate", + "delegator_address": delegator_address, + "validator_address": validator_address, + "amount": { + "denom": delegation_denom, + "amount": delegation_amount, + }, + }, + { + "@type": "/cosmos.staking.v1beta1.MsgUndelegate", + "delegator_address": delegator_address, + "validator_address": validator_address, + "amount": { + "denom": delegation_denom, + "amount": delegation_amount, + }, + }, + ] + + signer = LegacyEIP712Signer( + private_key=private_key_hex, + chain_id=chain_id, + fee_denom=fee_denom, + ) + + return signer.sign_tx( + msgs=msgs, + fee_payer=delegator_address, + account_number=account_number, + sequence=sequence, + gas=gas, + fee_amount=fee_amount, + ) + + +@pytest.fixture(scope="module") +def custom_ethermint(tmp_path_factory): + path = tmp_path_factory.mktemp("legacy_eip712") + config = Path(__file__).parent / "configs/default.jsonnet" + yield from setup_custom_ethermint(path, 26800, config) + + +@pytest.fixture(scope="module") +def cluster(request, custom_ethermint): + yield custom_ethermint + + +def test_legacy_eip712_mixed_msg(cluster): + cli = cluster.cosmos_cli() + + validators = cli.validators() + assert len(validators) > 0, "No validators found" + val_addr = validators[0]["operator_address"] + + delegator_name = "community" + delegator = cli.address(delegator_name) + delegator_key = KEYS[delegator_name] + private_key_hex = delegator_key.hex() + + account_info = cli.account(delegator) + + account = account_info.get("account") or account_info + + if "value" in account: + account_data = account["value"] + elif "base_account" in account: + account_data = account["base_account"] + else: + account_data = account + + account_number = int(account_data.get("account_number", 0)) + sequence = int(account_data.get("sequence", 0)) + + delegation_amount = "1000000" + fee_amount = "50000000000000000" + gas = 500000 + + signer_output = generate_legacy_eip712_signed_tx( + private_key_hex=private_key_hex, + chain_id=cli.chain_id, + account_number=account_number, + sequence=sequence, + delegator_address=delegator, + validator_address=val_addr, + delegation_amount=delegation_amount, + delegation_denom="stake", + fee_amount=fee_amount, + fee_denom="aphoton", + gas=gas, + ) + + if not signer_output.get("success"): + pytest.fail(f"Python signer error: {signer_output.get('error')}") + + tx_json = json.loads(signer_output["tx_json"]) + + rsp = cli.broadcast_tx_json(tx_json, broadcast_mode="sync") + code = rsp.get("code", 0) + raw_log = rsp.get("raw_log", "") + + assert code != 0, "Transaction with mixed message types should be rejected" + assert ( + "different types of messages detected" in raw_log + ), f"Expected error message not found: {raw_log}" diff --git a/tests/integration_tests/test_nonce_evm_call.py b/tests/integration_tests/test_nonce_evm_call.py new file mode 100644 index 0000000000..3ffea060bb --- /dev/null +++ b/tests/integration_tests/test_nonce_evm_call.py @@ -0,0 +1,659 @@ +""" +Integration test for EIP-7702 nonce management in nested CREATE operations. + +This test verifies the fix for incorrect contract address derivation when CREATE +opcodes are executed within the Call branch of ApplyMessageWithConfig. The bug +occurs because AnteHandler pre-increments nonces for all messages before execution, +but the Call branch needs to reset the nonce before executing CREATE opcodes. + +Background: +- AnteHandler increments nonces for all messages in a batch (N -> N+3) +- Each message should use its original nonce (msg.Nonce) for contract deployments +- Without the fix: All CREATEs use wrong address (post-batch nonce) +- With the fix: Each CREATE uses correct address (msg.Nonce) + +Test Coverage: +1. Single transaction with CREATE +2. Batched transactions with CREATEs +3. Single transaction with self-authorization + CREATE +4. Batched transactions with self-authorizations + CREATEs +""" + +from pathlib import Path + +import pytest +from hexbytes import HexBytes +from web3 import Web3 + +from .eip7702 import ( + address_to_delegation, + generate_signed_auth, + setup_eip7702_delegation, +) +from .network import setup_custom_ethermint +from .utils import ( + CONTRACTS, + build_batch_tx, + contract_address, + deploy_contract, + derive_new_account, + fund_acc, + w3_wait_for_new_blocks, +) + + +@pytest.fixture(scope="module") +def custom_ethermint(tmp_path_factory): + path = tmp_path_factory.mktemp("nonce_evm_call") + yield from setup_custom_ethermint( + path, 26600, Path(__file__).parent / "configs/default.jsonnet" + ) + + +@pytest.fixture(scope="module", params=["ethermint", "geth"]) +def cluster(request, custom_ethermint, geth): + """Run tests on both ethermint and geth.""" + provider = request.param + if provider == "ethermint": + yield custom_ethermint + elif provider == "geth": + yield geth + else: + raise NotImplementedError + + +def setup_contract_and_eip7702(w3, deployer_n, delegator_n): + """ + Common setup for EIP-7702 tests. + + Steps: + 1. Deploy DelegationTarget contract + 2. Create and fund delegator EOA + 3. Set up EIP-7702 delegation + 4. Verify delegation is correct + + Returns: + tuple: (delegation_target, delegator, initial_nonce, post_del_nonce) + """ + # Deploy the DelegationTarget contract + deployer = derive_new_account(n=deployer_n) + fund_acc(w3, deployer) + + delegation_target, _ = deploy_contract( + w3, CONTRACTS["DelegationTarget"], key=deployer.key + ) + delegate_addr = delegation_target.address + print(f"✓ DelegationTarget deployed at: {delegate_addr}") + + # Create an EOA that will be delegated to DelegationTarget + delegator = derive_new_account(n=delegator_n) + fund_acc(w3, delegator) + + w3_wait_for_new_blocks(w3, 1) + + initial_nonce = w3.eth.get_transaction_count(delegator.address) + print(f"✓ Delegator initial nonce: {initial_nonce}") + + # Set up EIP-7702 delegation + print("Setting up EIP-7702 delegation...") + setup_eip7702_delegation(w3, delegator, delegate_addr) + + w3_wait_for_new_blocks(w3, 1) + + # Verify delegation was set correctly + delegator_code = w3.eth.get_code(delegator.address, "latest") + expected_delegation = address_to_delegation(delegate_addr) + print(f"✓ Delegator code: {Web3.to_hex(delegator_code)}") + print(f"✓ Expected delegation: {expected_delegation}") + + assert delegator_code == HexBytes(expected_delegation), ( + f"Delegation not set correctly!\n" + f" Got: {Web3.to_hex(delegator_code)}\n" + f" Expected: {expected_delegation}" + ) + print("✓ Delegation verified successfully!") + + # Verify nonce was incremented by setcode tx (nonce+1 for tx, +1 for auth) + post_delegation_nonce = w3.eth.get_transaction_count(delegator.address) + expected_post_delegation = initial_nonce + 2 # +1 tx, +1 auth + print( + f"✓ Nonce after delegation: {post_delegation_nonce} " + f"(expected: {expected_post_delegation})" + ) + assert post_delegation_nonce == expected_post_delegation, ( + f"Nonce after delegation should be {expected_post_delegation}, " + f"got {post_delegation_nonce}" + ) + + w3_wait_for_new_blocks(w3, 1) + + return delegation_target, delegator, initial_nonce, post_delegation_nonce + + +def test_single_tx_create(cluster): + """ + Test 1: Single transaction with CREATE operation. + + Verifies that a single contract deployment through EIP-7702 delegated code + uses the correct msg.Nonce for address derivation. + + Step 1: Verify delegation is set up correctly (via common setup) + Step 2: Verify CREATE operation uses correct nonce + """ + w3: Web3 = cluster.w3 + + # STEP 1: Set up delegation (common setup) + delegation_target, delegator, initial_nonce, post_delegation_nonce = ( + setup_contract_and_eip7702(w3, deployer_n=100, delegator_n=101) + ) + + # STEP 2: Now test CREATE operation + # evm.Call increments nonce by 1 before execution, so any contract + # deployment embedded within the call will use the nonce+1 + deploy_nonce = w3.eth.get_transaction_count(delegator.address) + print( + f"\n✓ Starting evm.Call (with contract creation) test " + f"with nonce: {deploy_nonce}" + ) + + # Pre-calculate expected child contract address + expected_child_addr = contract_address(delegator.address, deploy_nonce + 1) + print( + f"✓ Expected child contract at: {expected_child_addr} " + f"(nonce={deploy_nonce + 1})" + ) + + # Use MinimalContract bytecode - simple contract that has runtime code + # This is the creation code that returns 1 byte of runtime (STOP opcode) + minimal_bytecode = "0x6001600C60003960016000F300" # Returns 1 byte: 0x00 (STOP) + + deploy_data = delegation_target.functions.deploy( + HexBytes(minimal_bytecode) + ).build_transaction({"gas": 0})["data"] + + tx = { + "chainId": w3.eth.chain_id, + "from": delegator.address, + "to": delegator.address, # Self-call to trigger delegated code + "value": 0, + "gas": 500000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": deploy_nonce, + "data": deploy_data, + } + + print("✓ Sending deployment transaction...") + signed_tx = delegator.sign_transaction(tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + assert receipt.status == 1, f"Deployment transaction failed: {receipt}" + print(f"✓ Deployment tx succeeded, gas used: {receipt.gasUsed}") + + w3_wait_for_new_blocks(w3, 1) + + # CRITICAL VERIFICATION: Check that child was deployed at correct address + child_code = w3.eth.get_code(expected_child_addr, "latest") + has_code = len(child_code) > 0 + print( + f"✓ Child at {expected_child_addr}: hasCode={has_code} " + f"(codeLen={len(child_code)})" + ) + + assert has_code, ( + f"Child should be deployed at {expected_child_addr} (nonce={deploy_nonce}), " + f"but no code found." + ) + + # Verify delegator's final nonce + final_nonce = w3.eth.get_transaction_count(delegator.address) + expected_final_nonce = deploy_nonce + 2 # +1 for tx, +1 for create embedded in call + print(f"✓ Delegator final nonce: {final_nonce} (expected: {expected_final_nonce})") + + assert ( + final_nonce == expected_final_nonce + ), f"Delegator nonce should be {expected_final_nonce}, got {final_nonce}" + + print("\n✅ All checks passed! Child deployed at correct address") + + +def test_batched_tx_create(cluster): + """ + Test 2: Batched transactions with CREATE operations. + + Verifies that multiple contract deployments in a batch transaction each use + their respective msg.Nonce (not the post-batch nonce) for address derivation. + + Step 1: Verify delegation is set up correctly (via common setup) + Step 2: Verify batched CREATE operations use correct nonces + + NOTE: This test only runs on Ethermint (batch transactions are Cosmos-specific). + """ + # Skip this test for geth (batch transactions are Cosmos-specific) + if not hasattr(cluster, "cosmos_cli"): + pytest.skip("Batch transactions only supported on Ethermint") + + w3: Web3 = cluster.w3 + cli = cluster.cosmos_cli() + + # STEP 1: Set up delegation (common setup) + delegation_target, delegator, initial_nonce, post_delegation_nonce = ( + setup_contract_and_eip7702(w3, deployer_n=110, delegator_n=111) + ) + + # STEP 2: Now test batched CREATE operations + # Get nonce before batch + batch_start_nonce = w3.eth.get_transaction_count(delegator.address) + print(f"\n✓ Starting batched CREATE test with nonce: {batch_start_nonce}") + + # Pre-calculate expected child contract addresses + + # AnteHandler increments nonces for all messages upfront + num_messages = 3 + expected_child_addresses = [] + for i in range(num_messages): + msg_nonce = batch_start_nonce + i + create_nonce = batch_start_nonce + num_messages + i + child_addr = contract_address(delegator.address, create_nonce) + expected_child_addresses.append(child_addr) + print( + f"✓ Expected child {i} at create_nonce {create_nonce} " + f"(msg_nonce={msg_nonce}): {child_addr}" + ) + + # Build batch transaction: each deploys a contract + # Use MinimalContract bytecode - simple contract that has runtime code + minimal_bytecode = "0x6001600C60003960016000F300" # Returns 1 byte: 0x00 (STOP) + deploy_data = delegation_target.functions.deploy( + HexBytes(minimal_bytecode) + ).build_transaction({"gas": 0})["data"] + + batch_txs = [] + for i in range(num_messages): + msg_nonce = batch_start_nonce + i # Sequential nonces for batch + tx = { + "chainId": w3.eth.chain_id, + "from": delegator.address, + "to": delegator.address, # Self-call to trigger delegated code + "value": 0, + "gas": 500000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": msg_nonce, + "data": deploy_data, + } + batch_txs.append(tx) + print(f"✓ Batch tx {i}: nonce={msg_nonce}") + + # Build and send batch Cosmos transaction + batch_cosmos_tx, eth_tx_hashes = build_batch_tx( + w3, cli, batch_txs, key=delegator.key + ) + + # Broadcast the batch transaction + rsp = cli.broadcast_tx_json(batch_cosmos_tx) + assert rsp["code"] == 0, f"Batch broadcast failed: {rsp.get('raw_log', rsp)}" + print("Batch transaction broadcast successful") + + # Wait for transactions to be included and get receipts + receipts = [ + w3.eth.wait_for_transaction_receipt(h, timeout=30) for h in eth_tx_hashes + ] + + # Verify all transactions succeeded + for i, receipt in enumerate(receipts): + assert receipt.status == 1, f"Transaction {i} failed: {receipt}" + print(f"Transaction {i} succeeded, gas used: {receipt.gasUsed}") + + w3_wait_for_new_blocks(w3, 1) + + # CRITICAL VERIFICATION: Check that children were deployed at correct addresses + print("\n✓ Verifying contract deployments:") + for i, expected_addr in enumerate(expected_child_addresses): + code = w3.eth.get_code(expected_addr, "latest") + has_code = len(code) > 0 + print( + f" ✓ Child {i} at {expected_addr}: " + f"hasCode={has_code} (codeLen={len(code)})" + ) + + msg_nonce = batch_start_nonce + i + create_nonce = msg_nonce + 1 + assert has_code, ( + f"Child {i} should be deployed at {expected_addr} " + f"(msg_nonce={msg_nonce}, create_nonce={create_nonce}), " + f"but no code found." + ) + + # Verify delegator's final nonce + # AnteHandler increments nonce by num_messages (for the batch) + # Each CREATE increments nonce by 1 more during execution + # Total: batch_start_nonce + num_messages (ante) + nested_creates (CREATEs) + final_nonce = w3.eth.get_transaction_count(delegator.address) + nested_creates = num_messages + expected_final_nonce = batch_start_nonce + num_messages + nested_creates + print( + f"\n✓ Delegator final nonce: {final_nonce} (expected: {expected_final_nonce})" + ) + + assert ( + final_nonce == expected_final_nonce + ), f"Delegator nonce should be {expected_final_nonce}, got {final_nonce}" + + print("\n✅ All checks passed! All children deployed at correct addresses") + + +def test_single_tx_with_self_authorization_create(cluster): + """ + Test 3: Single transaction with self-authorization and CREATE. + + Similar to test_single_tx_create_nonce but includes SetCodeAuthorization + in the same transaction. Verifies that the CREATE operation still uses the + correct msg.Nonce even when authorization is attached. + + The authorization happens in the same transaction (no pre-setup needed). + + Step 1: Deploy DelegationTarget contract + Step 2: Create and fund delegator EOA + Step 3: Send transaction with authorization AND CREATE operation + Step 4: Verify CREATE uses correct nonce + """ + w3: Web3 = cluster.w3 + + # STEP 1: Deploy the DelegationTarget contract + deployer = derive_new_account(n=120) + fund_acc(w3, deployer) + + delegation_target, _ = deploy_contract( + w3, CONTRACTS["DelegationTarget"], key=deployer.key + ) + print(f"✓ DelegationTarget deployed at: {delegation_target.address}") + + # STEP 2: Create and fund delegator EOA (no pre-delegation setup) + delegator = derive_new_account(n=121) + fund_acc(w3, delegator) + + w3_wait_for_new_blocks(w3, 1) + + initial_nonce = w3.eth.get_transaction_count(delegator.address) + print(f"✓ Delegator initial nonce: {initial_nonce}") + + w3_wait_for_new_blocks(w3, 1) + + # STEP 3: Now test CREATE with self-authorization attached + deploy_nonce = w3.eth.get_transaction_count(delegator.address) + print(f"\n✓ Starting CREATE with self-authorization test, nonce: {deploy_nonce}") + + # Pre-calculate expected child contract address + # Authorizations are processed first: +1 nonce increment + # Then tx execution (evm call): +1 nonce increment + # So CREATE uses: deploy_nonce + 1 + 1 = deploy_nonce + 2 + expected_child_addr = contract_address(delegator.address, deploy_nonce + 2) + print( + f"✓ Expected child contract at: {expected_child_addr} " + f"(nonce={deploy_nonce + 2})" + ) + + # Use MinimalContract bytecode + minimal_bytecode = "0x6001600C60003960016000F300" # Returns 1 byte: 0x00 (STOP) + + # Build transaction data for CREATE via delegated call + deploy_data = delegation_target.functions.deploy( + HexBytes(minimal_bytecode) + ).build_transaction({"gas": 0})["data"] + + # Generate signed authorizations using helper + chain_id = w3.eth.chain_id + + # First auth: to delegation_target (to enable delegation for CREATE) + auth1_nonce = deploy_nonce + 1 + signed_auth1 = generate_signed_auth( + w3, delegator, delegation_target.address, auth1_nonce + ) + print( + f"✓ First authorization to {delegation_target.address} with nonce {auth1_nonce}" + ) + + # Build EIP-7702 transaction with authorizations and CREATE + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": delegator.address, # Self-call to trigger delegated code + "value": 0, + "gas": 500000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": deploy_nonce, + "data": deploy_data, + "authorizationList": [signed_auth1], + } + + print("✓ Sending transaction with self-authorization...") + signed_tx = delegator.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + assert receipt.status == 1, f"Transaction failed: {receipt}" + print(f"✓ Transaction succeeded, gas used: {receipt.gasUsed}") + + w3_wait_for_new_blocks(w3, 1) + + # STEP 5: Verify delegation was set to delegation_target + delegator_code = w3.eth.get_code(delegator.address, "latest") + expected_delegation = address_to_delegation(delegation_target.address) + assert delegator_code == HexBytes( + expected_delegation + ), f"Delegation should be set to {delegation_target.address}" + print("✓ Delegation set to delegation_target") + + w3_wait_for_new_blocks(w3, 1) + + # CRITICAL VERIFICATION: Check that child was deployed at correct address + child_code = w3.eth.get_code(expected_child_addr, "latest") + has_code = len(child_code) > 0 + print( + f"✓ Child at {expected_child_addr}: hasCode={has_code} " + f"(codeLen={len(child_code)})" + ) + + assert has_code, ( + f"Child should be deployed at {expected_child_addr} " + f"(nonce={deploy_nonce + 2}), " + "but no code found." + ) + + # Verify delegator's final nonce + # +1 for 1 auth, +1 for tx, +1 for CREATE = +3 total + final_nonce = w3.eth.get_transaction_count(delegator.address) + expected_final_nonce = deploy_nonce + 3 + print(f"✓ Delegator final nonce: {final_nonce} (expected: {expected_final_nonce})") + + assert ( + final_nonce == expected_final_nonce + ), f"Delegator nonce should be {expected_final_nonce}, got {final_nonce}" + + print( + "\n✅ All checks passed! " + "Child deployed at correct address with self-authorization" + ) + + +def test_batched_tx_with_self_authorizations_create(cluster): + """ + Test 4: Batched transactions with self-authorizations and CREATEs. + + Similar to test_single_tx_with_self_authorization_create but batched + with 3 transactions. Each transaction includes SetCodeAuthorization + to delegation_target and performs a CREATE. + + The authorizations happen in the same transactions (no pre-setup needed). + + Step 1: Deploy DelegationTarget contract + Step 2: Create and fund delegator EOA + Step 3: Send batch of 3 txs, each with authorization AND CREATE operation + Step 4: Verify each CREATE uses correct nonce + + NOTE: This test only runs on Ethermint (batch transactions are Cosmos-specific). + """ + # Skip this test for geth (batch transactions are Cosmos-specific) + if not hasattr(cluster, "cosmos_cli"): + pytest.skip("Batch transactions only supported on Ethermint") + + w3: Web3 = cluster.w3 + cli = cluster.cosmos_cli() + + # STEP 1: Deploy the DelegationTarget contract + deployer = derive_new_account(n=130) + fund_acc(w3, deployer) + + delegation_target, _ = deploy_contract( + w3, CONTRACTS["DelegationTarget"], key=deployer.key + ) + print(f"✓ DelegationTarget deployed at: {delegation_target.address}") + + # STEP 2: Create and fund delegator EOA (no pre-delegation setup) + delegator = derive_new_account(n=131) + fund_acc(w3, delegator) + + w3_wait_for_new_blocks(w3, 1) + + initial_nonce = w3.eth.get_transaction_count(delegator.address) + print(f"✓ Delegator initial nonce: {initial_nonce}") + + w3_wait_for_new_blocks(w3, 1) + + # STEP 3: Now test batched CREATEs with self-authorizations + batch_start_nonce = w3.eth.get_transaction_count(delegator.address) + print( + f"\n✓ Starting batched CREATE with self-authorizations, " + f"nonce: {batch_start_nonce}" + ) + + # Pre-calculate expected child contract addresses + num_messages = 3 + expected_child_addresses = [] + for i in range(num_messages): + msg_nonce = batch_start_nonce + i + auth_nonce = batch_start_nonce + num_messages + (i * 2) + create_nonce = auth_nonce + 1 + child_addr = contract_address(delegator.address, create_nonce) + expected_child_addresses.append(child_addr) + print( + f"✓ Expected child {i} at create_nonce {create_nonce} " + f"(msg_nonce={msg_nonce}): {child_addr}" + ) + + # Use MinimalContract bytecode + minimal_bytecode = "0x6001600C60003960016000F300" # Returns 1 byte: 0x00 (STOP) + chain_id = w3.eth.chain_id + + # Build deploy data + deploy_data = delegation_target.functions.deploy( + HexBytes(minimal_bytecode) + ).build_transaction({"gas": 0})["data"] + + # Build batch transactions + batch_txs = [] + for i in range(num_messages): + msg_nonce = batch_start_nonce + i + + # Calculate authorization nonce: + # After all msgs: batch_start_nonce + num_messages + # Each previous tx consumed 2 nonces (1 auth + 1 CREATE) + auth_nonce = batch_start_nonce + num_messages + (i * 2) + + # Generate signed authorization to delegation_target + signed_auth = generate_signed_auth( + w3, delegator, delegation_target.address, auth_nonce + ) + print( + f"✓ Batch tx {i}: msg_nonce={msg_nonce}, " + f"auth_nonce={auth_nonce} -> {delegation_target.address}" + ) + + tx = { + "chainId": chain_id, + "type": 4, + "from": delegator.address, + "to": delegator.address, # Self-call to trigger delegated code + "value": 0, + "gas": 500000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": msg_nonce, + "data": deploy_data, + "authorizationList": [signed_auth], + } + batch_txs.append(tx) + + # Build and send batch Cosmos transaction + print(f"✓ Building batch transaction with {num_messages} messages...") + batch_cosmos_tx, eth_tx_hashes = build_batch_tx( + w3, cli, batch_txs, key=delegator.key + ) + + # Broadcast the batch transaction + rsp = cli.broadcast_tx_json(batch_cosmos_tx) + assert rsp["code"] == 0, f"Batch broadcast failed: {rsp.get('raw_log', rsp)}" + print("✓ Batch transaction broadcast successful") + + # Wait for transactions to be included and get receipts + receipts = [ + w3.eth.wait_for_transaction_receipt(h, timeout=30) for h in eth_tx_hashes + ] + + # Verify all transactions succeeded + for i, receipt in enumerate(receipts): + assert receipt.status == 1, f"Transaction {i} failed: {receipt}" + print(f"✓ Transaction {i} succeeded, gas used: {receipt.gasUsed}") + + w3_wait_for_new_blocks(w3, 1) + + # STEP 4: Verify delegation was set to delegation_target + delegator_code = w3.eth.get_code(delegator.address, "latest") + expected_delegation = address_to_delegation(delegation_target.address) + assert delegator_code == HexBytes( + expected_delegation + ), f"Delegation should be set to {delegation_target.address}" + print("✓ Delegation set to delegation_target") + + # CRITICAL VERIFICATION: Check that children were deployed at correct addresses + print("\n✓ Verifying contract deployments:") + for i, expected_addr in enumerate(expected_child_addresses): + code = w3.eth.get_code(expected_addr, "latest") + has_code = len(code) > 0 + msg_nonce = batch_start_nonce + i + create_nonce = msg_nonce + 1 + print( + f" ✓ Child {i} at {expected_addr}: hasCode={has_code} " + f"(codeLen={len(code)})" + ) + + assert has_code, ( + f"Child {i} should be deployed at {expected_addr} " + f"(msg_nonce={msg_nonce}, create_nonce={create_nonce}), " + "but no code found." + ) + + # Verify delegator's final nonce + # AnteHandler: +num_messages (for batch txs) + # CREATEs: +num_messages (one per tx) + # Auths: +num_messages (one per tx) + # Total: batch_start_nonce + num_messages + num_messages + num_messages + final_nonce = w3.eth.get_transaction_count(delegator.address) + nested_creates = num_messages + auths = num_messages # 1 auth per message + expected_final_nonce = batch_start_nonce + num_messages + nested_creates + auths + print( + f"\n✓ Delegator final nonce: {final_nonce} (expected: {expected_final_nonce})" + ) + + assert ( + final_nonce == expected_final_nonce + ), f"Delegator nonce should be {expected_final_nonce}, got {final_nonce}" + + print( + "\n✅ All checks passed! " + "All children deployed at correct addresses with self-authorizations" + ) diff --git a/tests/integration_tests/test_priority.py b/tests/integration_tests/test_priority.py index b899fcf22d..ed8fc006c5 100644 --- a/tests/integration_tests/test_priority.py +++ b/tests/integration_tests/test_priority.py @@ -1,9 +1,17 @@ import sys import pytest +from web3 import exceptions from .network import setup_ethermint -from .utils import ADDRS, KEYS, eth_to_bech32, sign_transaction, wait_for_new_blocks +from .utils import ( + ADDRS, + KEYS, + eth_to_bech32, + send_transaction, + sign_transaction, + wait_for_new_blocks, +) PRIORITY_REDUCTION = 1000000 @@ -106,7 +114,7 @@ def test_priority(ethermint): signed = [sign_transaction(w3, tx, key=KEYS[sender]) for sender, tx in test_cases] # send the txs from low priority to high, # but the later sent txs should be included earlier. - txhashes = [w3.eth.send_raw_transaction(tx.rawTransaction) for tx in signed] + txhashes = [w3.eth.send_raw_transaction(tx.raw_transaction) for tx in signed] receipts = [w3.eth.wait_for_transaction_receipt(txhash) for txhash in txhashes] print(receipts) @@ -202,3 +210,18 @@ def test_native_tx_priority(ethermint): def get_max_priority_price(max_priority_price): "default to max int64 if None" return max_priority_price if max_priority_price is not None else sys.maxsize + + +def test_validate(ethermint): + w3 = ethermint.w3 + gas = int(1.2 * w3.eth.gas_price) + tx = { + "to": "0x0000000000000000000000000000000000000000", + "value": 1, + "gas": 21000, + "maxFeePerGas": gas, + "maxPriorityFeePerGas": gas + 1, + } + with pytest.raises(exceptions.Web3RPCError) as exc: + send_transaction(w3, tx) + assert "max priority fee per gas higher than max fee per gas" in str(exc) diff --git a/tests/integration_tests/test_pruned_node.py b/tests/integration_tests/test_pruned_node.py index 02311f88bb..3a9e5f913f 100644 --- a/tests/integration_tests/test_pruned_node.py +++ b/tests/integration_tests/test_pruned_node.py @@ -4,6 +4,7 @@ from eth_bloom import BloomFilter from eth_utils import abi, big_endian_to_int from hexbytes import HexBytes +from web3 import Web3 from web3.datastructures import AttributeDict from .network import setup_custom_ethermint @@ -43,11 +44,11 @@ def test_pruned_node(pruned): {"from": ADDRS["validator"]} ) signed = sign_transaction(w3, tx, KEYS["validator"]) - txhash = w3.eth.send_raw_transaction(signed.rawTransaction) + txhash = w3.eth.send_raw_transaction(signed.raw_transaction) print("wait for prunning happens") w3_wait_for_new_blocks(w3, 15) - tx_receipt = w3.eth.get_transaction_receipt(txhash.hex()) + tx_receipt = w3.eth.get_transaction_receipt(Web3.to_hex(txhash)) assert len(tx_receipt.logs) == 1 data = "0x000000000000000000000000000000000000000000000000000000000000000a" data = HexBytes(data) diff --git a/tests/integration_tests/test_selfdestruct.py b/tests/integration_tests/test_selfdestruct.py new file mode 100644 index 0000000000..2d7286ffe9 --- /dev/null +++ b/tests/integration_tests/test_selfdestruct.py @@ -0,0 +1,224 @@ +from concurrent.futures import ThreadPoolExecutor + +from web3 import Web3 + +from .utils import ADDRS, CONTRACTS, KEYS, deploy_contract, send_transaction + +# --------------------------------------------------------------------------- +# Shared helpers +# --------------------------------------------------------------------------- + + +def _run(w3: Web3, salt: bytes, value: int): + factory, deploy_receipt = deploy_contract( + w3, CONTRACTS["SelfDestructExploitFactory"] + ) + assert deploy_receipt.status == 1 + + child_addr = Web3.to_checksum_address( + factory.functions.predictChildAddress(salt).call( + block_identifier=deploy_receipt.blockNumber + ) + ) + assert w3.eth.get_balance(child_addr) == 0 + + receipt = send_transaction( + w3, + factory.functions.attackInOneTx(salt).build_transaction( + {"from": ADDRS["validator"], "value": value} + ), + KEYS["validator"], + ) + assert receipt.status == 1, "transaction should succeed" + return factory, child_addr, receipt + + +def _trace_tx(w3: Web3, tx_hash, tracer: dict) -> dict: + result = w3.provider.make_request( + "debug_traceTransaction", + [Web3.to_hex(tx_hash), tracer], + ) + assert "result" in result, f"trace error: {result.get('error')}" + return result["result"] + + +def _find_frames(frame: dict, match_type: str) -> list: + """Recursively collect all callTracer frames with a given type.""" + found = [] + if frame.get("type") == match_type: + found.append(frame) + for sub in frame.get("calls", []): + found.extend(_find_frames(sub, match_type)) + return found + + +def test_selfdestruct_post_destruction_balance_burned(ethermint, geth): + salt = bytes(31) + b"\x01" + value = 10**9 + + def process(w3): + _, child_addr, _ = _run(w3, salt, value) + return { + "child_balance": w3.eth.get_balance(child_addr), + "child_code": w3.eth.get_code(child_addr), + "child_addr": child_addr, + } + + with ThreadPoolExecutor(2) as pool: + futs = [pool.submit(process, w3) for w3 in [ethermint.w3, geth.w3]] + results = {name: f.result() for name, f in zip(["ethermint", "geth"], futs)} + + for name, r in results.items(): + assert r["child_balance"] == 0, ( + f"{name}: post-selfdestruct balance must be 0 (burned at commit), " + f"but eth_getBalance({r['child_addr']}) returned {r['child_balance']}." + ) + assert ( + r["child_code"] == b"" + ), f"{name}: self-destructed account must have no code after commit." + + +def test_selfdestruct_recreated_address_cannot_recover_funds(ethermint, geth): + """ + Recreating the child at the same CREATE2 address must not expose any + preserved balance to the new contract. + """ + salt = bytes(31) + b"\x02" + value = 10**9 + + def process(w3): + factory, child_addr, _ = _run(w3, salt, value) + assert w3.eth.get_balance(child_addr) == 0 + + validator_balance_before = w3.eth.get_balance(ADDRS["validator"]) + + redeploy_receipt = send_transaction( + w3, + factory.functions.redeployChild(salt).build_transaction( + {"from": ADDRS["validator"]} + ), + KEYS["validator"], + ) + assert redeploy_receipt.status == 1 + + return { + "child_balance_after_redeploy": w3.eth.get_balance(child_addr), + "validator_gained": w3.eth.get_balance(ADDRS["validator"]) + > validator_balance_before, + "child_addr": child_addr, + } + + with ThreadPoolExecutor(2) as pool: + futs = [pool.submit(process, w3) for w3 in [ethermint.w3, geth.w3]] + results = {name: f.result() for name, f in zip(["ethermint", "geth"], futs)} + + for name, r in results.items(): + assert r["child_balance_after_redeploy"] == 0, ( + f"{name}: redeployed child must have 0 balance" + f"(child={r['child_addr']})." + ) + assert not r[ + "validator_gained" + ], f"{name}: validator must not gain funds from the recovery attempt." + + +def test_selfdestruct_calltrace_parity(ethermint, geth): + salt = bytes(31) + b"\x11" + value = 10**9 + + def process(w3): + factory, child_addr, receipt = _run(w3, salt, value) + trace = _trace_tx(w3, receipt.transactionHash, {"tracer": "callTracer"}) + + # --- SELFDESTRUCT frame --- + sd_frames = _find_frames(trace, "SELFDESTRUCT") + assert ( + len(sd_frames) >= 1 + ), f"Expected at least one SELFDESTRUCT frame, got: {sd_frames}" + sd = sd_frames[0] + assert ( + sd["from"].lower() == child_addr.lower() + ), f"SELFDESTRUCT must originate from the child contract, got from={sd['from']}" + # Child had 0 balance at destruction time (no ETH was sent before destroy()). + assert sd.get("value", "0x0") in ("0x0", "0x00", None, ""), ( + f"SELFDESTRUCT value must be 0 (child had no pre-existing balance), " + f"got value={sd.get('value')}" + ) + + # --- Post-destruction CALL frame (value-bearing) --- + post_sd_calls = [ + c + for c in _find_frames(trace, "CALL") + if c.get("to", "").lower() == child_addr.lower() + and int(c.get("value", "0x0"), 16) == value + ] + assert len(post_sd_calls) >= 1, ( + f"Expected a value-bearing CALL to dead child ({child_addr}) " + f"with value={hex(value)}, found none in trace." + ) + + return { + "selfdestruct_from": sd["from"].lower(), + "selfdestruct_to": sd.get("to", "").lower(), + "post_sd_call_value": hex(value), + "child_addr": child_addr.lower(), + } + + with ThreadPoolExecutor(2) as pool: + futs = [pool.submit(process, w3) for w3 in [ethermint.w3, geth.w3]] + results = {name: f.result() for name, f in zip(["ethermint", "geth"], futs)} + + def _normalize(r): + return { + "selfdestruct_from_is_child": r["selfdestruct_from"] == r["child_addr"], + "selfdestruct_to_is_set": r["selfdestruct_to"] != "", + "post_sd_call_value": r["post_sd_call_value"], + } + + assert _normalize(results["ethermint"]) == _normalize(results["geth"]), ( + f"callTracer key fields differ between Ethermint and Geth:\n" + f" Ethermint: {results['ethermint']}\n" + f" Geth: {results['geth']}" + ) + + +def test_selfdestruct_prestate_diff_parity(ethermint, geth): + """ + Verify that debug_traceTransaction (prestateTracer diffMode) shows + identical pre/post state for the child address on Ethermint and Geth. + + The burn of post-selfdestruct balance (BalanceDecreaseSelfdestructBurn, + reason=14) is NOT a named entry in the diff — it is the ABSENCE of a + balance entry for the child in the post-state. Both nodes must agree that + the child has no entry (i.e. no surviving balance) after the transaction. + """ + salt = bytes(31) + b"\x12" + value = 10**9 + + def process(w3): + _, child_addr, receipt = _run(w3, salt, value) + diff = _trace_tx( + w3, + receipt.transactionHash, + {"tracer": "prestateTracer", "tracerConfig": {"diffMode": True}}, + ) + post = diff.get("post", {}) + child_lower = child_addr.lower() + child_post = post.get(child_lower, {}) + # With the fix (or on Geth): child must have 0 or absent balance in post-state. + child_post_balance = int(child_post.get("balance", "0x0"), 16) + return child_post_balance, child_addr.lower() + + with ThreadPoolExecutor(2) as pool: + futs = [pool.submit(process, w3) for w3 in [ethermint.w3, geth.w3]] + results = {name: f.result() for name, f in zip(["ethermint", "geth"], futs)} + + bal_ethermint, addr_ethermint = results["ethermint"] + bal_geth, _ = results["geth"] + + assert bal_geth == 0, f"Geth: child post-state balance must be 0, got {bal_geth}" + assert bal_ethermint == 0, ( + f"Ethermint: child post-state balance must be 0 (burn fix active), " + f"got {bal_ethermint} for {addr_ethermint}. " + f"The SELFDESTRUCT bank-balance drain is not active." + ) diff --git a/tests/integration_tests/test_set_code_tx.py b/tests/integration_tests/test_set_code_tx.py new file mode 100644 index 0000000000..b9285e90e8 --- /dev/null +++ b/tests/integration_tests/test_set_code_tx.py @@ -0,0 +1,771 @@ +from concurrent.futures import ThreadPoolExecutor, as_completed +from pathlib import Path + +import pytest +from eth_account import Account +from eth_account.typed_transactions.set_code_transaction import Authorization +from eth_utils import to_canonical_address +from hexbytes import HexBytes +from web3 import Web3, exceptions + +from .bytecode_deployer import deploy_runtime_bytecode +from .eip7702 import address_to_delegation, generate_signed_auth, send_setcode_tx +from .network import setup_custom_ethermint +from .utils import ( + CONTRACTS, + deploy_contract, + derive_new_account, + fund_acc, + send_transaction, + w3_wait_for_new_blocks, +) + + +@pytest.fixture(scope="module") +def custom_ethermint(tmp_path_factory): + path = tmp_path_factory.mktemp("setcodetx") + yield from setup_custom_ethermint( + path, 26500, Path(__file__).parent / "configs/default.jsonnet" + ) + + +@pytest.fixture(scope="module", params=["ethermint", "geth"]) +def cluster(request, custom_ethermint, geth): + """ + run on both ethermint and geth + """ + provider = request.param + if provider == "ethermint": + yield custom_ethermint + elif provider == "geth": + yield geth + else: + raise NotImplementedError + + +def test_set_code_tx_basic(custom_ethermint): + w3: Web3 = custom_ethermint.w3 + + account_code = "0x4Cd241E8d1510e30b2076397afc7508Ae59C66c9" + + # use an new account for the test + # genisis accounts are default BaseAccount, with no code hash storage + acc = derive_new_account(n=2) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + + auth = { + "chainId": chain_id, + "address": account_code, + "nonce": nonce + 1, + } + + signed_auth = acc.sign_authorization(auth) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth], + } + + signed_tx = acc.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + code = w3.eth.get_code(acc.address, "latest") + expected_code = address_to_delegation(account_code) + expected_code_hex = HexBytes(expected_code) + assert code == expected_code_hex, f"Expected code {expected_code_hex}, got {code}" + # Verify the nonce was incremented correctly + new_nonce = w3.eth.get_transaction_count(acc.address) + assert new_nonce == nonce + 2, f"Expected nonce {nonce + 2}, got {new_nonce}" + + +# replicate the test +# https://github.com/ethereum/go-ethereum/blob/0af6c9899f11949e452a1baf90f2281c0d4fe46a/core/blockchain_test.go#L4067 +# ethermint and geth will both succeed +def test_eip7702_delegation_with_storage(cluster): + """ + TestEIP7702 equivalent: deploys two delegation designations and calls them. + It writes one value to storage which is verified after. + + The test creates: + 1. addr1 delegated to 0xaaaa (which calls addr2) + 2. addr2 delegated to 0xbbbb (which stores 42 in slot 42) + + The transaction flow becomes: + 1. tx -> addr1 which is delegated to 0xaaaa + 2. addr1:0xaaaa calls into addr2:0xbbbb + 3. addr2:0xbbbb writes to storage + """ + w3: Web3 = cluster.w3 + chain_id = w3.eth.chain_id + + deployer = derive_new_account(n=9) + addr1 = derive_new_account(n=10) + addr2 = derive_new_account(n=11) + addr1_nonce = w3.eth.get_transaction_count(addr1.address) + addr2_nonce = w3.eth.get_transaction_count(addr2.address) + + fund_acc(w3, deployer) + fund_acc(w3, addr1) + fund_acc(w3, addr2) + + addr2_hex = addr2.address[2:].lower() + # getCode from the original geth test + aa_bytecode = "0x6000600060006000600173" + addr2_hex + "5af1" + aa = deploy_runtime_bytecode(w3, aa_bytecode, deployer, deployer) + + # Sstore(0x42, 0x42) - stores value 42 in slot 42 + bb_bytecode = "0x6042604255" + bb = deploy_runtime_bytecode(w3, bb_bytecode, deployer, deployer) + + aa_deployed_code = w3.eth.get_code(aa, "latest") + bb_deployed_code = w3.eth.get_code(bb, "latest") + + assert aa_deployed_code == HexBytes(aa_bytecode), ( + f"aa deployed code incorrect: got {Web3.to_hex(aa_deployed_code)}, " + f"want {aa_bytecode}" + ) + assert bb_deployed_code == HexBytes(bb_bytecode), ( + f"bb deployed code incorrect: got {Web3.to_hex(bb_deployed_code)}, " + f"want {bb_bytecode}" + ) + + auth1 = { + "chainId": chain_id, + "address": aa, + "nonce": addr1_nonce + 1, # Next nonce after the SetCode transaction + } + + # auth2: addr2 delegates to bb contract + auth2 = {"chainId": chain_id, "address": bb, "nonce": addr2_nonce} + + signed_auth1 = addr1.sign_authorization(auth1) + signed_auth2 = addr2.sign_authorization(auth2) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": addr1.address, + "value": 0, + "gas": 500000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": addr1_nonce, + "authorizationList": [signed_auth1, signed_auth2], + } + + signed_tx = addr1.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + assert receipt.status == 1, f"Transaction failed: {receipt}" + + addr1_code = w3.eth.get_code(addr1.address, "latest") + delegation1 = address_to_delegation(auth1["address"]) + assert addr1_code == HexBytes( + delegation1 + ), f"addr1 code incorrect: got {Web3.to_hex(addr1_code)}, want {delegation1}" + + addr2_code = w3.eth.get_code(addr2.address, "latest") + delegation2 = address_to_delegation(auth2["address"]) + assert addr2_code == HexBytes( + delegation2 + ), f"addr2 code incorrect: got {Web3.to_hex(addr2_code)}, want {delegation2}" + + # Verify delegation executed the correct code and stored value 42 in slot 42 + # Check storage at addr2, slot 0x42 + storage_value = w3.eth.get_storage_at(addr2.address, 0x42, "latest") + expected_value = HexBytes( + "0x0000000000000000000000000000000000000000000000000000000000000042" + ) + + assert storage_value == expected_value, ( + f"addr2 storage wrong: expected {Web3.to_hex(expected_value)}, " + f"got {Web3.to_hex(storage_value)}" + ) + + +def test_set_code_tx_auth_list_empty(ethermint, geth): + # TODO: web3.py has inner validation for auth list, can't send empty auth list + return + + def process(w3): + # use an new account for the test + # genisis accounts are default BaseAccount, with no code hash storage + acc = derive_new_account(n=2) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + } + + res = send_transaction(w3, setcode_tx, acc.key) + return res + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + assert res[0] == res[-1], res + + +def test_set_code_tx_to_empty(ethermint, geth): + def process(w3): + # use an new account for the test + # genisis accounts are default BaseAccount, with no code hash storage + acc = derive_new_account(n=2) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + auth = { + "chainId": chain_id, + "address": derive_new_account(n=1).address, + "nonce": nonce + 1, + } + signed_auth = acc.sign_authorization(auth) + setcode_tx = { + "chainId": chain_id, + "type": 4, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth], + } + + res = send_transaction(w3, setcode_tx, acc.key) + return res + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.exception() for future in as_completed(tasks)] + assert len(res) == len(providers) + assert all(isinstance(e, exceptions.Web3RPCError) for e in res) + assert str(res[0]) == str(res[-1]) + + +def test_set_code_tx_get_receipt(ethermint, geth): + def process(w3): + acc = derive_new_account(n=3) + target_acc = derive_new_account(n=4) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + + auth_addr = target_acc.address + auth = { + "chainId": chain_id, + "address": auth_addr, + "nonce": nonce + 1, + } + signed_auth = acc.sign_authorization(auth) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth], + } + + signed_tx = acc.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + assert receipt.status == 1, f"transaction failed: {receipt}" + + code = w3.eth.get_code(acc.address, "latest") + expected_code = HexBytes(address_to_delegation(auth_addr)) + assert ( + code == expected_code + ), f"code incorrect: got {Web3.to_hex(code)}, want {expected_code}" + + receipt = w3.eth.get_transaction_receipt(tx_hash) + + return receipt + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + assert res[0]["from"] == res[-1]["from"], res + assert res[0]["to"] == res[-1]["to"], res + assert res[0]["status"] == res[-1]["status"] == 1, res + assert res[0]["type"] == res[-1]["type"] == 4, res + + +def recover_auth(auth_item): + + chain_id = auth_item["chainId"] + code_address = to_canonical_address(auth_item["address"]) + nonce = auth_item["nonce"] + + unsigned_authorization = Authorization(chain_id, code_address, nonce) + authorization_hash = unsigned_authorization.hash() + + v = auth_item["yParity"] + r = auth_item["r"] + s = auth_item["s"] + + return Account._recover_hash(authorization_hash, vrs=(v, r, s)) + + +def test_set_code_tx_get_transaction_by_hash(ethermint, geth): + acc = derive_new_account(n=3) + + def process(w3): + target_acc = derive_new_account(n=4) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + + auth_addr = target_acc.address + auth = { + "chainId": chain_id, + "address": auth_addr, + "nonce": nonce + 1, + } + signed_auth = acc.sign_authorization(auth) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth], + } + + signed_tx = acc.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + assert receipt.status == 1, f"transaction failed: {receipt}" + + code = w3.eth.get_code(acc.address, "latest") + expected_code = HexBytes(address_to_delegation(auth_addr)) + assert ( + code == expected_code + ), f"code incorrect: got {Web3.to_hex(code)}, want {expected_code}" + + tx = w3.eth.get_transaction(tx_hash) + + return tx + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + auth_list0 = res[0]["authorizationList"][0] + auth_list1 = res[1]["authorizationList"][0] + assert len(auth_list0) == len(auth_list1) + assert auth_list0["chainId"] == auth_list1["chainId"] + assert auth_list0["address"] == auth_list1["address"] + auth_0_addr = recover_auth(auth_list0) + auth_1_addr = recover_auth(auth_list1) + + assert auth_0_addr == auth_1_addr == acc.address, ( + f"auth_0_addr: {auth_0_addr}, " + f"auth_1_addr: {auth_1_addr}, " + f"acc.address: {acc.address}" + ) + + +def test_set_code_tx_signature_invalid(ethermint, geth): + def process(w3): + acc = derive_new_account(n=3) + target_acc = derive_new_account(n=4) + fund_acc(w3, acc) + acc_code = w3.eth.get_code(acc.address, "latest") + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + + auth1_addr = target_acc.address + auth1 = { + "chainId": chain_id, + "address": auth1_addr, + "nonce": nonce + 1, + } + + acc_2 = derive_new_account(n=5) + # use a different account to sign the auth + signed_auth1 = acc_2.sign_authorization(auth1) + + setcode_tx1 = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth1], + } + + signed_tx = acc.sign_transaction(setcode_tx1) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + if receipt.status != 1: + raise Exception(f"transaction failed: {receipt}") + + code = w3.eth.get_code(acc.address, "latest") + # the code will remain unchanged + assert ( + code == acc_code + ), f"code incorrect: got {Web3.to_hex(code)}, want {acc_code}" + + return receipt + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + + +def test_set_code_tx_auth_invalid_nonce(ethermint, geth): + def process(w3): + acc = derive_new_account(n=3) + target_acc = derive_new_account(n=4) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + + auth1_addr = target_acc.address + auth1 = { + "chainId": chain_id, + "address": auth1_addr, + "nonce": nonce + 1, + } + signed_auth1 = acc.sign_authorization(auth1) + + setcode_tx1 = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth1], + } + + signed_tx1 = acc.sign_transaction(setcode_tx1) + tx_hash1 = w3.eth.send_raw_transaction(signed_tx1.raw_transaction) + receipt1 = w3.eth.wait_for_transaction_receipt(tx_hash1, timeout=30) + + if receipt1.status != 1: + raise Exception(f"First transaction failed: {receipt1}") + + code = w3.eth.get_code(acc.address, "latest") + expected_code = HexBytes(address_to_delegation(auth1_addr)) + assert ( + code == expected_code + ), f"code incorrect: got {Web3.to_hex(code)}, want {expected_code}" + + # second tx will error, nonce is lower than current nonce + auth_addr2 = derive_new_account(n=5).address + auth2 = { + "chainId": chain_id, + "address": auth_addr2, + "nonce": nonce + 1, + } + signed_auth2 = acc.sign_authorization(auth2) + nonce2 = w3.eth.get_transaction_count(acc.address) + setcode_tx2 = { + "chainId": chain_id, + "type": 4, + "to": acc.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce2, + "authorizationList": [signed_auth2], + } + + res = send_transaction(w3, setcode_tx2, acc.key) + + # second tx with success, but the code won't be set (errors ignored in auth tx) + code = w3.eth.get_code(acc.address, "latest") + expected_code = HexBytes(address_to_delegation(auth1["address"])) + assert ( + code == expected_code + ), f"code incorrect: got {Web3.to_hex(code)}, want {expected_code}" + + return res + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + + +def test_set_code_tx_estimate_gas(ethermint, geth): + def process(w3): + acc = derive_new_account(n=3) + target_acc = derive_new_account(n=4) + fund_acc(w3, acc) + + chain_id = w3.eth.chain_id + nonce = w3.eth.get_transaction_count(acc.address) + + auth_addr = target_acc.address + auth = { + "chainId": chain_id, + "address": auth_addr, + "nonce": nonce + 1, + } + signed_auth = acc.sign_authorization(auth) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "from": acc.address, + "to": acc.address, + "value": 0, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": nonce, + "authorizationList": [signed_auth], + } + + gas = w3.eth.estimate_gas(setcode_tx) + return gas + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + assert res[0] == res[-1], res + + +def test_set_code_tx_delegate_auth_call_using_different_account(cluster): + """ + Test that a delegate auth call using a different account than + the one used to sign the auth works. + """ + w3: Web3 = cluster.w3 + + auth_account = derive_new_account(n=30) + sender_account = derive_new_account(n=31) + delegate_account = derive_new_account(n=32) + + fund_acc(w3, auth_account) + fund_acc(w3, sender_account) + + chain_id = w3.eth.chain_id + auth_nonce = w3.eth.get_transaction_count(auth_account.address) + sender_nonce = w3.eth.get_transaction_count(sender_account.address) + + auth = { + "chainId": chain_id, + "address": delegate_account.address, + "nonce": auth_nonce, + } + signed_auth = auth_account.sign_authorization(auth) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "from": sender_account.address, + "to": auth_account.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": sender_nonce, + "authorizationList": [signed_auth], + } + + signed_tx = sender_account.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + + assert receipt.status == 1, f"Transaction failed: {receipt}" + + code = w3.eth.get_code(auth_account.address, "latest") + expected_code = address_to_delegation(delegate_account.address) + expected_code_hex = HexBytes(expected_code) + assert code == expected_code_hex, f"Expected code {expected_code_hex}, got {code}" + + new_auth_nonce = w3.eth.get_transaction_count(auth_account.address) + assert ( + new_auth_nonce == auth_nonce + 1 + ), f"Expected auth_account nonce {auth_nonce + 1}, got {new_auth_nonce}" + + new_sender_nonce = w3.eth.get_transaction_count(sender_account.address) + assert ( + new_sender_nonce == sender_nonce + 1 + ), f"Expected sender_account nonce {sender_nonce + 1}, got {new_sender_nonce}" + + +def test_set_code_tx_revoke_delegation(cluster): + """ + send a setcode tx, and then send an empty setcode tx to revoke the auth + expect the code to be set to 0x + """ + w3: Web3 = cluster.w3 + acc = derive_new_account(n=30) + delegate_addr = derive_new_account(n=31).address + + fund_acc(w3, acc) + nonce = w3.eth.get_transaction_count(acc.address) + + signed_auth = generate_signed_auth(w3, acc, delegate_addr, nonce=nonce + 1) + receipt = send_setcode_tx(w3, acc, acc.address, signed_auth) + + assert receipt.status == 1, f"Transaction failed: {receipt}" + + code = w3.eth.get_code(acc.address, "latest") + expected_code = address_to_delegation(delegate_addr) + expected_code_hex = HexBytes(expected_code) + assert code == expected_code_hex, f"Expected code {expected_code_hex}, got {code}" + + nonce = w3.eth.get_transaction_count(acc.address) + # send new auth to clear the code + signed_auth = generate_signed_auth( + w3, acc, "0x0000000000000000000000000000000000000000", nonce=nonce + 1 + ) + receipt = send_setcode_tx(w3, acc, acc.address, signed_auth) + + assert receipt.status == 1, f"Transaction failed: {receipt}" + + code = w3.eth.get_code(acc.address, "latest") + expected_code = "0x" + assert ( + Web3.to_hex(code) == expected_code + ), f"Expected code {expected_code}, got {Web3.to_hex(code)}" + + +def test_eip7702_nonce_increment(cluster): + """ + TestEIP7702NonceIncrement equivalent: Tests that when a user with EIP-7702 + delegation deploys a contract whose constructor calls back to the user + (via the delegation) and deploys more contracts, the user's nonce is + correctly incremented. + + This test reproduces a bug where the nonce was unconditionally reset to msg.Nonce+1 + after evm.Create(), ignoring any nonce increments that occurred during execution. + + Bug scenario: + 1. User (with EIP-7702 delegation) sends contract creation tx with nonce N + 2. evm.Create() increments User's nonce to N+1 + 3. Constructor calls back to User via delegation, deploying more contracts + 4. Each nested CREATE increments User's nonce (N+2, N+3, ...) + 5. BUG: After evm.Create() returns, nonce is reset to N+1, losing all increments + """ + w3 = cluster.w3 + chain_id = w3.eth.chain_id + + user = derive_new_account(n=100) + helper = derive_new_account(n=101) + + fund_acc(w3, user) + fund_acc(w3, helper) + + delegation_target_contract, _ = deploy_contract( + w3, CONTRACTS["DelegationTarget"], key=helper.key + ) + delegation_target_addr = delegation_target_contract.address + + w3_wait_for_new_blocks(w3, 1) + + user_nonce = w3.eth.get_transaction_count(user.address) + + auth = { + "chainId": chain_id, + "address": delegation_target_addr, + "nonce": user_nonce + 1, + } + signed_auth = user.sign_authorization(auth) + + setcode_tx = { + "chainId": chain_id, + "type": 4, + "to": user.address, + "value": 0, + "gas": 100000, + "maxFeePerGas": 1000000000000, + "maxPriorityFeePerGas": 10000, + "nonce": user_nonce, + "authorizationList": [signed_auth], + } + + signed_tx = user.sign_transaction(setcode_tx) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=30) + assert receipt.status == 1, f"SetCode transaction failed: {receipt}" + + w3_wait_for_new_blocks(w3, 1) + + code = w3.eth.get_code(user.address, "latest") + expected_delegation = address_to_delegation(delegation_target_addr) + assert code == HexBytes(expected_delegation), ( + f"Delegation not set correctly: got {Web3.to_hex(code)}, " + f"want {expected_delegation}" + ) + + initial_nonce = w3.eth.get_transaction_count(user.address) + + num_contracts = 30 + step = 1 + + deploy_contract( + w3, + CONTRACTS["MaliciousDeployer"], + args=(user.address, num_contracts, step), + key=user.key, + ) + + w3_wait_for_new_blocks(w3, 1) + + final_nonce = w3.eth.get_transaction_count(user.address) + + expected_nonce = initial_nonce + 1 + num_contracts + assert final_nonce == expected_nonce, ( + f"user nonce should be {expected_nonce} " + f"(initial {initial_nonce} + 1 for deployment + " + f"{num_contracts} nested creates), but got {final_nonce}" + ) diff --git a/tests/integration_tests/test_simulate.py b/tests/integration_tests/test_simulate.py new file mode 100644 index 0000000000..4b8beed54c --- /dev/null +++ b/tests/integration_tests/test_simulate.py @@ -0,0 +1,799 @@ +from concurrent.futures import ThreadPoolExecutor + +import pytest # type: ignore[import-not-found] + +from .utils import ADDRS, KEYS, send_transaction + +METHOD = "eth_simulateV1" + +pytestmark = pytest.mark.filter + +# Test addresses +SENDER = "0xc000000000000000000000000000000000000000" +RECEIVER = "0xc100000000000000000000000000000000000000" +RECEIVER2 = "0xc200000000000000000000000000000000000000" + + +def execute(ethermint, geth, params): + """Run eth_simulateV1 on both ethermint and geth, return results.""" + + def process(w3): + return w3.provider.make_request(METHOD, params) + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exc: + tasks = [exc.submit(process, w3) for w3 in providers] + results = [t.result() for t in tasks] + return results + + +def test_simulate_does_not_affect_real_state(ethermint): + """Simulation must not mutate on-chain state.""" + w3 = ethermint.w3 + sender_addr = ADDRS["validator"] + recipient_addr = ADDRS["community"] + + receipt = send_transaction( + w3, + {"to": recipient_addr, "value": 1000}, + KEYS["validator"], + ) + assert receipt.status == 1, f"real tx failed: {receipt}" + + sender_balance = w3.eth.get_balance(sender_addr, "latest") + recipient_balance = w3.eth.get_balance(recipient_addr, "latest") + + sim_params = [ + { + "blockStateCalls": [ + { + "calls": [ + { + "from": sender_addr, + "to": recipient_addr, + "value": "0x1", + } + ], + } + ] + }, + "latest", + ] + sim_result = w3.provider.make_request(METHOD, sim_params) + assert "result" in sim_result, f"simulate failed: {sim_result.get('error')}" + + sim_call = sim_result["result"][0]["calls"][0] + assert ( + sim_call["status"] == "0x1" + ), f"simulated call failed: {sim_call.get('error')}" + + assert ( + w3.eth.get_balance(sender_addr, "latest") == sender_balance + ), "sender balance changed after simulation — simulate mutated real state" + assert ( + w3.eth.get_balance(recipient_addr, "latest") == recipient_balance + ), "recipient balance changed after simulation — simulate mutated real state" + + +def test_simulate_simple_transfer(ethermint, geth): + """Basic ETH transfer with balance override.""" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + SENDER: {"balance": "0x3e8"}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x3e8", + } + ], + } + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_block = eth_res["result"][0] + geth_block = geth_res["result"][0] + + eth_call = eth_block["calls"][0] + geth_call = geth_block["calls"][0] + assert eth_call["status"] == geth_call["status"] == "0x1" + assert eth_call["gasUsed"] == geth_call["gasUsed"] + assert eth_call["returnData"] == geth_call["returnData"] + assert eth_call["logs"] == geth_call["logs"] == [] + + +def test_simulate_multi_block(ethermint, geth): + """State carries across blocks.""" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + SENDER: {"balance": "0xde0b6b3a7640000"}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x1", + }, + { + "from": SENDER, + "to": RECEIVER2, + "value": "0x1", + }, + ], + }, + { + "calls": [ + { + "from": RECEIVER, + "to": RECEIVER2, + "value": "0x1", + }, + ], + }, + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + # Both should have 2 blocks + assert len(eth_res["result"]) == len(geth_res["result"]) == 2 + + # All calls should succeed + for bi in range(2): + for ci in range(len(eth_res["result"][bi]["calls"])): + assert ( + eth_res["result"][bi]["calls"][ci]["status"] + == geth_res["result"][bi]["calls"][ci]["status"] + == "0x1" + ) + assert ( + eth_res["result"][bi]["calls"][ci]["gasUsed"] + == geth_res["result"][bi]["calls"][ci]["gasUsed"] + ) + + +def test_simulate_insufficient_funds(ethermint, geth): + """Transfer without balance override in validation mode -> error.""" + params = [ + { + "blockStateCalls": [ + { + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x3e8", + "nonce": "0x0", + } + ], + } + ], + "validation": True, + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + # Both should return an error + assert "error" in eth_res, f"ethermint succeeded unexpectedly: {eth_res}" + assert "error" in geth_res, f"geth succeeded unexpectedly: {geth_res}" + + eth_err = eth_res["error"] + geth_err = geth_res["error"] + assert eth_err["code"] == geth_err["code"] + + +def test_simulate_block_overrides(ethermint, geth): + """NUMBER opcode in default simulate context returns a positive block (parity).""" + # No blockOverrides here — verifies default simulated block.number > 0 vs geth. + # Bytecode: NUMBER PUSH0 MSTORE PUSH1 0x20 PUSH0 RETURN + # 43 5f 52 6020 5f f3 + code = "0x435f5260205ff3" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + RECEIVER: {"code": code}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + } + ], + } + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_call = eth_res["result"][0]["calls"][0] + geth_call = geth_res["result"][0]["calls"][0] + + assert eth_call["status"] == geth_call["status"] == "0x1", ( + f"eth status={eth_call['status']} error={eth_call.get('error')}, " + f"geth status={geth_call['status']} error={geth_call.get('error')}" + ) + # returnData should contain a block number > 0 + assert int(eth_call["returnData"], 16) > 0 + assert int(geth_call["returnData"], 16) > 0 + + +def test_simulate_block_overrides_number_opcode(ethermint, geth): + """blockOverrides.number is what NUMBER returns; ethermint matches geth.""" + code = "0x435f5260205ff3" + + def process(w3): + current = int(w3.provider.make_request("eth_blockNumber", [])["result"], 16) + target = current + 1 + params = [ + { + "blockStateCalls": [ + { + "blockOverrides": {"number": hex(target)}, + "stateOverrides": {RECEIVER: {"code": code}}, + "calls": [{"from": SENDER, "to": RECEIVER}], + } + ] + }, + "latest", + ] + return w3.provider.make_request(METHOD, params), target + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exc: + tasks = [exc.submit(process, w3) for w3 in providers] + (eth_res, eth_target), (geth_res, geth_target) = [t.result() for t in tasks] + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + def get_first_call(sim_result): + for block in sim_result["result"]: + calls = block.get("calls") or [] + if calls: + return calls[0] + raise AssertionError(f"no calls in simulate result: {sim_result!r}") + + eth_data = get_first_call(eth_res)["returnData"] + geth_data = get_first_call(geth_res)["returnData"] + assert int(eth_data, 16) == eth_target + assert int(geth_data, 16) == geth_target + + +def test_simulate_block_number_order(ethermint, geth): + """Block 12 then block 11 -> error.""" + params = [ + { + "blockStateCalls": [ + { + "blockOverrides": {"number": "0xc"}, + }, + { + "blockOverrides": {"number": "0xb"}, + }, + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "error" in eth_res + assert "error" in geth_res + assert eth_res["error"]["code"] == geth_res["error"]["code"] + + +def test_simulate_storage_contract(ethermint, geth): + """Override code, store(5) then retrieve() across calls.""" + # Runtime code: if calldatasize > 0, store calldataload(0) at slot 0, then stop + # Else: load slot 0 and return 32 bytes + # + # CALLDATASIZE ISZERO PUSH1 0x0a JUMPI (36 15 600a 57) + # PUSH0 CALLDATALOAD PUSH0 SSTORE STOP (5f 35 5f 55 00) + # JUMPDEST PUSH0 SLOAD PUSH0 MSTORE PUSH1 0x20 PUSH0 RETURN + # (5b 5f 54 5f 52 6020 5f f3) + runtime = "0x3615600a575f355f55005b5f545f5260205ff3" + data = "0x0000000000000000000000000000000000000000000000000000000000000005" + + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + RECEIVER: {"code": runtime}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "data": data, + }, + { + "from": SENDER, + "to": RECEIVER, + }, + ], + } + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + # Both calls should succeed + eth_calls = eth_res["result"][0]["calls"] + geth_calls = geth_res["result"][0]["calls"] + + for i in range(2): + assert eth_calls[i]["status"] == geth_calls[i]["status"] == "0x1", ( + f"call {i}: eth status={eth_calls[i]['status']} " + f"error={eth_calls[i].get('error')}, " + f"geth status={geth_calls[i]['status']} " + f"error={geth_calls[i].get('error')}" + ) + + # Second call should return the stored value (5) + assert eth_calls[1]["returnData"] == geth_calls[1]["returnData"] + + +def test_simulate_transfer_logs(ethermint, geth): + """traceTransfers=true -> synthetic Transfer logs.""" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + SENDER: {"balance": "0xde0b6b3a7640000"}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x1", + } + ], + } + ], + "traceTransfers": True, + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_logs = eth_res["result"][0]["calls"][0]["logs"] + geth_logs = geth_res["result"][0]["calls"][0]["logs"] + + # Should have synthetic Transfer log + assert len(eth_logs) == len(geth_logs) + assert len(eth_logs) > 0 + + # Check the synthetic Transfer log + eth_log = eth_logs[0] + geth_log = geth_logs[0] + + # Address should be the ERC-7528 address + expected_addr = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + assert eth_log["address"].lower() == expected_addr + assert geth_log["address"].lower() == expected_addr + + # Topics should match + assert eth_log["topics"] == geth_log["topics"] + assert eth_log["data"] == geth_log["data"] + + +def test_simulate_validation_nonce_error(ethermint, geth): + """Nonce too high in validation mode -> error.""" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + SENDER: {"balance": "0xde0b6b3a7640000"}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "nonce": "0xff", + } + ], + } + ], + "validation": True, + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "error" in eth_res, "ethermint succeeded unexpectedly" + assert "error" in geth_res, "geth succeeded unexpectedly" + + assert eth_res["error"]["code"] == geth_res["error"]["code"] + + +def test_simulate_validation_success(ethermint, geth): + """Valid tx with proper nonce and sufficient maxFeePerGas in validation mode.""" + # In validation mode, baseFee is calculated from parent. We must provide + # a maxFeePerGas high enough to cover it and enough balance for gas * fee + value. + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + # 100 ETH — enough for gas * maxFeePerGas + value + SENDER: { + "balance": "0x56bc75e2d63100000", + "nonce": "0x0", + }, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x1", + "nonce": "0x0", + "maxFeePerGas": "0x174876e800", + "maxPriorityFeePerGas": "0x0", + } + ], + } + ], + "validation": True, + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_call = eth_res["result"][0]["calls"][0] + geth_call = geth_res["result"][0]["calls"][0] + assert eth_call["status"] == geth_call["status"] == "0x1" + assert eth_call["gasUsed"] == geth_call["gasUsed"] + + +def test_simulate_chain_linkage(ethermint, geth): + """parentHash linkage across 3 blocks.""" + params = [ + { + "blockStateCalls": [ + {}, + {}, + {}, + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + assert len(eth_res["result"]) == len(geth_res["result"]) == 3 + + # Check that block numbers are sequential (relative, not absolute) + for res in [eth_res, geth_res]: + blocks = res["result"] + for i in range(1, len(blocks)): + prev_num = int(blocks[i - 1]["number"], 16) + cur_num = int(blocks[i]["number"], 16) + assert ( + cur_num == prev_num + 1 + ), f"block numbers not sequential: {prev_num} -> {cur_num}" + + +def test_simulate_gap_fill(ethermint, geth): + """Block number gap with small gap -> empty blocks inserted.""" + # Use relative block numbers: current+1 then current+4 = 2 gap blocks + # We do NOT hardcode block numbers; use two separate requests with overrides + # relative to the first block. + + def process(w3): + # First get current block number + current = int(w3.provider.make_request("eth_blockNumber", [])["result"], 16) + n1 = hex(current + 1) + n2 = hex(current + 4) # gap of 2 empty blocks + params = [ + { + "blockStateCalls": [ + {"blockOverrides": {"number": n1}}, + {"blockOverrides": {"number": n2}}, + ] + }, + hex(current), # pin base block to avoid race with chain advancing + ] + return w3.provider.make_request(METHOD, params) + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exc: + tasks = [exc.submit(process, w3) for w3 in providers] + results = [t.result() for t in tasks] + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + # Should have 4 blocks: n1, n1+1 (gap), n1+2 (gap), n2 + assert len(eth_res["result"]) == len(geth_res["result"]) == 4 + + +def test_simulate_basefee_non_validation(ethermint, geth): + """BASEFEE=0 by default in non-validation mode, respects override.""" + # Bytecode: BASEFEE PUSH0 MSTORE PUSH1 0x20 PUSH0 RETURN + # 48 5f 52 6020 5f f3 + code = "0x485f5260205ff3" + + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + RECEIVER: {"code": code}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + } + ], + } + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_call = eth_res["result"][0]["calls"][0] + geth_call = geth_res["result"][0]["calls"][0] + assert eth_call["status"] == geth_call["status"] == "0x1", ( + f"eth status={eth_call['status']} error={eth_call.get('error')}, " + f"geth status={geth_call['status']} error={geth_call.get('error')}" + ) + # Base fee should be 0 in non-validation mode + assert eth_call["returnData"] == geth_call["returnData"] + assert int(eth_call["returnData"], 16) == 0 + + +def test_simulate_precompile_override(ethermint, geth): + """Override ecrecover (0x01) with custom bytecode.""" + # Override ecrecover with bytecode that returns 0x42 + # PUSH1 0x42 PUSH0 MSTORE PUSH1 0x20 PUSH0 RETURN + # 6042 5f 52 6020 5f f3 + code = "0x60425f5260205ff3" + ecrecover_addr = "0x0000000000000000000000000000000000000001" + + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + ecrecover_addr: {"code": code}, + }, + "calls": [ + { + "from": SENDER, + "to": ecrecover_addr, + } + ], + } + ] + }, + "latest", + ] + results = execute(ethermint, geth, params) + eth_res, geth_res = results + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_call = eth_res["result"][0]["calls"][0] + geth_call = geth_res["result"][0]["calls"][0] + assert eth_call["status"] == geth_call["status"] == "0x1", ( + f"eth status={eth_call['status']} error={eth_call.get('error')}, " + f"geth status={geth_call['status']} error={geth_call.get('error')}" + ) + assert eth_call["returnData"] == geth_call["returnData"] + assert int(eth_call["returnData"], 16) == 0x42 + + +def test_simulate_block_schema_and_full_transactions(ethermint, geth): + base_params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + SENDER: {"balance": "0xde0b6b3a7640000"}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x1", + } + ], + } + ] + }, + "latest", + ] + eth_res, geth_res = execute(ethermint, geth, base_params) + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_block = eth_res["result"][0] + geth_block = geth_res["result"][0] + + for key in [ + "hash", + "parentHash", + "stateRoot", + "receiptsRoot", + "transactionsRoot", + "transactions", + "difficulty", + ]: + assert key in eth_block + assert key in geth_block + + assert len(eth_block["transactions"]) == len(geth_block["transactions"]) == 1 + + full_params = [ + { + "blockStateCalls": base_params[0]["blockStateCalls"], + "returnFullTransactions": True, + }, + "latest", + ] + eth_res, geth_res = execute(ethermint, geth, full_params) + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + eth_tx = eth_res["result"][0]["transactions"][0] + geth_tx = geth_res["result"][0]["transactions"][0] + assert eth_tx["from"].lower() == geth_tx["from"].lower() == SENDER + assert eth_tx["to"].lower() == geth_tx["to"].lower() == RECEIVER + + +def test_simulate_blockhash_uses_base_block(ethermint, geth): + + def process(w3): + latest = w3.provider.make_request("eth_getBlockByNumber", ["latest", False])[ + "result" + ] + block_num = int(latest["number"], 16) + code = f"0x7f{block_num:064x}405f5260205ff3" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + RECEIVER: {"code": code}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + } + ], + } + ] + }, + "latest", + ] + result = w3.provider.make_request(METHOD, params) + expected = "0x" + latest["hash"][2:].rjust(64, "0").lower() + return result, expected + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exc: + tasks = [exc.submit(process, w3) for w3 in providers] + (eth_res, eth_hash), (geth_res, geth_hash) = [t.result() for t in tasks] + + assert "result" in eth_res, f"ethermint error: {eth_res.get('error')}" + assert "result" in geth_res, f"geth error: {geth_res.get('error')}" + + assert eth_res["result"][0]["calls"][0]["returnData"].lower() == eth_hash + assert geth_res["result"][0]["calls"][0]["returnData"].lower() == geth_hash + + +def test_simulate_empty_block_state_calls_error_code(ethermint, geth): + """Empty blockStateCalls should return the invalid-params code.""" + params = [ + { + "blockStateCalls": [], + }, + "latest", + ] + eth_res, geth_res = execute(ethermint, geth, params) + + assert "error" in eth_res + assert "error" in geth_res + assert eth_res["error"]["code"] == geth_res["error"]["code"] == -32602 + + +def test_simulate_too_many_blocks_error_code(ethermint, geth): + """More than 256 simulated blocks should return the client-limit code.""" + params = [ + { + "blockStateCalls": [{} for _ in range(257)], + }, + "latest", + ] + eth_res, geth_res = execute(ethermint, geth, params) + + assert "error" in eth_res + assert "error" in geth_res + assert eth_res["error"]["code"] == geth_res["error"]["code"] == -38026 + + +def test_simulate_balance_override_overflow(ethermint, geth): + """Balances larger than uint256 should be rejected instead of truncated.""" + params = [ + { + "blockStateCalls": [ + { + "stateOverrides": { + SENDER: {"balance": "0x1" + "0" * 64}, + }, + "calls": [ + { + "from": SENDER, + "to": RECEIVER, + "value": "0x1", + } + ], + } + ] + }, + "latest", + ] + eth_res, geth_res = execute(ethermint, geth, params) + + assert "error" in eth_res + assert "error" in geth_res + assert eth_res["error"]["code"] == geth_res["error"]["code"] == -32602 diff --git a/tests/integration_tests/test_tracers.py b/tests/integration_tests/test_tracers.py index eedb0f031d..e890d454d6 100644 --- a/tests/integration_tests/test_tracers.py +++ b/tests/integration_tests/test_tracers.py @@ -2,7 +2,8 @@ import json from concurrent.futures import ThreadPoolExecutor, as_completed -from web3 import Web3 +import pytest +from web3 import Web3, exceptions from .expected_constants import ( EXPECTED_BLOCK_OVERRIDES_TRACERS, @@ -13,30 +14,35 @@ EXPECTED_STRUCT_TRACER, ) from .utils import ( + ACCOUNTS, ADDRS, CONTRACTS, create_contract_transaction, deploy_contract, derive_new_account, derive_random_account, + send_raw_transactions, send_transaction, send_txs, + sign_transaction, w3_wait_for_new_blocks, + wait_for_fn, ) def test_out_of_gas_error(ethermint, geth): method = "debug_traceTransaction" tracer = {"tracer": "callTracer"} - iterations = 1 + iterations = 10 acc = derive_random_account() def process(w3): # fund new sender to deploy contract with same address fund_acc(w3, acc) contract, _ = deploy_contract(w3, CONTRACTS["TestMessageCall"], key=acc.key) - tx = contract.functions.test(iterations).build_transaction({"gas": 21204}) - tx_hash = send_transaction(w3, tx)["transactionHash"].hex() + # increase gas to pass EIP-7623: Floor Data Gas + tx = contract.functions.test(iterations).build_transaction({"gas": 21510}) + tx_hash = Web3.to_hex(send_transaction(w3, tx)["transactionHash"]) res = [] call = w3.provider.make_request resp = call(method, [tx_hash, tracer]) @@ -62,7 +68,7 @@ def process(w3): fund_acc(w3, acc) tx = create_contract_transaction(w3, CONTRACTS["TestMessageCall"], key=acc.key) tx["gas"] = 210000 - tx_hash = send_transaction(w3, tx, key=acc.key)["transactionHash"].hex() + tx_hash = Web3.to_hex(send_transaction(w3, tx, key=acc.key)["transactionHash"]) res = [] call = w3.provider.make_request resp = call(method, [tx_hash, tracer]) @@ -89,7 +95,7 @@ def process(w3): fund_acc(w3, acc) call = w3.provider.make_request tx = {"to": ADDRS["community"], "value": 100, "gasPrice": price} - tx_hash = send_transaction(w3, tx)["transactionHash"].hex() + tx_hash = Web3.to_hex(send_transaction(w3, tx)["transactionHash"]) tx_res = call(method, [tx_hash]) assert tx_res["result"] == EXPECTED_STRUCT_TRACER, "" tx_res = call(method, [tx_hash, tracer]) @@ -99,8 +105,9 @@ def process(w3): [tx_hash, tracer | {"tracerConfig": {"onlyTopCall": True}}], ) assert tx_res["result"] == EXPECTED_CALLTRACERS, "" + call = w3.provider.make_request _, tx = deploy_contract(w3, CONTRACTS["TestERC20A"], key=acc.key) - tx_hash = tx["transactionHash"].hex() + tx_hash = Web3.to_hex(tx["transactionHash"]) w3_wait_for_new_blocks(w3, 1) tx_res = call(method, [tx_hash, tracer]) return json.dumps(tx_res["result"], sort_keys=True) @@ -113,8 +120,7 @@ def process(w3): assert res[0] == res[-1] == EXPECTED_CONTRACT_CREATE_TRACER, res -def fund_acc(w3, acc): - fund = 3000000000000000000 +def fund_acc(w3, acc, fund=3000000000000000000): addr = acc.address if w3.eth.get_balance(addr, "latest") == 0: tx = {"to": addr, "value": fund, "gasPrice": w3.eth.gas_price} @@ -140,7 +146,7 @@ def process(w3): fund_acc(w3, acc) contract, _ = deploy_contract(w3, CONTRACTS["TestMessageCall"], key=acc.key) tx = contract.functions.test(iterations).build_transaction() - tx_hash = send_transaction(w3, tx)["transactionHash"].hex() + tx_hash = Web3.to_hex(send_transaction(w3, tx)["transactionHash"]) res = [] call = w3.provider.make_request with ThreadPoolExecutor(len(tracers)) as exec: @@ -157,6 +163,89 @@ def process(w3): assert res[0] == res[-1], res +def test_trace_tx_reverse_transfer(ethermint): + print("reproduce only") + return + method = "debug_traceTransaction" + tracer = {"tracer": "callTracer"} + acc = derive_new_account(11) + w3 = ethermint.w3 + fund_acc(w3, acc, fund=40000000000000000) + contract, _ = deploy_contract(w3, CONTRACTS["FeeCollector"]) + amt = 18633908679862681 + raw_transactions = [] + nonce = w3.eth.get_transaction_count(acc.address) + tx = contract.functions.mint(amt).build_transaction( + { + "from": acc.address, + "value": hex(amt), + "nonce": nonce, + } + ) + raw_transactions.append(sign_transaction(w3, tx, acc.key).raw_transaction) + tx = tx | {"nonce": nonce + 1} + raw_transactions.append(sign_transaction(w3, tx, acc.key).raw_transaction) + w3_wait_for_new_blocks(w3, 1) + sended_hash_set = send_raw_transactions(w3, raw_transactions) + for h in sended_hash_set: + tx_hash = Web3.to_hex(h) + tx_res = w3.provider.make_request( + method, + [tx_hash, tracer], + ) + print(tx_res) + + +@pytest.mark.flaky(max_runs=10) +def test_destruct(ethermint): + method = "debug_traceTransaction" + tracer = {"tracer": "callTracer"} + receiver = "0x0F0cb39319129BA867227e5Aae1abe9e7dd5f861" + acc = derive_new_account(11) # ethm13c2n7geavjfsqcan290mq74kajjlxehyzhly4p + w3 = ethermint.w3 + fund_acc(w3, acc, fund=10000000000000000000) + sender = acc.address + raw_transactions = [] + contracts = [] + total = 3 + for _ in range(total): + contract, _ = deploy_contract(w3, CONTRACTS["SelfDestruct"], key=acc.key) + contracts.append(contract) + + nonce = w3.eth.get_transaction_count(sender) + + for i in range(total): + tx = ( + contracts[i] + .functions.execute() + .build_transaction( + { + "from": sender, + "nonce": nonce, + "gas": 167115, + "gasPrice": 5050000000000, + "value": 353434350000000000, + } + ) + ) + raw_transactions.append(sign_transaction(w3, tx, acc.key).raw_transaction) + nonce += 1 + sended_hash_set = send_raw_transactions(w3, raw_transactions) + + def wait_balance(): + return w3.eth.get_balance(receiver) > 0 + + wait_for_fn("wait_balance", wait_balance) + for h in sended_hash_set: + tx_hash = Web3.to_hex(h) + res = w3.provider.make_request( + method, + [tx_hash, tracer], + ) + print(tx_hash, res) + assert "insufficient funds" not in res, res + + def test_tracecall_insufficient_funds(ethermint, geth): method = "debug_traceCall" acc = derive_random_account() @@ -343,9 +432,9 @@ def process(w3): def test_tracecall_diff(ethermint, geth): method = "debug_traceCall" tracer = {"tracer": "prestateTracer", "tracerConfig": {"diffMode": True}} - sender_acc = derive_new_account(4) + sender_acc = derive_new_account(16) sender = sender_acc.address - receiver = derive_new_account(5).address + receiver = derive_new_account(17).address fund = 3000000000000000000 gas = 21000 price = 88500000000 @@ -459,8 +548,104 @@ def process(w3): assert res[0] == res[-1] == balance, res +def test_refund_unused_gas_when_contract_tx_reverted(ethermint): + w3 = ethermint.w3 + test_revert, _ = deploy_contract(w3, CONTRACTS["TestRevert"]) + gas = 1000000 + gas_price = 600000000 + acc = derive_new_account(10) + fund_acc(w3, acc, fund=10000000000000000000) + p = ethermint.cosmos_cli().get_params("feemarket")["params"] + min_gas_multiplier = float(p["min_gas_multiplier"]) + sender = acc.address.lower() + tx_res = w3.provider.make_request( + "debug_traceCall", + [ + { + "value": "0x0", + "to": test_revert.address, + "from": sender, + "data": "0x9ffb86a5", + "gas": hex(gas), + "gasPrice": hex(gas_price), + }, + "latest", + { + "tracer": "prestateTracer", + "tracerConfig": { + "diffMode": True, + }, + }, + ], + ) + assert "result" in tx_res + tx_res = tx_res["result"] + pre = int(tx_res["pre"][sender]["balance"], 16) + post = int(tx_res["post"][sender]["balance"], 16) + print(pre, post) + print(gas, gas_price, min_gas_multiplier) + diff = pre - gas * gas_price * min_gas_multiplier - post + assert diff == 0, diff + + pre = w3.eth.get_balance(acc.address) + receipt = send_transaction( + w3, + test_revert.functions.revertWithMsg().build_transaction( + { + "gas": gas, + "gasPrice": gas_price, + } + ), + key=acc.key, + ) + assert receipt["status"] == 0, receipt["status"] + post = w3.eth.get_balance(acc.address) + diff = pre - gas * gas_price * min_gas_multiplier - post + assert diff == 0, diff + + +def test_refund_unused_gas_when_contract_tx_reverted_state_overrides(ethermint): + w3 = ethermint.w3 + test_revert, _ = deploy_contract(w3, CONTRACTS["TestRevert"]) + gas = 21000 + gas_price = 6060000000000 + acc = derive_new_account(10) + fund_acc(w3, acc, fund=10000000000000000000) + sender = acc.address.lower() + balance = 10000000000000000000000 + nonce = 1000 + tx_res = w3.provider.make_request( + "debug_traceCall", + [ + { + "value": "0x1", + "to": test_revert.address, + "from": sender, + "gas": hex(gas), + "gasPrice": hex(gas_price), + }, + "latest", + { + "tracer": "prestateTracer", + "stateOverrides": { + sender: { + "balance": hex(balance), + "nonce": hex(nonce), + } + }, + }, + ], + ) + assert "result" in tx_res + tx_res = tx_res["result"] + balance_af = int(tx_res[sender]["balance"], 16) + nonce_af = tx_res[sender]["nonce"] + assert balance_af == balance, balance_af + assert nonce_af == nonce, nonce_af + + def test_debug_tracecall_return_revert_data_when_call_failed(ethermint, geth): - expected = "08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a46756e6374696f6e20686173206265656e207265766572746564000000000000" # noqa: E501 + expected = "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a46756e6374696f6e20686173206265656e207265766572746564000000000000" # noqa: E501 def process(w3): test_revert, _ = deploy_contract(w3, CONTRACTS["TestRevert"]) @@ -557,14 +742,215 @@ def process(w3): res = [] call = w3.provider.make_request with ThreadPoolExecutor(len(sended_hash_set)) as exec: - params = [[tx_hash.hex(), tracer] for tx_hash in sended_hash_set] + params = [[Web3.to_hex(tx_hash), tracer] for tx_hash in sended_hash_set] exec_map = exec.map(call, itertools.repeat(method), params) res = [json.dumps(resp["result"], sort_keys=True) for resp in exec_map] return res + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.exception() for future in as_completed(tasks)] + assert len(res) == len(providers) + assert isinstance(res[0], exceptions.ContractLogicError) + assert isinstance(res[-1], exceptions.ContractLogicError) + assert str(res[0]) == str(res[-1]) == "('execution reverted', '0x')" + + +def test_4byte_tracer_intrinsic_gas_too_low(ethermint, geth): + method = "debug_traceCall" + tracer = {"tracer": "4byteTracer"} + acc = derive_new_account(6) + + tx = { + "from": ACCOUNTS["community"].address, + "to": acc.address, + "gas": "0x4e29", + } + + def process(w3): + tx_res = w3.provider.make_request(method, [tx, "latest", tracer]) + return json.dumps(tx_res["error"], sort_keys=True) + providers = [ethermint.w3, geth.w3] with ThreadPoolExecutor(len(providers)) as exec: tasks = [exec.submit(process, w3) for w3 in providers] res = [future.result() for future in as_completed(tasks)] assert len(res) == len(providers) - assert res[0] == res[-1], res + res = [json.loads(r) for r in res] + assert res[0]["code"] == res[-1]["code"] == -32000 + assert "intrinsic gas too low" in res[0]["message"] + assert "intrinsic gas too low" in res[-1]["message"] + + +def test_4byte_tracer_success(ethermint, geth): + method = "debug_traceCall" + tracer = {"tracer": "4byteTracer"} + acc = derive_new_account(6) + + tx = { + "from": ACCOUNTS["community"].address, + "to": acc.address, + "gas": hex(21000), + } + + def process(w3): + tx_res = w3.provider.make_request(method, [tx, "latest", tracer]) + return json.dumps(tx_res["result"], sort_keys=True) + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + assert len(res) == len(providers) + assert res[0] == res[-1] + + +def test_prestate_tracer_block_miner_address(ethermint, geth): + """ + prestateTracer on a tx will include the block miner address + """ + acc = ACCOUNTS["community"] + receiver = derive_new_account(12) + + def process(w3): + assert ( + w3.eth.get_balance(receiver.address) == 0 + ), "receiver balance need to be 0" + tx = { + "from": acc.address, + "to": receiver.address, + "value": 1, + } + receipt = send_transaction(w3, tx, key=acc.key) + tx_hash = Web3.to_hex(receipt["transactionHash"]) + tracer = { + "tracer": "prestateTracer", + "tracerConfig": {"includeEmpty": True}, + } + tx_res = w3.provider.make_request("debug_traceTransaction", [tx_hash, tracer]) + latest_block = w3.eth.get_block(receipt.blockNumber) + block_miner = latest_block.miner + return [json.dumps(tx_res["result"], sort_keys=True), block_miner] + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + miner_lhs = res[0][1].lower() + miner_rhs = res[1][1].lower() + assert len(res) == len(providers) + + from_addr = acc.address.lower() + to_addr = receiver.address.lower() + + lhs = json.loads(res[0][0]) + rhs = json.loads(res[1][0]) + + assert len(lhs) == len(rhs) == 3, (lhs, rhs) + + assert lhs[from_addr] is not None + assert lhs[to_addr] is not None + assert rhs[from_addr] is not None + assert rhs[to_addr] is not None + assert lhs[miner_lhs] is not None + assert rhs[miner_rhs] is not None + + +def test_prestate_tracer_block_miner_address_default_tracer_config(ethermint, geth): + """ + prestateTracer defaults to includeEmpty=false + """ + acc = ACCOUNTS["community"] + receiver = derive_new_account(15) + + def process(w3): + assert ( + w3.eth.get_balance(receiver.address) == 0 + ), "receiver balance need to be 0" + tx = { + "from": acc.address, + "to": receiver.address, + "value": 1, + } + receipt = send_transaction(w3, tx, key=acc.key) + tx_hash = Web3.to_hex(receipt["transactionHash"]) + tracer = {"tracer": "prestateTracer"} + tx_res = w3.provider.make_request("debug_traceTransaction", [tx_hash, tracer]) + assert "result" in tx_res, tx_res + latest_block = w3.eth.get_block(receipt.blockNumber) + block_miner = latest_block.miner + return [json.dumps(tx_res["result"], sort_keys=True), block_miner] + + providers = [ethermint.w3, geth.w3] + with ThreadPoolExecutor(len(providers)) as exec: + tasks = [exec.submit(process, w3) for w3 in providers] + res = [future.result() for future in as_completed(tasks)] + miner_lhs = res[0][1].lower() + miner_rhs = res[1][1].lower() + assert len(res) == len(providers) + + from_addr = acc.address.lower() + to_addr = receiver.address.lower() + + lhs = json.loads(res[0][0]) + rhs = json.loads(res[1][0]) + + assert len(lhs) == len(rhs) == 2, (lhs, rhs) + assert lhs[from_addr] is not None + assert rhs[from_addr] is not None + assert to_addr not in lhs + assert to_addr not in rhs + assert lhs[miner_lhs] is not None + assert rhs[miner_rhs] is not None + + +@pytest.mark.parametrize( + "tracer, receiver_n", + [ + ( + { + "tracer": "prestateTracer", + "tracerConfig": {"includeEmpty": False}, + }, + 13, + ), + ( + {"tracer": "prestateTracer"}, + 14, + ), + ], + ids=["include-empty-false", "default-tracer-config"], +) +def test_prestate_tracer_include_empty_false_result_length( + ethermint, geth, tracer, receiver_n +): + """ + prestateTracer defaults to includeEmpty=false + """ + acc = ACCOUNTS["community"] + receiver = derive_new_account(receiver_n) + + def process(w3): + assert ( + w3.eth.get_balance(receiver.address) == 0 + ), "receiver balance need to be 0" + tx = { + "from": acc.address, + "to": receiver.address, + "value": 1, + } + receipt = send_transaction(w3, tx, key=acc.key) + tx_hash = Web3.to_hex(receipt["transactionHash"]) + tx_res = w3.provider.make_request("debug_traceTransaction", [tx_hash, tracer]) + assert "result" in tx_res, tx_res + return tx_res["result"] + + providers = {"ethermint": ethermint.w3, "geth": geth.w3} + with ThreadPoolExecutor(len(providers)) as exec: + tasks = { + exec.submit(process, w3): name + for name, w3 in providers.items() + } + res = {tasks[future]: future.result() for future in as_completed(tasks)} + assert len(res["ethermint"]) == len(res["geth"]), res diff --git a/tests/integration_tests/test_trycatch_gas.py b/tests/integration_tests/test_trycatch_gas.py new file mode 100644 index 0000000000..104a3e7044 --- /dev/null +++ b/tests/integration_tests/test_trycatch_gas.py @@ -0,0 +1,51 @@ +from concurrent.futures import ThreadPoolExecutor + +import pytest + +from .utils import ADDRS, CONTRACTS, deploy_contract, send_transaction + +pytestmark = pytest.mark.filter + + +def test_trycatch_gas_estimation_underestimate(ethermint, geth): + def process(w3, name): + contract, _ = deploy_contract(w3, CONTRACTS["GasConsumerTryCatch"]) + tx = contract.functions.callWithTryCatch(20, False).build_transaction( + { + "from": ADDRS["community"], + } + ) + + estimated_gas = w3.eth.estimate_gas(tx) + tx["gas"] = 1000000 + receipt = send_transaction(w3, tx) + actual_gas = receipt["gasUsed"] + + # Calculate the difference + gas_diff = actual_gas - estimated_gas + + return { + "name": name, + "estimated_gas": estimated_gas, + "actual_gas": actual_gas, + "gas_diff": gas_diff, + } + + with ThreadPoolExecutor(max_workers=2) as executor: + ethermint_future = executor.submit(process, ethermint.w3, "ethermint") + geth_future = executor.submit(process, geth.w3, "geth") + ethermint_result = ethermint_future.result() + geth_result = geth_future.result() + + # Compare results from ethermint and geth + for result in (ethermint_result, geth_result): + assert result["gas_diff"] == 0, ( + f"Testing on {result['name']} " + f"Gas estimation is not accurate: " + f"{result['estimated_gas']} estimated vs " + f"{result['actual_gas']} actual " + f"({result['gas_diff']} difference)" + ) + + assert ethermint_result["estimated_gas"] == geth_result["estimated_gas"] + assert ethermint_result["actual_gas"] == geth_result["actual_gas"] diff --git a/tests/integration_tests/test_types.py b/tests/integration_tests/test_types.py index 237cf3896a..bcd1b3e1b7 100644 --- a/tests/integration_tests/test_types.py +++ b/tests/integration_tests/test_types.py @@ -22,11 +22,23 @@ def test_block(ethermint, geth): - get_blocks(ethermint, geth, False) - get_blocks(ethermint, geth, True) - - -def get_blocks(ethermint_rpc_ws, geth, with_transactions): + whitelist_keys = [ + # EIP-4895 + "withdrawals", + "withdrawalsRoot", + # EIP-4788 + "parentBeaconBlockRoot", + # EIP-4844 + "blobGasUsed", + "excessBlobGas", + # EIP-7685 + "requestsHash" + ] + get_blocks(ethermint, geth, False, whitelist_keys) + get_blocks(ethermint, geth, True, whitelist_keys) + + +def get_blocks(ethermint_rpc_ws, geth, with_transactions, whitelist_keys=[]): w3: Web3 = ethermint_rpc_ws.w3 eth_rpc = w3.provider geth_rpc = geth.w3.provider @@ -39,17 +51,26 @@ def wait_blk(): geth_blk = wait_for_fn("wait_blk", wait_blk) make_same_rpc_calls( - eth_rpc, geth_rpc, "eth_getBlockByNumber", ["0x2", with_transactions] + eth_rpc, + geth_rpc, + "eth_getBlockByNumber", + ["0x2", with_transactions], + whitelist_keys ) make_same_rpc_calls( - eth_rpc, geth_rpc, "eth_getBlockByNumber", ["0x2710", with_transactions] + eth_rpc, + geth_rpc, + "eth_getBlockByNumber", + ["0x2710", with_transactions], + whitelist_keys, ) ethermint_blk = w3.eth.get_block(1) # Get existing block, no transactions eth_rsp = eth_rpc.make_request( - "eth_getBlockByHash", [ethermint_blk["hash"].hex(), with_transactions] + "eth_getBlockByHash", + [Web3.to_hex(ethermint_blk["hash"]), with_transactions], ) geth_rsp = geth_rpc.make_request( "eth_getBlockByHash", @@ -58,7 +79,7 @@ def wait_blk(): with_transactions, ], ) - compare_types(eth_rsp, geth_rsp) + compare_types(eth_rsp, geth_rsp, whitelist_keys) # Get not existing block make_same_rpc_calls( @@ -91,13 +112,6 @@ def test_syncing(ethermint_rpc_ws, geth): make_same_rpc_calls(eth_rpc, geth_rpc, "eth_syncing", []) -def test_coinbase(ethermint_rpc_ws, geth): - w3: Web3 = ethermint_rpc_ws.w3 - eth_rpc = w3.provider - geth_rpc = geth.w3.provider - make_same_rpc_calls(eth_rpc, geth_rpc, "eth_coinbase", []) - - def test_max_priority_fee(ethermint_rpc_ws, geth): w3: Web3 = ethermint_rpc_ws.w3 eth_rpc = w3.provider @@ -198,7 +212,7 @@ def send_tnx(w3, tx_value=10): def send_and_get_hash(w3, tx_value=10): - return send_tnx(w3, tx_value)["transactionHash"].hex() + return Web3.to_hex(send_tnx(w3, tx_value)["transactionHash"]) def test_get_proof(ethermint_rpc_ws, geth): @@ -301,6 +315,16 @@ def test_get_transaction(ethermint_rpc_ws, geth): compare_types(EXPECTED_GET_TRANSACTION, tx_res) + tx = tx_res["result"] + assert "blockTimestamp" in tx, ( + "blockTimestamp missing from eth_getTransactionByHash response" + ) + block_res = eth_rpc.make_request("eth_getBlockByHash", [tx["blockHash"], False]) + assert tx["blockTimestamp"] == block_res["result"]["timestamp"], ( + f"blockTimestamp {tx['blockTimestamp']} " + f"!= block timestamp {block_res['result']['timestamp']}" + ) + def test_get_transaction_receipt(ethermint_rpc_ws, geth): w3: Web3 = ethermint_rpc_ws.w3 @@ -323,14 +347,27 @@ def test_fee_history(ethermint_rpc_ws, geth): w3: Web3 = ethermint_rpc_ws.w3 eth_rpc = w3.provider geth_rpc = geth.w3.provider - make_same_rpc_calls(eth_rpc, geth_rpc, "eth_feeHistory", [4, "latest", [10, 90]]) + whitelist_keys = ["baseFeePerBlobGas", "blobGasUsedRatio"] + make_same_rpc_calls( + eth_rpc, + geth_rpc, + "eth_feeHistory", + [4, "latest", [10, 90]], + whitelist_keys, + ) - make_same_rpc_calls(eth_rpc, geth_rpc, "eth_feeHistory", [4, "0x5000", [10, 90]]) + make_same_rpc_calls( + eth_rpc, + geth_rpc, + "eth_feeHistory", + [4, "0x5000", [10, 90]], + whitelist_keys, + ) _ = send_and_get_hash(w3) fee_history = eth_rpc.make_request("eth_feeHistory", [4, "latest", [100]]) - compare_types(fee_history, EXPECTED_FEE_HISTORY) + compare_types(fee_history, EXPECTED_FEE_HISTORY, whitelist_keys) def test_estimate_gas(ethermint_rpc_ws, geth): @@ -350,8 +387,8 @@ def wait_blk(): make_same_rpc_calls(eth_rpc, geth_rpc, "eth_estimateGas", [{}]) -def compare_types(actual, expected): - res, err = same_types(actual, expected) +def compare_types(actual, expected, whitelist_keys=[]): + res, err = same_types(actual, expected, whitelist_keys) if not res: print(err) print(actual) @@ -359,10 +396,10 @@ def compare_types(actual, expected): assert res, err -def make_same_rpc_calls(rpc1, rpc2, method, params): +def make_same_rpc_calls(rpc1, rpc2, method, params, whitelist_keys=[]): res1 = rpc1.make_request(method, params) res2 = rpc2.make_request(method, params) - compare_types(res1, res2) + compare_types(res1, res2, whitelist_keys) def test_incomplete_send_transaction(ethermint_rpc_ws, geth): @@ -375,15 +412,17 @@ def test_incomplete_send_transaction(ethermint_rpc_ws, geth): make_same_rpc_calls(eth_rpc, geth_rpc, "eth_sendTransaction", [tx]) -def same_types(given, expected): +def same_types(given, expected, whitelist_keys=[]): if isinstance(given, dict): if not isinstance(expected, dict): return False, "A is dict, B is not" keys = list(set(list(given.keys()) + list(expected.keys()))) for key in keys: + if key in whitelist_keys: + continue if key not in expected or key not in given: return False, key + " key not on both json" - res, err = same_types(given[key], expected[key]) + res, err = same_types(given[key], expected[key], whitelist_keys) if not res: return res, key + " key failed. Error: " + err return True, "" @@ -393,7 +432,7 @@ def same_types(given, expected): if len(given) == 0 and len(expected) == 0: return True, "" if len(given) > 0 and len(expected) > 0: - return same_types(given[0], expected[0]) + return same_types(given[0], expected[0], whitelist_keys) else: return True, "" elif given is None and expected is None: diff --git a/tests/integration_tests/test_upgrade.py b/tests/integration_tests/test_upgrade.py index da02f3b4b2..214bdb55bf 100644 --- a/tests/integration_tests/test_upgrade.py +++ b/tests/integration_tests/test_upgrade.py @@ -1,4 +1,5 @@ import configparser +import hashlib import json import re import subprocess @@ -14,7 +15,9 @@ CONTRACTS, approve_proposal, deploy_contract, + eth_to_bech32, send_transaction, + submit_gov_proposal, wait_for_block, wait_for_port, ) @@ -84,7 +87,7 @@ def custom_ethermint(tmp_path_factory): ) -def test_cosmovisor_upgrade(custom_ethermint: Ethermint): +def test_cosmovisor_upgrade(custom_ethermint: Ethermint, tmp_path): """ - propose an upgrade and pass it - wait for it to happen @@ -166,3 +169,78 @@ def test_cosmovisor_upgrade(custom_ethermint: Ethermint): ) ) assert p == {"allowed_clients": ["06-solomachine", "07-tendermint", "09-localhost"]} + + p = cli.get_params("evm")["params"] + header_hash_num = "20" + p["header_hash_num"] = header_hash_num + # governance module account as signer + data = hashlib.sha256("gov".encode()).digest()[:20] + authority = eth_to_bech32(data) + submit_gov_proposal( + custom_ethermint, + tmp_path, + messages=[ + { + "@type": "/ethermint.evm.v1.MsgUpdateParams", + "authority": authority, + "params": p, + } + ], + ) + p = cli.get_params("evm")["params"] + assert p["header_hash_num"] == header_hash_num, p + contract, _ = deploy_contract(w3, CONTRACTS["TestBlockTxProperties"]) + for h in [target_height - 1, target_height, target_height + 1]: + res = contract.caller.getBlockHash(h).hex() + blk = w3.eth.get_block(h) + assert res == blk.hash.hex(), res + + height = w3.eth.block_number + for h in [ + height - int(header_hash_num) - 1, # num64 < lower + height + 100, # num64 >= upper + ]: + res = contract.caller.getBlockHash(h).hex() + assert res == "0" * 64, res + + target_height = w3.eth.block_number + 10 + print("upgrade height", target_height) + + plan_name = "sdk53" + rsp = cli.software_upgrade( + "community", + { + "name": plan_name, + "title": "upgrade test", + "note": "ditto", + "upgrade-height": target_height, + "summary": "summary", + "deposit": "10000aphoton", + }, + ) + assert rsp["code"] == 0, rsp["raw_log"] + approve_proposal(custom_ethermint, rsp) + + # update cli chain binary + custom_ethermint.chain_binary = ( + Path(custom_ethermint.chain_binary).parent.parent.parent + / f"{plan_name}/bin/ethermintd" + ) + cli = custom_ethermint.cosmos_cli() + + # block should pass the target height + wait_for_block(cli, target_height + 1, timeout=480) + wait_for_port(ports.rpc_port(custom_ethermint.base_port(0))) + + # check basic tx works - wait for EVM RPC to be ready + wait_for_port(ports.evmrpc_port(custom_ethermint.base_port(0))) + receipt = send_transaction( + custom_ethermint.w3, + { + "to": ADDRS["community"], + "value": 1000, + "maxFeePerGas": 10000000000000, + "maxPriorityFeePerGas": 10000, + }, + ) + assert receipt.status == 1 diff --git a/tests/integration_tests/test_websockets.py b/tests/integration_tests/test_websockets.py index ffe9e2542c..2f6bbde8c9 100644 --- a/tests/integration_tests/test_websockets.py +++ b/tests/integration_tests/test_websockets.py @@ -6,6 +6,7 @@ from eth_utils import abi from hexbytes import HexBytes from pystarport import ports +from web3 import Web3 from .network import Ethermint from .utils import ( @@ -85,7 +86,7 @@ def test_subscribe_basic(ethermint: Ethermint): """ modify_command_in_supervisor_config( ethermint.base_dir / "tasks.ini", - lambda cmd: f"{cmd} --evm.max-tx-gas-wanted {0}", + lambda cmd: f"{cmd}", ) ethermint.supervisorctl("update") wait_for_port(ports.evmrpc_ws_port(ethermint.base_port(0))) @@ -100,6 +101,19 @@ async def assert_unsubscribe(c: Client, sub_id): # unsubscribe again return False assert not await c.unsubscribe(sub_id) + async def subscriber_test(c: Client, w3): + sub_id = await c.subscribe("newHeads") + # wait for three new blocks + msgs = [await c.recv_subscription(sub_id) for i in range(3)] + # check blocks are consecutive + assert int(msgs[1]["number"], 0) == int(msgs[0]["number"], 0) + 1 + assert int(msgs[2]["number"], 0) == int(msgs[1]["number"], 0) + 1 + for msg in msgs: + b = w3.eth.get_block(msg["number"]) + assert HexBytes(msg["hash"]) == b["hash"] + assert msg["miner"] == b["miner"] + await assert_unsubscribe(c, sub_id) + async def logs_test(c: Client, w3, contract): method = "Transfer(address,address,uint256)" topic = f"0x{abi.event_signature_to_log_topic(method).hex()}" @@ -126,8 +140,8 @@ async def logs_test(c: Client, w3, contract): in msg["topics"] == [ topic, - HexBytes(b"\x00" * 12 + HexBytes(sender)).hex(), - HexBytes(b"\x00" * 12 + HexBytes(recipient)).hex(), + Web3.to_hex(HexBytes(b"\x00" * 12 + HexBytes(sender))), + Web3.to_hex(HexBytes(b"\x00" * 12 + HexBytes(recipient))), ] ) await assert_unsubscribe(c, sub_id) @@ -136,6 +150,8 @@ async def async_test(): async with websockets.connect(ethermint.w3_ws_endpoint) as ws: c = Client(ws) t = asyncio.create_task(c.receive_loop()) + # run three subscribers concurrently + await asyncio.gather(*[subscriber_test(c, ethermint.w3) for i in range(3)]) # run send concurrently await asyncio.gather(*[c.send(id) for id in ["0", 1, 2.0]]) contract, _ = deploy_contract(ethermint.w3, CONTRACTS["TestERC20A"]) diff --git a/tests/integration_tests/utils.py b/tests/integration_tests/utils.py index 4eb1fdcfa3..1777c563dd 100644 --- a/tests/integration_tests/utils.py +++ b/tests/integration_tests/utils.py @@ -16,6 +16,7 @@ from dotenv import load_dotenv from eth_account import Account from hexbytes import HexBytes +from web3 import Web3 from web3._utils.transactions import fill_nonce, fill_transaction_defaults from web3.exceptions import TimeExhausted @@ -43,6 +44,15 @@ "Calculator": "Calculator.sol", "Caller": "Caller.sol", "Random": "Random.sol", + "TestBlockTxProperties": "TestBlockTxProperties.sol", + "FeeCollector": "FeeCollector.sol", + "SelfDestruct": "SelfDestruct.sol", + "BytecodeDeployer": "BytecodeDeployer.sol", + "GasConsumerTryCatch": "GasConsumerTryCatch.sol", + "DelegationTarget": "DelegationTarget.sol", + "MaliciousDeployer": "MaliciousDeployer.sol", + "SelfDestructExploitFactory": "SelfDestructExploit.sol", + "Osaka": "Osaka.sol", } @@ -197,7 +207,7 @@ def send_transaction(w3, tx, key=KEYS["validator"], i=0): if i > 3: raise TimeExhausted signed = sign_transaction(w3, tx, key) - txhash = w3.eth.send_raw_transaction(signed.rawTransaction) + txhash = w3.eth.send_raw_transaction(signed.raw_transaction) try: return w3.eth.wait_for_transaction_receipt(txhash, timeout=20) except TimeExhausted: @@ -209,7 +219,7 @@ def send_txs(w3, txs): raw_transactions = [] for key in txs: signed = sign_transaction(w3, txs[key], key) - raw_transactions.append(signed.rawTransaction) + raw_transactions.append(signed.raw_transaction) # wait block update w3_wait_for_new_blocks(w3, 1, sleep=0.1) # send transactions @@ -221,7 +231,7 @@ def send_successful_transaction(w3, i=0): if i > 3: raise TimeExhausted signed = sign_transaction(w3, {"to": ADDRS["community"], "value": 1000}) - txhash = w3.eth.send_raw_transaction(signed.rawTransaction) + txhash = w3.eth.send_raw_transaction(signed.raw_transaction) try: receipt = w3.eth.wait_for_transaction_receipt(txhash, timeout=20) assert receipt.status == 1 @@ -289,7 +299,9 @@ def modify_command_in_supervisor_config(ini: Path, fn, **kwargs): def build_batch_tx(w3, cli, txs, key=KEYS["validator"]): "return cosmos batch tx and eth tx hashes" signed_txs = [sign_transaction(w3, tx, key) for tx in txs] - tmp_txs = [cli.build_evm_tx(signed.rawTransaction.hex()) for signed in signed_txs] + tmp_txs = [ + cli.build_evm_tx(Web3.to_hex(signed.raw_transaction)) for signed in signed_txs + ] msgs = [tx["body"]["messages"][0] for tx in tmp_txs] fee = sum(int(tx["auth_info"]["fee"]["amount"][0]["amount"]) for tx in tmp_txs) @@ -356,6 +368,21 @@ def cb(attrs): assert proposal["status"] == "PROPOSAL_STATUS_PASSED", proposal +def submit_gov_proposal(ethermint, tmp_path, **kwargs): + proposal = tmp_path / "proposal.json" + proposal_src = { + "title": "title", + "summary": "summary", + "deposit": "2aphoton", + **kwargs, + } + proposal.write_text(json.dumps(proposal_src)) + rsp = ethermint.cosmos_cli().submit_gov_proposal(proposal, from_="community") + assert rsp["code"] == 0, rsp["raw_log"] + approve_proposal(ethermint, rsp) + print("check params have been updated now") + + class ContractAddress(rlp.Serializable): fields = [ ("from", rlp.sedes.Binary()), @@ -371,3 +398,11 @@ def contract_address(addr, nonce): )[12:] ) ) + + +def fund_acc(w3, acc, fund=3000000000000000000): + addr = acc.address + if w3.eth.get_balance(addr, "latest") == 0: + tx = {"to": addr, "value": fund, "gasPrice": w3.eth.gas_price} + receipt = send_transaction(w3, tx) + assert w3.eth.get_balance(addr, receipt.blockNumber) == fund diff --git a/tests/rpc/rpc_test.go b/tests/rpc/rpc_test.go index e376d2efd0..9722d4e90f 100644 --- a/tests/rpc/rpc_test.go +++ b/tests/rpc/rpc_test.go @@ -129,7 +129,7 @@ func callWithError(method string, params interface{}) (*Response, error) { } if rpcRes.Error != nil { - return nil, fmt.Errorf(rpcRes.Error.Message) + return nil, fmt.Errorf("%s", rpcRes.Error.Message) } return rpcRes, nil diff --git a/tests/rpc/utils.go b/tests/rpc/utils.go index 77539af10d..f1c5055c79 100644 --- a/tests/rpc/utils.go +++ b/tests/rpc/utils.go @@ -149,7 +149,7 @@ func CallWithError(method string, params interface{}) (*Response, error) { } if rpcRes.Error != nil { - return nil, fmt.Errorf(rpcRes.Error.Message) + return nil, errors.New(rpcRes.Error.Message) } return rpcRes, nil diff --git a/tests/solidity/init-test-node.sh b/tests/solidity/init-test-node.sh index 635287cbb5..97e1c08e61 100755 --- a/tests/solidity/init-test-node.sh +++ b/tests/solidity/init-test-node.sh @@ -36,7 +36,7 @@ echo $USER4_MNEMONIC | ethermintd keys add $USER4_KEY --recover --keyring-backen ethermintd init $MONIKER --chain-id $CHAINID # Set gas limit in genesis -cat $HOME/.ethermintd/config/genesis.json | jq '.consensus_params["block"]["max_gas"]="10000000"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json +cat $HOME/.ethermintd/config/genesis.json | jq '.consensus["params"]["block"]["max_gas"]="10000000"' > $HOME/.ethermintd/config/tmp_genesis.json && mv $HOME/.ethermintd/config/tmp_genesis.json $HOME/.ethermintd/config/genesis.json # modified default configs if [[ "$OSTYPE" == "darwin"* ]]; then @@ -60,6 +60,7 @@ ethermintd genesis add-genesis-account "$(ethermintd keys show $USER2_KEY -a --k ethermintd genesis add-genesis-account "$(ethermintd keys show $USER3_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test ethermintd genesis add-genesis-account "$(ethermintd keys show $USER4_KEY -a --keyring-backend test)" 1000000000000000000000aphoton,1000000000000000000stake --keyring-backend test + # Sign genesis transaction ethermintd genesis gentx $VAL_KEY 1000000000000000000stake --amount=1000000000000000000000aphoton --chain-id $CHAINID --keyring-backend test @@ -67,7 +68,7 @@ ethermintd genesis gentx $VAL_KEY 1000000000000000000stake --amount=100000000000 ethermintd genesis collect-gentxs # Run this to ensure everything worked and that the genesis file is setup correctly -ethermintd genesis validate-genesis +ethermintd genesis validate # Start the node (remove the --pruning=nothing flag if historical queries are not needed) -ethermintd start --metrics --pruning=nothing --rpc.unsafe --keyring-backend test --log_level info --json-rpc.api eth,txpool,personal,net,debug,web3 --api.enable +ethermintd start --metrics --pruning=nothing --rpc.unsafe --keyring-backend test --log_level info --json-rpc.api eth,txpool,personal,net,debug,web3 --api.enable \ No newline at end of file diff --git a/tests/solidity/yarn.lock b/tests/solidity/yarn.lock index b2c1823a89..404b8e314b 100644 --- a/tests/solidity/yarn.lock +++ b/tests/solidity/yarn.lock @@ -194,11 +194,9 @@ semver "^6.3.1" "@babel/runtime@^7.12.1", "@babel/runtime@^7.17.2", "@babel/runtime@^7.21.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== - dependencies: - regenerator-runtime "^0.14.0" + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" + integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== "@babel/types@^7.24.0": version "7.24.0" @@ -1025,9 +1023,9 @@ integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.1.tgz#eaee5900122c110a3dbcb728c0597014a2621774" + integrity sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg== "@redux-saga/core@^1.0.0": version "1.3.0" @@ -2346,9 +2344,9 @@ ajv-formats@^2.1.1: ajv "^8.0.0" ajv@^6.10.0, ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2356,14 +2354,14 @@ ajv@^6.10.0, ajv@^6.12.3: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.3: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.20.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" ansi-colors@3.2.3: version "3.2.3" @@ -3337,9 +3335,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + version "3.0.11" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" + integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== dependencies: safe-buffer "^5.0.1" @@ -3545,10 +3543,10 @@ bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.2, body-parser@^1.16.0, body-parser@^1.19.0: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== +body-parser@1.20.3, body-parser@^1.16.0, body-parser@^1.19.0: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -3558,7 +3556,7 @@ body-parser@1.20.2, body-parser@^1.16.0, body-parser@^1.19.0: 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" @@ -3582,17 +3580,17 @@ borc@^2.1.2: readable-stream "^3.6.0" brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.14" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.14.tgz#d9de602370d91347cd9ddad1224d4fd701eb348b" + integrity sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.0.tgz#4f41a41190216ee36067ec381526fe9539c4f0ae" + integrity sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w== dependencies: balanced-match "^1.0.0" @@ -3612,12 +3610,12 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" @@ -3929,6 +3927,14 @@ cachedown@1.0.0: abstract-leveldown "^2.4.1" lru-cache "^3.2.0" +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@~1.0.2: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -3940,6 +3946,24 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bin get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + camel-case@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -4182,12 +4206,12 @@ cids@^1.0.0, cids@^1.1.4, cids@^1.1.5: uint8arrays "^3.0.0" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + version "1.0.6" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" + integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" class-is@^1.1.0: version "1.1.0" @@ -4437,10 +4461,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== cookie@^0.4.1: version "0.4.2" @@ -4516,7 +4540,17 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hash@~1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + integrity sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -4551,9 +4585,9 @@ cross-fetch@^4.0.0: node-fetch "^2.6.12" cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -5066,6 +5100,15 @@ download@^7.1.0: p-event "^2.1.0" pify "^3.0.0" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" @@ -5172,6 +5215,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding-down@5.0.4, encoding-down@~5.0.0: version "5.0.4" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-5.0.4.tgz#1e477da8e9e9d0f7c8293d320044f8b2cd8e9614" @@ -5320,6 +5368,11 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -5332,6 +5385,13 @@ es-object-atoms@^1.0.0: dependencies: es-errors "^1.3.0" +es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" @@ -6055,36 +6115,36 @@ expand-brackets@^2.1.4: to-regex "^3.0.1" express@^4.14.0, express@^4.17.1: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== 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.4" - cookie "0.6.0" + cookie "0.7.1" 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.12" 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" @@ -6176,7 +6236,7 @@ fast-check@3.1.1: dependencies: pure-rand "^5.0.1" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -6201,6 +6261,11 @@ fast-sha256@^1.3.0: resolved "https://registry.yarnpkg.com/fast-sha256/-/fast-sha256-1.3.0.tgz#7916ba2054eeb255982608cccd0f6660c79b7ae6" integrity sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ== +fast-uri@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" + integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== + fastestsmallesttextencoderdecoder@^1.0.22: version "1.0.22" resolved "https://registry.yarnpkg.com/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz#59b47e7b965f45258629cc6c127bf783281c5e93" @@ -6281,20 +6346,20 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== 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" @@ -6364,9 +6429,9 @@ flow-stoplight@^1.0.0: integrity sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA== follow-redirects@^1.14.8, follow-redirects@^1.15.0: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" @@ -6375,6 +6440,13 @@ for-each@^0.3.3, for-each@~0.3.3: dependencies: is-callable "^1.1.3" +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -6676,11 +6748,35 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-iterator@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" @@ -6823,6 +6919,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + got@12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" @@ -6978,6 +7079,11 @@ has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -7033,6 +7139,13 @@ has@~1.0.3: resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + integrity sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw== + dependencies: + inherits "^2.0.1" + hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -7776,6 +7889,13 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.3: dependencies: which-typed-array "^1.1.14" +is-typed-array@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -8565,9 +8685,9 @@ locate-path@^6.0.0: p-locate "^5.0.0" lodash-es@^4.2.1: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" @@ -8625,9 +8745,9 @@ lodash@4.17.20: integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== log-symbols@3.0.0: version "3.0.0" @@ -8777,6 +8897,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8829,10 +8954,10 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-options@^2.0.0: version "2.0.0" @@ -8898,11 +9023,11 @@ micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.2: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" miller-rabin@^4.0.0: @@ -10088,10 +10213,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^1.0.0: version "1.1.0" @@ -10108,15 +10233,16 @@ pathval@^1.1.1: integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9, pbkdf2@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.3.tgz#8be674d591d65658113424592a95d1517318dd4b" + integrity sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA== dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" + create-hash "~1.1.3" + create-hmac "^1.1.7" + ripemd160 "=2.0.1" + safe-buffer "^5.2.1" + sha.js "^2.4.11" + to-buffer "^1.2.0" peer-id@^0.14.1: version "0.14.8" @@ -10154,9 +10280,9 @@ picocolors@^1.0.0: integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== pify@^2.0.0, pify@^2.3.0: version "2.3.0" @@ -10514,9 +10640,9 @@ proto-list@~1.2.1: integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== protobufjs@^6.10.2, protobufjs@^6.11.2: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + version "6.11.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.6.tgz#f02b04ef842469a2bf89da18be8fd5c41dc820ca" + integrity sha512-k8BHqgPBOtrlougZZqF2uUk5Z7bN8f0wj+3e8M3hvtSv0NBAz4VBy5f6R5Nxq/l+i7mRFTgNZb2trxqTpHNY/A== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -10533,9 +10659,9 @@ protobufjs@^6.10.2, protobufjs@^6.11.2: long "^4.0.0" protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + version "3.6.1" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz#fd9a58a5c4e96385b964808f3ddd58f9ef18c3c8" + integrity sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ== protons@^2.0.0: version "2.0.3" @@ -10658,12 +10784,12 @@ pure-rand@^5.0.1: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.5.tgz#bda2a7f6a1fc0f284d78d78ca5902f26f2ad35cf" integrity sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" qs@^6.7.0: version "6.12.0" @@ -10853,11 +10979,6 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -11066,6 +11187,14 @@ ripemd160-min@0.0.6: resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== +ripemd160@=2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + integrity sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w== + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -11253,10 +11382,10 @@ semver@~5.4.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -11287,15 +11416,15 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" servify@^0.1.12: version "0.1.12" @@ -11313,7 +11442,7 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.1, set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -11366,12 +11495,13 @@ setprototypeof@1.2.0: integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" sha3@^2.1.1: version "2.1.4" @@ -12030,9 +12160,9 @@ tiny-queue@^0.2.1: integrity sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A== tiny-secp256k1@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" - integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz#0c1b6b9d2d93404f9093dc7e287b0aa834480573" + integrity sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ== dependencies: bindings "^1.3.0" bn.js "^4.11.8" @@ -12072,6 +12202,15 @@ to-buffer@^1.1.1: resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== +to-buffer@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz#2ce650cdb262e9112a18e65dc29dcb513c8155e0" + integrity sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" + to-data-view@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00" @@ -12305,6 +12444,15 @@ typed-array-buffer@^1.0.2: es-errors "^1.3.0" is-typed-array "^1.1.13" +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + typed-array-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" @@ -12444,9 +12592,9 @@ underscore@1.9.1: integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== underscore@^1.8.3: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + version "1.13.8" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.8.tgz#a93a21186c049dbf0e847496dba72b7bd8c1e92b" + integrity sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ== undici-types@~5.26.4: version "5.26.5" @@ -13777,6 +13925,19 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.2" +which-typed-array@^1.1.16: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + which@1.3.1, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -13994,9 +14155,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + version "1.10.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" + integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: version "13.1.2" diff --git a/testutil/abci.go b/testutil/abci.go index 05ee76170c..72eeb60405 100644 --- a/testutil/abci.go +++ b/testutil/abci.go @@ -7,7 +7,7 @@ import ( cmttypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" ) // Commit commits a block at a given time. Reminder: At the end of each @@ -16,7 +16,7 @@ import ( // 2. DeliverTx // 3. EndBlock // 4. Commit -func Commit(ctx sdk.Context, app *app.EthermintApp, t time.Duration, vs *cmttypes.ValidatorSet) (sdk.Context, error) { +func Commit(ctx sdk.Context, app *evmd.EthermintApp, t time.Duration, vs *cmttypes.ValidatorSet) (sdk.Context, error) { header := ctx.BlockHeader() req := abci.RequestFinalizeBlock{Height: header.Height} diff --git a/testutil/app.go b/testutil/app.go index f581651a29..77faecc8e5 100644 --- a/testutil/app.go +++ b/testutil/app.go @@ -5,7 +5,7 @@ import ( "math/rand" "time" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" abci "github.com/cometbft/cometbft/abci/types" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" tmtypes "github.com/cometbft/cometbft/types" @@ -23,8 +23,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" + "github.com/evmos/ethermint/evmd" ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -49,39 +49,38 @@ var DefaultConsensusParams = &cmtproto.ConsensusParams{ } // Setup initializes a new EthermintApp. A Nop logger is set in EthermintApp. -func Setup(isCheckTx bool, patch func(*app.EthermintApp, app.GenesisState) app.GenesisState) *app.EthermintApp { +func Setup(isCheckTx bool, patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState) *evmd.EthermintApp { return SetupWithDB(isCheckTx, patch, dbm.NewMemDB()) } func SetupWithOpts( isCheckTx bool, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, appOptions simtestutil.AppOptionsMap, -) *app.EthermintApp { +) *evmd.EthermintApp { return SetupWithDBAndOpts(isCheckTx, patch, dbm.NewMemDB(), appOptions) } const ChainID = "ethermint_9000-1" -func SetupWithDB(isCheckTx bool, patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, db dbm.DB) *app.EthermintApp { +func SetupWithDB(isCheckTx bool, patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, db dbm.DB) *evmd.EthermintApp { return SetupWithDBAndOpts(isCheckTx, patch, db, nil) } // SetupWithDBAndOpts initializes a new EthermintApp. A Nop logger is set in EthermintApp. func SetupWithDBAndOpts( isCheckTx bool, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, db dbm.DB, appOptions simtestutil.AppOptionsMap, -) *app.EthermintApp { +) *evmd.EthermintApp { if appOptions == nil { appOptions = make(simtestutil.AppOptionsMap, 0) } appOptions[server.FlagInvCheckPeriod] = 5 - appOptions[flags.FlagHome] = app.DefaultNodeHome - app := app.NewEthermintApp(log.NewNopLogger(), + appOptions[flags.FlagHome] = evmd.DefaultNodeHome + app := evmd.NewEthermintApp(log.NewNopLogger(), db, - nil, true, appOptions, baseapp.SetChainID(ChainID), @@ -167,7 +166,7 @@ func RandomAccounts(r *rand.Rand, n int) []simtypes.Account { // StateFn returns the initial application state using a genesis or the simulation parameters. // It is a wrapper of simapp.AppStateFn to replace evm param EvmDenom with staking param BondDenom. -func StateFn(a *app.EthermintApp) simtypes.AppStateFn { +func StateFn(a *evmd.EthermintApp) simtypes.AppStateFn { var bondDenom string return simtestutil.AppStateFnWithExtendedCbs( a.AppCodec(), diff --git a/testutil/base_test_suite.go b/testutil/base_test_suite.go index 4136d45268..d024f0b316 100644 --- a/testutil/base_test_suite.go +++ b/testutil/base_test_suite.go @@ -8,7 +8,6 @@ import ( coreheader "cosmossdk.io/core/header" sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" abci "github.com/cometbft/cometbft/abci/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" tmtypes "github.com/cometbft/cometbft/types" @@ -19,6 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" "github.com/cosmos/cosmos-sdk/testutil/mock" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" @@ -29,8 +29,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/server/config" "github.com/evmos/ethermint/tests" ethermint "github.com/evmos/ethermint/types" @@ -45,7 +45,7 @@ type BaseTestSuite struct { suite.Suite Ctx sdk.Context - App *app.EthermintApp + App *evmd.EthermintApp } func (suite *BaseTestSuite) MintFeeCollectorVirtual(coins sdk.Coins) { @@ -61,7 +61,7 @@ func (suite *BaseTestSuite) MintFeeCollectorVirtual(coins sdk.Coins) { func addVirtualCoins(store storetypes.ObjKVStore, txIndex int, addr sdk.AccAddress, amt sdk.Coins) { key := make([]byte, len(addr)+8) copy(key, addr) - binary.BigEndian.PutUint64(key[len(addr):], uint64(txIndex)) + binary.BigEndian.PutUint64(key[len(addr):], uint64(txIndex)) //nolint:gosec // test only var coins sdk.Coins value := store.Get(key) @@ -78,19 +78,19 @@ func (suite *BaseTestSuite) SetupTest() { func (suite *BaseTestSuite) SetupTestWithCb( t require.TestingT, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, ) { suite.SetupTestWithCbAndOpts(t, patch, nil) } func (suite *BaseTestSuite) SetupTestWithCbAndOpts( _ require.TestingT, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, appOptions simtestutil.AppOptionsMap, ) { checkTx := false suite.App = SetupWithOpts(checkTx, patch, appOptions) - suite.Ctx = suite.App.NewUncachedContext(checkTx, tmproto.Header{ + suite.Ctx = suite.App.NewUncachedContext(checkTx, tmproto.Header{ //nolint:staticcheck Height: 1, ChainID: ChainID, Time: time.Now().UTC(), @@ -116,14 +116,14 @@ func (suite *BaseTestSuiteWithAccount) SetupTest(t require.TestingT) { func (suite *BaseTestSuiteWithAccount) SetupTestWithCb( t require.TestingT, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, ) { suite.SetupTestWithCbAndOpts(t, patch, nil) } func (suite *BaseTestSuiteWithAccount) SetupTestWithCbAndOpts( t require.TestingT, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, appOptions simtestutil.AppOptionsMap, ) { suite.SetupAccount(t) @@ -154,7 +154,7 @@ func (suite *BaseTestSuiteWithAccount) PostSetupValidator(t require.TestingT) st BaseAccount: authtypes.NewBaseAccount(sdk.AccAddress(suite.Address.Bytes()), nil, 0, 0), CodeHash: common.BytesToHash(crypto.Keccak256(nil)).String(), } - acc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + acc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, acc) suite.App.AccountKeeper.SetAccount(suite.Ctx, acc) valAddr := sdk.ValAddress(suite.Address.Bytes()) validator, err := stakingtypes.NewValidator(valAddr.String(), suite.ConsPubKey, stakingtypes.Description{}) @@ -262,7 +262,7 @@ func (suite *BaseTestSuiteWithAccount) Commit(t require.TestingT) { header.Time = newBlockTime header.Height++ // update ctx - suite.Ctx = suite.App.NewUncachedContext(false, header).WithHeaderInfo(coreheader.Info{ + suite.Ctx = suite.App.NewUncachedContext(false, header).WithHeaderInfo(coreheader.Info{ //nolint:staticcheck Height: header.Height, Time: header.Time, }) @@ -299,7 +299,7 @@ func (suite *BaseTestSuiteWithFeeMarketQueryClient) SetupTest() { func (suite *BaseTestSuiteWithFeeMarketQueryClient) SetupTestWithCb( t require.TestingT, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, ) { suite.BaseTestSuite.SetupTestWithCb(t, patch) suite.Setup(&suite.BaseTestSuite) @@ -316,7 +316,7 @@ func (suite *EVMTestSuiteWithAccountAndQueryClient) SetupTest(t require.TestingT func (suite *EVMTestSuiteWithAccountAndQueryClient) SetupTestWithCb( t require.TestingT, - patch func(*app.EthermintApp, app.GenesisState) app.GenesisState, + patch func(*evmd.EthermintApp, evmd.GenesisState) evmd.GenesisState, ) { suite.BaseTestSuiteWithAccount.SetupTestWithCb(t, patch) suite.Setup(&suite.BaseTestSuite) @@ -395,7 +395,7 @@ func (suite *EVMTestSuiteWithAccountAndQueryClient) EvmDenom() string { } // NewTestGenesisState generate genesis state with single validator -func NewTestGenesisState(codec codec.Codec, genesisState map[string]json.RawMessage) app.GenesisState { +func NewTestGenesisState(codec codec.Codec, genesisState map[string]json.RawMessage) evmd.GenesisState { privVal := mock.NewPV() pubKey, err := privVal.GetPubKey() if err != nil { @@ -415,10 +415,10 @@ func NewTestGenesisState(codec codec.Codec, genesisState map[string]json.RawMess return genesisStateWithValSet(codec, genesisState, valSet, []authtypes.GenesisAccount{acc}, balance) } -func genesisStateWithValSet(codec codec.Codec, genesisState app.GenesisState, +func genesisStateWithValSet(codec codec.Codec, genesisState evmd.GenesisState, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance, -) app.GenesisState { +) evmd.GenesisState { // set genesis accounts authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) genesisState[authtypes.ModuleName] = codec.MustMarshalJSON(authGenesis) diff --git a/testutil/network/network.go b/testutil/network/network.go index e3d5e0c52d..27cabe956c 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -32,7 +32,7 @@ import ( "testing" "time" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" sdkmath "cosmossdk.io/math" cmtrand "github.com/cometbft/cometbft/libs/rand" "github.com/cometbft/cometbft/node" @@ -44,7 +44,6 @@ import ( "golang.org/x/sync/errgroup" "google.golang.org/grpc" - pruningtypes "cosmossdk.io/store/pruning/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" @@ -56,6 +55,7 @@ import ( "github.com/cosmos/cosmos-sdk/server/api" srvconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + pruningtypes "github.com/cosmos/cosmos-sdk/store/v2/pruning/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -70,7 +70,7 @@ import ( evmtypes "github.com/evmos/ethermint/x/evm/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" ) // network lock to only allow one test network at a time @@ -86,10 +86,9 @@ type AppConstructor = func(val Validator) servertypes.Application // NewAppConstructor returns a new simapp AppConstructor func NewAppConstructor(chainID string) AppConstructor { return func(val Validator) servertypes.Application { - return app.NewEthermintApp( + return evmd.NewEthermintApp( val.Ctx.Logger, dbm.NewMemDB(), - nil, true, simtestutil.NewAppOptionsWithFlagHome(val.Ctx.Config.RootDir), baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), @@ -108,25 +107,25 @@ type Config struct { InterfaceRegistry codectypes.InterfaceRegistry TxConfig client.TxConfig AccountRetriever client.AccountRetriever - AppConstructor AppConstructor // the ABCI application constructor - GenesisState app.GenesisState // custom gensis state to provide - TimeoutCommit time.Duration // the consensus commitment timeout - AccountTokens sdkmath.Int // the amount of unique validator tokens (e.g. 1000node0) - StakingTokens sdkmath.Int // the amount of tokens each validator has available to stake - BondedTokens sdkmath.Int // the amount of tokens each validator stakes - NumValidators int // the total number of validators to create and bond - ChainID string // the network chain-id - BondDenom string // the staking bond denomination - MinGasPrices string // the minimum gas prices each validator will accept - PruningStrategy string // the pruning strategy each validator will have - SigningAlgo string // signing algorithm for keys - RPCAddress string // RPC listen address (including port) - JSONRPCAddress string // JSON-RPC listen address (including port) - APIAddress string // REST API listen address (including port) - GRPCAddress string // GRPC server listen address (including port) - EnableTMLogging bool // enable Tendermint logging to STDOUT - CleanupDir bool // remove base temporary directory during cleanup - PrintMnemonic bool // print the mnemonic of first validator as log output for testing + AppConstructor AppConstructor // the ABCI application constructor + GenesisState evmd.GenesisState // custom gensis state to provide + TimeoutCommit time.Duration // the consensus commitment timeout + AccountTokens sdkmath.Int // the amount of unique validator tokens (e.g. 1000node0) + StakingTokens sdkmath.Int // the amount of tokens each validator has available to stake + BondedTokens sdkmath.Int // the amount of tokens each validator stakes + NumValidators int // the total number of validators to create and bond + ChainID string // the network chain-id + BondDenom string // the staking bond denomination + MinGasPrices string // the minimum gas prices each validator will accept + PruningStrategy string // the pruning strategy each validator will have + SigningAlgo string // signing algorithm for keys + RPCAddress string // RPC listen address (including port) + JSONRPCAddress string // JSON-RPC listen address (including port) + APIAddress string // REST API listen address (including port) + GRPCAddress string // GRPC server listen address (including port) + EnableTMLogging bool // enable Tendermint logging to STDOUT + CleanupDir bool // remove base temporary directory during cleanup + PrintMnemonic bool // print the mnemonic of first validator as log output for testing } // DefaultConfig returns a sane default configuration suitable for nearly all @@ -196,14 +195,13 @@ type ( RPCClient tmrpcclient.Client JSONRPCClient *ethclient.Client - tmNode *node.Node - api *api.Server - grpc *grpc.Server - grpcWeb *http.Server - jsonrpc *http.Server - jsonrpcDone chan struct{} - errGroup *errgroup.Group - cancelFn context.CancelFunc + tmNode *node.Node + api *api.Server + grpc *grpc.Server + grpcWeb *http.Server + jsonrpc *http.Server + errGroup *errgroup.Group + cancelFn context.CancelFunc } ) @@ -273,8 +271,8 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { appCfg.MinGasPrices = cfg.MinGasPrices appCfg.API.Enable = true appCfg.API.Swagger = false - appCfg.Telemetry.Enabled = false - appCfg.Telemetry.GlobalLabels = [][]string{{"chain_id", cfg.ChainID}} + appCfg.Telemetry.Enabled = false //nolint:staticcheck + appCfg.Telemetry.GlobalLabels = [][]string{{"chain_id", cfg.ChainID}} //nolint:staticcheck ctx := server.NewDefaultContext() cmtCfg := ctx.Config @@ -648,18 +646,7 @@ func (n *Network) Cleanup() { } if v.jsonrpc != nil { - shutdownCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) - defer cancelFn() - - if err := v.jsonrpc.Shutdown(shutdownCtx); err != nil { - v.tmNode.Logger.Error("HTTP server shutdown produced a warning", "error", err.Error()) - } else { - v.tmNode.Logger.Info("HTTP server shut down, waiting 5 sec") - select { - case <-time.Tick(5 * time.Second): - case <-v.jsonrpcDone: - } - } + _ = v.jsonrpc.Close() } } diff --git a/testutil/network/util.go b/testutil/network/util.go index ebc5e1e044..5237e2cb93 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -21,7 +21,7 @@ import ( "fmt" "path/filepath" - "cosmossdk.io/log" + "cosmossdk.io/log/v2" cmtcfg "github.com/cometbft/cometbft/config" tmos "github.com/cometbft/cometbft/libs/os" "github.com/cometbft/cometbft/node" @@ -34,13 +34,13 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "golang.org/x/sync/errgroup" + crisistypes "github.com/cosmos/cosmos-sdk/contrib/x/crisis/types" sdkserver "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" servercmtlog "github.com/cosmos/cosmos-sdk/server/log" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -143,9 +143,9 @@ func startInProcess(cfg Config, val *Validator) error { return fmt.Errorf("validator %s context is nil", val.Moniker) } - val.jsonrpc, val.jsonrpcDone, err = server.StartJSONRPC( - val.Ctx, val.ClientCtx, val.errGroup, val.AppConfig, - nil, app.(server.AppWithPendingTxStream), + val.jsonrpc, err = server.StartJSONRPC( + ctx, val.Ctx, val.ClientCtx, val.errGroup, val.AppConfig, + nil, app.(server.PendingTxListener), ) if err != nil { return err diff --git a/testutil/tx/cosmos.go b/testutil/tx/cosmos.go index 91ce574057..4536e63e8d 100644 --- a/testutil/tx/cosmos.go +++ b/testutil/tx/cosmos.go @@ -25,7 +25,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -58,7 +58,7 @@ type CosmosTxArgs struct { // It returns the signed transaction and an error func PrepareCosmosTx( ctx sdk.Context, - appEthermint *app.EthermintApp, + appEthermint *evmd.EthermintApp, args CosmosTxArgs, ) (authsigning.Tx, error) { txBuilder := args.TxCfg.NewTxBuilder() @@ -67,7 +67,8 @@ func PrepareCosmosTx( var fees sdk.Coins if args.GasPrice != nil { - fees = sdk.Coins{{Denom: evmtypes.DefaultEVMDenom, Amount: args.GasPrice.MulRaw(int64(args.Gas))}} + gas := int64(args.Gas) //nolint:gosec // test only + fees = sdk.Coins{{Denom: evmtypes.DefaultEVMDenom, Amount: args.GasPrice.MulRaw(gas)}} } else { fees = sdk.Coins{DefaultFee} } @@ -91,7 +92,7 @@ func PrepareCosmosTx( // the provided private key func signCosmosTx( ctx sdk.Context, - appEthermint *app.EthermintApp, + appEthermint *evmd.EthermintApp, args CosmosTxArgs, txBuilder client.TxBuilder, ) (authsigning.Tx, error) { diff --git a/testutil/tx/eip712.go b/testutil/tx/eip712.go index ef158dd8b8..9e28afe63b 100644 --- a/testutil/tx/eip712.go +++ b/testutil/tx/eip712.go @@ -37,7 +37,7 @@ import ( "github.com/evmos/ethermint/types" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" ) type EIP712TxArgs struct { @@ -70,7 +70,7 @@ type signatureV2Args struct { // It returns the signed transaction and an error func CreateEIP712CosmosTx( ctx sdk.Context, - appEthermint *app.EthermintApp, + appEthermint *evmd.EthermintApp, args EIP712TxArgs, ) (sdk.Tx, error) { builder, err := PrepareEIP712CosmosTx( @@ -86,7 +86,7 @@ func CreateEIP712CosmosTx( // It returns the tx builder with the signed transaction and an error func PrepareEIP712CosmosTx( ctx sdk.Context, - appEthermint *app.EthermintApp, + appEthermint *evmd.EthermintApp, args EIP712TxArgs, ) (client.TxBuilder, error) { txArgs := args.CosmosTxArgs @@ -110,10 +110,10 @@ func PrepareEIP712CosmosTx( return nil, err } - fee := legacytx.NewStdFee(txArgs.Gas, txArgs.Fees) //nolint: staticcheck + fee := legacytx.NewStdFee(txArgs.Gas, txArgs.Fees) //nolint:staticcheck msgs := txArgs.Msgs - data := legacytx.StdSignBytes(ctx.ChainID(), accNumber, nonce, 0, fee, msgs, "") + data := legacytx.StdSignBytes(ctx.ChainID(), accNumber, nonce, 0, fee, msgs, "") //nolint:staticcheck typedDataArgs := typedDataArgs{ chainID: chainIDNum, @@ -179,7 +179,7 @@ func createTypedData(args typedDataArgs, useLegacy bool) (apitypes.TypedData, er // the provided private key and the typed data func signCosmosEIP712Tx( ctx sdk.Context, - appEvmos *app.EthermintApp, + appEvmos *evmd.EthermintApp, args EIP712TxArgs, builder authtx.ExtensionOptionsTxBuilder, chainID uint64, diff --git a/types/account_test.go b/types/account_test.go index 9afac71ebc..c35b570e35 100644 --- a/types/account_test.go +++ b/types/account_test.go @@ -7,15 +7,18 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" + "github.com/cosmos/cosmos-sdk/x/tx/signing/aminojson" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - cryptocodec "github.com/evmos/ethermint/crypto/codec" "github.com/evmos/ethermint/crypto/ethsecp256k1" ethermintcodec "github.com/evmos/ethermint/encoding/codec" "github.com/evmos/ethermint/types" + ethermint "github.com/evmos/ethermint/types" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/anypb" ) func init() { @@ -56,3 +59,19 @@ func (suite *AccountTestSuite) TestAccountType() { suite.account.CodeHash = common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})).Hex() suite.Require().Equal(types.AccountTypeContract, suite.account.Type()) } + +func TestAminoMarshal(t *testing.T) { + registry := codectypes.NewInterfaceRegistry() + ethermint.RegisterInterfaces(registry) + value := "\n\x86\x02\n+tcrc1l8h07yxmwvc963tg08at7k9882d5ha4t34guxe\x12\xd2\x01\n)/cosmos.crypto.multisig.LegacyAminoPubKey\x12\xa4\x01\x08\x02\x12O\n(/ethermint.crypto.v1.ethsecp256k1.PubKey\x12#\n!\x03һ\xfb\x81\x1a\xb40E\xc0\x16\xf4\x17\xfba\xe5V\x10\xfd]\x8d\x19m\x08\xe0\xc6i\x83\xf9S\x9e\x1b\xd8\x12O\n(/ethermint.crypto.v1.ethsecp256k1.PubKey\x12#\n!\x02\x19]\xed\xa5\x84:\xae\xa2\x0fȌ\xb6MKR\xfc\xc5\xc8SD1\x0cSn\x83|P\xad'\xf7\xa8\x8d\x18\x12 \x02\x12B0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + msg := &anypb.Any{ + TypeUrl: "/ethermint.types.v1.EthAccount", + Value: []byte(value), + } + aj := aminojson.NewEncoder(aminojson.EncoderOptions{ + FileResolver: registry, + Indent: " ", + }) + _, err := aj.Marshal(msg) + require.NoError(t, err) +} diff --git a/types/block.go b/types/block.go index 6c5558cbd3..6fdafe90d9 100644 --- a/types/block.go +++ b/types/block.go @@ -15,7 +15,11 @@ // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE package types -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + math "math" + + sdk "github.com/cosmos/cosmos-sdk/types" +) // BlockGasLimit returns the max gas (limit) defined in the block gas meter. If the meter is not // set, it returns the max gas from the application consensus params. @@ -28,6 +32,13 @@ func BlockGasLimit(ctx sdk.Context) uint64 { } maxGas := cp.Block.MaxGas + + // Setting max_gas to -1 in CometBFT means there is no limit on the maximum gas consumption for transactions + // https://github.com/cometbft/cometbft/blob/v0.37.2/proto/tendermint/types/params.proto#L25-L27 + if maxGas == -1 { + return math.MaxUint64 + } + if maxGas > 0 { return uint64(maxGas) } diff --git a/types/dynamic_fee.go b/types/dynamic_fee.go index 04bc572e7e..c3e783ff26 100644 --- a/types/dynamic_fee.go +++ b/types/dynamic_fee.go @@ -20,7 +20,7 @@ import ( ) // HasDynamicFeeExtensionOption returns true if the tx implements the `ExtensionOptionDynamicFeeTx` extension option. -func HasDynamicFeeExtensionOption(any *codectypes.Any) bool { - _, ok := any.GetCachedValue().(*ExtensionOptionDynamicFeeTx) +func HasDynamicFeeExtensionOption(codecAny *codectypes.Any) bool { + _, ok := codecAny.GetCachedValue().(*ExtensionOptionDynamicFeeTx) return ok } diff --git a/types/gasmeter.go b/types/gasmeter.go index bf634708df..7a2945a4d5 100644 --- a/types/gasmeter.go +++ b/types/gasmeter.go @@ -19,7 +19,7 @@ import ( fmt "fmt" math "math" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" ) // ErrorNegativeGasConsumed defines an error thrown when the amount of gas refunded results in a diff --git a/types/int.go b/types/int.go index 9342b836c6..5e1c8db442 100644 --- a/types/int.go +++ b/types/int.go @@ -21,9 +21,8 @@ import ( "math/big" "math/bits" - errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" - errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/ethereum/go-ethereum/common/hexutil" ) const ( @@ -37,23 +36,122 @@ func init() { MaxInt256 = tmp.Lsh(big.NewInt(1), sdkmath.MaxBitLen).Sub(&tmp, big.NewInt(1)) } +// BigMax returns the larger of x or y. +func BigMax(x, y *big.Int) *big.Int { + if x.Cmp(y) >= 0 { + return x + } + return y +} + +func BigMin(x, y *big.Int) *big.Int { + if x.Cmp(y) <= 0 { + return x + } + return y +} + // SafeInt64 checks for overflows while casting a uint64 to int64 value. func SafeInt64(value uint64) (int64, error) { if value > uint64(math.MaxInt64) { - return 0, errorsmod.Wrapf(errortypes.ErrInvalidHeight, "uint64 value %v cannot exceed %v", value, int64(math.MaxInt64)) + return 0, fmt.Errorf("uint64 value %v cannot exceed %v", value, math.MaxInt64) } return int64(value), nil } +func SafeUint64ToInt32(value uint64) (int32, error) { + if value > uint64(math.MaxInt64) { + return 0, fmt.Errorf("uint64 value %v cannot exceed %v", value, math.MaxInt64) + } + + return int32(value), nil //nolint:gosec // checked +} + +func SafeUint64ToInt(value uint64) (int, error) { + if value > uint64(math.MaxInt64) { + return 0, fmt.Errorf("uint64 value %v cannot exceed %v", value, math.MaxInt64) + } + + return int(value), nil +} + +func SafeHexToInt64(value hexutil.Uint64) (int64, error) { + if value > math.MaxInt64 { + return 0, fmt.Errorf("hexutil.Uint64 value %v cannot exceed %v", value, math.MaxInt64) + } + + return int64(value), nil //nolint:gosec // checked +} + +func SafeUint32(value int) (uint32, error) { + if value > math.MaxUint32 { + return 0, fmt.Errorf("int value %v cannot exceed %v", value, math.MaxUint32) + } + + return uint32(value), nil //nolint:gosec // checked +} + +func SafeUint64(value int64) (uint64, error) { + if value < 0 { + return 0, fmt.Errorf("invalid value: %d", value) + } + return uint64(value), nil +} + +func SafeIntToUint64(value int) (uint64, error) { + if value < 0 { + return 0, fmt.Errorf("invalid value: %d", value) + } + return uint64(value), nil +} + +func SafeInt32ToUint64(value int32) (uint64, error) { + if value < 0 { + return 0, fmt.Errorf("invalid value: %d", value) + } + return uint64(value), nil +} + +func SafeUint(value int) (uint, error) { + if value < 0 { + return 0, fmt.Errorf("invalid value: %d", value) + } + return uint(value), nil +} + +func SafeUintToInt32(value uint) (int32, error) { + if value > uint(math.MaxInt32) { + return 0, fmt.Errorf("uint value %v cannot exceed %v", value, math.MaxUint32) + } + + return int32(value), nil +} + +func SafeIntToInt32(value int) (int32, error) { + if value > int(math.MaxInt32) { + return 0, fmt.Errorf("int value %v cannot exceed %v", value, math.MaxUint32) + } + + return int32(value), nil //nolint:gosec // checked +} + func SafeInt(value uint) (int, error) { if value > uint(math.MaxInt64) { - return 0, errorsmod.Wrapf(errortypes.ErrInvalidHeight, "uint value %v cannot exceed %v", value, int(math.MaxInt64)) + return 0, fmt.Errorf("uint value %v cannot exceed %v", value, math.MaxInt64) } return int(value), nil } +func SafeHexToInt(value hexutil.Uint) (int, error) { + if value > hexutil.Uint(math.MaxInt) { + return 0, fmt.Errorf("hexutil.Uint value %v cannot exceed %v", value, math.MaxInt) + } + + return int(value), nil //nolint:gosec // checked +} + // SafeNewIntFromBigInt constructs Int from big.Int, return error if more than 256bits func SafeNewIntFromBigInt(i *big.Int) (sdkmath.Int, error) { if !IsValidInt256(i) { diff --git a/x/evm/client/cli/tx.go b/x/evm/client/cli/tx.go index 3e14f9547c..08144f8b94 100644 --- a/x/evm/client/cli/tx.go +++ b/x/evm/client/cli/tx.go @@ -33,6 +33,8 @@ import ( "github.com/evmos/ethermint/x/evm/types" ) +const FlagEvmDenom = "evm-denom" + // GetTxCmd returns the transaction commands for this module func GetTxCmd() *cobra.Command { cmd := &cobra.Command{ @@ -77,12 +79,20 @@ func NewRawTxCmd() *cobra.Command { return err } - rsp, err := rpctypes.NewQueryClient(clientCtx).Params(cmd.Context(), &types.QueryParamsRequest{}) + evmDenom, err := cmd.Flags().GetString(FlagEvmDenom) if err != nil { return err } - tx, err := msg.BuildTx(clientCtx.TxConfig.NewTxBuilder(), rsp.Params.EvmDenom) + if evmDenom == "" { + rsp, err := rpctypes.NewQueryClient(clientCtx).Params(cmd.Context(), &types.QueryParamsRequest{}) + if err != nil { + return err + } + evmDenom = rsp.Params.EvmDenom + } + + tx, err := msg.BuildTx(clientCtx.TxConfig.NewTxBuilder(), evmDenom) if err != nil { return err } @@ -129,5 +139,6 @@ func NewRawTxCmd() *cobra.Command { } flags.AddTxFlagsToCmd(cmd) + cmd.Flags().String(FlagEvmDenom, "", "defines the EVM denomination which could be used for generate only when offline") return cmd } diff --git a/x/evm/genesis.go b/x/evm/genesis.go index db3799d35b..2a62c68b1f 100644 --- a/x/evm/genesis.go +++ b/x/evm/genesis.go @@ -82,6 +82,10 @@ func InitGenesis( } } + if err := k.AddPreinstalls(ctx, data.Preinstalls); err != nil { + panic(fmt.Errorf("error adding preinstalls: %s", err)) + } + return []abci.ValidatorUpdate{} } diff --git a/x/evm/genesis_test.go b/x/evm/genesis_test.go index 5a85c9591f..efaff9b0cf 100644 --- a/x/evm/genesis_test.go +++ b/x/evm/genesis_test.go @@ -1,10 +1,11 @@ package evm_test import ( - "math/big" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/holiman/uint256" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/evmos/ethermint/crypto/ethsecp256k1" @@ -47,7 +48,7 @@ func (suite *GenesisTestSuite) TestInitGenesis() { { "valid account", func() { - vmdb.AddBalance(address, big.NewInt(1)) + vmdb.AddBalance(address, uint256.NewInt(1), tracing.BalanceChangeTransfer) }, &types.GenesisState{ Params: types.DefaultParams(), @@ -79,7 +80,7 @@ func (suite *GenesisTestSuite) TestInitGenesis() { "invalid account type", func() { acc := authtypes.NewBaseAccountWithAddress(address.Bytes()) - acc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + acc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, acc) suite.App.AccountKeeper.SetAccount(suite.Ctx, acc) }, &types.GenesisState{ @@ -131,9 +132,10 @@ func (suite *GenesisTestSuite) TestInitGenesis() { "ignore empty account code checking with non-empty codehash", func() { ethAcc := ðermint.EthAccount{ - BaseAccount: authtypes.NewBaseAccount(address.Bytes(), nil, suite.App.AccountKeeper.NextAccountNumber(suite.Ctx), 0), + BaseAccount: authtypes.NewBaseAccount(address.Bytes(), nil, 0, 0), CodeHash: common.BytesToHash([]byte{1, 2, 3}).Hex(), } + ethAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, ethAcc) suite.App.AccountKeeper.SetAccount(suite.Ctx, ethAcc) }, diff --git a/x/evm/handler_test.go b/x/evm/handler_test.go index d361c106e1..ed9cbdf13d 100644 --- a/x/evm/handler_test.go +++ b/x/evm/handler_test.go @@ -7,23 +7,26 @@ import ( "github.com/evmos/ethermint/testutil" "github.com/evmos/ethermint/x/evm/keeper" + "github.com/holiman/uint256" sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/types" ) @@ -43,7 +46,7 @@ func (suite *HandlerTestSuite) SetupTest() { coins := sdk.NewCoins(sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewInt(100000000000000))) t := suite.T() - suite.SetupTestWithCb(t, func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.SetupTestWithCb(t, func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { b32address := sdk.MustBech32ifyAddressBytes(sdk.GetConfig().GetBech32AccountAddrPrefix(), suite.ConsPubKey.Address().Bytes()) balances := []banktypes.Balance{ { @@ -392,17 +395,18 @@ func (suite *HandlerTestSuite) deployERC20Contract() common.Address { ctorArgs, err := types.ERC20Contract.ABI.Pack("", suite.Address, big.NewInt(10000000000)) suite.Require().NoError(err) msg := &core.Message{ - From: suite.Address, - To: nil, - Nonce: nonce, - Value: big.NewInt(0), - GasLimit: 2000000, - GasPrice: big.NewInt(1), - GasFeeCap: nil, - GasTipCap: nil, - Data: append(types.ERC20Contract.Bin, ctorArgs...), - AccessList: nil, - SkipAccountChecks: true, + From: suite.Address, + To: nil, + Nonce: nonce, + Value: big.NewInt(0), + GasLimit: 2000000, + GasPrice: big.NewInt(1), + GasFeeCap: nil, + GasTipCap: nil, + Data: append(types.ERC20Contract.Bin, ctorArgs...), + AccessList: nil, + SkipNonceChecks: true, + SkipTransactionChecks: true, } rsp, err := k.ApplyMessage(suite.Ctx, msg, nil, true) suite.Require().NoError(err) @@ -414,7 +418,10 @@ func (suite *HandlerTestSuite) deployERC20Contract() common.Address { // - when transaction reverted, gas refund works. // - when transaction reverted, nonce is still increased. func (suite *HandlerTestSuite) TestERC20TransferReverted() { - intrinsicGas := uint64(21572) + transferData, err := types.ERC20Contract.ABI.Pack("transfer", suite.Address, big.NewInt(10)) + suite.Require().NoError(err) + floorDataGas, err := core.FloorDataGas(transferData) + suite.Require().NoError(err) // test different hooks scenarios testCases := []struct { msg string @@ -424,13 +431,13 @@ func (suite *HandlerTestSuite) TestERC20TransferReverted() { }{ { "no hooks", - intrinsicGas, // enough for intrinsicGas, but not enough for execution + floorDataGas, // enough for floorDataGas, but not enough for execution nil, "out of gas", }, { "success hooks", - intrinsicGas, // enough for intrinsicGas, but not enough for execution + floorDataGas, // enough for floorDataGas, but not enough for execution &DummyHook{}, "out of gas", }, @@ -449,7 +456,7 @@ func (suite *HandlerTestSuite) TestERC20TransferReverted() { k.SetHooks(tc.hooks) // add some fund to pay gas fee - k.SetBalance(suite.Ctx, suite.Address, big.NewInt(1000000000000000), types.DefaultEVMDenom) + k.SetBalance(suite.Ctx, suite.Address, *uint256.NewInt(1000000000000000), types.DefaultEVMDenom) contract := suite.deployERC20Contract() @@ -478,7 +485,12 @@ func (suite *HandlerTestSuite) TestERC20TransferReverted() { ethCfg := evmParams.GetChainConfig().EthereumConfig(nil) baseFee := suite.App.EvmKeeper.GetBaseFee(suite.Ctx, ethCfg) - fees, err := keeper.VerifyFee(tx, "aphoton", baseFee, true, true, true, suite.Ctx.IsCheckTx()) + rules := params.Rules{ + IsHomestead: true, + IsIstanbul: true, + IsShanghai: true, + } + fees, err := keeper.VerifyFee(tx, "aphoton", baseFee, rules, suite.Ctx.IsCheckTx()) suite.Require().NoError(err) err = k.DeductTxCostsFromUserBalance(suite.Ctx, fees, tx.GetSender()) suite.Require().NoError(err) @@ -509,7 +521,11 @@ func (suite *HandlerTestSuite) TestERC20TransferReverted() { } func (suite *HandlerTestSuite) TestContractDeploymentRevert() { - intrinsicGas := uint64(134510) + ctorArgsForFloor, err := types.ERC20Contract.ABI.Pack("", suite.Address, big.NewInt(0)) + suite.Require().NoError(err) + deployData := append(types.ERC20Contract.Bin, ctorArgsForFloor...) + floorDataGas, err := core.FloorDataGas(deployData) + suite.Require().NoError(err) testCases := []struct { msg string gasLimit uint64 @@ -517,12 +533,12 @@ func (suite *HandlerTestSuite) TestContractDeploymentRevert() { }{ { "no hooks", - intrinsicGas, + floorDataGas, nil, }, { "success hooks", - intrinsicGas, + floorDataGas, &DummyHook{}, }, } @@ -553,7 +569,7 @@ func (suite *HandlerTestSuite) TestContractDeploymentRevert() { // simulate nonce increment in ante handler db := suite.StateDB() - db.SetNonce(suite.Address, nonce+1) + db.SetNonce(suite.Address, nonce+1, tracing.NonceChangeUnspecified) suite.Require().NoError(db.Commit()) rsp, err := k.EthereumTx(suite.Ctx, tx) @@ -567,6 +583,53 @@ func (suite *HandlerTestSuite) TestContractDeploymentRevert() { } } +func (suite *HandlerTestSuite) TestSelfDestructPostDestructionBalanceBurned() { + gasLimit := uint64(1_000_000) + childInitCode := common.FromHex("0x6009600c60003960096000f3361560075732ff5b00") + attackValue := big.NewInt(1_000_000_000) + factoryAddr := crypto.CreateAddress(suite.Address, 999) + + var saltBytes [32]byte + saltBytes[31] = 0x01 + salt := new(uint256.Int).SetBytes(saltBytes[:]) + + setupDB := suite.StateDB() + setupDB.CreateAccount(factoryAddr) + setupDB.CreateContract(factoryAddr) + setupDB.SetCode(factoryAddr, []byte{0x00}, 0) + suite.Require().NoError(setupDB.Commit()) + + fundingDB := suite.StateDB() + fundingDB.AddBalance(suite.Address, uint256.MustFromBig(attackValue), tracing.BalanceChangeTransfer) + suite.Require().NoError(fundingDB.Commit()) + + cfg1, err := suite.App.EvmKeeper.EVMConfig(suite.Ctx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + msg1 := &core.Message{From: suite.Address, To: &factoryAddr, GasLimit: gasLimit, Value: big.NewInt(0), GasPrice: big.NewInt(0)} + stateDB1 := suite.StateDB() + evm1 := suite.App.EvmKeeper.NewEVM(suite.Ctx, msg1, cfg1, stateDB1) + + _, childAddr, _, err := evm1.Create2(factoryAddr, childInitCode, gasLimit, uint256.NewInt(0), salt) + suite.Require().NoError(err) + suite.Require().Equal(crypto.CreateAddress2(factoryAddr, saltBytes, crypto.Keccak256(childInitCode)), childAddr) + + _, _, err = evm1.Call(suite.Address, childAddr, []byte{0x01}, gasLimit, uint256.NewInt(0)) + suite.Require().NoError(err) + suite.Require().Zero(stateDB1.GetBalance(childAddr).Sign()) + + _, _, err = evm1.Call(suite.Address, childAddr, nil, gasLimit, uint256.MustFromBig(attackValue)) + suite.Require().NoError(err) + suite.Require().Zero(stateDB1.GetBalance(childAddr).Cmp(uint256.MustFromBig(attackValue))) + suite.Require().NoError(stateDB1.Commit()) + + // After commit: account metadata must be gone, and the balance must be burned by the fix. + suite.Require().Nil(suite.App.EvmKeeper.GetAccount(suite.Ctx, childAddr)) + + // The fix: balance should be zero after commit (burned), not attackValue + preservedBalance := suite.App.EvmKeeper.GetEVMDenomBalance(suite.Ctx, childAddr) + suite.Require().Zero(preservedBalance.Sign(), "post-selfdestruct balance must be burned at commit, not preserved") +} + // DummyHook implements EvmHooks interface type DummyHook struct{} diff --git a/x/evm/keeper/abci.go b/x/evm/keeper/abci.go index d890eb53f3..04c6d1442d 100644 --- a/x/evm/keeper/abci.go +++ b/x/evm/keeper/abci.go @@ -17,6 +17,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + ethermint "github.com/evmos/ethermint/types" ) // BeginBlock sets the sdk Context and EIP155 chain id to the Keeper. @@ -24,10 +25,22 @@ func (k *Keeper) BeginBlock(ctx sdk.Context) error { k.WithChainID(ctx) // cache parameters that's common for the whole block. - if _, err := k.EVMBlockConfig(ctx, k.ChainID()); err != nil { + cfg, err := k.EVMBlockConfig(ctx, k.ChainID()) + if err != nil { return err } - + k.SetHeaderHash(ctx) + headerHashNum, err := ethermint.SafeInt64(cfg.Params.GetHeaderHashNum()) + if err != nil { + panic(err) + } + if i := ctx.BlockHeight() - headerHashNum; i > 0 { + h, err := ethermint.SafeUint64(i) + if err != nil { + panic(err) + } + k.DeleteHeaderHash(ctx, h) + } return nil } diff --git a/x/evm/keeper/bloom.go b/x/evm/keeper/bloom.go index 193e20a1b9..52f6c1450a 100644 --- a/x/evm/keeper/bloom.go +++ b/x/evm/keeper/bloom.go @@ -3,7 +3,7 @@ package keeper import ( "math/big" - "cosmossdk.io/store/prefix" + "github.com/cosmos/cosmos-sdk/store/v2/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/evmos/ethermint/x/evm/types" ) diff --git a/x/evm/keeper/config.go b/x/evm/keeper/config.go index 4a19709975..078cb43ea8 100644 --- a/x/evm/keeper/config.go +++ b/x/evm/keeper/config.go @@ -21,9 +21,11 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" rpctypes "github.com/evmos/ethermint/rpc/types" + ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" @@ -41,10 +43,15 @@ type EVMBlockConfig struct { Random *common.Hash // unused, always zero Difficulty *big.Int + // not supported, always zero (EIP-4844 blob transactions are not supported) + BlobBaseFee *big.Int // cache the big.Int version of block number, avoid repeated allocation BlockNumber *big.Int BlockTime uint64 Rules params.Rules + // Default precompile set cached for the entire block – same rules means same set. + // Custom precompiles are added per-transaction in NewEVM since they may depend on tx context. + DefaultPrecompiles map[common.Address]vm.PrecompiledContract } // EVMConfig encapsulates common parameters needed to create an EVM to execute a message @@ -52,10 +59,13 @@ type EVMBlockConfig struct { type EVMConfig struct { *EVMBlockConfig TxConfig statedb.TxConfig - Tracer vm.EVMLogger + Tracer *tracing.Hooks DebugTrace bool Overrides *rpctypes.StateOverride BlockOverrides *rpctypes.BlockOverrides + // DurableSetCodeAuthorizationCtx persists valid EIP-7702 authorization effects + // (authority nonce + code) even if the hook CacheContext is later discarded. + DurableSetCodeAuthorizationCtx *sdk.Context } // EVMBlockConfig creates the EVMBlockConfig based on current state @@ -85,23 +95,37 @@ func (k *Keeper) EVMBlockConfig(ctx sdk.Context, chainID *big.Int) (*EVMBlockCon baseFee = new(big.Int) } } - - blockTime := uint64(ctx.BlockHeader().Time.Unix()) + time := ctx.BlockHeader().Time + var blockTime uint64 + if !time.IsZero() { + blockTime, err = ethermint.SafeUint64(time.Unix()) + if err != nil { + return nil, err + } + } blockNumber := big.NewInt(ctx.BlockHeight()) rules := ethCfg.Rules(blockNumber, ethCfg.MergeNetsplitBlock != nil, blockTime) + // Build the default precompile set once per block. + contracts := make(map[common.Address]vm.PrecompiledContract) + for addr, c := range vm.DefaultPrecompiles(rules) { + contracts[addr] = c + } + var zero common.Hash cfg := &EVMBlockConfig{ - Params: params, - FeeMarketParams: feemarketParams, - ChainConfig: ethCfg, - CoinBase: coinbase, - BaseFee: baseFee, - Difficulty: big.NewInt(0), - Random: &zero, - BlockNumber: blockNumber, - BlockTime: blockTime, - Rules: rules, + Params: params, + FeeMarketParams: feemarketParams, + ChainConfig: ethCfg, + CoinBase: coinbase, + BaseFee: baseFee, + Difficulty: new(big.Int), + Random: &zero, + BlobBaseFee: new(big.Int), + BlockNumber: blockNumber, + BlockTime: blockTime, + Rules: rules, + DefaultPrecompiles: contracts, } objStore.Set(types.KeyPrefixObjectParams, cfg) return cfg, nil @@ -111,6 +135,10 @@ func (k *Keeper) RemoveParamsCache(ctx sdk.Context) { ctx.ObjectStore(k.objectKey).Delete(types.KeyPrefixObjectParams) } +func (cfg EVMConfig) GetTracer() *tracing.Hooks { + return cfg.Tracer +} + // EVMConfig creates the EVMConfig based on current state func (k *Keeper) EVMConfig(ctx sdk.Context, chainID *big.Int, txHash common.Hash) (*EVMConfig, error) { blockCfg, err := k.EVMBlockConfig(ctx, chainID) @@ -148,12 +176,8 @@ func (k Keeper) VMConfig(ctx sdk.Context, cfg *EVMConfig) vm.Config { noBaseFee = cfg.FeeMarketParams.NoBaseFee } - if _, ok := cfg.Tracer.(*types.NoOpTracer); ok { - cfg.Tracer = nil - } - return vm.Config{ - Tracer: cfg.Tracer, + Tracer: cfg.GetTracer(), NoBaseFee: noBaseFee, ExtraEips: cfg.Params.EIPs(), } diff --git a/x/evm/keeper/eip1559_test.go b/x/evm/keeper/eip1559_test.go new file mode 100644 index 0000000000..15ea612851 --- /dev/null +++ b/x/evm/keeper/eip1559_test.go @@ -0,0 +1,86 @@ +package keeper_test + +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/holiman/uint256" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +var _ = Describe("EIP-1559 tx cost balance check", func() { + const ( + baseFee = int64(1) + gasLimit = uint64(21_000) + gasFeeCap = int64(100) + value = int64(10_000) + ) + + var recipient = common.HexToAddress("0x2000000000000000000000000000000000000002") + + setupAndBuildTx := func(senderBalance *big.Int) []byte { + s.SetupTest(s.T()) + s.App.FeeMarketKeeper.SetBaseFee(s.Ctx, big.NewInt(baseFee)) + + denom := s.App.EvmKeeper.GetParams(s.Ctx).EvmDenom + Expect(s.App.EvmKeeper.SetBalance( + s.Ctx, s.Address, *uint256.MustFromBig(senderBalance), denom, + )).To(Succeed()) + + chainID := s.App.EvmKeeper.ChainID() + nonce := s.App.EvmKeeper.GetNonce(s.Ctx, s.Address) + msg := evmtypes.NewTx( + chainID, nonce, &recipient, + big.NewInt(value), + gasLimit, + nil, + big.NewInt(gasFeeCap), + big.NewInt(0), // gasTipCap + nil, // data + ðtypes.AccessList{}, + ) + msg.From = s.Address.Bytes() + return s.PrepareEthTx(msg, s.PrivKey) + } + + recipientBalance := func() *big.Int { + denom := s.App.EvmKeeper.GetParams(s.Ctx).EvmDenom + bal := s.App.EvmKeeper.GetBalance( + s.Ctx, sdk.AccAddress(recipient.Bytes()), denom, + ) + return big.NewInt(bal.ToBig().Int64()) + } + + It("baseline: balance >= max_cost passes CheckTx and DeliverTx", func() { + txBz := setupAndBuildTx(big.NewInt(2_120_000)) + Expect(s.CheckTx(txBz).IsOK()).To(BeTrue(), + "CheckTx must accept fully-funded dynamic-fee tx") + Expect(s.DeliverTx(txBz).IsOK()).To(BeTrue(), + "DeliverTx must accept fully-funded dynamic-fee tx") + Expect(recipientBalance().Cmp(big.NewInt(value))).To(Equal(0), + "recipient must receive value") + }) + + It("negative control: balance < value fails DeliverTx without crediting recipient", func() { + txBz := setupAndBuildTx(big.NewInt(9_000)) + Expect(s.DeliverTx(txBz).IsOK()).To(BeFalse(), + "DeliverTx must reject when balance < value") + Expect(recipientBalance().Sign()).To(BeZero(), + "recipient must not be credited") + }) + + It("gap case: balance in [effective_cost, max_cost) fails both CheckTx and DeliverTx", func() { + txBz := setupAndBuildTx(big.NewInt(40_000)) + Expect(s.CheckTx(txBz).IsOK()).To(BeFalse(), + "CheckTx must reject when balance < value + gas_limit * max_fee_per_gas") + Expect(s.DeliverTx(txBz).IsOK()).To(BeFalse(), + "DeliverTx must also reject") + Expect(recipientBalance().Sign()).To(BeZero(), + "recipient must not be credited") + }) +}) diff --git a/x/evm/keeper/export_test.go b/x/evm/keeper/export_test.go new file mode 100644 index 0000000000..323ccce448 --- /dev/null +++ b/x/evm/keeper/export_test.go @@ -0,0 +1,6 @@ +package keeper + +// SetQueryMaxGasLimitForTest sets the queryMaxGasLimit field for use in tests. +func (k *Keeper) SetQueryMaxGasLimitForTest(limit uint64) { + k.queryMaxGasLimit = limit +} diff --git a/x/evm/keeper/gas.go b/x/evm/keeper/gas.go index b184702937..0131fa6439 100644 --- a/x/evm/keeper/gas.go +++ b/x/evm/keeper/gas.go @@ -32,7 +32,15 @@ import ( // GetEthIntrinsicGas returns the intrinsic gas cost for the transaction func (k *Keeper) GetEthIntrinsicGas(msg *core.Message, rules params.Rules, isContractCreation bool) (uint64, error) { - return core.IntrinsicGas(msg.Data, msg.AccessList, isContractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai) + return core.IntrinsicGas( + msg.Data, + msg.AccessList, + msg.SetCodeAuthorizations, + isContractCreation, + rules.IsHomestead, + rules.IsIstanbul, + rules.IsShanghai, + ) } // RefundGas transfers the leftover gas to the sender of the message, caped to half of the total gas @@ -40,8 +48,23 @@ func (k *Keeper) GetEthIntrinsicGas(msg *core.Message, rules params.Rules, isCon // returned by the EVM execution, thus ignoring the previous intrinsic gas consumed during in the // AnteHandler. func (k *Keeper) RefundGas(ctx sdk.Context, msg *core.Message, leftoverGas uint64, denom string) error { + return k.RefundGasWithPrice(ctx, msg, leftoverGas, msg.GasPrice, denom) +} + +// RefundGasWithPrice transfers the leftover gas to sender using the provided gas price. +func (k *Keeper) RefundGasWithPrice( + ctx sdk.Context, + msg *core.Message, + leftoverGas uint64, + gasPrice *big.Int, + denom string, +) error { + if gasPrice == nil { + gasPrice = new(big.Int) + } + // Return EVM tokens for remaining gas, exchanged at the original rate. - remaining := new(big.Int).Mul(new(big.Int).SetUint64(leftoverGas), msg.GasPrice) + remaining := new(big.Int).Mul(new(big.Int).SetUint64(leftoverGas), gasPrice) switch remaining.Sign() { case -1: diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index 30bed2e3b8..04a20920ca 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -20,6 +20,7 @@ import ( "encoding/json" "errors" "fmt" + "math" "math/big" "time" @@ -41,6 +42,7 @@ import ( rpctypes "github.com/evmos/ethermint/rpc/types" ethermint "github.com/evmos/ethermint/types" + "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" ) @@ -207,7 +209,6 @@ func (k Keeper) Code(c context.Context, req *types.QueryCodeRequest) (*types.Que address := common.HexToAddress(req.Address) acct := k.GetAccount(ctx, address) - var code []byte if acct != nil && acct.IsContract() { code = k.GetCode(ctx, common.BytesToHash(acct.CodeHash)) @@ -229,7 +230,7 @@ func (k Keeper) Params(c context.Context, _ *types.QueryParamsRequest) (*types.Q } // EthCall implements eth_call rpc api. -func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.MsgEthereumTxResponse, error) { +func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.EthCallResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -264,7 +265,17 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms nonce := k.GetNonce(ctx, args.GetFrom()) args.Nonce = (*hexutil.Uint64)(&nonce) - msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) + // Enforce the gas limit cap + gasCap := req.GasCap + if k.queryMaxGasLimit != GasNoLimit { + if gasCap == 0 { + gasCap = k.queryMaxGasLimit + } else if k.queryMaxGasLimit < gasCap { + gasCap = k.queryMaxGasLimit + } + } + + msg, err := args.ToMessage(gasCap, cfg.BaseFee) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } @@ -275,7 +286,7 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms return nil, status.Error(codes.Internal, err.Error()) } - return res, nil + return res.ToEthCallResponse(), nil } // EstimateGas implements eth_estimateGas rpc api. @@ -301,11 +312,20 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type return nil, status.Error(codes.InvalidArgument, err.Error()) } + // Enforce the gas limit cap + gasCap := req.GasCap + if k.queryMaxGasLimit != GasNoLimit { + if gasCap == 0 { + gasCap = k.queryMaxGasLimit + } else if k.queryMaxGasLimit < gasCap { + gasCap = k.queryMaxGasLimit + } + } + // Binary search the gas requirement, as it may be higher than the amount used var ( - lo = ethparams.TxGas - 1 - hi uint64 - gasCap uint64 + lo = ethparams.TxGas - 1 + hi uint64 ) // Determine the highest gas limit can be used during the estimation. @@ -315,7 +335,10 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type // Query block gas limit params := ctx.ConsensusParams() if params.Block != nil && params.Block.MaxGas > 0 { - hi = uint64(params.Block.MaxGas) + hi, err = ethermint.SafeUint64(params.Block.MaxGas) + if err != nil { + return nil, err + } } else { hi = req.GasCap } @@ -324,21 +347,37 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type // TODO: Recap the highest gas limit with account's available balance. // Recap the highest gas allowance with specified gascap. - if req.GasCap != 0 && hi > req.GasCap { - hi = req.GasCap + if gasCap != 0 && hi > gasCap { + hi = gasCap + } else { + gasCap = hi } - gasCap = hi + + // Cap hi to MaxInt64 since gas calculations use int64 internally + if hi > math.MaxInt64 { + hi = math.MaxInt64 + } + cfg, err := k.EVMConfig(ctx, chainID, common.Hash{}) if err != nil { return nil, status.Error(codes.Internal, "failed to load evm config") } + var overrides rpctypes.StateOverride + if len(req.Overrides) > 0 { + if err := json.Unmarshal(req.Overrides, &overrides); err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + cfg.Overrides = &overrides + } + // ApplyMessageWithConfig expect correct nonce set in msg nonce := k.GetNonce(ctx, args.GetFrom()) args.Nonce = (*hexutil.Uint64)(&nonce) // convert the tx args to an ethereum message - msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) + msg, err := args.ToMessage(gasCap, cfg.BaseFee) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -347,21 +386,9 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type // so we don't wrap them with the gRPC status code // Create a helper to check if a gas allowance results in an executable transaction - executable := func(gas uint64) (vmError bool, rsp *types.MsgEthereumTxResponse, err error) { + executable := func(gas uint64) (vmError bool, rsp *types.EVMResult, err error) { // update the message with the new gas value - msg = &core.Message{ - From: msg.From, - To: msg.To, - Nonce: msg.Nonce, - Value: msg.Value, - GasLimit: gas, - GasPrice: msg.GasPrice, - GasFeeCap: msg.GasFeeCap, - GasTipCap: msg.GasTipCap, - Data: msg.Data, - AccessList: msg.AccessList, - SkipAccountChecks: msg.SkipAccountChecks, - } + msg.GasLimit = gas // pass false to not commit StateDB rsp, err = k.ApplyMessageWithConfig(ctx, msg, cfg, false) @@ -371,35 +398,43 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type } return true, nil, err // Bail out } - return len(rsp.VmError) > 0, rsp, nil + return rsp.Failed(), rsp, nil } - // Execute the binary search and hone in on an executable gas limit - hi, err = types.BinSearch(lo, hi, executable) + // We first execute the transaction at the highest allowable gas limit, since if this fails we + // can return error immediately. + failed, result, err := executable(hi) if err != nil { return nil, err } - - // Reject the transaction as invalid if it still fails at the highest allowance - if hi == gasCap { - failed, result, err := executable(hi) - if err != nil { - return nil, err - } - - if failed { - if result != nil && result.VmError != vm.ErrOutOfGas.Error() { - if result.VmError == vm.ErrExecutionReverted.Error() { - return &types.EstimateGasResponse{ - Ret: result.Ret, - VmError: result.VmError, - }, nil - } - return nil, errors.New(result.VmError) + if failed { + if result != nil && result.VmError != vm.ErrOutOfGas.Error() { + if result.VmError == vm.ErrExecutionReverted.Error() { + return &types.EstimateGasResponse{ + Ret: result.Ret, + VmError: result.VmError, + }, nil } - // Otherwise, the specified gas cap is too low - return nil, fmt.Errorf("gas required exceeds allowance (%d)", gasCap) + return nil, errors.New(result.VmError) } + // Otherwise, the specified gas cap is too low + return nil, fmt.Errorf("gas required exceeds allowance (%d)", hi) + } + + // For almost any transaction, the gas consumed by the unconstrained execution + // above lower-bounds the gas limit required for it to succeed. One exception + // is those that explicitly check gas remaining in order to execute within a + // given limit, but we probably don't want to return the lowest possible gas + // limit for these cases anyway. + // Use ExecutionGasUsed (actual gas before minGasMultiplier adjustment) for accurate estimation. + if result.ExecutionGasUsed > 0 { + lo = result.ExecutionGasUsed - 1 + } + + // Execute the binary search and hone in on an executable gas limit + hi, err = types.BinSearch(lo, hi, executable) + if err != nil { + return nil, err } return &types.EstimateGasResponse{Gas: hi}, nil } @@ -418,9 +453,11 @@ func execTrace[T traceRequest]( c context.Context, req T, k Keeper, + baseFee *big.Int, msgCb func( ctx sdk.Context, cfg *EVMConfig, + traceConfig *types.TraceConfig, ) (*core.Message, error), ) ([]byte, error) { var zero T @@ -454,7 +491,11 @@ func execTrace[T traceRequest]( return nil, status.Errorf(codes.Internal, "failed to load evm config: %s", err.Error()) } - msg, err := msgCb(ctx, cfg) + if baseFee != nil { + cfg.BaseFee = baseFee + } + + msg, err := msgCb(ctx, cfg, req.GetTraceConfig()) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -477,13 +518,26 @@ func execTrace[T traceRequest]( // executes the given message in the provided environment. The return value will // be tracer dependent. func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (*types.QueryTraceTxResponse, error) { + var baseFee *big.Int + if req == nil || req.Msg == nil { + return nil, status.Error(codes.InvalidArgument, "request and message cannot be empty") + } + if req.BaseFee != nil && !req.BaseFee.IsNil() { + baseFee = req.BaseFee.BigInt() + } resultData, err := execTrace( c, req, k, - func(ctx sdk.Context, cfg *EVMConfig) (*core.Message, error) { - signer := ethtypes.MakeSigner(cfg.ChainConfig, big.NewInt(ctx.BlockHeight())) - cfg.Tracer = types.NewNoOpTracer() + baseFee, + func(ctx sdk.Context, cfg *EVMConfig, traceConfig *types.TraceConfig) (*core.Message, error) { + signer := ethtypes.MakeSigner(cfg.ChainConfig, big.NewInt(ctx.BlockHeight()), uint64(ctx.BlockTime().Unix())) //#nosec G115 + tracer, err := newTacer(&logger.Config{}, cfg.ChainConfig, cfg.TxConfig, traceConfig) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + cfg.Tracer = tracer.Hooks + cfg.DebugTrace = true for i, tx := range req.Predecessors { ethTx := tx.AsTransaction() msg, err := core.TransactionToMessage(ethTx, signer, cfg.BaseFee) @@ -491,7 +545,10 @@ func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (*typ continue } cfg.TxConfig.TxHash = ethTx.Hash() - cfg.TxConfig.TxIndex = uint(i) + cfg.TxConfig.TxIndex, err = ethermint.SafeUint(i) + if err != nil { + continue + } rsp, err := k.ApplyMessageWithConfig(ctx, msg, cfg, true) if err != nil { continue @@ -550,7 +607,7 @@ func (k Keeper) TraceBlock(c context.Context, req *types.QueryTraceBlockRequest) if err != nil { return nil, status.Error(codes.Internal, "failed to load evm config") } - signer := ethtypes.MakeSigner(cfg.ChainConfig, big.NewInt(ctx.BlockHeight())) + signer := ethtypes.MakeSigner(cfg.ChainConfig, big.NewInt(ctx.BlockHeight()), uint64(ctx.BlockTime().Unix())) //#nosec G115 txsLength := len(req.Txs) results := make([]*types.TxTraceResult, 0, txsLength) @@ -558,7 +615,10 @@ func (k Keeper) TraceBlock(c context.Context, req *types.QueryTraceBlockRequest) result := types.TxTraceResult{} ethTx := tx.AsTransaction() cfg.TxConfig.TxHash = ethTx.Hash() - cfg.TxConfig.TxIndex = uint(i) + cfg.TxConfig.TxIndex, err = ethermint.SafeUint(i) + if err != nil { + return nil, err + } msg, err := core.TransactionToMessage(ethTx, signer, cfg.BaseFee) if err != nil { result.Error = status.Error(codes.Internal, err.Error()).Error() @@ -588,11 +648,15 @@ func (k Keeper) TraceBlock(c context.Context, req *types.QueryTraceBlockRequest) // executes the given call in the provided environment. The return value will // be tracer dependent. func (k Keeper) TraceCall(c context.Context, req *types.QueryTraceCallRequest) (*types.QueryTraceCallResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "request cannot be empty") + } resultData, err := execTrace( c, req, k, - func(ctx sdk.Context, cfg *EVMConfig) (*core.Message, error) { + nil, + func(ctx sdk.Context, cfg *EVMConfig, _ *types.TraceConfig) (*core.Message, error) { var args types.TransactionArgs err := json.Unmarshal(req.Args, &args) if err != nil { @@ -603,7 +667,17 @@ func (k Keeper) TraceCall(c context.Context, req *types.QueryTraceCallRequest) ( nonce := k.GetNonce(ctx, args.GetFrom()) args.Nonce = (*hexutil.Uint64)(&nonce) - msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) + // Enforce the gas limit cap + gasCap := req.GasCap + if k.queryMaxGasLimit != GasNoLimit { + if gasCap == 0 { + gasCap = k.queryMaxGasLimit + } else if k.queryMaxGasLimit < gasCap { + gasCap = k.queryMaxGasLimit + } + } + + msg, err := args.ToMessage(gasCap, cfg.BaseFee) if err != nil { return nil, err } @@ -619,6 +693,42 @@ func (k Keeper) TraceCall(c context.Context, req *types.QueryTraceCallRequest) ( }, nil } +func newTacer( + logConfig *logger.Config, + chainConfig *ethparams.ChainConfig, + txConfig statedb.TxConfig, + traceConfig *types.TraceConfig, +) (*tracers.Tracer, error) { + sLogger := logger.NewStructLogger(logConfig) + tracer := &tracers.Tracer{ + Hooks: sLogger.Hooks(), + GetResult: sLogger.GetResult, + Stop: sLogger.Stop, + } + + if traceConfig != nil && traceConfig.Tracer != "" { + txIndex, err := ethermint.SafeInt(txConfig.TxIndex) + if err != nil { + return nil, err + } + tCtx := &tracers.Context{ + BlockHash: txConfig.BlockHash, + TxIndex: txIndex, + TxHash: txConfig.TxHash, + } + var cfg json.RawMessage + if traceConfig.TracerJsonConfig != "" { + cfg = json.RawMessage(traceConfig.TracerJsonConfig) + } + tracer, err := tracers.DefaultDirectory.New(traceConfig.Tracer, tCtx, cfg, chainConfig) + if err != nil { + return nil, err + } + return tracer, nil + } + return tracer, nil +} + // prepareTrace prepare trace on one Ethereum message, it returns a tuple: (traceResult, nextLogIndex, error). func (k *Keeper) prepareTrace( ctx sdk.Context, @@ -630,7 +740,7 @@ func (k *Keeper) prepareTrace( txConfig := cfg.TxConfig // Assemble the structured logger or the JavaScript tracer var ( - tracer tracers.Tracer + tracer *tracers.Tracer overrides *ethparams.ChainConfig err error timeout = defaultTraceTimeout @@ -649,33 +759,15 @@ func (k *Keeper) prepareTrace( DisableStorage: traceConfig.DisableStorage, DisableStack: traceConfig.DisableStack, EnableReturnData: traceConfig.EnableReturnData, - Debug: traceConfig.Debug, Limit: int(traceConfig.Limit), Overrides: overrides, } - tracer = logger.NewStructLogger(&logConfig) - - txIndex, err := ethermint.SafeInt(txConfig.TxIndex) + tracer, err = newTacer(&logConfig, cfg.ChainConfig, txConfig, traceConfig) if err != nil { return nil, 0, status.Error(codes.Internal, err.Error()) } - tCtx := &tracers.Context{ - BlockHash: txConfig.BlockHash, - TxIndex: txIndex, - TxHash: txConfig.TxHash, - } - if traceConfig.Tracer != "" { - var cfg json.RawMessage - if traceConfig.TracerJsonConfig != "" { - cfg = json.RawMessage(traceConfig.TracerJsonConfig) - } - if tracer, err = tracers.DefaultDirectory.New(traceConfig.Tracer, tCtx, cfg); err != nil { - return nil, 0, status.Error(codes.Internal, err.Error()) - } - } - // Define a meaningful timeout of a single transaction trace if traceConfig.Timeout != "" { if timeout, err = time.ParseDuration(traceConfig.Timeout); err != nil { @@ -712,19 +804,13 @@ func (k *Keeper) prepareTrace( cfg.BlockOverrides = &blockOverrides } - cfg.Tracer = tracer + cfg.Tracer = tracer.Hooks cfg.DebugTrace = true res, err := k.ApplyMessageWithConfig(ctx, msg, cfg, commitMessage) if err != nil { return nil, 0, status.Error(codes.Internal, err.Error()) } - if res.VmError != "" { - if res.VmError == vm.ErrInsufficientBalance.Error() { - return nil, 0, status.Error(codes.Internal, res.VmError) - } - } - var result interface{} result, err = tracer.GetResult() if err != nil { @@ -751,6 +837,94 @@ func (k Keeper) BaseFee(c context.Context, _ *types.QueryBaseFeeRequest) (*types return res, nil } +// SimulateV1 implements the eth_simulateV1 gRPC method. +func (k Keeper) SimulateV1(c context.Context, req *types.SimulateV1Request) (*types.SimulateV1Response, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + ctx := sdk.UnwrapSDKContext(c) + ctx = ctx.WithProposer(GetProposerAddress(ctx, req.ProposerAddress)) + + var payload rpctypes.SimulateV1Args + if err := json.Unmarshal(req.Args, &payload); err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + if payload.BaseHeader == nil { + return nil, status.Error(codes.InvalidArgument, "missing base header") + } + + if len(payload.Opts.BlockStateCalls) == 0 { + return nil, status.Error(codes.InvalidArgument, "blockStateCalls must not be empty") + } + if len(payload.Opts.BlockStateCalls) > rpctypes.MaxSimulateBlocks { + return nil, status.Error(codes.InvalidArgument, "too many blocks in blockStateCalls") + } + + chainID, err := getChainID(ctx, req.ChainId) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + blockCfg, err := k.EVMBlockConfig(ctx, chainID) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + // Enforce the gas limit cap + gasCap := req.GasCap + if k.queryMaxGasLimit != GasNoLimit { + if gasCap == 0 { + gasCap = k.queryMaxGasLimit + } else if k.queryMaxGasLimit < gasCap { + gasCap = k.queryMaxGasLimit + } + } + + baseHeader := ethtypes.CopyHeader(payload.BaseHeader) + if baseHeader.GasLimit == 0 { + baseHeader.GasLimit = gasCap + } + + txConfig := statedb.NewEmptyTxConfig(common.BytesToHash(ctx.HeaderHash())) + stateDB := statedb.NewWithParams(ctx, &k, txConfig, blockCfg.Params.EvmDenom) + + sim := &Simulator{ + keeper: &k, + state: stateDB, + base: baseHeader, + chainConfig: blockCfg.ChainConfig, + budget: rpctypes.NewGasBudget(gasCap), + traceTransfers: payload.Opts.TraceTransfers, + validate: payload.Opts.Validation, + fullTx: payload.Opts.ReturnFullTransactions, + } + + results, err := sim.Execute(ctx, payload.Opts.BlockStateCalls) + if err != nil { + // Return the error via dedicated fields so the caller doesn't need to + // re-parse the result bytes to distinguish success from failure. + errCode := rpctypes.ErrCodeInternalError + if e, ok := err.(interface{ ErrorCode() int }); ok { + errCode = e.ErrorCode() + } + return &types.SimulateV1Response{ + ErrorMessage: err.Error(), + ErrorCode: int32(errCode), //nolint:gosec // G115: error codes are small constants, overflow not possible + }, nil + } + + resultData, err := json.Marshal(results) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &types.SimulateV1Response{ + Result: resultData, + }, nil +} + // getChainID parse chainID from current context if not provided func getChainID(ctx sdk.Context, chainID int64) (*big.Int, error) { if chainID == 0 { @@ -758,3 +932,137 @@ func getChainID(ctx sdk.Context, chainID int64) (*big.Int, error) { } return big.NewInt(chainID), nil } + +func (k Keeper) CreateAccessList(c context.Context, request *types.EthCallRequest) (*types.CreateAccessListResponse, error) { + if request == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + ctx := sdk.UnwrapSDKContext(c) + ctx = ctx.WithProposer(GetProposerAddress(ctx, request.ProposerAddress)) + + var args types.TransactionArgs + err := json.Unmarshal(request.Args, &args) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + chainID, err := getChainID(ctx, request.ChainId) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + cfg, err := k.EVMConfig(ctx, chainID, common.Hash{}) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + var overrides rpctypes.StateOverride + if len(request.Overrides) > 0 { + if err := json.Unmarshal(request.Overrides, &overrides); err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + cfg.Overrides = &overrides + } + // ApplyMessageWithConfig expect correct nonce set in msg + if args.Nonce == nil { + nonce := hexutil.Uint64(k.GetNonce(ctx, args.GetFrom())) + args.Nonce = &nonce + } + // Enforce the gas limit cap + gasCap := request.GasCap + if k.queryMaxGasLimit != GasNoLimit { + if gasCap == 0 { + gasCap = k.queryMaxGasLimit + } else if k.queryMaxGasLimit < gasCap { + gasCap = k.queryMaxGasLimit + } + } + + addressesToExclude, err := k.getAccessListExcludes(ctx, args, cfg) + if err != nil { + k.Logger(ctx).Error("failed to get access list excludes", "error", err) + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + // Create an initial tracer + prevTracer := logger.NewAccessListTracer(nil, addressesToExclude) + if args.AccessList != nil { + prevTracer = logger.NewAccessListTracer(*args.AccessList, addressesToExclude) + } + // iteratively expand the access list (max allowed interation 10 for safety) + for i := 0; i < 10; i++ { + // Retrieve the current access list to expand + accessList := prevTracer.AccessList() + args.AccessList = &accessList + msg, err := args.ToMessage(gasCap, cfg.BaseFee) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + // Apply the transaction with the access list tracer + newTracer := logger.NewAccessListTracer(accessList, addressesToExclude) + cfg.Tracer = newTracer.Hooks() + res, err := k.ApplyMessageWithConfig(ctx, msg, cfg, false) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + // Check if access list has converged (no new addresses/slots accessed) + if newTracer.Equal(prevTracer) { + k.Logger(ctx).Info("access list converged", "accessList", accessList) + result := types.AccessListResult{ + AccessList: accessList, + GasUsed: hexutil.Uint64(res.GasUsed), + Error: res.VmError, + } + bz, err := json.Marshal(&result) + return &types.CreateAccessListResponse{ + Data: bz, + }, err + } + prevTracer = newTracer + } + return nil, status.Error(codes.Internal, "access list did not converge") +} + +// getAccessListExcludes returns the addresses to exclude from the access list. +// This includes the sender account, the target account (if provided), precompiles, +// and any addresses in the authorization list. +func (k Keeper) getAccessListExcludes(ctx sdk.Context, args types.TransactionArgs, cfg *EVMConfig) (map[common.Address]struct{}, error) { + // exclude sender and precompiles + addressesToExclude := make(map[common.Address]struct{}) + addressesToExclude[args.GetFrom()] = struct{}{} + if args.To != nil { + addressesToExclude[*args.To] = struct{}{} + } + + rules := cfg.Rules + precompiles := vm.ActivePrecompiles(rules) + for _, addr := range precompiles { + addressesToExclude[addr] = struct{}{} + } + + // check if enough gas was provided to cover all authorization lists + if args.Gas == nil { + return nil, errors.New("gas must be set when using authorization list") + } + maxAuthorizations := uint64(*args.Gas) / ethparams.CallNewAccountGas + if uint64(len(args.AuthorizationList)) > maxAuthorizations { + k.Logger(ctx).Error("insufficient gas to process all authorizations", "maxAuthorizations", maxAuthorizations) + return nil, errors.New("insufficient gas to process all authorizations") + } + + for _, auth := range args.AuthorizationList { + // validate authorization (duplicating stateTransition.validateAuthorization() logic from geth: https://github.com/ethereum/go-ethereum/blob/bf8f63dcd27e178bd373bfe41ea718efee2851dd/core/state_transition.go#L575) + nonceOverflow := auth.Nonce+1 < auth.Nonce + invalidChainID := !auth.ChainID.IsZero() && auth.ChainID.CmpBig(cfg.ChainConfig.ChainID) != 0 + if nonceOverflow || invalidChainID { + k.Logger(ctx).Error("invalid authorization", "auth", auth) + continue + } + if authority, err := auth.Authority(); err == nil { + addressesToExclude[authority] = struct{}{} + } + } + + k.Logger(ctx).Debug("access list excludes created", "addressesToExclude", addressesToExclude) + return addressesToExclude, nil +} diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index 5ce91aa026..9ee52c0b80 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -11,12 +11,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" ethlogger "github.com/ethereum/go-ethereum/eth/tracers/logger" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" + rpctypes "github.com/evmos/ethermint/rpc/types" "github.com/evmos/ethermint/server/config" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/testutil" @@ -25,6 +27,7 @@ import ( "github.com/evmos/ethermint/x/evm/types" evmtypes "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" + "github.com/holiman/uint256" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -39,7 +42,7 @@ type GRPCServerTestSuiteSuite struct { } func (suite *GRPCServerTestSuiteSuite) SetupTest() { - suite.EVMTestSuiteWithAccountAndQueryClient.SetupTestWithCb(suite.T(), func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.EVMTestSuiteWithAccountAndQueryClient.SetupTestWithCb(suite.T(), func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { feemarketGenesis := feemarkettypes.DefaultGenesisState() if suite.enableFeemarket { feemarketGenesis.Params.EnableHeight = 1 @@ -56,6 +59,9 @@ func (suite *GRPCServerTestSuiteSuite) SetupTest() { evmGenesis.Params.ChainConfig.GrayGlacierBlock = &maxInt evmGenesis.Params.ChainConfig.MergeNetsplitBlock = &maxInt evmGenesis.Params.ChainConfig.ShanghaiTime = &maxInt + evmGenesis.Params.ChainConfig.CancunTime = &maxInt + evmGenesis.Params.ChainConfig.PragueTime = &maxInt + evmGenesis.Params.ChainConfig.OsakaTime = &maxInt genesis[types.ModuleName] = app.AppCodec().MustMarshalJSON(evmGenesis) } return genesis @@ -126,10 +132,13 @@ func (suite *GRPCServerTestSuiteSuite) transferERC20Token(t require.TestingT, co ercTransferTx.From = suite.Address.Bytes() err = ercTransferTx.Sign(ethtypes.LatestSignerForChainID(chainID), suite.Signer) + require.NoError(t, err) rsp, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, ercTransferTx) + require.NoError(t, err) require.Empty(t, rsp.VmError) + return ercTransferTx } @@ -223,10 +232,11 @@ func (suite *GRPCServerTestSuiteSuite) TestQueryCosmosAccount() { { "success", func() { + acc := suite.App.AccountKeeper.GetAccount(suite.Ctx, suite.Address.Bytes()) expAccount = &types.QueryCosmosAccountResponse{ CosmosAddress: sdk.AccAddress(suite.Address.Bytes()).String(), Sequence: 0, - AccountNumber: suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) - 1, + AccountNumber: acc.GetAccountNumber(), } req = &types.QueryCosmosAccountRequest{ Address: suite.Address.String(), @@ -239,7 +249,7 @@ func (suite *GRPCServerTestSuiteSuite) TestQueryCosmosAccount() { func() { acc := suite.App.AccountKeeper.GetAccount(suite.Ctx, suite.Address.Bytes()) suite.Require().NoError(acc.SetSequence(10)) - num := suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + num := suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, acc) suite.Require().NoError(acc.SetAccountNumber(num)) suite.App.AccountKeeper.SetAccount(suite.Ctx, acc) expAccount = &types.QueryCosmosAccountResponse{ @@ -410,7 +420,7 @@ func (suite *GRPCServerTestSuiteSuite) TestQueryCode() { "success", func(vmdb vm.StateDB) { expCode = []byte("code") - vmdb.SetCode(suite.Address, expCode) + vmdb.SetCode(suite.Address, expCode, 0) req = &types.QueryCodeRequest{ Address: suite.Address.String(), @@ -527,10 +537,11 @@ func (suite *GRPCServerTestSuiteSuite) TestQueryValidatorAccount() { { "success", func() { + acc := suite.App.AccountKeeper.GetAccount(suite.Ctx, suite.Address.Bytes()) expAccount = &types.QueryValidatorAccountResponse{ AccountAddress: sdk.AccAddress(suite.Address.Bytes()).String(), Sequence: 0, - AccountNumber: suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) - 1, + AccountNumber: acc.GetAccountNumber(), } req = &types.QueryValidatorAccountRequest{ ConsAddress: suite.ConsAddress.String(), @@ -543,7 +554,7 @@ func (suite *GRPCServerTestSuiteSuite) TestQueryValidatorAccount() { func() { acc := suite.App.AccountKeeper.GetAccount(suite.Ctx, suite.Address.Bytes()) suite.Require().NoError(acc.SetSequence(10)) - num := suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + num := suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, acc) suite.Require().NoError(acc.SetAccountNumber(num)) suite.App.AccountKeeper.SetAccount(suite.Ctx, acc) expAccount = &types.QueryValidatorAccountResponse{ @@ -577,7 +588,7 @@ func (suite *GRPCServerTestSuiteSuite) TestQueryValidatorAccount() { } func (suite *GRPCServerTestSuiteSuite) TestEstimateGas() { - gasHelper := hexutil.Uint64(20000) + gasHelper := hexutil.Uint64(22000) higherGas := hexutil.Uint64(25000) hexBigInt := hexutil.Big(*big.NewInt(1)) @@ -862,7 +873,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { predecessors = []*types.MsgEthereumTx{} }, expPass: true, - traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", + traceResponse: `{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"PUSH1","gas`, }, { msg: "default trace with filtered response", @@ -875,7 +886,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { predecessors = []*types.MsgEthereumTx{} }, expPass: true, - traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", + traceResponse: `{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"PUSH1","gas`, enableFeemarket: false, }, { @@ -899,8 +910,22 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { } predecessors = []*types.MsgEthereumTx{} }, + expPass: false, + enableFeemarket: true, + }, + { + msg: "default trace with enableFeemarket and sufficient balance", + malleate: func() { + suite.App.EvmKeeper.SetBalance(suite.Ctx, suite.Address, *uint256.NewInt(1000000000000000000), types.DefaultEVMDenom) + traceConfig = &types.TraceConfig{ + DisableStack: true, + DisableStorage: true, + EnableMemory: false, + } + predecessors = []*types.MsgEthereumTx{} + }, expPass: true, - traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", + traceResponse: `{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"PUSH1","gas`, enableFeemarket: true, }, { @@ -911,6 +936,18 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { } predecessors = []*types.MsgEthereumTx{} }, + expPass: false, + enableFeemarket: true, + }, + { + msg: "javascript tracer with enableFeemarket and sufficient balance", + malleate: func() { + suite.App.EvmKeeper.SetBalance(suite.Ctx, suite.Address, *uint256.NewInt(1000000000000000000), types.DefaultEVMDenom) + traceConfig = &types.TraceConfig{ + Tracer: "{data: [], fault: function(log) {}, step: function(log) { if(log.op.toString() == \"CALL\") this.data.push(log.stack.peek(0)); }, result: function() { return this.data; }}", + } + predecessors = []*types.MsgEthereumTx{} + }, expPass: true, traceResponse: "[]", enableFeemarket: true, @@ -922,7 +959,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { // increase nonce to avoid address collision vmdb := suite.StateDB() - vmdb.SetNonce(suite.Address, vmdb.GetNonce(suite.Address)+1) + vmdb.SetNonce(suite.Address, vmdb.GetNonce(suite.Address)+1, tracing.NonceChangeUnspecified) suite.Require().NoError(vmdb.Commit()) contractAddr := suite.deployTestContract(suite.Address) suite.Commit(suite.T()) @@ -934,7 +971,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { predecessors = append(predecessors, firstTx) }, expPass: true, - traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", + traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0x0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas", enableFeemarket: false, }, { @@ -980,7 +1017,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { // increase nonce to avoid address collision vmdb := suite.StateDB() - vmdb.SetNonce(suite.Address, vmdb.GetNonce(suite.Address)+1) + vmdb.SetNonce(suite.Address, vmdb.GetNonce(suite.Address)+1, tracing.NonceChangeUnspecified) suite.Require().NoError(vmdb.Commit()) chainID := suite.App.EvmKeeper.ChainID() @@ -1005,7 +1042,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { suite.App.EvmKeeper.SetParams(suite.Ctx, params) }, expPass: true, - traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":", + traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0x0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas", }, { msg: "invalid chain id", @@ -1017,6 +1054,15 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceTx() { }, expPass: false, }, + { + msg: "nil Msg in QueryTraceTxRequest", + malleate: func() { + traceConfig = nil + predecessors = []*types.MsgEthereumTx{} + txMsg = nil + }, + expPass: false, + }, } for _, tc := range testCases { @@ -1085,7 +1131,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { traceConfig = nil }, expPass: true, - traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU", + traceResponse: `[{"result":{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"`, }, { msg: "filtered trace", @@ -1097,7 +1143,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { } }, expPass: true, - traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU", + traceResponse: `[{"result":{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"`, }, { msg: "javascript tracer", @@ -1119,7 +1165,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { } }, expPass: true, - traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU", + traceResponse: `[{"result":{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"`, enableFeemarket: true, }, { @@ -1130,7 +1176,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { } }, expPass: true, - traceResponse: "[{\"result\":[]}]", + traceResponse: `[{"result":[]}]`, enableFeemarket: true, }, { @@ -1140,7 +1186,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { // increase nonce to avoid address collision vmdb := suite.StateDB() - vmdb.SetNonce(suite.Address, vmdb.GetNonce(suite.Address)+1) + vmdb.SetNonce(suite.Address, vmdb.GetNonce(suite.Address)+1, tracing.NonceChangeUnspecified) suite.Require().NoError(vmdb.Commit()) contractAddr := suite.deployTestContract(suite.Address) suite.Commit(suite.T()) @@ -1152,7 +1198,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { txs = append([]*types.MsgEthereumTx{}, firstTx, secondTx) }, expPass: true, - traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU", + traceResponse: `[{"result":{"gas":34828,"failed":false,"returnValue":"0x0000000000000000000000000000000000000000000000000000000000000001","structLogs":[{"pc":0,"op":"`, enableFeemarket: false, }, { @@ -1200,7 +1246,7 @@ func (suite *GRPCServerTestSuiteSuite) TestTraceBlock() { // Deploy contract contractAddr := suite.deployTestContract(suite.Address) // set some balance to handle fees - suite.App.EvmKeeper.SetBalance(suite.Ctx, suite.Address, big.NewInt(1000000000000000000), types.DefaultEVMDenom) + suite.App.EvmKeeper.SetBalance(suite.Ctx, suite.Address, *uint256.NewInt(1000000000000000000), types.DefaultEVMDenom) suite.Commit(suite.T()) // Generate token transfer transaction txMsg := suite.transferERC20Token(suite.T(), contractAddr, suite.Address, common.HexToAddress("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec"), sdkmath.NewIntWithDecimal(1, 18).BigInt()) @@ -1494,3 +1540,1277 @@ func (suite *GRPCServerTestSuiteSuite) TestEmptyRequest() { }) } } + +// --------------------------------------------------------------------------- +// SimulateV1 gRPC handler tests +// --------------------------------------------------------------------------- + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_NilRequest() { + _, err := suite.App.EvmKeeper.SimulateV1(suite.Ctx, nil) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "empty request") +} + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_InvalidJSON() { + req := &evmtypes.SimulateV1Request{ + Args: []byte("not valid json"), + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + } + _, err := suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().Error(err) +} + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_MissingBaseHeader() { + payload := rpctypes.SimulateV1Args{ + Opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + }, + BaseHeader: nil, + } + bz, err := json.Marshal(&payload) + suite.Require().NoError(err) + + req := &evmtypes.SimulateV1Request{ + Args: bz, + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + } + _, err = suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "missing base header") +} + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_EmptyBlockStateCalls() { + baseHeader := ðtypes.Header{ + Number: big.NewInt(suite.Ctx.BlockHeight()), + Time: uint64(suite.Ctx.BlockTime().Unix()), + Difficulty: big.NewInt(0), + GasLimit: 25_000_000, + } + payload := rpctypes.SimulateV1Args{ + Opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{}, + }, + BaseHeader: baseHeader, + } + bz, err := json.Marshal(&payload) + suite.Require().NoError(err) + + req := &evmtypes.SimulateV1Request{ + Args: bz, + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + } + _, err = suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "blockStateCalls must not be empty") +} + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_TooManyBlocks() { + baseHeader := ðtypes.Header{ + Number: big.NewInt(suite.Ctx.BlockHeight()), + Time: uint64(suite.Ctx.BlockTime().Unix()), + Difficulty: big.NewInt(0), + GasLimit: 25_000_000, + } + blocks := make([]rpctypes.SimBlock, rpctypes.MaxSimulateBlocks+1) + payload := rpctypes.SimulateV1Args{ + Opts: rpctypes.SimOpts{ + BlockStateCalls: blocks, + }, + BaseHeader: baseHeader, + } + bz, err := json.Marshal(&payload) + suite.Require().NoError(err) + + req := &evmtypes.SimulateV1Request{ + Args: bz, + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + } + _, err = suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "too many blocks in blockStateCalls") +} + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_SingleEmptyBlock() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + baseHeader := ðtypes.Header{ + Number: big.NewInt(suite.Ctx.BlockHeight()), + Time: uint64(suite.Ctx.BlockTime().Unix()), + Difficulty: big.NewInt(0), + GasLimit: 25_000_000, + } + + payload := rpctypes.SimulateV1Args{ + Opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + }, + BaseHeader: baseHeader, + } + bz, err := json.Marshal(&payload) + suite.Require().NoError(err) + + req := &evmtypes.SimulateV1Request{ + Args: bz, + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + ProposerAddress: suite.Ctx.BlockHeader().ProposerAddress, + } + resp, err := suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().NoError(err) + suite.Require().NotNil(resp) + suite.Require().NotEmpty(resp.Result) +} + +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_WithSimpleTransfer() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + to := tests.GenerateAddress() + from := suite.Address + + baseHeader := ðtypes.Header{ + Number: big.NewInt(suite.Ctx.BlockHeight()), + Time: uint64(suite.Ctx.BlockTime().Unix()), + Difficulty: big.NewInt(0), + GasLimit: 25_000_000, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + payload := rpctypes.SimulateV1Args{ + Opts: rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + { + Calls: []json.RawMessage{callJSON}, + }, + }, + }, + BaseHeader: baseHeader, + } + bz, err := json.Marshal(&payload) + suite.Require().NoError(err) + + req := &evmtypes.SimulateV1Request{ + Args: bz, + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + ProposerAddress: suite.Ctx.BlockHeader().ProposerAddress, + } + resp, err := suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().NoError(err) + suite.Require().NotNil(resp) + suite.Require().NotEmpty(resp.Result) +} + +// --------------------------------------------------------------------------- +// Simulator code-path coverage via SimulateV1 gRPC +// --------------------------------------------------------------------------- + +// helper: builds a SimulateV1 request payload and returns the keeper response. +func (suite *GRPCServerTestSuiteSuite) simulateRequest( + opts rpctypes.SimOpts, + baseHeader *ethtypes.Header, + gasCap uint64, +) (*evmtypes.SimulateV1Response, error) { + payload := rpctypes.SimulateV1Args{Opts: opts, BaseHeader: baseHeader} + bz, err := json.Marshal(&payload) + if err != nil { + return nil, err + } + req := &evmtypes.SimulateV1Request{ + Args: bz, + GasCap: gasCap, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + ProposerAddress: suite.Ctx.BlockHeader().ProposerAddress, + } + return suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) +} + +// ctxBaseHeader builds an ethtypes.Header from the current test context. +func (suite *GRPCServerTestSuiteSuite) ctxBaseHeader(gasLimit uint64) *ethtypes.Header { + return ðtypes.Header{ + Number: big.NewInt(suite.Ctx.BlockHeight()), + Time: uint64(suite.Ctx.BlockTime().Unix()), + Difficulty: big.NewInt(0), + GasLimit: gasLimit, + } +} + +// TestSimulator_SanitizeChain_InvalidBlockNumber exercises the block-number-order +// error path in sanitizeChain (within Execute). +func (suite *GRPCServerTestSuiteSuite) TestSimulator_SanitizeChain_InvalidBlockNumber() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + baseHeader := suite.ctxBaseHeader(25_000_000) + // Supply a block number that is ≤ baseHeader.Number + sameNum := (*hexutil.Big)(new(big.Int).Set(baseHeader.Number)) + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {BlockOverrides: &rpctypes.SimBlockOverrides{Number: sameNum}}, + }, + } + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) // gRPC call itself succeeds + // The response carries the simulation error in dedicated fields. + suite.Require().Equal(rpctypes.ErrCodeBlockNumberInvalid, int(resp.ErrorCode)) + suite.Require().Contains(resp.ErrorMessage, "block numbers must be in order") +} + +// TestSimulator_SanitizeChain_InvalidTimestamp exercises the timestamp-order +// error path in sanitizeChain. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_SanitizeChain_InvalidTimestamp() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + baseHeader := suite.ctxBaseHeader(25_000_000) + nextNum := (*hexutil.Big)(new(big.Int).Add(baseHeader.Number, big.NewInt(1))) + // Timestamp in the past + pastTime := hexutil.Uint64(baseHeader.Time - 1) + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {BlockOverrides: &rpctypes.SimBlockOverrides{ + Number: nextNum, + Time: &pastTime, + }}, + }, + } + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().Equal(rpctypes.ErrCodeBlockTimestampInvalid, int(resp.ErrorCode)) + suite.Require().Contains(resp.ErrorMessage, "block timestamps must be in order") +} + +// TestSimulator_SanitizeChain_GapFilling exercises the gap-filling path where +// sanitizeChain inserts empty intermediate blocks. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_SanitizeChain_GapFilling() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + baseHeader := suite.ctxBaseHeader(25_000_000) + // Jump 3 blocks ahead → 2 gap-fill blocks + 1 explicit block + farNum := (*hexutil.Big)(new(big.Int).Add(baseHeader.Number, big.NewInt(3))) + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {BlockOverrides: &rpctypes.SimBlockOverrides{Number: farNum}}, + }, + } + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + // Result should be valid (3 blocks) + var blocks []json.RawMessage + suite.Require().NoError(json.Unmarshal(resp.Result, &blocks)) + suite.Require().Len(blocks, 3) +} + +// TestSimulator_ContractCreation exercises the contract-creation path in applyCall. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_ContractCreation() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + // Minimal init code: just STOP (0x00) + initCode := hexutil.Bytes{0x00} + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "gas": hexutil.EncodeUint64(200_000), + "value": hexutil.EncodeBig(big.NewInt(0)), + "input": hexutil.Encode(initCode), + // No "to" field → contract creation + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_EVMRevert exercises the EVM-revert path in processBlock. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_EVMRevert() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + // EVM bytecode that immediately REVERTs: PUSH1 0 PUSH1 0 REVERT + revertCode := hexutil.Bytes{0x60, 0x00, 0x60, 0x00, 0xfd} + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "gas": hexutil.EncodeUint64(100_000), + "value": hexutil.EncodeBig(big.NewInt(0)), + "input": hexutil.Encode(revertCode), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) + + // The call should report a failure status + var results []map[string]json.RawMessage + suite.Require().NoError(json.Unmarshal(resp.Result, &results)) + suite.Require().Len(results, 1) + var calls []map[string]json.RawMessage + suite.Require().NoError(json.Unmarshal(results[0]["calls"], &calls)) + suite.Require().Len(calls, 1) + // status should be "0x0" (failure) + suite.Require().Contains(string(calls[0]["status"]), "0x0") +} + +// TestSimulator_InvalidCallJSON exercises the invalid-JSON-call path in processBlock. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_InvalidCallJSON() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + // Manually construct the payload with an invalid call JSON that passes + // Go's json.Marshal (as an escaped string) but fails to unmarshal as + // TransactionArgs inside processBlock. + rawPayload := []byte(`{ + "opts": { + "blockStateCalls": [ + {"calls": [{"not": "a valid tx arg that will fail strict unmarshal... "}]} + ] + }, + "baseHeader": { + "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner":"0x0000000000000000000000000000000000000000", + "stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty":"0x0", + "number":"0x1", + "gasLimit":"0x17d7840", + "gasUsed":"0x0", + "timestamp":"0x1", + "extraData":"0x", + "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce":"0x0000000000000000", + "hash":"0x0000000000000000000000000000000000000000000000000000000000000000" + } + }`) + + req := &evmtypes.SimulateV1Request{ + Args: rawPayload, + GasCap: 25_000_000, + ChainId: suite.App.EvmKeeper.ChainID().Int64(), + ProposerAddress: suite.Ctx.BlockHeader().ProposerAddress, + } + resp, err := suite.App.EvmKeeper.SimulateV1(suite.Ctx, req) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) + // The result could be either an error response (if the call fails) or a valid block + // Either is acceptable - we're testing that the code path runs without panic +} + +// TestSimulator_ValidationMode exercises the validate=true path in applyCall. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_ValidationMode() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(0)), + "nonce": hexutil.EncodeUint64(999), // nonce too high → validation error + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + Validation: true, + } + // Validation mode requires BaseFee to be set for London rules. + baseHeader := suite.ctxBaseHeader(25_000_000) + baseHeader.BaseFee = big.NewInt(0) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotZero(resp.ErrorCode) +} + +// TestSimulator_BlockGasLimitReached exercises the BlockGasLimitReachedError +// path in sanitizeCall. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_BlockGasLimitReached() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + + // Request more gas than the block gas limit + bigGas := hexutil.EncodeUint64(50_000_000) + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": bigGas, + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + blockGasLimit := hexutil.Uint64(1000) // tiny block gas limit + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + { + BlockOverrides: &rpctypes.SimBlockOverrides{ + GasLimit: &blockGasLimit, + }, + Calls: []json.RawMessage{callJSON}, + }, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotZero(resp.ErrorCode) +} + +// TestSimulator_TraceTransfers exercises the traceTransfers=true path. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_TraceTransfers() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + TraceTransfers: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_ReturnFullTransactions exercises the fullTx=true path. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_ReturnFullTransactions() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + ReturnFullTransactions: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_BlobBaseFeeOverride exercises the BlobBaseFee override path. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_BlobBaseFeeOverride() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + baseHeader := suite.ctxBaseHeader(25_000_000) + blobFee := (*hexutil.Big)(big.NewInt(1_000_000)) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {BlockOverrides: &rpctypes.SimBlockOverrides{ + BlobBaseFee: blobFee, + }}, + }, + } + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_StateOverrides exercises the Apply-state-override path. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_StateOverrides() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + addr := tests.GenerateAddress() + newBalance := (*hexutil.Big)(big.NewInt(1e18)) + newNonce := hexutil.Uint64(5) + + stateOverride := rpctypes.SimStateOverride{ + addr: rpctypes.SimOverrideAccount{ + Balance: newBalance, + Nonce: &newNonce, + }, + } + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_StateOverrides_Code verifies that code overrides are applied +// and exercises the Apply code-override path. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_StateOverrides_Code() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + addr := tests.GenerateAddress() + // Simple STOP bytecode. + code := hexutil.Bytes([]byte{0x00}) + + stateOverride := rpctypes.SimStateOverride{ + addr: rpctypes.SimOverrideAccount{ + Code: &code, + }, + } + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_StateOverrides_StateDiff verifies that stateDiff overrides +// (SetState path) are applied via Apply. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_StateOverrides_StateDiff() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + addr := tests.GenerateAddress() + key := common.HexToHash("0x01") + val := common.HexToHash("0xff") + + stateOverride := rpctypes.SimStateOverride{ + addr: rpctypes.SimOverrideAccount{ + StateDiff: map[common.Hash]common.Hash{key: val}, + }, + } + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_StateOverrides_State verifies that full-state replacement +// (SetStorage path) is applied via Apply. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_StateOverrides_State() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + addr := tests.GenerateAddress() + key := common.HexToHash("0x02") + val := common.HexToHash("0xab") + + stateOverride := rpctypes.SimStateOverride{ + addr: rpctypes.SimOverrideAccount{ + State: map[common.Hash]common.Hash{key: val}, + }, + } + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_TraceTransfers_WithValue exercises the repairLogs inner loop +// by producing a synthetic ERC-7528 transfer log via traceTransfers=true with +// a non-zero ETH value. The log's BlockHash is repaired by repairLogs. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_TraceTransfers_WithValue() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + value := big.NewInt(1) // non-zero value triggers the transfer log + + // Give the sender enough balance via state override. + largeBalance := (*hexutil.Big)(new(big.Int).Mul(big.NewInt(1e18), big.NewInt(100))) + stateOverride := rpctypes.SimStateOverride{ + from: rpctypes.SimOverrideAccount{Balance: largeBalance}, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(value), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + { + StateOverrides: &stateOverride, + Calls: []json.RawMessage{callJSON}, + }, + }, + TraceTransfers: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_StateOverrides_MovePrecompile exercises the successful +// precompile-move path in SimStateOverride.Apply (precompile moved to a new +// address that is not already in the override map). +func (suite *GRPCServerTestSuiteSuite) TestSimulator_StateOverrides_MovePrecompile() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + // ecrecover lives at 0x01 and is always present in the precompile map. + precompileAddr := common.HexToAddress("0x0000000000000000000000000000000000000001") + destAddr := tests.GenerateAddress() + + stateOverride := rpctypes.SimStateOverride{ + precompileAddr: rpctypes.SimOverrideAccount{ + MovePrecompileTo: &destAddr, + }, + } + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_SetCodeAuthorizations exercises the msg.SetCodeAuthorizations != nil +// branch in applyCall (EIP-7702 authorization path). +func (suite *GRPCServerTestSuiteSuite) TestSimulator_SetCodeAuthorizations() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + + // Build a call with an authorization list (EIP-7702 SetCode). + gas := hexutil.Uint64(50_000) + val := hexutil.Big(*big.NewInt(0)) + nonce := hexutil.Uint64(0) + args := evmtypes.TransactionArgs{ + From: &from, + To: &to, + Gas: &gas, + Value: &val, + Nonce: &nonce, + // Empty authorization list triggers the SetCodeAuthorizations loop in applyCall. + AuthorizationList: []ethtypes.SetCodeAuthorization{{Address: to}}, + } + callJSON, err := json.Marshal(args) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_Validation_NonceTooLow exercises the nonce-too-low path in applyCall. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_Validation_NonceTooLow() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := tests.GenerateAddress() + to := tests.GenerateAddress() + + // Override nonce to 2 so tx nonce=1 is too low. + stateNonce := hexutil.Uint64(2) + stateOverride := rpctypes.SimStateOverride{ + from: rpctypes.SimOverrideAccount{Nonce: &stateNonce}, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "nonce": hexutil.EncodeUint64(1), // tx nonce=1 < state nonce=2 + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + { + StateOverrides: &stateOverride, + Calls: []json.RawMessage{callJSON}, + }, + }, + Validation: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + baseHeader.BaseFee = big.NewInt(0) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + // Validation errors propagate as simulation-level errors. + suite.Require().NotZero(resp.ErrorCode) + suite.Require().Contains(resp.ErrorMessage, "nonce too low") +} + +// TestSimulator_Validation_FeeCapTooLow exercises the fee-cap-too-low path in applyCall. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_Validation_FeeCapTooLow() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := tests.GenerateAddress() + to := tests.GenerateAddress() + + // Set a large balance so the balance check passes. + largeBalance := (*hexutil.Big)(new(big.Int).Mul(big.NewInt(1e18), big.NewInt(100))) + stateOverride := rpctypes.SimStateOverride{ + from: rpctypes.SimOverrideAccount{Balance: largeBalance}, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(0)), + "maxFeePerGas": hexutil.EncodeBig(big.NewInt(1)), // lower than baseFee=100 + "maxPriorityFeePerGas": hexutil.EncodeBig(big.NewInt(1)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + { + StateOverrides: &stateOverride, + Calls: []json.RawMessage{callJSON}, + }, + }, + Validation: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + baseHeader.BaseFee = big.NewInt(100) // higher than maxFeePerGas=1 + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + // Validation errors propagate as simulation-level errors. + suite.Require().NotZero(resp.ErrorCode) + suite.Require().Contains(resp.ErrorMessage, "max fee per gas less than block base fee") +} + +// TestSimulator_Validation_InsufficientFunds exercises the insufficient-funds path in applyCall. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_Validation_InsufficientFunds() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + // Fresh address with zero balance. + from := tests.GenerateAddress() + to := tests.GenerateAddress() + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(1_000_000)), // requires funds + "maxFeePerGas": hexutil.EncodeBig(big.NewInt(0)), + "maxPriorityFeePerGas": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + Validation: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + baseHeader.BaseFee = big.NewInt(0) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + // Validation errors propagate as simulation-level errors. + suite.Require().NotZero(resp.ErrorCode) + suite.Require().Contains(resp.ErrorMessage, "insufficient funds") +} + +// TestSimulator_EVMNonRevertError exercises the non-revert EVM error path in processBlock +// (e.g., out-of-gas, which results in vm.ErrOutOfGas rather than vm.ErrExecutionReverted). +func (suite *GRPCServerTestSuiteSuite) TestSimulator_EVMNonRevertError() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + target := tests.GenerateAddress() + + // Infinite loop bytecode: JUMPDEST (0x5b), PUSH1 0 (0x60, 0x00), JUMP (0x56) + // This loops forever and will exhaust any gas limit → vm.ErrOutOfGas. + infiniteLoop := hexutil.Bytes{0x5b, 0x60, 0x00, 0x56} + stateOverride := rpctypes.SimStateOverride{ + target: rpctypes.SimOverrideAccount{ + Code: &infiniteLoop, + }, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": target.Hex(), + "gas": hexutil.EncodeUint64(25_000), // just over intrinsic gas; loop burns the rest + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + { + StateOverrides: &stateOverride, + Calls: []json.RawMessage{callJSON}, + }, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) + + var results []map[string]json.RawMessage + suite.Require().NoError(json.Unmarshal(resp.Result, &results)) + suite.Require().Len(results, 1) + var calls []map[string]json.RawMessage + suite.Require().NoError(json.Unmarshal(results[0]["calls"], &calls)) + suite.Require().Len(calls, 1) + // Status should be failure (0x0) with an error object. + suite.Require().Contains(string(calls[0]["status"]), "0x0") + suite.Require().NotNil(calls[0]["error"]) +} + +// TestSimulateV1_GasCapEnforced_ZeroGasCap exercises the gasCap=0 path in SimulateV1 +// where queryMaxGasLimit is applied as the new cap. +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_GasCapEnforced_ZeroGasCap() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + suite.App.EvmKeeper.SetQueryMaxGasLimitForTest(50_000_000) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + // GasCap=0 triggers "gasCap = k.queryMaxGasLimit" branch. + resp, err := suite.simulateRequest(opts, baseHeader, 0) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulateV1_GasCapEnforced_ClampedGasCap exercises the path where gasCap > queryMaxGasLimit +// so it gets clamped to queryMaxGasLimit. +func (suite *GRPCServerTestSuiteSuite) TestSimulateV1_GasCapEnforced_ClampedGasCap() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + suite.App.EvmKeeper.SetQueryMaxGasLimitForTest(1_000_000) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{{}}, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + // GasCap=25_000_000 > queryMaxGasLimit=1_000_000 → clamped. + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_BlockHash_BaseNum exercises the base-block hash lookup path in getHashFn +// by executing a contract that calls BLOCKHASH(baseNum). +func (suite *GRPCServerTestSuiteSuite) TestSimulator_BlockHash_BaseNum() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + target := tests.GenerateAddress() + + // Contract: PUSH1 baseNum, BLOCKHASH, STOP + // baseNum = suite.Ctx.BlockHeight() = 1 in the default test setup. + baseNum := byte(suite.Ctx.BlockHeight()) + blockhashCode := hexutil.Bytes{0x60, baseNum, 0x40, 0x00} + stateOverride := rpctypes.SimStateOverride{ + target: rpctypes.SimOverrideAccount{Code: &blockhashCode}, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": target.Hex(), + "gas": hexutil.EncodeUint64(100_000), + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride, Calls: []json.RawMessage{callJSON}}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_BlockHash_Fallback exercises the keeper-fallback path in getHashFn +// by querying a block number that is neither a simulated header nor the base block. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_BlockHash_Fallback() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + target := tests.GenerateAddress() + + // PUSH1 0, BLOCKHASH, STOP — queries block 0 which is before the base block (1). + blockhashCode := hexutil.Bytes{0x60, 0x00, 0x40, 0x00} + stateOverride := rpctypes.SimStateOverride{ + target: rpctypes.SimOverrideAccount{Code: &blockhashCode}, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": target.Hex(), + "gas": hexutil.EncodeUint64(100_000), + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {StateOverrides: &stateOverride, Calls: []json.RawMessage{callJSON}}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_BlockHash_PrevHeaders exercises the prevHeaders match path in getHashFn. +// Block 2 queries BLOCKHASH of the first simulated block (number = baseNum+1). +func (suite *GRPCServerTestSuiteSuite) TestSimulator_BlockHash_PrevHeaders() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + target := tests.GenerateAddress() + + // The first simulated block gets number = baseNum+1. + // suite.Ctx.BlockHeight() == 1 → first simulated block is at number 2. + firstSimBlockNum := byte(suite.Ctx.BlockHeight() + 1) + // Contract: PUSH1 firstSimBlockNum, BLOCKHASH, STOP + blockhashCode := hexutil.Bytes{0x60, firstSimBlockNum, 0x40, 0x00} + stateOverride := rpctypes.SimStateOverride{ + target: rpctypes.SimOverrideAccount{Code: &blockhashCode}, + } + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": target.Hex(), + "gas": hexutil.EncodeUint64(100_000), + "value": hexutil.EncodeBig(big.NewInt(0)), + }) + suite.Require().NoError(err) + + // First block (number 2): empty — just to populate prevHeaders. + // Second block (number 3): has the BLOCKHASH contract call. + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {}, + {StateOverrides: &stateOverride, Calls: []json.RawMessage{callJSON}}, + }, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) +} + +// TestSimulator_SanitizeChain_BlockSpanTooLarge exercises the "too many blocks" error +// in sanitizeChain when a single block's number is too far from the base. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_SanitizeChain_BlockSpanTooLarge() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + baseHeader := suite.ctxBaseHeader(25_000_000) + // A block number more than MaxSimulateBlocks ahead of base triggers the span check. + farNum := (*hexutil.Big)(new(big.Int).Add(baseHeader.Number, big.NewInt(rpctypes.MaxSimulateBlocks+1))) + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {BlockOverrides: &rpctypes.SimBlockOverrides{Number: farNum}}, + }, + } + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotZero(resp.ErrorCode) + suite.Require().Contains(resp.ErrorMessage, "too many blocks") +} + +// TestSimulator_ValidationMode_GasCharged verifies that in validation mode the +// sender's balance is reduced by gasUsed*gasPrice after each applyCall, so that +// a second call from the same sender with insufficient remaining balance fails +// with ErrInsufficientFunds instead of passing a stale (unreduced) balance check. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_ValidationMode_GasCharged() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + from := suite.Address + to := tests.GenerateAddress() + + // A simple ETH transfer costs exactly 21000 gas. + // Set gasPrice = 1 wei (using legacy gasPrice field), baseFee = 0. + // Fund the sender with only 21001 wei so the first call (21000 gas * 1 = 21000) + // succeeds but the second call's upfront balance check (21000 * 1 = 21000 > 1) + // fails — proving the balance was actually deducted after the first call. + initialBalance := uint256.NewInt(21001) + suite.Require().NoError( + suite.App.EvmKeeper.SetBalance(suite.Ctx, from, *initialBalance, types.DefaultEVMDenom), + ) + + nonce := suite.App.EvmKeeper.GetNonce(suite.Ctx, from) + + makeCall := func(n uint64) json.RawMessage { + raw, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "maxFeePerGas": hexutil.EncodeBig(big.NewInt(1)), + "maxPriorityFeePerGas": hexutil.EncodeBig(big.NewInt(1)), + "value": hexutil.EncodeBig(big.NewInt(0)), + "nonce": hexutil.EncodeUint64(n), + }) + suite.Require().NoError(err) + return raw + } + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{makeCall(nonce), makeCall(nonce + 1)}}, + }, + Validation: true, + } + baseHeader := suite.ctxBaseHeader(25_000_000) + baseHeader.BaseFee = big.NewInt(0) // baseFee = 0 so effective gasPrice = min(1, 0+1) = 1 + + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + + // The simulation returns an error response because the second call cannot + // pay its gas (only 1 wei left after the first call deducted 21000 wei). + suite.Require().NotZero(resp.ErrorCode, "expected second call to fail with insufficient funds") + suite.Require().Contains(resp.ErrorMessage, "insufficient funds") +} + +// TestSimulator_SimulationMode_BalanceNotCharged verifies that in non-validation +// (simulation) mode the sender's balance is NOT charged for gas when the default +// zero gas price is used. A sender with zero balance must still be able to execute +// a call because both the balance check and the gas deduction are skipped. +func (suite *GRPCServerTestSuiteSuite) TestSimulator_SimulationMode_BalanceNotCharged() { + suite.SetupTest() + suite.App.EvmKeeper.BeginBlock(suite.Ctx) + + // Use a fresh address with zero balance — no funds needed in simulation mode. + from := tests.GenerateAddress() + to := tests.GenerateAddress() + + // Register the account so GetNonce works. + suite.App.AccountKeeper.SetAccount(suite.Ctx, + suite.App.AccountKeeper.NewAccountWithAddress(suite.Ctx, sdk.AccAddress(from.Bytes())), + ) + + callJSON, err := json.Marshal(map[string]interface{}{ + "from": from.Hex(), + "to": to.Hex(), + "gas": hexutil.EncodeUint64(21000), + "value": hexutil.EncodeBig(big.NewInt(0)), + // No gasPrice / maxFeePerGas: defaults to 0 in simulation mode. + }) + suite.Require().NoError(err) + + opts := rpctypes.SimOpts{ + BlockStateCalls: []rpctypes.SimBlock{ + {Calls: []json.RawMessage{callJSON}}, + }, + Validation: false, // simulation mode + } + baseHeader := suite.ctxBaseHeader(25_000_000) + resp, err := suite.simulateRequest(opts, baseHeader, 25_000_000) + suite.Require().NoError(err) + suite.Require().NotEmpty(resp.Result) + + // Must be a valid block result, not an error envelope. + var blocks []json.RawMessage + suite.Require().NoError(json.Unmarshal(resp.Result, &blocks), "expected block array result") + suite.Require().Len(blocks, 1) + + // The call must succeed (status 0x1). + var results []map[string]json.RawMessage + suite.Require().NoError(json.Unmarshal(resp.Result, &results)) + var calls []map[string]json.RawMessage + suite.Require().NoError(json.Unmarshal(results[0]["calls"], &calls)) + suite.Require().Len(calls, 1) + suite.Require().Equal(`"0x1"`, string(calls[0]["status"])) +} + +func (suite *GRPCServerTestSuiteSuite) TestCreateAccessList() { + address := tests.GenerateAddress() + supply := sdkmath.NewIntWithDecimal(1000, 18).BigInt() + + ctorArgs, err := types.ERC20Contract.ABI.Pack("", address, supply) + suite.Require().NoError(err) + data := append(types.ERC20Contract.Bin, ctorArgs...) + + testCases := []struct { + name string + req *types.EthCallRequest + expPass bool + expError string + }{ + { + "nil request", + nil, + false, + "", + }, + { + "invalid args", + &types.EthCallRequest{Args: []byte("invalid"), GasCap: uint64(config.DefaultGasCap)}, + false, + "", + }, + { + "pass - contract deployment with GasUsed populated", + &types.EthCallRequest{ + Args: func() []byte { + gas := hexutil.Uint64(config.DefaultGasCap) + args, _ := json.Marshal(&types.TransactionArgs{ + From: &address, + Data: (*hexutil.Bytes)(&data), + Gas: &gas, + }) + return args + }(), + GasCap: uint64(config.DefaultGasCap), + }, + true, + "", + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + res, err := suite.App.EvmKeeper.CreateAccessList(suite.Ctx, tc.req) + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + var result types.AccessListResult + suite.Require().NoError(json.Unmarshal(res.Data, &result)) + suite.Require().NotZero(uint64(result.GasUsed)) + suite.Require().Equal(tc.expError, result.Error) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *GRPCServerTestSuiteSuite) TestCreateAccessList_VmError() { + contractAddr := suite.deployTestContract(suite.Address) + suite.Commit(suite.T()) + + // Call transfer from an address that holds no tokens — triggers ERC20 revert. + caller := tests.GenerateAddress() + recipient := tests.GenerateAddress() + transferData, err := types.ERC20Contract.ABI.Pack("transfer", recipient, big.NewInt(1)) + suite.Require().NoError(err) + + gas := hexutil.Uint64(config.DefaultGasCap) + args, err := json.Marshal(&types.TransactionArgs{ + From: &caller, + To: &contractAddr, + Data: (*hexutil.Bytes)(&transferData), + Gas: &gas, + }) + suite.Require().NoError(err) + + res, err := suite.App.EvmKeeper.CreateAccessList(suite.Ctx, &types.EthCallRequest{ + Args: args, + GasCap: uint64(config.DefaultGasCap), + }) + suite.Require().NoError(err) + suite.Require().NotNil(res) + + var result types.AccessListResult + suite.Require().NoError(json.Unmarshal(res.Data, &result)) + suite.Require().NotEmpty(result.Error) + suite.Require().NotZero(uint64(result.GasUsed)) + suite.Require().NotEmpty(result.AccessList) +} diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index baac6ce588..178522490f 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "bytes" "math/big" "testing" @@ -13,7 +14,7 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/testutil" @@ -119,6 +120,45 @@ var _ = Describe("Evm", func() { ) }) }) + + // EIP-7623: Prague calldata floor gas must be enforced in both CheckTx and DeliverTx. + // + // For 1024 non-zero calldata bytes: + // intrinsicGas = 21000 + 16 * 1024 = 37384 + // floorDataGas = 21000 + 10 * 4 * 1024 = 61960 + // + // A transaction with gasLimit = intrinsicGas is below the floor and must be rejected + // in both CheckTx (mempool admission) and DeliverTx (block execution). + Context("EIP-7623 Prague calldata floor gas", func() { + const ( + intrinsicGas = uint64(21000 + 16*1024) // 37384 + floorDataGas = uint64(21000 + 10*4*1024) // 61960 + ) + + BeforeEach(func() { + setupTest(sdkmath.LegacyZeroDec(), big.NewInt(0)) + }) + + It("CheckTx rejects gasLimit below floor", func() { + txBz := prepareFloorDataGasTx(intrinsicGas) + res := s.CheckTx(txBz) + Expect(res.IsOK()).To(BeFalse(), "CheckTx must reject below-floor Prague tx, got log: %s", res.GetLog()) + }) + + It("DeliverTx rejects gasLimit below floor (fix validates block execution path)", func() { + txBz := prepareFloorDataGasTx(intrinsicGas) + res := s.DeliverTx(txBz) + Expect(res.IsOK()).To(BeFalse(), + "DeliverTx must also reject below-floor Prague tx, got log: %s", res.GetLog()) + }) + + It("DeliverTx accepts gasLimit at floor", func() { + txBz := prepareFloorDataGasTx(floorDataGas) + res := s.DeliverTx(txBz) + Expect(res.IsOK()).To(BeTrue(), + "DeliverTx must accept gasLimit == floorDataGas, got log: %s", res.GetLog()) + }) + }) }) }) @@ -130,7 +170,7 @@ func setupTest(minGasPrice sdkmath.LegacyDec, baseFee *big.Int) { t := s.T() s.SetupTestWithCbAndOpts( t, - func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { feemarketGenesis := feemarkettypes.DefaultGenesisState() feemarketGenesis.Params.NoBaseFee = true genesis[feemarkettypes.ModuleName] = app.AppCodec().MustMarshalJSON(feemarketGenesis) @@ -158,3 +198,16 @@ func prepareEthTx(p txParams) []byte { msg := s.BuildEthTx(&to, p.gasLimit, p.gasPrice, p.gasFeeCap, p.gasTipCap, p.accesses, s.PrivKey) return s.PrepareEthTx(msg, s.PrivKey) } + +// prepareFloorDataGasTx builds a legacy tx with 1024 non-zero calldata bytes and the +// given gasLimit, signed with the test account. It does NOT use BuildEthTx because that +// helper does not accept calldata. +func prepareFloorDataGasTx(gasLimit uint64) []byte { + calldata := bytes.Repeat([]byte{0xff}, 1024) + chainID := s.App.EvmKeeper.ChainID() + nonce := s.App.EvmKeeper.GetNonce(s.Ctx, s.Address) + to := tests.GenerateAddress() + msg := evmtypes.NewTx(chainID, nonce, &to, nil, gasLimit, big.NewInt(0), nil, nil, calldata, nil) + msg.From = s.Address.Bytes() + return s.PrepareEthTx(msg, s.PrivKey) +} diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 56acb834f5..5ce8ba857b 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -16,26 +16,35 @@ package keeper import ( + "encoding/binary" "math/big" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rs/zerolog" + errorsmod "cosmossdk.io/errors" - "cosmossdk.io/log" - storetypes "cosmossdk.io/store/types" + "cosmossdk.io/log/v2" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/params" + ethparams "github.com/ethereum/go-ethereum/params" ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" ) // CustomContractFn defines a custom precompiled contract generator with ctx, rules and returns a precompiled contract. -type CustomContractFn func(sdk.Context, params.Rules) vm.PrecompiledContract +type CustomContractFn func(sdk.Context, ethparams.Rules) vm.PrecompiledContract + +// GasNoLimit is the value for keeper.queryMaxGasLimit in case there is no limit +const GasNoLimit = 0 // Keeper grants access to the EVM module state and implements the go-ethereum StateDB interface. type Keeper struct { @@ -73,6 +82,9 @@ type Keeper struct { // Legacy subspace ss paramstypes.Subspace customContractFns []CustomContractFn + + // queryMaxGasLimit max amount of gas allowed during a single tx execution, 0 means no limit + queryMaxGasLimit uint64 } // NewKeeper generates new evm module keeper @@ -87,6 +99,7 @@ func NewKeeper( tracer string, ss paramstypes.Subspace, customContractFns []CustomContractFn, + queryMaxGasLimit uint64, ) *Keeper { // ensure evm module account is set if addr := ak.GetModuleAddress(types.ModuleName); addr == nil { @@ -111,6 +124,7 @@ func NewKeeper( tracer: tracer, ss: ss, customContractFns: customContractFns, + queryMaxGasLimit: queryMaxGasLimit, } } @@ -120,9 +134,31 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { return sdkCtx.Logger().With("module", "x/"+types.ModuleName) } -// WithChainID sets the chain id to the local variable in the keeper +// debugLogger returns a module logger only when debug level is enabled. +// Returns nil if debug logging is disabled, avoiding allocations in the common case. +func (k Keeper) debugLogger(ctx sdk.Context) log.Logger { + baseLogger := sdk.UnwrapSDKContext(ctx).Logger() + if zl, ok := baseLogger.Impl().(*zerolog.Logger); ok && zl.GetLevel() > zerolog.DebugLevel { + return nil + } + return baseLogger.With("module", "x/"+types.ModuleName) +} + +// debugLog logs only when debug level is enabled. +func (k Keeper) debugLog(ctx sdk.Context, msg string, keyVals ...interface{}) { + if dl := k.debugLogger(ctx); dl != nil { + dl.Debug(msg, keyVals...) + } +} + +// WithChainID sets the chain ID for the keeper by extracting it from the provided context func (k *Keeper) WithChainID(ctx sdk.Context) { - chainID, err := ethermint.ParseChainID(ctx.ChainID()) + k.WithChainIDString(ctx.ChainID()) +} + +// WithChainIDString sets the chain ID for the keeper after parsing the provided string value +func (k *Keeper) WithChainIDString(value string) { + chainID, err := ethermint.ParseChainID(value) if err != nil { panic(err) } @@ -199,8 +235,8 @@ func (k *Keeper) PostTxProcessing(ctx sdk.Context, msg *core.Message, receipt *e } // Tracer return a default vm.Tracer based on current keeper state -func (k Keeper) Tracer(msg *core.Message, rules params.Rules) vm.EVMLogger { - return types.NewTracer(k.tracer, msg, rules) +func (k Keeper) Tracer(ctx sdk.Context, msg core.Message, ethCfg *ethparams.ChainConfig) *tracing.Hooks { + return types.NewTracer(k.tracer, msg, ethCfg, ctx.BlockHeight(), uint64(ctx.BlockTime().Unix())) //#nosec G115 -- int overflow is not a concern here } // GetAccount load nonce and codehash without balance, @@ -211,17 +247,7 @@ func (k *Keeper) GetAccount(ctx sdk.Context, addr common.Address) *statedb.Accou if acct == nil { return nil } - - codeHash := types.EmptyCodeHash - ethAcct, ok := acct.(ethermint.EthAccountI) - if ok { - codeHash = ethAcct.GetCodeHash().Bytes() - } - - return &statedb.Account{ - Nonce: acct.GetSequence(), - CodeHash: codeHash, - } + return statedb.NewAccountFromSdkAccount(acct) } // GetAccountOrEmpty returns empty account if not exist, returns error if it's not `EthAccount` @@ -257,19 +283,21 @@ func (k *Keeper) GetEVMDenomBalance(ctx sdk.Context, addr common.Address) *big.I if evmDenom == "" { return big.NewInt(-1) } - return k.GetBalance(ctx, cosmosAddr, evmDenom) + balance := k.GetBalance(ctx, cosmosAddr, evmDenom) + return balance.ToBig() } // GetBalance load account's balance of specified denom -func (k *Keeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) *big.Int { - return k.bankKeeper.GetBalance(ctx, addr, denom).Amount.BigInt() +func (k *Keeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) uint256.Int { + balance := k.bankKeeper.GetBalance(ctx, addr, denom).Amount.BigInt() + return *uint256.MustFromBig(balance) } // GetBaseFee returns current base fee, return values: // - `nil`: london hardfork not enabled. // - `0`: london hardfork enabled but feemarket is not enabled. // - `n`: both london hardfork and feemarket are enabled. -func (k Keeper) GetBaseFee(ctx sdk.Context, ethCfg *params.ChainConfig) *big.Int { +func (k Keeper) GetBaseFee(ctx sdk.Context, ethCfg *ethparams.ChainConfig) *big.Int { return k.getBaseFee(ctx, types.IsLondon(ethCfg, ctx.BlockHeight())) } @@ -310,3 +338,141 @@ func (k Keeper) AddTransientGasUsed(ctx sdk.Context, gasUsed uint64) (uint64, er k.SetTransientGasUsed(ctx, result) return result, nil } + +// SetHeaderHash stores the hash of the current block header in the store. +func (k Keeper) SetHeaderHash(ctx sdk.Context) { + acct := k.GetAccount(ctx, ethparams.HistoryStorageAddress) + if acct != nil && acct.IsContract() { + window := types.DefaultHistoryServeWindow + params := k.GetParams(ctx) + if params.HistoryServeWindow > 0 { + window = params.HistoryServeWindow + } + // set current block hash in the contract storage, compatible with EIP-2935 + ringIndex := uint64(ctx.BlockHeight()) % window //nolint:gosec // G115 // won't exceed uint64 + var key common.Hash + binary.BigEndian.PutUint64(key[24:], ringIndex) + k.SetState(ctx, ethparams.HistoryStorageAddress, key, ctx.HeaderHash()) + } else { + // fallback old implementation + store := ctx.KVStore(k.storeKey) + height, err := ethermint.SafeUint64(ctx.BlockHeight()) + if err != nil { + panic(err) + } + store.Set(types.GetHeaderHashKey(height), ctx.HeaderHash()) + } +} + +// GetHeaderHash sets block hash into EIP-2935 compatible storage contract. +func (k Keeper) GetHeaderHash(ctx sdk.Context, height uint64) common.Hash { + // check if history contract has been deployed + acct := k.GetAccount(ctx, ethparams.HistoryStorageAddress) + if acct != nil && acct.IsContract() { + window := types.DefaultHistoryServeWindow + params := k.GetParams(ctx) + if params.HistoryServeWindow > 0 { + window = params.HistoryServeWindow + } + + ringIndex := height % window + var key common.Hash + binary.BigEndian.PutUint64(key[24:], ringIndex) + hash := k.GetState(ctx, ethparams.HistoryStorageAddress, key) + + if hash.Cmp(common.Hash{}) != 0 { + return hash + } + } + // fall back to old behavior for retro compatibility + // TODO can be removed along with DeleteHeaderHash once HistoryStorage has been filled up in next protocol upgrade + store := ctx.KVStore(k.storeKey) + hashByte := store.Get(types.GetHeaderHashKey(height)) + if len(hashByte) > 0 { + return common.BytesToHash(hashByte) + } + return common.Hash{} +} + +// DeleteHeaderHash removes the hash of a block header from the store by height +func (k Keeper) DeleteHeaderHash(ctx sdk.Context, height uint64) { + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetHeaderHashKey(height)) +} + +func (k *Keeper) AddPreinstalls(ctx sdk.Context, preinstalls []types.Preinstall) error { + for _, preinstall := range preinstalls { + address := common.HexToAddress(preinstall.Address) + accAddress := sdk.AccAddress(address.Bytes()) + + if len(preinstall.Code) == 0 { + return errorsmod.Wrapf(types.ErrInvalidPreinstall, + "preinstall %s, address %s has no code", preinstall.Name, preinstall.Address) + } + + // check that the address does not conflict with the precompiles + cfg, err := k.EVMBlockConfig(ctx, k.ChainID()) + if err != nil { + return err + } + for _, fn := range k.customContractFns { + c := fn(ctx, cfg.Rules) + if address == c.Address() { + return errorsmod.Wrapf(types.ErrInvalidPreinstall, + "preinstall %s, address %s already exists as a precompile", preinstall.Name, preinstall.Address) + } + } + + codeHash := crypto.Keccak256Hash(common.FromHex(preinstall.Code)) + codeHashBytes := codeHash.Bytes() + if types.IsEmptyCodeHash(codeHashBytes) { + k.Logger(ctx).Error("preinstall has empty code hash", + "preinstall address", preinstall.Address) + return errorsmod.Wrapf(types.ErrInvalidPreinstall, + "preinstall %s, address %s has empty code hash", preinstall.Name, preinstall.Address) + } + + acct := k.accountKeeper.GetAccount(ctx, accAddress) + if acct == nil { + // create account with the account keeper + acct = k.accountKeeper.NewAccountWithAddress(ctx, accAddress) + } + + if ethAcct, ok := acct.(ethermint.EthAccountI); ok { + // check that code hash and nonce is empty + if !types.IsEmptyCodeHash(ethAcct.GetCodeHash().Bytes()) { + return errorsmod.Wrapf(types.ErrInvalidPreinstall, + "preinstall %s, address %s already has a codehash", preinstall.Name, preinstall.Address) + } + if ethAcct.GetSequence() != 0 { + return errorsmod.Wrapf(types.ErrInvalidPreinstall, + "preinstall %s, address %s already has a sequence", preinstall.Name, preinstall.Address) + } + + // set code hash + if err := ethAcct.SetCodeHash(codeHash); err != nil { + return err + } + k.accountKeeper.SetAccount(ctx, acct) + k.SetCode(ctx, codeHashBytes, common.FromHex(preinstall.Code)) + } else { + return errorsmod.Wrapf(types.ErrInvalidAccount, + "account %s is not an EthAccount", accAddress.String()) + } + + // We are not setting any storage for preinstalls, so we skip that step. + } + return nil +} + +// GetCodeHash loads the code hash from the database for the given contract address. +func (k *Keeper) GetCodeHash(acct sdk.AccountI) common.Hash { + if ethAcct, ok := acct.(ethermint.EthAccountI); ok { + hash := ethAcct.GetCodeHash() + if len(hash.Bytes()) == 0 { + return common.BytesToHash(types.EmptyCodeHash) + } + return hash + } + return common.BytesToHash(types.EmptyCodeHash) +} diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index ff1fbeb958..c9ceace02a 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -4,6 +4,7 @@ import ( _ "embed" "math" "math/big" + "strings" "testing" sdkmath "cosmossdk.io/math" @@ -14,8 +15,8 @@ import ( "github.com/evmos/ethermint/testutil" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" + "github.com/evmos/ethermint/evmd" ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" @@ -43,7 +44,7 @@ func TestKeeperTestSuite(t *testing.T) { } func (suite *KeeperTestSuite) SetupTest() { - suite.EVMTestSuiteWithAccountAndQueryClient.SetupTestWithCb(suite.T(), func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.EVMTestSuiteWithAccountAndQueryClient.SetupTestWithCb(suite.T(), func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { feemarketGenesis := feemarkettypes.DefaultGenesisState() if suite.enableFeemarket { feemarketGenesis.Params.EnableHeight = 1 @@ -60,6 +61,9 @@ func (suite *KeeperTestSuite) SetupTest() { evmGenesis.Params.ChainConfig.GrayGlacierBlock = &maxInt evmGenesis.Params.ChainConfig.MergeNetsplitBlock = &maxInt evmGenesis.Params.ChainConfig.ShanghaiTime = &maxInt + evmGenesis.Params.ChainConfig.CancunTime = &maxInt + evmGenesis.Params.ChainConfig.PragueTime = &maxInt + evmGenesis.Params.ChainConfig.OsakaTime = &maxInt genesis[types.ModuleName] = app.AppCodec().MustMarshalJSON(evmGenesis) } return genesis @@ -102,29 +106,34 @@ func (suite *KeeperTestSuite) TestBaseFee() { func (suite *KeeperTestSuite) TestGetAccountStorage() { testCases := []struct { name string - malleate func() - expRes []int + malleate func() common.Address }{ { "Only one account that's not a contract (no storage)", - func() {}, - []int{0}, + nil, }, { "Two accounts - one contract (with storage), one wallet", - func() { + func() common.Address { supply := big.NewInt(100) - suite.DeployTestContract(suite.T(), suite.Address, supply, suite.enableFeemarket) + contractAddr := suite.DeployTestContract(suite.T(), suite.Address, supply, suite.enableFeemarket) + return contractAddr }, - []int{2, 0}, }, } for _, tc := range testCases { suite.Run(tc.name, func() { suite.SetupTest() - tc.malleate() - i := 0 + var contractAddr common.Address + if tc.malleate != nil { + contractAddr = tc.malleate() + } + + var results []struct { + addr common.Address + storage types.Storage + } suite.App.AccountKeeper.IterateAccounts(suite.Ctx, func(account sdk.AccountI) bool { ethAccount, ok := account.(ethermint.EthAccountI) if !ok { @@ -134,11 +143,39 @@ func (suite *KeeperTestSuite) TestGetAccountStorage() { addr := ethAccount.EthAddress() storage := suite.App.EvmKeeper.GetAccountStorage(suite.Ctx, addr) - - suite.Require().Equal(tc.expRes[i], len(storage)) - i++ + results = append(results, struct { + addr common.Address + storage types.Storage + }{addr, storage}) return false }) + + isPreinstall := func(addr common.Address) bool { + for _, p := range types.DefaultPreinstalls { + if strings.EqualFold(addr.Hex(), p.Address) { + return true + } + } + return false + } + + for _, r := range results { + if isPreinstall(r.addr) { + // skip preinstall + continue + } + if r.addr == contractAddr { + suite.Require().NotEqual(0, len(r.storage), + "expected account address %s to have non-zero amount of storage slots, got %d", + r.addr.Hex(), len(r.storage), + ) + } else { + suite.Require().Len(r.storage, 0, + "expected account address %s to have %d storage slots, got %d", + r.addr.Hex(), 0, len(r.storage), + ) + } + } }) } } diff --git a/x/evm/keeper/migrations.go b/x/evm/keeper/migrations.go index 3cebbc1465..feb7f6ff1f 100644 --- a/x/evm/keeper/migrations.go +++ b/x/evm/keeper/migrations.go @@ -20,6 +20,8 @@ import ( v4 "github.com/evmos/ethermint/x/evm/migrations/v4" v5 "github.com/evmos/ethermint/x/evm/migrations/v5" v6 "github.com/evmos/ethermint/x/evm/migrations/v6" + v7 "github.com/evmos/ethermint/x/evm/migrations/v7" + v8 "github.com/evmos/ethermint/x/evm/migrations/v8" "github.com/evmos/ethermint/x/evm/types" ) @@ -51,3 +53,13 @@ func (m Migrator) Migrate4to5(ctx sdk.Context) error { func (m Migrator) Migrate5to6(ctx sdk.Context) error { return v6.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) } + +// Migrate6to7 migrates the store from consensus version 6 to 7 +func (m Migrator) Migrate6to7(ctx sdk.Context) error { + return v7.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) +} + +// Migrate7to8 migrates the store from consensus version 7 to 8. +func (m Migrator) Migrate7to8(ctx sdk.Context) error { + return v8.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) +} diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index cb23aad6fc..6d31913ee6 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -31,6 +31,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/hashicorp/go-metrics" + ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/types" ) @@ -46,39 +47,46 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t tx := msg.AsTransaction() labels := []metrics.Label{ - telemetry.NewLabel("tx_type", fmt.Sprintf("%d", tx.Type())), + telemetry.NewLabel("tx_type", fmt.Sprintf("%d", tx.Type())), //nolint:staticcheck } if tx.To() == nil { - labels = append(labels, telemetry.NewLabel("execution", "create")) + labels = append(labels, telemetry.NewLabel("execution", "create")) //nolint:staticcheck } else { - labels = append(labels, telemetry.NewLabel("execution", "call")) + labels = append(labels, telemetry.NewLabel("execution", "call")) //nolint:staticcheck } - response, err := k.ApplyTransaction(ctx, msg) + evmResult, err := k.ApplyTransaction(ctx, msg) if err != nil { return nil, errorsmod.Wrap(err, "failed to apply transaction") } defer func() { - telemetry.IncrCounterWithLabels( + telemetry.IncrCounterWithLabels( //nolint:staticcheck []string{"tx", "msg", "ethereum_tx", "total"}, 1, labels, ) - if response.GasUsed != 0 { - telemetry.IncrCounterWithLabels( + if evmResult.GasUsed != 0 { + telemetry.IncrCounterWithLabels( //nolint:staticcheck []string{"tx", "msg", "ethereum_tx", "gas_used", "total"}, - float32(response.GasUsed), + float32(evmResult.GasUsed), labels, ) // Observe which users define a gas limit >> gas used. Note, that // gas_limit and gas_used are always > 0 - gasLimit := sdkmath.LegacyNewDec(int64(tx.Gas())) - gasRatio, err := gasLimit.QuoInt64(int64(response.GasUsed)).Float64() + gasLimit, err := ethermint.SafeInt64(tx.Gas()) + if err != nil { + k.Logger(ctx).Error("failed to cast gas to int64", "error", err) + } + gasUsed, err := ethermint.SafeInt64(evmResult.GasUsed) + if err != nil { + k.Logger(ctx).Error("failed to cast gasUsed to int64", "error", err) + } + gasRatio, err := sdkmath.LegacyNewDec(gasLimit).QuoInt64(gasUsed).Float64() if err == nil { - telemetry.SetGaugeWithLabels( + telemetry.SetGaugeWithLabels( //nolint:staticcheck []string{"tx", "msg", "ethereum_tx", "gas_limit", "per", "gas_used"}, float32(gasRatio), labels, @@ -90,9 +98,9 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t attrs := []sdk.Attribute{ sdk.NewAttribute(sdk.AttributeKeyAmount, tx.Value().String()), // add event for ethereum transaction hash format - sdk.NewAttribute(types.AttributeKeyEthereumTxHash, response.Hash), + sdk.NewAttribute(types.AttributeKeyEthereumTxHash, evmResult.Hash), // add event for eth tx gas used, we can't get it from cosmos tx result when it contains multiple eth tx msgs. - sdk.NewAttribute(types.AttributeKeyTxGasUsed, strconv.FormatUint(response.GasUsed, 10)), + sdk.NewAttribute(types.AttributeKeyTxGasUsed, strconv.FormatUint(evmResult.GasUsed, 10)), } if len(ctx.TxBytes()) > 0 { @@ -105,8 +113,8 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyRecipient, types.HexAddress(to.Bytes()))) } - if response.Failed() { - attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyEthereumTxFailed, response.VmError)) + if evmResult.Failed() { + attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyEthereumTxFailed, evmResult.VmError)) } // emit events @@ -123,7 +131,9 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t ), }) - return response, nil + msgResponse := evmResult.ToMsgResponse() + + return msgResponse, nil } // UpdateParams implements the gRPC MsgServer interface. When an UpdateParams @@ -142,3 +152,22 @@ func (k *Keeper) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) return &types.MsgUpdateParamsResponse{}, nil } + +// RegisterPreinstalls implements the gRPC MsgServer interface. When a RegisterPreinstalls +// proposal passes, it creates the preinstalls. The registration can only be +// performed if the requested authority is the Cosmos SDK governance module +// account. +func (k *Keeper) RegisterPreinstalls(goCtx context.Context, req *types.MsgRegisterPreinstalls) (*types. + MsgRegisterPreinstallsResponse, error, +) { + if k.authority.String() != req.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "invalid authority, expected %s, got %s", k.authority.String(), req.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := k.AddPreinstalls(ctx, req.Preinstalls); err != nil { + return nil, err + } + + return &types.MsgRegisterPreinstallsResponse{}, nil +} diff --git a/x/evm/keeper/set_code_authorizations.go b/x/evm/keeper/set_code_authorizations.go new file mode 100644 index 0000000000..a5bcc52e43 --- /dev/null +++ b/x/evm/keeper/set_code_authorizations.go @@ -0,0 +1,85 @@ +package keeper + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" +) + +// validateAuthorization validates an EIP-7702 authorization against the state. +func (k *Keeper) validateAuthorization(auth *types.SetCodeAuthorization, stateDB vm.StateDB) (authority common.Address, err error) { + // Verify chain ID is null or equal to current chain ID. + if !auth.ChainID.IsZero() && auth.ChainID.CmpBig(k.eip155ChainID) != 0 { + return authority, core.ErrAuthorizationWrongChainID + } + // Limit nonce to 2^64-1 per EIP-2681. + if auth.Nonce+1 < auth.Nonce { + return authority, core.ErrAuthorizationNonceOverflow + } + // Validate signature values and recover authority. + authority, err = auth.Authority() + if err != nil { + return authority, fmt.Errorf("%w: %v", core.ErrAuthorizationInvalidSignature, err) + } + // Check the authority account + // 1) doesn't have code or has exisiting delegation + // 2) matches the auth's nonce + // + // Note it is added to the access list even if the authorization is invalid. + stateDB.AddAddressToAccessList(authority) + code := stateDB.GetCode(authority) + if _, ok := types.ParseDelegation(code); len(code) != 0 && !ok { + return authority, core.ErrAuthorizationDestinationHasCode + } + if have := stateDB.GetNonce(authority); have != auth.Nonce { + return authority, core.ErrAuthorizationNonceMismatch + } + return authority, nil +} + +// applyAuthorization validates and applies an EIP-7702 code delegation to the +// state, returning the recovered authority so callers can reuse it without a +// second (expensive) signature recovery. +func (k *Keeper) applyAuthorization(auth *types.SetCodeAuthorization, stateDB vm.StateDB) (common.Address, error) { + authority, err := k.validateAuthorization(auth, stateDB) + if err != nil { + return authority, err + } + + // If the account already exists in state, refund the new account cost + // charged in the intrinsic calculation. + if stateDB.Exist(authority) { + stateDB.AddRefund(params.CallNewAccountGas - params.TxAuthTupleGas) + } + + k.setAuthorizationDelegation(auth, authority, stateDB) + return authority, nil +} + +// applyDurableAuthorization replays the delegation effects of an +// already-validated authorization onto the durable stateDB. The authority was +// recovered by applyAuthorization, so we skip re-validation (no ecrecover) and +// the refund (which only matters for the EVM gas accounting on the main path). +func (k *Keeper) applyDurableAuthorization(auth *types.SetCodeAuthorization, authority common.Address, stateDB vm.StateDB) { + k.setAuthorizationDelegation(auth, authority, stateDB) +} + +// setAuthorizationDelegation writes the nonce bump and delegation code for a +// validated authorization. +func (k *Keeper) setAuthorizationDelegation(auth *types.SetCodeAuthorization, authority common.Address, stateDB vm.StateDB) { + // Update nonce and account code. + stateDB.SetNonce(authority, auth.Nonce+1, tracing.NonceChangeAuthorization) + if auth.Address == (common.Address{}) { + // Delegation to zero address means clear. + stateDB.SetCode(authority, nil, tracing.CodeChangeAuthorizationClear) + return + } + + // Otherwise install delegation to auth.Address. + stateDB.SetCode(authority, types.AddressToDelegation(auth.Address), tracing.CodeChangeAuthorization) +} diff --git a/x/evm/keeper/simulate.go b/x/evm/keeper/simulate.go new file mode 100644 index 0000000000..6fffb45bff --- /dev/null +++ b/x/evm/keeper/simulate.go @@ -0,0 +1,678 @@ +package keeper + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "math/big" + "sort" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/misc/eip1559" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" + "github.com/holiman/uint256" + + rpctypes "github.com/evmos/ethermint/rpc/types" + "github.com/evmos/ethermint/x/evm/statedb" + evmtypes "github.com/evmos/ethermint/x/evm/types" +) + +// Simulator is a stateful object that simulates a series of blocks. +type Simulator struct { + keeper *Keeper + state *statedb.StateDB + base *ethtypes.Header + chainConfig *params.ChainConfig + budget *rpctypes.GasBudget + traceTransfers bool + validate bool + fullTx bool +} + +// Execute runs the simulation of a series of blocks. +func (sim *Simulator) Execute(ctx sdk.Context, blocks []rpctypes.SimBlock) ([]*rpctypes.SimBlockResult, error) { + if err := ctx.Err(); err != nil { + return nil, err + } + + var err error + blocks, err = sim.sanitizeChain(blocks) + if err != nil { + return nil, err + } + headers, err := sim.makeHeaders(blocks) + if err != nil { + return nil, err + } + var ( + results = make([]*rpctypes.SimBlockResult, len(blocks)) + parent = sim.base + ) + for bi, block := range blocks { + if err := ctx.Err(); err != nil { + return nil, err + } + result, callResults, senders, err := sim.processBlock(ctx, &block, headers[bi], parent, headers[:bi]) + if err != nil { + return nil, err + } + headers[bi] = result.Header() + results[bi] = &rpctypes.SimBlockResult{ + FullTx: sim.fullTx, + ChainConfig: sim.chainConfig, + Block: result, + Calls: callResults, + Senders: senders, + } + parent = result.Header() + } + return results, nil +} + +func (sim *Simulator) processBlock( + ctx sdk.Context, + block *rpctypes.SimBlock, + header, parent *ethtypes.Header, + headers []*ethtypes.Header, +) (*ethtypes.Block, []rpctypes.SimCallResult, map[common.Hash]common.Address, error) { + header.ParentHash = parent.Hash() + + // Set base fee + if sim.chainConfig.IsLondon(header.Number) { + if header.BaseFee == nil { + if sim.validate { + header.BaseFee = eip1559.CalcBaseFee(sim.chainConfig, parent) + } else { + header.BaseFee = big.NewInt(0) + } + } + } + if sim.chainConfig.IsCancun(header.Number, header.Time) { + var excess uint64 + if sim.chainConfig.IsCancun(parent.Number, parent.Time) { + excess = eip4844.CalcExcessBlobGas(sim.chainConfig, parent, header.Time) + } + header.ExcessBlobGas = &excess + } + + blockCtx := vm.BlockContext{ + CanTransfer: core.CanTransfer, + Transfer: statedb.Transfer, + GetHash: sim.getHashFn(ctx, headers), + Coinbase: header.Coinbase, + GasLimit: header.GasLimit, + BlockNumber: new(big.Int).Set(header.Number), + Time: header.Time, + Difficulty: header.Difficulty, + BaseFee: header.BaseFee, + } + // Post-merge: always set Random so EVM recognizes merge status. + // vm.NewEVM uses `blockCtx.Random != nil` to determine isMerge. + if header.Difficulty != nil && header.Difficulty.Sign() == 0 { + random := header.MixDigest + blockCtx.Random = &random + } + // Apply BlobBaseFee override, or derive the default from ExcessBlobGas for Cancun blocks. + if block.BlockOverrides != nil && block.BlockOverrides.BlobBaseFee != nil { + blockCtx.BlobBaseFee = block.BlockOverrides.BlobBaseFee.ToInt() + } else if sim.chainConfig.IsCancun(header.Number, header.Time) { + blockCtx.BlobBaseFee = eip4844.CalcBlobFee(sim.chainConfig, header) + } + + // Get precompiles. Use a cache context when calling custom contract fns so that + // any accidental store writes inside them do not persist (simulation must not + // mutate global keeper state). + isMerge := header.Difficulty == nil || header.Difficulty.Sign() == 0 + rules := sim.chainConfig.Rules(header.Number, isMerge, header.Time) + defaultPrecompiles := vm.DefaultPrecompiles(rules) + precompiles := make(vm.PrecompiledContracts, len(defaultPrecompiles)) + active := make([]common.Address, 0, len(defaultPrecompiles)) + for addr, c := range defaultPrecompiles { + precompiles[addr] = c + active = append(active, addr) + } + cacheCtx, _ := ctx.CacheContext() + for _, fn := range sim.keeper.customContractFns { + c := fn(cacheCtx, rules) + addr := c.Address() + precompiles[addr] = c + active = append(active, addr) + } + sort.SliceStable(active, func(i, j int) bool { + return bytes.Compare(active[i].Bytes(), active[j].Bytes()) < 0 + }) + + if err := block.StateOverrides.Apply(sim.state, precompiles); err != nil { + return nil, nil, nil, err + } + remainingBlockGas := blockCtx.GasLimit + + // Create tracer and VM config + tracer := rpctypes.NewSimTracer(sim.traceTransfers, blockCtx.BlockNumber.Uint64(), common.Hash{}, common.Hash{}, 0) + vmConfig := vm.Config{ + NoBaseFee: !sim.validate, + Tracer: tracer.Hooks(), + } + + // Create tracing statedb + tracingStateDB := vm.StateDB(sim.state) + if hooks := tracer.Hooks(); hooks != nil { + tracingStateDB = statedb.NewHookedState(sim.state, hooks) + } + + evm := vm.NewEVM(blockCtx, tracingStateDB, sim.chainConfig, vmConfig) + evm.SetPrecompiles(precompiles) + + // Process calls + callResults := make([]rpctypes.SimCallResult, len(block.Calls)) + transactions := make([]*ethtypes.Transaction, len(block.Calls)) + // senders is a map of transaction hashes to their senders. + // Transaction objects contain only the signature, and we lose track + // of the sender when translating the arguments into a transaction object. + senders := make(map[common.Hash]common.Address) + receipts := make(ethtypes.Receipts, len(block.Calls)) + cumulativeGasUsed := uint64(0) + var allLogs []*ethtypes.Log + + for i, callJSON := range block.Calls { + var call evmtypes.TransactionArgs + if err := json.Unmarshal(callJSON, &call); err != nil { + return nil, nil, nil, &rpctypes.InvalidParamsError{Message: fmt.Sprintf("invalid call args at index %d: %v", i, err)} + } + + if err := sim.sanitizeCall(&call, sim.state, header, &remainingBlockGas); err != nil { + return nil, nil, nil, err + } + + tx := call.ToEthTransaction() + txHash := tx.Hash() + transactions[i] = tx + senders[txHash] = call.GetFrom() + + tracer.Reset(txHash, uint(i)) //nolint:gosec // G115: i is a range index over block.Calls, always non-negative + + msg, err := call.ToSimMessage(header.BaseFee, !sim.validate) + if err != nil { + return nil, nil, nil, &rpctypes.InvalidParamsError{Message: err.Error()} + } + + evm.SetTxContext(core.NewEVMTxContext(msg)) + result, err := sim.applyCall(evm, msg, rules, active) + if err != nil { + txErr := rpctypes.TxValidationError(err) + return nil, nil, nil, txErr + } + gasUsed := result.GasUsed + remainingBlockGas -= gasUsed + //nolint:misspell + tracingStateDB.Finalise(true) + + // Consume gas budget + if err := sim.budget.Consume(gasUsed); err != nil { + return nil, nil, nil, err + } + + logs := tracer.Logs() + receiptLogs := filterReceiptLogs(logs) + simLogs := make([]*rpctypes.SimLog, len(logs)) + for li, l := range logs { + simLogs[li] = rpctypes.NewSimLog(l, header.Time) + } + callRes := rpctypes.SimCallResult{ + ReturnValue: hexutil.Bytes(result.Ret), + Logs: simLogs, + GasUsed: hexutil.Uint64(result.GasUsed), + MaxUsedGas: hexutil.Uint64(result.MaxUsedGas), + } + if result.VMErr != nil { + callRes.Status = hexutil.Uint64(ethtypes.ReceiptStatusFailed) + callRes.ReturnValue = nil + if errors.Is(result.VMErr, vm.ErrExecutionReverted) { + revertErr := rpctypes.NewRevertError(result.Ret) + callRes.Error = revertErr + } else { + callRes.Error = &rpctypes.CallError{Message: result.VMErr.Error(), Code: rpctypes.ErrCodeVMError} + } + } else { + callRes.Status = hexutil.Uint64(ethtypes.ReceiptStatusSuccessful) + allLogs = append(allLogs, receiptLogs...) + } + callResults[i] = callRes + + cumulativeGasUsed += gasUsed + receipt := ðtypes.Receipt{ + Type: tx.Type(), + CumulativeGasUsed: cumulativeGasUsed, + TxHash: txHash, + GasUsed: gasUsed, + Logs: receiptLogs, + Status: uint64(callRes.Status), + } + if tx.To() == nil && uint64(callRes.Status) == ethtypes.ReceiptStatusSuccessful { + receipt.ContractAddress = crypto.CreateAddress(call.GetFrom(), tx.Nonce()) + } + receipt.Bloom = ethtypes.CreateBloom(receipt) + receipts[i] = receipt + } + + // Update header gas used + header.GasUsed = cumulativeGasUsed + if sim.chainConfig.IsCancun(header.Number, header.Time) { + blobGasUsed := uint64(0) + header.BlobGasUsed = &blobGasUsed + } + + // EIP-7685 requests (Prague) + var requests [][]byte + if sim.chainConfig.IsPrague(header.Number, header.Time) { + requests = [][]byte{} + if err := core.ParseDepositLogs(&requests, allLogs, sim.chainConfig); err != nil { + return nil, nil, nil, err + } + if err := core.ProcessWithdrawalQueue(&requests, evm); err != nil { + return nil, nil, nil, err + } + if err := core.ProcessConsolidationQueue(&requests, evm); err != nil { + return nil, nil, nil, err + } + } + if requests != nil { + reqHash := ethtypes.CalcRequestsHash(requests) + header.RequestsHash = &reqHash + } + + var withdrawals ethtypes.Withdrawals + if block.BlockOverrides != nil && block.BlockOverrides.Withdrawals != nil { + withdrawals = *block.BlockOverrides.Withdrawals + } + ethBlock := ethtypes.NewBlock( + header, + ðtypes.Body{Transactions: transactions, Uncles: nil, Withdrawals: withdrawals}, + receipts, + trie.NewStackTrie(nil), + ) + *header = *ethBlock.Header() + + // Build block hash for log repair + blockHash := ethBlock.Hash() + repairLogs(callResults, blockHash) + + return ethBlock, callResults, senders, nil +} + +func filterReceiptLogs(logs []*ethtypes.Log) []*ethtypes.Log { + out := make([]*ethtypes.Log, 0, len(logs)) + for _, l := range logs { + if l.Address != rpctypes.TransferTraceAddress { + out = append(out, l) + } + } + return out +} + +// repairLogs updates the block hash in logs. +func repairLogs(calls []rpctypes.SimCallResult, hash common.Hash) { + for i := range calls { + for j := range calls[i].Logs { + calls[i].Logs[j].BlockHash = hash + } + } +} + +// applyCallResult holds the output of a single simulated call. +type applyCallResult struct { + GasUsed uint64 // net gas after refunds + MaxUsedGas uint64 // peak gas before refunds (go-ethereum ExecutionResult.MaxUsedGas) + Ret []byte + VMErr error +} + +// applyCall executes a single simulated call using the same logic as +// ApplyMessageWithConfig (intrinsic gas → Prepare → evm.Call/Create → refund) +// but operates on the shared statedb/evm instead of creating new ones. +// Returns (result, fatalError); a non-nil fatalError aborts the whole simulation. +func (sim *Simulator) applyCall( + evm *vm.EVM, + msg *core.Message, + rules params.Rules, + activePrecompiles []common.Address, +) (applyCallResult, error) { + leftoverGas := msg.GasLimit + contractCreation := msg.To == nil + sender := msg.From + + value, overflow := uint256.FromBig(msg.Value) + if overflow { + return applyCallResult{}, fmt.Errorf("%w: address %v", core.ErrInsufficientFunds, msg.From.Hex()) + } + if sim.validate { + if msg.Nonce == math.MaxUint64 { + return applyCallResult{}, fmt.Errorf("%w: address %v, nonce: %d", + core.ErrNonceMax, sender.Hex(), msg.Nonce) + } + stateNonce := sim.state.GetNonce(sender) + if msg.Nonce < stateNonce { + return applyCallResult{}, fmt.Errorf("%w: address %v, tx: %d state: %d", + core.ErrNonceTooLow, sender.Hex(), msg.Nonce, stateNonce) + } + if msg.Nonce > stateNonce { + return applyCallResult{}, fmt.Errorf("%w: address %v, tx: %d state: %d", + core.ErrNonceTooHigh, sender.Hex(), msg.Nonce, stateNonce) + } + // London fee checks + if sim.chainConfig.IsLondon(evm.Context.BlockNumber) { + if msg.GasFeeCap.Cmp(evm.Context.BaseFee) < 0 { + return applyCallResult{}, fmt.Errorf("%w: address %v, maxFeePerGas: %s, baseFee: %s", + core.ErrFeeCapTooLow, sender.Hex(), msg.GasFeeCap, evm.Context.BaseFee) + } + } + } + // Balance check: gasLimit * gasFeeCap + value. + // This mirrors geth's buyGas() which always runs regardless of validation + // mode. Without this, insufficient-funds scenarios silently proceed as + // VM-level failures instead of aborting the block. + { + balanceCheck := new(big.Int).SetUint64(msg.GasLimit) + if msg.GasFeeCap != nil { + balanceCheck.Mul(balanceCheck, msg.GasFeeCap) + } + if msg.Value != nil { + balanceCheck.Add(balanceCheck, msg.Value) + } + balance := sim.state.GetBalance(sender) + balanceU256, _ := uint256.FromBig(balanceCheck) + if balance.Cmp(balanceU256) < 0 { + return applyCallResult{}, fmt.Errorf("%w: address %v have %v want %v (supplied gas %d)", + core.ErrInsufficientFunds, sender.Hex(), balance, balanceCheck, msg.GasLimit) + } + } + + // Intrinsic gas check (same as ApplyMessageWithConfig) + intrinsicGas, err := sim.keeper.GetEthIntrinsicGas(msg, rules, contractCreation) + if err != nil { + return applyCallResult{}, err + } + if leftoverGas < intrinsicGas { + return applyCallResult{}, core.ErrIntrinsicGas + } + leftoverGas -= intrinsicGas + + // Enforce EIP-7623 floor data gas for Prague (mirrors ApplyMessageWithConfig). + if rules.IsPrague { + floorDataGas, err := core.FloorDataGas(msg.Data) + if err != nil { + return applyCallResult{}, err + } + if msg.GasLimit < floorDataGas { + return applyCallResult{}, core.ErrFloorDataGas + } + } + + // Shanghai init code size check + if rules.IsShanghai && contractCreation && len(msg.Data) > params.MaxInitCodeSize { + return applyCallResult{}, fmt.Errorf("%w: code size %v limit %v", core.ErrMaxInitCodeSizeExceeded, len(msg.Data), params.MaxInitCodeSize) + } + + // Prepare access list and transient storage + sim.state.Prepare(rules, msg.From, evm.Context.Coinbase, msg.To, activePrecompiles, msg.AccessList) + + // Set the nonce for the sender before execution so that CREATE addresses + // are computed correctly. evm.Create will internally bump it to nonce+1. + sim.state.SetNonce(msg.From, msg.Nonce, tracing.NonceChangeUnspecified) + + var ( + ret []byte + vmErr error + ) + if contractCreation { + ret, _, leftoverGas, vmErr = evm.Create(msg.From, msg.Data, leftoverGas, value) + } else { + if msg.SetCodeAuthorizations != nil { + for _, auth := range msg.SetCodeAuthorizations { + if _, err := sim.keeper.applyAuthorization(&auth, sim.state); err != nil { + sim.keeper.Logger(sim.state.Context()).Debug("simulation: failed to apply authorization", + "error", err, "authorization", auth) + } + } + } + ret, leftoverGas, vmErr = evm.Call(msg.From, *msg.To, msg.Data, leftoverGas, value) + sim.state.SetNonce(msg.From, msg.Nonce+1, tracing.NonceChangeUnspecified) + } + + // Gas refund (same logic as ApplyMessageWithConfig) + if msg.GasLimit < leftoverGas { + return applyCallResult{}, fmt.Errorf("gas overflow: limit %d < leftover %d", msg.GasLimit, leftoverGas) + } + temporaryGasUsed := msg.GasLimit - leftoverGas + refundQuotient := params.RefundQuotient + if rules.IsLondon { + refundQuotient = params.RefundQuotientEIP3529 + } + refund := GasToRefund(sim.state.GetRefund(), temporaryGasUsed, refundQuotient) + leftoverGas += refund + + // Apply EIP-7623 post-execution floor on post-refund gas used. + if rules.IsPrague { + floorDataGas, err := core.FloorDataGas(msg.Data) + if err != nil { + return applyCallResult{}, err + } + if msg.GasLimit-leftoverGas < floorDataGas { + leftoverGas = msg.GasLimit - floorDataGas + if temporaryGasUsed < floorDataGas { + temporaryGasUsed = floorDataGas + } + } + } + + gasUsed := msg.GasLimit - leftoverGas + + // charge gas + if msg.GasPrice.Sign() > 0 { + gasPriceU256, _ := uint256.FromBig(msg.GasPrice) + cost := new(uint256.Int).SetUint64(gasUsed) + cost.Mul(cost, gasPriceU256) + sim.state.SubBalance(sender, cost, tracing.BalanceDecreaseGasBuy) + } + if !evm.Config.NoBaseFee || msg.GasFeeCap.Sign() != 0 || msg.GasTipCap.Sign() != 0 { + effectiveTip := new(big.Int).Set(msg.GasTipCap) + if evm.Context.BaseFee != nil { + if maxTip := new(big.Int).Sub(msg.GasFeeCap, evm.Context.BaseFee); effectiveTip.Cmp(maxTip) > 0 { + effectiveTip = maxTip + } + } + if effectiveTip.Sign() > 0 { + tipU256, _ := uint256.FromBig(new(big.Int).Mul(new(big.Int).SetUint64(gasUsed), effectiveTip)) + sim.state.AddBalance(evm.Context.Coinbase, tipU256, tracing.BalanceIncreaseRewardTransactionFee) + } + } + + return applyCallResult{ + GasUsed: gasUsed, + MaxUsedGas: temporaryGasUsed, + Ret: ret, + VMErr: vmErr, + }, nil +} + +func (sim *Simulator) sanitizeCall(call *evmtypes.TransactionArgs, state *statedb.StateDB, header *ethtypes.Header, remainingBlockGas *uint64) error { + if call.Nonce == nil { + nonce := state.GetNonce(call.GetFrom()) + call.Nonce = (*hexutil.Uint64)(&nonce) + } + // Let the call run wild unless explicitly specified. + if call.Gas == nil { + call.Gas = (*hexutil.Uint64)(remainingBlockGas) + } + if *remainingBlockGas < uint64(*call.Gas) { + return &rpctypes.BlockGasLimitReachedError{ + Message: fmt.Sprintf( + "block gas limit reached: remaining: %d, required: %d", + *remainingBlockGas, + *call.Gas, + ), + } + } + // Clamp to the cross-block gas budget. + gas := sim.budget.Cap(uint64(*call.Gas)) + call.Gas = (*hexutil.Uint64)(&gas) + + return call.CallDefaults(0, header.BaseFee, sim.chainConfig.ChainID) +} + +// sanitizeChain checks the chain integrity. Specifically it checks that +// block numbers and timestamp are strictly increasing, setting default values +// when necessary. Gaps in block numbers are filled with empty blocks. +// Note: It modifies the block's override object. +func (sim *Simulator) sanitizeChain(blocks []rpctypes.SimBlock) ([]rpctypes.SimBlock, error) { + var ( + res = make([]rpctypes.SimBlock, 0, len(blocks)) + base = sim.base + prevNumber = base.Number + prevTimestamp = base.Time + ) + for _, block := range blocks { + if block.BlockOverrides == nil { + block.BlockOverrides = new(rpctypes.SimBlockOverrides) + } + if block.BlockOverrides.Number == nil { + n := new(big.Int).Add(prevNumber, big.NewInt(1)) + block.BlockOverrides.Number = (*hexutil.Big)(n) + } + if block.BlockOverrides.Withdrawals == nil { + block.BlockOverrides.Withdrawals = ðtypes.Withdrawals{} + } + diff := new(big.Int).Sub(block.BlockOverrides.Number.ToInt(), prevNumber) + if diff.Cmp(common.Big0) <= 0 { + return nil, &rpctypes.InvalidBlockNumberError{ + Message: fmt.Sprintf( + "block numbers must be in order: %d <= %d", + block.BlockOverrides.Number.ToInt().Uint64(), + prevNumber, + ), + } + } + if total := new(big.Int).Sub(block.BlockOverrides.Number.ToInt(), base.Number); total.Cmp(big.NewInt(rpctypes.MaxSimulateBlocks)) > 0 { + return nil, &rpctypes.ClientLimitExceededError{Message: "too many blocks"} + } + if diff.Cmp(big.NewInt(1)) > 0 { + // Fill the gap with empty blocks. + gap := new(big.Int).Sub(diff, big.NewInt(1)) + for i := uint64(0); i < gap.Uint64(); i++ { + n := new(big.Int).Add(prevNumber, new(big.Int).SetUint64(i+1)) + t := prevTimestamp + rpctypes.TimestampIncrement + b := rpctypes.SimBlock{ + BlockOverrides: &rpctypes.SimBlockOverrides{ + Number: (*hexutil.Big)(n), + Time: (*hexutil.Uint64)(&t), + Withdrawals: ðtypes.Withdrawals{}, + }, + } + prevTimestamp = t + res = append(res, b) + } + } + // Only append block after filling a potential gap. + prevNumber = block.BlockOverrides.Number.ToInt() + var t uint64 + if block.BlockOverrides.Time == nil { + t = prevTimestamp + rpctypes.TimestampIncrement + block.BlockOverrides.Time = (*hexutil.Uint64)(&t) + } else { + t = uint64(*block.BlockOverrides.Time) + if t <= prevTimestamp { + return nil, &rpctypes.InvalidBlockTimestampError{Message: fmt.Sprintf("block timestamps must be in order: %d <= %d", t, prevTimestamp)} + } + } + prevTimestamp = t + res = append(res, block) + } + return res, nil +} + +// makeHeaders creates block headers from overrides. +func (sim *Simulator) makeHeaders(blocks []rpctypes.SimBlock) ([]*ethtypes.Header, error) { + var ( + res = make([]*ethtypes.Header, len(blocks)) + header = sim.base + ) + for bi, block := range blocks { + if block.BlockOverrides == nil || block.BlockOverrides.Number == nil { + return nil, errors.New("empty block number") + } + overrides := block.BlockOverrides + number := overrides.Number.ToInt() + timestamp := uint64(*overrides.Time) + + var withdrawalsHash *common.Hash + if sim.chainConfig.IsShanghai(number, timestamp) { + withdrawalsHash = ðtypes.EmptyWithdrawalsHash + } + + var parentBeaconRoot *common.Hash + if sim.chainConfig.IsCancun(number, timestamp) { + root := common.Hash{} + parentBeaconRoot = &root + if overrides.BeaconRoot != nil { + parentBeaconRoot = overrides.BeaconRoot + } + } + + // Post-merge: difficulty = 0 + difficulty := header.Difficulty + if sim.chainConfig.MergeNetsplitBlock != nil { + difficulty = big.NewInt(0) + } + + header = overrides.MakeHeader(ðtypes.Header{ + UncleHash: ethtypes.EmptyUncleHash, + ReceiptHash: ethtypes.EmptyReceiptsHash, + TxHash: ethtypes.EmptyTxsHash, + Coinbase: header.Coinbase, + Difficulty: difficulty, + GasLimit: header.GasLimit, + WithdrawalsHash: withdrawalsHash, + ParentBeaconRoot: parentBeaconRoot, + }) + res[bi] = header + } + return res, nil +} + +// getHashFn returns a GetHashFunc that looks up simulated headers first, +// then falls back to the keeper's historical block hashes. +// The base block hash is handled specially: keeperGetHash's range check excludes +// num64 >= upper (upper = ctx.BlockHeight() = base block), so we call GetHeaderHash +// directly, which reads from the store (populated by BeginBlock's SetHeaderHash). +func (sim *Simulator) getHashFn(ctx sdk.Context, prevHeaders []*ethtypes.Header) vm.GetHashFunc { + keeperGetHash := sim.keeper.GetHashFn(ctx, sim.keeper.GetParams(ctx).HeaderHashNum) + baseNum := sim.base.Number.Uint64() + return func(num64 uint64) common.Hash { + // Check simulated headers + for _, h := range prevHeaders { + if h.Number.Uint64() == num64 { + return h.Hash() + } + } + // For the base block, keeperGetHash's range check (num64 >= upper) would + // return zero, so read from the store directly. + if num64 == baseNum { + if hash := sim.keeper.GetHeaderHash(ctx, num64); hash != (common.Hash{}) { + return hash + } + } + // Fall back to keeper for all other historical blocks + return keeperGetHash(num64) + } +} diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index 0c7189f1e0..4cd9086984 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -16,10 +16,8 @@ package keeper import ( - "bytes" + "errors" "fmt" - "math/big" - "sort" cmttypes "github.com/cometbft/cometbft/types" @@ -29,9 +27,11 @@ import ( ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -55,7 +55,7 @@ func (k *Keeper) NewEVM( blockCtx := vm.BlockContext{ CanTransfer: core.CanTransfer, Transfer: statedb.Transfer, - GetHash: k.GetHashFn(ctx), + GetHash: k.GetHashFn(ctx, cfg.Params.HeaderHashNum), Coinbase: cfg.CoinBase, GasLimit: ethermint.BlockGasLimit(ctx), BlockNumber: cfg.BlockNumber, @@ -63,88 +63,83 @@ func (k *Keeper) NewEVM( Difficulty: cfg.Difficulty, BaseFee: cfg.BaseFee, Random: cfg.Random, + BlobBaseFee: cfg.BlobBaseFee, } if cfg.BlockOverrides != nil { cfg.BlockOverrides.Apply(&blockCtx) } - txCtx := core.NewEVMTxContext(msg) if cfg.Tracer == nil { - cfg.Tracer = k.Tracer(msg, cfg.Rules) + cfg.Tracer = k.Tracer(ctx, *msg, cfg.ChainConfig) } vmConfig := k.VMConfig(ctx, cfg) - contracts := make(map[common.Address]vm.PrecompiledContract) - active := make([]common.Address, 0) - for addr, c := range vm.DefaultPrecompiles(cfg.Rules) { - contracts[addr] = c - active = append(active, addr) - } - for _, fn := range k.customContractFns { - c := fn(ctx, cfg.Rules) - addr := c.Address() - contracts[addr] = c - active = append(active, addr) - } - sort.SliceStable(active, func(i, j int) bool { - return bytes.Compare(active[i].Bytes(), active[j].Bytes()) < 0 - }) - evm := vm.NewEVM(blockCtx, txCtx, stateDB, cfg.ChainConfig, vmConfig) - evm.WithPrecompiles(contracts, active) + // Start with cached default precompiles; add custom ones per-tx (they may depend on tx context). + contracts := cfg.DefaultPrecompiles + if len(k.customContractFns) > 0 { + contracts = make(map[common.Address]vm.PrecompiledContract, len(cfg.DefaultPrecompiles)+len(k.customContractFns)) + for addr, c := range cfg.DefaultPrecompiles { + contracts[addr] = c + } + for _, fn := range k.customContractFns { + c := fn(ctx, cfg.Rules) + contracts[c.Address()] = c + } + } + evm := vm.NewEVM(blockCtx, stateDB, cfg.ChainConfig, vmConfig) + evm.SetTxContext(core.NewEVMTxContext(msg)) + evm.SetPrecompiles(contracts) return evm } -// GetHashFn implements vm.GetHashFunc for Ethermint. It handles 3 cases: -// 1. The requested height matches the current height from context (and thus same epoch number) -// 2. The requested height is from an previous height from the same chain epoch -// 3. The requested height is from a height greater than the latest one -func (k Keeper) GetHashFn(ctx sdk.Context) vm.GetHashFunc { - return func(height uint64) common.Hash { - h, err := ethermint.SafeInt64(height) +// GetHashFn implements vm.GetHashFunc for Ethermint. It returns hash for 3 cases: +// 1. The requested height matches current block height from the context. +// 2. The requested height is below current block height, follow EIP-2935. +// 3. The requested height is above current block height, return empty +func (k Keeper) GetHashFn(ctx sdk.Context, headerHashNum uint64) vm.GetHashFunc { + return func(num64 uint64) common.Hash { + h, err := ethermint.SafeInt64(num64) if err != nil { - k.Logger(ctx).Error("failed to cast height to int64", "error", err) return common.Hash{} } - - switch { - case ctx.BlockHeight() == h: - // Case 1: The requested height matches the one from the context so we can retrieve the header - // hash directly from the context. - // Note: The headerHash is only set at begin block, it will be nil in case of a query context + upper, err := ethermint.SafeUint64(ctx.BlockHeight()) + if err != nil { + return common.Hash{} + } + if upper == num64 { headerHash := ctx.HeaderHash() - if len(headerHash) != 0 { + if len(headerHash) > 0 { return common.BytesToHash(headerHash) } + } + // Align check with https://github.com/ethereum/go-ethereum/blob/release/1.11/core/vm/instructions.go#L433 + var lower uint64 + if upper <= headerHashNum { + lower = 0 + } else { + lower = upper - headerHashNum + } - // only recompute the hash if not set (eg: checkTxState) - contextBlockHeader := ctx.BlockHeader() - header, err := cmttypes.HeaderFromProto(&contextBlockHeader) - if err != nil { - k.Logger(ctx).Error("failed to cast tendermint header from proto", "error", err) - return common.Hash{} - } - - headerHash = header.Hash() - return common.BytesToHash(headerHash) - - case ctx.BlockHeight() > h: - // Case 2: if the chain is not the current height we need to retrieve the hash from the store for the - // current chain epoch. This only applies if the current height is greater than the requested height. - histInfo, err := k.stakingKeeper.GetHistoricalInfo(ctx, h) - if err != nil { - k.Logger(ctx).Debug("historical info not found", "height", h, "err", err.Error()) - return common.Hash{} - } - - header, err := cmttypes.HeaderFromProto(&histInfo.Header) - if err != nil { - k.Logger(ctx).Error("failed to cast tendermint header from proto", "error", err) - return common.Hash{} + if upper > num64 { + // The requested height is historical, query EIP-2935 contract storage + headerHash := k.GetHeaderHash(ctx, num64) + if headerHash.Cmp(common.Hash{}) != 0 { + return headerHash + } else if num64 >= lower { + // Pre upgrade case + // In case EIP-2935 is not supported and data cannot be found, we fetch historical info + histInfo, err := k.stakingKeeper.GetHistoricalInfo(ctx, h) + if err != nil { + k.Logger(ctx).Debug("historical info not found", "height", h, "err", err.Error()) + return common.Hash{} + } + header, err := cmttypes.HeaderFromProto(&histInfo.Header) + if err != nil { + k.Logger(ctx).Error("failed to cast tendermint header from proto", "error", err) + return common.Hash{} + } + return common.BytesToHash(header.Hash()) } - - return common.BytesToHash(header.Hash()) - default: - // Case 3: heights greater than the current one returns an empty hash. - return common.Hash{} } + return common.Hash{} } } @@ -165,7 +160,7 @@ func (k Keeper) GetHashFn(ctx sdk.Context) vm.GetHashFunc { // returning. // // For relevant discussion see: https://github.com/cosmos/cosmos-sdk/discussions/9072 -func (k *Keeper) ApplyTransaction(ctx sdk.Context, msgEth *types.MsgEthereumTx) (*types.MsgEthereumTxResponse, error) { +func (k *Keeper) ApplyTransaction(ctx sdk.Context, msgEth *types.MsgEthereumTx) (*types.EVMResult, error) { ethTx := msgEth.AsTransaction() cfg, err := k.EVMConfig(ctx, k.eip155ChainID, ethTx.Hash()) if err != nil { @@ -175,6 +170,8 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, msgEth *types.MsgEthereumTx) msg := msgEth.AsMessage(cfg.BaseFee) // snapshot to contain the tx processing and post processing in same scope var commit func() + var commitDurableAuthorization func() + tmpCtxCommitted := false tmpCtx := ctx if k.hooks != nil { // Create a cache context to revert state when tx hooks fails, @@ -182,6 +179,15 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, msgEth *types.MsgEthereumTx) // Didn't use `Snapshot` because the context stack has exponential complexity on certain operations, // thus restricted to be used only inside `ApplyMessage`. tmpCtx, commit = ctx.CacheContext() + + // Keep the EIP-7702 authorization effects in a separate cache so they + // survive a later EVM/post-hook failure that discards tmpCtx. Only needed + // for txs that actually carry authorizations. + if len(msg.SetCodeAuthorizations) > 0 { + var durableAuthorizationCtx sdk.Context + durableAuthorizationCtx, commitDurableAuthorization = ctx.CacheContext() + cfg.DurableSetCodeAuthorizationCtx = &durableAuthorizationCtx + } } // pass true to commit the StateDB @@ -194,7 +200,14 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, msgEth *types.MsgEthereumTx) // Compute block bloom filter if len(logs) > 0 { - k.SetTxBloom(tmpCtx, new(big.Int).SetBytes(ethtypes.LogsBloom(logs))) + bloom := ethtypes.Bloom{} + for _, log := range logs { + bloom.Add(log.Address.Bytes()) + for _, topic := range log.Topics { + bloom.Add(topic[:]) + } + } + k.SetTxBloom(tmpCtx, bloom.Big()) } var contractAddr common.Address @@ -226,35 +239,54 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, msgEth *types.MsgEthereumTx) } else if commit != nil { // PostTxProcessing is successful, commit the tmpCtx commit() + tmpCtxCommitted = true // Since the post-processing can alter the log, we need to update the result res.Logs = types.NewLogsFromEth(receipt.Logs) } } + // Get the tracer and add OnGasChange hook for gas refund + leftoverGas := msg.GasLimit - res.GasUsed + // refund gas in order to match the Ethereum gas consumption instead of the default SDK one. - if err = k.RefundGas(ctx, msg, msg.GasLimit-res.GasUsed, cfg.Params.EvmDenom); err != nil { + if err = k.RefundGas(ctx, msg, leftoverGas, cfg.Params.EvmDenom); err != nil { return nil, errorsmod.Wrapf(err, "failed to refund leftover gas to sender %s", msg.From) } + tracer := cfg.GetTracer() + if tracer != nil && tracer.OnGasChange != nil { + tracer.OnGasChange(leftoverGas, 0, tracing.GasChangeTxLeftOverReturned) + } + totalGasUsed, err := k.AddTransientGasUsed(ctx, res.GasUsed) if err != nil { return nil, errorsmod.Wrap(err, "failed to add transient gas used") } + if commitDurableAuthorization != nil && !tmpCtxCommitted { + commitDurableAuthorization() + } + // reset the gas meter for current cosmos transaction k.ResetGasMeterAndConsumeGas(ctx, totalGasUsed) + return res, nil } // ApplyMessage calls ApplyMessageWithConfig with an empty TxConfig. -func (k *Keeper) ApplyMessage(ctx sdk.Context, msg *core.Message, tracer vm.EVMLogger, commit bool) (*types.MsgEthereumTxResponse, error) { +func (k *Keeper) ApplyMessage(ctx sdk.Context, msg *core.Message, tracer *tracing.Hooks, commit bool) (*types.EVMResult, error) { cfg, err := k.EVMConfig(ctx, k.eip155ChainID, common.Hash{}) if err != nil { return nil, errorsmod.Wrap(err, "failed to load evm config") } cfg.Tracer = tracer - return k.ApplyMessageWithConfig(ctx, msg, cfg, commit) + result, err := k.ApplyMessageWithConfig(ctx, msg, cfg, commit) + if err != nil { + return nil, err + } + + return result, nil } // ApplyMessageWithConfig computes the new state by applying the given message against the existing state. @@ -301,18 +333,19 @@ func (k *Keeper) ApplyMessage(ctx sdk.Context, msg *core.Message, tracer vm.EVML // # debugTrace parameter // // The message is applied with steps to mimic AnteHandler -// 1. the sender is consumed with gasLimit * gasPrice in full at the beginning of the execution and -// then refund with unused gas after execution. +// 1. deduct gasLimit * gasPrice (effective gas price) through the fee collector, then refund unused +// gas after execution — same path as CheckEthGasConsume and ApplyTransaction. // 2. sender nonce is incremented by 1 before execution func (k *Keeper) ApplyMessageWithConfig( ctx sdk.Context, msg *core.Message, cfg *EVMConfig, commit bool, -) (*types.MsgEthereumTxResponse, error) { +) (result *types.EVMResult, err error) { var ( - ret []byte // return bytes from evm execution - vmErr error // vm errors do not effect consensus and are therefore not assigned to err + ret []byte // return bytes from evm execution + vmErr error // vm errors do not effect consensus and are therefore not assigned to err + gasUsed uint64 // for tracing ) // return error if contract creation or call are disabled through governance @@ -329,24 +362,48 @@ func (k *Keeper) ApplyMessageWithConfig( return nil, errorsmod.Wrap(err, "failed to apply state override") } } - evm = k.NewEVM(ctx, msg, cfg, stateDB) - leftoverGas := msg.GasLimit - sender := vm.AccountRef(msg.From) + tracingStateDB := vm.StateDB(stateDB) + if hooks := cfg.Tracer; hooks != nil { + tracingStateDB = statedb.NewHookedState(stateDB, hooks) + } + evm = k.NewEVM(ctx, msg, cfg, tracingStateDB) // Allow the tracer captures the tx level events, mainly the gas consumption. - vmCfg := evm.Config - if vmCfg.Tracer != nil { - if cfg.DebugTrace { - // msg.GasPrice should have been set to effective gas price - stateDB.SubBalance(sender.Address(), new(big.Int).Mul(msg.GasPrice, new(big.Int).SetUint64(msg.GasLimit))) - stateDB.SetNonce(sender.Address(), stateDB.GetNonce(sender.Address())+1) - } - vmCfg.Tracer.CaptureTxStart(leftoverGas) + leftoverGas := msg.GasLimit + sender := msg.From + tracer := cfg.GetTracer() + + if tracer != nil { defer func() { - if cfg.DebugTrace { - stateDB.AddBalance(sender.Address(), new(big.Int).Mul(msg.GasPrice, new(big.Int).SetUint64(leftoverGas))) + if tracer.OnTxEnd != nil { + tracer.OnTxEnd(ðtypes.Receipt{GasUsed: gasUsed}, err) } - vmCfg.Tracer.CaptureTxEnd(leftoverGas) }() + + if tracer.OnGasChange != nil { + tracer.OnGasChange(0, msg.GasLimit, tracing.GasChangeTxInitialBalance) + } + + if tracer.OnTxStart != nil { + tracer.OnTxStart( + evm.GetVMContext(), + ethtypes.NewTx(ðtypes.LegacyTx{ + To: msg.To, + Data: msg.Data, + Value: msg.Value, + Gas: msg.GasLimit, + }), + msg.From, + ) + } + + if cfg.DebugTrace { + feeAmt := debugTraceFeeAmount(msg, cfg.BaseFee) + stateDB.SubBalance(sender, uint256.MustFromBig(feeAmt), tracing.BalanceDecreaseGasBuy) + if err := stateDB.Error(); err != nil { + return nil, err + } + tracingStateDB.SetNonce(sender, stateDB.GetNonce(sender)+1, tracing.NonceChangeEoACall) + } } rules := cfg.Rules @@ -363,6 +420,22 @@ func (k *Keeper) ApplyMessageWithConfig( return nil, errorsmod.Wrap(core.ErrIntrinsicGas, "apply message") } leftoverGas -= intrinsicGas + if tracer != nil && tracer.OnGasChange != nil { + tracer.OnGasChange(msg.GasLimit, leftoverGas, tracing.GasChangeTxIntrinsicGas) + } + + // Enforce EIP-7623 floor data gas for Prague in all execution contexts, + // including eth_call and FinalizeBlock paths that bypass the ante handler. + if rules.IsPrague { + floorDataGas, err := core.FloorDataGas(msg.Data) + if err != nil { + return nil, errorsmod.Wrap(err, "floor data gas") + } + if msg.GasLimit < floorDataGas { + return nil, errorsmod.Wrapf(core.ErrFloorDataGas, + "gas %d, minimum needed %d", msg.GasLimit, floorDataGas) + } + } // access list preparation is moved from ante handler to here, because it's needed when `ApplyMessage` is called // under contexts where ante handlers are not run, for example `eth_call` and `eth_estimateGas`. @@ -374,17 +447,58 @@ func (k *Keeper) ApplyMessageWithConfig( // Execute the preparatory steps for state transition which includes: // - prepare accessList(post-berlin) // - reset transient storage(eip 1153) - stateDB.Prepare(rules, msg.From, cfg.CoinBase, msg.To, vm.DefaultActivePrecompiles(rules), msg.AccessList) + stateDB.Prepare(rules, msg.From, cfg.CoinBase, msg.To, vm.ActivePrecompiles(rules), msg.AccessList) if contractCreation { + oldNonce := stateDB.GetNonce(sender) // take over the nonce management from evm: // - reset sender's nonce to msg.Nonce() before calling evm. - // - increase sender's nonce by one no matter the result. - stateDB.SetNonce(sender.Address(), msg.Nonce) - ret, _, leftoverGas, vmErr = evm.Create(sender, msg.Data, leftoverGas, msg.Value) - stateDB.SetNonce(sender.Address(), msg.Nonce+1) + // nonce is preincremented in antehandler, so we need to reset it here. + // this is to ensure the nonce is correct for the creation of the contract. + stateDB.SetNonce(sender, msg.Nonce, tracing.NonceChangeUnspecified) + ret, _, leftoverGas, vmErr = evm.Create(sender, msg.Data, leftoverGas, uint256.MustFromBig(msg.Value)) + // evm.Create() increments nonce from msg.Nonce to (msg.Nonce + 1 + nestedCreates) + // We need: oldNonce + nestedCreates + afterCreateNonce := stateDB.GetNonce(sender) + nestedCreates := afterCreateNonce - msg.Nonce - 1 + // setting nonce to the updated value is essential + // as there may be subsequent evm call messages which doesn't increase nonce + stateDB.SetNonce(sender, oldNonce+nestedCreates, tracing.NonceChangeUnspecified) } else { - ret, leftoverGas, vmErr = evm.Call(sender, *msg.To, msg.Data, leftoverGas, msg.Value) + if msg.SetCodeAuthorizations != nil { + // Track validated authorizations together with the authority recovered + // during validation, so the durable replay below can reuse it. + type validAuth struct { + auth ethtypes.SetCodeAuthorization + authority common.Address + } + var validAuths []validAuth + for _, auth := range msg.SetCodeAuthorizations { + // Note errors are ignored, we simply skip invalid authorizations here. + authority, err := k.applyAuthorization(&auth, stateDB) + if err != nil { + k.Logger(ctx).Debug("failed to apply authorization", "error", err, "authorization", auth) + continue + } + validAuths = append(validAuths, validAuth{auth: auth, authority: authority}) + } + + if commit && cfg.DurableSetCodeAuthorizationCtx != nil && len(validAuths) > 0 { + durableStateDB := statedb.NewWithParams(*cfg.DurableSetCodeAuthorizationCtx, k, cfg.TxConfig, cfg.Params.EvmDenom) + for _, va := range validAuths { + // Replay the already-validated effects; this cannot fail, so it + // mirrors the main loop's skip-on-invalid behavior without ever + // turning an EVM-level outcome into a cosmos-level tx error. + k.applyDurableAuthorization(&va.auth, va.authority, durableStateDB) + } + if err := durableStateDB.Commit(); err != nil { + return nil, errorsmod.Wrap(err, "failed to commit durable EIP-7702 authorization stateDB") + } + } + } + // based on geth, nonce should be preincremented before evm call execution + // which is already done on the antehandler + ret, leftoverGas, vmErr = evm.Call(sender, *msg.To, msg.Data, leftoverGas, uint256.MustFromBig(msg.Value)) } refundQuotient := params.RefundQuotient @@ -400,7 +514,30 @@ func (k *Keeper) ApplyMessageWithConfig( } // refund gas temporaryGasUsed := msg.GasLimit - leftoverGas - leftoverGas += GasToRefund(stateDB.GetRefund(), temporaryGasUsed, refundQuotient) + refund := GasToRefund(stateDB.GetRefund(), temporaryGasUsed, refundQuotient) + leftoverGas += refund + + if tracer != nil && tracer.OnGasChange != nil { + tracer.OnGasChange(leftoverGas-refund, leftoverGas, tracing.GasChangeTxRefunds) + } + + // Apply EIP-7623 post-execution floor: enforce on post-refund gas used. + // leftoverGas already includes the refund at this point, so + // (msg.GasLimit - leftoverGas) is the post-refund gas used. + if rules.IsPrague { + floorDataGas, err := core.FloorDataGas(msg.Data) + if err != nil { + return nil, errorsmod.Wrap(err, "floor data gas") + } + if msg.GasLimit-leftoverGas < floorDataGas { + prev := leftoverGas + leftoverGas = msg.GasLimit - floorDataGas + if tracer != nil && tracer.OnGasChange != nil { + tracer.OnGasChange(prev, leftoverGas, tracing.GasChangeTxDataFloor) + } + } + } + temporaryGasUsed = msg.GasLimit - leftoverGas // EVM execution error needs to be available for the JSON-RPC client var vmError string @@ -408,17 +545,14 @@ func (k *Keeper) ApplyMessageWithConfig( vmError = vmErr.Error() } - // The dirty states in `StateDB` is either committed or discarded after return - if commit { - if err := stateDB.Commit(); err != nil { - return nil, errorsmod.Wrap(err, "failed to commit stateDB") - } - } - // calculate a minimum amount of gas to be charged to sender if GasLimit // is considerably higher than GasUsed to stay more aligned with Tendermint gas mechanics // for more info https://github.com/evmos/ethermint/issues/1085 - gasLimit := sdkmath.LegacyNewDec(int64(msg.GasLimit)) + limit, err := ethermint.SafeInt64(msg.GasLimit) + if err != nil { + return nil, err + } + gasLimit := sdkmath.LegacyNewDec(limit) minGasMultiplier := cfg.FeeMarketParams.MinGasMultiplier if minGasMultiplier.IsNil() { // in case we are executing eth_call on a legacy block, returns a zero value. @@ -429,17 +563,57 @@ func (k *Keeper) ApplyMessageWithConfig( if msg.GasLimit < leftoverGas { return nil, errorsmod.Wrapf(types.ErrGasOverflow, "message gas limit < leftover gas (%d < %d)", msg.GasLimit, leftoverGas) } + tempGasUsed, err := ethermint.SafeInt64(temporaryGasUsed) + if err != nil { + return nil, err + } - gasUsed := sdkmath.LegacyMaxDec(minimumGasUsed, sdkmath.LegacyNewDec(int64(temporaryGasUsed))).TruncateInt().Uint64() + gasUsed = sdkmath.LegacyMaxDec(minimumGasUsed, sdkmath.LegacyNewDec(tempGasUsed)).TruncateInt().Uint64() // reset leftoverGas, to be used by the tracer leftoverGas = msg.GasLimit - gasUsed - return &types.MsgEthereumTxResponse{ - GasUsed: gasUsed, - VmError: vmError, - Ret: ret, - Logs: types.NewLogsFromEth(stateDB.Logs()), - Hash: cfg.TxConfig.TxHash.Hex(), - BlockHash: ctx.HeaderHash(), + if cfg.DebugTrace { + if tracer != nil { + refund := uint256.NewInt(1).Mul( + uint256.MustFromBig(debugTraceGasPrice(msg, cfg.BaseFee)), + uint256.NewInt(leftoverGas), + ) + stateDB.AddBalance(sender, refund, tracing.BalanceIncreaseGasReturn) + } + } + + // The dirty states in `StateDB` is either committed or discarded after return + if commit { + if err := stateDB.Commit(); err != nil { + // A state conflict between the outer EVM and a nested native action is an + // EVM-level failure: surface it as a VmError so the transaction is included + // in the block with status=0 rather than rejected at the cosmos message level. + // All other commit errors (infrastructure failures) remain cosmos-level errors. + // + // Note: estimateGas and eth_call do not hit this path because commit is + // false for simulations, so they will succeed even when a real execution + // would produce a state conflict. + if errors.Is(err, statedb.ErrStateConflict) { + return &types.EVMResult{ + GasUsed: gasUsed, + VmError: statedb.ErrStateConflict.Error(), + Hash: cfg.TxConfig.TxHash.Hex(), + BlockHash: ctx.HeaderHash(), + ExecutionGasUsed: temporaryGasUsed, + }, nil + } + + return nil, errorsmod.Wrap(err, "failed to commit stateDB") + } + } + + return &types.EVMResult{ + GasUsed: gasUsed, + VmError: vmError, + Ret: ret, + Logs: types.NewLogsFromEth(stateDB.Logs()), + Hash: cfg.TxConfig.TxHash.Hex(), + BlockHash: ctx.HeaderHash(), + ExecutionGasUsed: temporaryGasUsed, }, nil } diff --git a/x/evm/keeper/state_transition_benchmark_test.go b/x/evm/keeper/state_transition_benchmark_test.go index f8e3a4e6d2..9b8723ccac 100644 --- a/x/evm/keeper/state_transition_benchmark_test.go +++ b/x/evm/keeper/state_transition_benchmark_test.go @@ -14,7 +14,7 @@ import ( "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/testutil" evmtypes "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" @@ -28,7 +28,7 @@ type StateTransitionBenchmarkTestSuite struct { } func (suite *StateTransitionBenchmarkTestSuite) SetupTest(b *testing.B) { - suite.BaseTestSuiteWithAccount.SetupTestWithCb(b, func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.BaseTestSuiteWithAccount.SetupTestWithCb(b, func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { feemarketGenesis := feemarkettypes.DefaultGenesisState() if suite.enableFeemarket { feemarketGenesis.Params.EnableHeight = 1 @@ -45,6 +45,9 @@ func (suite *StateTransitionBenchmarkTestSuite) SetupTest(b *testing.B) { evmGenesis.Params.ChainConfig.GrayGlacierBlock = &maxInt evmGenesis.Params.ChainConfig.MergeNetsplitBlock = &maxInt evmGenesis.Params.ChainConfig.ShanghaiTime = &maxInt + evmGenesis.Params.ChainConfig.CancunTime = &maxInt + evmGenesis.Params.ChainConfig.PragueTime = &maxInt + evmGenesis.Params.ChainConfig.OsakaTime = &maxInt genesis[evmtypes.ModuleName] = app.AppCodec().MustMarshalJSON(evmGenesis) } return genesis @@ -149,11 +152,11 @@ func newEthMsgTx( templateDynamicFeeTx.Nonce = nonce if data != nil { - templateAccessListTx.Data = data + templateDynamicFeeTx.Data = data } else { - templateAccessListTx.Data = []byte{} + templateDynamicFeeTx.Data = []byte{} } - templateAccessListTx.AccessList = accessList + templateDynamicFeeTx.AccessList = accessList ethTx = ethtypes.NewTx(templateDynamicFeeTx) baseFee = big.NewInt(3) default: diff --git a/x/evm/keeper/state_transition_test.go b/x/evm/keeper/state_transition_test.go index bdc95a1f87..75fe947daf 100644 --- a/x/evm/keeper/state_transition_test.go +++ b/x/evm/keeper/state_transition_test.go @@ -1,27 +1,36 @@ package keeper_test import ( + "bytes" + "crypto/ecdsa" "fmt" "math" "math/big" "testing" + "time" sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" + cmtcrypto "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/tmhash" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + cmtrand "github.com/cometbft/cometbft/libs/rand" + cmtversion "github.com/cometbft/cometbft/proto/tendermint/version" tmtypes "github.com/cometbft/cometbft/types" + "github.com/cometbft/cometbft/version" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" + rpctypes "github.com/evmos/ethermint/rpc/types" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/testutil" utiltx "github.com/evmos/ethermint/testutil/tx" @@ -29,7 +38,9 @@ import ( "github.com/evmos/ethermint/x/evm/keeper" "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" + evmtypes "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" + "github.com/holiman/uint256" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -43,7 +54,7 @@ func (suite *StateTransitionTestSuite) SetupTest() { coins := sdk.NewCoins(sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewInt(int64(params.TxGas)-1))) t := suite.T() - suite.SetupTestWithCb(t, func(a *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.SetupTestWithCb(t, func(a *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { feemarketGenesis := feemarkettypes.DefaultGenesisState() feemarketGenesis.Params.NoBaseFee = true genesis[feemarkettypes.ModuleName] = a.AppCodec().MustMarshalJSON(feemarketGenesis) @@ -84,87 +95,99 @@ func TestStateTransitionTestSuite(t *testing.T) { suite.Run(t, new(StateTransitionTestSuite)) } +func makeRandHeader(height uint64) tmtypes.Header { + chainID := "test" + t := time.Now() + randBytes := cmtrand.Bytes(tmhash.Size) + randAddress := cmtrand.Bytes(cmtcrypto.AddressSize) + h := tmtypes.Header{ + Version: cmtversion.Consensus{Block: version.BlockProtocol, App: 1}, + ChainID: chainID, + Height: int64(height), + Time: t, + LastBlockID: tmtypes.BlockID{}, + LastCommitHash: randBytes, + DataHash: randBytes, + ValidatorsHash: randBytes, + NextValidatorsHash: randBytes, + ConsensusHash: randBytes, + AppHash: randBytes, + LastResultsHash: randBytes, + EvidenceHash: randBytes, + ProposerAddress: randAddress, + } + return h +} + +func (suite *StateTransitionTestSuite) registerHeader(header tmtypes.Header) { + suite.Ctx.WithBlockHeight(header.Height) + suite.Ctx.WithHeaderHash(header.Hash()) + suite.App.EvmKeeper.SetHeaderHash(suite.Ctx) +} + func (suite *StateTransitionTestSuite) TestGetHashFn() { - header := suite.Ctx.BlockHeader() - h, _ := tmtypes.HeaderFromProto(&header) - hash := h.Hash() + height := uint64(evmtypes.DefaultHeaderHashNum + 2) + header := makeRandHeader(height) + hash := header.Hash() testCases := []struct { msg string height uint64 - malleate func() + malleate func(int64) expHash common.Hash }{ { - "case 1.1: context hash cached", - uint64(suite.Ctx.BlockHeight()), - func() { - suite.Ctx = suite.Ctx.WithHeaderHash(tmhash.Sum([]byte("header"))).WithConsensusParams(*testutil.DefaultConsensusParams) + "use cached header hash", + height, + func(_ int64) { + suite.Ctx = suite.Ctx.WithHeaderHash(hash) }, - common.BytesToHash(tmhash.Sum([]byte("header"))), + common.BytesToHash(hash), }, { - "case 1.2: failed to cast Tendermint header", - uint64(suite.Ctx.BlockHeight()), - func() { - header := tmproto.Header{} - header.Height = suite.Ctx.BlockHeight() - suite.Ctx = suite.Ctx.WithBlockHeader(header).WithConsensusParams(*testutil.DefaultConsensusParams) + "header after sdk50 found", + height - 1, + func(height int64) { + suite.Ctx = suite.Ctx.WithBlockHeight(height).WithHeaderHash(header.Hash()) + suite.App.EvmKeeper.SetHeaderHash(suite.Ctx) }, - common.Hash{}, + common.BytesToHash(hash), }, { - "case 1.3: hash calculated from Tendermint header", - uint64(suite.Ctx.BlockHeight()), - func() { - suite.Ctx = suite.Ctx.WithBlockHeader(header).WithConsensusParams(*testutil.DefaultConsensusParams) + "header before sdk50 found", + height - 1, + func(height int64) { + suite.App.StakingKeeper.SetHistoricalInfo(suite.Ctx, height, &stakingtypes.HistoricalInfo{ + Header: *header.ToProto(), + }) }, common.BytesToHash(hash), }, { - "case 2.1: height lower than current one, hist info not found", - 1, - func() { - suite.Ctx = suite.Ctx.WithBlockHeight(10).WithConsensusParams(*testutil.DefaultConsensusParams) - }, + "header in context not found with current height", + height, + func(_ int64) {}, common.Hash{}, }, { - "case 2.2: height lower than current one, invalid hist info header", - 1, - func() { - suite.App.StakingKeeper.SetHistoricalInfo(suite.Ctx, 1, &stakingtypes.HistoricalInfo{}) - suite.Ctx = suite.Ctx.WithBlockHeight(10).WithConsensusParams(*testutil.DefaultConsensusParams) - }, + "height greater than current height", + height + 1, + func(_ int64) {}, common.Hash{}, }, { - "case 2.3: height lower than current one, calculated from hist info header", - 1, - func() { - histInfo := &stakingtypes.HistoricalInfo{ - Header: header, - } - suite.App.StakingKeeper.SetHistoricalInfo(suite.Ctx, 1, histInfo) - suite.Ctx = suite.Ctx.WithBlockHeight(10).WithConsensusParams(*testutil.DefaultConsensusParams) - }, - common.BytesToHash(hash), - }, - { - "case 3: height greater than current one", - 200, - func() {}, + "header not found in stores", + height - 1, + func(_ int64) {}, common.Hash{}, }, } - for _, tc := range testCases { suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { suite.SetupTest() // reset - - tc.malleate() - - hash := suite.App.EvmKeeper.GetHashFn(suite.Ctx)(tc.height) + tc.malleate(int64(tc.height)) + suite.Ctx = suite.Ctx.WithBlockHeight(header.Height) + hash := suite.App.EvmKeeper.GetHashFn(suite.Ctx, evmtypes.DefaultHeaderHashNum)(tc.height) suite.Require().Equal(tc.expHash, hash) }) } @@ -591,6 +614,7 @@ func (suite *StateTransitionTestSuite) TestEVMConfig() { suite.Require().Equal(big.NewInt(0), cfg.BaseFee) suite.Require().Equal(suite.Address, cfg.CoinBase) suite.Require().Equal(types.DefaultParams().ChainConfig.EthereumConfig(big.NewInt(9000)), cfg.ChainConfig) + suite.Require().Equal(new(big.Int), cfg.BlobBaseFee) } func (suite *StateTransitionTestSuite) TestContractDeployment() { @@ -613,9 +637,7 @@ func (suite *StateTransitionTestSuite) TestApplyMessage() { keeperParams := suite.App.EvmKeeper.GetParams(suite.Ctx) chainCfg := keeperParams.ChainConfig.EthereumConfig(suite.App.EvmKeeper.ChainID()) - rules := chainCfg.Rules(big.NewInt(suite.Ctx.BlockHeight()), chainCfg.MergeNetsplitBlock != nil, uint64(suite.Ctx.BlockHeader().Time.Unix())) signer := ethtypes.LatestSignerForChainID(suite.App.EvmKeeper.ChainID()) - tracer := suite.App.EvmKeeper.Tracer(msg, rules) vmdb := suite.StateDB() msg, err = newNativeMessage( @@ -631,6 +653,7 @@ func (suite *StateTransitionTestSuite) TestApplyMessage() { ) suite.Require().NoError(err) + tracer := suite.App.EvmKeeper.Tracer(suite.Ctx, *msg, chainCfg) res, err := suite.App.EvmKeeper.ApplyMessage(suite.Ctx, msg, tracer, true) suite.Require().NoError(err) @@ -638,6 +661,89 @@ func (suite *StateTransitionTestSuite) TestApplyMessage() { suite.Require().False(res.Failed()) } +func (suite *StateTransitionTestSuite) TestApplyMessageWithConfig_DebugTraceFee() { + t := suite.T() + suite.SetupTestWithCb(t, func(a *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { + feemarketGenesis := feemarkettypes.DefaultGenesisState() + feemarketGenesis.Params.EnableHeight = 1 + feemarketGenesis.Params.NoBaseFee = false + genesis[feemarkettypes.ModuleName] = a.AppCodec().MustMarshalJSON(feemarketGenesis) + return genesis + }) + suite.mintFeeCollector = true + suite.SetupTest() + + baseFee := big.NewInt(1_000_000_000) + gasTipCap := big.NewInt(0) + gasFeeCap := big.NewInt(5_000_000_000_000) + gasLimit := uint64(2_000_000) + effectiveGas := new(big.Int).Add(gasTipCap, baseFee) + effectiveFee := new(big.Int).Mul(effectiveGas, new(big.Int).SetUint64(gasLimit)) + + to := common.BigToAddress(big.NewInt(1)) + msg := &core.Message{ + From: suite.Address, + To: &to, + Nonce: suite.App.EvmKeeper.GetNonce(suite.Ctx, suite.Address), + GasLimit: gasLimit, + GasPrice: gasFeeCap, // fee cap, not effective price + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Value: big.NewInt(0), + Data: nil, + SkipNonceChecks: false, + } + + cfg, err := suite.App.EvmKeeper.EVMConfig(suite.Ctx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + cfg.BaseFee = baseFee + cfg.TxConfig = suite.App.EvmKeeper.TxConfig(suite.Ctx, common.Hash{}) + + var txStarts, txEnds, gasChanges int + cfg.Tracer = &tracing.Hooks{ + OnTxStart: func(*tracing.VMContext, *ethtypes.Transaction, common.Address) { + txStarts++ + }, + OnTxEnd: func(*ethtypes.Receipt, error) { + txEnds++ + }, + OnGasChange: func(_, _ uint64, _ tracing.GasChangeReason) { + gasChanges++ + }, + } + cfg.DebugTrace = true + + // The up-front gas-buy during debug tracing must charge the effective fee, + // min(gasTipCap + baseFee, gasFeeCap) * gasLimit, rather than the fee cap * gas. + // Funding the sender with exactly the effective fee proves both bounds: the + // charge cannot exceed it (the call would fail on insufficient balance, which + // is what charging fee cap * gas would do here), and funding one unit less + // proves the charge is not below it either. + suite.Require().NoError( + suite.App.EvmKeeper.SetBalance(suite.Ctx, suite.Address, *uint256.MustFromBig(effectiveFee), types.DefaultEVMDenom), + ) + _, err = suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, false) + suite.Require().NoError(err, "debug trace must deduct effective fee, not fee cap * gas") + suite.Require().Equal(1, txStarts, "tracer must observe tx start") + suite.Require().Equal(1, txEnds, "tracer must observe tx end") + suite.Require().Greater(gasChanges, 1, "tracer must observe gas changes through execution") + gasChangesAfterSuccess := gasChanges + + oneLess := new(big.Int).Sub(effectiveFee, big.NewInt(1)) + suite.Require().NoError( + suite.App.EvmKeeper.SetBalance(suite.Ctx, suite.Address, *uint256.MustFromBig(oneLess), types.DefaultEVMDenom), + ) + _, err = suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, false) + suite.Require().Error(err, "debug trace must charge the full effective fee") + suite.Require().Equal(2, txStarts, "tracer must run on insufficient-balance debug trace attempt") + suite.Require().Equal(2, txEnds, "tracer must end tx even when up-front gas buy fails") + suite.Require().Equal( + gasChangesAfterSuccess+1, + gasChanges, + "failed attempt should only record the initial gas snapshot before the up-front gas buy fails", + ) +} + func (suite *StateTransitionTestSuite) TestApplyMessageWithConfig() { var ( msg *core.Message @@ -718,20 +824,391 @@ func (suite *StateTransitionTestSuite) TestApplyMessageWithConfig() { config.TxConfig = suite.App.EvmKeeper.TxConfig(suite.Ctx, common.Hash{}) tc.malleate() - res, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, config, true) - + result, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, config, true) if tc.expErr { suite.Require().Error(err) return } suite.Require().NoError(err) - suite.Require().False(res.Failed()) - suite.Require().Equal(expectedGasUsed, res.GasUsed) + suite.Require().False(result.Failed()) + suite.Require().Equal(expectedGasUsed, result.GasUsed) }) } } +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationSurvivesFailedExecutionWithAndWithoutHooks() { + testCases := []struct { + name string + setupHooks func() + }{ + { + name: "no hooks", + }, + { + name: "hooks enabled", + setupHooks: func() { + suite.App.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(&LogRecordHook{})) + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + if tc.setupHooks != nil { + tc.setupHooks() + } + + failingTarget := common.HexToAddress("0x0000000000000000000000000000000000007702") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + vmdb := suite.StateDB() + vmdb.SetCode(failingTarget, []byte{0xfe}, 0) + suite.Require().NoError(vmdb.Commit()) + + msg := suite.buildSetCodeTx(failingTarget, authorityKey, delegate, 0, 100000) + res, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, msg) + suite.Require().NoError(err) + suite.Require().True(res.Failed()) + suite.Require().NotEmpty(res.VmError) + + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) + }) + } +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationSurvivesPostHookFailure() { + suite.SetupTest() + suite.App.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(FailureHook{})) + + stateChangingTarget := common.HexToAddress("0x0000000000000000000000000000000000007703") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + // PUSH1 0x02 PUSH1 0x01 SSTORE STOP + targetCode := common.FromHex("0x600260015500") + vmdb := suite.StateDB() + vmdb.SetCode(stateChangingTarget, targetCode, 0) + suite.Require().NoError(vmdb.Commit()) + + msg := suite.buildSetCodeTx(stateChangingTarget, authorityKey, delegate, 0, 100000) + res, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, msg) + suite.Require().NoError(err) + suite.Require().True(res.Failed()) + suite.Require().Equal(types.ErrPostTxProcessing.Error(), res.VmError) + suite.Require().Empty(res.Logs) + + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) + storageValue := suite.StateDB().GetState(stateChangingTarget, common.BigToHash(big.NewInt(1))) + suite.Require().Equal(common.Hash{}, storageValue, "posthook failure must still roll back ordinary EVM state") +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationNotCommittedOnCosmosLevelError() { + suite.SetupTest() + suite.App.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(&LogRecordHook{})) + + failingTarget := common.HexToAddress("0x0000000000000000000000000000000000007709") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + vmdb := suite.StateDB() + vmdb.SetCode(failingTarget, []byte{0xfe}, 0) + suite.Require().NoError(vmdb.Commit()) + + suite.App.EvmKeeper.SetTransientGasUsed(suite.Ctx, math.MaxUint64) + + msg := suite.buildSetCodeTx(failingTarget, authorityKey, delegate, 0, 100000) + _, err = suite.App.EvmKeeper.EthereumTx(suite.Ctx, msg) + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "failed to add transient gas used") + + vmdb = suite.StateDB() + suite.Require().Zero(vmdb.GetNonce(authority)) + suite.Require().Empty(vmdb.GetCode(authority)) +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationDurableCtxIgnoredWhenCommitFalse() { + suite.SetupTest() + + target := common.HexToAddress("0x0000000000000000000000000000000000007707") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + cfg, err := suite.App.EvmKeeper.EVMConfig(suite.Ctx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + cfg.DurableSetCodeAuthorizationCtx = &suite.Ctx + + msgEth := suite.buildSetCodeTx(target, authorityKey, delegate, 0, 100000) + msg := msgEth.AsMessage(cfg.BaseFee) + res, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, false) + suite.Require().NoError(err) + suite.Require().False(res.Failed()) + + vmdb := suite.StateDB() + suite.Require().Zero(vmdb.GetNonce(authority)) + suite.Require().Empty(vmdb.GetCode(authority)) +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationDurableReplayDoesNotEmitEthereumEvents() { + suite.SetupTest() + + target := common.HexToAddress("0x0000000000000000000000000000000000007708") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + tmpCtx, commit := suite.Ctx.CacheContext() + cfg, err := suite.App.EvmKeeper.EVMConfig(tmpCtx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + // Mirror the production ApplyTransaction setup: the durable authorization + // context is a sibling cache branch of the parent ctx (not the parent + // itself), so the durable replay runs into an isolated store the main + // execution ctx cannot observe. Sharing the parent here would let the + // durable commit's account writes collide with the main statedb commit + // under the auth keeper's unique account-number index, since account + // numbers are now generated deterministically per address. + durableCtx, _ := suite.Ctx.CacheContext() + cfg.DurableSetCodeAuthorizationCtx = &durableCtx + + var ( + authorizationNonceChanges int + authorizationCodeChanges int + ethereumLogs int + ) + cfg.Tracer = &tracing.Hooks{ + OnNonceChangeV2: func(addr common.Address, _, _ uint64, reason tracing.NonceChangeReason) { + if addr == authority && reason == tracing.NonceChangeAuthorization { + authorizationNonceChanges++ + } + }, + OnCodeChangeV2: func(addr common.Address, _ common.Hash, _ []byte, _ common.Hash, _ []byte, reason tracing.CodeChangeReason) { + if addr == authority && reason == tracing.CodeChangeAuthorization { + authorizationCodeChanges++ + } + }, + OnLog: func(*ethtypes.Log) { + ethereumLogs++ + }, + } + + msgEth := suite.buildSetCodeTx(target, authorityKey, delegate, 0, 100000) + msg := msgEth.AsMessage(cfg.BaseFee) + res, err := suite.App.EvmKeeper.ApplyMessageWithConfig(tmpCtx, msg, cfg, true) + suite.Require().NoError(err) + suite.Require().False(res.Failed()) + commit() + + suite.Require().Zero(authorizationNonceChanges) + suite.Require().Zero(authorizationCodeChanges) + suite.Require().Zero(ethereumLogs) + suite.Require().Empty(res.Logs) + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationReplayByDifferentOuterSignerSkippedAfterFailedExecution() { + testCases := []struct { + name string + setupHooks func() + }{ + { + name: "no hooks", + }, + { + name: "hooks enabled", + setupHooks: func() { + suite.App.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(&LogRecordHook{})) + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + if tc.setupHooks != nil { + tc.setupHooks() + } + + failingTarget := common.HexToAddress("0x0000000000000000000000000000000000007704") + successTarget := common.HexToAddress("0x0000000000000000000000000000000000007705") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + replayKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + vmdb := suite.StateDB() + vmdb.SetCode(failingTarget, common.FromHex("0x60006000fd"), 0) + suite.Require().NoError(vmdb.Commit()) + + auth := suite.signSetCodeAuthorization(authorityKey, delegate, 0) + firstMsg := suite.buildSetCodeTxWithAuth(failingTarget, suite.senderKey(), auth, 100000) + firstRes, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, firstMsg) + suite.Require().NoError(err) + suite.Require().True(firstRes.Failed()) + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) + + replayMsg := suite.buildSetCodeTxWithAuth(successTarget, replayKey, auth, 100000) + replayRes, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, replayMsg) + suite.Require().NoError(err) + suite.Require().False(replayRes.Failed()) + + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) + }) + } +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationReplayByDifferentOuterSignerSkippedAfterPostHookFailure() { + suite.SetupTest() + suite.App.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(&oneShotFailureHook{})) + + successTarget := common.HexToAddress("0x0000000000000000000000000000000000007706") + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + replayKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + + auth := suite.signSetCodeAuthorization(authorityKey, delegate, 0) + firstMsg := suite.buildSetCodeTxWithAuth(successTarget, suite.senderKey(), auth, 100000) + firstRes, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, firstMsg) + suite.Require().NoError(err) + suite.Require().True(firstRes.Failed()) + suite.Require().Equal(types.ErrPostTxProcessing.Error(), firstRes.VmError) + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) + + replayMsg := suite.buildSetCodeTxWithAuth(successTarget, replayKey, auth, 100000) + replayRes, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, replayMsg) + suite.Require().NoError(err) + suite.Require().False(replayRes.Failed()) + + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) +} + +func (suite *StateTransitionTestSuite) TestSetCodeAuthorizationDrainCallRolledBackButAuthorizationConsumedOnPostHookFailure() { + suite.SetupTest() + suite.App.EvmKeeper.SetHooks(keeper.NewMultiEvmHooks(FailureHook{})) + + delegate := common.HexToAddress("0x000000000000000000000000000000000000dE1E") + victimBalance := uint256.NewInt(1000000000) + authorityKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + outerKey, err := crypto.GenerateKey() + suite.Require().NoError(err) + authority := crypto.PubkeyToAddress(authorityKey.PublicKey) + outer := crypto.PubkeyToAddress(outerKey.PublicKey) + + // CALL(CALLER, SELFBALANCE): a permissive delegate used by the PoC drain case. + drainRuntime := common.FromHex("0x600060006000600047335af100") + vmdb := suite.StateDB() + vmdb.SetCode(delegate, drainRuntime, 0) + vmdb.AddBalance(authority, victimBalance, 0) + suite.Require().NoError(vmdb.Commit()) + + auth := suite.signSetCodeAuthorization(authorityKey, delegate, 0) + msg := suite.buildSetCodeTxWithAuth(authority, outerKey, auth, 200000) + res, err := suite.App.EvmKeeper.EthereumTx(suite.Ctx, msg) + suite.Require().NoError(err) + suite.Require().True(res.Failed()) + suite.Require().Equal(types.ErrPostTxProcessing.Error(), res.VmError) + + suite.requireSetCodeAuthorizationConsumed(authority, delegate, 1) + suite.Require().Equal(victimBalance.ToBig(), suite.App.EvmKeeper.GetEVMDenomBalance(suite.Ctx, authority)) + suite.Require().Zero(suite.App.EvmKeeper.GetEVMDenomBalance(suite.Ctx, outer).Sign()) +} + +func (suite *StateTransitionTestSuite) buildSetCodeTx( + to common.Address, + authorityKey *ecdsa.PrivateKey, + delegate common.Address, + authorityNonce uint64, + gasLimit uint64, +) *types.MsgEthereumTx { + auth := suite.signSetCodeAuthorization(authorityKey, delegate, authorityNonce) + return suite.buildSetCodeTxWithAuth(to, suite.senderKey(), auth, gasLimit) +} + +func (suite *StateTransitionTestSuite) signSetCodeAuthorization( + authorityKey *ecdsa.PrivateKey, + delegate common.Address, + authorityNonce uint64, +) ethtypes.SetCodeAuthorization { + auth, err := ethtypes.SignSetCode(authorityKey, ethtypes.SetCodeAuthorization{ + ChainID: *uint256.MustFromBig(suite.App.EvmKeeper.ChainID()), + Address: delegate, + Nonce: authorityNonce, + }) + suite.Require().NoError(err) + return auth +} + +func (suite *StateTransitionTestSuite) buildSetCodeTxWithAuth( + to common.Address, + outerKey *ecdsa.PrivateKey, + auth ethtypes.SetCodeAuthorization, + gasLimit uint64, +) *types.MsgEthereumTx { + outer := crypto.PubkeyToAddress(outerKey.PublicKey) + tx := ethtypes.NewTx(ðtypes.SetCodeTx{ + ChainID: uint256.MustFromBig(suite.App.EvmKeeper.ChainID()), + Nonce: suite.App.EvmKeeper.GetNonce(suite.Ctx, outer), + GasTipCap: uint256.NewInt(0), + GasFeeCap: uint256.NewInt(0), + Gas: gasLimit, + To: to, + Value: uint256.NewInt(0), + AuthList: []ethtypes.SetCodeAuthorization{auth}, + }) + + signer := ethtypes.NewPragueSigner(suite.App.EvmKeeper.ChainID()) + signedTx, err := ethtypes.SignTx(tx, signer, outerKey) + suite.Require().NoError(err) + + msg := &types.MsgEthereumTx{} + suite.Require().NoError(msg.FromSignedEthereumTx(signedTx, signer)) + return msg +} + +func (suite *StateTransitionTestSuite) senderKey() *ecdsa.PrivateKey { + senderKey, err := crypto.ToECDSA(suite.PrivKey.Key) + suite.Require().NoError(err) + return senderKey +} + +func (suite *StateTransitionTestSuite) requireSetCodeAuthorizationConsumed( + authority common.Address, + delegate common.Address, + expectedNonce uint64, +) { + vmdb := suite.StateDB() + suite.Require().Equal(expectedNonce, vmdb.GetNonce(authority)) + suite.Require().Equal(ethtypes.AddressToDelegation(delegate), vmdb.GetCode(authority)) +} + +type oneShotFailureHook struct { + called bool +} + +func (h *oneShotFailureHook) PostTxProcessing(ctx sdk.Context, msg *core.Message, receipt *ethtypes.Receipt) error { + if h.called { + return nil + } + h.called = true + return fmt.Errorf("mock transient error") +} + func (suite *StateTransitionTestSuite) createContractGethMsg(nonce uint64, signer ethtypes.Signer, gasPrice *big.Int) (*core.Message, error) { ethMsg, err := utiltx.CreateContractMsgTx(nonce, signer, gasPrice, suite.Address, suite.Signer) if err != nil { @@ -771,3 +1248,164 @@ func (suite *StateTransitionTestSuite) TestGetProposerAddress() { }) } } + +func (suite *StateTransitionTestSuite) TestBlobBaseFeeOpcode() { + // Bytecode: BLOBBASEFEE(0x4a), PUSH1 0x00, MSTORE, PUSH1 0x20, PUSH1 0x00, RETURN + // This pushes the blob base fee onto the stack, stores it at memory offset 0, and returns 32 bytes. + blobBaseFeeCode := common.FromHex("4a60005260206000f3") + targetAddr := common.HexToAddress("0x00000000000000000000000000000000000000bb") + + suite.Run("default zero", func() { + suite.SetupTest() + + vmdb := suite.StateDB() + vmdb.SetCode(targetAddr, blobBaseFeeCode, 0) + suite.Require().NoError(vmdb.Commit()) + + cfg, err := suite.App.EvmKeeper.EVMConfig(suite.Ctx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + cfg.TxConfig = suite.App.EvmKeeper.TxConfig(suite.Ctx, common.Hash{}) + + msg := &core.Message{ + To: &targetAddr, + From: suite.Address, + Nonce: suite.StateDB().GetNonce(suite.Address), + Value: big.NewInt(0), + GasLimit: 100000, + GasPrice: big.NewInt(0), + GasFeeCap: big.NewInt(0), + GasTipCap: big.NewInt(0), + Data: nil, + SkipNonceChecks: true, + } + + result, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, true) + suite.Require().NoError(err) + suite.Require().Empty(result.VmError, "BLOBBASEFEE opcode should not cause a VM error") + + suite.Require().Len(result.Ret, 32, "should return 32 bytes") + expected := make([]byte, 32) + suite.Require().Equal(expected, result.Ret, "BLOBBASEFEE should return 0") + }) + + suite.Run("block override", func() { + suite.SetupTest() + + vmdb := suite.StateDB() + vmdb.SetCode(targetAddr, blobBaseFeeCode, 0) + suite.Require().NoError(vmdb.Commit()) + + cfg, err := suite.App.EvmKeeper.EVMConfig(suite.Ctx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + cfg.TxConfig = suite.App.EvmKeeper.TxConfig(suite.Ctx, common.Hash{}) + cfg.BlockOverrides = &rpctypes.BlockOverrides{ + BlobBaseFee: (*hexutil.Big)(big.NewInt(42)), + } + + msg := &core.Message{ + To: &targetAddr, + From: suite.Address, + Nonce: suite.StateDB().GetNonce(suite.Address), + Value: big.NewInt(0), + GasLimit: 100000, + GasPrice: big.NewInt(0), + GasFeeCap: big.NewInt(0), + GasTipCap: big.NewInt(0), + Data: nil, + SkipNonceChecks: true, + } + + result, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, true) + suite.Require().NoError(err) + suite.Require().Empty(result.VmError, "BLOBBASEFEE opcode should not cause a VM error") + + suite.Require().Len(result.Ret, 32, "should return 32 bytes") + expected := common.BigToHash(big.NewInt(42)).Bytes() + suite.Require().Equal(expected, result.Ret, "BLOBBASEFEE should return overridden value 42") + }) +} + +// TestPragueFloorDataGas verifies EIP-7623 floor data gas enforcement in ApplyMessageWithConfig. +// A transaction whose gasLimit >= intrinsicGas but < floorDataGas must be rejected, +// and when gasLimit >= floorDataGas the charged gas must be at least floorDataGas. +func (suite *StateTransitionTestSuite) TestPragueFloorDataGas() { + suite.SetupTest() + + calldata := bytes.Repeat([]byte{0xff}, 1024) + ethCfg := suite.App.EvmKeeper.GetParams(suite.Ctx).ChainConfig.EthereumConfig(suite.App.EvmKeeper.ChainID()) + rules := ethCfg.Rules(big.NewInt(suite.Ctx.BlockHeight()), ethCfg.MergeNetsplitBlock != nil, uint64(suite.Ctx.BlockHeader().Time.Unix())) + intrinsicGas, err := suite.App.EvmKeeper.GetEthIntrinsicGas(&core.Message{To: &suite.Address, Data: calldata}, rules, false) + suite.Require().NoError(err) + floorDataGas, err := core.FloorDataGas(calldata) + suite.Require().NoError(err) + suite.Require().Less(intrinsicGas, floorDataGas, "test invariant: floor > intrinsic") + + to := suite.Address + cfg, err := suite.App.EvmKeeper.EVMConfig(suite.Ctx, suite.App.EvmKeeper.ChainID(), common.Hash{}) + suite.Require().NoError(err) + cfg.TxConfig = suite.App.EvmKeeper.TxConfig(suite.Ctx, common.Hash{}) + + suite.Require().True(cfg.Rules.IsPrague, "Prague must be active for this test") + + suite.Run("rejects gasLimit below floor", func() { + msg := &core.Message{ + To: &to, + From: suite.Address, + Nonce: suite.StateDB().GetNonce(suite.Address), + Value: big.NewInt(0), + GasLimit: intrinsicGas, + GasPrice: big.NewInt(0), + GasFeeCap: big.NewInt(0), + GasTipCap: big.NewInt(0), + Data: calldata, + SkipNonceChecks: true, + } + + _, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, true) + suite.Require().Error(err, "must reject gasLimit < floorDataGas under Prague") + suite.Require().Contains(err.Error(), "floor data gas") + }) + + suite.Run("accepts gasLimit at floor and charges floor gas", func() { + msg := &core.Message{ + To: &to, + From: suite.Address, + Nonce: suite.StateDB().GetNonce(suite.Address), + Value: big.NewInt(0), + GasLimit: floorDataGas, // exactly at floor + GasPrice: big.NewInt(0), + GasFeeCap: big.NewInt(0), + GasTipCap: big.NewInt(0), + Data: calldata, + SkipNonceChecks: true, + } + + result, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, true) + suite.Require().NoError(err) + suite.Require().False(result.Failed()) + // Charged gas must equal floorDataGas even though actual EVM execution cost < floor. + suite.Require().GreaterOrEqual(result.GasUsed, floorDataGas, + "gasUsed must be at least floorDataGas under Prague EIP-7623") + }) + + suite.Run("accepts gasLimit above floor and charges at least floor gas", func() { + msg := &core.Message{ + To: &to, + From: suite.Address, + Nonce: suite.StateDB().GetNonce(suite.Address), + Value: big.NewInt(0), + GasLimit: floorDataGas * 2, // well above floor + GasPrice: big.NewInt(0), + GasFeeCap: big.NewInt(0), + GasTipCap: big.NewInt(0), + Data: calldata, + SkipNonceChecks: true, + } + + result, err := suite.App.EvmKeeper.ApplyMessageWithConfig(suite.Ctx, msg, cfg, true) + suite.Require().NoError(err) + suite.Require().False(result.Failed()) + suite.Require().GreaterOrEqual(result.GasUsed, floorDataGas, + "gasUsed must be at least floorDataGas under Prague EIP-7623") + }) +} diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index e718de0148..b09e474056 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -20,13 +20,14 @@ import ( errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" - "cosmossdk.io/store/prefix" - storetypes "cosmossdk.io/store/types" + "github.com/cosmos/cosmos-sdk/store/v2/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/statedb" "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" ) var _ statedb.Keeper = &Keeper{} @@ -76,32 +77,44 @@ func (k *Keeper) Transfer(ctx sdk.Context, sender, recipient sdk.AccAddress, coi return k.bankKeeper.SendCoins(ctx, sender, recipient, coins) } -func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error { +func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, coin sdk.Coin) (uint256.Int, error) { + coins := sdk.NewCoins(coin) + prevBalance := k.GetBalance(ctx, addr, coin.Denom) if err := k.bankKeeper.MintCoins(ctx, types.ModuleName, coins); err != nil { - return err + return uint256.Int{}, err + } + if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, addr, coins); err != nil { + return uint256.Int{}, err } - return k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, addr, coins) + return prevBalance, nil } -func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error { +func (k *Keeper) SubBalance(ctx sdk.Context, addr sdk.AccAddress, coin sdk.Coin) (uint256.Int, error) { + coins := sdk.NewCoins(coin) + prevBalance := k.GetBalance(ctx, addr, coin.Denom) if err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, addr, types.ModuleName, coins); err != nil { - return err + return uint256.Int{}, err } - return k.bankKeeper.BurnCoins(ctx, types.ModuleName, coins) + if err := k.bankKeeper.BurnCoins(ctx, types.ModuleName, coins); err != nil { + return uint256.Int{}, err + } + return prevBalance, nil } // SetBalance reset the account's balance, mainly used by unit tests -func (k *Keeper) SetBalance(ctx sdk.Context, addr common.Address, amount *big.Int, evmDenom string) error { +func (k *Keeper) SetBalance(ctx sdk.Context, addr common.Address, amount uint256.Int, evmDenom string) error { cosmosAddr := sdk.AccAddress(addr.Bytes()) balance := k.GetBalance(ctx, cosmosAddr, evmDenom) - delta := new(big.Int).Sub(amount, balance) + delta := new(big.Int).Sub(amount.ToBig(), balance.ToBig()) switch delta.Sign() { case 1: - coins := sdk.NewCoins(sdk.NewCoin(evmDenom, sdkmath.NewIntFromBigInt(delta))) - return k.AddBalance(ctx, cosmosAddr, coins) + coin := sdk.NewCoin(evmDenom, sdkmath.NewIntFromBigInt(delta)) + _, err := k.AddBalance(ctx, cosmosAddr, coin) + return err case -1: - coins := sdk.NewCoins(sdk.NewCoin(evmDenom, sdkmath.NewIntFromBigInt(new(big.Int).Abs(delta)))) - return k.SubBalance(ctx, cosmosAddr, coins) + coin := sdk.NewCoin(evmDenom, sdkmath.NewIntFromBigInt(new(big.Int).Abs(delta))) + _, err := k.SubBalance(ctx, cosmosAddr, coin) + return err default: return nil } @@ -130,7 +143,7 @@ func (k *Keeper) SetAccount(ctx sdk.Context, addr common.Address, account stated k.accountKeeper.SetAccount(ctx, acct) - k.Logger(ctx).Debug("account updated", + k.debugLog(ctx, "account updated", "ethereum-address", addr, "nonce", account.Nonce, "codeHash", codeHash, @@ -148,7 +161,7 @@ func (k *Keeper) SetState(ctx sdk.Context, addr common.Address, key common.Hash, } else { store.Set(key.Bytes(), value) } - k.Logger(ctx).Debug("state", + k.debugLog(ctx, "state", "action", action, "ethereum-address", addr, "key", key, @@ -167,7 +180,7 @@ func (k *Keeper) SetCode(ctx sdk.Context, codeHash, code []byte) { } else { store.Set(codeHash, code) } - k.Logger(ctx).Debug("code", + k.debugLog(ctx, "code", "action", action, "code-hash", codeHash, ) @@ -201,7 +214,7 @@ func (k *Keeper) DeleteAccount(ctx sdk.Context, addr common.Address) error { // remove auth account k.accountKeeper.RemoveAccount(ctx, acct) - k.Logger(ctx).Debug("account suicided", + k.debugLog(ctx, "account suicided", "ethereum-address", addr, "cosmos-address", cosmosAddr, ) diff --git a/x/evm/keeper/statedb_benchmark_test.go b/x/evm/keeper/statedb_benchmark_test.go index 3213271b89..89c5361c78 100644 --- a/x/evm/keeper/statedb_benchmark_test.go +++ b/x/evm/keeper/statedb_benchmark_test.go @@ -1,12 +1,13 @@ package keeper_test import ( - "math/big" "testing" + "github.com/holiman/uint256" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -52,13 +53,13 @@ func BenchmarkAddBalance(b *testing.B) { suite.SetupTest(b) vmdb := suite.StateDB() - amt := big.NewInt(10) + amt := uint256.NewInt(10) b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { - vmdb.AddBalance(suite.Address, amt) + vmdb.AddBalance(suite.Address, amt, tracing.BalanceChangeTransfer) } } @@ -73,7 +74,7 @@ func BenchmarkSetCode(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { - vmdb.SetCode(suite.Address, hash) + vmdb.SetCode(suite.Address, hash, 0) } } @@ -88,7 +89,7 @@ func BenchmarkSetState(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { - vmdb.SetCode(suite.Address, hash) + vmdb.SetCode(suite.Address, hash, 0) } } @@ -144,13 +145,13 @@ func BenchmarkSubBalance(b *testing.B) { suite.SetupTest(b) vmdb := suite.StateDB() - amt := big.NewInt(10) + amt := uint256.NewInt(10) b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { - vmdb.SubBalance(suite.Address, amt) + vmdb.SubBalance(suite.Address, amt, tracing.BalanceChangeTransfer) } } @@ -163,7 +164,7 @@ func BenchmarkSetNonce(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { - vmdb.SetNonce(suite.Address, 1) + vmdb.SetNonce(suite.Address, 1, tracing.NonceChangeUnspecified) } } @@ -193,6 +194,6 @@ func BenchmarkSuicide(b *testing.B) { vmdb.CreateAccount(addr) b.StartTimer() - vmdb.Suicide(addr) + vmdb.SelfDestruct(addr) } } diff --git a/x/evm/keeper/statedb_test.go b/x/evm/keeper/statedb_test.go index d50feacf34..f435458d06 100644 --- a/x/evm/keeper/statedb_test.go +++ b/x/evm/keeper/statedb_test.go @@ -5,7 +5,8 @@ import ( "math/big" "testing" - "cosmossdk.io/store/prefix" + sdkmath "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/store/v2/prefix" "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -13,9 +14,11 @@ import ( authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/holiman/uint256" "github.com/stretchr/testify/suite" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -56,11 +59,11 @@ func (suite *StateDBTestSuite) TestCreateAccount() { "reset account (keep balance)", suite.Address, func(vmdb vm.StateDB, addr common.Address) { - vmdb.AddBalance(addr, big.NewInt(100)) - suite.Require().NotZero(vmdb.GetBalance(addr).Int64()) + vmdb.AddBalance(addr, uint256.NewInt(100), tracing.BalanceChangeTransfer) + suite.Require().NotZero(vmdb.GetBalance(addr).Uint64()) }, func(vmdb vm.StateDB, addr common.Address) { - suite.Require().Equal(vmdb.GetBalance(addr).Int64(), int64(100)) + suite.Require().Equal(vmdb.GetBalance(addr).Uint64(), uint64(100)) }, }, { @@ -85,20 +88,170 @@ func (suite *StateDBTestSuite) TestCreateAccount() { } } +func (suite *StateDBTestSuite) TestCreateContract() { + testCases := []struct { + name string + addr common.Address + malleate func(vm.StateDB, common.Address) + callback func(vm.StateDB, common.Address) + }{ + { + "create contract on new address", + tests.GenerateAddress(), + func(vmdb vm.StateDB, addr common.Address) { + if !vmdb.Exist(addr) { + vmdb.CreateAccount(addr) + } + contractHash := vmdb.GetCodeHash(addr) + emptyCode := contractHash == (common.Hash{}) || contractHash == ethtypes.EmptyCodeHash + storageRoot := vmdb.GetStorageRoot(addr) + emptyStorage := storageRoot == (common.Hash{}) || storageRoot == ethtypes.EmptyRootHash + if vmdb.GetNonce(addr) == 0 && emptyCode && emptyStorage { + vmdb.CreateContract(addr) + // We also set some code here, to prevent the + // CreateContract action from being performed twice in a row, + // which would cause a difference in state when unrolling + // the journal. (CreateContact assumes created was false prior to + // invocation, and the journal rollback sets it to false). + vmdb.SetCode(addr, []byte{1}, 0) + } + }, + func(vmdb vm.StateDB, addr common.Address) { + suite.Require().True(vmdb.Exist(addr)) + }, + }, + { + "create contract on existing account", + suite.Address, + func(vmdb vm.StateDB, addr common.Address) { + // Add balance to existing account + vmdb.AddBalance(addr, uint256.NewInt(100), tracing.BalanceChangeTransfer) + suite.Require().True(vmdb.Exist(addr)) + suite.Require().Equal(uint64(100), vmdb.GetBalance(addr).Uint64()) + vmdb.CreateContract(addr) + }, + func(vmdb vm.StateDB, addr common.Address) { + // Account should still exist with balance + suite.Require().True(vmdb.Exist(addr)) + suite.Require().Equal(uint64(100), vmdb.GetBalance(addr).Uint64()) + // Should be marked as new contract + balance, destroyed := vmdb.SelfDestruct6780(addr) + suite.Require().True(destroyed, "existing account marked as new contract should be destructible") + suite.Require().Equal(uint64(100), balance.Uint64()) + }, + }, + { + "create contract then set code", + tests.GenerateAddress(), + func(vmdb vm.StateDB, addr common.Address) { + vmdb.CreateAccount(addr) + vmdb.CreateContract(addr) + }, + func(vmdb vm.StateDB, addr common.Address) { + // Then set code + code := []byte("contract bytecode") + vmdb.SetCode(addr, code, 0) + + // Verify both contract marking and code + suite.Require().Equal(code, vmdb.GetCode(addr)) + suite.Require().Equal(len(code), vmdb.GetCodeSize(addr)) + + // Should still be marked as new contract + _, destroyed := vmdb.SelfDestruct6780(addr) + suite.Require().True(destroyed, "contract with code should still be destructible") + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + vmdb := suite.StateDB() + tc.malleate(vmdb, tc.addr) + tc.callback(vmdb, tc.addr) + }) + } +} + +func (suite *StateDBTestSuite) TestTransfer() { + testCases := []struct { + name string + from common.Address + to common.Address + amount *uint256.Int + setup func(vm.StateDB, common.Address) + expected *uint256.Int + }{ + { + name: "positive amount, different accounts", + from: suite.Address, + to: tests.GenerateAddress(), + amount: uint256.NewInt(100), + setup: func(vmdb vm.StateDB, from common.Address) { + vmdb.AddBalance(from, uint256.NewInt(1000), tracing.BalanceChangeTransfer) + }, + expected: uint256.NewInt(900), + }, + { + name: "positive amount, same account", + from: suite.Address, + to: suite.Address, + amount: uint256.NewInt(100), + setup: func(vmdb vm.StateDB, from common.Address) { + vmdb.AddBalance(from, uint256.NewInt(1000), tracing.BalanceChangeTransfer) + }, + expected: uint256.NewInt(1000), + }, + { + name: "zero amount", + from: suite.Address, + to: tests.GenerateAddress(), + amount: uint256.NewInt(0), + setup: func(vmdb vm.StateDB, from common.Address) { + vmdb.AddBalance(from, uint256.NewInt(1000), tracing.BalanceChangeTransfer) + }, + expected: uint256.NewInt(1000), + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + vmdb := suite.StateDB() + tc.setup(vmdb, tc.from) + prevFrom := vmdb.GetBalance(tc.from) + prevTo := vmdb.GetBalance(tc.to) + + vmdb.Transfer(tc.from, tc.to, tc.amount) + + if tc.from == tc.to { + // No net change if from == to + suite.Require().Equal(prevFrom.Uint64(), vmdb.GetBalance(tc.from).Uint64()) + } else if tc.amount.Sign() == 0 { + // No-op for zero amount + suite.Require().Equal(prevFrom.Uint64(), vmdb.GetBalance(tc.from).Uint64()) + suite.Require().Equal(prevTo.Uint64(), vmdb.GetBalance(tc.to).Uint64()) + } else { + // from should decrease, to should increase + suite.Require().Equal(tc.expected.Uint64(), vmdb.GetBalance(tc.from).Uint64()) + suite.Require().Equal(new(uint256.Int).Add(prevTo, tc.amount).Uint64(), vmdb.GetBalance(tc.to).Uint64()) + } + }) + } +} + func (suite *StateDBTestSuite) TestAddBalance() { testCases := []struct { name string - amount *big.Int + amount *uint256.Int isNoOp bool }{ { "positive amount", - big.NewInt(100), + uint256.NewInt(100), false, }, { "zero amount", - big.NewInt(0), + uint256.NewInt(0), true, }, } @@ -107,13 +260,13 @@ func (suite *StateDBTestSuite) TestAddBalance() { suite.Run(tc.name, func() { vmdb := suite.StateDB() prev := vmdb.GetBalance(suite.Address) - vmdb.AddBalance(suite.Address, tc.amount) + vmdb.AddBalance(suite.Address, tc.amount, tracing.BalanceChangeTransfer) post := vmdb.GetBalance(suite.Address) if tc.isNoOp { - suite.Require().Equal(prev.Int64(), post.Int64()) + suite.Require().Equal(prev.Uint64(), post.Uint64()) } else { - suite.Require().Equal(new(big.Int).Add(prev, tc.amount).Int64(), post.Int64()) + suite.Require().Equal(new(uint256.Int).Add(prev, tc.amount).Uint64(), post.Uint64()) } }) } @@ -122,27 +275,27 @@ func (suite *StateDBTestSuite) TestAddBalance() { func (suite *StateDBTestSuite) TestSubBalance() { testCases := []struct { name string - amount *big.Int + amount *uint256.Int malleate func(vm.StateDB) isNoOp bool }{ { "positive amount, below zero", - big.NewInt(100), + uint256.NewInt(100), func(vm.StateDB) {}, true, }, { "positive amount, above zero", - big.NewInt(50), + uint256.NewInt(50), func(vmdb vm.StateDB) { - vmdb.AddBalance(suite.Address, big.NewInt(100)) + vmdb.AddBalance(suite.Address, uint256.NewInt(100), tracing.BalanceChangeTransfer) }, false, }, { "zero amount", - big.NewInt(0), + uint256.NewInt(0), func(vm.StateDB) {}, true, }, @@ -154,13 +307,13 @@ func (suite *StateDBTestSuite) TestSubBalance() { tc.malleate(vmdb) prev := vmdb.GetBalance(suite.Address) - vmdb.SubBalance(suite.Address, tc.amount) + vmdb.SubBalance(suite.Address, tc.amount, tracing.BalanceChangeTransfer) post := vmdb.GetBalance(suite.Address) if tc.isNoOp { - suite.Require().Equal(prev.Int64(), post.Int64()) + suite.Require().Equal(prev.Uint64(), post.Uint64()) } else { - suite.Require().Equal(new(big.Int).Sub(prev, tc.amount).Int64(), post.Int64()) + suite.Require().Equal(new(uint256.Int).Sub(prev, tc.amount).Uint64(), post.Uint64()) } }) } @@ -184,7 +337,7 @@ func (suite *StateDBTestSuite) TestGetNonce() { suite.Address, 1, func(vmdb vm.StateDB) { - vmdb.SetNonce(suite.Address, 1) + vmdb.SetNonce(suite.Address, 1, tracing.NonceChangeUnspecified) }, }, } @@ -224,7 +377,7 @@ func (suite *StateDBTestSuite) TestSetNonce() { for _, tc := range testCases { suite.Run(tc.name, func() { vmdb := suite.StateDB() - vmdb.SetNonce(tc.address, tc.nonce) + vmdb.SetNonce(tc.address, tc.nonce, tracing.NonceChangeUnspecified) nonce := vmdb.GetNonce(tc.address) suite.Require().Equal(tc.nonce, nonce) }) @@ -234,7 +387,7 @@ func (suite *StateDBTestSuite) TestSetNonce() { func (suite *StateDBTestSuite) TestGetCodeHash() { addr := tests.GenerateAddress() baseAcc := &authtypes.BaseAccount{Address: sdk.AccAddress(addr.Bytes()).String()} - baseAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + baseAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, baseAcc) suite.App.AccountKeeper.SetAccount(suite.Ctx, baseAcc) testCases := []struct { @@ -260,7 +413,7 @@ func (suite *StateDBTestSuite) TestGetCodeHash() { suite.Address, crypto.Keccak256Hash([]byte("codeHash")), func(vmdb vm.StateDB) { - vmdb.SetCode(suite.Address, []byte("codeHash")) + vmdb.SetCode(suite.Address, []byte("codeHash"), 0) }, }, } @@ -279,7 +432,7 @@ func (suite *StateDBTestSuite) TestGetCodeHash() { func (suite *StateDBTestSuite) TestSetCode() { addr := tests.GenerateAddress() baseAcc := &authtypes.BaseAccount{Address: sdk.AccAddress(addr.Bytes()).String()} - baseAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + baseAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, baseAcc) suite.App.AccountKeeper.SetAccount(suite.Ctx, baseAcc) testCases := []struct { @@ -318,7 +471,7 @@ func (suite *StateDBTestSuite) TestSetCode() { suite.Run(tc.name, func() { vmdb := suite.StateDB() prev := vmdb.GetCode(tc.address) - vmdb.SetCode(tc.address, tc.code) + vmdb.SetCode(tc.address, tc.code, 0) post := vmdb.GetCode(tc.address) if tc.isNoOp { @@ -335,7 +488,7 @@ func (suite *StateDBTestSuite) TestSetCode() { func (suite *StateDBTestSuite) TestKeeperSetCode() { addr := tests.GenerateAddress() baseAcc := &authtypes.BaseAccount{Address: sdk.AccAddress(addr.Bytes()).String()} - baseAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx) + baseAcc.AccountNumber = suite.App.AccountKeeper.NextAccountNumber(suite.Ctx, baseAcc) suite.App.AccountKeeper.SetAccount(suite.Ctx, baseAcc) testCases := []struct { @@ -459,7 +612,7 @@ func (suite *StateDBTestSuite) TestSuicide() { code := []byte("code") db := suite.StateDB() // Add code to account - db.SetCode(suite.Address, code) + db.SetCode(suite.Address, code, 0) suite.Require().Equal(code, db.GetCode(suite.Address)) // Add state to account for i := 0; i < 5; i++ { @@ -476,17 +629,17 @@ func (suite *StateDBTestSuite) TestSuicide() { addr2 := crypto.PubkeyToAddress(key.PublicKey) // Add code and state to account 2 - db.SetCode(addr2, code) + db.SetCode(addr2, code, 0) suite.Require().Equal(code, db.GetCode(addr2)) for i := 0; i < 5; i++ { db.SetState(addr2, common.BytesToHash([]byte(fmt.Sprintf("key%d", i))), common.BytesToHash([]byte(fmt.Sprintf("value%d", i)))) } - // Call Suicide - suite.Require().Equal(true, db.Suicide(suite.Address)) + // Call SelfDestruct + db.SelfDestruct(suite.Address) - // Check suicided is marked - suite.Require().Equal(true, db.HasSuicided(suite.Address)) + // Check self destructed is marked + suite.Require().Equal(true, db.HasSelfDestructed(suite.Address)) // Commit state suite.Require().NoError(db.Commit()) @@ -507,7 +660,7 @@ func (suite *StateDBTestSuite) TestSuicide() { // Check code is still present in addr2 and suicided is false suite.Require().NotNil(db.GetCode(addr2)) - suite.Require().Equal(false, db.HasSuicided(addr2)) + suite.Require().Equal(false, db.HasSelfDestructed(addr2)) } func (suite *StateDBTestSuite) TestExist() { @@ -518,8 +671,8 @@ func (suite *StateDBTestSuite) TestExist() { exists bool }{ {"success, account exists", suite.Address, func(vm.StateDB) {}, true}, - {"success, has suicided", suite.Address, func(vmdb vm.StateDB) { - vmdb.Suicide(suite.Address) + {"success, has self destructed", suite.Address, func(vmdb vm.StateDB) { + vmdb.SelfDestruct(suite.Address) }, true}, {"success, account doesn't exist", tests.GenerateAddress(), func(vm.StateDB) {}, false}, } @@ -545,7 +698,9 @@ func (suite *StateDBTestSuite) TestEmpty() { { "not empty, positive balance", suite.Address, - func(vmdb vm.StateDB) { vmdb.AddBalance(suite.Address, big.NewInt(100)) }, + func(vmdb vm.StateDB) { + vmdb.AddBalance(suite.Address, uint256.NewInt(100), tracing.BalanceChangeTransfer) + }, false, }, {"empty, account doesn't exist", tests.GenerateAddress(), func(vm.StateDB) {}, true}, @@ -808,44 +963,73 @@ func (suite *StateDBTestSuite) _TestForEachStorage() { } } -func (suite *StateDBTestSuite) TestSetBalance() { - amount := big.NewInt(-10) +func (suite *StateDBTestSuite) TestKeeperAddBalance() { + amount := uint256.NewInt(10) + coin := sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) testCases := []struct { name string addr common.Address malleate func() - expErr bool }{ { - "address without funds - invalid amount", - suite.Address, - func() {}, - true, - }, - { - "mint to address", + "add balance", suite.Address, func() { - amount = big.NewInt(100) + amount = uint256.NewInt(100) + coin = sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) }, - false, }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + tc.malleate() + prevBalanceExpected := suite.App.EvmKeeper.GetBalance(suite.Ctx, sdk.AccAddress(tc.addr.Bytes()), coin.Denom) + prevResult, err := suite.App.EvmKeeper.AddBalance(suite.Ctx, sdk.AccAddress(tc.addr.Bytes()), coin) + suite.Require().NoError(err) + + suite.Require().Equal(prevBalanceExpected.ToBig(), prevResult.ToBig()) + + balanceResult := suite.App.EvmKeeper.GetBalance(suite.Ctx, sdk.AccAddress(tc.addr.Bytes()), coin.Denom) + newBalanceExpected := new(uint256.Int).Add(&prevBalanceExpected, amount) + suite.Require().Equal(newBalanceExpected.Uint64(), balanceResult.Uint64()) + }) + } +} + +func (suite *StateDBTestSuite) TestKeeperSubBalance() { + amount := uint256.NewInt(10) + coin := sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) + + testCases := []struct { + name string + addr common.Address + expErr bool + malleate func() + }{ { - "burn from address", + "sub balance", suite.Address, + false, func() { - amount = big.NewInt(60) + amount = uint256.NewInt(100) + coin = sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) + + // fund account by minting coins + suite.App.BankKeeper.MintCoins(suite.Ctx, types.ModuleName, sdk.NewCoins(coin)) + suite.App.BankKeeper.SendCoinsFromModuleToAccount(suite.Ctx, types.ModuleName, sdk.AccAddress(suite.Address.Bytes()), sdk.NewCoins(coin)) }, - false, }, { - "address with funds - invalid amount", + "sub balance, insufficient balance", suite.Address, + true, func() { - amount = big.NewInt(-10) + amount = uint256.NewInt(100) + coin = sdk.NewCoin(types.DefaultEVMDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) }, - true, }, } @@ -853,18 +1037,58 @@ func (suite *StateDBTestSuite) TestSetBalance() { suite.Run(tc.name, func() { suite.SetupTest() tc.malleate() - err := suite.App.EvmKeeper.SetBalance(suite.Ctx, tc.addr, amount, types.DefaultEVMDenom) + prevBalanceExpected := suite.App.EvmKeeper.GetBalance(suite.Ctx, sdk.AccAddress(tc.addr.Bytes()), coin.Denom) + prevResult, err := suite.App.EvmKeeper.SubBalance(suite.Ctx, sdk.AccAddress(tc.addr.Bytes()), coin) if tc.expErr { suite.Require().Error(err) } else { - balance := suite.App.EvmKeeper.GetEVMDenomBalance(suite.Ctx, tc.addr) suite.Require().NoError(err) - suite.Require().Equal(amount, balance) + suite.Require().Equal(prevBalanceExpected.ToBig(), prevResult.ToBig()) + + balanceResult := suite.App.EvmKeeper.GetBalance(suite.Ctx, sdk.AccAddress(tc.addr.Bytes()), coin.Denom) + newBalanceExpected := new(uint256.Int).Sub(&prevBalanceExpected, amount) + suite.Require().Equal(newBalanceExpected.Uint64(), balanceResult.Uint64()) } }) } } +func (suite *StateDBTestSuite) TestSetBalance() { + amount := uint256.NewInt(10) + + testCases := []struct { + name string + addr common.Address + malleate func() + }{ + { + "mint to address", + suite.Address, + func() { + amount = uint256.NewInt(100) + }, + }, + { + "burn from address", + suite.Address, + func() { + amount = uint256.NewInt(60) + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + suite.SetupTest() + tc.malleate() + err := suite.App.EvmKeeper.SetBalance(suite.Ctx, tc.addr, *amount, types.DefaultEVMDenom) + suite.Require().NoError(err) + balance := suite.App.EvmKeeper.GetEVMDenomBalance(suite.Ctx, tc.addr) + suite.Require().Equal(amount.Uint64(), balance.Uint64()) + }) + } +} + func (suite *StateDBTestSuite) TestDeleteAccount() { supply := big.NewInt(100) testCases := []struct { @@ -909,7 +1133,7 @@ func (suite *StateDBTestSuite) TestDeleteAccount() { } else { suite.Require().NoError(err) balance := suite.App.EvmKeeper.GetEVMDenomBalance(suite.Ctx, tc.addr()) - suite.Require().Equal(new(big.Int), balance) + suite.Require().Equal(uint64(0), balance.Uint64()) } }) } diff --git a/x/evm/keeper/utils.go b/x/evm/keeper/utils.go index d2b1257692..2a03d9a415 100644 --- a/x/evm/keeper/utils.go +++ b/x/evm/keeper/utils.go @@ -21,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" @@ -30,9 +31,30 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/types" ) +// debugTraceGasPrice returns the effective gas price used by debug tracing. +// It follows the same effective-price rule as ante handling. +func debugTraceGasPrice(msg *core.Message, baseFee *big.Int) *big.Int { + gasPrice := new(big.Int) + if msg.GasPrice != nil { + gasPrice.Set(msg.GasPrice) + } + if baseFee != nil && msg.GasFeeCap != nil && msg.GasTipCap != nil { + gasPrice = ethermint.BigMin(new(big.Int).Add(msg.GasTipCap, baseFee), msg.GasFeeCap) + } + return gasPrice +} + +// debugTraceFeeAmount returns the gas fee charged up front during debug tracing. +// It matches the ante handler: effective gas price multiplied by gas limit. +func debugTraceFeeAmount(msg *core.Message, baseFee *big.Int) *big.Int { + gasPrice := debugTraceGasPrice(msg, baseFee) + return new(big.Int).Mul(gasPrice, new(big.Int).SetUint64(msg.GasLimit)) +} + // GetCoinbaseAddress returns the block proposer's validator operator address. func (k Keeper) GetCoinbaseAddress(ctx sdk.Context) (common.Address, error) { proposerAddress := sdk.ConsAddress(ctx.BlockHeader().ProposerAddress) @@ -97,7 +119,7 @@ func VerifyFee( msg *types.MsgEthereumTx, denom string, baseFee *big.Int, - homestead, istanbul, shanghai, isCheckTx bool, + rules params.Rules, isCheckTx bool, ) (sdk.Coins, error) { tx := msg.AsTransaction() isContractCreation := tx.To() == nil @@ -105,12 +127,20 @@ func VerifyFee( gasLimit := tx.Gas() accessList := tx.AccessList() - intrinsicGas, err := core.IntrinsicGas(tx.Data(), accessList, isContractCreation, homestead, istanbul, shanghai) + intrinsicGas, err := core.IntrinsicGas( + tx.Data(), + accessList, + tx.SetCodeAuthorizations(), + isContractCreation, + rules.IsHomestead, + rules.IsIstanbul, + rules.IsShanghai, + ) if err != nil { return nil, errorsmod.Wrapf( err, "failed to retrieve intrinsic gas, contract creation = %t; homestead = %t, istanbul = %t, shanghai = %t", - isContractCreation, homestead, istanbul, shanghai, + isContractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai, ) } @@ -122,6 +152,17 @@ func VerifyFee( ) } + // Gas limit suffices for the floor data cost (EIP-7623) + if rules.IsPrague { + floorDataGas, err := core.FloorDataGas(tx.Data()) + if err != nil { + return nil, err + } + if gasLimit < floorDataGas { + return nil, errorsmod.Wrapf(core.ErrFloorDataGas, "gas %v, minimum needed %v", tx.Gas(), floorDataGas) + } + } + if baseFee != nil && tx.GasFeeCap().Cmp(baseFee) < 0 { return nil, errorsmod.Wrapf(errortypes.ErrInsufficientFee, "the tx gasfeecap is lower than the tx baseFee: %s (gasfeecap), %s (basefee) ", @@ -169,7 +210,7 @@ func DeductFees(bankKeeper types.BankKeeper, ctx sdk.Context, acc sdk.AccountI, } if ctx.BlockHeight() > 0 { if err := bankKeeper.SendCoinsFromAccountToModuleVirtual(ctx, acc.GetAddress(), authtypes.FeeCollectorName, fees); err != nil { - return errorsmod.Wrapf(errortypes.ErrInsufficientFunds, err.Error()) + return errorsmod.Wrap(errortypes.ErrInsufficientFunds, err.Error()) } } return nil diff --git a/x/evm/keeper/utils_test.go b/x/evm/keeper/utils_test.go index d2199f6bfa..ab51b5feba 100644 --- a/x/evm/keeper/utils_test.go +++ b/x/evm/keeper/utils_test.go @@ -7,13 +7,16 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ethparams "github.com/ethereum/go-ethereum/params" - "github.com/evmos/ethermint/app" + "github.com/evmos/ethermint/evmd" "github.com/evmos/ethermint/testutil" "github.com/evmos/ethermint/x/evm/keeper" evmtypes "github.com/evmos/ethermint/x/evm/types" feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" + "github.com/holiman/uint256" "github.com/stretchr/testify/suite" ) @@ -30,7 +33,7 @@ func TestUtilsTestSuite(t *testing.T) { func (suite *UtilsTestSuite) SetupTest() { t := suite.T() - suite.BaseTestSuiteWithAccount.SetupTestWithCb(t, func(app *app.EthermintApp, genesis app.GenesisState) app.GenesisState { + suite.BaseTestSuiteWithAccount.SetupTestWithCb(t, func(app *evmd.EthermintApp, genesis evmd.GenesisState) evmd.GenesisState { feemarketGenesis := feemarkettypes.DefaultGenesisState() if suite.enableFeemarket { feemarketGenesis.Params.EnableHeight = 1 @@ -238,8 +241,8 @@ func (suite *UtilsTestSuite) TestCheckSenderBalance() { suite.Run(tc.name, func() { suite.SetupTest() vmdb := suite.StateDB() - vmdb.AddBalance(suite.Address, hundredInt.BigInt()) - suite.Require().Equal(vmdb.GetBalance(suite.Address), hundredInt.BigInt()) + vmdb.AddBalance(suite.Address, uint256.MustFromBig(hundredInt.BigInt()), tracing.BalanceChangeTransfer) + suite.Require().Equal(vmdb.GetBalance(suite.Address).Uint64(), hundredInt.BigInt().Uint64()) err := vmdb.Commit() suite.Require().NoError(err, "Unexpected error while committing to vmdb: %d", err) to := common.HexToAddress(tc.from) @@ -478,17 +481,17 @@ func (suite *UtilsTestSuite) TestVerifyFeeAndDeductTxCostsFromUserBalance() { } else { gasTipCap = tc.gasTipCap } - vmdb.AddBalance(suite.Address, initBalance.BigInt()) + vmdb.AddBalance(suite.Address, uint256.MustFromBig(initBalance.BigInt()), tracing.BalanceChangeTransfer) balance := vmdb.GetBalance(suite.Address) - suite.Require().Equal(balance, initBalance.BigInt()) + suite.Require().Equal(balance.Uint64(), initBalance.BigInt().Uint64()) } else { if tc.gasPrice != nil { gasPrice = tc.gasPrice.BigInt() } - vmdb.AddBalance(suite.Address, hundredInt.BigInt()) + vmdb.AddBalance(suite.Address, uint256.MustFromBig(hundredInt.BigInt()), tracing.BalanceChangeTransfer) balance := vmdb.GetBalance(suite.Address) - suite.Require().Equal(balance, hundredInt.BigInt()) + suite.Require().Equal(balance.Uint64(), hundredInt.BigInt().Uint64()) } err := vmdb.Commit() suite.Require().NoError(err, "Unexpected error while committing to vmdb: %d", err) @@ -501,7 +504,12 @@ func (suite *UtilsTestSuite) TestVerifyFeeAndDeductTxCostsFromUserBalance() { baseFee := suite.App.EvmKeeper.GetBaseFee(suite.Ctx, ethCfg) priority := evmtypes.GetTxPriority(tx, baseFee) - fees, err := keeper.VerifyFee(tx, evmtypes.DefaultEVMDenom, baseFee, false, false, false, suite.Ctx.IsCheckTx()) + rules := params.Rules{ + IsHomestead: false, + IsIstanbul: false, + IsShanghai: false, + } + fees, err := keeper.VerifyFee(tx, evmtypes.DefaultEVMDenom, baseFee, rules, suite.Ctx.IsCheckTx()) if tc.expectPassVerify { suite.Require().NoError(err, "valid test %d failed - '%s'", i, tc.name) if tc.enableFeemarket { diff --git a/x/evm/migrations/v4/migrate.go b/x/evm/migrations/v4/migrate.go index 281b9845de..6074fcb16d 100644 --- a/x/evm/migrations/v4/migrate.go +++ b/x/evm/migrations/v4/migrate.go @@ -1,8 +1,8 @@ package v4 import ( - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" v0types "github.com/evmos/ethermint/x/evm/migrations/v0/types" diff --git a/x/evm/migrations/v4/types/params_v4.pb.go b/x/evm/migrations/v4/types/params_v4.pb.go index 3b7e32580b..3a93df5dd6 100644 --- a/x/evm/migrations/v4/types/params_v4.pb.go +++ b/x/evm/migrations/v4/types/params_v4.pb.go @@ -7,10 +7,10 @@ import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + v0types "github.com/evmos/ethermint/x/evm/migrations/v0/types" io "io" math "math" math_bits "math/bits" - v0types "github.com/evmos/ethermint/x/evm/migrations/v0/types" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/evm/migrations/v5/migrate.go b/x/evm/migrations/v5/migrate.go index 145f9552f6..89222b6a7e 100644 --- a/x/evm/migrations/v5/migrate.go +++ b/x/evm/migrations/v5/migrate.go @@ -1,8 +1,8 @@ package v5 import ( - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" v0types "github.com/evmos/ethermint/x/evm/migrations/v0/types" v4types "github.com/evmos/ethermint/x/evm/migrations/v4/types" diff --git a/x/evm/migrations/v6/migrate.go b/x/evm/migrations/v6/migrate.go index aa19859611..24ca5d1c8f 100644 --- a/x/evm/migrations/v6/migrate.go +++ b/x/evm/migrations/v6/migrate.go @@ -2,8 +2,8 @@ package v6 import ( sdkmath "cosmossdk.io/math" - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" v4types "github.com/evmos/ethermint/x/evm/migrations/v4/types" "github.com/evmos/ethermint/x/evm/types" diff --git a/x/evm/migrations/v7/migrate.go b/x/evm/migrations/v7/migrate.go new file mode 100644 index 0000000000..a58eff4312 --- /dev/null +++ b/x/evm/migrations/v7/migrate.go @@ -0,0 +1,32 @@ +package v7 + +import ( + sdkmath "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/ethermint/x/evm/types" +) + +// MigrateStore migrates the x/evm module state from the consensus version 6 to +// version 7. Specifically, it adds CancunTime and PragueTime to the existing +// ChainConfig while preserving the ShanghaiTime from v6 migration. +func MigrateStore( + ctx sdk.Context, + storeKey storetypes.StoreKey, + cdc codec.BinaryCodec, +) error { + var params types.Params + store := ctx.KVStore(storeKey) + bz := store.Get(types.KeyPrefixParams) + cdc.MustUnmarshal(bz, ¶ms) + zeroInt := sdkmath.ZeroInt() + params.ChainConfig.CancunTime = &zeroInt + params.ChainConfig.PragueTime = &zeroInt + if err := params.Validate(); err != nil { + return err + } + bz = cdc.MustMarshal(¶ms) + store.Set(types.KeyPrefixParams, bz) + return nil +} diff --git a/x/evm/migrations/v7/migrate_test.go b/x/evm/migrations/v7/migrate_test.go new file mode 100644 index 0000000000..94d17ce2e2 --- /dev/null +++ b/x/evm/migrations/v7/migrate_test.go @@ -0,0 +1,73 @@ +package v7_test + +import ( + "testing" + + sdkmath "cosmossdk.io/math" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/evmos/ethermint/encoding" + v7 "github.com/evmos/ethermint/x/evm/migrations/v7" + "github.com/evmos/ethermint/x/evm/types" + "github.com/stretchr/testify/require" +) + +func TestMigrateStore(t *testing.T) { + encCfg := encoding.MakeConfig() + cdc := encCfg.Codec + + storeKey := storetypes.NewKVStoreKey(types.ModuleName) + tKey := storetypes.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(storeKey, tKey) + kvStore := ctx.KVStore(storeKey) + + shanghaiTime := sdkmath.ZeroInt() + v6Params := types.DefaultParams() + v6Params.ChainConfig.ShanghaiTime = &shanghaiTime + v6Params.ChainConfig.CancunTime = nil + v6Params.ChainConfig.PragueTime = nil + + v6ParamsBz := cdc.MustMarshal(&v6Params) + kvStore.Set(types.KeyPrefixParams, v6ParamsBz) + + require.NoError(t, v7.MigrateStore(ctx, storeKey, cdc)) + + migratedParamsBz := kvStore.Get(types.KeyPrefixParams) + require.NotNil(t, migratedParamsBz) + + var migratedParams types.Params + cdc.MustUnmarshal(migratedParamsBz, &migratedParams) + + require.NotNil(t, migratedParams.ChainConfig.ShanghaiTime) + require.Equal(t, shanghaiTime, *migratedParams.ChainConfig.ShanghaiTime) + + require.NotNil(t, migratedParams.ChainConfig.CancunTime) + require.Equal(t, sdkmath.ZeroInt(), *migratedParams.ChainConfig.CancunTime) + + require.NotNil(t, migratedParams.ChainConfig.PragueTime) + require.Equal(t, sdkmath.ZeroInt(), *migratedParams.ChainConfig.PragueTime) + + require.Equal(t, v6Params.EvmDenom, migratedParams.EvmDenom) + require.Equal(t, v6Params.EnableCreate, migratedParams.EnableCreate) + require.Equal(t, v6Params.EnableCall, migratedParams.EnableCall) + require.Equal(t, v6Params.AllowUnprotectedTxs, migratedParams.AllowUnprotectedTxs) + require.Equal(t, v6Params.ExtraEIPs, migratedParams.ExtraEIPs) + + require.Equal(t, v6Params.ChainConfig.HomesteadBlock, migratedParams.ChainConfig.HomesteadBlock) + require.Equal(t, v6Params.ChainConfig.BerlinBlock, migratedParams.ChainConfig.BerlinBlock) + require.Equal(t, v6Params.ChainConfig.LondonBlock, migratedParams.ChainConfig.LondonBlock) + + require.NoError(t, migratedParams.Validate()) +} + +func TestMigrateStoreEmptyStore(t *testing.T) { + encCfg := encoding.MakeConfig() + cdc := encCfg.Codec + + storeKey := storetypes.NewKVStoreKey(types.ModuleName) + tKey := storetypes.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(storeKey, tKey) + + err := v7.MigrateStore(ctx, storeKey, cdc) + require.Error(t, err) +} diff --git a/x/evm/migrations/v8/migrate.go b/x/evm/migrations/v8/migrate.go new file mode 100644 index 0000000000..e44bc034f6 --- /dev/null +++ b/x/evm/migrations/v8/migrate.go @@ -0,0 +1,31 @@ +package v8 + +import ( + sdkmath "cosmossdk.io/math" + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/ethermint/x/evm/types" +) + +// MigrateStore migrates the x/evm module state from consensus version 7 to +// version 8. Specifically, it adds OsakaTime to the existing ChainConfig. +func MigrateStore( + ctx sdk.Context, + storeKey storetypes.StoreKey, + cdc codec.BinaryCodec, +) error { + var params types.Params + store := ctx.KVStore(storeKey) + bz := store.Get(types.KeyPrefixParams) + cdc.MustUnmarshal(bz, ¶ms) + + zeroInt := sdkmath.ZeroInt() + params.ChainConfig.OsakaTime = &zeroInt + if err := params.Validate(); err != nil { + return err + } + bz = cdc.MustMarshal(¶ms) + store.Set(types.KeyPrefixParams, bz) + return nil +} diff --git a/x/evm/migrations/v8/migrate_test.go b/x/evm/migrations/v8/migrate_test.go new file mode 100644 index 0000000000..cd009f7e71 --- /dev/null +++ b/x/evm/migrations/v8/migrate_test.go @@ -0,0 +1,77 @@ +package v8_test + +import ( + "math/big" + "testing" + + sdkmath "cosmossdk.io/math" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/evmos/ethermint/encoding" + v8 "github.com/evmos/ethermint/x/evm/migrations/v8" + "github.com/evmos/ethermint/x/evm/types" + "github.com/stretchr/testify/require" +) + +func TestMigrateStore(t *testing.T) { + encCfg := encoding.MakeConfig() + cdc := encCfg.Codec + + storeKey := storetypes.NewKVStoreKey(types.ModuleName) + tKey := storetypes.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(storeKey, tKey) + kvStore := ctx.KVStore(storeKey) + + shanghaiTime := sdkmath.ZeroInt() + cancunTime := sdkmath.ZeroInt() + pragueTime := sdkmath.ZeroInt() + v7Params := types.DefaultParams() + v7Params.ChainConfig.ShanghaiTime = &shanghaiTime + v7Params.ChainConfig.CancunTime = &cancunTime + v7Params.ChainConfig.PragueTime = &pragueTime + v7Params.ChainConfig.OsakaTime = nil + + v7ParamsBz := cdc.MustMarshal(&v7Params) + kvStore.Set(types.KeyPrefixParams, v7ParamsBz) + + require.NoError(t, v8.MigrateStore(ctx, storeKey, cdc)) + + migratedParamsBz := kvStore.Get(types.KeyPrefixParams) + require.NotNil(t, migratedParamsBz) + + var migratedParams types.Params + cdc.MustUnmarshal(migratedParamsBz, &migratedParams) + + require.NotNil(t, migratedParams.ChainConfig.ShanghaiTime) + require.Equal(t, shanghaiTime, *migratedParams.ChainConfig.ShanghaiTime) + + require.NotNil(t, migratedParams.ChainConfig.CancunTime) + require.Equal(t, cancunTime, *migratedParams.ChainConfig.CancunTime) + + require.NotNil(t, migratedParams.ChainConfig.PragueTime) + require.Equal(t, pragueTime, *migratedParams.ChainConfig.PragueTime) + + require.NotNil(t, migratedParams.ChainConfig.OsakaTime) + require.Equal(t, sdkmath.ZeroInt(), *migratedParams.ChainConfig.OsakaTime) + require.True(t, migratedParams.ChainConfig.EthereumConfig(big.NewInt(1)).IsOsaka(big.NewInt(0), 0)) + + require.Equal(t, v7Params.EvmDenom, migratedParams.EvmDenom) + require.Equal(t, v7Params.EnableCreate, migratedParams.EnableCreate) + require.Equal(t, v7Params.EnableCall, migratedParams.EnableCall) + require.Equal(t, v7Params.AllowUnprotectedTxs, migratedParams.AllowUnprotectedTxs) + require.Equal(t, v7Params.ExtraEIPs, migratedParams.ExtraEIPs) + + require.NoError(t, migratedParams.Validate()) +} + +func TestMigrateStoreEmptyStore(t *testing.T) { + encCfg := encoding.MakeConfig() + cdc := encCfg.Codec + + storeKey := storetypes.NewKVStoreKey(types.ModuleName) + tKey := storetypes.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(storeKey, tKey) + + err := v8.MigrateStore(ctx, storeKey, cdc) + require.Error(t, err) +} diff --git a/x/evm/module.go b/x/evm/module.go index d9fb76f98f..64522a1ed2 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -21,12 +21,9 @@ import ( "fmt" "cosmossdk.io/core/appmodule" - "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -41,11 +38,13 @@ import ( ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} - - _ appmodule.HasEndBlocker = AppModule{} - _ appmodule.HasBeginBlocker = AppModule{} + _ module.AppModuleSimulation = (*AppModule)(nil) + _ module.HasGenesis = AppModule{} + _ module.HasServices = (*AppModule)(nil) + _ appmodule.AppModule = (*AppModule)(nil) + _ appmodule.HasEndBlocker = AppModule{} + _ appmodule.HasBeginBlocker = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} ) // AppModuleBasic defines the basic application module used by the evm module. @@ -62,8 +61,8 @@ func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { } // ConsensusVersion returns the consensus state-breaking version for the module. -func (AppModuleBasic) ConsensusVersion() uint64 { - return 6 +func (AppModule) ConsensusVersion() uint64 { + return 8 } // DefaultGenesis returns default genesis state as raw bytes for the evm @@ -82,11 +81,6 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo return genesisState.Validate() } -// RegisterRESTRoutes performs a no-op as the EVM module doesn't expose REST -// endpoints -func (AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) { -} - func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) { if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil { panic(err) @@ -129,16 +123,6 @@ func NewAppModule(k *keeper.Keeper, ak types.AccountKeeper, ss types.Subspace) A } } -// Name returns the evm module's name. -func (AppModule) Name() string { - return types.ModuleName -} - -// RegisterInvariants interface for registering invariants. Performs a no-op -// as the evm module doesn't expose invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) { -} - // RegisterServices registers a GRPC query service to respond to the // module-specific GRPC queries. func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -154,9 +138,18 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { if err := cfg.RegisterMigration(types.ModuleName, 4, m.Migrate4to5); err != nil { panic(err) } + if err := cfg.RegisterMigration(types.ModuleName, 5, m.Migrate5to6); err != nil { panic(err) } + + if err := cfg.RegisterMigration(types.ModuleName, 6, m.Migrate6to7); err != nil { + panic(err) + } + + if err := cfg.RegisterMigration(types.ModuleName, 7, m.Migrate7to8); err != nil { + panic(err) + } } // BeginBlock returns the begin block for the evm module. @@ -172,11 +165,10 @@ func (am AppModule) EndBlock(ctx context.Context) error { // InitGenesis performs genesis initialization for the evm module. It returns // no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) InitGenesis(ctx, am.keeper, am.ak, genesisState) - return []abci.ValidatorUpdate{} } // ExportGenesis returns the exported genesis state as raw bytes for the evm diff --git a/x/evm/simulation/genesis.go b/x/evm/simulation/genesis.go index 21b79c6eb5..d8b68e2823 100644 --- a/x/evm/simulation/genesis.go +++ b/x/evm/simulation/genesis.go @@ -49,7 +49,7 @@ func RandomizedGenState(simState *module.SimulationState) { ) params := types.NewParams(types.DefaultEVMDenom, false, true, true, types.DefaultChainConfig(), extraEIPs) - evmGenesis := types.NewGenesisState(params, []types.GenesisAccount{}) + evmGenesis := types.NewGenesisState(params, []types.GenesisAccount{}, []types.Preinstall{}) bz, err := json.MarshalIndent(evmGenesis, "", " ") if err != nil { diff --git a/x/evm/simulation/operations.go b/x/evm/simulation/operations.go index 89ed26009a..d09603496d 100644 --- a/x/evm/simulation/operations.go +++ b/x/evm/simulation/operations.go @@ -215,7 +215,7 @@ func CreateRandomValidEthTx(ctx *simulateContext, return nil, err } // we suppose that gasLimit should be larger than estimateGas to ensure tx validity - gasLimit := estimateGas + uint64(ctx.rand.Intn(int(sdktx.MaxGasWanted-estimateGas))) + gasLimit := estimateGas + uint64(ctx.rand.Intn(int(sdktx.MaxGasWanted-estimateGas))) //nolint:gosec // test only ethChainID := ctx.keeper.ChainID() chainConfig := ctx.keeper.GetParams(ctx.context).ChainConfig.EthereumConfig(ethChainID) gasPrice := ctx.keeper.GetBaseFee(ctx.context, chainConfig) @@ -256,7 +256,7 @@ func EstimateGas(ctx *simulateContext, from, to *common.Address, data *hexutil.B // Transferable amount is between the range [0, spendable), spendable = balance - gasFeeCap * GasLimit. func RandomTransferableAmount(ctx *simulateContext, address common.Address, estimateGas uint64, gasFeeCap *big.Int) (amount *big.Int, err error) { balance := ctx.keeper.GetEVMDenomBalance(ctx.context, address) - feeLimit := new(big.Int).Mul(gasFeeCap, big.NewInt(int64(estimateGas))) + feeLimit := new(big.Int).Mul(gasFeeCap, big.NewInt(int64(estimateGas))) //nolint:gosec // test only if (feeLimit.Cmp(balance)) > 0 { return nil, ErrNoEnoughBalance } diff --git a/x/evm/spec/01_concepts.md b/x/evm/spec/01_concepts.md index c96162d571..cd841424b9 100644 --- a/x/evm/spec/01_concepts.md +++ b/x/evm/spec/01_concepts.md @@ -6,7 +6,7 @@ order: 1 ## EVM -The Ethereum Virtual Machine (EVM) is a computation engine which can be thought of as one single entity maintained by thousands of connected computers (nodes) running an Ethereum client. As a virtual machine ([VM](https://en.wikipedia.org/wiki/Virtual_machine)), the EVM is responisble for computing changes to the state deterministically regardless of its environment (hardware and OS). This means that every node has to get the exact same result given an identical starting state and transaction (tx). +The Ethereum Virtual Machine (EVM) is a computation engine which can be thought of as one single entity maintained by thousands of connected computers (nodes) running an Ethereum client. As a virtual machine ([VM](https://en.wikipedia.org/wiki/Virtual_machine)), the EVM is responsible for computing changes to the state deterministically regardless of its environment (hardware and OS). This means that every node has to get the exact same result given an identical starting state and transaction (tx). The EVM is considered to be the part of the Ethereum protocol that handles the deployment and execution of [smart contracts](https://ethereum.org/en/developers/docs/smart-contracts/). To make a clear distinction: @@ -17,7 +17,7 @@ The `x/evm` module implements the EVM as a Cosmos SDK module. It allows users to ### State -The Ethereum state is a data structure, implemented as a [Merkle Patricia Trie](https://en.wikipedia.org/wiki/Merkle_tree), that keeps all accounts on the chain. The EVM makes changes to this data structure resulting in a new state with a different State Root. Ethereum can therefore be seen as a state chain that transitions from one state to another by executing transations in a block using the EVM. A new block of txs can be described through its Block header (parent hash, block number, time stamp, nonce, receipts,...). +The Ethereum state is a data structure, implemented as a [Merkle Patricia Trie](https://en.wikipedia.org/wiki/Merkle_tree), that keeps all accounts on the chain. The EVM makes changes to this data structure resulting in a new state with a different State Root. Ethereum can therefore be seen as a state chain that transitions from one state to another by executing transactions in a block using the EVM. A new block of txs can be described through its Block header (parent hash, block number, time stamp, nonce, receipts,...). ### Accounts diff --git a/x/evm/statedb/interfaces.go b/x/evm/statedb/interfaces.go index ff64d083a0..b9bd61c682 100644 --- a/x/evm/statedb/interfaces.go +++ b/x/evm/statedb/interfaces.go @@ -16,11 +16,10 @@ package statedb import ( - "math/big" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" ) // Keeper provide underlying storage of StateDB @@ -28,10 +27,10 @@ type Keeper interface { GetParams(sdk.Context) evmtypes.Params Transfer(ctx sdk.Context, sender, recipient sdk.AccAddress, coins sdk.Coins) error - AddBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error - SubBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error - SetBalance(ctx sdk.Context, addr common.Address, amount *big.Int, denom string) error - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) *big.Int + AddBalance(ctx sdk.Context, addr sdk.AccAddress, coin sdk.Coin) (uint256.Int, error) + SubBalance(ctx sdk.Context, addr sdk.AccAddress, coin sdk.Coin) (uint256.Int, error) + SetBalance(ctx sdk.Context, addr common.Address, amount uint256.Int, denom string) error + GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) uint256.Int // Read methods GetAccount(ctx sdk.Context, addr common.Address) *Account diff --git a/x/evm/statedb/journal.go b/x/evm/statedb/journal.go index 91f1a93763..8455977022 100644 --- a/x/evm/statedb/journal.go +++ b/x/evm/statedb/journal.go @@ -21,6 +21,7 @@ import ( "sort" "github.com/ethereum/go-ethereum/common" + "github.com/holiman/uint256" ) // JournalEntry is a modification entry in the state change journal that can be @@ -57,7 +58,7 @@ func (j *journal) sortedDirties() []common.Address { i++ } sort.Slice(keys, func(i, j int) bool { - return bytes.Compare(keys[i].Bytes(), keys[j].Bytes()) < 0 + return bytes.Compare(keys[i][:], keys[j][:]) < 0 }) return keys } @@ -97,12 +98,19 @@ type ( createObjectChange struct { account *common.Address } + // createContractChange represents an account becoming a contract-account. + // This event happens prior to executing initcode. The journal-event simply + // manages the created-flag, in order to allow same-tx destruction. + createContractChange struct { + account *common.Address + } resetObjectChange struct { prev *stateObject } - suicideChange struct { - account *common.Address - prev bool // whether account had already suicided + selfDestructChange struct { + account *common.Address + prev bool // whether account had already self-destructed + prevbalance *uint256.Int } nonceChange struct { @@ -139,6 +147,28 @@ type ( } ) +var ( + _ JournalEntry = createObjectChange{} + _ JournalEntry = resetObjectChange{} + _ JournalEntry = selfDestructChange{} + _ JournalEntry = nonceChange{} + _ JournalEntry = storageChange{} + _ JournalEntry = transientStorageChange{} + _ JournalEntry = codeChange{} + _ JournalEntry = refundChange{} + _ JournalEntry = addLogChange{} + _ JournalEntry = accessListAddAccountChange{} + _ JournalEntry = accessListAddSlotChange{} +) + +func (ch createContractChange) Revert(s *StateDB) { + s.getStateObject(*ch.account).newContract = false +} + +func (ch createContractChange) Dirtied() *common.Address { + return nil +} + func (ch createObjectChange) Revert(s *StateDB) { delete(s.stateObjects, *ch.account) } @@ -155,14 +185,14 @@ func (ch resetObjectChange) Dirtied() *common.Address { return nil } -func (ch suicideChange) Revert(s *StateDB) { +func (ch selfDestructChange) Revert(s *StateDB) { obj := s.getStateObject(*ch.account) if obj != nil { - obj.suicided = ch.prev + obj.selfDestructed = ch.prev } } -func (ch suicideChange) Dirtied() *common.Address { +func (ch selfDestructChange) Dirtied() *common.Address { return ch.account } diff --git a/x/evm/statedb/native.go b/x/evm/statedb/native.go index 35cde15cf7..ce741f654b 100644 --- a/x/evm/statedb/native.go +++ b/x/evm/statedb/native.go @@ -1,15 +1,16 @@ package statedb import ( - "cosmossdk.io/store/cachemulti" + "github.com/cosmos/cosmos-sdk/store/v2/cachemulti" "github.com/ethereum/go-ethereum/common" ) var _ JournalEntry = nativeChange{} type nativeChange struct { - snapshot cachemulti.Store - events int + previousStore cachemulti.Store + previousLayerCount int + events int } func (native nativeChange) Dirtied() *common.Address { @@ -17,6 +18,6 @@ func (native nativeChange) Dirtied() *common.Address { } func (native nativeChange) Revert(s *StateDB) { - s.revertNativeStateToSnapshot(native.snapshot) + s.restoreNativeState(native.previousStore, native.previousLayerCount) s.nativeEvents = s.nativeEvents[:len(s.nativeEvents)-native.events] } diff --git a/x/evm/statedb/sorted_keys_test.go b/x/evm/statedb/sorted_keys_test.go new file mode 100644 index 0000000000..5d9283b424 --- /dev/null +++ b/x/evm/statedb/sorted_keys_test.go @@ -0,0 +1,81 @@ +package statedb + +import ( + "bytes" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestStorageSortedKeys(t *testing.T) { + t.Run("empty storage", func(t *testing.T) { + s := make(Storage) + keys := s.SortedKeys() + require.Empty(t, keys) + }) + + t.Run("single entry", func(t *testing.T) { + s := make(Storage) + h := common.HexToHash("0x01") + s[h] = common.HexToHash("0xff") + keys := s.SortedKeys() + require.Len(t, keys, 1) + require.Equal(t, h, keys[0]) + }) + + t.Run("multiple entries are sorted", func(t *testing.T) { + s := make(Storage) + h1 := common.HexToHash("0x03") + h2 := common.HexToHash("0x01") + h3 := common.HexToHash("0x02") + s[h1] = common.Hash{} + s[h2] = common.Hash{} + s[h3] = common.Hash{} + + keys := s.SortedKeys() + require.Len(t, keys, 3) + // Verify sorted order + for i := 1; i < len(keys); i++ { + require.True(t, bytes.Compare(keys[i-1][:], keys[i][:]) < 0, + "keys should be in ascending order: %x >= %x", keys[i-1], keys[i]) + } + }) + + t.Run("deterministic across calls", func(t *testing.T) { + s := make(Storage) + for i := 0; i < 20; i++ { + h := common.BigToHash(big.NewInt(int64(i * 7 % 20))) + s[h] = common.Hash{} + } + keys1 := s.SortedKeys() + keys2 := s.SortedKeys() + require.Equal(t, keys1, keys2) + }) +} + +func TestJournalSortedDirties(t *testing.T) { + t.Run("empty journal", func(t *testing.T) { + j := newJournal() + keys := j.sortedDirties() + require.Empty(t, keys) + }) + + t.Run("multiple dirties are sorted", func(t *testing.T) { + j := newJournal() + a1 := common.HexToAddress("0x03") + a2 := common.HexToAddress("0x01") + a3 := common.HexToAddress("0x02") + j.dirties[a1] = 1 + j.dirties[a2] = 1 + j.dirties[a3] = 1 + + keys := j.sortedDirties() + require.Len(t, keys, 3) + for i := 1; i < len(keys); i++ { + require.True(t, bytes.Compare(keys[i-1][:], keys[i][:]) < 0, + "addresses should be in ascending order: %x >= %x", keys[i-1], keys[i]) + } + }) +} diff --git a/x/evm/statedb/state_object.go b/x/evm/statedb/state_object.go index a9cffe6525..135efd9cc6 100644 --- a/x/evm/statedb/state_object.go +++ b/x/evm/statedb/state_object.go @@ -19,8 +19,11 @@ import ( "bytes" "sort" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + ethermint "github.com/evmos/ethermint/types" + "github.com/holiman/uint256" ) var emptyCodeHash = crypto.Keccak256(nil) @@ -39,6 +42,18 @@ func NewEmptyAccount() *Account { } } +// NewAccountFromSdkAccount extracts the nonce and code hash from the provided SDK account. +func NewAccountFromSdkAccount(acct sdk.AccountI) *Account { + acc := NewEmptyAccount() + acc.Nonce = acct.GetSequence() + + if ethAcct, ok := acct.(ethermint.EthAccountI); ok { + acc.CodeHash = ethAcct.GetCodeHash().Bytes() + } + + return acc +} + // IsContract returns if the account contains contract code. func (acct Account) IsContract() bool { return !bytes.Equal(acct.CodeHash, emptyCodeHash) @@ -56,7 +71,7 @@ func (s Storage) SortedKeys() []common.Hash { i++ } sort.Slice(keys, func(i, j int) bool { - return bytes.Compare(keys[i].Bytes(), keys[j].Bytes()) < 0 + return bytes.Compare(keys[i][:], keys[j][:]) < 0 }) return keys } @@ -81,7 +96,8 @@ type stateObject struct { address common.Address // flags - suicided bool + selfDestructed bool + newContract bool } // newObject creates a state object, origAccount is nil if it's newly created. @@ -117,8 +133,8 @@ func (s *stateObject) empty() bool { return s.account.Nonce == 0 && bytes.Equal(s.account.CodeHash, emptyCodeHash) } -func (s *stateObject) markSuicided() { - s.suicided = true +func (s *stateObject) markSelfDestructed() { + s.selfDestructed = true } // @@ -183,6 +199,11 @@ func (s *stateObject) CodeHash() []byte { return s.account.CodeHash } +// Balance returns the balance of account +func (s *stateObject) Balance() *uint256.Int { + return s.db.GetBalance(s.address) +} + // Nonce returns the nonce of account func (s *stateObject) Nonce() uint64 { return s.account.Nonce @@ -215,11 +236,12 @@ func (s *stateObject) GetState(key common.Hash) common.Hash { } // SetState sets the contract state -func (s *stateObject) SetState(key common.Hash, value common.Hash) { +// It returns the previous value +func (s *stateObject) SetState(key common.Hash, value common.Hash) common.Hash { // If the new value is the same as old, don't set prev := s.GetState(key) if prev == value { - return + return prev } // New value is different, update and journal the change s.db.journal.append(storageChange{ @@ -228,6 +250,7 @@ func (s *stateObject) SetState(key common.Hash, value common.Hash) { prevalue: prev, }) s.setState(key, value) + return prev } func (s *stateObject) SetStorage(storage Storage) { diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index b5f3caf027..9846b54914 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -16,21 +16,33 @@ package statedb import ( + "errors" "fmt" - "math/big" + "slices" "sort" errorsmod "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" - "cosmossdk.io/store/cachemulti" + "github.com/cosmos/cosmos-sdk/store/v2/cachemulti" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/stateless" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-ethereum/trie/utils" + "github.com/holiman/uint256" ) +// ErrStateConflict is returned by Commit() when an EVM-dirty storage key was also +// written by a nested native action (via ExecuteNativeAction). It is treated as an +// EVM-level failure (VmError / status=0) rather than a cosmos-level rejection. +var ErrStateConflict = errors.New("state conflict") + const StateDBContextKey = "statedb" type EventConverter = func(sdk.Event) (*ethtypes.Log, error) @@ -43,8 +55,15 @@ type revision struct { journalIndex int } -func Transfer(db vm.StateDB, sender, recipient common.Address, amount *big.Int) { - db.(*StateDB).Transfer(sender, recipient, amount) +func Transfer(db vm.StateDB, sender, recipient common.Address, amount *uint256.Int) { + switch stateDB := db.(type) { + case *StateDB: + stateDB.Transfer(sender, recipient, amount) + case *HookedStateDB: + stateDB.Transfer(sender, recipient, amount) + default: + panic(fmt.Sprintf("unsupported StateDB type: %T", db)) + } } var _ vm.StateDB = &StateDB{} @@ -60,14 +79,10 @@ type StateDB struct { origCtx sdk.Context // ctx is a branched context on top of the caller context ctx sdk.Context - // cacheMS caches the `ctx.MultiStore()` to avoid type assertions all the time, `ctx.MultiStore()` is not modified during the whole time, - // which is evident by `ctx.WithMultiStore` is not called after statedb constructed. + // cacheMS is the active cache multistore branch (nested by ExecuteNativeAction via CacheMultiStore). cacheMS cachemulti.Store - - // the action to commit native state, there are two cases: - // if the parent store is not `cachemulti.Store`, we create a new one, and call `Write` to commit, this could only happen in unit tests. - // if the parent store is already a `cachemulti.Store`, we branch it and call `Restore` to commit. - commitMS func() + // cacheLayers is the stack of branches (root first); flushed on Commit, truncated on native revert. + cacheLayers []cachemulti.Store // Journal of state modifications. This is the backbone of // Snapshot and RevertToSnapshot. @@ -95,8 +110,9 @@ type StateDB struct { nativeEvents sdk.Events // handle balances natively - evmDenom string - err error + evmDenom string + err error + committed bool } // New creates a new state from a given trie. @@ -105,28 +121,26 @@ func New(ctx sdk.Context, keeper Keeper, txConfig TxConfig) *StateDB { } func NewWithParams(ctx sdk.Context, keeper Keeper, txConfig TxConfig, evmDenom string) *StateDB { - var ( - cacheMS cachemulti.Store - commitMS func() - ) + // Branch the parent multistore. In unit tests the multistore may be uncached, so fall back to CacheWrap. + var branched any if parentCacheMS, ok := ctx.MultiStore().(cachemulti.Store); ok { - cacheMS = parentCacheMS.Clone() - commitMS = func() { parentCacheMS.Restore(cacheMS) } + branched = parentCacheMS.CacheMultiStore() } else { - // in unit test, it could be run with a uncached multistore - if cacheMS, ok = ctx.MultiStore().CacheWrap().(cachemulti.Store); !ok { - panic("expect the CacheWrap result to be cachemulti.Store") - } - commitMS = cacheMS.Write + branched = ctx.MultiStore().CacheWrap() + } + cacheMS, ok := branched.(cachemulti.Store) + if !ok { + panic("expect branched multistore to be cachemulti.Store") } db := &StateDB{ - origCtx: ctx, - keeper: keeper, - cacheMS: cacheMS, - commitMS: commitMS, - stateObjects: make(map[common.Address]*stateObject), - journal: newJournal(), - accessList: newAccessList(), + origCtx: ctx, + keeper: keeper, + cacheMS: cacheMS, + cacheLayers: []cachemulti.Store{cacheMS}, + stateObjects: make(map[common.Address]*stateObject), + journal: newJournal(), + accessList: newAccessList(), + transientStorage: newTransientStorage(), txConfig: txConfig, @@ -193,8 +207,9 @@ func (s *StateDB) Empty(addr common.Address) bool { } // GetBalance retrieves the balance from the given address or 0 if object not found -func (s *StateDB) GetBalance(addr common.Address) *big.Int { - return s.keeper.GetBalance(s.ctx, sdk.AccAddress(addr.Bytes()), s.evmDenom) +func (s *StateDB) GetBalance(addr common.Address) *uint256.Int { + balance := s.keeper.GetBalance(s.ctx, sdk.AccAddress(addr.Bytes()), s.evmDenom) + return &balance } // GetNonce returns the nonce of account, 0 if not exists. @@ -252,20 +267,20 @@ func (s *StateDB) GetCommittedState(addr common.Address, hash common.Hash) commo return common.Hash{} } +// GetStateAndCommittedState retrieves current and committed values from the given account's storage trie. +func (s *StateDB) GetStateAndCommittedState(addr common.Address, hash common.Hash) (common.Hash, common.Hash) { + stateObject := s.getStateObject(addr) + if stateObject == nil { + return common.Hash{}, common.Hash{} + } + return stateObject.GetState(hash), stateObject.GetCommittedState(hash) +} + // GetRefund returns the current value of the refund counter. func (s *StateDB) GetRefund() uint64 { return s.refund } -// HasSuicided returns if the contract is suicided in current transaction. -func (s *StateDB) HasSuicided(addr common.Address) bool { - stateObject := s.getStateObject(addr) - if stateObject != nil { - return stateObject.suicided - } - return false -} - // AddPreimage records a SHA3 preimage seen by the VM. // AddPreimage performs a no-op since the EnablePreimageRecording flag is disabled // on the vm.Config during state transitions. No store trie preimages are written @@ -314,20 +329,22 @@ func (s *StateDB) createObject(addr common.Address) *stateObject { return newobj } -// CreateAccount explicitly creates a state object. If a state object with the address -// already exists the balance is carried over to the new account. -// -// CreateAccount is called during the EVM CREATE operation. The situation might arise that -// a contract does the following: -// -// 1. sends funds to sha(account ++ (nonce + 1)) -// 2. tx_create(sha(account ++ nonce)) (note that this gets the address of 1) -// -// Carrying over the balance ensures that Ether doesn't disappear. +// CreateAccount explicitly creates a new state object, assuming that the +// account did not previously exist in the state. If the account already +// exists, this function will silently overwrite it which might lead to a +// consensus bug eventually. func (s *StateDB) CreateAccount(addr common.Address) { s.createObject(addr) } +func (s *StateDB) CreateContract(address common.Address) { + obj := s.getStateObject(address) + if !obj.newContract { + obj.newContract = true + s.journal.append(createContractChange{account: &address}) + } +} + // ForEachStorage iterate the contract storage, the iteration order is not defined. func (s *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error { so := s.getStateObject(addr) @@ -350,33 +367,60 @@ func (s *StateDB) setStateObject(object *stateObject) { s.stateObjects[object.Address()] = object } -func (s *StateDB) snapshotNativeState() cachemulti.Store { - return s.cacheMS.Clone() -} - -func (s *StateDB) revertNativeStateToSnapshot(ms cachemulti.Store) { - s.cacheMS.Restore(ms) -} - // ExecuteNativeAction executes native action in isolate, // the writes will be revert when either the native action itself fail // or the wrapping message call reverted. func (s *StateDB) ExecuteNativeAction(contract common.Address, converter EventConverter, action func(ctx sdk.Context) error) error { - snapshot := s.snapshotNativeState() + prevStore := s.cacheMS + prevLayerCount := len(s.cacheLayers) + + nextStore, ok := s.cacheMS.CacheMultiStore().(cachemulti.Store) + if !ok { + panic("expect nested CacheMultiStore result to be cachemulti.Store") + } + eventManager := sdk.NewEventManager() + actionCtx := s.ctx.WithMultiStore(nextStore).WithEventManager(eventManager) - if err := action(s.ctx.WithEventManager(eventManager)); err != nil { - s.revertNativeStateToSnapshot(snapshot) + if err := action(actionCtx); err != nil { return err } + s.cacheMS = nextStore + s.cacheLayers = append(s.cacheLayers, nextStore) + s.ctx = s.ctx.WithMultiStore(nextStore) + events := eventManager.Events() s.emitNativeEvents(contract, converter, events) s.nativeEvents = s.nativeEvents.AppendEvents(events) - s.journal.append(nativeChange{snapshot: snapshot, events: len(events)}) + s.journal.append(nativeChange{ + previousStore: prevStore, + previousLayerCount: prevLayerCount, + events: len(events), + }) return nil } +func (s *StateDB) restoreNativeState(previousStore cachemulti.Store, previousLayerCount int) { + s.cacheMS = previousStore + s.cacheLayers = s.cacheLayers[:previousLayerCount] + s.ctx = s.ctx.WithMultiStore(previousStore) +} + +// flushNativeCacheLayers writes native action state bottom-up: deepest child layer +// first, up to cacheLayers[0] (the root branch created in NewWithParams). The root's +// Write() propagates into the parent cachemulti.Store that was passed to NewWithParams +// (i.e. ctx.MultiStore() at StateDB init time), NOT into origCtx directly. +// +// EVM-dirty writes in the remainder of Commit() use origCtx, which also targets that +// same parent store — so native and EVM writes both land in the same underlying store, +// just through different paths. +func (s *StateDB) flushNativeCacheLayers() { + for i := len(s.cacheLayers) - 1; i >= 0; i-- { + s.cacheLayers[i].Write() + } +} + // Context returns the current context for query native state in precompiles. func (s *StateDB) Context() sdk.Context { return s.ctx @@ -387,7 +431,7 @@ func (s *StateDB) Context() sdk.Context { */ // Transfer from one account to another -func (s *StateDB) Transfer(sender, recipient common.Address, amount *big.Int) { +func (s *StateDB) Transfer(sender, recipient common.Address, amount *uint256.Int) { if amount.Sign() == 0 { return } @@ -395,7 +439,7 @@ func (s *StateDB) Transfer(sender, recipient common.Address, amount *big.Int) { panic("negative amount") } - coins := sdk.NewCoins(sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigIntMut(amount))) + coins := sdk.NewCoins(sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigIntMut(amount.ToBig()))) senderAddr := sdk.AccAddress(sender.Bytes()) recipientAddr := sdk.AccAddress(recipient.Bytes()) if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error { @@ -406,48 +450,59 @@ func (s *StateDB) Transfer(sender, recipient common.Address, amount *big.Int) { } // AddBalance adds amount to the account associated with addr. -func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) { +func (s *StateDB) AddBalance(addr common.Address, amount *uint256.Int, _ tracing.BalanceChangeReason) uint256.Int { if amount.Sign() == 0 { - return + return uint256.Int{} } if amount.Sign() < 0 { panic("negative amount") } - coins := sdk.Coins{sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(amount))} + coin := sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) + var balance uint256.Int if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error { - return s.keeper.AddBalance(ctx, sdk.AccAddress(addr.Bytes()), coins) + var addErr error + balance, addErr = s.keeper.AddBalance(ctx, sdk.AccAddress(addr.Bytes()), coin) + return addErr }); err != nil { s.err = err } + + return balance } // SubBalance subtracts amount from the account associated with addr. -func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) { +func (s *StateDB) SubBalance(addr common.Address, amount *uint256.Int, _ tracing.BalanceChangeReason) uint256.Int { if amount.Sign() == 0 { - return + return uint256.Int{} } if amount.Sign() < 0 { panic("negative amount") } - coins := sdk.Coins{sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(amount))} + coin := sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(amount.ToBig())) + var balance uint256.Int if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error { - return s.keeper.SubBalance(ctx, sdk.AccAddress(addr.Bytes()), coins) + var subErr error + balance, subErr = s.keeper.SubBalance(ctx, sdk.AccAddress(addr.Bytes()), coin) + return subErr }); err != nil { s.err = err } + + return balance } // SetBalance is called by state override -func (s *StateDB) SetBalance(addr common.Address, amount *big.Int) { +func (s *StateDB) SetBalance(addr common.Address, amount uint256.Int) { if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error { - return s.keeper.SetBalance(ctx, addr, amount, s.evmDenom) + err := s.keeper.SetBalance(ctx, addr, amount, s.evmDenom) + return err }); err != nil { s.err = err } } // SetNonce sets the nonce of account. -func (s *StateDB) SetNonce(addr common.Address, nonce uint64) { +func (s *StateDB) SetNonce(addr common.Address, nonce uint64, _ tracing.NonceChangeReason) { stateObject := s.getOrNewStateObject(addr) if stateObject != nil { stateObject.SetNonce(nonce) @@ -455,17 +510,35 @@ func (s *StateDB) SetNonce(addr common.Address, nonce uint64) { } // SetCode sets the code of account. -func (s *StateDB) SetCode(addr common.Address, code []byte) { +func (s *StateDB) SetCode(addr common.Address, code []byte, _ tracing.CodeChangeReason) []byte { stateObject := s.getOrNewStateObject(addr) + var prev []byte if stateObject != nil { + prev = slices.Clone(stateObject.Code()) stateObject.SetCode(crypto.Keccak256Hash(code), code) } + return prev } // SetState sets the contract state. -func (s *StateDB) SetState(addr common.Address, key, value common.Hash) { - stateObject := s.getOrNewStateObject(addr) - stateObject.SetState(key, value) +func (s *StateDB) SetState(addr common.Address, key, value common.Hash) common.Hash { + if stateObject := s.getOrNewStateObject(addr); stateObject != nil { + return stateObject.SetState(key, value) + } + return common.Hash{} +} + +// GetStorageRoot calculates the hash of the trie root by iterating through all storage objects for a given account +func (s *StateDB) GetStorageRoot(addr common.Address) common.Hash { + sr := trie.NewStackTrie(nil) + s.keeper.ForEachStorage(s.ctx, addr, func(key, value common.Hash) bool { + if err := sr.Update(key.Bytes(), value.Bytes()); err != nil { + s.ctx.Logger().Error("failed adding state during storage root hash", "err", err.Error()) + return false + } + return true + }) + return sr.Hash() } // SetStorage replaces the entire storage for the specified account with given @@ -476,29 +549,51 @@ func (s *StateDB) SetStorage(addr common.Address, storage Storage) { stateObject.SetStorage(storage) } -// Suicide marks the given account as suicided. +// SelfDestruct marks the given account as self-destructed. // This clears the account balance. // // The account's state object is still available until the state is committed, -// getStateObject will return a non-nil account after Suicide. -func (s *StateDB) Suicide(addr common.Address) bool { +// getStateObject will return a non-nil account after SelfDestruct. +func (s *StateDB) SelfDestruct(addr common.Address) uint256.Int { stateObject := s.getStateObject(addr) + var prevBalance uint256.Int if stateObject == nil { - return false + return prevBalance } - s.journal.append(suicideChange{ - account: &addr, - prev: stateObject.suicided, + prevBalance = *(stateObject.Balance()) + s.journal.append(selfDestructChange{ + account: &addr, + prev: stateObject.selfDestructed, + prevbalance: new(uint256.Int).Set(&prevBalance), }) - stateObject.markSuicided() - + stateObject.markSelfDestructed() // clear balance balance := s.GetBalance(addr) if balance.Sign() > 0 { - s.SubBalance(addr, balance) + s.SubBalance(addr, balance, tracing.BalanceDecreaseSelfdestructBurn) + } + return prevBalance +} + +func (s *StateDB) SelfDestruct6780(addr common.Address) (uint256.Int, bool) { + stateObject := s.getStateObject(addr) + if stateObject == nil { + return uint256.Int{}, false } - return true + if stateObject.newContract { + return s.SelfDestruct(addr), true + } + return *(stateObject.Balance()), false +} + +// HasSelfDestructed returns if the contract is self-destructed in current transaction. +func (s *StateDB) HasSelfDestructed(addr common.Address) bool { + stateObject := s.getStateObject(addr) + if stateObject != nil { + return stateObject.selfDestructed + } + return false } // SetTransientState sets transient storage for a given account. It @@ -637,28 +732,90 @@ func (s *StateDB) RevertToSnapshot(revid int) { s.validRevisions = s.validRevisions[:idx] } +func (s *StateDB) Error() error { + return s.err +} + // Commit writes the dirty states to keeper // the StateDB object should be discarded after committed. func (s *StateDB) Commit() error { + if s.committed { + return errors.New("statedb already committed") + } + s.committed = true // if there's any errors during the execution, abort if s.err != nil { return s.err } - // commit the native cache store first, - // the states managed by precompiles and the other part of StateDB must not overlap. - // after this, should only use the `origCtx`. - s.commitMS() + // Enforce the non-overlap invariant BEFORE flushing the native cache store. + // A nested native action (via ExecuteNativeAction) commits its writes into s.cacheMS + // (readable via s.ctx). If any EVM-dirty key was also written by such an action, the + // store value visible through s.ctx will differ from originStorage. Detecting this + // before flushing means we can abort cleanly — the parent context is never touched. + // + // Note: only EVM-dirty keys are checked; native-only writes have no EVM dirty bit + // and are not in scope. + for _, addr := range s.journal.sortedDirties() { + obj, exist := s.stateObjects[addr] + if !exist || obj.selfDestructed { + continue + } + for _, key := range obj.dirtyStorage.SortedKeys() { + origin := obj.originStorage[key] + dirty := obj.dirtyStorage[key] + if dirty == origin { + continue + } + // A native action wrote this slot iff the store value differs from origin. + // If it also differs from the EVM-dirty value, the two sides disagree — conflict. + store := s.keeper.GetState(s.ctx, obj.Address(), key) + if store != origin && store != dirty { + return fmt.Errorf( + "%w: address %s key %s modified by both EVM execution and native action (origin=%s, store=%s, dirty=%s)", + ErrStateConflict, + obj.Address().Hex(), key.Hex(), origin.Hex(), store.Hex(), dirty.Hex(), + ) + } + } + } + + s.flushNativeCacheLayers() if len(s.nativeEvents) > 0 { s.origCtx.EventManager().EmitEvents(s.nativeEvents) } for _, addr := range s.journal.sortedDirties() { - obj := s.stateObjects[addr] - if obj.suicided { - if err := s.keeper.DeleteAccount(s.origCtx, obj.Address()); err != nil { + obj, exist := s.stateObjects[addr] + if !exist { + continue + } + if obj.selfDestructed { + // Burn any balance that arrived after SelfDestruct was called (e.g., via a + // value-bearing CALL to the destroyed address within the same transaction). + // SelfDestruct already burned the balance present at destruction time, but + // subsequent AddBalance calls write to the bank without a matching burn. + // DeleteAccount only removes auth metadata and storage; it never touches the + // bank balance, so we must drain it here before removing the account. + // + // Both operations run inside a single CacheContext so that if DeleteAccount + // fails after SubBalance, the partial burn is rolled back and the bank is + // left consistent. + cosmosAddr := sdk.AccAddress(obj.Address().Bytes()) + cacheCtx, writeCache := s.origCtx.CacheContext() + // Only the EVM denom is burned here. Non-EVM-native tokens (IBC, CosmWasm + // bridge) held by the destroyed address are not drained and may remain as + // orphaned bank balances. + if remaining := s.keeper.GetBalance(cacheCtx, cosmosAddr, s.evmDenom); remaining.Sign() > 0 { + coin := sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(remaining.ToBig())) + if _, err := s.keeper.SubBalance(cacheCtx, cosmosAddr, coin); err != nil { + return errorsmod.Wrap(err, "failed to burn post-selfdestruct balance") + } + } + if err := s.keeper.DeleteAccount(cacheCtx, obj.Address()); err != nil { return errorsmod.Wrap(err, "failed to delete account") } + writeCache() } else { codeDirty := obj.codeDirty() if codeDirty && obj.code != nil { @@ -671,7 +828,6 @@ func (s *StateDB) Commit() error { } for _, key := range obj.dirtyStorage.SortedKeys() { value := obj.dirtyStorage[key] - // Skip noop changes, persist actual changes if value == obj.originStorage[key] { continue } @@ -705,3 +861,33 @@ func (s *StateDB) emitNativeEvents(contract common.Address, converter EventConve s.AddLog(log) } } + +/* +PointCache, Witness, and AccessEvents are all utilized for verkle trees. +For now, we just return nil and verkle trees are not supported. +*/ +func (s *StateDB) PointCache() *utils.PointCache { + return nil +} + +func (s *StateDB) Witness() *stateless.Witness { + // TODO support verkle tries? + return nil +} + +func (s *StateDB) AccessEvents() *state.AccessEvents { + return nil +} + +//nolint:misspell +func (s *StateDB) Finalise(deleteEmptyObjects bool) { + for addr := range s.journal.dirties { + obj, exist := s.stateObjects[addr] + if !exist { + continue + } + if obj.selfDestructed || (deleteEmptyObjects && obj.empty()) { + delete(s.stateObjects, obj.address) + } + } +} diff --git a/x/evm/statedb/statedb_hooked.go b/x/evm/statedb/statedb_hooked.go new file mode 100644 index 0000000000..92881f1aa4 --- /dev/null +++ b/x/evm/statedb/statedb_hooked.go @@ -0,0 +1,308 @@ +package statedb + +import ( + "math/big" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/common" + ethstate "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/stateless" + "github.com/ethereum/go-ethereum/core/tracing" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie/utils" + "github.com/holiman/uint256" +) + +// hookedStateDB represents a statedb which emits calls to tracing-hooks +// on state operations. +type HookedStateDB struct { + inner *StateDB + hooks *tracing.Hooks +} + +// NewHookedState wraps the given stateDb with the given hooks +func NewHookedState(stateDB *StateDB, hooks *tracing.Hooks) *HookedStateDB { + s := &HookedStateDB{stateDB, hooks} + if s.hooks == nil { + s.hooks = new(tracing.Hooks) + } + return s +} + +func (s *HookedStateDB) CreateAccount(addr common.Address) { + s.inner.CreateAccount(addr) +} + +func (s *HookedStateDB) CreateContract(addr common.Address) { + s.inner.CreateContract(addr) +} + +func (s *HookedStateDB) GetBalance(addr common.Address) *uint256.Int { + return s.inner.GetBalance(addr) +} + +func (s *HookedStateDB) GetNonce(addr common.Address) uint64 { + return s.inner.GetNonce(addr) +} + +func (s *HookedStateDB) GetCodeHash(addr common.Address) common.Hash { + return s.inner.GetCodeHash(addr) +} + +func (s *HookedStateDB) GetCode(addr common.Address) []byte { + return s.inner.GetCode(addr) +} + +func (s *HookedStateDB) GetCodeSize(addr common.Address) int { + return s.inner.GetCodeSize(addr) +} + +func (s *HookedStateDB) AddRefund(u uint64) { + s.inner.AddRefund(u) +} + +func (s *HookedStateDB) SubRefund(u uint64) { + s.inner.SubRefund(u) +} + +func (s *HookedStateDB) GetRefund() uint64 { + return s.inner.GetRefund() +} + +func (s *HookedStateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash { + return s.inner.GetCommittedState(addr, hash) +} + +func (s *HookedStateDB) GetStateAndCommittedState(addr common.Address, hash common.Hash) (common.Hash, common.Hash) { + return s.inner.GetStateAndCommittedState(addr, hash) +} + +func (s *HookedStateDB) GetState(addr common.Address, hash common.Hash) common.Hash { + return s.inner.GetState(addr, hash) +} + +func (s *HookedStateDB) GetStorageRoot(addr common.Address) common.Hash { + return s.inner.GetStorageRoot(addr) +} + +func (s *HookedStateDB) GetTransientState(addr common.Address, key common.Hash) common.Hash { + return s.inner.GetTransientState(addr, key) +} + +func (s *HookedStateDB) SetTransientState(addr common.Address, key, value common.Hash) { + s.inner.SetTransientState(addr, key, value) +} + +func (s *HookedStateDB) HasSelfDestructed(addr common.Address) bool { + return s.inner.HasSelfDestructed(addr) +} + +func (s *HookedStateDB) Exist(addr common.Address) bool { + return s.inner.Exist(addr) +} + +func (s *HookedStateDB) Empty(addr common.Address) bool { + return s.inner.Empty(addr) +} + +func (s *HookedStateDB) AddressInAccessList(addr common.Address) bool { + return s.inner.AddressInAccessList(addr) +} + +func (s *HookedStateDB) SlotInAccessList(addr common.Address, slot common.Hash) (addressOk bool, slotOk bool) { + return s.inner.SlotInAccessList(addr, slot) +} + +func (s *HookedStateDB) AddAddressToAccessList(addr common.Address) { + s.inner.AddAddressToAccessList(addr) +} + +func (s *HookedStateDB) AddSlotToAccessList(addr common.Address, slot common.Hash) { + s.inner.AddSlotToAccessList(addr, slot) +} + +func (s *HookedStateDB) PointCache() *utils.PointCache { + return s.inner.PointCache() +} + +func (s *HookedStateDB) Prepare(rules params.Rules, sender, coinbase common.Address, dest *common.Address, + precompiles []common.Address, txAccesses ethtypes.AccessList, +) { + s.inner.Prepare(rules, sender, coinbase, dest, precompiles, txAccesses) +} + +func (s *HookedStateDB) RevertToSnapshot(i int) { + s.inner.RevertToSnapshot(i) +} + +func (s *HookedStateDB) Snapshot() int { + return s.inner.Snapshot() +} + +func (s *HookedStateDB) AddPreimage(hash common.Hash, bytes []byte) { + s.inner.AddPreimage(hash, bytes) +} + +func (s *HookedStateDB) Witness() *stateless.Witness { + return s.inner.Witness() +} + +func (s *HookedStateDB) AccessEvents() *ethstate.AccessEvents { + return s.inner.AccessEvents() +} + +func (s *HookedStateDB) SubBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int { + prev := s.inner.SubBalance(addr, amount, reason) + if s.hooks.OnBalanceChange != nil && !amount.IsZero() { + newBalance := new(uint256.Int).Sub(&prev, amount) + s.hooks.OnBalanceChange(addr, prev.ToBig(), newBalance.ToBig(), reason) + } + return prev +} + +func (s *HookedStateDB) AddBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int { + prev := s.inner.AddBalance(addr, amount, reason) + if s.hooks.OnBalanceChange != nil && !amount.IsZero() { + newBalance := new(uint256.Int).Add(&prev, amount) + s.hooks.OnBalanceChange(addr, prev.ToBig(), newBalance.ToBig(), reason) + } + return prev +} + +func (s *HookedStateDB) SetNonce(address common.Address, nonce uint64, reason tracing.NonceChangeReason) { + prev := s.inner.GetNonce(address) + s.inner.SetNonce(address, nonce, reason) + if s.hooks.OnNonceChangeV2 != nil { + s.hooks.OnNonceChangeV2(address, prev, nonce, reason) + } else if s.hooks.OnNonceChange != nil { + s.hooks.OnNonceChange(address, prev, nonce) + } +} + +func (s *HookedStateDB) SetCode(address common.Address, code []byte, reason tracing.CodeChangeReason) []byte { + prev := s.inner.SetCode(address, code, reason) + if s.hooks.OnCodeChange != nil || s.hooks.OnCodeChangeV2 != nil { + prevHash := ethtypes.EmptyCodeHash + if len(prev) != 0 { + prevHash = crypto.Keccak256Hash(prev) + } + codeHash := ethtypes.EmptyCodeHash + if len(code) != 0 { + codeHash = crypto.Keccak256Hash(code) + } + if prevHash != codeHash { + if s.hooks.OnCodeChangeV2 != nil { + s.hooks.OnCodeChangeV2(address, prevHash, prev, codeHash, code, reason) + } else { + s.hooks.OnCodeChange(address, prevHash, prev, codeHash, code) + } + } + } + return prev +} + +func (s *HookedStateDB) SetState(address common.Address, key common.Hash, value common.Hash) common.Hash { + prev := s.inner.SetState(address, key, value) + if s.hooks.OnStorageChange != nil && prev != value { + s.hooks.OnStorageChange(address, key, prev, value) + } + return prev +} + +func (s *HookedStateDB) SelfDestruct(address common.Address) uint256.Int { + var prevCode []byte + var prevCodeHash common.Hash + + if s.hooks.OnCodeChange != nil { + prevCode = s.inner.GetCode(address) + prevCodeHash = s.inner.GetCodeHash(address) + } + + prev := s.inner.SelfDestruct(address) + + if s.hooks.OnBalanceChange != nil && !prev.IsZero() { + s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) + } + + if s.hooks.OnCodeChange != nil && len(prevCode) > 0 { + s.hooks.OnCodeChange(address, prevCodeHash, prevCode, ethtypes.EmptyCodeHash, nil) + } + + return prev +} + +func (s *HookedStateDB) SelfDestruct6780(address common.Address) (uint256.Int, bool) { + var prevCode []byte + var prevCodeHash common.Hash + + if s.hooks.OnCodeChange != nil { + prevCodeHash = s.inner.GetCodeHash(address) + prevCode = s.inner.GetCode(address) + } + + prev, changed := s.inner.SelfDestruct6780(address) + + if s.hooks.OnBalanceChange != nil && changed && !prev.IsZero() { + s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) + } + + if s.hooks.OnCodeChange != nil && changed && len(prevCode) > 0 { + s.hooks.OnCodeChange(address, prevCodeHash, prevCode, ethtypes.EmptyCodeHash, nil) + } + + return prev, changed +} + +func (s *HookedStateDB) AddLog(log *ethtypes.Log) { + // The inner will modify the log (add fields), so invoke that first + s.inner.AddLog(log) + if s.hooks.OnLog != nil { + s.hooks.OnLog(log) + } +} + +//nolint:misspell +func (s *HookedStateDB) Finalise(deleteEmptyObjects bool) { + //nolint:misspell + defer s.inner.Finalise(deleteEmptyObjects) + if s.hooks.OnBalanceChange == nil { + return + } + for addr := range s.inner.journal.dirties { + obj := s.inner.stateObjects[addr] + if obj != nil && obj.selfDestructed { + // Emit the tracing event for any balance that arrived after selfdestruct. + // The actual burn is performed in StateDB.Commit before DeleteAccount. + // obj.Balance() is already zero (SelfDestruct zeroed it), so read the + // actual bank balance to capture any post-destruction AddBalance calls. + if bal := s.inner.GetBalance(addr); bal.Sign() != 0 { + s.hooks.OnBalanceChange(addr, bal.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestructBurn) + } + } + } +} + +func (s *HookedStateDB) Error() error { + return s.inner.Error() +} + +// Impl ExtStateDB interface + +// ExecuteNativeAction executes native action in isolate, +// the writes will be revert when either the native action itself fail +// or the wrapping message call reverted. +func (s *HookedStateDB) ExecuteNativeAction(contract common.Address, converter EventConverter, action func(ctx sdk.Context) error) error { + return s.inner.ExecuteNativeAction(contract, converter, action) +} + +// Context returns the current context for query native state in precompiles. +func (s *HookedStateDB) Context() sdk.Context { + return s.inner.Context() +} + +// Transfer transfers amount from sender to recipient. +func (s *HookedStateDB) Transfer(sender, recipient common.Address, amount *uint256.Int) { + s.inner.Transfer(sender, recipient, amount) +} diff --git a/x/evm/statedb/statedb_hooked_test.go b/x/evm/statedb/statedb_hooked_test.go new file mode 100644 index 0000000000..0a134ec323 --- /dev/null +++ b/x/evm/statedb/statedb_hooked_test.go @@ -0,0 +1,230 @@ +// Copyright 2024 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package statedb_test + +import ( + "fmt" + "math/big" + "testing" + "time" + + "github.com/cometbft/cometbft/crypto/tmhash" + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + "github.com/cometbft/cometbft/version" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/holiman/uint256" + + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + + tmversion "github.com/cometbft/cometbft/proto/tendermint/version" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/evmos/ethermint/crypto/ethsecp256k1" + "github.com/evmos/ethermint/evmd" + "github.com/evmos/ethermint/testutil" + "github.com/evmos/ethermint/x/evm/statedb" +) + +type HookedStateDBTestSuite struct { + suite.Suite + + app *evmd.EthermintApp + ctx sdk.Context +} + +func (suite *HookedStateDBTestSuite) SetupTest() { + suite.DoSetupTest(suite.T()) +} + +func TestHookedStateDBTestSuite(t *testing.T) { + suite.Run(t, new(HookedStateDBTestSuite)) +} + +func (suite *HookedStateDBTestSuite) DoSetupTest(t require.TestingT) { + checkTx := false + suite.app = testutil.Setup(checkTx, nil) + // consensus key + priv, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + consAddress := sdk.ConsAddress(priv.PubKey().Address()) + suite.ctx = suite.app.BaseApp.NewUncachedContext(checkTx, tmproto.Header{ + Height: 1, + ChainID: "ethermint_9000-1", + Time: time.Now().UTC(), + ProposerAddress: consAddress.Bytes(), + Version: tmversion.Consensus{ + Block: version.BlockProtocol, + }, + LastBlockId: tmproto.BlockID{ + Hash: tmhash.Sum([]byte("block_id")), + PartSetHeader: tmproto.PartSetHeader{ + Total: 11, + Hash: tmhash.Sum([]byte("partset_header")), + }, + }, + AppHash: tmhash.Sum([]byte("app")), + DataHash: tmhash.Sum([]byte("data")), + EvidenceHash: tmhash.Sum([]byte("evidence")), + ValidatorsHash: tmhash.Sum([]byte("validators")), + NextValidatorsHash: tmhash.Sum([]byte("next_validators")), + ConsensusHash: tmhash.Sum([]byte("consensus")), + LastResultsHash: tmhash.Sum([]byte("last_result")), + }).WithConsensusParams(*testutil.DefaultConsensusParams) +} + +// This method tests that the 'burn' from sending-to-selfdestructed accounts +// is accounted for. +// (There is also a higher-level test in eth/tracers: TestSupplySelfDestruct ) +func (suite *HookedStateDBTestSuite) TestBurn() { + // Note: burn can happen even after EIP-6780, if within one single transaction, + // the following occur: + // 1. contract B creates contract A + // 2. contract A is destructed + // 3. contract B sends ether to A + + var burned = new(uint256.Int) + s := statedb.New(suite.ctx, suite.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(suite.ctx.HeaderHash()))) + hooked := statedb.NewHookedState(s, &tracing.Hooks{ + OnBalanceChange: func(addr common.Address, prev, new *big.Int, reason tracing.BalanceChangeReason) { + if reason == tracing.BalanceDecreaseSelfdestructBurn { + burned.Add(burned, uint256.MustFromBig(prev)) + } + }, + }) + createAndDestroy := func(addr common.Address) { + hooked.AddBalance(addr, uint256.NewInt(100), tracing.BalanceChangeUnspecified) + hooked.CreateContract(addr) + hooked.SelfDestruct(addr) + // sanity-check that balance is now 0 + if have, want := hooked.GetBalance(addr), new(uint256.Int); !have.Eq(want) { + suite.T().Fatalf("post-destruct balance wrong: have %v want %v", have, want) + } + } + addA := common.Address{0xaa} + addB := common.Address{0xbb} + addC := common.Address{0xcc} + + // Tx 1: create and destroy address A and B in one tx + createAndDestroy(addA) + createAndDestroy(addB) + hooked.AddBalance(addA, uint256.NewInt(200), tracing.BalanceChangeUnspecified) + hooked.AddBalance(addB, uint256.NewInt(200), tracing.BalanceChangeUnspecified) + hooked.Finalise(true) + + // Tx 2: create and destroy address C, then commit + createAndDestroy(addC) + hooked.AddBalance(addC, uint256.NewInt(200), tracing.BalanceChangeUnspecified) + hooked.Finalise(true) + + s.Commit() + if have, want := burned, uint256.NewInt(600); !have.Eq(want) { + suite.T().Fatalf("burn-count wrong, have %v want %v", have, want) + } +} + +// TestHooks is a basic sanity-check of all hooks +func (suite *HookedStateDBTestSuite) TestHooks() { + txConfig := statedb.NewTxConfig(common.BytesToHash(suite.ctx.HeaderHash()), common.Hash{0x11}, 100, 0) + inner := statedb.New(suite.ctx, suite.app.EvmKeeper, txConfig) + var result []string + var wants = []string{ + "0xaa00000000000000000000000000000000000000.balance: 0->100 (Unspecified)", + "0xaa00000000000000000000000000000000000000.balance: 100->50 (Transfer)", + "0xaa00000000000000000000000000000000000000.nonce: 0->1337", + "0xaa00000000000000000000000000000000000000.code: (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) ->0x1325 (0xa12ae05590de0c93a00bc7ac773c2fdb621e44f814985e72194f921c0050f728)", + "0xaa00000000000000000000000000000000000000.storage slot 0x0000000000000000000000000000000000000000000000000000000000000001: 0x0000000000000000000000000000000000000000000000000000000000000000 ->0x0000000000000000000000000000000000000000000000000000000000000011", + "0xaa00000000000000000000000000000000000000.storage slot 0x0000000000000000000000000000000000000000000000000000000000000001: 0x0000000000000000000000000000000000000000000000000000000000000011 ->0x0000000000000000000000000000000000000000000000000000000000000022", + "log 100", + } + emitF := func(format string, a ...any) { + result = append(result, fmt.Sprintf(format, a...)) + } + sdb := statedb.NewHookedState(inner, &tracing.Hooks{ + OnBalanceChange: func(addr common.Address, prev, new *big.Int, reason tracing.BalanceChangeReason) { + emitF("%v.balance: %v->%v (%v)", addr, prev, new, reason) + }, + OnNonceChange: func(addr common.Address, prev, new uint64) { + emitF("%v.nonce: %v->%v", addr, prev, new) + }, + OnCodeChange: func(addr common.Address, prevCodeHash common.Hash, prevCode []byte, codeHash common.Hash, code []byte) { + emitF("%v.code: %#x (%v) ->%#x (%v)", addr, prevCode, prevCodeHash, code, codeHash) + }, + OnStorageChange: func(addr common.Address, slot common.Hash, prev, new common.Hash) { + emitF("%v.storage slot %v: %v ->%v", addr, slot, prev, new) + }, + OnLog: func(log *types.Log) { + emitF("log %v", log.TxIndex) + }, + }) + sdb.AddBalance(common.Address{0xaa}, uint256.NewInt(100), tracing.BalanceChangeUnspecified) + sdb.SubBalance(common.Address{0xaa}, uint256.NewInt(50), tracing.BalanceChangeTransfer) + sdb.SetNonce(common.Address{0xaa}, 1337, tracing.NonceChangeGenesis) + sdb.SetCode(common.Address{0xaa}, []byte{0x13, 37}, 0) + sdb.SetState(common.Address{0xaa}, common.HexToHash("0x01"), common.HexToHash("0x11")) + sdb.SetState(common.Address{0xaa}, common.HexToHash("0x01"), common.HexToHash("0x22")) + sdb.SetTransientState(common.Address{0xaa}, common.HexToHash("0x02"), common.HexToHash("0x01")) + sdb.SetTransientState(common.Address{0xaa}, common.HexToHash("0x02"), common.HexToHash("0x02")) + sdb.AddLog(&types.Log{ + Address: common.Address{0xbb}, + }) + for i, want := range wants { + if have := result[i]; have != want { + suite.T().Fatalf("error event %d, have\n%v\nwant%v\n", i, have, want) + } + } +} + +func (suite *HookedStateDBTestSuite) TestSetCodeHookSkipsUnchangedCode() { + inner := statedb.New(suite.ctx, suite.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(suite.ctx.HeaderHash()))) + var calls int + sdb := statedb.NewHookedState(inner, &tracing.Hooks{ + OnCodeChange: func(common.Address, common.Hash, []byte, common.Hash, []byte) { + calls++ + }, + }) + + addr := common.Address{0xaa} + code := []byte{0x13, 0x25} + sdb.SetCode(addr, code, tracing.CodeChangeUnspecified) + sdb.SetCode(addr, code, tracing.CodeChangeUnspecified) + + suite.Require().Equal(1, calls) +} + +func (suite *HookedStateDBTestSuite) TestSetCodeHookV2ReceivesReason() { + inner := statedb.New(suite.ctx, suite.app.EvmKeeper, statedb.NewEmptyTxConfig(common.BytesToHash(suite.ctx.HeaderHash()))) + var ( + calls int + reason tracing.CodeChangeReason + ) + sdb := statedb.NewHookedState(inner, &tracing.Hooks{ + OnCodeChangeV2: func(_ common.Address, _ common.Hash, _ []byte, _ common.Hash, _ []byte, r tracing.CodeChangeReason) { + calls++ + reason = r + }, + OnCodeChange: func(common.Address, common.Hash, []byte, common.Hash, []byte) { + suite.T().Fatal("OnCodeChange must not run when OnCodeChangeV2 is set") + }, + }) + + sdb.SetCode(common.Address{0xaa}, []byte{0x13, 0x25}, tracing.CodeChangeAuthorization) + + suite.Require().Equal(1, calls) + suite.Require().Equal(tracing.CodeChangeAuthorization, reason) +} diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 5060e4abbf..51d4cf0a5d 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -5,10 +5,9 @@ import ( "math/big" "testing" - "cosmossdk.io/log" - "cosmossdk.io/store/metrics" - "cosmossdk.io/store/rootmulti" - storetypes "cosmossdk.io/store/types" + "cosmossdk.io/log/v2" + "github.com/cosmos/cosmos-sdk/store/v2/rootmulti" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" dbm "github.com/cosmos/cosmos-db" sdkaddress "github.com/cosmos/cosmos-sdk/codec/address" @@ -20,8 +19,8 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" @@ -30,6 +29,7 @@ import ( evmkeeper "github.com/evmos/ethermint/x/evm/keeper" "github.com/evmos/ethermint/x/evm/statedb" evmtypes "github.com/evmos/ethermint/x/evm/types" + "github.com/holiman/uint256" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -60,7 +60,7 @@ func (suite *StateDBTestSuite) TestAccount() { {"non-exist account", func(db *statedb.StateDB, cms storetypes.MultiStore) { suite.Require().Equal(false, db.Exist(address)) suite.Require().Equal(true, db.Empty(address)) - suite.Require().Equal(big.NewInt(0), db.GetBalance(address)) + suite.Require().Equal(uint256.NewInt(0), db.GetBalance(address)) suite.Require().Equal([]byte(nil), db.GetCode(address)) suite.Require().Equal(common.Hash{}, db.GetCodeHash(address)) suite.Require().Equal(uint64(0), db.GetNonce(address)) @@ -77,20 +77,20 @@ func (suite *StateDBTestSuite) TestAccount() { db = statedb.New(ctx, keeper, txConfig) suite.Require().Equal(true, db.Exist(address)) suite.Require().Equal(true, db.Empty(address)) - suite.Require().Equal(big.NewInt(0), db.GetBalance(address)) + suite.Require().Equal(uint256.NewInt(0), db.GetBalance(address)) suite.Require().Equal([]byte(nil), db.GetCode(address)) suite.Require().Equal(common.BytesToHash(emptyCodeHash), db.GetCodeHash(address)) suite.Require().Equal(uint64(0), db.GetNonce(address)) }}, {"suicide", func(db *statedb.StateDB, cms storetypes.MultiStore) { // non-exist account. - suite.Require().False(db.Suicide(address)) - suite.Require().False(db.HasSuicided(address)) + db.SelfDestruct(address) + suite.Require().False(db.HasSelfDestructed(address)) // create a contract account db.CreateAccount(address) - db.SetCode(address, []byte("hello world")) - db.AddBalance(address, big.NewInt(100)) + db.SetCode(address, []byte("hello world"), 0) + db.AddBalance(address, uint256.NewInt(100), tracing.BalanceChangeTransfer) db.SetState(address, key1, value1) db.SetState(address, key2, value2) codeHash := db.GetCodeHash(address) @@ -100,15 +100,16 @@ func (suite *StateDBTestSuite) TestAccount() { suite.Require().NotEmpty(keeper.GetCode(ctx, codeHash)) - // suicide + // self destruct db = statedb.New(ctx, keeper, txConfig) - suite.Require().False(db.HasSuicided(address)) - suite.Require().True(db.Suicide(address)) + suite.Require().False(db.HasSelfDestructed(address)) + db.SelfDestruct(address) + suite.Require().True(db.HasSelfDestructed(address)) // check dirty state - suite.Require().True(db.HasSuicided(address)) + suite.Require().True(db.HasSelfDestructed(address)) // balance is cleared - suite.Require().Equal(big.NewInt(0), db.GetBalance(address)) + suite.Require().Equal(uint256.NewInt(0), db.GetBalance(address)) // but code and state are still accessible in dirty state suite.Require().Equal(value1, db.GetState(address, key1)) suite.Require().Equal([]byte("hello world"), db.GetCode(address)) @@ -140,11 +141,11 @@ func (suite *StateDBTestSuite) TestAccountOverride() { _, ctx, keeper := setupTestEnv(suite.T()) db := statedb.New(ctx, keeper, emptyTxConfig) // test balance carry over when overwritten - amount := big.NewInt(1) + amount := uint256.NewInt(1) // init an EOA account, account overriden only happens on EOA account. - db.AddBalance(address, amount) - db.SetNonce(address, 1) + db.AddBalance(address, amount, tracing.BalanceChangeTransfer) + db.SetNonce(address, 1, tracing.NonceChangeUnspecified) // override db.CreateAccount(address) @@ -161,7 +162,7 @@ func (suite *StateDBTestSuite) TestDBError() { malleate func(vm.StateDB) }{ {"negative balance", func(db vm.StateDB) { - db.SubBalance(address, big.NewInt(10)) + db.SubBalance(address, uint256.NewInt(10), tracing.BalanceChangeTransfer) }}, } for _, tc := range testCases { @@ -177,28 +178,28 @@ func (suite *StateDBTestSuite) TestBalance() { testCases := []struct { name string malleate func(*statedb.StateDB) - expBalance *big.Int + expBalance *uint256.Int }{ {"add balance", func(db *statedb.StateDB) { - db.AddBalance(address, big.NewInt(10)) - }, big.NewInt(10)}, + db.AddBalance(address, uint256.NewInt(10), tracing.BalanceChangeTransfer) + }, uint256.NewInt(10)}, {"sub balance", func(db *statedb.StateDB) { - db.AddBalance(address, big.NewInt(10)) + db.AddBalance(address, uint256.NewInt(10), tracing.BalanceChangeTransfer) // get dirty balance - suite.Require().Equal(big.NewInt(10), db.GetBalance(address)) - db.SubBalance(address, big.NewInt(2)) - }, big.NewInt(8)}, + suite.Require().Equal(uint256.NewInt(10), db.GetBalance(address)) + db.SubBalance(address, uint256.NewInt(2), tracing.BalanceChangeTransfer) + }, uint256.NewInt(8)}, {"add zero balance", func(db *statedb.StateDB) { - db.AddBalance(address, big.NewInt(0)) - }, big.NewInt(0)}, + db.AddBalance(address, uint256.NewInt(0), tracing.BalanceChangeTransfer) + }, uint256.NewInt(0)}, {"sub zero balance", func(db *statedb.StateDB) { - db.SubBalance(address, big.NewInt(0)) - }, big.NewInt(0)}, + db.SubBalance(address, uint256.NewInt(0), tracing.BalanceChangeTransfer) + }, uint256.NewInt(0)}, {"transfer", func(db *statedb.StateDB) { - db.AddBalance(address, big.NewInt(10)) - db.Transfer(address, address2, big.NewInt(10)) - suite.Require().Equal(big.NewInt(10), db.GetBalance(address2)) - }, big.NewInt(0)}, + db.AddBalance(address, uint256.NewInt(10), tracing.BalanceChangeTransfer) + db.Transfer(address, address2, uint256.NewInt(10)) + suite.Require().Equal(uint256.NewInt(10), db.GetBalance(address2)) + }, uint256.NewInt(0)}, } for _, tc := range testCases { @@ -213,7 +214,7 @@ func (suite *StateDBTestSuite) TestBalance() { ctx, keeper = newTestKeeper(suite.T(), raw) // check committed balance too - suite.Require().Equal(tc.expBalance, keeper.GetEVMDenomBalance(ctx, address)) + suite.Require().Equal(tc.expBalance.Uint64(), keeper.GetEVMDenomBalance(ctx, address).Uint64()) }) } } @@ -295,7 +296,7 @@ func (suite *StateDBTestSuite) TestCode() { db.CreateAccount(address) }, nil, common.BytesToHash(emptyCodeHash)}, {"set code", func(db vm.StateDB) { - db.SetCode(address, code) + db.SetCode(address, code, 0) }, code, codeHash}, } @@ -334,22 +335,23 @@ func (suite *StateDBTestSuite) TestRevertSnapshot() { db.SetState(address, v1, v3) }}, {"set nonce", func(db vm.StateDB) { - db.SetNonce(address, 10) + db.SetNonce(address, 10, tracing.NonceChangeUnspecified) }}, {"change balance", func(db vm.StateDB) { - db.AddBalance(address, big.NewInt(10)) - db.SubBalance(address, big.NewInt(5)) + db.AddBalance(address, uint256.NewInt(10), tracing.BalanceChangeTransfer) + db.SubBalance(address, uint256.NewInt(5), tracing.BalanceChangeTransfer) }}, {"override account", func(db vm.StateDB) { db.CreateAccount(address) }}, {"set code", func(db vm.StateDB) { - db.SetCode(address, []byte("hello world")) + db.SetCode(address, []byte("hello world"), 0) }}, - {"suicide", func(db vm.StateDB) { + {"self destruct", func(db vm.StateDB) { db.SetState(address, v1, v2) - db.SetCode(address, []byte("hello world")) - suite.Require().True(db.Suicide(address)) + db.SetCode(address, []byte("hello world"), 0) + db.SelfDestruct(address) + suite.Require().True(db.HasSelfDestructed(address)) }}, {"add log", func(db vm.StateDB) { db.AddLog(ðtypes.Log{ @@ -373,11 +375,11 @@ func (suite *StateDBTestSuite) TestRevertSnapshot() { { // do some arbitrary changes to the storage db := statedb.New(ctx, keeper, emptyTxConfig) - db.SetNonce(address, 1) - db.AddBalance(address, big.NewInt(100)) - db.SetCode(address, []byte("hello world")) + db.SetNonce(address, 1, tracing.NonceChangeUnspecified) + db.AddBalance(address, uint256.NewInt(100), tracing.BalanceChangeTransfer) + db.SetCode(address, []byte("hello world"), 0) db.SetState(address, v1, v2) - db.SetNonce(address2, 1) + db.SetNonce(address2, 1, tracing.NonceChangeUnspecified) suite.Require().NoError(db.Commit()) } @@ -594,7 +596,6 @@ func (suite *StateDBTestSuite) TestNativeAction() { _, ctx, keeper := setupTestEnv(suite.T()) storeKey := testStoreKeys["testnative"] objStoreKey := testObjKeys[evmtypes.ObjectStoreKey] - memKey := testMemKeys[capabilitytypes.MemStoreKey] eventConverter := func(event sdk.Event) (*ethtypes.Log, error) { converters := map[string]statedb.EventConverter{ @@ -623,9 +624,6 @@ func (suite *StateDBTestSuite) TestNativeAction() { objStore := ctx.ObjectStore(objStoreKey) objStore.Set([]byte("transient"), "value") - mem := ctx.KVStore(memKey) - mem.Set([]byte("mem"), []byte("value")) - return nil }) stateDB.ExecuteNativeAction(contract, eventConverter, func(ctx sdk.Context) error { @@ -636,8 +634,6 @@ func (suite *StateDBTestSuite) TestNativeAction() { objStore := ctx.ObjectStore(objStoreKey) suite.Require().Equal("value", objStore.Get([]byte("transient")).(string)) - mem := ctx.KVStore(memKey) - suite.Require().Equal([]byte("value"), mem.Get([]byte("mem"))) return errors.New("failure") }) @@ -774,7 +770,6 @@ func CollectContractStorage(db vm.StateDB, address common.Address) statedb.Stora var ( testStoreKeys = storetypes.NewKVStoreKeys(authtypes.StoreKey, banktypes.StoreKey, evmtypes.StoreKey, "testnative") testObjKeys = storetypes.NewObjectStoreKeys(banktypes.ObjectStoreKey, evmtypes.ObjectStoreKey) - testMemKeys = storetypes.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) ) func cloneRawState(t *testing.T, cms storetypes.MultiStore) map[string]map[string][]byte { @@ -810,15 +805,16 @@ func newTestKeeper(t *testing.T, cms storetypes.MultiStore) (sdk.Context, *evmke sdk.GetConfig().GetBech32AccountAddrPrefix(), authAddr, ) - bankKeeper := bankkeeper.NewBaseKeeper( + + bk := bankkeeper.NewBaseKeeper( appCodec, runtime.NewKVStoreService(testStoreKeys[banktypes.StoreKey]), - testObjKeys[banktypes.ObjectStoreKey], accountKeeper, map[string]bool{}, authAddr, log.NewNopLogger(), ) + bankKeeper := bk.WithObjStoreKey(testObjKeys[banktypes.ObjectStoreKey]) evmKeeper := evmkeeper.NewKeeper( appCodec, testStoreKeys[evmtypes.StoreKey], testObjKeys[evmtypes.ObjectStoreKey], authtypes.NewModuleAddress(govtypes.ModuleName), @@ -826,6 +822,7 @@ func newTestKeeper(t *testing.T, cms storetypes.MultiStore) (sdk.Context, *evmke "", paramstypes.Subspace{}, nil, + evmkeeper.GasNoLimit, ) ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger()) @@ -834,13 +831,10 @@ func newTestKeeper(t *testing.T, cms storetypes.MultiStore) (sdk.Context, *evmke func setupTestEnv(t *testing.T) (storetypes.MultiStore, sdk.Context, *evmkeeper.Keeper) { db := dbm.NewMemDB() - cms := rootmulti.NewStore(db, log.NewNopLogger(), metrics.NewNoOpMetrics()) + cms := rootmulti.NewStore(db, log.NewNopLogger()) for _, key := range testStoreKeys { cms.MountStoreWithDB(key, storetypes.StoreTypeIAVL, nil) } - for _, key := range testMemKeys { - cms.MountStoreWithDB(key, storetypes.StoreTypeMemory, nil) - } for _, key := range testObjKeys { cms.MountStoreWithDB(key, storetypes.StoreTypeObject, nil) } @@ -853,6 +847,270 @@ func setupTestEnv(t *testing.T) (storetypes.MultiStore, sdk.Context, *evmkeeper. return cms, ctx, keeper } +// TestNestedStateDBConflictDetection verifies that Commit() returns an error when +// both the outer EVM dirty storage and an inner native action (via ExecuteNativeAction) +// modify the same storage key, enforcing the non-overlap invariant. +func (suite *StateDBTestSuite) TestNestedStateDBConflictDetection() { + _, ctx, keeper := setupTestEnv(suite.T()) + + contract := common.BigToAddress(big.NewInt(999)) + storageKey := common.BigToHash(big.NewInt(1)) + initVal := common.BigToHash(big.NewInt(1000)) + + // Setup: write initial value and commit it + db := statedb.New(ctx, keeper, emptyTxConfig) + db.CreateAccount(contract) + db.SetState(contract, storageKey, initVal) + suite.Require().NoError(db.Commit()) + + // Outer EVM: read the key (populates originStorage), then dirty it + db = statedb.New(ctx, keeper, emptyTxConfig) + state := db.GetState(contract, storageKey) + suite.Require().Equal(initVal, state, "outer should read initial value") + db.SetState(contract, storageKey, common.BigToHash(big.NewInt(10))) + + // Inner native action modifies the same storage key via keeper directly + db.ExecuteNativeAction(contract, nil, func(innerCtx sdk.Context) error { + innerDB := statedb.NewWithParams(innerCtx, keeper, emptyTxConfig, "uphoton") + innerDB.SetState(contract, storageKey, common.BigToHash(big.NewInt(1100))) + return innerDB.Commit() + }) + + // Commit should fail: outer dirty and inner native action both wrote to storageKey + err := db.Commit() + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "state conflict") +} + +// TestNestedStateDBNoConflict verifies that Commit() succeeds when the outer EVM and +// an inner native action modify different storage keys (non-overlapping writes). +func (suite *StateDBTestSuite) TestNestedStateDBNoConflict() { + _, ctx, keeper := setupTestEnv(suite.T()) + + contract := common.BigToAddress(big.NewInt(998)) + keyA := common.BigToHash(big.NewInt(1)) + keyB := common.BigToHash(big.NewInt(2)) + initA := common.BigToHash(big.NewInt(100)) + initB := common.BigToHash(big.NewInt(200)) + + // Setup: write initial values + db := statedb.New(ctx, keeper, emptyTxConfig) + db.CreateAccount(contract) + db.SetState(contract, keyA, initA) + db.SetState(contract, keyB, initB) + suite.Require().NoError(db.Commit()) + + // Outer EVM: dirty key A only + db = statedb.New(ctx, keeper, emptyTxConfig) + db.GetState(contract, keyA) // populate originStorage + db.SetState(contract, keyA, common.BigToHash(big.NewInt(150))) + + // Inner native action: modify key B only (no overlap) + db.ExecuteNativeAction(contract, nil, func(innerCtx sdk.Context) error { + innerDB := statedb.NewWithParams(innerCtx, keeper, emptyTxConfig, "uphoton") + innerDB.GetState(contract, keyB) // populate originStorage + innerDB.SetState(contract, keyB, common.BigToHash(big.NewInt(250))) + return innerDB.Commit() + }) + + // Commit should succeed: no overlapping keys + suite.Require().NoError(db.Commit()) + + // Verify both values persisted correctly + suite.Require().Equal(common.BigToHash(big.NewInt(150)), keeper.GetState(ctx, contract, keyA)) + suite.Require().Equal(common.BigToHash(big.NewInt(250)), keeper.GetState(ctx, contract, keyB)) +} + +// TestNestedStateDBInnerOnlyWrite verifies that Commit() succeeds when only the inner +// native action modifies a storage key (outer has no dirty write for that key). +func (suite *StateDBTestSuite) TestNestedStateDBInnerOnlyWrite() { + _, ctx, keeper := setupTestEnv(suite.T()) + + contract := common.BigToAddress(big.NewInt(997)) + storageKey := common.BigToHash(big.NewInt(1)) + initVal := common.BigToHash(big.NewInt(500)) + + // Setup + db := statedb.New(ctx, keeper, emptyTxConfig) + db.CreateAccount(contract) + db.SetState(contract, storageKey, initVal) + suite.Require().NoError(db.Commit()) + + // Outer EVM: does NOT write to storageKey + db = statedb.New(ctx, keeper, emptyTxConfig) + + innerVal := common.BigToHash(big.NewInt(600)) + // Inner native action: modify the key + db.ExecuteNativeAction(contract, nil, func(innerCtx sdk.Context) error { + innerDB := statedb.NewWithParams(innerCtx, keeper, emptyTxConfig, "uphoton") + innerDB.GetState(contract, storageKey) + innerDB.SetState(contract, storageKey, innerVal) + return innerDB.Commit() + }) + + // Commit should succeed: outer has no dirty write for storageKey + suite.Require().NoError(db.Commit()) + + // Inner's value persists + suite.Require().Equal(innerVal, keeper.GetState(ctx, contract, storageKey)) +} + +// TestReentryAttack checks that a conflict between EVM-dirty storage (outer) and a nested +// native write (inner) is detected and that the failed tx does not persist the outer’s dirty +// value. Before the fix, Commit could succeed and apply 10, clobbering the inner write. +func (suite *StateDBTestSuite) TestReentryAttack() { + _, ctx, keeper := setupTestEnv(suite.T()) + + newContext, commit := ctx.CacheContext() + + contract := common.BigToAddress(big.NewInt(999)) + storageKey := common.BigToHash(big.NewInt(1)) + initVal := common.BigToHash(big.NewInt(1000)) + + // Last successful state on this branch: storage = 1000. + outerDB := statedb.New(newContext, keeper, emptyTxConfig) + outerDB.CreateAccount(contract) + outerDB.SetState(contract, storageKey, initVal) + suite.Require().NoError(outerDB.Commit()) + + // Outer EVM pass: load 1000 from state, then mark the slot dirty as 10 (e.g. transfer out). + outerDB = statedb.New(newContext, keeper, emptyTxConfig) + state := outerDB.GetState(contract, storageKey) + suite.Require().Equal(initVal, state, "outer should read initial value of 1000") + outerDB.SetState(contract, storageKey, common.BigToHash(big.NewInt(10))) + + // Inner native pass: reads the real store (1000), not the outer’s dirty 10; commits 1100. + outerDB.ExecuteNativeAction(contract, nil, func(innerCtx sdk.Context) error { + innerDB := statedb.NewWithParams(innerCtx, keeper, emptyTxConfig, "uphoton") + innerVal := innerDB.GetState(contract, storageKey) + suite.Require().Equal(initVal, innerVal, "inner should see 1000, not outer's dirty 10") + + innerDB.SetState(contract, storageKey, common.BigToHash(big.NewInt(1100))) + return innerDB.Commit() + }) + + // Same slot: outer dirty (10) vs inner (1100) → Commit must return ErrStateConflict and + // must not flush this tx to the parent store (see Commit() comment in statedb.go). + err := outerDB.Commit() + suite.Require().Error(err, "Commit should detect the state conflict") + suite.Require().Contains(err.Error(), "state conflict") + + // Merge the cache branch into the test root ctx. The parent should still show 1000 + // (last committed value on the branch). It must not show 10 (outer dirty). + commit() + finalVal := keeper.GetState(ctx, contract, storageKey) + suite.Require().Equal(initVal, finalVal) +} + +// TestNestedStateDBSameValueNoConflict verifies that Commit() succeeds when both +// the outer EVM and an inner native action write the same value to the same storage key. +// Even though both sides touched the slot, they agree on the final value, so there is +// no real conflict. +func (suite *StateDBTestSuite) TestNestedStateDBSameValueNoConflict() { + _, ctx, keeper := setupTestEnv(suite.T()) + + contract := common.BigToAddress(big.NewInt(996)) + storageKey := common.BigToHash(big.NewInt(1)) + initVal := common.BigToHash(big.NewInt(1000)) + agreedVal := common.BigToHash(big.NewInt(2000)) + + db := statedb.New(ctx, keeper, emptyTxConfig) + db.CreateAccount(contract) + db.SetState(contract, storageKey, initVal) + suite.Require().NoError(db.Commit()) + + db = statedb.New(ctx, keeper, emptyTxConfig) + state := db.GetState(contract, storageKey) + suite.Require().Equal(initVal, state, "outer should read initial value") + db.SetState(contract, storageKey, agreedVal) + + db.ExecuteNativeAction(contract, nil, func(innerCtx sdk.Context) error { + innerDB := statedb.NewWithParams(innerCtx, keeper, emptyTxConfig, "uphoton") + innerDB.GetState(contract, storageKey) + innerDB.SetState(contract, storageKey, agreedVal) + return innerDB.Commit() + }) + + suite.Require().NoError(db.Commit()) + + suite.Require().Equal(agreedVal, keeper.GetState(ctx, contract, storageKey)) +} + +// TestSelfDestructPostDestructionBalanceBurned verifies that any balance credited to a +// self-destructed address within the same transaction is burned at commit time rather +// than left as an orphaned bank balance recoverable by recreating the address. +func (suite *StateDBTestSuite) TestSelfDestructPostDestructionBalanceBurned() { + raw, ctx, keeper := setupTestEnv(suite.T()) + + // Setup: create a contract account with initial balance and code. + db := statedb.New(ctx, keeper, emptyTxConfig) + db.CreateAccount(address) + db.CreateContract(address) + db.SetCode(address, []byte("contract code"), 0) + db.AddBalance(address, uint256.NewInt(100), tracing.BalanceChangeTransfer) + suite.Require().NoError(db.Commit()) + + ctx, keeper = newTestKeeper(suite.T(), raw) + + // Phase 1: Self-destruct the contract; its initial balance (100) must be burned. + db = statedb.New(ctx, keeper, emptyTxConfig) + db.SelfDestruct(address) + suite.Require().True(db.HasSelfDestructed(address)) + suite.Require().Equal(uint256.NewInt(0), db.GetBalance(address)) + + // Phase 2: Send value to the already-destroyed address in the same transaction. + // This simulates a CALL with value to a self-destructed contract. + postDestructValue := uint256.NewInt(500) + db.AddBalance(address, postDestructValue, tracing.BalanceChangeTransfer) + suite.Require().Equal(postDestructValue, db.GetBalance(address)) + + suite.Require().NoError(db.Commit()) + + // After commit: account metadata must be gone. + ctx, keeper = newTestKeeper(suite.T(), raw) + suite.Require().Nil(keeper.GetAccount(ctx, address)) + + // The post-destruction balance must be burned (zero), not preserved. + cosmosAddr := sdk.AccAddress(address.Bytes()) + balance := keeper.GetBalance(ctx, cosmosAddr, "uphoton") + suite.Require().True(balance.IsZero(), "post-selfdestruct balance must be burned at commit") +} + +// TestSelfDestructNoPostDestructionBalance verifies that the normal self-destruct path +// (no post-destruction transfers) still works correctly after the fix. +func (suite *StateDBTestSuite) TestSelfDestructNoPostDestructionBalance() { + raw, ctx, keeper := setupTestEnv(suite.T()) + + db := statedb.New(ctx, keeper, emptyTxConfig) + db.CreateAccount(address) + db.CreateContract(address) + db.SetCode(address, []byte("contract code"), 0) + db.AddBalance(address, uint256.NewInt(200), tracing.BalanceChangeTransfer) + suite.Require().NoError(db.Commit()) + + ctx, keeper = newTestKeeper(suite.T(), raw) + + db = statedb.New(ctx, keeper, emptyTxConfig) + db.SelfDestruct(address) + suite.Require().NoError(db.Commit()) + + ctx, keeper = newTestKeeper(suite.T(), raw) + suite.Require().Nil(keeper.GetAccount(ctx, address)) + + cosmosAddr := sdk.AccAddress(address.Bytes()) + balance := keeper.GetBalance(ctx, cosmosAddr, "uphoton") + suite.Require().True(balance.IsZero(), "post-selfdestruct balance must be 0 after normal selfdestruct path") +} + +func (suite *StateDBTestSuite) TestDoubleCommit() { + _, ctx, keeper := setupTestEnv(suite.T()) + db := statedb.New(ctx, keeper, emptyTxConfig) + suite.Require().NoError(db.Commit()) + err := db.Commit() + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "already committed") +} + func TestStateDBTestSuite(t *testing.T) { suite.Run(t, &StateDBTestSuite{}) } diff --git a/x/evm/types/access_list.go b/x/evm/types/access_list.go index 4e0b18cd13..fe4ede22cb 100644 --- a/x/evm/types/access_list.go +++ b/x/evm/types/access_list.go @@ -17,6 +17,7 @@ package types import ( "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" ) @@ -31,18 +32,18 @@ func NewAccessList(ethAccessList *ethtypes.AccessList) AccessList { return nil } - al := AccessList{} - for _, tuple := range *ethAccessList { + al := make(AccessList, len(*ethAccessList)) + for i, tuple := range *ethAccessList { storageKeys := make([]string, len(tuple.StorageKeys)) - for i := range tuple.StorageKeys { - storageKeys[i] = tuple.StorageKeys[i].String() + for j := range tuple.StorageKeys { + storageKeys[j] = tuple.StorageKeys[j].String() } - al = append(al, AccessTuple{ + al[i] = AccessTuple{ Address: tuple.Address.String(), StorageKeys: storageKeys, - }) + } } return al @@ -51,20 +52,26 @@ func NewAccessList(ethAccessList *ethtypes.AccessList) AccessList { // ToEthAccessList is an utility function to convert the protobuf compatible // AccessList to eth core AccessList from go-ethereum func (al AccessList) ToEthAccessList() *ethtypes.AccessList { - var ethAccessList ethtypes.AccessList + ethAccessList := make(ethtypes.AccessList, len(al)) - for _, tuple := range al { + for i, tuple := range al { storageKeys := make([]common.Hash, len(tuple.StorageKeys)) - for i := range tuple.StorageKeys { - storageKeys[i] = common.HexToHash(tuple.StorageKeys[i]) + for j := range tuple.StorageKeys { + storageKeys[j] = common.HexToHash(tuple.StorageKeys[j]) } - ethAccessList = append(ethAccessList, ethtypes.AccessTuple{ + ethAccessList[i] = ethtypes.AccessTuple{ Address: common.HexToAddress(tuple.Address), StorageKeys: storageKeys, - }) + } } return ðAccessList } + +type AccessListResult struct { + AccessList ethtypes.AccessList `json:"accessList"` + GasUsed hexutil.Uint64 `json:"gasUsed"` + Error string `json:"error,omitempty"` +} diff --git a/x/evm/types/auth_list.go b/x/evm/types/auth_list.go new file mode 100644 index 0000000000..7afae49969 --- /dev/null +++ b/x/evm/types/auth_list.go @@ -0,0 +1,54 @@ +package types + +import ( + sdkmath "cosmossdk.io/math" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/holiman/uint256" +) + +type AuthList []SetCodeAuthorization + +func NewAuthList(ethAuthList *[]ethtypes.SetCodeAuthorization) AuthList { + if ethAuthList == nil { + return nil + } + + al := make([]SetCodeAuthorization, len(*ethAuthList)) + for i, auth := range *ethAuthList { + chainID := sdkmath.NewIntFromBigInt(auth.ChainID.ToBig()) + + al[i] = SetCodeAuthorization{ + ChainID: &chainID, + Address: auth.Address.String(), + Nonce: auth.Nonce, + V: []byte{auth.V}, + R: auth.R.Bytes(), + S: auth.S.Bytes(), + } + } + return al +} + +func (al AuthList) ToEthAuthList() *[]ethtypes.SetCodeAuthorization { + ethAuthList := make([]ethtypes.SetCodeAuthorization, len(al)) + + for i, auth := range al { + chainID := new(uint256.Int) + chainID.SetFromBig(auth.ChainID.BigInt()) + + r := uint256.NewInt(0).SetBytes(auth.R) + s := uint256.NewInt(0).SetBytes(auth.S) + + ethAuthList[i] = ethtypes.SetCodeAuthorization{ + ChainID: *chainID, + Address: common.HexToAddress(auth.Address), + Nonce: auth.Nonce, + V: auth.V[0], + R: *r, + S: *s, + } + } + + return ðAuthList +} diff --git a/x/evm/types/chain_config.go b/x/evm/types/chain_config.go index 8d55bcfe5b..7020236b83 100644 --- a/x/evm/types/chain_config.go +++ b/x/evm/types/chain_config.go @@ -52,6 +52,8 @@ func (cc ChainConfig) EthereumConfig(chainID *big.Int) *params.ChainConfig { ShanghaiTime: getTimeValue(cc.ShanghaiTime), CancunTime: getTimeValue(cc.CancunTime), PragueTime: getTimeValue(cc.PragueTime), + OsakaTime: getTimeValue(cc.OsakaTime), + BlobScheduleConfig: params.DefaultBlobSchedule, } return cfg } @@ -74,6 +76,9 @@ func DefaultChainConfig() ChainConfig { grayGlacierBlock := sdkmath.ZeroInt() mergeNetsplitBlock := sdkmath.ZeroInt() shanghaiTime := sdkmath.ZeroInt() + cancunTime := sdkmath.ZeroInt() + pragueTime := sdkmath.ZeroInt() + osakaTime := sdkmath.ZeroInt() return ChainConfig{ HomesteadBlock: &homesteadBlock, @@ -94,6 +99,9 @@ func DefaultChainConfig() ChainConfig { GrayGlacierBlock: &grayGlacierBlock, MergeNetsplitBlock: &mergeNetsplitBlock, ShanghaiTime: &shanghaiTime, + CancunTime: &cancunTime, + PragueTime: &pragueTime, + OsakaTime: &osakaTime, } } @@ -173,6 +181,9 @@ func (cc ChainConfig) Validate() error { if err := ValidateTime(cc.PragueTime); err != nil { return errorsmod.Wrap(err, "PragueTime") } + if err := ValidateTime(cc.OsakaTime); err != nil { + return errorsmod.Wrap(err, "OsakaTime") + } // NOTE: chain ID is not needed to check config order if err := cc.EthereumConfig(nil).CheckConfigForkOrder(); err != nil { return errorsmod.Wrap(err, "invalid config fork order") diff --git a/x/evm/types/chain_config.pb.go b/x/evm/types/chain_config.pb.go index 933635d904..d8fe8a14d4 100644 --- a/x/evm/types/chain_config.pb.go +++ b/x/evm/types/chain_config.pb.go @@ -68,6 +68,8 @@ type ChainConfig struct { CancunTime *cosmossdk_io_math.Int `protobuf:"bytes,23,opt,name=cancun_time,json=cancunTime,proto3,customtype=cosmossdk.io/math.Int" json:"cancun_time,omitempty" yaml:"cancun_time"` // prague switch time (nil = no fork, 0 = already on prague) PragueTime *cosmossdk_io_math.Int `protobuf:"bytes,24,opt,name=prague_time,json=pragueTime,proto3,customtype=cosmossdk.io/math.Int" json:"prague_time,omitempty" yaml:"prague_time"` + // osaka switch time (nil = no fork, 0 = already on osaka) + OsakaTime *cosmossdk_io_math.Int `protobuf:"bytes,25,opt,name=osaka_time,json=osakaTime,proto3,customtype=cosmossdk.io/math.Int" json:"osaka_time,omitempty" yaml:"osaka_time"` } func (m *ChainConfig) Reset() { *m = ChainConfig{} } @@ -126,58 +128,60 @@ func init() { } var fileDescriptor_7a2bf715c16bc5d4 = []byte{ - // 809 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0xcf, 0x6e, 0xf3, 0x44, - 0x14, 0xc5, 0x1b, 0x08, 0x1f, 0xe9, 0x38, 0x71, 0x5c, 0x27, 0x6d, 0x43, 0x91, 0x92, 0x6a, 0x90, - 0x50, 0x37, 0x24, 0x0d, 0x25, 0x10, 0xb1, 0x01, 0x52, 0xfe, 0x35, 0x0b, 0xa8, 0xa6, 0x08, 0x04, - 0x42, 0xb2, 0xc6, 0xce, 0xd4, 0x36, 0xb1, 0x3d, 0x96, 0x3d, 0x4e, 0x09, 0x4f, 0xc1, 0x63, 0xc1, - 0xae, 0x4b, 0xc4, 0x22, 0x42, 0xe9, 0x1b, 0xf4, 0x09, 0x90, 0x67, 0x26, 0x4e, 0x9c, 0xe6, 0xb3, - 0xb2, 0xeb, 0x3d, 0xbe, 0xe7, 0x77, 0xae, 0xaf, 0xc6, 0xcd, 0x80, 0xf7, 0x08, 0x73, 0x48, 0xe4, - 0xbb, 0x01, 0xeb, 0x91, 0x99, 0xdf, 0x9b, 0xf5, 0x7b, 0x96, 0x83, 0xdd, 0xc0, 0xb0, 0x68, 0x70, - 0xef, 0xda, 0xdd, 0x30, 0xa2, 0x8c, 0xea, 0x5a, 0xd6, 0xd4, 0x25, 0x33, 0xbf, 0x3b, 0xeb, 0x9f, - 0x35, 0x6d, 0x6a, 0x53, 0xfe, 0xb0, 0x97, 0xfe, 0x25, 0xfa, 0xe0, 0xdf, 0x75, 0xa0, 0x5c, 0xa7, - 0xf6, 0x6b, 0xee, 0xd6, 0x7f, 0x05, 0x75, 0x87, 0xfa, 0x24, 0x66, 0x04, 0x4f, 0x0c, 0xd3, 0xa3, - 0xd6, 0xb4, 0x55, 0x3a, 0x2f, 0x5d, 0x1c, 0x8e, 0xae, 0xfe, 0x5d, 0x74, 0x8e, 0x2d, 0x1a, 0xfb, - 0x34, 0x8e, 0x27, 0xd3, 0xae, 0x4b, 0x7b, 0x3e, 0x66, 0x4e, 0xf7, 0x26, 0x60, 0xcf, 0x8b, 0xce, - 0xc9, 0x1c, 0xfb, 0xde, 0xa7, 0x70, 0xcb, 0x09, 0x91, 0x9a, 0x29, 0xa3, 0x54, 0xd0, 0x1d, 0xa0, - 0x4e, 0x30, 0x35, 0xee, 0x69, 0x34, 0x95, 0xf0, 0x37, 0x38, 0x7c, 0xf4, 0x5a, 0xf8, 0x72, 0xd1, - 0xa9, 0x7e, 0xf9, 0xc5, 0xf7, 0x5f, 0xd3, 0x68, 0xca, 0x11, 0xcf, 0x8b, 0xce, 0xb1, 0x08, 0xcb, - 0x83, 0x20, 0xaa, 0x4e, 0x30, 0xcd, 0xda, 0xf4, 0x9f, 0x80, 0x96, 0x35, 0xc4, 0x49, 0x18, 0xd2, - 0x88, 0xb5, 0xde, 0x3c, 0x2f, 0x5d, 0x54, 0x46, 0x1f, 0x2c, 0x17, 0x1d, 0x55, 0x22, 0xef, 0xc4, - 0x93, 0xe7, 0x45, 0xe7, 0x74, 0x0b, 0x2a, 0x3d, 0x10, 0xa9, 0x12, 0x2b, 0x5b, 0x75, 0x13, 0x54, - 0x89, 0x1b, 0xf6, 0x07, 0x97, 0xf2, 0x05, 0xca, 0xfc, 0x05, 0x3e, 0x2b, 0x7a, 0x01, 0xe5, 0xab, - 0x9b, 0xdb, 0xfe, 0xe0, 0x72, 0x35, 0x7f, 0x43, 0x44, 0x6d, 0x52, 0x20, 0x52, 0x44, 0x29, 0x86, - 0xbf, 0x01, 0xb2, 0x34, 0x1c, 0x1c, 0x3b, 0xad, 0xb7, 0x78, 0xc4, 0xc5, 0x72, 0xd1, 0x01, 0x82, - 0xf4, 0x2d, 0x8e, 0x9d, 0xf5, 0xd6, 0xcd, 0xf9, 0x1f, 0x38, 0x60, 0x6e, 0xe2, 0xaf, 0x58, 0x40, - 0x98, 0xd3, 0xae, 0x6c, 0xdc, 0x81, 0x1c, 0xf7, 0xd5, 0xbe, 0xe3, 0x0e, 0x76, 0x8d, 0x3b, 0xc8, - 0x8f, 0x2b, 0x7a, 0xb2, 0x8c, 0xa1, 0xcc, 0x78, 0x7b, 0xdf, 0x8c, 0xe1, 0xae, 0x8c, 0x61, 0x3e, - 0x43, 0xf4, 0xa4, 0xe7, 0x72, 0xeb, 0x3d, 0x5b, 0x95, 0xbd, 0xcf, 0xe5, 0x8b, 0x0d, 0xa9, 0x99, - 0x22, 0xe8, 0x53, 0xd0, 0xb4, 0x68, 0x10, 0xb3, 0x54, 0x0b, 0x68, 0xe8, 0x11, 0x19, 0x71, 0xc8, - 0x23, 0x86, 0x45, 0x11, 0xef, 0x8a, 0x88, 0x5d, 0x76, 0x88, 0x1a, 0x79, 0x59, 0x84, 0x19, 0x40, - 0x0b, 0x09, 0x23, 0x51, 0x6c, 0x26, 0x91, 0x2d, 0x83, 0x00, 0x0f, 0xfa, 0xa8, 0x28, 0x48, 0x9e, - 0xd0, 0x6d, 0x2b, 0x44, 0xf5, 0xb5, 0x24, 0x02, 0x7e, 0x06, 0xaa, 0x9b, 0xa6, 0x9a, 0x89, 0x27, - 0xf1, 0x0a, 0xc7, 0x7f, 0x58, 0x84, 0x97, 0x5f, 0x55, 0xde, 0x08, 0x51, 0x6d, 0x25, 0x08, 0xf4, - 0x04, 0xe8, 0x7e, 0xe2, 0x46, 0x86, 0xed, 0x61, 0xcb, 0x25, 0x91, 0xc4, 0x57, 0x39, 0xfe, 0xe3, - 0x22, 0xfc, 0x3b, 0x02, 0xff, 0xd2, 0x0c, 0x91, 0x96, 0x8a, 0xdf, 0x08, 0x4d, 0xa4, 0xdc, 0x81, - 0xaa, 0x49, 0x22, 0xcf, 0x0d, 0x24, 0xbf, 0xc6, 0xf9, 0x97, 0x45, 0x7c, 0x79, 0x82, 0x36, 0x6d, - 0x10, 0x29, 0xa2, 0xcc, 0xa0, 0x1e, 0x0d, 0x26, 0x74, 0x05, 0x3d, 0xda, 0x1b, 0xba, 0x69, 0x83, - 0x48, 0x11, 0xa5, 0x80, 0xda, 0xa0, 0x81, 0xa3, 0x88, 0x3e, 0x6c, 0x2d, 0x44, 0xe7, 0xec, 0x4f, - 0x8a, 0xd8, 0x67, 0x82, 0xbd, 0xc3, 0x0d, 0xd1, 0x11, 0x57, 0x73, 0x2b, 0x99, 0x00, 0xdd, 0x8e, - 0xf0, 0x7c, 0x2b, 0xa7, 0xb9, 0xf7, 0xe2, 0x5f, 0x9a, 0x21, 0xd2, 0x52, 0x31, 0x97, 0xf2, 0x1b, - 0x68, 0xfa, 0x24, 0xb2, 0x89, 0x11, 0x10, 0x16, 0x87, 0x9e, 0xcb, 0x64, 0xce, 0xf1, 0xde, 0xdf, - 0xc1, 0x2e, 0x3b, 0x44, 0x3a, 0x97, 0xbf, 0x93, 0xaa, 0xc8, 0xfa, 0x11, 0xd4, 0x62, 0x07, 0x07, - 0xb6, 0x83, 0x5d, 0x83, 0xb9, 0x3e, 0x69, 0x9d, 0xf0, 0x90, 0x7e, 0x51, 0x48, 0x53, 0x84, 0xe4, - 0x7c, 0x10, 0x55, 0x57, 0xf5, 0x0f, 0xae, 0x4f, 0xf4, 0x5b, 0xa0, 0x58, 0x38, 0xb0, 0x92, 0x40, - 0x50, 0x4f, 0x39, 0xb5, 0x57, 0x44, 0xd5, 0xe5, 0x27, 0xbc, 0x76, 0x41, 0x04, 0x44, 0xb5, 0x22, - 0x86, 0x11, 0xb6, 0x13, 0x22, 0x88, 0xad, 0xbd, 0x89, 0x1b, 0x2e, 0x88, 0x80, 0xa8, 0x52, 0xe2, - 0xb8, 0x5c, 0x51, 0xb5, 0xfa, 0xb8, 0x5c, 0xa9, 0x6b, 0xda, 0xb8, 0x5c, 0xd1, 0xb4, 0xa3, 0x71, - 0xb9, 0xd2, 0xd0, 0x9a, 0xa8, 0x36, 0xa7, 0x1e, 0x35, 0x66, 0x57, 0x62, 0x6f, 0x48, 0x21, 0x0f, - 0x38, 0x96, 0xff, 0xb4, 0x90, 0x6a, 0x61, 0x86, 0xbd, 0x79, 0x2c, 0x97, 0x8a, 0x34, 0xb1, 0xea, - 0xf5, 0x4f, 0xe0, 0xe8, 0xf3, 0xbf, 0x96, 0xed, 0xd2, 0xe3, 0xb2, 0x5d, 0xfa, 0x6f, 0xd9, 0x2e, - 0xfd, 0xf9, 0xd4, 0x3e, 0x78, 0x7c, 0x6a, 0x1f, 0xfc, 0xf3, 0xd4, 0x3e, 0xf8, 0xe5, 0x7d, 0xdb, - 0x65, 0x4e, 0x62, 0x76, 0x2d, 0xea, 0xa7, 0x77, 0x06, 0x1a, 0xf7, 0xd6, 0x77, 0x88, 0xdf, 0xf9, - 0x2d, 0x82, 0xcd, 0x43, 0x12, 0x9b, 0xaf, 0xf8, 0xa5, 0xe0, 0xea, 0xff, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x9d, 0xd4, 0x41, 0xff, 0x63, 0x08, 0x00, 0x00, + // 835 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0xdf, 0x6e, 0xe3, 0x44, + 0x14, 0xc6, 0x1b, 0x08, 0x4b, 0x3a, 0x49, 0x5d, 0xd7, 0x4d, 0x77, 0xb3, 0x8b, 0x94, 0xac, 0x06, + 0x09, 0xf5, 0x86, 0xa4, 0xa1, 0x04, 0x2a, 0x6e, 0x80, 0x2c, 0xff, 0x5a, 0x09, 0x58, 0xcd, 0x22, + 0x10, 0x08, 0xc9, 0x1a, 0x3b, 0xb3, 0xb6, 0x89, 0xed, 0xb1, 0x3c, 0xe3, 0x2c, 0xe1, 0x29, 0xb8, + 0xe4, 0x91, 0xb8, 0xec, 0x25, 0xe2, 0x22, 0x42, 0xe9, 0x1b, 0xf4, 0x09, 0x90, 0xe7, 0x4c, 0x9c, + 0x3a, 0xcd, 0x5a, 0xb9, 0xeb, 0xf9, 0x7c, 0xbe, 0xdf, 0x77, 0x66, 0x3c, 0x6e, 0x06, 0xbd, 0xcb, + 0xa4, 0xcf, 0xd2, 0x28, 0x88, 0xe5, 0x80, 0xcd, 0xa2, 0xc1, 0x6c, 0x38, 0x70, 0x7d, 0x1a, 0xc4, + 0xb6, 0xcb, 0xe3, 0x97, 0x81, 0xd7, 0x4f, 0x52, 0x2e, 0xb9, 0x65, 0x16, 0x4d, 0x7d, 0x36, 0x8b, + 0xfa, 0xb3, 0xe1, 0x93, 0xb6, 0xc7, 0x3d, 0xae, 0x1e, 0x0e, 0xf2, 0xbf, 0xa0, 0x0f, 0xff, 0x65, + 0xa2, 0xe6, 0xb3, 0xdc, 0xfe, 0x4c, 0xb9, 0xad, 0x5f, 0xd1, 0xa1, 0xcf, 0x23, 0x26, 0x24, 0xa3, + 0x13, 0xdb, 0x09, 0xb9, 0x3b, 0xed, 0xd4, 0x9e, 0xd6, 0x4e, 0xf7, 0xc7, 0xe7, 0xff, 0x2e, 0x7a, + 0x27, 0x2e, 0x17, 0x11, 0x17, 0x62, 0x32, 0xed, 0x07, 0x7c, 0x10, 0x51, 0xe9, 0xf7, 0x2f, 0x63, + 0x79, 0xbb, 0xe8, 0x3d, 0x9c, 0xd3, 0x28, 0xfc, 0x04, 0x6f, 0x38, 0x31, 0x31, 0x0a, 0x65, 0x9c, + 0x0b, 0x96, 0x8f, 0x8c, 0x09, 0xe5, 0xf6, 0x4b, 0x9e, 0x4e, 0x35, 0xfc, 0x0d, 0x05, 0x1f, 0xbf, + 0x16, 0xbe, 0x5c, 0xf4, 0x5a, 0x5f, 0x7c, 0xfe, 0xfd, 0x57, 0x3c, 0x9d, 0x2a, 0xc4, 0xed, 0xa2, + 0x77, 0x02, 0x61, 0x65, 0x10, 0x26, 0xad, 0x09, 0xe5, 0x45, 0x9b, 0xf5, 0x13, 0x32, 0x8b, 0x06, + 0x91, 0x25, 0x09, 0x4f, 0x65, 0xe7, 0xcd, 0xa7, 0xb5, 0xd3, 0xc6, 0xf8, 0xfd, 0xe5, 0xa2, 0x67, + 0x68, 0xe4, 0x0b, 0x78, 0x72, 0xbb, 0xe8, 0x3d, 0xda, 0x80, 0x6a, 0x0f, 0x26, 0x86, 0xc6, 0xea, + 0x56, 0xcb, 0x41, 0x2d, 0x16, 0x24, 0xc3, 0xd1, 0x99, 0x5e, 0x40, 0x5d, 0x2d, 0xe0, 0xd3, 0xaa, + 0x05, 0x34, 0xbf, 0xbc, 0x7c, 0x3e, 0x1c, 0x9d, 0xad, 0xe6, 0x3f, 0x86, 0xa8, 0xbb, 0x14, 0x4c, + 0x9a, 0x50, 0xc2, 0xf0, 0x97, 0x48, 0x97, 0xb6, 0x4f, 0x85, 0xdf, 0x79, 0x4b, 0x45, 0x9c, 0x2e, + 0x17, 0x3d, 0x04, 0xa4, 0x6f, 0xa8, 0xf0, 0xd7, 0xbb, 0xee, 0xcc, 0xff, 0xa0, 0xb1, 0x0c, 0xb2, + 0x68, 0xc5, 0x42, 0x60, 0xce, 0xbb, 0x8a, 0x71, 0x47, 0x7a, 0xdc, 0x07, 0xbb, 0x8e, 0x3b, 0xda, + 0x36, 0xee, 0xa8, 0x3c, 0x2e, 0xf4, 0x14, 0x19, 0x17, 0x3a, 0xe3, 0xed, 0x5d, 0x33, 0x2e, 0xb6, + 0x65, 0x5c, 0x94, 0x33, 0xa0, 0x27, 0x3f, 0x97, 0x1b, 0xeb, 0xec, 0x34, 0x76, 0x3e, 0x97, 0xf7, + 0x76, 0xc8, 0x28, 0x14, 0xa0, 0x4f, 0x51, 0xdb, 0xe5, 0xb1, 0x90, 0xb9, 0x16, 0xf3, 0x24, 0x64, + 0x3a, 0x62, 0x5f, 0x45, 0x5c, 0x54, 0x45, 0xbc, 0x03, 0x11, 0xdb, 0xec, 0x98, 0x1c, 0x97, 0x65, + 0x08, 0xb3, 0x91, 0x99, 0x30, 0xc9, 0x52, 0xe1, 0x64, 0xa9, 0xa7, 0x83, 0x90, 0x0a, 0xfa, 0xb0, + 0x2a, 0x48, 0x9f, 0xd0, 0x4d, 0x2b, 0x26, 0x87, 0x6b, 0x09, 0x02, 0x7e, 0x46, 0x46, 0x90, 0xa7, + 0x3a, 0x59, 0xa8, 0xf1, 0x4d, 0x85, 0xff, 0xa0, 0x0a, 0xaf, 0xbf, 0xaa, 0xb2, 0x11, 0x93, 0x83, + 0x95, 0x00, 0xe8, 0x09, 0xb2, 0xa2, 0x2c, 0x48, 0x6d, 0x2f, 0xa4, 0x6e, 0xc0, 0x52, 0x8d, 0x6f, + 0x29, 0xfc, 0x47, 0x55, 0xf8, 0xc7, 0x80, 0xbf, 0x6f, 0xc6, 0xc4, 0xcc, 0xc5, 0xaf, 0x41, 0x83, + 0x94, 0x17, 0xa8, 0xe5, 0xb0, 0x34, 0x0c, 0x62, 0xcd, 0x3f, 0x50, 0xfc, 0xb3, 0x2a, 0xbe, 0x3e, + 0x41, 0x77, 0x6d, 0x98, 0x34, 0xa1, 0x2c, 0xa0, 0x21, 0x8f, 0x27, 0x7c, 0x05, 0x3d, 0xda, 0x19, + 0x7a, 0xd7, 0x86, 0x49, 0x13, 0x4a, 0x80, 0x7a, 0xe8, 0x98, 0xa6, 0x29, 0x7f, 0xb5, 0xb1, 0x21, + 0x96, 0x62, 0x7f, 0x5c, 0xc5, 0x7e, 0x02, 0xec, 0x2d, 0x6e, 0x4c, 0x8e, 0x94, 0x5a, 0xda, 0x92, + 0x09, 0xb2, 0xbc, 0x94, 0xce, 0x37, 0x72, 0xda, 0x3b, 0x6f, 0xfc, 0x7d, 0x33, 0x26, 0x66, 0x2e, + 0x96, 0x52, 0x7e, 0x43, 0xed, 0x88, 0xa5, 0x1e, 0xb3, 0x63, 0x26, 0x45, 0x12, 0x06, 0x52, 0xe7, + 0x9c, 0xec, 0xfc, 0x1d, 0x6c, 0xb3, 0x63, 0x62, 0x29, 0xf9, 0x3b, 0xad, 0x42, 0xd6, 0x8f, 0xe8, + 0x40, 0xf8, 0x34, 0xf6, 0x7c, 0x1a, 0xd8, 0x32, 0x88, 0x58, 0xe7, 0xa1, 0x0a, 0x19, 0x56, 0x85, + 0xb4, 0x21, 0xa4, 0xe4, 0xc3, 0xa4, 0xb5, 0xaa, 0x7f, 0x08, 0x22, 0x66, 0x3d, 0x47, 0x4d, 0x97, + 0xc6, 0x6e, 0x16, 0x03, 0xf5, 0x91, 0xa2, 0x0e, 0xaa, 0xa8, 0x96, 0xfe, 0x84, 0xd7, 0x2e, 0x4c, + 0x10, 0x54, 0x2b, 0x62, 0x92, 0x52, 0x2f, 0x63, 0x40, 0xec, 0xec, 0x4c, 0xbc, 0xe3, 0xc2, 0x04, + 0x41, 0xa5, 0x88, 0xdf, 0x22, 0xc4, 0x05, 0x9d, 0x52, 0x00, 0x3e, 0x56, 0xc0, 0x7e, 0x15, 0xf0, + 0x08, 0x80, 0x6b, 0x13, 0x26, 0xfb, 0xaa, 0xc8, 0x71, 0x57, 0xf5, 0x86, 0x61, 0x1e, 0x5e, 0xd5, + 0x1b, 0x87, 0xa6, 0x79, 0x55, 0x6f, 0x98, 0xe6, 0xd1, 0x55, 0xbd, 0x71, 0x6c, 0xb6, 0xc9, 0xc1, + 0x9c, 0x87, 0xdc, 0x9e, 0x9d, 0xc3, 0x6b, 0x20, 0x4d, 0xf6, 0x8a, 0x0a, 0xfd, 0x3f, 0x90, 0x18, + 0x2e, 0x95, 0x34, 0x9c, 0x0b, 0xfd, 0x8e, 0x88, 0x09, 0x6f, 0x6e, 0xfd, 0x8b, 0x3a, 0xfe, 0xec, + 0xef, 0x65, 0xb7, 0x76, 0xbd, 0xec, 0xd6, 0xfe, 0x5b, 0x76, 0x6b, 0x7f, 0xde, 0x74, 0xf7, 0xae, + 0x6f, 0xba, 0x7b, 0xff, 0xdc, 0x74, 0xf7, 0x7e, 0x79, 0xcf, 0x0b, 0xa4, 0x9f, 0x39, 0x7d, 0x97, + 0x47, 0xf9, 0x15, 0x84, 0x8b, 0xc1, 0xfa, 0x4a, 0xf2, 0xbb, 0xba, 0x94, 0xc8, 0x79, 0xc2, 0x84, + 0xf3, 0x40, 0xdd, 0x31, 0xce, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x94, 0x83, 0xea, 0xa6, 0xb2, + 0x08, 0x00, 0x00, } func (m *ChainConfig) Marshal() (dAtA []byte, err error) { @@ -200,6 +204,20 @@ func (m *ChainConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.OsakaTime != nil { + { + size := m.OsakaTime.Size() + i -= size + if _, err := m.OsakaTime.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintChainConfig(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } if m.PragueTime != nil { { size := m.PragueTime.Size() @@ -546,6 +564,10 @@ func (m *ChainConfig) Size() (n int) { l = m.PragueTime.Size() n += 2 + l + sovChainConfig(uint64(l)) } + if m.OsakaTime != nil { + l = m.OsakaTime.Size() + n += 2 + l + sovChainConfig(uint64(l)) + } return n } @@ -1284,6 +1306,42 @@ func (m *ChainConfig) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OsakaTime", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowChainConfig + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthChainConfig + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthChainConfig + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.OsakaTime = &v + if err := m.OsakaTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipChainConfig(dAtA[iNdEx:]) diff --git a/x/evm/types/codec.go b/x/evm/types/codec.go index 9b681d4846..3dc5066290 100644 --- a/x/evm/types/codec.go +++ b/x/evm/types/codec.go @@ -33,12 +33,13 @@ var ( ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) // AminoCdc is a amino codec created to support amino JSON compatible msgs. - AminoCdc = codec.NewAminoCodec(amino) //nolint:staticcheck + AminoCdc = codec.NewLegacyAmino() ) const ( // Amino names - updateParamsName = "ethermint/MsgUpdateParams" + updateParamsName = "ethermint/MsgUpdateParams" + registerPreinstallsName = "ethermint/MsgRegisterPreinstalls" ) // NOTE: This is required for the GetSignBytes function @@ -61,6 +62,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { (*sdk.Msg)(nil), &MsgEthereumTx{}, &MsgUpdateParams{}, + &MsgRegisterPreinstalls{}, ) registry.RegisterInterface( "ethermint.evm.v1.TxData", @@ -68,6 +70,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { &DynamicFeeTx{}, &AccessListTx{}, &LegacyTx{}, + &SetCodeTx{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) @@ -92,14 +95,14 @@ func PackTxData(txData TxData) (*codectypes.Any, error) { // UnpackTxData unpacks an Any into a TxData. It returns an error if the // client state can't be unpacked into a TxData. -func UnpackTxData(any *codectypes.Any) (TxData, error) { - if any == nil { +func UnpackTxData(codecAny *codectypes.Any) (TxData, error) { + if codecAny == nil { return nil, errorsmod.Wrap(errortypes.ErrUnpackAny, "protobuf Any message cannot be nil") } - txData, ok := any.GetCachedValue().(TxData) + txData, ok := codecAny.GetCachedValue().(TxData) if !ok { - return nil, errorsmod.Wrapf(errortypes.ErrUnpackAny, "cannot unpack Any into TxData %T", any) + return nil, errorsmod.Wrapf(errortypes.ErrUnpackAny, "cannot unpack Any into TxData %T", codecAny) } return txData, nil @@ -108,4 +111,5 @@ func UnpackTxData(any *codectypes.Any) (TxData, error) { // RegisterLegacyAminoCodec required for EIP-712 func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgUpdateParams{}, updateParamsName, nil) + cdc.RegisterConcrete(&MsgRegisterPreinstalls{}, registerPreinstallsName, nil) } diff --git a/x/evm/types/dynamic_fee_tx_test.go b/x/evm/types/dynamic_fee_tx_test.go index 891d033d79..997c22cc1d 100644 --- a/x/evm/types/dynamic_fee_tx_test.go +++ b/x/evm/types/dynamic_fee_tx_test.go @@ -554,7 +554,7 @@ func (suite *TxDataTestSuite) TestDynamicFeeTxValidate() { true, }, { - "chain ID not present on AccessList txs", + "chain ID not present on DynamicFee txs", DynamicFeeTx{ GasTipCap: &suite.sdkInt, GasFeeCap: &suite.sdkInt, diff --git a/x/evm/types/errors.go b/x/evm/types/errors.go index 87179c50f6..faf8663eb8 100644 --- a/x/evm/types/errors.go +++ b/x/evm/types/errors.go @@ -49,6 +49,7 @@ const ( codeErrGasOverflow codeErrInvalidAccount codeErrInvalidGasLimit + codeErrInvalidPreinstall ) var ErrPostTxProcessing = errors.New("failed to execute post processing") @@ -116,6 +117,9 @@ var ( // ErrInvalidGasLimit returns an error if gas limit value is invalid ErrInvalidGasLimit = errorsmod.Register(ModuleName, codeErrInvalidGasLimit, "invalid gas limit") + + // ErrInvalidPreinstall returns an error if a preinstall is invalid + ErrInvalidPreinstall = errorsmod.Register(ModuleName, codeErrInvalidPreinstall, "invalid preinstall") ) // NewExecErrorWithReason unpacks the revert return bytes and returns a wrapped error diff --git a/x/evm/types/eth.go b/x/evm/types/eth.go index e1fb2655bf..e6d39b120a 100644 --- a/x/evm/types/eth.go +++ b/x/evm/types/eth.go @@ -4,6 +4,7 @@ import ( "encoding/json" errorsmod "cosmossdk.io/errors" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/evmos/ethermint/types" @@ -21,7 +22,11 @@ func (tx EthereumTx) Size() int { if tx.Transaction == nil { return 0 } - return int(tx.Transaction.Size()) + size, err := types.SafeUint64ToInt(tx.Transaction.Size()) + if err != nil { + panic(err) + } + return size } func (tx EthereumTx) MarshalTo(dst []byte) (int, error) { @@ -56,6 +61,9 @@ func (tx *EthereumTx) UnmarshalJSON(bz []byte) error { } func (tx EthereumTx) MarshalJSON() ([]byte, error) { + if tx.Transaction == nil { + return []byte("null"), nil + } bz, err := tx.MarshalBinary() if err != nil { return nil, err @@ -64,21 +72,32 @@ func (tx EthereumTx) MarshalJSON() ([]byte, error) { } func (tx EthereumTx) Validate() error { + if tx.Transaction == nil { + return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "raw tx is missing") + } + // prevent txs with 0 gas to fill up the mempool if tx.Gas() == 0 { return errorsmod.Wrap(ErrInvalidGasLimit, "gas limit must not be zero") } - if !types.IsValidInt256(tx.GasPrice()) { + if tx.GasPrice().BitLen() > 256 { return errorsmod.Wrap(ErrInvalidGasPrice, "out of bound") } - if !types.IsValidInt256(tx.GasFeeCap()) { + if tx.GasFeeCap().BitLen() > 256 { return errorsmod.Wrap(ErrInvalidGasPrice, "out of bound") } - if !types.IsValidInt256(tx.GasTipCap()) { + if tx.GasTipCap().BitLen() > 256 { return errorsmod.Wrap(ErrInvalidGasPrice, "out of bound") } - if !types.IsValidInt256(tx.Cost()) { + if tx.Cost().BitLen() > 256 { return errorsmod.Wrap(ErrInvalidGasFee, "out of bound") } + if tx.GasFeeCapIntCmp(tx.GasTipCap()) < 0 { + return errorsmod.Wrapf( + ErrInvalidGasCap, + "max priority fee per gas higher than max fee per gas (%s > %s)", + tx.GasTipCap(), tx.GasFeeCap(), + ) + } return nil } diff --git a/x/evm/types/evm_result.go b/x/evm/types/evm_result.go new file mode 100644 index 0000000000..b9fde709e8 --- /dev/null +++ b/x/evm/types/evm_result.go @@ -0,0 +1,71 @@ +package types + +// EVMResult is the internal result of an EVM execution. +// It contains all the data from MsgEthereumTxResponse plus additional +// query-only fields that should NOT be included in consensus. +// +// IMPORTANT: This struct is used internally for queries (eth_call, eth_estimateGas). +// For transaction execution that affects consensus, use ToMsgResponse() to get +// the consensus-safe MsgEthereumTxResponse. +type EVMResult struct { + // Consensus fields - these are included in MsgEthereumTxResponse + // and affect the app hash through ExecTxResult.Data + + // Hash is the ethereum transaction hash in hex format + Hash string + // Logs contains the transaction hash and the proto-compatible ethereum logs + Logs []*Log + // Ret is the returned data from evm function (result or data supplied with revert opcode) + Ret []byte + // VmError is the error returned by vm execution + VmError string + // GasUsed specifies how much gas was consumed by the transaction (after minGasMultiplier adjustment) + GasUsed uint64 + // BlockHash is the block hash for json-rpc to use + BlockHash []byte + + // Query-only fields - these are NOT included in MsgEthereumTxResponse + // and do NOT affect consensus. They are only used for queries. + + // ExecutionGasUsed is the actual gas consumed during EVM execution, + // before the minGasMultiplier adjustment. This is used for gas estimation + // in eth_estimateGas queries only. + ExecutionGasUsed uint64 +} + +// ToMsgResponse converts EVMResult to MsgEthereumTxResponse for consensus. +// This method strips out query-only fields (like ExecutionGasUsed) that should +// not be included in the transaction result that gets hashed into LastResultsHash. +// +// IMPORTANT: Always use this method when returning results from transaction execution +// (ApplyTransaction). Never include query-only fields in the response that goes +// through the message service router. +func (r *EVMResult) ToMsgResponse() *MsgEthereumTxResponse { + return &MsgEthereumTxResponse{ + Hash: r.Hash, + Logs: r.Logs, + Ret: r.Ret, + VmError: r.VmError, + GasUsed: r.GasUsed, + BlockHash: r.BlockHash, + } +} + +// ToEthCallResponse converts EVMResult to EthCallResponse for query responses. +// This is used for eth_call queries and is separate from MsgEthereumTxResponse +// which is used for transaction execution and affects consensus. +func (r *EVMResult) ToEthCallResponse() *EthCallResponse { + return &EthCallResponse{ + Hash: r.Hash, + Logs: r.Logs, + Ret: r.Ret, + VmError: r.VmError, + GasUsed: r.GasUsed, + BlockHash: r.BlockHash, + } +} + +// Failed returns true if the EVM execution failed +func (r *EVMResult) Failed() bool { + return len(r.VmError) > 0 +} diff --git a/x/evm/types/evm_result_test.go b/x/evm/types/evm_result_test.go new file mode 100644 index 0000000000..1ebcc2e788 --- /dev/null +++ b/x/evm/types/evm_result_test.go @@ -0,0 +1,142 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEVMResult_ToMsgResponse(t *testing.T) { + logs := []*Log{ + { + Address: "0x1234567890abcdef1234567890abcdef12345678", + Topics: []string{"0xabcd"}, + Data: []byte("test data"), + }, + } + blockHash := []byte("block_hash_bytes") + + result := &EVMResult{ + Hash: "0xabc123", + Logs: logs, + Ret: []byte("return data"), + VmError: "", + GasUsed: 21000, + BlockHash: blockHash, + ExecutionGasUsed: 20000, + } + + msgResponse := result.ToMsgResponse() + + require.Equal(t, result.Hash, msgResponse.Hash) + require.Equal(t, result.Logs, msgResponse.Logs) + require.Equal(t, result.Ret, msgResponse.Ret) + require.Equal(t, result.VmError, msgResponse.VmError) + require.Equal(t, result.GasUsed, msgResponse.GasUsed) + require.Equal(t, result.BlockHash, msgResponse.BlockHash) +} + +func TestEVMResult_ToEthCallResponse(t *testing.T) { + logs := []*Log{ + { + Address: "0x1234567890abcdef1234567890abcdef12345678", + Topics: []string{"0xabcd"}, + Data: []byte("test data"), + }, + } + blockHash := []byte("block_hash_bytes") + + result := &EVMResult{ + Hash: "0xabc123", + Logs: logs, + Ret: []byte("return data"), + VmError: "execution reverted", + GasUsed: 21000, + BlockHash: blockHash, + ExecutionGasUsed: 20000, + } + + ethCallResponse := result.ToEthCallResponse() + + require.Equal(t, result.Hash, ethCallResponse.Hash) + require.Equal(t, result.Logs, ethCallResponse.Logs) + require.Equal(t, result.Ret, ethCallResponse.Ret) + require.Equal(t, result.VmError, ethCallResponse.VmError) + require.Equal(t, result.GasUsed, ethCallResponse.GasUsed) + require.Equal(t, result.BlockHash, ethCallResponse.BlockHash) +} + +func TestEVMResult_Failed(t *testing.T) { + testCases := []struct { + name string + vmError string + expected bool + }{ + { + name: "no error - success", + vmError: "", + expected: false, + }, + { + name: "with error - failed", + vmError: "execution reverted", + expected: true, + }, + { + name: "out of gas error", + vmError: "out of gas", + expected: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := &EVMResult{ + VmError: tc.vmError, + } + require.Equal(t, tc.expected, result.Failed()) + }) + } +} + +func TestEVMResult_ToMsgResponse_NilLogs(t *testing.T) { + result := &EVMResult{ + Hash: "0xabc123", + Logs: nil, + Ret: nil, + VmError: "", + GasUsed: 21000, + BlockHash: nil, + ExecutionGasUsed: 20000, + } + + msgResponse := result.ToMsgResponse() + + require.Equal(t, result.Hash, msgResponse.Hash) + require.Nil(t, msgResponse.Logs) + require.Nil(t, msgResponse.Ret) + require.Equal(t, result.VmError, msgResponse.VmError) + require.Equal(t, result.GasUsed, msgResponse.GasUsed) + require.Nil(t, msgResponse.BlockHash) +} + +func TestEVMResult_ToEthCallResponse_NilLogs(t *testing.T) { + result := &EVMResult{ + Hash: "0xabc123", + Logs: nil, + Ret: nil, + VmError: "", + GasUsed: 21000, + BlockHash: nil, + ExecutionGasUsed: 20000, + } + + ethCallResponse := result.ToEthCallResponse() + + require.Equal(t, result.Hash, ethCallResponse.Hash) + require.Nil(t, ethCallResponse.Logs) + require.Nil(t, ethCallResponse.Ret) + require.Equal(t, result.VmError, ethCallResponse.VmError) + require.Equal(t, result.GasUsed, ethCallResponse.GasUsed) + require.Nil(t, ethCallResponse.BlockHash) +} diff --git a/x/evm/types/genesis.go b/x/evm/types/genesis.go index 3784237a38..762d30d183 100644 --- a/x/evm/types/genesis.go +++ b/x/evm/types/genesis.go @@ -33,16 +33,18 @@ func (ga GenesisAccount) Validate() error { // chain config values. func DefaultGenesisState() *GenesisState { return &GenesisState{ - Accounts: []GenesisAccount{}, - Params: DefaultParams(), + Accounts: []GenesisAccount{}, + Params: DefaultParams(), + Preinstalls: []Preinstall{}, } } // NewGenesisState creates a new genesis state. -func NewGenesisState(params Params, accounts []GenesisAccount) *GenesisState { +func NewGenesisState(params Params, accounts []GenesisAccount, preinstalls []Preinstall) *GenesisState { return &GenesisState{ - Accounts: accounts, - Params: params, + Accounts: accounts, + Params: params, + Preinstalls: preinstalls, } } @@ -60,5 +62,24 @@ func (gs GenesisState) Validate() error { seenAccounts[acc.Address] = true } + // Validate preinstalls + seenPreinstalls := make(map[string]bool) + for _, preinstall := range gs.Preinstalls { + if seenPreinstalls[preinstall.Address] { + return fmt.Errorf("duplicated preinstall address %s", preinstall.Address) + } + if err := preinstall.Validate(); err != nil { + return fmt.Errorf("invalid preinstall %s: %w", preinstall.Address, err) + } + + // Check that preinstall address doesn't conflict with any genesis account + // Both genesis accounts and preinstalls use Ethereum hex addresses + if seenAccounts[preinstall.Address] { + return fmt.Errorf("preinstall address %s conflicts with genesis account %s", preinstall.Address, preinstall.Address) + } + + seenPreinstalls[preinstall.Address] = true + } + return gs.Params.Validate() } diff --git a/x/evm/types/genesis.pb.go b/x/evm/types/genesis.pb.go index 8b9d6f33e6..a924f6c0e3 100644 --- a/x/evm/types/genesis.pb.go +++ b/x/evm/types/genesis.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" @@ -29,6 +30,8 @@ type GenesisState struct { Accounts []GenesisAccount `protobuf:"bytes,1,rep,name=accounts,proto3" json:"accounts"` // params defines all the parameters of the module. Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"` + // preinstalls defines a set of predefined contracts + Preinstalls []Preinstall `protobuf:"bytes,3,rep,name=preinstalls,proto3" json:"preinstalls"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -78,6 +81,13 @@ func (m *GenesisState) GetParams() Params { return Params{} } +func (m *GenesisState) GetPreinstalls() []Preinstall { + if m != nil { + return m.Preinstalls + } + return nil +} + // GenesisAccount defines an account to be initialized in the genesis state. // Its main difference between with Geth's GenesisAccount is that it uses a // custom storage type and that it doesn't contain the private key field. @@ -152,27 +162,30 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/genesis.proto", fileDescriptor_9bcdec50cc9d156d) } var fileDescriptor_9bcdec50cc9d156d = []byte{ - // 305 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x50, 0x31, 0x4f, 0x83, 0x40, - 0x18, 0xe5, 0x6c, 0x53, 0xec, 0xd5, 0xa8, 0xb9, 0x98, 0x48, 0x1a, 0xbd, 0x92, 0x0e, 0x86, 0xe9, - 0x48, 0x6b, 0xe2, 0xac, 0x2c, 0xae, 0x86, 0x6e, 0x6e, 0x57, 0xf8, 0x42, 0x19, 0xe0, 0x08, 0x77, - 0x25, 0xba, 0x3a, 0x3a, 0xf9, 0x3b, 0xfc, 0x25, 0x1d, 0x3b, 0x3a, 0xa9, 0x81, 0x3f, 0x62, 0x38, - 0x68, 0x8d, 0xb2, 0x3d, 0x78, 0xef, 0x7d, 0xef, 0xdd, 0xc3, 0x14, 0xd4, 0x0a, 0xf2, 0x24, 0x4e, - 0x95, 0x0b, 0x45, 0xe2, 0x16, 0x33, 0x37, 0x82, 0x14, 0x64, 0x2c, 0x59, 0x96, 0x0b, 0x25, 0xc8, - 0xe9, 0x9e, 0x67, 0x50, 0x24, 0xac, 0x98, 0x8d, 0x2f, 0x3b, 0x8e, 0x8c, 0xe7, 0x3c, 0x69, 0x0d, - 0xe3, 0x8b, 0x0e, 0x2d, 0x15, 0x57, 0xd0, 0xb2, 0x67, 0x91, 0x88, 0x84, 0x86, 0x6e, 0x8d, 0x9a, - 0xbf, 0xd3, 0x57, 0x84, 0x8f, 0xee, 0x9b, 0xd8, 0x45, 0x2d, 0x26, 0x1e, 0x3e, 0xe4, 0x41, 0x20, - 0xd6, 0xa9, 0x92, 0x16, 0xb2, 0x7b, 0xce, 0x68, 0x6e, 0xb3, 0xff, 0x45, 0x58, 0xeb, 0xb8, 0x6b, - 0x84, 0x5e, 0x7f, 0xf3, 0x39, 0x31, 0xfc, 0xbd, 0x8f, 0xdc, 0xe0, 0x41, 0x53, 0xcc, 0x3a, 0xb0, - 0x91, 0x33, 0x9a, 0x5b, 0xdd, 0x0b, 0x0f, 0x9a, 0x6f, 0x9d, 0xad, 0x7a, 0xfa, 0x82, 0xf0, 0xf1, - 0xdf, 0xd3, 0xc4, 0xc2, 0x26, 0x0f, 0xc3, 0x1c, 0x64, 0xdd, 0x06, 0x39, 0x43, 0x7f, 0xf7, 0x49, - 0x08, 0xee, 0x07, 0x22, 0x04, 0x1d, 0x31, 0xf4, 0x35, 0x26, 0x1e, 0x36, 0xa5, 0x12, 0x39, 0x8f, - 0xc0, 0xea, 0xe9, 0xee, 0xe7, 0xdd, 0x64, 0xfd, 0x4c, 0xef, 0xa4, 0x0e, 0x7e, 0xff, 0x9a, 0x98, - 0x8b, 0x46, 0xef, 0xef, 0x8c, 0xde, 0xed, 0xa6, 0xa4, 0x68, 0x5b, 0x52, 0xf4, 0x5d, 0x52, 0xf4, - 0x56, 0x51, 0x63, 0x5b, 0x51, 0xe3, 0xa3, 0xa2, 0xc6, 0xe3, 0x55, 0x14, 0xab, 0xd5, 0x7a, 0xc9, - 0x02, 0x91, 0xd4, 0x03, 0x0b, 0xe9, 0xfe, 0x0e, 0xfe, 0xa4, 0x27, 0x57, 0xcf, 0x19, 0xc8, 0xe5, - 0x40, 0x4f, 0x7b, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0xf4, 0x26, 0xbe, 0x33, 0xe1, 0x01, 0x00, - 0x00, + // 361 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4e, 0xea, 0x40, + 0x14, 0x87, 0x3b, 0x17, 0x02, 0x97, 0xc1, 0xf8, 0x67, 0x62, 0x62, 0x43, 0x70, 0x40, 0x16, 0x86, + 0xb8, 0x68, 0x03, 0x26, 0xae, 0xb5, 0x1b, 0xe3, 0xce, 0x94, 0x9d, 0xbb, 0xa1, 0x9c, 0x94, 0x26, + 0xb4, 0x43, 0x3a, 0x43, 0xa3, 0x5b, 0x9f, 0xc0, 0xc7, 0x30, 0xae, 0x7c, 0x0c, 0x96, 0x6c, 0x4c, + 0x5c, 0xa9, 0x81, 0x85, 0xaf, 0x61, 0x3a, 0x1d, 0x8a, 0x5a, 0x37, 0xcd, 0x69, 0xcf, 0xf7, 0x3b, + 0xfd, 0x66, 0x0e, 0xa6, 0x20, 0xc7, 0x10, 0x87, 0x41, 0x24, 0x6d, 0x48, 0x42, 0x3b, 0xe9, 0xd9, + 0x3e, 0x44, 0x20, 0x02, 0x61, 0x4d, 0x63, 0x2e, 0x39, 0xd9, 0xcd, 0xfb, 0x16, 0x24, 0xa1, 0x95, + 0xf4, 0x1a, 0x7b, 0x2c, 0x0c, 0x22, 0x6e, 0xab, 0x67, 0x06, 0x35, 0x0e, 0x0b, 0x43, 0xa6, 0x2c, + 0x66, 0xa1, 0x9e, 0xd1, 0x38, 0x2a, 0xb6, 0x63, 0x08, 0x22, 0x21, 0xd9, 0x64, 0xa2, 0x91, 0x66, + 0x01, 0x11, 0x92, 0x49, 0xd0, 0xdd, 0x7d, 0x9f, 0xfb, 0x5c, 0x95, 0x76, 0x5a, 0x65, 0x5f, 0x3b, + 0x2f, 0x08, 0x6f, 0x5d, 0x66, 0xb2, 0x83, 0x14, 0x26, 0x0e, 0xfe, 0xcf, 0x3c, 0x8f, 0xcf, 0x22, + 0x29, 0x4c, 0xd4, 0x2e, 0x75, 0xeb, 0xfd, 0xb6, 0xf5, 0x5b, 0xdf, 0xd2, 0x89, 0x8b, 0x0c, 0x74, + 0xca, 0xf3, 0xb7, 0x96, 0xe1, 0xe6, 0x39, 0x72, 0x86, 0x2b, 0x99, 0xbb, 0xf9, 0xaf, 0x8d, 0xba, + 0xf5, 0xbe, 0x59, 0x9c, 0x70, 0xad, 0xfa, 0x3a, 0xa9, 0x69, 0x72, 0x85, 0xeb, 0x9b, 0x43, 0x09, + 0xb3, 0xa4, 0x7e, 0xdf, 0xfc, 0x23, 0x9c, 0x43, 0x4e, 0x2d, 0x1d, 0xf0, 0xf8, 0xf9, 0x7c, 0x82, + 0xdc, 0xef, 0xd9, 0xce, 0x3d, 0xc2, 0xdb, 0x3f, 0x2d, 0x89, 0x89, 0xab, 0x6c, 0x34, 0x8a, 0x41, + 0xa4, 0x07, 0x43, 0xdd, 0x9a, 0xbb, 0x7e, 0x25, 0x04, 0x97, 0x3d, 0x3e, 0x02, 0x65, 0x5b, 0x73, + 0x55, 0x4d, 0x1c, 0x5c, 0x15, 0x92, 0xc7, 0xcc, 0x07, 0xed, 0x71, 0x50, 0xf4, 0x50, 0x37, 0xe6, + 0xec, 0xa4, 0x0a, 0x4f, 0xef, 0xad, 0xea, 0x20, 0xe3, 0xdd, 0x75, 0xd0, 0x39, 0x9f, 0x2f, 0x29, + 0x5a, 0x2c, 0x29, 0xfa, 0x58, 0x52, 0xf4, 0xb0, 0xa2, 0xc6, 0x62, 0x45, 0x8d, 0xd7, 0x15, 0x35, + 0x6e, 0x8e, 0xfd, 0x40, 0x8e, 0x67, 0x43, 0xcb, 0xe3, 0x61, 0xba, 0x2b, 0x2e, 0xec, 0xcd, 0xee, + 0x6e, 0xd5, 0xf6, 0xe4, 0xdd, 0x14, 0xc4, 0xb0, 0xa2, 0xb6, 0x74, 0xfa, 0x15, 0x00, 0x00, 0xff, + 0xff, 0x89, 0xb0, 0x3a, 0x1c, 0x62, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -195,6 +208,20 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Preinstalls) > 0 { + for iNdEx := len(m.Preinstalls) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Preinstalls[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } { size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -298,6 +325,12 @@ func (m *GenesisState) Size() (n int) { } l = m.Params.Size() n += 1 + l + sovGenesis(uint64(l)) + if len(m.Preinstalls) > 0 { + for _, e := range m.Preinstalls { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } @@ -426,6 +459,40 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Preinstalls", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Preinstalls = append(m.Preinstalls, Preinstall{}) + if err := m.Preinstalls[len(m.Preinstalls)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/evm/types/genesis_test.go b/x/evm/types/genesis_test.go index ad3e3a155e..ce6d2e385a 100644 --- a/x/evm/types/genesis_test.go +++ b/x/evm/types/genesis_test.go @@ -117,7 +117,7 @@ func (suite *GenesisTestSuite) TestValidateGenesis() { }, { name: "copied genesis", - genState: NewGenesisState(DefaultGenesisState().Params, DefaultGenesisState().Accounts), + genState: NewGenesisState(DefaultGenesisState().Params, DefaultGenesisState().Accounts, DefaultPreinstalls), expPass: true, }, { diff --git a/x/evm/types/interfaces.go b/x/evm/types/interfaces.go index 3d30a27f6c..07c4762943 100644 --- a/x/evm/types/interfaces.go +++ b/x/evm/types/interfaces.go @@ -63,6 +63,8 @@ type StakingKeeper interface { // FeeMarketKeeper type FeeMarketKeeper interface { GetBaseFee(ctx sdk.Context) *big.Int + GetBlockGasWanted(ctx sdk.Context) uint64 + CalculateBaseFee(ctx sdk.Context) *big.Int GetParams(ctx sdk.Context) feemarkettypes.Params } diff --git a/x/evm/types/key.go b/x/evm/types/key.go index 51b19a469a..76b3ed8f5b 100644 --- a/x/evm/types/key.go +++ b/x/evm/types/key.go @@ -19,6 +19,7 @@ import ( "encoding/binary" "github.com/ethereum/go-ethereum/common" + ethermint "github.com/evmos/ethermint/types" ) const ( @@ -43,6 +44,7 @@ const ( prefixCode = iota + 1 prefixStorage prefixParams + prefixHeaderHash ) // prefix bytes for the EVM object store @@ -54,9 +56,10 @@ const ( // KVStore key prefixes var ( - KeyPrefixCode = []byte{prefixCode} - KeyPrefixStorage = []byte{prefixStorage} - KeyPrefixParams = []byte{prefixParams} + KeyPrefixCode = []byte{prefixCode} + KeyPrefixStorage = []byte{prefixStorage} + KeyPrefixParams = []byte{prefixParams} + KeyPrefixHeaderHash = []byte{prefixHeaderHash} ) // Object Store key prefixes @@ -69,25 +72,57 @@ var ( // AddressStoragePrefix returns a prefix to iterate over a given account storage. func AddressStoragePrefix(address common.Address) []byte { - return append(KeyPrefixStorage, address.Bytes()...) + var buf [1 + common.AddressLength]byte + buf[0] = prefixStorage + copy(buf[1:], address[:]) + return buf[:] } // StateKey defines the full key under which an account state is stored. -func StateKey(address common.Address, key []byte) []byte { - return append(AddressStoragePrefix(address), key...) +func StateKey(address common.Address, key common.Hash) []byte { + var buf [1 + common.AddressLength + common.HashLength]byte + buf[0] = prefixStorage + copy(buf[1:], address[:]) + copy(buf[1+common.AddressLength:], key[:]) + return buf[:] } func ObjectGasUsedKey(txIndex int) []byte { var key [1 + 8]byte key[0] = prefixObjectGasUsed - binary.BigEndian.PutUint64(key[1:], uint64(txIndex)) + if txIndex < 0 { + return key[:] + } + idx, err := ethermint.SafeIntToUint64(txIndex) + if err != nil { + panic(err) + } + binary.BigEndian.PutUint64(key[1:], idx) return key[:] } func ObjectBloomKey(txIndex, msgIndex int) []byte { var key [1 + 8 + 8]byte key[0] = prefixObjectBloom - binary.BigEndian.PutUint64(key[1:], uint64(txIndex)) - binary.BigEndian.PutUint64(key[9:], uint64(msgIndex)) + if txIndex < 0 || msgIndex < 0 { + return key[:] + } + value, err := ethermint.SafeIntToUint64(txIndex) + if err != nil { + panic(err) + } + binary.BigEndian.PutUint64(key[1:], value) + value, err = ethermint.SafeIntToUint64(msgIndex) + if err != nil { + panic(err) + } + binary.BigEndian.PutUint64(key[9:], value) + return key[:] +} + +func GetHeaderHashKey(height uint64) []byte { + var key [1 + 8]byte + key[0] = prefixHeaderHash + binary.BigEndian.PutUint64(key[1:], height) return key[:] } diff --git a/x/evm/types/key_test.go b/x/evm/types/key_test.go new file mode 100644 index 0000000000..3766bcaa4a --- /dev/null +++ b/x/evm/types/key_test.go @@ -0,0 +1,53 @@ +package types + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestAddressStoragePrefix(t *testing.T) { + addr := common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678") + + prefix := AddressStoragePrefix(addr) + + // Should be 1 byte prefix + 20 byte address = 21 bytes + require.Len(t, prefix, 1+common.AddressLength) + require.Equal(t, byte(prefixStorage), prefix[0]) + require.Equal(t, addr.Bytes(), prefix[1:]) +} + +func TestStateKey(t *testing.T) { + addr := common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678") + key := common.HexToHash("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + + stateKey := StateKey(addr, key) + + // Should be 1 byte prefix + 20 byte address + 32 byte hash = 53 bytes + require.Len(t, stateKey, 1+common.AddressLength+common.HashLength) + require.Equal(t, byte(prefixStorage), stateKey[0]) + require.Equal(t, addr.Bytes(), stateKey[1:1+common.AddressLength]) + require.Equal(t, key.Bytes(), stateKey[1+common.AddressLength:]) +} + +func TestStateKeyConsistentWithAddressStoragePrefix(t *testing.T) { + addr := common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678") + key := common.HexToHash("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + + stateKey := StateKey(addr, key) + prefix := AddressStoragePrefix(addr) + + // The state key should start with the address storage prefix + require.Equal(t, prefix, stateKey[:len(prefix)]) +} + +func TestStateKeyZeroValues(t *testing.T) { + addr := common.Address{} + key := common.Hash{} + + stateKey := StateKey(addr, key) + + require.Len(t, stateKey, 1+common.AddressLength+common.HashLength) + require.Equal(t, byte(prefixStorage), stateKey[0]) +} diff --git a/x/evm/types/logs.go b/x/evm/types/logs.go index 0289d88bdc..80fddfaa00 100644 --- a/x/evm/types/logs.go +++ b/x/evm/types/logs.go @@ -104,19 +104,24 @@ func (log *Log) ToEthereum() *ethtypes.Log { } func NewLogsFromEth(ethlogs []*ethtypes.Log) []*Log { - var logs []*Log //nolint: prealloc - for _, ethlog := range ethlogs { - logs = append(logs, NewLogFromEth(ethlog)) + if ethlogs == nil { + return nil + } + logs := make([]*Log, len(ethlogs)) + for i, ethlog := range ethlogs { + logs[i] = NewLogFromEth(ethlog) } - return logs } // LogsToEthereum casts the Ethermint Logs to a slice of Ethereum Logs. func LogsToEthereum(logs []*Log) []*ethtypes.Log { - var ethLogs []*ethtypes.Log //nolint: prealloc + if logs == nil { + return nil + } + ethLogs := make([]*ethtypes.Log, len(logs)) for i := range logs { - ethLogs = append(ethLogs, logs[i].ToEthereum()) + ethLogs[i] = logs[i].ToEthereum() } return ethLogs } diff --git a/x/evm/types/logs_test.go b/x/evm/types/logs_test.go index 8ad3d70d45..cf14859af7 100644 --- a/x/evm/types/logs_test.go +++ b/x/evm/types/logs_test.go @@ -8,6 +8,7 @@ import ( "github.com/evmos/ethermint/tests" "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" ) func TestTransactionLogsValidate(t *testing.T) { @@ -167,6 +168,56 @@ func TestValidateLog(t *testing.T) { } } +func TestNewLogsFromEth(t *testing.T) { + t.Run("nil input", func(t *testing.T) { + result := NewLogsFromEth(nil) + require.Nil(t, result) + }) + + t.Run("empty input", func(t *testing.T) { + result := NewLogsFromEth([]*ethtypes.Log{}) + require.NotNil(t, result) + require.Empty(t, result) + }) + + t.Run("preserves length", func(t *testing.T) { + addr := tests.GenerateAddress() + topic := common.BytesToHash([]byte("topic")) + ethLogs := []*ethtypes.Log{ + {Address: addr, Topics: []common.Hash{topic}, Data: []byte("a"), BlockNumber: 1, TxHash: common.BytesToHash([]byte("tx1")), BlockHash: common.BytesToHash([]byte("bh"))}, + {Address: addr, Topics: []common.Hash{topic}, Data: []byte("b"), BlockNumber: 1, TxHash: common.BytesToHash([]byte("tx1")), BlockHash: common.BytesToHash([]byte("bh"))}, + {Address: addr, Topics: []common.Hash{topic}, Data: []byte("c"), BlockNumber: 1, TxHash: common.BytesToHash([]byte("tx1")), BlockHash: common.BytesToHash([]byte("bh"))}, + } + result := NewLogsFromEth(ethLogs) + require.Len(t, result, 3) + }) +} + +func TestLogsToEthereum(t *testing.T) { + addr := tests.GenerateAddress().String() + topic := common.BytesToHash([]byte("topic")).String() + + t.Run("nil input", func(t *testing.T) { + result := LogsToEthereum(nil) + require.Nil(t, result) + }) + + t.Run("empty input", func(t *testing.T) { + result := LogsToEthereum([]*Log{}) + require.NotNil(t, result) + require.Empty(t, result) + }) + + t.Run("roundtrip preserves data", func(t *testing.T) { + logs := []*Log{ + {Address: addr, Topics: []string{topic}, Data: []byte("data"), BlockNumber: 1, TxHash: common.BytesToHash([]byte("tx")).String(), TxIndex: 0, BlockHash: common.BytesToHash([]byte("bh")).String(), Index: 0}, + } + ethLogs := LogsToEthereum(logs) + require.Len(t, ethLogs, 1) + require.Equal(t, common.HexToAddress(addr), ethLogs[0].Address) + }) +} + func TestConversionFunctions(t *testing.T) { addr := tests.GenerateAddress().String() diff --git a/x/evm/types/msg.go b/x/evm/types/msg.go index c2089b18f9..104dacb345 100644 --- a/x/evm/types/msg.go +++ b/x/evm/types/msg.go @@ -34,9 +34,9 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/ante" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + ethermint "github.com/evmos/ethermint/types" "github.com/ethereum/go-ethereum/common" - cmath "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" ) @@ -46,6 +46,7 @@ var ( _ sdk.Tx = &MsgEthereumTx{} _ ante.GasTx = &MsgEthereumTx{} _ sdk.Msg = &MsgUpdateParams{} + _ sdk.Msg = &MsgRegisterPreinstalls{} _ codectypes.UnpackInterfacesMessage = MsgEthereumTx{} ) @@ -178,11 +179,9 @@ func (msg MsgEthereumTx) ValidateBasic() error { if msg.Data != nil { return errorsmod.Wrapf(errortypes.ErrInvalidRequest, "tx data is deprecated in favor of Raw") } - if err := msg.Raw.Validate(); err != nil { return err } - return nil } @@ -283,7 +282,7 @@ func (msg MsgEthereumTx) GetEffectiveGasPrice(baseFee *big.Int) *big.Int { return tx.GasPrice() } // for legacy tx, both gasTipCap and gasFeeCap are gasPrice, the result is equavalent. - return cmath.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) + return ethermint.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap()) } // GetFrom loads the ethereum sender address from the sigcache and returns an @@ -312,22 +311,24 @@ func (msg *MsgEthereumTx) AsTransaction() *ethtypes.Transaction { func (msg *MsgEthereumTx) AsMessage(baseFee *big.Int) *core.Message { tx := msg.AsTransaction() ethMsg := &core.Message{ - Nonce: tx.Nonce(), - GasLimit: tx.Gas(), - GasPrice: new(big.Int).Set(tx.GasPrice()), - GasFeeCap: new(big.Int).Set(tx.GasFeeCap()), - GasTipCap: new(big.Int).Set(tx.GasTipCap()), - To: tx.To(), - Value: tx.Value(), - Data: tx.Data(), - AccessList: tx.AccessList(), - SkipAccountChecks: false, + Nonce: tx.Nonce(), + GasLimit: tx.Gas(), + GasPrice: new(big.Int).Set(tx.GasPrice()), + GasFeeCap: new(big.Int).Set(tx.GasFeeCap()), + GasTipCap: new(big.Int).Set(tx.GasTipCap()), + To: tx.To(), + Value: tx.Value(), + Data: tx.Data(), + AccessList: tx.AccessList(), + SetCodeAuthorizations: tx.SetCodeAuthorizations(), + SkipNonceChecks: false, + SkipTransactionChecks: false, From: common.BytesToAddress(msg.From), } // If baseFee provided, set gasPrice to effectiveGasPrice. if baseFee != nil { - ethMsg.GasPrice = cmath.BigMin(ethMsg.GasPrice.Add(ethMsg.GasTipCap, baseFee), ethMsg.GasFeeCap) + ethMsg.GasPrice = ethermint.BigMin(ethMsg.GasPrice.Add(ethMsg.GasTipCap, baseFee), ethMsg.GasFeeCap) } return ethMsg } @@ -404,7 +405,17 @@ func (m *MsgUpdateParams) ValidateBasic() error { return m.Params.Validate() } -// GetSignBytes implements the LegacyMsg interface. -func (m MsgUpdateParams) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&m)) +// ValidateBasic does a sanity check for MsgRegisterPreinstalls +func (m *MsgRegisterPreinstalls) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { + return errorsmod.Wrap(err, "invalid authority address") + } + + for _, p := range m.Preinstalls { + err := p.Validate() + if err != nil { + return err + } + } + return nil } diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index fbaaa66d49..028f38ccb7 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -8,6 +8,7 @@ import ( "testing" sdkmath "cosmossdk.io/math" + "github.com/holiman/uint256" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client" @@ -19,6 +20,7 @@ import ( "github.com/evmos/ethermint/crypto/ethsecp256k1" "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/tests" + ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/evm/types" ) @@ -652,6 +654,37 @@ func (suite *MsgsTestSuite) TestFromEthereumTx() { suite.Require().NoError(err) return tx }}, + {"success, setCodeTx", true, func() *ethtypes.Transaction { + + key1, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + key2, _ := crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") + + aa := common.HexToAddress("0x000000000000000000000000000000000000aaaa") + bb := common.HexToAddress("0x000000000000000000000000000000000000bbbb") + + auth1, _ := ethtypes.SignSetCode(key1, ethtypes.SetCodeAuthorization{ + ChainID: *uint256.MustFromBig(suite.chainID), + Address: aa, + Nonce: 1, + }) + auth2, _ := ethtypes.SignSetCode(key2, ethtypes.SetCodeAuthorization{ + Address: bb, + Nonce: 0, + }) + + tx := ethtypes.NewTx(ðtypes.SetCodeTx{ + Nonce: 0, + Data: nil, + To: suite.to, + Value: uint256.NewInt(0), + Gas: 500000, + AuthList: []ethtypes.SetCodeAuthorization{auth1, auth2}, + + }) + tx, err := ethtypes.SignTx(tx, ethtypes.NewPragueSigner(suite.chainID), ethPriv) + suite.Require().NoError(err) + return tx + }}, } for _, tc := range testCases { @@ -782,3 +815,98 @@ func assertEqual(orig *ethtypes.Transaction, cpy *ethtypes.Transaction) error { } return nil } + +func (suite *MsgsTestSuite) TestValidateEthereumTx() { + maxInt256 := ethermint.MaxInt256 + maxInt256Plus1 := new(big.Int).Add(ethermint.MaxInt256, big.NewInt(1)) + normal := big.NewInt(100) + gasLimit := uint64(21000) + testCases := []struct { + name string + tx types.EthereumTx + expError bool + }{ + { + "valid transaction", + types.NewTxWithData(ðtypes.LegacyTx{ + Gas: gasLimit, + GasPrice: normal, + Value: normal, + }).Raw, + false, + }, + { + "zero gas limit", + types.NewTxWithData(ðtypes.LegacyTx{ + Gas: 0, + GasPrice: normal, + Value: normal, + }).Raw, + true, + }, + { + "gas price exceeds int256 limit", + types.NewTxWithData(ðtypes.LegacyTx{ + Value: normal, + Gas: gasLimit, + GasPrice: maxInt256Plus1, + }).Raw, + true, + }, + { + "gas fee cap exceeds int256 limit", + types.NewTxWithData(ðtypes.DynamicFeeTx{ + Value: normal, + Gas: gasLimit, + GasFeeCap: maxInt256Plus1, + }).Raw, + true, + }, + { + "gas tip cap exceeds int256 limit", + types.NewTxWithData(ðtypes.DynamicFeeTx{ + Value: normal, + Gas: gasLimit, + GasFeeCap: normal, + GasTipCap: maxInt256Plus1, + }).Raw, + true, + }, + { + "LegacyTx cost exceeds int256 limit", + types.NewTxWithData(ðtypes.LegacyTx{ + Gas: gasLimit, + GasPrice: maxInt256, + Value: normal, + }).Raw, + true, + }, + { + "DynamicFeeTx cost exceeds int256 limit", + types.NewTxWithData(ðtypes.DynamicFeeTx{ + Gas: gasLimit, + Value: maxInt256Plus1, + }).Raw, + true, + }, + { + "AccessListTx cost exceeds int256 limit", + types.NewTxWithData(ðtypes.AccessListTx{ + Gas: gasLimit, + GasPrice: maxInt256, + Value: normal, + }).Raw, + true, + }, + } + for _, tc := range testCases { + suite.Run(tc.name, func() { + err := tc.tx.Validate() + if tc.expError { + suite.Require().Error(err, tc.name) + } else { + suite.Require().NoError(err, tc.name) + } + }) + } +} diff --git a/x/evm/types/params.go b/x/evm/types/params.go index 27d84155cd..98855a5ee4 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -17,6 +17,7 @@ package types import ( "fmt" + "math" "math/big" sdk "github.com/cosmos/cosmos-sdk/types" @@ -34,6 +35,10 @@ var ( DefaultEnableCreate = true // DefaultEnableCall enables contract calls (i.e true) DefaultEnableCall = true + // DefaultHeaderHashNum defines the default number of header hash to persist. + DefaultHeaderHashNum = uint64(256) + // DefaultHistoryServeWindow DefaultHeaderHashNum defines the default number of hystorical value to serve for EIP2935. + DefaultHistoryServeWindow = uint64(8191) ) // NewParams creates a new Params instance @@ -58,6 +63,8 @@ func DefaultParams() Params { EnableCall: DefaultEnableCall, ChainConfig: config, AllowUnprotectedTxs: DefaultAllowUnprotectedTxs, + HeaderHashNum: DefaultHeaderHashNum, + HistoryServeWindow: DefaultHistoryServeWindow, } } @@ -83,6 +90,14 @@ func (p Params) Validate() error { return err } + if err := ValidateInt64Overflow(p.HeaderHashNum); err != nil { + return err + } + + if err := ValidateInt64Overflow(p.HistoryServeWindow); err != nil { + return err + } + return ValidateChainConfig(p.ChainConfig) } @@ -134,6 +149,17 @@ func ValidateChainConfig(i interface{}) error { return cfg.Validate() } +func ValidateInt64Overflow(i interface{}) error { + num, ok := i.(uint64) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + if num > math.MaxInt64 { + return fmt.Errorf("value too large: %d, maximum value is: %d", num, uint64(math.MaxInt64)) + } + return nil +} + // IsLondon returns if london hardfork is enabled. func IsLondon(ethConfig *params.ChainConfig, height int64) bool { return ethConfig.IsLondon(big.NewInt(height)) diff --git a/x/evm/types/params.pb.go b/x/evm/types/params.pb.go index ed314c775e..3329c1cac6 100644 --- a/x/evm/types/params.pb.go +++ b/x/evm/types/params.pb.go @@ -39,6 +39,10 @@ type Params struct { // allow_unprotected_txs defines if replay-protected (i.e non EIP155 // signed) transactions can be executed on the state machine. AllowUnprotectedTxs bool `protobuf:"varint,6,opt,name=allow_unprotected_txs,json=allowUnprotectedTxs,proto3" json:"allow_unprotected_txs,omitempty"` + // header_hash_num is the number of header hash to persist. + HeaderHashNum uint64 `protobuf:"varint,7,opt,name=header_hash_num,json=headerHashNum,proto3" json:"header_hash_num,omitempty"` + // historyServeWindow for EIP 2935 + HistoryServeWindow uint64 `protobuf:"varint,8,opt,name=history_serve_window,json=historyServeWindow,proto3" json:"history_serve_window,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -116,6 +120,20 @@ func (m *Params) GetAllowUnprotectedTxs() bool { return false } +func (m *Params) GetHeaderHashNum() uint64 { + if m != nil { + return m.HeaderHashNum + } + return 0 +} + +func (m *Params) GetHistoryServeWindow() uint64 { + if m != nil { + return m.HistoryServeWindow + } + return 0 +} + func init() { proto.RegisterType((*Params)(nil), "ethermint.evm.v1.Params") } @@ -123,32 +141,36 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/params.proto", fileDescriptor_e7d3c06c1322f20f) } var fileDescriptor_e7d3c06c1322f20f = []byte{ - // 391 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x41, 0x8b, 0xd3, 0x40, - 0x18, 0x86, 0x93, 0xed, 0x5a, 0x36, 0xd3, 0x15, 0xd6, 0xb1, 0x4a, 0x58, 0xd8, 0x24, 0x44, 0x90, - 0x9c, 0x12, 0xba, 0x1e, 0x04, 0x41, 0xd0, 0xd4, 0x0a, 0xde, 0x96, 0xa0, 0x17, 0x2f, 0x61, 0x9a, - 0x7e, 0xa6, 0x81, 0x99, 0x4c, 0xc8, 0x4c, 0x63, 0xfa, 0x2f, 0xfc, 0x59, 0x3d, 0xf6, 0xe8, 0x29, - 0x48, 0xfa, 0x0f, 0xf2, 0x0b, 0x24, 0xd3, 0xda, 0x56, 0xbd, 0xcd, 0xf7, 0x3d, 0xef, 0xfb, 0xc1, - 0xbc, 0x2f, 0xba, 0x03, 0xb9, 0x84, 0x92, 0x65, 0xb9, 0x0c, 0xa0, 0x62, 0x41, 0x35, 0x09, 0x0a, - 0x52, 0x12, 0x26, 0xfc, 0xa2, 0xe4, 0x92, 0xe3, 0x9b, 0x23, 0xf6, 0xa1, 0x62, 0x7e, 0x35, 0xb9, - 0x1d, 0xa7, 0x3c, 0xe5, 0x0a, 0x06, 0xfd, 0x6b, 0xaf, 0xbb, 0x7d, 0xf1, 0xdf, 0x99, 0x64, 0x49, - 0xb2, 0x3c, 0x4e, 0x78, 0xfe, 0x2d, 0x4b, 0xf7, 0x22, 0xb7, 0xbb, 0x40, 0xc3, 0x07, 0x75, 0x1d, - 0x4f, 0x90, 0x01, 0x15, 0x8b, 0x17, 0x90, 0x73, 0x66, 0xea, 0x8e, 0xee, 0x19, 0xe1, 0xb8, 0x6b, - 0xec, 0x9b, 0x35, 0x61, 0xf4, 0x8d, 0x7b, 0x44, 0x6e, 0x74, 0x05, 0x15, 0xfb, 0xd0, 0x3f, 0xf1, - 0x5b, 0xf4, 0x18, 0x72, 0x32, 0xa7, 0x10, 0x27, 0x25, 0x10, 0x09, 0xe6, 0x85, 0xa3, 0x7b, 0x57, - 0xa1, 0xd9, 0x35, 0xf6, 0xf8, 0x60, 0x3b, 0xc7, 0x6e, 0x74, 0xbd, 0x9f, 0xa7, 0x6a, 0xc4, 0xaf, - 0xd1, 0xe8, 0x0f, 0x27, 0x94, 0x9a, 0x03, 0x65, 0x7e, 0xde, 0x35, 0x36, 0xfe, 0xdb, 0x4c, 0x28, - 0x75, 0x23, 0x74, 0xb0, 0x12, 0x4a, 0xf1, 0x7b, 0x84, 0xa0, 0x96, 0x25, 0x89, 0x21, 0x2b, 0x84, - 0x79, 0xe9, 0x0c, 0xbc, 0x41, 0xe8, 0xb6, 0x8d, 0x6d, 0xcc, 0xfa, 0xed, 0xec, 0xd3, 0x83, 0xe8, - 0x1a, 0xfb, 0xc9, 0xe1, 0xc8, 0x51, 0xe8, 0x46, 0x86, 0x1a, 0x66, 0x59, 0x21, 0xf0, 0x47, 0x74, - 0x7d, 0x1e, 0x87, 0xf9, 0xc8, 0xd1, 0xbd, 0xd1, 0xfd, 0x9d, 0xff, 0x6f, 0xb8, 0xfe, 0xb4, 0x57, - 0x4d, 0x95, 0x28, 0xbc, 0xdc, 0x34, 0xb6, 0x16, 0x8d, 0x92, 0xd3, 0x0a, 0xdf, 0xa3, 0x67, 0x84, - 0x52, 0xfe, 0x3d, 0x5e, 0xe5, 0x7d, 0xa2, 0x90, 0x48, 0x58, 0xc4, 0xb2, 0x16, 0xe6, 0xb0, 0xff, - 0x4d, 0xf4, 0x54, 0xc1, 0x2f, 0x27, 0xf6, 0xb9, 0x16, 0xe1, 0xbb, 0x4d, 0x6b, 0xe9, 0xdb, 0xd6, - 0xd2, 0x7f, 0xb5, 0x96, 0xfe, 0x63, 0x67, 0x69, 0xdb, 0x9d, 0xa5, 0xfd, 0xdc, 0x59, 0xda, 0xd7, - 0x97, 0x69, 0x26, 0x97, 0xab, 0xb9, 0x9f, 0x70, 0xd6, 0x97, 0xc6, 0x45, 0x70, 0x2a, 0xb1, 0x56, - 0x35, 0xca, 0x75, 0x01, 0x62, 0x3e, 0x54, 0xed, 0xbd, 0xfa, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x51, - 0x16, 0x95, 0xc2, 0x2b, 0x02, 0x00, 0x00, + // 451 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x92, 0x41, 0x8b, 0xd3, 0x40, + 0x18, 0x86, 0x1b, 0x5b, 0x6b, 0x3b, 0xdd, 0xc5, 0x75, 0xac, 0x12, 0x16, 0x36, 0x09, 0x11, 0x96, + 0x9c, 0x12, 0xbb, 0x1e, 0x04, 0x41, 0xd0, 0xd4, 0x8a, 0x5e, 0x64, 0x89, 0x8a, 0xe0, 0x65, 0x98, + 0xa6, 0x9f, 0x4d, 0x60, 0x26, 0x13, 0x32, 0xd3, 0xb4, 0xfd, 0x17, 0xfe, 0xac, 0x3d, 0x78, 0xd8, + 0xa3, 0xa7, 0x20, 0xed, 0x3f, 0xe8, 0x2f, 0x90, 0x4c, 0x6b, 0x5b, 0xf5, 0x36, 0xdf, 0xf7, 0xbc, + 0xef, 0x07, 0xf3, 0xf2, 0xa2, 0x0b, 0x50, 0x09, 0x14, 0x3c, 0xcd, 0x54, 0x00, 0x25, 0x0f, 0xca, + 0x41, 0x90, 0xd3, 0x82, 0x72, 0xe9, 0xe7, 0x85, 0x50, 0x02, 0x9f, 0xed, 0xb1, 0x0f, 0x25, 0xf7, + 0xcb, 0xc1, 0x79, 0x7f, 0x2a, 0xa6, 0x42, 0xc3, 0xa0, 0x7e, 0x6d, 0x75, 0xe7, 0x4f, 0xfe, 0x3b, + 0x13, 0x27, 0x34, 0xcd, 0x48, 0x2c, 0xb2, 0x6f, 0xe9, 0x74, 0x2b, 0x72, 0x7f, 0x34, 0x51, 0xfb, + 0x5a, 0x5f, 0xc7, 0x03, 0xd4, 0x85, 0x92, 0x93, 0x09, 0x64, 0x82, 0x9b, 0x86, 0x63, 0x78, 0xdd, + 0xb0, 0xbf, 0xa9, 0xec, 0xb3, 0x25, 0xe5, 0xec, 0x85, 0xbb, 0x47, 0x6e, 0xd4, 0x81, 0x92, 0xbf, + 0xa9, 0x9f, 0xf8, 0x25, 0x3a, 0x85, 0x8c, 0x8e, 0x19, 0x90, 0xb8, 0x00, 0xaa, 0xc0, 0xbc, 0xe3, + 0x18, 0x5e, 0x27, 0x34, 0x37, 0x95, 0xdd, 0xdf, 0xd9, 0x8e, 0xb1, 0x1b, 0x9d, 0x6c, 0xe7, 0xa1, + 0x1e, 0xf1, 0x73, 0xd4, 0xfb, 0xc3, 0x29, 0x63, 0x66, 0x53, 0x9b, 0x1f, 0x6f, 0x2a, 0x1b, 0xff, + 0x6d, 0xa6, 0x8c, 0xb9, 0x11, 0xda, 0x59, 0x29, 0x63, 0xf8, 0x35, 0x42, 0xb0, 0x50, 0x05, 0x25, + 0x90, 0xe6, 0xd2, 0x6c, 0x39, 0x4d, 0xaf, 0x19, 0xba, 0xab, 0xca, 0xee, 0x8e, 0xea, 0xed, 0xe8, + 0xfd, 0xb5, 0xdc, 0x54, 0xf6, 0x83, 0xdd, 0x91, 0xbd, 0xd0, 0x8d, 0xba, 0x7a, 0x18, 0xa5, 0xb9, + 0xc4, 0x6f, 0xd1, 0xc9, 0x71, 0x1c, 0xe6, 0x5d, 0xc7, 0xf0, 0x7a, 0x57, 0x17, 0xfe, 0xbf, 0xe1, + 0xfa, 0xc3, 0x5a, 0x35, 0xd4, 0xa2, 0xb0, 0x75, 0x53, 0xd9, 0x8d, 0xa8, 0x17, 0x1f, 0x56, 0xf8, + 0x0a, 0x3d, 0xa2, 0x8c, 0x89, 0x39, 0x99, 0x65, 0x75, 0xa2, 0x10, 0x2b, 0x98, 0x10, 0xb5, 0x90, + 0x66, 0xbb, 0xfe, 0x4d, 0xf4, 0x50, 0xc3, 0xcf, 0x07, 0xf6, 0x69, 0x21, 0xf1, 0x25, 0xba, 0x9f, + 0x00, 0x9d, 0x40, 0x41, 0x12, 0x2a, 0x13, 0x92, 0xcd, 0xb8, 0x79, 0xcf, 0x31, 0xbc, 0x56, 0x74, + 0xba, 0x5d, 0xbf, 0xa3, 0x32, 0xf9, 0x30, 0xe3, 0xf8, 0x29, 0xea, 0x27, 0xa9, 0x54, 0xa2, 0x58, + 0x12, 0x09, 0x45, 0x09, 0x64, 0x9e, 0x66, 0x13, 0x31, 0x37, 0x3b, 0x5a, 0x8c, 0x77, 0xec, 0x63, + 0x8d, 0xbe, 0x68, 0x12, 0xbe, 0xba, 0x59, 0x59, 0xc6, 0xed, 0xca, 0x32, 0x7e, 0xad, 0x2c, 0xe3, + 0xfb, 0xda, 0x6a, 0xdc, 0xae, 0xad, 0xc6, 0xcf, 0xb5, 0xd5, 0xf8, 0x7a, 0x39, 0x4d, 0x55, 0x32, + 0x1b, 0xfb, 0xb1, 0xe0, 0x75, 0x1d, 0x84, 0x0c, 0x0e, 0xf5, 0x58, 0xe8, 0x82, 0xa8, 0x65, 0x0e, + 0x72, 0xdc, 0xd6, 0xbd, 0x78, 0xf6, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x94, 0xe9, 0x25, 0xb7, 0x85, + 0x02, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -171,6 +193,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.HistoryServeWindow != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.HistoryServeWindow)) + i-- + dAtA[i] = 0x40 + } + if m.HeaderHashNum != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.HeaderHashNum)) + i-- + dAtA[i] = 0x38 + } if m.AllowUnprotectedTxs { i-- if m.AllowUnprotectedTxs { @@ -279,6 +311,12 @@ func (m *Params) Size() (n int) { if m.AllowUnprotectedTxs { n += 2 } + if m.HeaderHashNum != 0 { + n += 1 + sovParams(uint64(m.HeaderHashNum)) + } + if m.HistoryServeWindow != 0 { + n += 1 + sovParams(uint64(m.HistoryServeWindow)) + } return n } @@ -518,6 +556,44 @@ func (m *Params) Unmarshal(dAtA []byte) error { } } m.AllowUnprotectedTxs = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HeaderHashNum", wireType) + } + m.HeaderHashNum = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HeaderHashNum |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HistoryServeWindow", wireType) + } + m.HistoryServeWindow = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HistoryServeWindow |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) diff --git a/x/evm/types/preinstall.go b/x/evm/types/preinstall.go new file mode 100644 index 0000000000..76dd298a0c --- /dev/null +++ b/x/evm/types/preinstall.go @@ -0,0 +1,72 @@ +package types + +import ( + "encoding/hex" + "fmt" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +var DefaultPreinstalls = []Preinstall{ + { + Name: "Create2", + Address: "0x4e59b44847b379578588920ca78fbf26c0b4956c", + Code: "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + }, + { + Name: "Multicall3", + Address: "0xcA11bde05977b3631167028862bE2a173976CA11", + Code: "0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033", + }, + { + Name: "Permit2", + Address: "0x000000000022D473030F116dDEE9F6B43aC78BA3", + Code: "0x6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000103611b69577f866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f2890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a", + }, + { + Name: "Safe singleton factory", + Address: "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", + Code: "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + }, + { + Name: "EIP-2935 - Serve historical block hashes from state", + Address: params.HistoryStorageAddress.String(), + Code: common.Bytes2Hex(params.HistoryStorageCode), + }, +} + +// Validate performs basic validation checks on the Preinstall +func (p Preinstall) Validate() error { + if p.Address == "" { + return fmt.Errorf("preinstall address cannot be empty") + } + + // Check if Address is a valid hex string that can be converted to common.Address + if !common.IsHexAddress(p.Address) { + return fmt.Errorf("preinstall address %q is not a valid hex address", p.Address) + } + + if p.Code == "" { + return fmt.Errorf("preinstall code cannot be empty") + } + + // Check if Code is a valid hex string that can be converted to bytes + codeStr := p.Code + if strings.HasPrefix(codeStr, "0x") || strings.HasPrefix(codeStr, "0X") { + codeStr = codeStr[2:] + } + if _, err := hex.DecodeString(codeStr); err != nil { + return fmt.Errorf("preinstall code %q is not a valid hex string", p.Code) + } + + // Check if Code has Empty Code Hash + codeHash := crypto.Keccak256Hash(common.FromHex(p.Code)).Bytes() + if IsEmptyCodeHash(codeHash) { + return fmt.Errorf("preinstall code %q has empty code hash", p.Code) + } + + return nil +} diff --git a/x/evm/types/preinstall.pb.go b/x/evm/types/preinstall.pb.go new file mode 100644 index 0000000000..335308edfe --- /dev/null +++ b/x/evm/types/preinstall.pb.go @@ -0,0 +1,423 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: ethermint/evm/v1/preinstall.proto + +package types + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Preinstall defines a contract that is preinstalled on-chain with a specific +// contract address and bytecode +type Preinstall struct { + // name of the preinstall contract + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // address in hex format of the preinstall contract + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + // code in hex format for the preinstall contract + Code string `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"` +} + +func (m *Preinstall) Reset() { *m = Preinstall{} } +func (m *Preinstall) String() string { return proto.CompactTextString(m) } +func (*Preinstall) ProtoMessage() {} +func (*Preinstall) Descriptor() ([]byte, []int) { + return fileDescriptor_ebf0ed25989afc58, []int{0} +} +func (m *Preinstall) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Preinstall) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Preinstall.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Preinstall) XXX_Merge(src proto.Message) { + xxx_messageInfo_Preinstall.Merge(m, src) +} +func (m *Preinstall) XXX_Size() int { + return m.Size() +} +func (m *Preinstall) XXX_DiscardUnknown() { + xxx_messageInfo_Preinstall.DiscardUnknown(m) +} + +var xxx_messageInfo_Preinstall proto.InternalMessageInfo + +func (m *Preinstall) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Preinstall) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *Preinstall) GetCode() string { + if m != nil { + return m.Code + } + return "" +} + +func init() { + proto.RegisterType((*Preinstall)(nil), "ethermint.evm.v1.Preinstall") +} + +func init() { proto.RegisterFile("ethermint/evm/v1/preinstall.proto", fileDescriptor_ebf0ed25989afc58) } + +var fileDescriptor_ebf0ed25989afc58 = []byte{ + // 183 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x2d, 0xc9, 0x48, + 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x4f, 0x2d, 0xcb, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0x28, 0x4a, + 0xcd, 0xcc, 0x2b, 0x2e, 0x49, 0xcc, 0xc9, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x80, + 0x2b, 0xd1, 0x4b, 0x2d, 0xcb, 0xd5, 0x2b, 0x33, 0x54, 0xf2, 0xe3, 0xe2, 0x0a, 0x80, 0xab, 0x12, + 0x12, 0xe2, 0x62, 0xc9, 0x4b, 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0xb3, + 0x85, 0x24, 0xb8, 0xd8, 0x13, 0x53, 0x52, 0x8a, 0x52, 0x8b, 0x8b, 0x25, 0x98, 0xc0, 0xc2, 0x30, + 0x2e, 0x48, 0x75, 0x72, 0x7e, 0x4a, 0xaa, 0x04, 0x33, 0x44, 0x35, 0x88, 0xed, 0xe4, 0x70, 0xe2, + 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, + 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x6a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, + 0x7a, 0xc9, 0xf9, 0xb9, 0x20, 0xf7, 0xe5, 0x17, 0xeb, 0x23, 0xdc, 0x5b, 0x01, 0x76, 0x71, 0x49, + 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0xa9, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9d, + 0x60, 0xb7, 0xb0, 0xcf, 0x00, 0x00, 0x00, +} + +func (m *Preinstall) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Preinstall) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Preinstall) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Code) > 0 { + i -= len(m.Code) + copy(dAtA[i:], m.Code) + i = encodeVarintPreinstall(dAtA, i, uint64(len(m.Code))) + i-- + dAtA[i] = 0x1a + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintPreinstall(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintPreinstall(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintPreinstall(dAtA []byte, offset int, v uint64) int { + offset -= sovPreinstall(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Preinstall) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovPreinstall(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovPreinstall(uint64(l)) + } + l = len(m.Code) + if l > 0 { + n += 1 + l + sovPreinstall(uint64(l)) + } + return n +} + +func sovPreinstall(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozPreinstall(x uint64) (n int) { + return sovPreinstall(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Preinstall) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPreinstall + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Preinstall: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Preinstall: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPreinstall + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPreinstall + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPreinstall + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPreinstall + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPreinstall + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPreinstall + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPreinstall + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPreinstall + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPreinstall + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Code = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPreinstall(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPreinstall + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipPreinstall(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPreinstall + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPreinstall + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPreinstall + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthPreinstall + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupPreinstall + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthPreinstall + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthPreinstall = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPreinstall = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupPreinstall = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/evm/types/preinstall_test.go b/x/evm/types/preinstall_test.go new file mode 100644 index 0000000000..98fbc97b43 --- /dev/null +++ b/x/evm/types/preinstall_test.go @@ -0,0 +1,155 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPreinstall_Validate(t *testing.T) { + tests := []struct { + name string + preinstall Preinstall + errorMsg string + }{ + { + name: "valid preinstall with 0x prefix", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x1234567890123456789012345678901234567890", + Code: "0x608060405234801561001057600080fd5b50", + }, + errorMsg: "", + }, + { + name: "valid preinstall without 0x prefix", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "1234567890123456789012345678901234567890", + Code: "608060405234801561001057600080fd5b50", + }, + errorMsg: "", + }, + { + name: "valid preinstall with uppercase hex", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0xABCDEF1234567890123456789012345678901234", + Code: "0x608060405234801561001057600080FD5B50", + }, + errorMsg: "", + }, + { + name: "valid preinstall with mixed case hex", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0xaBcDeF1234567890123456789012345678901234", + Code: "0x608060405234801561001057600080Fd5b50", + }, + errorMsg: "", + }, + { + name: "empty address", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "", + Code: "0x608060405234801561001057600080fd5b50", + }, + errorMsg: "preinstall address cannot be empty", + }, + { + name: "empty code", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x1234567890123456789012345678901234567890", + Code: "", + }, + errorMsg: "preinstall code cannot be empty", + }, + { + name: "invalid address - not hex", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0xGHIJ567890123456789012345678901234567890", + Code: "0x608060405234801561001057600080fd5b50", + }, + errorMsg: "preinstall address \"0xGHIJ567890123456789012345678901234567890\" is not a valid hex address", + }, + { + name: "invalid address - too short", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x1234", + Code: "0x608060405234801561001057600080fd5b50", + }, + errorMsg: "preinstall address \"0x1234\" is not a valid hex address", + }, + { + name: "invalid address - too long", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x123456789012345678901234567890123456789012", + Code: "0x608060405234801561001057600080fd5b50", + }, + errorMsg: "preinstall address \"0x123456789012345678901234567890123456789012\" is not a valid hex address", + }, + { + name: "invalid code - not hex", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x1234567890123456789012345678901234567890", + Code: "0xGHIJ60405234801561001057600080fd5b50", + }, + errorMsg: "preinstall code \"0xGHIJ60405234801561001057600080fd5b50\" is not a valid hex string", + }, + { + name: "invalid code - odd length without 0x", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x1234567890123456789012345678901234567890", + Code: "60806040523480156100057600080fd5b50", + }, + errorMsg: "preinstall code \"60806040523480156100057600080fd5b50\" is not a valid hex string", + }, + { + name: "invalid code - empty code hash", + preinstall: Preinstall{ + Name: "Test Contract", + Address: "0x1234567890123456789012345678901234567890", + Code: "0x", + }, + errorMsg: "preinstall code \"0x\" has empty code hash", + }, + { + name: "valid preinstall with empty name (name not validated)", + preinstall: Preinstall{ + Name: "", + Address: "0x1234567890123456789012345678901234567890", + Code: "0x608060405234801561001057600080fd5b50", + }, + errorMsg: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.preinstall.Validate() + if tt.errorMsg == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tt.errorMsg) + } + }) + } +} + +func TestDefaultPreinstalls_Validate(t *testing.T) { + // Test that all default preinstalls are valid + for i, preinstall := range DefaultPreinstalls { + t.Run(preinstall.Name, func(t *testing.T) { + err := preinstall.Validate() + require.NoError(t, err, "DefaultPreinstalls[%d] (%s) should be valid", i, preinstall.Name) + }) + } +} diff --git a/x/evm/types/query.go b/x/evm/types/query.go index 5e9a937130..899d7826ed 100644 --- a/x/evm/types/query.go +++ b/x/evm/types/query.go @@ -16,12 +16,21 @@ package types import ( + "fmt" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" ) // UnpackInterfaces implements UnpackInterfacesMesssage.UnpackInterfaces func (m QueryTraceTxRequest) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + if m.Msg == nil { + return fmt.Errorf("msg cannot be nul") + } + for _, msg := range m.Predecessors { + if msg == nil { + continue + } if err := msg.UnpackInterfaces(unpacker); err != nil { return err } @@ -31,6 +40,9 @@ func (m QueryTraceTxRequest) UnpackInterfaces(unpacker codectypes.AnyUnpacker) e func (m QueryTraceBlockRequest) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { for _, msg := range m.Txs { + if msg == nil { + continue + } if err := msg.UnpackInterfaces(unpacker); err != nil { return err } diff --git a/x/evm/types/query.pb.go b/x/evm/types/query.pb.go index 253948b1c9..793d3c4bbd 100644 --- a/x/evm/types/query.pb.go +++ b/x/evm/types/query.pb.go @@ -869,6 +869,98 @@ func (m *EthCallRequest) GetOverrides() []byte { return nil } +// EthCallResponse defines EthCall response +type EthCallResponse struct { + // hash of the ethereum transaction in hex format. + // This hash differs from the Tendermint sha256 hash of the transaction bytes. + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // logs contains the transaction hash and the proto-compatible ethereum logs. + Logs []*Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` + // ret is the returned data from evm function (result or data supplied with revert opcode) + Ret []byte `protobuf:"bytes,3,opt,name=ret,proto3" json:"ret,omitempty"` + // vm_error is the error returned by vm execution + VmError string `protobuf:"bytes,4,opt,name=vm_error,json=vmError,proto3" json:"vm_error,omitempty"` + // gas_used specifies how much gas was consumed by the transaction + GasUsed uint64 `protobuf:"varint,5,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` + // include the block hash for json-rpc to use + BlockHash []byte `protobuf:"bytes,6,opt,name=block_hash,json=blockHash,proto3" json:"block_hash,omitempty"` +} + +func (m *EthCallResponse) Reset() { *m = EthCallResponse{} } +func (m *EthCallResponse) String() string { return proto.CompactTextString(m) } +func (*EthCallResponse) ProtoMessage() {} +func (*EthCallResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e15a877459347994, []int{17} +} +func (m *EthCallResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EthCallResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EthCallResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EthCallResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthCallResponse.Merge(m, src) +} +func (m *EthCallResponse) XXX_Size() int { + return m.Size() +} +func (m *EthCallResponse) XXX_DiscardUnknown() { + xxx_messageInfo_EthCallResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_EthCallResponse proto.InternalMessageInfo + +func (m *EthCallResponse) GetHash() string { + if m != nil { + return m.Hash + } + return "" +} + +func (m *EthCallResponse) GetLogs() []*Log { + if m != nil { + return m.Logs + } + return nil +} + +func (m *EthCallResponse) GetRet() []byte { + if m != nil { + return m.Ret + } + return nil +} + +func (m *EthCallResponse) GetVmError() string { + if m != nil { + return m.VmError + } + return "" +} + +func (m *EthCallResponse) GetGasUsed() uint64 { + if m != nil { + return m.GasUsed + } + return 0 +} + +func (m *EthCallResponse) GetBlockHash() []byte { + if m != nil { + return m.BlockHash + } + return nil +} + // EstimateGasResponse defines EstimateGas response type EstimateGasResponse struct { // gas returns the estimated gas @@ -884,7 +976,7 @@ func (m *EstimateGasResponse) Reset() { *m = EstimateGasResponse{} } func (m *EstimateGasResponse) String() string { return proto.CompactTextString(m) } func (*EstimateGasResponse) ProtoMessage() {} func (*EstimateGasResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{17} + return fileDescriptor_e15a877459347994, []int{18} } func (m *EstimateGasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -951,15 +1043,17 @@ type QueryTraceTxRequest struct { BlockTime time.Time `protobuf:"bytes,7,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time"` // proposer_address is the proposer of the requested block ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,8,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"` - // chain_id is the the eip155 chain id parsed from the requested block header + // chain_id is the eip155 chain id parsed from the requested block header ChainId int64 `protobuf:"varint,9,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // base_fee is the base fee based on the block_number of requested transaction + BaseFee *cosmossdk_io_math.Int `protobuf:"bytes,10,opt,name=base_fee,json=baseFee,proto3,customtype=cosmossdk.io/math.Int" json:"base_fee,omitempty"` } func (m *QueryTraceTxRequest) Reset() { *m = QueryTraceTxRequest{} } func (m *QueryTraceTxRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceTxRequest) ProtoMessage() {} func (*QueryTraceTxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{18} + return fileDescriptor_e15a877459347994, []int{19} } func (m *QueryTraceTxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1054,7 +1148,7 @@ func (m *QueryTraceTxResponse) Reset() { *m = QueryTraceTxResponse{} } func (m *QueryTraceTxResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceTxResponse) ProtoMessage() {} func (*QueryTraceTxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{19} + return fileDescriptor_e15a877459347994, []int{20} } func (m *QueryTraceTxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1114,7 +1208,7 @@ func (m *QueryTraceCallRequest) Reset() { *m = QueryTraceCallRequest{} } func (m *QueryTraceCallRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceCallRequest) ProtoMessage() {} func (*QueryTraceCallRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{20} + return fileDescriptor_e15a877459347994, []int{21} } func (m *QueryTraceCallRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1209,7 +1303,7 @@ func (m *QueryTraceCallResponse) Reset() { *m = QueryTraceCallResponse{} func (m *QueryTraceCallResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceCallResponse) ProtoMessage() {} func (*QueryTraceCallResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{21} + return fileDescriptor_e15a877459347994, []int{22} } func (m *QueryTraceCallResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1267,7 +1361,7 @@ func (m *QueryTraceBlockRequest) Reset() { *m = QueryTraceBlockRequest{} func (m *QueryTraceBlockRequest) String() string { return proto.CompactTextString(m) } func (*QueryTraceBlockRequest) ProtoMessage() {} func (*QueryTraceBlockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{22} + return fileDescriptor_e15a877459347994, []int{23} } func (m *QueryTraceBlockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1355,7 +1449,7 @@ func (m *QueryTraceBlockResponse) Reset() { *m = QueryTraceBlockResponse func (m *QueryTraceBlockResponse) String() string { return proto.CompactTextString(m) } func (*QueryTraceBlockResponse) ProtoMessage() {} func (*QueryTraceBlockResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{23} + return fileDescriptor_e15a877459347994, []int{24} } func (m *QueryTraceBlockResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1400,7 +1494,7 @@ func (m *QueryBaseFeeRequest) Reset() { *m = QueryBaseFeeRequest{} } func (m *QueryBaseFeeRequest) String() string { return proto.CompactTextString(m) } func (*QueryBaseFeeRequest) ProtoMessage() {} func (*QueryBaseFeeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{24} + return fileDescriptor_e15a877459347994, []int{25} } func (m *QueryBaseFeeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1439,7 +1533,7 @@ func (m *QueryBaseFeeResponse) Reset() { *m = QueryBaseFeeResponse{} } func (m *QueryBaseFeeResponse) String() string { return proto.CompactTextString(m) } func (*QueryBaseFeeResponse) ProtoMessage() {} func (*QueryBaseFeeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e15a877459347994, []int{25} + return fileDescriptor_e15a877459347994, []int{26} } func (m *QueryBaseFeeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1468,6 +1562,189 @@ func (m *QueryBaseFeeResponse) XXX_DiscardUnknown() { var xxx_messageInfo_QueryBaseFeeResponse proto.InternalMessageInfo +// CreateAccessListResponse defines CreateAccessList response +type CreateAccessListResponse struct { + // data is the response serialized in bytes + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *CreateAccessListResponse) Reset() { *m = CreateAccessListResponse{} } +func (m *CreateAccessListResponse) String() string { return proto.CompactTextString(m) } +func (*CreateAccessListResponse) ProtoMessage() {} +func (*CreateAccessListResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_e15a877459347994, []int{27} +} +func (m *CreateAccessListResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateAccessListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CreateAccessListResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CreateAccessListResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateAccessListResponse.Merge(m, src) +} +func (m *CreateAccessListResponse) XXX_Size() int { + return m.Size() +} +func (m *CreateAccessListResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CreateAccessListResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateAccessListResponse proto.InternalMessageInfo + +func (m *CreateAccessListResponse) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// SimulateV1Request defines the request for eth_simulateV1 +type SimulateV1Request struct { + // args is the JSON-encoded rpc/types.SimulateV1Args (SimOpts plus resolved base header) + Args []byte `protobuf:"bytes,1,opt,name=args,proto3" json:"args,omitempty"` + // gas_cap defines the default gas cap to be used + GasCap uint64 `protobuf:"varint,2,opt,name=gas_cap,json=gasCap,proto3" json:"gas_cap,omitempty"` + // proposer_address of the requested block in hex format + ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,3,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"` + // chain_id is the eip155 chain id parsed from the requested block header + ChainId int64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *SimulateV1Request) Reset() { *m = SimulateV1Request{} } +func (m *SimulateV1Request) String() string { return proto.CompactTextString(m) } +func (*SimulateV1Request) ProtoMessage() {} +func (*SimulateV1Request) Descriptor() ([]byte, []int) { + return fileDescriptor_e15a877459347994, []int{28} +} +func (m *SimulateV1Request) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SimulateV1Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SimulateV1Request.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SimulateV1Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimulateV1Request.Merge(m, src) +} +func (m *SimulateV1Request) XXX_Size() int { + return m.Size() +} +func (m *SimulateV1Request) XXX_DiscardUnknown() { + xxx_messageInfo_SimulateV1Request.DiscardUnknown(m) +} + +var xxx_messageInfo_SimulateV1Request proto.InternalMessageInfo + +func (m *SimulateV1Request) GetArgs() []byte { + if m != nil { + return m.Args + } + return nil +} + +func (m *SimulateV1Request) GetGasCap() uint64 { + if m != nil { + return m.GasCap + } + return 0 +} + +func (m *SimulateV1Request) GetProposerAddress() github_com_cosmos_cosmos_sdk_types.ConsAddress { + if m != nil { + return m.ProposerAddress + } + return nil +} + +func (m *SimulateV1Request) GetChainId() int64 { + if m != nil { + return m.ChainId + } + return 0 +} + +// SimulateV1Response defines the response for eth_simulateV1 +type SimulateV1Response struct { + // result is the JSON-encoded simulation results (set on success, empty on error) + Result []byte `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + // error_message is a human-readable description of the simulation error (empty on success) + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + // error_code is the machine-readable simulation error code (0 on success) + ErrorCode int32 `protobuf:"varint,3,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` +} + +func (m *SimulateV1Response) Reset() { *m = SimulateV1Response{} } +func (m *SimulateV1Response) String() string { return proto.CompactTextString(m) } +func (*SimulateV1Response) ProtoMessage() {} +func (*SimulateV1Response) Descriptor() ([]byte, []int) { + return fileDescriptor_e15a877459347994, []int{29} +} +func (m *SimulateV1Response) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SimulateV1Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SimulateV1Response.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SimulateV1Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_SimulateV1Response.Merge(m, src) +} +func (m *SimulateV1Response) XXX_Size() int { + return m.Size() +} +func (m *SimulateV1Response) XXX_DiscardUnknown() { + xxx_messageInfo_SimulateV1Response.DiscardUnknown(m) +} + +var xxx_messageInfo_SimulateV1Response proto.InternalMessageInfo + +func (m *SimulateV1Response) GetResult() []byte { + if m != nil { + return m.Result + } + return nil +} + +func (m *SimulateV1Response) GetErrorMessage() string { + if m != nil { + return m.ErrorMessage + } + return "" +} + +func (m *SimulateV1Response) GetErrorCode() int32 { + if m != nil { + return m.ErrorCode + } + return 0 +} + func init() { proto.RegisterType((*QueryAccountRequest)(nil), "ethermint.evm.v1.QueryAccountRequest") proto.RegisterType((*QueryAccountResponse)(nil), "ethermint.evm.v1.QueryAccountResponse") @@ -1486,6 +1763,7 @@ func init() { proto.RegisterType((*QueryParamsRequest)(nil), "ethermint.evm.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "ethermint.evm.v1.QueryParamsResponse") proto.RegisterType((*EthCallRequest)(nil), "ethermint.evm.v1.EthCallRequest") + proto.RegisterType((*EthCallResponse)(nil), "ethermint.evm.v1.EthCallResponse") proto.RegisterType((*EstimateGasResponse)(nil), "ethermint.evm.v1.EstimateGasResponse") proto.RegisterType((*QueryTraceTxRequest)(nil), "ethermint.evm.v1.QueryTraceTxRequest") proto.RegisterType((*QueryTraceTxResponse)(nil), "ethermint.evm.v1.QueryTraceTxResponse") @@ -1495,110 +1773,126 @@ func init() { proto.RegisterType((*QueryTraceBlockResponse)(nil), "ethermint.evm.v1.QueryTraceBlockResponse") proto.RegisterType((*QueryBaseFeeRequest)(nil), "ethermint.evm.v1.QueryBaseFeeRequest") proto.RegisterType((*QueryBaseFeeResponse)(nil), "ethermint.evm.v1.QueryBaseFeeResponse") + proto.RegisterType((*CreateAccessListResponse)(nil), "ethermint.evm.v1.CreateAccessListResponse") + proto.RegisterType((*SimulateV1Request)(nil), "ethermint.evm.v1.SimulateV1Request") + proto.RegisterType((*SimulateV1Response)(nil), "ethermint.evm.v1.SimulateV1Response") } func init() { proto.RegisterFile("ethermint/evm/v1/query.proto", fileDescriptor_e15a877459347994) } var fileDescriptor_e15a877459347994 = []byte{ - // 1566 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4d, 0x6f, 0x13, 0xc7, - 0x1b, 0xcf, 0xc6, 0x4e, 0xec, 0x8c, 0x13, 0xc8, 0x7f, 0x48, 0xfe, 0x38, 0xdb, 0xc4, 0x0e, 0x1b, - 0xf2, 0x06, 0x61, 0xb7, 0x71, 0x11, 0x52, 0xb9, 0x14, 0x62, 0x05, 0x4a, 0x81, 0x8a, 0x6e, 0xa3, - 0x1e, 0x2a, 0x55, 0xd6, 0x78, 0x3d, 0xac, 0xad, 0x78, 0x77, 0xcc, 0xce, 0xd8, 0x75, 0x78, 0xe9, - 0xa1, 0x6a, 0x29, 0x15, 0x52, 0x85, 0xd4, 0x7b, 0xc5, 0x37, 0xe8, 0xd7, 0xe0, 0x88, 0x54, 0x55, - 0xaa, 0x7a, 0xa0, 0x08, 0x7a, 0xe8, 0x27, 0xe8, 0xa1, 0xa7, 0x6a, 0x66, 0x67, 0xed, 0xb5, 0xd7, - 0x6b, 0x87, 0x8a, 0x4a, 0x48, 0x3d, 0x79, 0x5e, 0x9e, 0x79, 0x9e, 0xdf, 0xcc, 0xf3, 0xf6, 0x5b, - 0x83, 0x45, 0xcc, 0xaa, 0xd8, 0x73, 0x6a, 0x2e, 0x33, 0x70, 0xcb, 0x31, 0x5a, 0xdb, 0xc6, 0xad, - 0x26, 0xf6, 0x0e, 0xf4, 0x86, 0x47, 0x18, 0x81, 0xb3, 0x9d, 0x5d, 0x1d, 0xb7, 0x1c, 0xbd, 0xb5, - 0xad, 0x9e, 0xb2, 0x08, 0x75, 0x08, 0x35, 0xca, 0x88, 0x62, 0x5f, 0xd4, 0x68, 0x6d, 0x97, 0x31, - 0x43, 0xdb, 0x46, 0x03, 0xd9, 0x35, 0x17, 0xb1, 0x1a, 0x71, 0xfd, 0xd3, 0xea, 0x42, 0x44, 0x37, - 0x6b, 0xcb, 0x2d, 0x35, 0xb2, 0x55, 0x27, 0xb6, 0xdc, 0x5b, 0x8a, 0xec, 0x35, 0x90, 0x87, 0x1c, - 0x2a, 0xb7, 0x57, 0xa2, 0x5a, 0x3d, 0x64, 0xe1, 0x92, 0x45, 0xdc, 0x9b, 0xb5, 0x40, 0xc7, 0x9c, - 0x4d, 0x6c, 0x22, 0x86, 0x06, 0x1f, 0xc9, 0xd5, 0x45, 0x9b, 0x10, 0xbb, 0x8e, 0x0d, 0xd4, 0xa8, - 0x19, 0xc8, 0x75, 0x09, 0x13, 0x68, 0x03, 0xc5, 0x79, 0xb9, 0x2b, 0x66, 0xe5, 0xe6, 0x4d, 0x83, - 0xd5, 0x1c, 0x4c, 0x19, 0x72, 0x1a, 0xbe, 0x80, 0xf6, 0x2e, 0x38, 0xf6, 0x11, 0xbf, 0xf1, 0x45, - 0xcb, 0x22, 0x4d, 0x97, 0x99, 0xf8, 0x56, 0x13, 0x53, 0x06, 0xb3, 0x20, 0x85, 0x2a, 0x15, 0x0f, - 0x53, 0x9a, 0x55, 0x96, 0x95, 0x8d, 0x29, 0x33, 0x98, 0x9e, 0x4f, 0x3f, 0x78, 0x9c, 0x1f, 0xfb, - 0xe3, 0x71, 0x7e, 0x4c, 0xb3, 0xc0, 0x5c, 0xef, 0x51, 0xda, 0x20, 0x2e, 0xc5, 0xfc, 0x6c, 0x19, - 0xd5, 0x91, 0x6b, 0xe1, 0xe0, 0xac, 0x9c, 0xc2, 0xb7, 0xc0, 0x94, 0x45, 0x2a, 0xb8, 0x54, 0x45, - 0xb4, 0x9a, 0x1d, 0x17, 0x7b, 0x69, 0xbe, 0xf0, 0x3e, 0xa2, 0x55, 0x38, 0x07, 0x26, 0x5c, 0xc2, - 0x0f, 0x25, 0x96, 0x95, 0x8d, 0xa4, 0xe9, 0x4f, 0xb4, 0xf7, 0xc0, 0x82, 0x30, 0x52, 0x14, 0x2e, - 0xfa, 0x07, 0x28, 0xef, 0x2b, 0x40, 0x1d, 0xa4, 0x41, 0x82, 0x5d, 0x05, 0x47, 0x7c, 0xef, 0x97, - 0x7a, 0x35, 0xcd, 0xf8, 0xab, 0x17, 0xfd, 0x45, 0xa8, 0x82, 0x34, 0xe5, 0x46, 0x39, 0xbe, 0x71, - 0x81, 0xaf, 0x33, 0xe7, 0x2a, 0x90, 0xaf, 0xb5, 0xe4, 0x36, 0x9d, 0x32, 0xf6, 0xe4, 0x0d, 0x66, - 0xe4, 0xea, 0x87, 0x62, 0x51, 0xbb, 0x0a, 0x16, 0x05, 0x8e, 0x4f, 0x50, 0xbd, 0x56, 0x41, 0x8c, - 0x78, 0x7d, 0x97, 0x39, 0x01, 0xa6, 0x2d, 0xe2, 0xf6, 0xe3, 0xc8, 0xf0, 0xb5, 0x8b, 0x91, 0x5b, - 0x3d, 0x54, 0xc0, 0x52, 0x8c, 0x36, 0x79, 0xb1, 0x75, 0x70, 0x34, 0x40, 0xd5, 0xab, 0x31, 0x00, - 0xfb, 0x1a, 0xaf, 0x16, 0x04, 0xd1, 0x8e, 0xef, 0xe7, 0x57, 0x71, 0xcf, 0xdb, 0x32, 0x88, 0x3a, - 0x47, 0x47, 0x05, 0x91, 0x76, 0x55, 0x1a, 0xfb, 0x98, 0x11, 0x0f, 0xd9, 0xa3, 0x8d, 0xc1, 0x59, - 0x90, 0xd8, 0xc7, 0x07, 0x32, 0xde, 0xf8, 0x30, 0x64, 0x7e, 0x4b, 0x9a, 0xef, 0x28, 0x93, 0xe6, - 0xe7, 0xc0, 0x44, 0x0b, 0xd5, 0x9b, 0x81, 0x71, 0x7f, 0xa2, 0x9d, 0x03, 0xb3, 0x32, 0x94, 0x2a, - 0xaf, 0x74, 0xc9, 0x75, 0xf0, 0xbf, 0xd0, 0x39, 0x69, 0x02, 0x82, 0x24, 0x8f, 0x7d, 0x71, 0x6a, - 0xda, 0x14, 0x63, 0xed, 0x36, 0x80, 0x42, 0x70, 0xaf, 0x7d, 0x8d, 0xd8, 0x34, 0x30, 0x01, 0x41, - 0x52, 0x64, 0x8c, 0xaf, 0x5f, 0x8c, 0xe1, 0x25, 0x00, 0xba, 0xb5, 0x49, 0xdc, 0x2d, 0x53, 0x58, - 0xd3, 0xfd, 0xa0, 0xd5, 0x79, 0x21, 0xd3, 0xfd, 0x9a, 0x27, 0x0b, 0x99, 0x7e, 0xa3, 0xfb, 0x54, - 0x66, 0xe8, 0x64, 0x08, 0xe4, 0xb7, 0x8a, 0x7c, 0xd8, 0xc0, 0xb8, 0xc4, 0xb9, 0x09, 0x92, 0x75, - 0x62, 0xf3, 0xdb, 0x25, 0x36, 0x32, 0x85, 0x79, 0xbd, 0xbf, 0x7c, 0xea, 0xd7, 0x88, 0x6d, 0x0a, - 0x11, 0x78, 0x79, 0x00, 0xa8, 0xf5, 0x91, 0xa0, 0x7c, 0x3b, 0x61, 0x54, 0xda, 0x9c, 0x7c, 0x87, - 0x1b, 0xa2, 0x48, 0x4a, 0xdc, 0xda, 0x75, 0x09, 0x30, 0x58, 0x95, 0x00, 0xcf, 0x81, 0x49, 0xbf, - 0x98, 0x8a, 0x07, 0xca, 0x14, 0xb2, 0x51, 0x88, 0xfe, 0x89, 0x9d, 0xe4, 0x93, 0x67, 0xf9, 0x31, - 0x53, 0x4a, 0x6b, 0x3f, 0x2b, 0xe0, 0xc8, 0x2e, 0xab, 0x16, 0x51, 0xbd, 0x1e, 0x7a, 0x69, 0xe4, - 0xd9, 0x34, 0xf0, 0x09, 0x1f, 0xc3, 0xe3, 0x20, 0x65, 0x23, 0x5a, 0xb2, 0x50, 0x43, 0xa6, 0xc7, - 0xa4, 0x8d, 0x68, 0x11, 0x35, 0xe0, 0x67, 0x60, 0xb6, 0xe1, 0x91, 0x06, 0xa1, 0xd8, 0xeb, 0xa4, - 0x18, 0x4f, 0x8f, 0xe9, 0x9d, 0xc2, 0x5f, 0xcf, 0xf2, 0xba, 0x5d, 0x63, 0xd5, 0x66, 0x59, 0xb7, - 0x88, 0x63, 0xc8, 0xfe, 0xe2, 0xff, 0x9c, 0xa1, 0x95, 0x7d, 0x83, 0x1d, 0x34, 0x30, 0xd5, 0x8b, - 0xdd, 0xdc, 0x36, 0x8f, 0x06, 0xba, 0x82, 0xbc, 0x5c, 0x00, 0x69, 0xab, 0x8a, 0x6a, 0x6e, 0xa9, - 0x56, 0xc9, 0x26, 0x97, 0x95, 0x8d, 0x84, 0x99, 0x12, 0xf3, 0x2b, 0x15, 0xb8, 0x08, 0xa6, 0x48, - 0x0b, 0x7b, 0x5e, 0xad, 0x82, 0x69, 0x76, 0x42, 0x60, 0xed, 0x2e, 0x68, 0x7b, 0xe0, 0xd8, 0x2e, - 0x65, 0x35, 0x07, 0x31, 0x7c, 0x19, 0x75, 0x9f, 0x69, 0x16, 0x24, 0x6c, 0xe4, 0x5f, 0x2d, 0x69, - 0xf2, 0x21, 0x5f, 0xf1, 0x30, 0x13, 0xb7, 0x9a, 0x36, 0xf9, 0x90, 0xdb, 0x6c, 0x39, 0x25, 0xec, - 0x79, 0xc4, 0xcf, 0xf4, 0x29, 0x33, 0xd5, 0x72, 0x76, 0xf9, 0x54, 0x7b, 0x9e, 0x08, 0xc2, 0x83, - 0x77, 0xa6, 0xbd, 0x76, 0xf0, 0x64, 0xdb, 0x20, 0xe1, 0x50, 0x5b, 0x3e, 0x7d, 0x3e, 0xfa, 0xf4, - 0xd7, 0xa9, 0xbd, 0xcb, 0xd7, 0x70, 0xd3, 0xd9, 0x6b, 0x9b, 0x5c, 0x16, 0x5e, 0x00, 0xd3, 0xe1, - 0xf6, 0x26, 0x2c, 0x65, 0x0a, 0x4b, 0xd1, 0xb3, 0xc2, 0x54, 0x51, 0x08, 0x99, 0x19, 0xd6, 0x9d, - 0xc0, 0x22, 0x98, 0x6e, 0x78, 0xb8, 0x82, 0x2d, 0x4c, 0x29, 0xf1, 0x68, 0x36, 0x29, 0x62, 0x73, - 0xa4, 0xf5, 0x9e, 0x43, 0xbc, 0xe0, 0x96, 0xeb, 0xc4, 0xda, 0x0f, 0x4a, 0xdb, 0x84, 0x78, 0xe4, - 0x8c, 0x58, 0xf3, 0x0b, 0x1b, 0x5c, 0x02, 0xc0, 0x17, 0x11, 0xf9, 0x37, 0x29, 0x5e, 0x64, 0x4a, - 0xac, 0x88, 0x96, 0x55, 0x0c, 0xb6, 0x79, 0x57, 0xcd, 0xa6, 0xc4, 0x35, 0x54, 0xdd, 0x6f, 0xb9, - 0x7a, 0xd0, 0x72, 0xf5, 0xbd, 0xa0, 0xe5, 0xee, 0xa4, 0x79, 0xfc, 0x3d, 0xfa, 0x2d, 0xaf, 0x48, - 0x25, 0x7c, 0x67, 0x60, 0x18, 0xa5, 0xff, 0x9d, 0x30, 0x9a, 0xea, 0x09, 0xa3, 0x0f, 0x92, 0xe9, - 0xf1, 0xd9, 0x84, 0x99, 0x66, 0xed, 0x52, 0xcd, 0xad, 0xe0, 0xb6, 0x76, 0x4a, 0x16, 0xc3, 0x8e, - 0x87, 0xbb, 0x95, 0xaa, 0x82, 0x18, 0x0a, 0xb2, 0x82, 0x8f, 0xb5, 0x6f, 0x12, 0x60, 0xbe, 0x2b, - 0xfc, 0xa6, 0xe6, 0x50, 0x7f, 0xa4, 0x25, 0x5f, 0x39, 0xd2, 0xde, 0x90, 0x20, 0x09, 0x7b, 0x31, - 0xdd, 0xe3, 0x45, 0x6d, 0x0b, 0xfc, 0xbf, 0xdf, 0x11, 0x43, 0xfc, 0xf6, 0x5d, 0x22, 0x2c, 0xbe, - 0xc3, 0x0d, 0x84, 0x32, 0x99, 0xb5, 0x83, 0x3a, 0x3f, 0x3a, 0x93, 0x59, 0x9b, 0xbe, 0x86, 0x4c, - 0xfe, 0xaf, 0x27, 0xa1, 0x76, 0x06, 0x1c, 0x8f, 0xf8, 0x63, 0x88, 0xff, 0xe6, 0x3b, 0x54, 0x8b, - 0xe2, 0x4b, 0x38, 0x68, 0xe9, 0xda, 0xb5, 0x0e, 0x8d, 0x92, 0xcb, 0x52, 0xc5, 0x59, 0x90, 0xe6, - 0x7d, 0xb7, 0x74, 0x13, 0x4b, 0x2a, 0xb3, 0xb3, 0xf0, 0xeb, 0xb3, 0xfc, 0xbc, 0x8f, 0x9e, 0x56, - 0xf6, 0xf5, 0x1a, 0x31, 0x1c, 0xc4, 0xaa, 0xfa, 0x15, 0x97, 0x71, 0x8a, 0x25, 0x4e, 0x17, 0xfe, - 0x9c, 0x01, 0x13, 0x42, 0x1d, 0xfc, 0x5a, 0x01, 0x29, 0xc9, 0x2c, 0xe1, 0x6a, 0xd4, 0xad, 0x03, - 0x3e, 0x1d, 0xd4, 0xb5, 0x51, 0x62, 0x3e, 0x34, 0xed, 0xf4, 0x97, 0x3f, 0xfd, 0xfe, 0xfd, 0xf8, - 0x2a, 0x5c, 0x31, 0x22, 0x1f, 0x3f, 0x92, 0x5d, 0x1a, 0x77, 0xa4, 0x2b, 0xee, 0xc1, 0x1f, 0x14, - 0x30, 0xd3, 0x43, 0xe0, 0xe1, 0xe9, 0x18, 0x33, 0x83, 0x3e, 0x14, 0xd4, 0xad, 0xc3, 0x09, 0x4b, - 0x64, 0x05, 0x81, 0x6c, 0x0b, 0x9e, 0x8a, 0x22, 0x0b, 0xbe, 0x15, 0x22, 0x00, 0x7f, 0x54, 0xc0, - 0x6c, 0x3f, 0x17, 0x87, 0x7a, 0x8c, 0xd9, 0x98, 0x4f, 0x00, 0xd5, 0x38, 0xb4, 0xbc, 0x44, 0x7a, - 0x5e, 0x20, 0x3d, 0x0b, 0x0b, 0x51, 0xa4, 0xad, 0xe0, 0x4c, 0x17, 0x6c, 0xf8, 0xf3, 0xe2, 0x1e, - 0xbc, 0xaf, 0x80, 0x94, 0x64, 0xdd, 0xb1, 0xae, 0xed, 0x25, 0xf4, 0xb1, 0xae, 0xed, 0x23, 0xef, - 0xda, 0x96, 0x80, 0xb5, 0x06, 0x4f, 0x46, 0x61, 0x49, 0x16, 0x4f, 0x43, 0x4f, 0xf7, 0x50, 0x01, - 0x29, 0xc9, 0xbf, 0x63, 0x81, 0xf4, 0x92, 0xfd, 0x58, 0x20, 0x7d, 0x34, 0x5e, 0xdb, 0x16, 0x40, - 0x4e, 0xc3, 0xcd, 0x28, 0x10, 0xea, 0x8b, 0x76, 0x71, 0x18, 0x77, 0xf6, 0xf1, 0xc1, 0x3d, 0x78, - 0x1b, 0x24, 0x39, 0x4d, 0x87, 0x5a, 0x6c, 0xc8, 0x74, 0xb8, 0xbf, 0xba, 0x32, 0x54, 0x46, 0x62, - 0xd8, 0x14, 0x18, 0x56, 0xe0, 0x89, 0x41, 0xd1, 0x54, 0xe9, 0x79, 0x89, 0xcf, 0xc1, 0xa4, 0xcf, - 0x54, 0xe1, 0xc9, 0x18, 0xcd, 0x3d, 0x84, 0x58, 0x5d, 0x1d, 0x21, 0x25, 0x11, 0x2c, 0x0b, 0x04, - 0x2a, 0xcc, 0x1a, 0x31, 0xff, 0x42, 0xc0, 0x36, 0x48, 0x49, 0x26, 0x0c, 0x97, 0xa3, 0x3a, 0x7b, - 0x49, 0xb2, 0xba, 0x3e, 0xaa, 0x35, 0x04, 0x76, 0x35, 0x61, 0x77, 0x11, 0xaa, 0x51, 0xbb, 0x98, - 0x55, 0x4b, 0x16, 0x37, 0xf7, 0x05, 0xc8, 0x84, 0xc8, 0xea, 0x21, 0xac, 0x0f, 0xb8, 0xf3, 0x00, - 0xb6, 0xab, 0xad, 0x09, 0xdb, 0xcb, 0x30, 0x37, 0xc0, 0xb6, 0x14, 0x2f, 0x71, 0x0e, 0x7c, 0x17, - 0xa4, 0x24, 0xdd, 0x89, 0x8d, 0xbd, 0x5e, 0xc2, 0x1b, 0x1b, 0x7b, 0x7d, 0xac, 0x69, 0xd8, 0xed, - 0xfd, 0x9e, 0xc9, 0xda, 0xf0, 0x81, 0x02, 0x40, 0xb7, 0xf0, 0xc3, 0x8d, 0x61, 0xaa, 0xc3, 0xbd, - 0x5a, 0xdd, 0x3c, 0x84, 0xa4, 0xc4, 0xb1, 0x2a, 0x70, 0xe4, 0xe1, 0x52, 0x1c, 0x0e, 0xd1, 0x05, - 0xe1, 0x57, 0x0a, 0x98, 0xea, 0x50, 0x08, 0xb8, 0x3e, 0x4c, 0x7f, 0xd8, 0x1d, 0x1b, 0xa3, 0x05, - 0x25, 0x8e, 0x93, 0x02, 0x47, 0x0e, 0x2e, 0xc6, 0xe1, 0x10, 0xf1, 0x70, 0x97, 0x17, 0x25, 0xd1, - 0x85, 0x86, 0x14, 0xa5, 0x70, 0xeb, 0x1b, 0x52, 0x94, 0x7a, 0x5a, 0xe1, 0x30, 0x7f, 0x04, 0x2d, - 0x72, 0xe7, 0xc2, 0x93, 0x17, 0x39, 0xe5, 0xe9, 0x8b, 0x9c, 0xf2, 0xfc, 0x45, 0x4e, 0x79, 0xf4, - 0x32, 0x37, 0xf6, 0xf4, 0x65, 0x6e, 0xec, 0x97, 0x97, 0xb9, 0xb1, 0x4f, 0xd7, 0x42, 0x14, 0x00, - 0xb7, 0x38, 0x03, 0xe8, 0x6a, 0x69, 0x0b, 0x3d, 0x82, 0x06, 0x94, 0x27, 0x05, 0xe3, 0x78, 0xe7, - 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x0f, 0xce, 0x6b, 0x84, 0x14, 0x00, 0x00, + // 1774 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4f, 0x6f, 0xe3, 0xc6, + 0x15, 0x37, 0x2d, 0xd9, 0x92, 0x9e, 0xbc, 0x59, 0x65, 0xe2, 0x4d, 0xb4, 0xac, 0x2d, 0x79, 0xe9, + 0xff, 0x5e, 0x87, 0xac, 0xd4, 0x20, 0x40, 0xf7, 0xd2, 0xd8, 0x82, 0x93, 0xa6, 0xf1, 0x16, 0x29, + 0xe3, 0xe6, 0x50, 0xa0, 0x10, 0x46, 0xe4, 0x2c, 0x45, 0x58, 0x14, 0x15, 0xce, 0x48, 0x95, 0x93, + 0x6c, 0x81, 0x16, 0x4d, 0x9a, 0x22, 0x40, 0x10, 0xa0, 0x40, 0x8f, 0x45, 0xbe, 0x41, 0x8f, 0x05, + 0xfa, 0x09, 0x72, 0x0c, 0x50, 0x14, 0x28, 0x7a, 0xd8, 0x16, 0xbb, 0x3d, 0xf4, 0x33, 0xf4, 0x54, + 0xcc, 0x70, 0x28, 0x51, 0xa2, 0x28, 0x79, 0x8b, 0x14, 0xd8, 0x22, 0x27, 0x71, 0xde, 0xbc, 0x79, + 0xef, 0xf7, 0xe6, 0xfd, 0x99, 0xf7, 0x04, 0x1b, 0x84, 0xb5, 0x49, 0xe0, 0xb9, 0x5d, 0x66, 0x90, + 0x81, 0x67, 0x0c, 0x6a, 0xc6, 0x7b, 0x7d, 0x12, 0x5c, 0xe9, 0xbd, 0xc0, 0x67, 0x3e, 0x2a, 0x8d, + 0x76, 0x75, 0x32, 0xf0, 0xf4, 0x41, 0x4d, 0x3d, 0xb2, 0x7c, 0xea, 0xf9, 0xd4, 0x68, 0x61, 0x4a, + 0x42, 0x56, 0x63, 0x50, 0x6b, 0x11, 0x86, 0x6b, 0x46, 0x0f, 0x3b, 0x6e, 0x17, 0x33, 0xd7, 0xef, + 0x86, 0xa7, 0xd5, 0xdb, 0x09, 0xd9, 0x6c, 0x28, 0xb7, 0xd4, 0xc4, 0x56, 0xc7, 0x77, 0xe4, 0xde, + 0x66, 0x62, 0xaf, 0x87, 0x03, 0xec, 0x51, 0xb9, 0xbd, 0x9d, 0x94, 0x1a, 0x60, 0x8b, 0x34, 0x2d, + 0xbf, 0xfb, 0xc0, 0x8d, 0x64, 0xac, 0x3b, 0xbe, 0xe3, 0x8b, 0x4f, 0x83, 0x7f, 0x49, 0xea, 0x86, + 0xe3, 0xfb, 0x4e, 0x87, 0x18, 0xb8, 0xe7, 0x1a, 0xb8, 0xdb, 0xf5, 0x99, 0x40, 0x1b, 0x09, 0xae, + 0xca, 0x5d, 0xb1, 0x6a, 0xf5, 0x1f, 0x18, 0xcc, 0xf5, 0x08, 0x65, 0xd8, 0xeb, 0x85, 0x0c, 0xda, + 0x77, 0xe1, 0x85, 0x1f, 0x71, 0x8b, 0x4f, 0x2c, 0xcb, 0xef, 0x77, 0x99, 0x49, 0xde, 0xeb, 0x13, + 0xca, 0x50, 0x19, 0x72, 0xd8, 0xb6, 0x03, 0x42, 0x69, 0x59, 0xd9, 0x52, 0x0e, 0x0a, 0x66, 0xb4, + 0xbc, 0x97, 0xff, 0xe4, 0x8b, 0xea, 0xd2, 0xbf, 0xbe, 0xa8, 0x2e, 0x69, 0x16, 0xac, 0x4f, 0x1e, + 0xa5, 0x3d, 0xbf, 0x4b, 0x09, 0x3f, 0xdb, 0xc2, 0x1d, 0xdc, 0xb5, 0x48, 0x74, 0x56, 0x2e, 0xd1, + 0xb7, 0xa0, 0x60, 0xf9, 0x36, 0x69, 0xb6, 0x31, 0x6d, 0x97, 0x97, 0xc5, 0x5e, 0x9e, 0x13, 0xbe, + 0x8f, 0x69, 0x1b, 0xad, 0xc3, 0x4a, 0xd7, 0xe7, 0x87, 0x32, 0x5b, 0xca, 0x41, 0xd6, 0x0c, 0x17, + 0xda, 0xf7, 0xe0, 0xb6, 0x50, 0xd2, 0x10, 0x2e, 0xfa, 0x2f, 0x50, 0x7e, 0xac, 0x80, 0x3a, 0x4b, + 0x82, 0x04, 0xbb, 0x0b, 0xcf, 0x85, 0xde, 0x6f, 0x4e, 0x4a, 0xba, 0x11, 0x52, 0x4f, 0x42, 0x22, + 0x52, 0x21, 0x4f, 0xb9, 0x52, 0x8e, 0x6f, 0x59, 0xe0, 0x1b, 0xad, 0xb9, 0x08, 0x1c, 0x4a, 0x6d, + 0x76, 0xfb, 0x5e, 0x8b, 0x04, 0xd2, 0x82, 0x1b, 0x92, 0xfa, 0x43, 0x41, 0xd4, 0xde, 0x82, 0x0d, + 0x81, 0xe3, 0x5d, 0xdc, 0x71, 0x6d, 0xcc, 0xfc, 0x60, 0xca, 0x98, 0x3b, 0xb0, 0x66, 0xf9, 0xdd, + 0x69, 0x1c, 0x45, 0x4e, 0x3b, 0x49, 0x58, 0xf5, 0xa9, 0x02, 0x9b, 0x29, 0xd2, 0xa4, 0x61, 0xfb, + 0x70, 0x33, 0x42, 0x35, 0x29, 0x31, 0x02, 0xfb, 0x35, 0x9a, 0x16, 0x05, 0xd1, 0x69, 0xe8, 0xe7, + 0xa7, 0x71, 0xcf, 0xb7, 0x65, 0x10, 0x8d, 0x8e, 0x2e, 0x0a, 0x22, 0xed, 0x2d, 0xa9, 0xec, 0x1d, + 0xe6, 0x07, 0xd8, 0x59, 0xac, 0x0c, 0x95, 0x20, 0x73, 0x49, 0xae, 0x64, 0xbc, 0xf1, 0xcf, 0x98, + 0xfa, 0x63, 0xa9, 0x7e, 0x24, 0x4c, 0xaa, 0x5f, 0x87, 0x95, 0x01, 0xee, 0xf4, 0x23, 0xe5, 0xe1, + 0x42, 0x7b, 0x15, 0x4a, 0x32, 0x94, 0xec, 0xa7, 0x32, 0x72, 0x1f, 0x9e, 0x8f, 0x9d, 0x93, 0x2a, + 0x10, 0x64, 0x79, 0xec, 0x8b, 0x53, 0x6b, 0xa6, 0xf8, 0xd6, 0xde, 0x07, 0x24, 0x18, 0x2f, 0x86, + 0xe7, 0xbe, 0x43, 0x23, 0x15, 0x08, 0xb2, 0x22, 0x63, 0x42, 0xf9, 0xe2, 0x1b, 0xbd, 0x0e, 0x30, + 0xae, 0x4d, 0xc2, 0xb6, 0x62, 0x7d, 0x4f, 0x0f, 0x83, 0x56, 0xe7, 0x85, 0x4c, 0x0f, 0x6b, 0x9e, + 0x2c, 0x64, 0xfa, 0xdb, 0xe3, 0xab, 0x32, 0x63, 0x27, 0x63, 0x20, 0x7f, 0xa3, 0xc8, 0x8b, 0x8d, + 0x94, 0x4b, 0x9c, 0x87, 0x90, 0xed, 0xf8, 0x0e, 0xb7, 0x2e, 0x73, 0x50, 0xac, 0xdf, 0xd2, 0xa7, + 0xcb, 0xa7, 0x7e, 0xee, 0x3b, 0xa6, 0x60, 0x41, 0x6f, 0xcc, 0x00, 0xb5, 0xbf, 0x10, 0x54, 0xa8, + 0x27, 0x8e, 0x4a, 0x5b, 0x97, 0xf7, 0xf0, 0xb6, 0x28, 0x92, 0x12, 0xb7, 0x76, 0x5f, 0x02, 0x8c, + 0xa8, 0x12, 0xe0, 0xab, 0xb0, 0x1a, 0x16, 0x53, 0x71, 0x41, 0xc5, 0x7a, 0x39, 0x09, 0x31, 0x3c, + 0x71, 0x9a, 0xfd, 0xf2, 0x51, 0x75, 0xc9, 0x94, 0xdc, 0xda, 0x5f, 0x14, 0x78, 0xee, 0x8c, 0xb5, + 0x1b, 0xb8, 0xd3, 0x89, 0xdd, 0x34, 0x0e, 0x1c, 0x1a, 0xf9, 0x84, 0x7f, 0xa3, 0x97, 0x20, 0xe7, + 0x60, 0xda, 0xb4, 0x70, 0x4f, 0xa6, 0xc7, 0xaa, 0x83, 0x69, 0x03, 0xf7, 0xd0, 0x4f, 0xa1, 0xd4, + 0x0b, 0xfc, 0x9e, 0x4f, 0x49, 0x30, 0x4a, 0x31, 0x9e, 0x1e, 0x6b, 0xa7, 0xf5, 0x7f, 0x3f, 0xaa, + 0xea, 0x8e, 0xcb, 0xda, 0xfd, 0x96, 0x6e, 0xf9, 0x9e, 0x21, 0xdf, 0x97, 0xf0, 0xe7, 0x65, 0x6a, + 0x5f, 0x1a, 0xec, 0xaa, 0x47, 0xa8, 0xde, 0x18, 0xe7, 0xb6, 0x79, 0x33, 0x92, 0x15, 0xe5, 0xe5, + 0x6d, 0xc8, 0x5b, 0x6d, 0xec, 0x76, 0x9b, 0xae, 0x5d, 0xce, 0x6e, 0x29, 0x07, 0x19, 0x33, 0x27, + 0xd6, 0x6f, 0xda, 0x68, 0x03, 0x0a, 0xfe, 0x80, 0x04, 0x81, 0x6b, 0x13, 0x5a, 0x5e, 0x11, 0x58, + 0xc7, 0x04, 0xed, 0x8f, 0x0a, 0xdc, 0x1c, 0xd9, 0x35, 0x0e, 0xb6, 0x44, 0x08, 0x45, 0x8e, 0x5d, + 0x5e, 0xec, 0xd8, 0x12, 0x64, 0x02, 0xc2, 0x42, 0xeb, 0x4c, 0xfe, 0xc9, 0xd1, 0x0d, 0xbc, 0x26, + 0x09, 0x02, 0x3f, 0x10, 0xe8, 0x0a, 0x66, 0x6e, 0xe0, 0x9d, 0xf1, 0x25, 0xdf, 0xe2, 0x17, 0xd6, + 0xa7, 0xc4, 0x16, 0xe0, 0xb2, 0x26, 0xbf, 0xc0, 0x1f, 0x53, 0x62, 0xa3, 0x4d, 0x80, 0x56, 0xc7, + 0xb7, 0x2e, 0xc3, 0x17, 0x60, 0x35, 0x44, 0x2e, 0x28, 0xfc, 0x09, 0xd0, 0x2e, 0xe0, 0x85, 0x33, + 0xca, 0x5c, 0x0f, 0x33, 0xf2, 0x06, 0x1e, 0x3b, 0xb8, 0x04, 0x19, 0x07, 0x87, 0x4e, 0xc9, 0x9a, + 0xfc, 0x33, 0xc2, 0xb3, 0x3c, 0x1b, 0x4f, 0x66, 0x02, 0x8f, 0xf6, 0xbb, 0x6c, 0x14, 0xd8, 0xfc, + 0x4d, 0xbd, 0x18, 0x46, 0xce, 0xae, 0x41, 0xc6, 0xa3, 0x8e, 0x0c, 0x9a, 0x6a, 0xd2, 0xfc, 0xfb, + 0xd4, 0x39, 0xe3, 0x34, 0xd2, 0xf7, 0x2e, 0x86, 0x26, 0xe7, 0x45, 0xaf, 0xc1, 0x5a, 0xfc, 0x61, + 0x16, 0x9a, 0x8a, 0xf5, 0xcd, 0xe4, 0x59, 0xa1, 0xaa, 0x21, 0x98, 0xcc, 0x22, 0x1b, 0x2f, 0x50, + 0x03, 0xd6, 0x7a, 0x01, 0xb1, 0x89, 0x45, 0x28, 0xf5, 0x03, 0x5a, 0xce, 0x8a, 0xcb, 0x5f, 0xa8, + 0x7d, 0xe2, 0x10, 0x7f, 0x2a, 0xc2, 0x6b, 0x94, 0x45, 0x79, 0x45, 0x84, 0x47, 0x51, 0xd0, 0xc2, + 0x92, 0x3c, 0xe3, 0xa6, 0x0b, 0xb1, 0x9b, 0x46, 0x8d, 0x68, 0x9b, 0xf7, 0x03, 0xe5, 0x9c, 0x30, + 0x43, 0xd5, 0xc3, 0x66, 0x41, 0x8f, 0x9a, 0x05, 0xfd, 0x22, 0x6a, 0x16, 0x4e, 0xf3, 0x3c, 0x73, + 0x3e, 0xff, 0x7b, 0x55, 0x91, 0x42, 0xf8, 0xce, 0xcc, 0x04, 0xc8, 0xff, 0x6f, 0x12, 0xa0, 0x30, + 0x99, 0x00, 0xaf, 0x40, 0x9e, 0x97, 0x93, 0xe6, 0x03, 0x42, 0xca, 0xc0, 0x6d, 0x3b, 0xbd, 0xfd, + 0xb7, 0x47, 0xd5, 0x5b, 0xa1, 0x7c, 0x6a, 0x5f, 0xea, 0xae, 0x6f, 0x78, 0x98, 0xb5, 0xf5, 0x37, + 0xbb, 0x8c, 0xbf, 0x1c, 0x94, 0xbc, 0x4e, 0xc8, 0x0f, 0xb2, 0xf9, 0xe5, 0x52, 0xc6, 0xcc, 0xb3, + 0x61, 0xd3, 0xed, 0xda, 0x64, 0xa8, 0x1d, 0xc9, 0xe2, 0x3f, 0x8a, 0x8b, 0x71, 0xb2, 0xd8, 0x98, + 0xe1, 0xa8, 0x0a, 0xf0, 0x6f, 0xed, 0xd7, 0x19, 0xb8, 0x35, 0x66, 0x7e, 0x56, 0x6b, 0xc6, 0x74, + 0x7c, 0x66, 0x9f, 0x3a, 0x3e, 0x9f, 0x91, 0xd0, 0x8a, 0xfb, 0x3e, 0x3f, 0xe1, 0x7b, 0xed, 0x18, + 0x5e, 0x9c, 0x76, 0xc4, 0x1c, 0xbf, 0x7d, 0x96, 0x89, 0xb3, 0x9f, 0x72, 0x05, 0xb1, 0xfc, 0x67, + 0xc3, 0xe8, 0x5d, 0x5b, 0x9c, 0xff, 0x6c, 0x48, 0xbf, 0x86, 0xfc, 0xff, 0xa6, 0xa7, 0xae, 0xf6, + 0x32, 0xbc, 0x94, 0xf0, 0xc7, 0x1c, 0xff, 0xdd, 0x1a, 0xb5, 0x96, 0x22, 0x87, 0xa3, 0x56, 0xe0, + 0x7c, 0xd4, 0x36, 0x4a, 0xb2, 0x14, 0x11, 0x2f, 0x0c, 0xca, 0x75, 0x0b, 0x83, 0xa6, 0x43, 0xb9, + 0x11, 0x10, 0xcc, 0xc8, 0x89, 0xc5, 0x4b, 0xec, 0xb9, 0x4b, 0xd9, 0x5c, 0x50, 0x7f, 0x52, 0xe0, + 0xf9, 0x77, 0x5c, 0xaf, 0xdf, 0xc1, 0x8c, 0xbc, 0x5b, 0xfb, 0xff, 0x6a, 0x1e, 0xb4, 0x1e, 0xa0, + 0x38, 0x76, 0x69, 0xe6, 0x8b, 0xb0, 0x1a, 0x10, 0xda, 0xef, 0x30, 0x09, 0x5f, 0xae, 0xd0, 0x36, + 0xdc, 0x10, 0x8f, 0x6a, 0xd3, 0x23, 0x94, 0x62, 0x87, 0xc8, 0x36, 0x7a, 0x4d, 0x10, 0xef, 0x87, + 0x34, 0x1e, 0xb1, 0x21, 0x93, 0x68, 0x68, 0xb9, 0x19, 0x2b, 0x66, 0x41, 0x50, 0x78, 0xc7, 0x5b, + 0xff, 0xa8, 0x04, 0x2b, 0xc2, 0x5b, 0xe8, 0x23, 0x05, 0x72, 0x72, 0x50, 0x41, 0xbb, 0xc9, 0xac, + 0x99, 0x31, 0x89, 0xaa, 0x7b, 0x8b, 0xd8, 0x42, 0x03, 0xb4, 0xbb, 0xbf, 0xfc, 0xf3, 0x3f, 0x7f, + 0xbb, 0xbc, 0x8b, 0xb6, 0x8d, 0xc4, 0x2c, 0x2d, 0x87, 0x15, 0xe3, 0x03, 0x79, 0xd1, 0x0f, 0xd1, + 0xef, 0x15, 0xb8, 0x31, 0x31, 0x0f, 0xa2, 0xbb, 0x29, 0x6a, 0x66, 0xcd, 0x9d, 0xea, 0xf1, 0xf5, + 0x98, 0x25, 0xb2, 0xba, 0x40, 0x76, 0x8c, 0x8e, 0x92, 0xc8, 0xa2, 0xd1, 0x33, 0x01, 0xf0, 0x0f, + 0x0a, 0x94, 0xa6, 0x47, 0x3b, 0xa4, 0xa7, 0xa8, 0x4d, 0x99, 0x28, 0x55, 0xe3, 0xda, 0xfc, 0x12, + 0xe9, 0x3d, 0x81, 0xf4, 0x15, 0x54, 0x4f, 0x22, 0x1d, 0x44, 0x67, 0xc6, 0x60, 0xe3, 0xd3, 0xea, + 0x43, 0xf4, 0xb1, 0x02, 0x39, 0x39, 0xc4, 0xa5, 0xba, 0x76, 0x72, 0x3e, 0x4c, 0x75, 0xed, 0xd4, + 0x2c, 0xa8, 0x1d, 0x0b, 0x58, 0x7b, 0x68, 0x27, 0x09, 0x4b, 0x0e, 0x85, 0x34, 0x76, 0x75, 0x9f, + 0x2a, 0x90, 0x93, 0xe3, 0x5c, 0x2a, 0x90, 0xc9, 0xd9, 0x31, 0x15, 0xc8, 0xd4, 0x54, 0xa8, 0xd5, + 0x04, 0x90, 0xbb, 0xe8, 0x30, 0x09, 0x84, 0x86, 0xac, 0x63, 0x1c, 0xc6, 0x07, 0x97, 0xe4, 0xea, + 0x21, 0x7a, 0x1f, 0xb2, 0x3c, 0x07, 0x90, 0x96, 0x1a, 0x32, 0xa3, 0x51, 0x52, 0xdd, 0x9e, 0xcb, + 0x23, 0x31, 0x1c, 0x0a, 0x0c, 0xdb, 0xe8, 0xce, 0xac, 0x68, 0xb2, 0x27, 0x6e, 0xe2, 0x67, 0xb0, + 0x1a, 0x0e, 0x3e, 0x68, 0x27, 0x45, 0xf2, 0xc4, 0x7c, 0xa5, 0xee, 0x2e, 0xe0, 0x92, 0x08, 0xb6, + 0x04, 0x02, 0x15, 0x95, 0x8d, 0x94, 0x3f, 0xb5, 0x50, 0x00, 0x39, 0x39, 0x80, 0xa0, 0xad, 0xa4, + 0xcc, 0xc9, 0x99, 0x4b, 0xbd, 0x33, 0x87, 0x43, 0x6a, 0xd4, 0x84, 0xc6, 0x0d, 0xa4, 0x26, 0x35, + 0x12, 0xd6, 0x6e, 0x5a, 0x5c, 0xd1, 0xcf, 0xa1, 0x18, 0x9b, 0x1d, 0xae, 0xa1, 0x77, 0x86, 0xb5, + 0x33, 0x86, 0x0f, 0x6d, 0x4f, 0xe8, 0xde, 0x42, 0x95, 0x19, 0xba, 0x25, 0x7b, 0x93, 0x8f, 0x24, + 0x1f, 0x42, 0x4e, 0xf6, 0x91, 0xa9, 0x51, 0x37, 0x39, 0x7f, 0xa4, 0x46, 0xdd, 0x54, 0x3b, 0x3a, + 0xcf, 0xfa, 0xb0, 0x19, 0x61, 0x43, 0xf4, 0x89, 0x02, 0x30, 0x7e, 0x51, 0xd1, 0xc1, 0x3c, 0xd1, + 0xf1, 0x26, 0x48, 0x3d, 0xbc, 0x06, 0xa7, 0xc4, 0xb1, 0x2b, 0x70, 0x54, 0xd1, 0x66, 0x1a, 0x0e, + 0xd1, 0x5e, 0xa0, 0x5f, 0x29, 0x50, 0x18, 0xf5, 0x66, 0x68, 0x7f, 0x9e, 0xfc, 0xb8, 0x3b, 0x0e, + 0x16, 0x33, 0x4a, 0x1c, 0x3b, 0x02, 0x47, 0x05, 0x6d, 0xa4, 0xe1, 0x10, 0xf1, 0xf0, 0x21, 0x2f, + 0x47, 0xe2, 0x79, 0x9f, 0x53, 0x8e, 0xe2, 0x3d, 0xc5, 0x9c, 0x72, 0x34, 0xd1, 0x63, 0xcc, 0xf3, + 0x47, 0xd4, 0x7b, 0xa0, 0xcf, 0x14, 0x28, 0x4d, 0xb7, 0x14, 0xd7, 0x88, 0xc9, 0xa3, 0x24, 0x47, + 0x5a, 0x63, 0x32, 0xaf, 0x2a, 0x5a, 0xe2, 0x0c, 0xaf, 0xd4, 0x84, 0xd2, 0x66, 0x87, 0xeb, 0xfe, + 0x85, 0x02, 0x30, 0x7e, 0xf6, 0xd1, 0x8c, 0x52, 0x93, 0x68, 0x68, 0xd4, 0x9d, 0xf9, 0x4c, 0x12, + 0xc7, 0x81, 0xc0, 0xa1, 0xdd, 0x53, 0x8e, 0xb4, 0x19, 0x91, 0x41, 0xe5, 0x81, 0xe6, 0xa0, 0x76, + 0xfa, 0xda, 0x97, 0x8f, 0x2b, 0xca, 0x57, 0x8f, 0x2b, 0xca, 0x3f, 0x1e, 0x57, 0x94, 0xcf, 0x9f, + 0x54, 0x96, 0xbe, 0x7a, 0x52, 0x59, 0xfa, 0xeb, 0x93, 0xca, 0xd2, 0x4f, 0xf6, 0x62, 0xfd, 0x0e, + 0x19, 0xf0, 0x76, 0x67, 0x2c, 0x68, 0x28, 0x44, 0x89, 0x9e, 0xa7, 0xb5, 0x2a, 0xfa, 0xdb, 0xef, + 0xfc, 0x27, 0x00, 0x00, 0xff, 0xff, 0xde, 0x95, 0xf9, 0x04, 0xe2, 0x17, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1630,7 +1924,7 @@ type QueryClient interface { // Params queries the parameters of x/evm module. Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api - EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) + EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EthCallResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -1642,6 +1936,10 @@ type QueryClient interface { // BaseFee queries the base fee of the parent block of the current block, // it's similar to feemarket module's method, but also checks london hardfork status. BaseFee(ctx context.Context, in *QueryBaseFeeRequest, opts ...grpc.CallOption) (*QueryBaseFeeResponse, error) + // CreateAccessList implement `eth_createAccessList` rpc call + CreateAccessList(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*CreateAccessListResponse, error) + // SimulateV1 implements the `eth_simulateV1` rpc api + SimulateV1(ctx context.Context, in *SimulateV1Request, opts ...grpc.CallOption) (*SimulateV1Response, error) } type queryClient struct { @@ -1715,8 +2013,8 @@ func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts . return out, nil } -func (c *queryClient) EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*MsgEthereumTxResponse, error) { - out := new(MsgEthereumTxResponse) +func (c *queryClient) EthCall(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*EthCallResponse, error) { + out := new(EthCallResponse) err := c.cc.Invoke(ctx, "/ethermint.evm.v1.Query/EthCall", in, out, opts...) if err != nil { return nil, err @@ -1769,6 +2067,24 @@ func (c *queryClient) BaseFee(ctx context.Context, in *QueryBaseFeeRequest, opts return out, nil } +func (c *queryClient) CreateAccessList(ctx context.Context, in *EthCallRequest, opts ...grpc.CallOption) (*CreateAccessListResponse, error) { + out := new(CreateAccessListResponse) + err := c.cc.Invoke(ctx, "/ethermint.evm.v1.Query/CreateAccessList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) SimulateV1(ctx context.Context, in *SimulateV1Request, opts ...grpc.CallOption) (*SimulateV1Response, error) { + out := new(SimulateV1Response) + err := c.cc.Invoke(ctx, "/ethermint.evm.v1.Query/SimulateV1", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Account queries an Ethereum account. @@ -1788,7 +2104,7 @@ type QueryServer interface { // Params queries the parameters of x/evm module. Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // EthCall implements the `eth_call` rpc api - EthCall(context.Context, *EthCallRequest) (*MsgEthereumTxResponse, error) + EthCall(context.Context, *EthCallRequest) (*EthCallResponse, error) // EstimateGas implements the `eth_estimateGas` rpc api EstimateGas(context.Context, *EthCallRequest) (*EstimateGasResponse, error) // TraceTx implements the `debug_traceTransaction` rpc api @@ -1800,6 +2116,10 @@ type QueryServer interface { // BaseFee queries the base fee of the parent block of the current block, // it's similar to feemarket module's method, but also checks london hardfork status. BaseFee(context.Context, *QueryBaseFeeRequest) (*QueryBaseFeeResponse, error) + // CreateAccessList implement `eth_createAccessList` rpc call + CreateAccessList(context.Context, *EthCallRequest) (*CreateAccessListResponse, error) + // SimulateV1 implements the `eth_simulateV1` rpc api + SimulateV1(context.Context, *SimulateV1Request) (*SimulateV1Response, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1827,7 +2147,7 @@ func (*UnimplementedQueryServer) Code(ctx context.Context, req *QueryCodeRequest func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") } -func (*UnimplementedQueryServer) EthCall(ctx context.Context, req *EthCallRequest) (*MsgEthereumTxResponse, error) { +func (*UnimplementedQueryServer) EthCall(ctx context.Context, req *EthCallRequest) (*EthCallResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EthCall not implemented") } func (*UnimplementedQueryServer) EstimateGas(ctx context.Context, req *EthCallRequest) (*EstimateGasResponse, error) { @@ -1845,6 +2165,12 @@ func (*UnimplementedQueryServer) TraceCall(ctx context.Context, req *QueryTraceC func (*UnimplementedQueryServer) BaseFee(ctx context.Context, req *QueryBaseFeeRequest) (*QueryBaseFeeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method BaseFee not implemented") } +func (*UnimplementedQueryServer) CreateAccessList(ctx context.Context, req *EthCallRequest) (*CreateAccessListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAccessList not implemented") +} +func (*UnimplementedQueryServer) SimulateV1(ctx context.Context, req *SimulateV1Request) (*SimulateV1Response, error) { + return nil, status.Errorf(codes.Unimplemented, "method SimulateV1 not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -2084,6 +2410,42 @@ func _Query_BaseFee_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } +func _Query_CreateAccessList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EthCallRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CreateAccessList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ethermint.evm.v1.Query/CreateAccessList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CreateAccessList(ctx, req.(*EthCallRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_SimulateV1_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SimulateV1Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).SimulateV1(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ethermint.evm.v1.Query/SimulateV1", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).SimulateV1(ctx, req.(*SimulateV1Request)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "ethermint.evm.v1.Query", HandlerType: (*QueryServer)(nil), @@ -2140,6 +2502,14 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "BaseFee", Handler: _Query_BaseFee_Handler, }, + { + MethodName: "CreateAccessList", + Handler: _Query_CreateAccessList_Handler, + }, + { + MethodName: "SimulateV1", + Handler: _Query_SimulateV1_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "ethermint/evm/v1/query.proto", @@ -2745,7 +3115,7 @@ func (m *EthCallRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *EstimateGasResponse) Marshal() (dAtA []byte, err error) { +func (m *EthCallResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2755,29 +3125,99 @@ func (m *EstimateGasResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *EstimateGasResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *EthCallResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EstimateGasResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EthCallResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l + if len(m.BlockHash) > 0 { + i -= len(m.BlockHash) + copy(dAtA[i:], m.BlockHash) + i = encodeVarintQuery(dAtA, i, uint64(len(m.BlockHash))) + i-- + dAtA[i] = 0x32 + } + if m.GasUsed != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x28 + } if len(m.VmError) > 0 { i -= len(m.VmError) copy(dAtA[i:], m.VmError) i = encodeVarintQuery(dAtA, i, uint64(len(m.VmError))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.Ret) > 0 { i -= len(m.Ret) copy(dAtA[i:], m.Ret) i = encodeVarintQuery(dAtA, i, uint64(len(m.Ret))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a + } + if len(m.Logs) > 0 { + for iNdEx := len(m.Logs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EstimateGasResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EstimateGasResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EstimateGasResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.VmError) > 0 { + i -= len(m.VmError) + copy(dAtA[i:], m.VmError) + i = encodeVarintQuery(dAtA, i, uint64(len(m.VmError))) + i-- + dAtA[i] = 0x1a + } + if len(m.Ret) > 0 { + i -= len(m.Ret) + copy(dAtA[i:], m.Ret) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Ret))) + i-- + dAtA[i] = 0x12 } if m.Gas != 0 { i = encodeVarintQuery(dAtA, i, uint64(m.Gas)) @@ -2807,6 +3247,18 @@ func (m *QueryTraceTxRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.BaseFee != nil { + { + size := m.BaseFee.Size() + i -= size + if _, err := m.BaseFee.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.ChainId != 0 { i = encodeVarintQuery(dAtA, i, uint64(m.ChainId)) i-- @@ -3188,6 +3640,125 @@ func (m *QueryBaseFeeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *CreateAccessListResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateAccessListResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CreateAccessListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SimulateV1Request) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SimulateV1Request) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SimulateV1Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ChainId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.ChainId)) + i-- + dAtA[i] = 0x20 + } + if len(m.ProposerAddress) > 0 { + i -= len(m.ProposerAddress) + copy(dAtA[i:], m.ProposerAddress) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ProposerAddress))) + i-- + dAtA[i] = 0x1a + } + if m.GasCap != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.GasCap)) + i-- + dAtA[i] = 0x10 + } + if len(m.Args) > 0 { + i -= len(m.Args) + copy(dAtA[i:], m.Args) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Args))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SimulateV1Response) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SimulateV1Response) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SimulateV1Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ErrorCode != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.ErrorCode)) + i-- + dAtA[i] = 0x18 + } + if len(m.ErrorMessage) > 0 { + i -= len(m.ErrorMessage) + copy(dAtA[i:], m.ErrorMessage) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ErrorMessage))) + i-- + dAtA[i] = 0x12 + } + if len(m.Result) > 0 { + i -= len(m.Result) + copy(dAtA[i:], m.Result) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Result))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -3461,6 +4032,40 @@ func (m *EthCallRequest) Size() (n int) { return n } +func (m *EthCallResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if len(m.Logs) > 0 { + for _, e := range m.Logs { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + l = len(m.Ret) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.VmError) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.GasUsed != 0 { + n += 1 + sovQuery(uint64(m.GasUsed)) + } + l = len(m.BlockHash) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func (m *EstimateGasResponse) Size() (n int) { if m == nil { return 0 @@ -3517,6 +4122,10 @@ func (m *QueryTraceTxRequest) Size() (n int) { if m.ChainId != 0 { n += 1 + sovQuery(uint64(m.ChainId)) } + if m.BaseFee != nil { + l = m.BaseFee.Size() + n += 1 + l + sovQuery(uint64(l)) + } return n } @@ -3652,6 +4261,62 @@ func (m *QueryBaseFeeResponse) Size() (n int) { return n } +func (m *CreateAccessListResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Data) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *SimulateV1Request) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Args) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.GasCap != 0 { + n += 1 + sovQuery(uint64(m.GasCap)) + } + l = len(m.ProposerAddress) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.ChainId != 0 { + n += 1 + sovQuery(uint64(m.ChainId)) + } + return n +} + +func (m *SimulateV1Response) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Result) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.ErrorMessage) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.ErrorCode != 0 { + n += 1 + sovQuery(uint64(m.ErrorCode)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -5364,7 +6029,7 @@ func (m *EthCallRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *EstimateGasResponse) Unmarshal(dAtA []byte) error { +func (m *EthCallResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5387,14 +6052,249 @@ func (m *EstimateGasResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EstimateGasResponse: wiretype end group for non-group") + return fmt.Errorf("proto: EthCallResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EstimateGasResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EthCallResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Logs = append(m.Logs, &Log{}) + if err := m.Logs[len(m.Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ret", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ret = append(m.Ret[:0], dAtA[iNdEx:postIndex]...) + if m.Ret == nil { + m.Ret = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VmError", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VmError = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) + } + m.GasUsed = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasUsed |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BlockHash = append(m.BlockHash[:0], dAtA[iNdEx:postIndex]...) + if m.BlockHash == nil { + m.BlockHash = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EstimateGasResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EstimateGasResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EstimateGasResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Gas", wireType) } m.Gas = 0 @@ -5771,16 +6671,52 @@ func (m *QueryTraceTxRequest) Unmarshal(dAtA []byte) error { break } } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BaseFee", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthQuery } - if (iNdEx + skippy) > l { + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.BaseFee = &v + if err := m.BaseFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } iNdEx += skippy @@ -6713,6 +7649,381 @@ func (m *QueryBaseFeeResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *CreateAccessListResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateAccessListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateAccessListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SimulateV1Request) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SimulateV1Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SimulateV1Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Args = append(m.Args[:0], dAtA[iNdEx:postIndex]...) + if m.Args == nil { + m.Args = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasCap", wireType) + } + m.GasCap = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasCap |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposerAddress", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProposerAddress = append(m.ProposerAddress[:0], dAtA[iNdEx:postIndex]...) + if m.ProposerAddress == nil { + m.ProposerAddress = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + m.ChainId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChainId |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SimulateV1Response) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SimulateV1Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SimulateV1Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Result = append(m.Result[:0], dAtA[iNdEx:postIndex]...) + if m.Result == nil { + m.Result = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ErrorMessage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ErrorMessage = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ErrorCode", wireType) + } + m.ErrorCode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ErrorCode |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/evm/types/query.pb.gw.go b/x/evm/types/query.pb.gw.go index c52b6b2cc6..d7da4c4998 100644 --- a/x/evm/types/query.pb.gw.go +++ b/x/evm/types/query.pb.gw.go @@ -595,6 +595,76 @@ func local_request_Query_BaseFee_0(ctx context.Context, marshaler runtime.Marsha } +var ( + filter_Query_CreateAccessList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_CreateAccessList_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EthCallRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CreateAccessList_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreateAccessList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CreateAccessList_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EthCallRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CreateAccessList_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreateAccessList(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_SimulateV1_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SimulateV1Request + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SimulateV1(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_SimulateV1_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SimulateV1Request + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SimulateV1(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -900,6 +970,52 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_CreateAccessList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CreateAccessList_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CreateAccessList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Query_SimulateV1_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SimulateV1_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SimulateV1_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1201,6 +1317,46 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_CreateAccessList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_CreateAccessList_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CreateAccessList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Query_SimulateV1_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_SimulateV1_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SimulateV1_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1230,6 +1386,10 @@ var ( pattern_Query_TraceCall_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "trace_call"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_BaseFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "base_fee"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_CreateAccessList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "create_access_list"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_SimulateV1_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ethermint", "evm", "v1", "simulate_v1"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -1258,4 +1418,8 @@ var ( forward_Query_TraceCall_0 = runtime.ForwardResponseMessage forward_Query_BaseFee_0 = runtime.ForwardResponseMessage + + forward_Query_CreateAccessList_0 = runtime.ForwardResponseMessage + + forward_Query_SimulateV1_0 = runtime.ForwardResponseMessage ) diff --git a/x/evm/types/set_code_authorization.pb.go b/x/evm/types/set_code_authorization.pb.go new file mode 100644 index 0000000000..780a437dc2 --- /dev/null +++ b/x/evm/types/set_code_authorization.pb.go @@ -0,0 +1,540 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: ethermint/evm/v1/set_code_authorization.proto + +package types + +import ( + cosmossdk_io_math "cosmossdk.io/math" + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// SetCodeAuthorization is an authorization from an account to deploy code at its address. +type SetCodeAuthorization struct { + ChainID *cosmossdk_io_math.Int `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3,customtype=cosmossdk.io/math.Int" json:"chainID"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Nonce uint64 `protobuf:"varint,3,opt,name=nonce,proto3" json:"nonce,omitempty"` + V []byte `protobuf:"bytes,4,opt,name=v,proto3" json:"v,omitempty"` + R []byte `protobuf:"bytes,5,opt,name=r,proto3" json:"r,omitempty"` + S []byte `protobuf:"bytes,6,opt,name=s,proto3" json:"s,omitempty"` +} + +func (m *SetCodeAuthorization) Reset() { *m = SetCodeAuthorization{} } +func (m *SetCodeAuthorization) String() string { return proto.CompactTextString(m) } +func (*SetCodeAuthorization) ProtoMessage() {} +func (*SetCodeAuthorization) Descriptor() ([]byte, []int) { + return fileDescriptor_364f7d29ca8c0183, []int{0} +} +func (m *SetCodeAuthorization) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetCodeAuthorization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetCodeAuthorization.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetCodeAuthorization) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetCodeAuthorization.Merge(m, src) +} +func (m *SetCodeAuthorization) XXX_Size() int { + return m.Size() +} +func (m *SetCodeAuthorization) XXX_DiscardUnknown() { + xxx_messageInfo_SetCodeAuthorization.DiscardUnknown(m) +} + +var xxx_messageInfo_SetCodeAuthorization proto.InternalMessageInfo + +func init() { + proto.RegisterType((*SetCodeAuthorization)(nil), "ethermint.evm.v1.SetCodeAuthorization") +} + +func init() { + proto.RegisterFile("ethermint/evm/v1/set_code_authorization.proto", fileDescriptor_364f7d29ca8c0183) +} + +var fileDescriptor_364f7d29ca8c0183 = []byte{ + // 301 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x90, 0xbd, 0x4e, 0xfb, 0x30, + 0x14, 0x47, 0xe3, 0xff, 0xbf, 0x1f, 0x10, 0x75, 0x40, 0x51, 0x91, 0x2c, 0x86, 0xa4, 0x62, 0x40, + 0x5d, 0xb0, 0x55, 0xb1, 0x31, 0x41, 0xcb, 0x52, 0xc6, 0xb0, 0xb1, 0x54, 0xa9, 0x6d, 0x35, 0x16, + 0xb2, 0x6f, 0x65, 0xbb, 0x16, 0xf0, 0x04, 0x8c, 0x3c, 0x02, 0xcf, 0xc2, 0xc4, 0xd8, 0x11, 0x31, + 0x54, 0x28, 0xdd, 0x78, 0x0a, 0xe4, 0x84, 0xaf, 0xed, 0x77, 0x74, 0x8f, 0xee, 0x70, 0xe2, 0x63, + 0xe1, 0x4a, 0x61, 0x94, 0xd4, 0x8e, 0x0a, 0xaf, 0xa8, 0x1f, 0x51, 0x2b, 0xdc, 0x8c, 0x01, 0x17, + 0xb3, 0x62, 0xe5, 0x4a, 0x30, 0xf2, 0xbe, 0x70, 0x12, 0x34, 0x59, 0x1a, 0x70, 0x90, 0xec, 0xfd, + 0xe8, 0x44, 0x78, 0x45, 0xfc, 0xe8, 0xa0, 0xbf, 0x80, 0x05, 0xd4, 0x47, 0x1a, 0x56, 0xe3, 0x1d, + 0x3e, 0xa3, 0xb8, 0x7f, 0x25, 0xdc, 0x04, 0xb8, 0x38, 0xff, 0xfb, 0x26, 0xb9, 0x8c, 0x77, 0x58, + 0x59, 0x48, 0x3d, 0x93, 0x1c, 0xa3, 0x01, 0x1a, 0xee, 0x8e, 0xe9, 0xdb, 0x26, 0xdb, 0x67, 0x60, + 0x15, 0x58, 0xcb, 0x6f, 0x88, 0x04, 0xaa, 0x0a, 0x57, 0x92, 0xa9, 0x76, 0xd5, 0x26, 0xeb, 0x4e, + 0x82, 0x3c, 0xbd, 0xf8, 0xd8, 0x64, 0x5d, 0xd6, 0xcc, 0xfc, 0x6b, 0xf0, 0x04, 0xc7, 0xdd, 0x82, + 0x73, 0x23, 0xac, 0xc5, 0xff, 0xc2, 0xab, 0xfc, 0x1b, 0x93, 0x7e, 0xdc, 0xd6, 0xa0, 0x99, 0xc0, + 0xff, 0x07, 0x68, 0xd8, 0xca, 0x1b, 0x48, 0x7a, 0x31, 0xf2, 0xb8, 0x35, 0x40, 0xc3, 0x5e, 0x8e, + 0x7c, 0x20, 0x83, 0xdb, 0x0d, 0x99, 0x40, 0x16, 0x77, 0x1a, 0xb2, 0xa7, 0xad, 0x87, 0xa7, 0x2c, + 0x1a, 0x9f, 0xbd, 0x54, 0x29, 0x5a, 0x57, 0x29, 0x7a, 0xaf, 0x52, 0xf4, 0xb8, 0x4d, 0xa3, 0xf5, + 0x36, 0x8d, 0x5e, 0xb7, 0x69, 0x74, 0x7d, 0xb4, 0x90, 0xae, 0x5c, 0xcd, 0x09, 0x03, 0x15, 0xb2, + 0x81, 0xa5, 0xbf, 0x19, 0x6f, 0xeb, 0x90, 0xee, 0x6e, 0x29, 0xec, 0xbc, 0x53, 0xd7, 0x38, 0xf9, + 0x0c, 0x00, 0x00, 0xff, 0xff, 0x21, 0xd2, 0x59, 0x4b, 0x66, 0x01, 0x00, 0x00, +} + +func (m *SetCodeAuthorization) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SetCodeAuthorization) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetCodeAuthorization) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.S) > 0 { + i -= len(m.S) + copy(dAtA[i:], m.S) + i = encodeVarintSetCodeAuthorization(dAtA, i, uint64(len(m.S))) + i-- + dAtA[i] = 0x32 + } + if len(m.R) > 0 { + i -= len(m.R) + copy(dAtA[i:], m.R) + i = encodeVarintSetCodeAuthorization(dAtA, i, uint64(len(m.R))) + i-- + dAtA[i] = 0x2a + } + if len(m.V) > 0 { + i -= len(m.V) + copy(dAtA[i:], m.V) + i = encodeVarintSetCodeAuthorization(dAtA, i, uint64(len(m.V))) + i-- + dAtA[i] = 0x22 + } + if m.Nonce != 0 { + i = encodeVarintSetCodeAuthorization(dAtA, i, uint64(m.Nonce)) + i-- + dAtA[i] = 0x18 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintSetCodeAuthorization(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if m.ChainID != nil { + { + size := m.ChainID.Size() + i -= size + if _, err := m.ChainID.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintSetCodeAuthorization(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintSetCodeAuthorization(dAtA []byte, offset int, v uint64) int { + offset -= sovSetCodeAuthorization(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *SetCodeAuthorization) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ChainID != nil { + l = m.ChainID.Size() + n += 1 + l + sovSetCodeAuthorization(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovSetCodeAuthorization(uint64(l)) + } + if m.Nonce != 0 { + n += 1 + sovSetCodeAuthorization(uint64(m.Nonce)) + } + l = len(m.V) + if l > 0 { + n += 1 + l + sovSetCodeAuthorization(uint64(l)) + } + l = len(m.R) + if l > 0 { + n += 1 + l + sovSetCodeAuthorization(uint64(l)) + } + l = len(m.S) + if l > 0 { + n += 1 + l + sovSetCodeAuthorization(uint64(l)) + } + return n +} + +func sovSetCodeAuthorization(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozSetCodeAuthorization(x uint64) (n int) { + return sovSetCodeAuthorization(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SetCodeAuthorization) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SetCodeAuthorization: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetCodeAuthorization: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.ChainID = &v + if err := m.ChainID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field V", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.V = append(m.V[:0], dAtA[iNdEx:postIndex]...) + if m.V == nil { + m.V = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field R", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.R = append(m.R[:0], dAtA[iNdEx:postIndex]...) + if m.R == nil { + m.R = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field S", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.S = append(m.S[:0], dAtA[iNdEx:postIndex]...) + if m.S == nil { + m.S = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSetCodeAuthorization(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSetCodeAuthorization + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSetCodeAuthorization(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSetCodeAuthorization + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthSetCodeAuthorization + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupSetCodeAuthorization + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthSetCodeAuthorization + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthSetCodeAuthorization = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSetCodeAuthorization = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupSetCodeAuthorization = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/evm/types/set_code_tx.go b/x/evm/types/set_code_tx.go new file mode 100644 index 0000000000..ddbebc616f --- /dev/null +++ b/x/evm/types/set_code_tx.go @@ -0,0 +1,329 @@ +package types + +import ( + "math/big" + + errorsmod "cosmossdk.io/errors" + sdkmath "cosmossdk.io/math" + errortypes "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/holiman/uint256" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + ethtypes "github.com/ethereum/go-ethereum/core/types" + + "github.com/evmos/ethermint/types" +) + +func newSetCodeTx(tx *ethtypes.Transaction) (*SetCodeTx, error) { + txData := &SetCodeTx{ + Nonce: tx.Nonce(), + Data: tx.Data(), + GasLimit: tx.Gas(), + } + + v, r, s := tx.RawSignatureValues() + if to := tx.To(); to != nil { + txData.To = to.Hex() + } + + if tx.Value() != nil { + amountInt, err := types.SafeNewIntFromBigInt(tx.Value()) + if err != nil { + return nil, err + } + txData.Amount = &amountInt + } + + if tx.GasFeeCap() != nil { + gasFeeCapInt, err := types.SafeNewIntFromBigInt(tx.GasFeeCap()) + if err != nil { + return nil, err + } + txData.GasFeeCap = &gasFeeCapInt + } + + if tx.GasTipCap() != nil { + gasTipCapInt, err := types.SafeNewIntFromBigInt(tx.GasTipCap()) + if err != nil { + return nil, err + } + txData.GasTipCap = &gasTipCapInt + } + + if tx.AccessList() != nil { + al := tx.AccessList() + txData.Accesses = NewAccessList(&al) + } + + if tx.SetCodeAuthorizations() != nil { + al := tx.SetCodeAuthorizations() + txData.AuthList = NewAuthList(&al) + } + + txData.SetSignatureValues(tx.ChainId(), v, r, s) + return txData, nil +} + +// TxType returns the tx type +func (tx *SetCodeTx) TxType() uint8 { + return ethtypes.SetCodeTxType +} + +// Copy returns an instance with the same field values +func (tx *SetCodeTx) Copy() TxData { + var authListCopy AuthList + if len(tx.AuthList) > 0 { + authListCopy = make(AuthList, len(tx.AuthList)) + for i, auth := range tx.AuthList { + authListCopy[i] = SetCodeAuthorization{ + ChainID: auth.ChainID, + Address: auth.Address, + Nonce: auth.Nonce, + V: common.CopyBytes(auth.V), + R: common.CopyBytes(auth.R), + S: common.CopyBytes(auth.S), + } + } + } + return &SetCodeTx{ + ChainID: tx.ChainID, + Nonce: tx.Nonce, + GasTipCap: tx.GasTipCap, + GasFeeCap: tx.GasFeeCap, + GasLimit: tx.GasLimit, + To: tx.To, + Amount: tx.Amount, + Data: common.CopyBytes(tx.Data), + Accesses: tx.Accesses, + AuthList: authListCopy, + V: common.CopyBytes(tx.V), + R: common.CopyBytes(tx.R), + S: common.CopyBytes(tx.S), + } +} + +// GetChainID returns the chain id field from the SetCodeTx +func (tx *SetCodeTx) GetChainID() *big.Int { + if tx.ChainID == nil { + return nil + } + + return tx.ChainID.BigInt() +} + +// GetAccessList returns the AccessList field. +func (tx *SetCodeTx) GetAccessList() ethtypes.AccessList { + if tx.Accesses == nil { + return nil + } + return *tx.Accesses.ToEthAccessList() +} + +// GetAuthList returns the AuthList field. +func (tx *SetCodeTx) GetAuthList() *[]ethtypes.SetCodeAuthorization { + if tx.AuthList == nil { + return nil + } + return tx.AuthList.ToEthAuthList() +} + +// GetData returns the a copy of the input data bytes. +func (tx *SetCodeTx) GetData() []byte { + return common.CopyBytes(tx.Data) +} + +// GetGas returns the gas limit. +func (tx *SetCodeTx) GetGas() uint64 { + return tx.GasLimit +} + +// GetGasPrice returns the gas fee cap field. +func (tx *SetCodeTx) GetGasPrice() *big.Int { + return tx.GetGasFeeCap() +} + +// GetGasTipCap returns the gas tip cap field. +func (tx *SetCodeTx) GetGasTipCap() *big.Int { + if tx.GasTipCap == nil { + return nil + } + return tx.GasTipCap.BigInt() +} + +// GetGasFeeCap returns the gas fee cap field. +func (tx *SetCodeTx) GetGasFeeCap() *big.Int { + if tx.GasFeeCap == nil { + return nil + } + return tx.GasFeeCap.BigInt() +} + +// GetValue returns the tx amount. +func (tx *SetCodeTx) GetValue() *big.Int { + if tx.Amount == nil { + return nil + } + + return tx.Amount.BigInt() +} + +// GetNonce returns the account sequence for the transaction. +func (tx *SetCodeTx) GetNonce() uint64 { return tx.Nonce } + +// GetTo returns the pointer to the recipient address. +func (tx *SetCodeTx) GetTo() *common.Address { + if tx.To == "" { + return nil + } + to := common.HexToAddress(tx.To) + return &to +} + +// AsEthereumData returns an SetCodeTx transaction tx from the proto-formatted +// TxData defined on the Cosmos EVM. +func (tx *SetCodeTx) AsEthereumData() ethtypes.TxData { + v, r, s := tx.GetRawSignatureValues() + to := tx.GetTo() + if to == nil { + // Validate() rejects empty To; zero address is a nil-safe fallback only. + to = &common.Address{} + } + authList := tx.GetAuthList() + if authList == nil { + authList = &[]ethtypes.SetCodeAuthorization{} + } + return ðtypes.SetCodeTx{ + ChainID: uint256.MustFromBig(tx.GetChainID()), + Nonce: tx.GetNonce(), + GasTipCap: uint256.MustFromBig(tx.GetGasTipCap()), + GasFeeCap: uint256.MustFromBig(tx.GetGasFeeCap()), + Gas: tx.GetGas(), + To: *to, + Value: uint256.MustFromBig(tx.GetValue()), + Data: tx.GetData(), + AuthList: *authList, + AccessList: tx.GetAccessList(), + V: uint256.MustFromBig(v), + R: uint256.MustFromBig(r), + S: uint256.MustFromBig(s), + } +} + +// GetRawSignatureValues returns the V, R, S signature values of the transaction. +// The return values should not be modified by the caller. +func (tx *SetCodeTx) GetRawSignatureValues() (v, r, s *big.Int) { + return rawSignatureValues(tx.V, tx.R, tx.S) +} + +// SetSignatureValues sets the signature values to the transaction. +func (tx *SetCodeTx) SetSignatureValues(chainID, v, r, s *big.Int) { + if v != nil { + tx.V = v.Bytes() + } + if r != nil { + tx.R = r.Bytes() + } + if s != nil { + tx.S = s.Bytes() + } + if chainID != nil { + chainIDInt := sdkmath.NewIntFromBigInt(chainID) + tx.ChainID = &chainIDInt + } +} + +// Validate performs a stateless validation of the tx fields. +func (tx SetCodeTx) Validate() error { + if len(tx.To) == 0 { + return errorsmod.Wrap(core.ErrSetCodeTxCreate, "to address cannot be empty") + } + + if len(tx.AuthList) == 0 { + return errorsmod.Wrap(core.ErrEmptyAuthList, "auth list cannot be empty") + } + + if tx.GasTipCap == nil { + return errorsmod.Wrap(ErrInvalidGasCap, "gas tip cap cannot nil") + } + + if tx.GasFeeCap == nil { + return errorsmod.Wrap(ErrInvalidGasCap, "gas fee cap cannot nil") + } + + if tx.GasTipCap.IsNegative() { + return errorsmod.Wrapf(ErrInvalidGasCap, "gas tip cap cannot be negative %s", tx.GasTipCap) + } + + if tx.GasFeeCap.IsNegative() { + return errorsmod.Wrapf(ErrInvalidGasCap, "gas fee cap cannot be negative %s", tx.GasFeeCap) + } + + if !types.IsValidInt256(tx.GetGasTipCap()) { + return errorsmod.Wrap(ErrInvalidGasCap, "out of bound") + } + + if !types.IsValidInt256(tx.GetGasFeeCap()) { + return errorsmod.Wrap(ErrInvalidGasCap, "out of bound") + } + + if tx.GasFeeCap.LT(*tx.GasTipCap) { + return errorsmod.Wrapf( + ErrInvalidGasCap, "max priority fee per gas higher than max fee per gas (%s > %s)", + tx.GasTipCap, tx.GasFeeCap, + ) + } + + if !types.IsValidInt256(tx.Fee()) { + return errorsmod.Wrap(ErrInvalidGasFee, "out of bound") + } + + amount := tx.GetValue() + // Amount can be 0 + if amount != nil && amount.Sign() == -1 { + return errorsmod.Wrapf(ErrInvalidAmount, "amount cannot be negative %s", amount) + } + if !types.IsValidInt256(amount) { + return errorsmod.Wrap(ErrInvalidAmount, "out of bound") + } + + if tx.To != "" { + if err := types.ValidateAddress(tx.To); err != nil { + return errorsmod.Wrap(err, "invalid to address") + } + } + + if tx.GetChainID() == nil { + return errorsmod.Wrap( + errortypes.ErrInvalidChainID, + "chain ID must be present on SetCode txs", + ) + } + + return nil +} + +// Fee returns gasprice * gaslimit. +func (tx SetCodeTx) Fee() *big.Int { + return fee(tx.GetGasFeeCap(), tx.GasLimit) +} + +// Cost returns amount + gasprice * gaslimit. +func (tx SetCodeTx) Cost() *big.Int { + return cost(tx.Fee(), tx.GetValue()) +} + +// EffectiveGasPrice returns the effective gas price +func (tx *SetCodeTx) EffectiveGasPrice(baseFee *big.Int) *big.Int { + return EffectiveGasPrice(baseFee, tx.GetGasFeeCap(), tx.GetGasTipCap()) +} + +// EffectiveFee returns effective_gasprice * gaslimit. +func (tx SetCodeTx) EffectiveFee(baseFee *big.Int) *big.Int { + return fee(tx.EffectiveGasPrice(baseFee), tx.GasLimit) +} + +// EffectiveCost returns amount + effective_gasprice * gaslimit. +func (tx SetCodeTx) EffectiveCost(baseFee *big.Int) *big.Int { + return cost(tx.EffectiveFee(baseFee), tx.GetValue()) +} diff --git a/x/evm/types/set_code_tx_test.go b/x/evm/types/set_code_tx_test.go new file mode 100644 index 0000000000..85814079a9 --- /dev/null +++ b/x/evm/types/set_code_tx_test.go @@ -0,0 +1,770 @@ +package types + +import ( + "math/big" + "testing" + + sdkmath "cosmossdk.io/math" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/evmos/ethermint/tests" + "github.com/holiman/uint256" + "github.com/stretchr/testify/suite" +) + +type SetCodeTxTestSuite struct { + suite.Suite + + sdkInt sdkmath.Int + uint64 uint64 + hexUint64 hexutil.Uint64 + uint256Int *uint256.Int + sdkZeroInt sdkmath.Int + sdkMinusOneInt sdkmath.Int + invalidAddr string + addr common.Address + hexAddr string + hexDataBytes hexutil.Bytes + hexInputBytes hexutil.Bytes +} + +func (suite *SetCodeTxTestSuite) SetupTest() { + suite.sdkInt = sdkmath.NewInt(100) + suite.uint64 = suite.sdkInt.Uint64() + suite.hexUint64 = hexutil.Uint64(100) + suite.uint256Int = uint256.NewInt(1) + suite.sdkZeroInt = sdkmath.ZeroInt() + suite.sdkMinusOneInt = sdkmath.NewInt(-1) + suite.invalidAddr = "123456" + suite.addr = tests.GenerateAddress() + suite.hexAddr = suite.addr.Hex() + suite.hexDataBytes = hexutil.Bytes([]byte("data")) + suite.hexInputBytes = hexutil.Bytes([]byte("input")) +} + +func TestSetCodeTxTestSuite(t *testing.T) { + suite.Run(t, new(SetCodeTxTestSuite)) +} + +func (suite *SetCodeTxTestSuite) TestNewSetCodeTx() { + testCases := []struct { + name string + tx *ethtypes.Transaction + }{ + { + "non-empty tx", + ethtypes.NewTx(ðtypes.SetCodeTx{ + Nonce: 1, + Data: []byte("data"), + Gas: 100, + Value: uint256.NewInt(1), + AccessList: ethtypes.AccessList{}, + AuthList: []ethtypes.SetCodeAuthorization{}, + To: suite.addr, + V: suite.uint256Int, + R: suite.uint256Int, + S: suite.uint256Int, + }), + }, + } + for _, tc := range testCases { + tx, err := newSetCodeTx(tc.tx) + suite.Require().NoError(err) + suite.Require().NotEmpty(tx) + suite.Require().Equal(uint8(4), tx.TxType()) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxAsEthereumData() { + feeConfig := ðtypes.SetCodeTx{ + Nonce: 1, + Data: []byte("data"), + Gas: 100, + Value: uint256.NewInt(1), + AccessList: ethtypes.AccessList{}, + To: suite.addr, + V: suite.uint256Int, + R: suite.uint256Int, + S: suite.uint256Int, + } + + tx := ethtypes.NewTx(feeConfig) + + SetCodeTx, err := newSetCodeTx(tx) + suite.Require().NoError(err) + + res := SetCodeTx.AsEthereumData() + resTx := ethtypes.NewTx(res) + + suite.Require().Equal(feeConfig.Nonce, resTx.Nonce()) + suite.Require().Equal(feeConfig.Data, resTx.Data()) + suite.Require().Equal(feeConfig.Gas, resTx.Gas()) + suite.Require().Equal(feeConfig.Value.ToBig(), resTx.Value()) + suite.Require().Equal(feeConfig.AccessList, resTx.AccessList()) + suite.Require().Equal(feeConfig.To, *resTx.To()) +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxAsEthereumDataNilFields() { + tx := &SetCodeTx{ + ChainID: &suite.sdkInt, + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + } + + var result ethtypes.TxData + suite.Require().NotPanics(func() { + result = tx.AsEthereumData() + }) + + setCodeResult, ok := result.(*ethtypes.SetCodeTx) + suite.Require().True(ok) + suite.Require().Equal(common.Address{}, setCodeResult.To, "empty To should become zero address") + suite.Require().Empty(setCodeResult.AuthList, "nil AuthList should become empty slice") +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxCopy() { + tx := &SetCodeTx{} + txCopy := tx.Copy() + + suite.Require().Equal(&SetCodeTx{}, txCopy) +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxCopyPreservesAuthList() { + authList := AuthList{ + { + ChainID: &suite.sdkInt, + Address: suite.hexAddr, + Nonce: suite.uint64, + V: []byte{1}, + R: suite.sdkInt.BigInt().Bytes(), + S: suite.sdkInt.BigInt().Bytes(), + }, + } + tx := &SetCodeTx{ + ChainID: &suite.sdkInt, + Nonce: suite.uint64, + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + GasLimit: suite.uint64, + To: suite.hexAddr, + Amount: &suite.sdkInt, + Data: []byte("data"), + AuthList: authList, + } + + txCopy := tx.Copy().(*SetCodeTx) + + suite.Require().Equal(authList, txCopy.AuthList, "Copy() must preserve AuthList") + suite.Require().Len(txCopy.AuthList, 1) + suite.Require().Equal(suite.hexAddr, txCopy.AuthList[0].Address) + + // mutating the copy's byte slices must not affect the original + txCopy.AuthList[0].V[0] = 0xff + suite.Require().Equal(byte(1), tx.AuthList[0].V[0], "Copy() must deep-copy AuthList byte slices") +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetChainID() { + testCases := []struct { + name string + tx SetCodeTx + exp *big.Int + }{ + { + "empty chainID", + SetCodeTx{ + ChainID: nil, + }, + nil, + }, + { + "non-empty chainID", + SetCodeTx{ + ChainID: &suite.sdkInt, + }, + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetChainID() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetAccessList() { + testCases := []struct { + name string + tx SetCodeTx + exp ethtypes.AccessList + }{ + { + "empty accesses", + SetCodeTx{ + Accesses: nil, + }, + nil, + }, + { + "nil", + SetCodeTx{ + Accesses: NewAccessList(nil), + }, + nil, + }, + { + "non-empty accesses", + SetCodeTx{ + Accesses: AccessList{ + { + Address: suite.hexAddr, + StorageKeys: []string{}, + }, + }, + }, + ethtypes.AccessList{ + { + Address: suite.addr, + StorageKeys: []common.Hash{}, + }, + }, + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetAccessList() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetData() { + testCases := []struct { + name string + tx SetCodeTx + }{ + { + "non-empty transaction", + SetCodeTx{ + Data: nil, + }, + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetData() + + suite.Require().Equal(tc.tx.Data, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetGas() { + testCases := []struct { + name string + tx SetCodeTx + exp uint64 + }{ + { + "non-empty gas", + SetCodeTx{ + GasLimit: suite.uint64, + }, + suite.uint64, + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetGas() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetGasPrice() { + testCases := []struct { + name string + tx SetCodeTx + exp *big.Int + }{ + { + "non-empty gasFeeCap", + SetCodeTx{ + GasFeeCap: &suite.sdkInt, + }, + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetGasPrice() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetGasTipCap() { + testCases := []struct { + name string + tx SetCodeTx + exp *big.Int + }{ + { + "empty gasTipCap", + SetCodeTx{ + GasTipCap: nil, + }, + nil, + }, + { + "non-empty gasTipCap", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + }, + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetGasTipCap() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetGasFeeCap() { + testCases := []struct { + name string + tx SetCodeTx + exp *big.Int + }{ + { + "empty gasFeeCap", + SetCodeTx{ + GasFeeCap: nil, + }, + nil, + }, + { + "non-empty gasFeeCap", + SetCodeTx{ + GasFeeCap: &suite.sdkInt, + }, + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetGasFeeCap() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetValue() { + testCases := []struct { + name string + tx SetCodeTx + exp *big.Int + }{ + { + "empty amount", + SetCodeTx{ + Amount: nil, + }, + nil, + }, + { + "non-empty amount", + SetCodeTx{ + Amount: &suite.sdkInt, + }, + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetValue() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetNonce() { + testCases := []struct { + name string + tx SetCodeTx + exp uint64 + }{ + { + "non-empty nonce", + SetCodeTx{ + Nonce: suite.uint64, + }, + suite.uint64, + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetNonce() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxGetTo() { + testCases := []struct { + name string + tx SetCodeTx + exp *common.Address + }{ + { + "empty suite.address", + SetCodeTx{ + To: "", + }, + nil, + }, + { + "non-empty suite.address", + SetCodeTx{ + To: suite.hexAddr, + }, + &suite.addr, + }, + } + + for _, tc := range testCases { + actual := tc.tx.GetTo() + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxSetSignatureValues() { + testCases := []struct { + name string + chainID *big.Int + r *big.Int + v *big.Int + s *big.Int + }{ + { + "empty values", + nil, + nil, + nil, + nil, + }, + { + "non-empty values", + big.NewInt(1), + big.NewInt(2), + big.NewInt(3), + big.NewInt(4), + }, + } + + for _, tc := range testCases { + tx := &SetCodeTx{} + tx.SetSignatureValues(tc.chainID, tc.v, tc.r, tc.s) + + v, r, s := tx.GetRawSignatureValues() + chainID := tx.GetChainID() + + suite.Require().Equal(tc.v, v, tc.name) + suite.Require().Equal(tc.r, r, tc.name) + suite.Require().Equal(tc.s, s, tc.name) + suite.Require().Equal(tc.chainID, chainID, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxValidate() { + testCases := []struct { + name string + tx SetCodeTx + expError bool + }{ + { + "empty", + SetCodeTx{}, + true, + }, + { + "gas tip cap is nil", + SetCodeTx{ + GasTipCap: nil, + }, + true, + }, + { + "gas fee cap is nil", + SetCodeTx{ + GasTipCap: &suite.sdkZeroInt, + }, + true, + }, + { + "gas tip cap is negative", + SetCodeTx{ + GasTipCap: &suite.sdkMinusOneInt, + GasFeeCap: &suite.sdkZeroInt, + }, + true, + }, + { + "gas tip cap is negative", + SetCodeTx{ + GasTipCap: &suite.sdkZeroInt, + GasFeeCap: &suite.sdkMinusOneInt, + }, + true, + }, + { + "gas fee cap < gas tip cap", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkZeroInt, + }, + true, + }, + { + "amount is negative", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkMinusOneInt, + }, + true, + }, + { + "to suite.address is invalid", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkInt, + To: suite.invalidAddr, + }, + true, + }, + { + "chain ID not present on SetCode txs", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkInt, + To: suite.hexAddr, + ChainID: nil, + AuthList: []SetCodeAuthorization{ + { + ChainID: &suite.sdkInt, + Address: suite.hexAddr, + Nonce: suite.uint64, + V: []byte{1}, + R: []byte{2}, + S: []byte{3}, + }, + }, + }, + true, + }, + { + "to address is empty", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkInt, + To: "", + }, + true, + }, + { + "auth list is empty", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkInt, + To: suite.hexAddr, + ChainID: &suite.sdkInt, + }, + true, + }, + { + "no errors", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkInt, + To: suite.hexAddr, + ChainID: &suite.sdkInt, + AuthList: []SetCodeAuthorization{ + { + ChainID: &suite.sdkInt, + Address: suite.addr.Hex(), + Nonce: suite.uint64, + V: []byte{1}, + R: []byte{2}, + S: []byte{3}, + }, + }, + }, + false, + }, + } + + for _, tc := range testCases { + err := tc.tx.Validate() + + if tc.expError { + suite.Require().Error(err, tc.name) + continue + } + + suite.Require().NoError(err, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxEffectiveGasPrice() { + testCases := []struct { + name string + tx SetCodeTx + baseFee *big.Int + exp *big.Int + }{ + { + "non-empty dynamic fee tx", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + }, + (&suite.sdkInt).BigInt(), + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.EffectiveGasPrice(tc.baseFee) + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxEffectiveFee() { + testCases := []struct { + name string + tx SetCodeTx + baseFee *big.Int + exp *big.Int + }{ + { + "non-empty dynamic fee tx", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + GasLimit: uint64(1), + }, + (&suite.sdkInt).BigInt(), + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.EffectiveFee(tc.baseFee) + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxEffectiveCost() { + testCases := []struct { + name string + tx SetCodeTx + baseFee *big.Int + exp *big.Int + }{ + { + "non-empty dynamic fee tx", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + GasLimit: uint64(1), + Amount: &suite.sdkZeroInt, + }, + (&suite.sdkInt).BigInt(), + (&suite.sdkInt).BigInt(), + }, + } + + for _, tc := range testCases { + actual := tc.tx.EffectiveCost(tc.baseFee) + + suite.Require().Equal(tc.exp, actual, tc.name) + } +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxFeeCost() { + tx := &SetCodeTx{} + suite.Require().Panics(func() { tx.Fee() }, "should panic") + suite.Require().Panics(func() { tx.Cost() }, "should panic") +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxValidateChainIDErrorMessage() { + tx := SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + Amount: &suite.sdkInt, + To: suite.hexAddr, + ChainID: nil, + AuthList: []SetCodeAuthorization{ + { + ChainID: &suite.sdkInt, + Address: suite.hexAddr, + Nonce: suite.uint64, + V: []byte{1}, + R: suite.sdkInt.BigInt().Bytes(), + S: suite.sdkInt.BigInt().Bytes(), + }, + }, + } + + err := tx.Validate() + suite.Require().Error(err) + suite.Require().Contains(err.Error(), "SetCode txs") + suite.Require().NotContains(err.Error(), "AccessList txs") +} + +func (suite *SetCodeTxTestSuite) TestSetCodeTxEffectiveGasPriceUsesNilSafeGetters() { + testCases := []struct { + name string + tx SetCodeTx + baseFee *big.Int + exp *big.Int + }{ + { + "tip + base capped at feeCap", + SetCodeTx{ + GasTipCap: &suite.sdkInt, + GasFeeCap: &suite.sdkInt, + }, + big.NewInt(50), + big.NewInt(100), + }, + { + "tip + base below feeCap", + SetCodeTx{ + GasTipCap: &suite.sdkZeroInt, + GasFeeCap: &suite.sdkInt, + }, + big.NewInt(10), + big.NewInt(10), + }, + } + + for _, tc := range testCases { + suite.Require().NotPanics(func() { + actual := tc.tx.EffectiveGasPrice(tc.baseFee) + suite.Require().Equal(tc.exp, actual, tc.name) + }) + } +} diff --git a/x/evm/types/tracer.go b/x/evm/types/tracer.go index ea4de00f3a..237052360b 100644 --- a/x/evm/types/tracer.go +++ b/x/evm/types/tracer.go @@ -23,6 +23,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" ) @@ -36,22 +38,28 @@ const ( // NewTracer creates a new Logger tracer to collect execution traces from an // EVM transaction. -func NewTracer(tracer string, msg *core.Message, rules params.Rules) vm.EVMLogger { +func NewTracer(tracer string, msg core.Message, cfg *params.ChainConfig, height int64, timestamp uint64) *tracing.Hooks { // TODO: enable additional log configuration - logCfg := &logger.Config{ - Debug: true, - } + logCfg := &logger.Config{} switch tracer { case TracerAccessList: - preCompiles := vm.DefaultActivePrecompiles(rules) - return logger.NewAccessListTracer(msg.AccessList, msg.From, *msg.To, preCompiles) + blockAddrs := make(map[common.Address]struct{}) + blockAddrs[msg.From] = struct{}{} + if msg.To != nil { + blockAddrs[*msg.To] = struct{}{} + } + precompiles := vm.ActivePrecompiles(cfg.Rules(big.NewInt(height), cfg.MergeNetsplitBlock != nil, timestamp)) + for _, addr := range precompiles { + blockAddrs[addr] = struct{}{} + } + return logger.NewAccessListTracer(msg.AccessList, blockAddrs).Hooks() case TracerJSON: return logger.NewJSONLogger(logCfg, os.Stderr) case TracerMarkdown: - return logger.NewMarkdownLogger(logCfg, os.Stdout) // TODO: Stderr ? + return logger.NewMarkdownLogger(logCfg, os.Stdout).Hooks() // TODO: Stderr ? case TracerStruct: - return logger.NewStructLogger(logCfg) + return logger.NewStructLogger(logCfg).Hooks() default: return NewNoOpTracer() } @@ -63,46 +71,81 @@ type TxTraceResult struct { Error string `json:"error,omitempty"` // Trace failure produced by the tracer } -var _ vm.EVMLogger = &NoOpTracer{} - // NoOpTracer is an empty implementation of vm.Tracer interface type NoOpTracer struct{} // NewNoOpTracer creates a no-op vm.Tracer -func NewNoOpTracer() *NoOpTracer { - return &NoOpTracer{} +func NewNoOpTracer() *tracing.Hooks { + t := NoOpTracer{} + return &tracing.Hooks{ + OnTxStart: t.OnTxStart, + OnTxEnd: t.OnTxEnd, + OnEnter: t.OnEnter, + OnExit: t.OnExit, + OnOpcode: t.OnOpcode, + OnFault: t.OnFault, + OnGasChange: t.OnGasChange, + OnBlockchainInit: t.OnBlockchainInit, + OnBlockStart: t.OnBlockStart, + OnBlockEnd: t.OnBlockEnd, + OnSkippedBlock: t.OnSkippedBlock, + OnGenesisBlock: t.OnGenesisBlock, + OnBalanceChange: t.OnBalanceChange, + OnNonceChange: t.OnNonceChange, + OnCodeChange: t.OnCodeChange, + OnStorageChange: t.OnStorageChange, + OnLog: t.OnLog, + } +} + +func (dt *NoOpTracer) OnOpcode(_ uint64, _ byte, _, _ uint64, _ tracing.OpContext, _ []byte, _ int, _ error) { +} + +func (dt *NoOpTracer) OnFault(_ uint64, _ byte, _, _ uint64, _ tracing.OpContext, _ int, _ error) { } -// CaptureStart implements vm.Tracer interface -func (dt NoOpTracer) CaptureStart(_ *vm.EVM, - _ common.Address, - _ common.Address, - _ bool, - _ []byte, - _ uint64, +func (dt *NoOpTracer) OnEnter(_ int, _ byte, _ common.Address, _ common.Address, _ []byte, _ uint64, _ *big.Int) { } -// CaptureState implements vm.Tracer interface -func (dt NoOpTracer) CaptureState(_ uint64, _ vm.OpCode, _, _ uint64, _ *vm.ScopeContext, _ []byte, _ int, _ error) { +func (dt *NoOpTracer) OnExit(_ int, _ []byte, _ uint64, _ error, _ bool) { +} + +func (dt *NoOpTracer) OnTxStart(_ *tracing.VMContext, _ *types.Transaction, _ common.Address) { +} + +func (dt *NoOpTracer) OnTxEnd(_ *types.Receipt, _ error) { +} + +func (dt *NoOpTracer) OnBlockStart(_ tracing.BlockEvent) { +} + +func (dt *NoOpTracer) OnBlockEnd(_ error) { +} + +func (dt *NoOpTracer) OnSkippedBlock(_ tracing.BlockEvent) {} + +func (dt *NoOpTracer) OnBlockchainInit(_ *params.ChainConfig) { +} + +func (dt *NoOpTracer) OnGenesisBlock(_ *types.Block, _ types.GenesisAlloc) { } -// CaptureFault implements vm.Tracer interface -func (dt NoOpTracer) CaptureFault(_ uint64, _ vm.OpCode, _, _ uint64, _ *vm.ScopeContext, _ int, _ error) { +func (dt *NoOpTracer) OnBalanceChange(_ common.Address, _, _ *big.Int, _ tracing.BalanceChangeReason) { } -// CaptureEnd implements vm.Tracer interface -func (dt NoOpTracer) CaptureEnd(_ []byte, _ uint64, _ error) {} +func (dt *NoOpTracer) OnNonceChange(_ common.Address, _, _ uint64) { +} -// CaptureEnter implements vm.Tracer interface -func (dt NoOpTracer) CaptureEnter(_ vm.OpCode, _ common.Address, _ common.Address, _ []byte, _ uint64, _ *big.Int) { +func (dt *NoOpTracer) OnCodeChange(_ common.Address, _ common.Hash, _ []byte, _ common.Hash, + _ []byte) { } -// CaptureExit implements vm.Tracer interface -func (dt NoOpTracer) CaptureExit(_ []byte, _ uint64, _ error) {} +func (dt *NoOpTracer) OnStorageChange(_ common.Address, _, _, _ common.Hash) { +} -// CaptureTxStart implements vm.Tracer interface -func (dt NoOpTracer) CaptureTxStart(_ uint64) {} +func (dt *NoOpTracer) OnLog(_ *types.Log) { +} -// CaptureTxEnd implements vm.Tracer interface -func (dt NoOpTracer) CaptureTxEnd(_ uint64) {} +func (dt *NoOpTracer) OnGasChange(_, _ uint64, _ tracing.GasChangeReason) { +} diff --git a/x/evm/types/tracer_test.go b/x/evm/types/tracer_test.go index 6e21f93a63..f18757c2a1 100644 --- a/x/evm/types/tracer_test.go +++ b/x/evm/types/tracer_test.go @@ -3,9 +3,12 @@ package types import ( "testing" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/stretchr/testify/require" ) func TestNewNoOpTracer(t *testing.T) { - require.Equal(t, &NoOpTracer{}, NewNoOpTracer()) + tracer := NewNoOpTracer() + require.IsType(t, &tracing.Hooks{}, tracer) + require.NotNil(t, tracer) } diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index e889b73d00..d12dd99aa3 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -11,6 +11,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -261,6 +262,70 @@ func (m *DynamicFeeTx) XXX_DiscardUnknown() { var xxx_messageInfo_DynamicFeeTx proto.InternalMessageInfo +// SetCodeTx implements the EIP-7702 transaction type. +type SetCodeTx struct { + // chain_id of the destination EVM chain + ChainID *cosmossdk_io_math.Int `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3,customtype=cosmossdk.io/math.Int" json:"chainID"` + // nonce corresponds to the account nonce (transaction sequence). + Nonce uint64 `protobuf:"varint,2,opt,name=nonce,proto3" json:"nonce,omitempty"` + // gas_tip_cap defines the max value for the gas tip + GasTipCap *cosmossdk_io_math.Int `protobuf:"bytes,3,opt,name=gas_tip_cap,json=gasTipCap,proto3,customtype=cosmossdk.io/math.Int" json:"gas_tip_cap,omitempty"` + // gas_fee_cap defines the max value for the gas fee + GasFeeCap *cosmossdk_io_math.Int `protobuf:"bytes,4,opt,name=gas_fee_cap,json=gasFeeCap,proto3,customtype=cosmossdk.io/math.Int" json:"gas_fee_cap,omitempty"` + // gas defines the gas limit defined for the transaction. + GasLimit uint64 `protobuf:"varint,5,opt,name=gas,proto3" json:"gas,omitempty"` + // to is the hex formatted address of the recipient + To string `protobuf:"bytes,6,opt,name=to,proto3" json:"to,omitempty"` + // value defines the the transaction amount. + Amount *cosmossdk_io_math.Int `protobuf:"bytes,7,opt,name=value,proto3,customtype=cosmossdk.io/math.Int" json:"value,omitempty"` + // data is the data payload bytes of the transaction. + Data []byte `protobuf:"bytes,8,opt,name=data,proto3" json:"data,omitempty"` + // accesses is an array of access tuples + Accesses AccessList `protobuf:"bytes,9,rep,name=accesses,proto3,castrepeated=AccessList" json:"accessList"` + // auth_list is a list of tuples that indicate what code the signer of each tuple desires to execute in the context of + // their EOA + AuthList AuthList `protobuf:"bytes,10,rep,name=auth_list,json=authList,proto3,castrepeated=AuthList" json:"authList"` + // v defines the signature value + V []byte `protobuf:"bytes,11,opt,name=v,proto3" json:"v,omitempty"` + // r defines the signature value + R []byte `protobuf:"bytes,12,opt,name=r,proto3" json:"r,omitempty"` + // s define the signature value + S []byte `protobuf:"bytes,13,opt,name=s,proto3" json:"s,omitempty"` +} + +func (m *SetCodeTx) Reset() { *m = SetCodeTx{} } +func (m *SetCodeTx) String() string { return proto.CompactTextString(m) } +func (*SetCodeTx) ProtoMessage() {} +func (*SetCodeTx) Descriptor() ([]byte, []int) { + return fileDescriptor_f75ac0a12d075f21, []int{4} +} +func (m *SetCodeTx) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetCodeTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetCodeTx.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetCodeTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetCodeTx.Merge(m, src) +} +func (m *SetCodeTx) XXX_Size() int { + return m.Size() +} +func (m *SetCodeTx) XXX_DiscardUnknown() { + xxx_messageInfo_SetCodeTx.DiscardUnknown(m) +} + +var xxx_messageInfo_SetCodeTx proto.InternalMessageInfo + // ExtensionOptionsEthereumTx is an extension option for ethereum transactions type ExtensionOptionsEthereumTx struct { } @@ -269,7 +334,7 @@ func (m *ExtensionOptionsEthereumTx) Reset() { *m = ExtensionOptionsEthe func (m *ExtensionOptionsEthereumTx) String() string { return proto.CompactTextString(m) } func (*ExtensionOptionsEthereumTx) ProtoMessage() {} func (*ExtensionOptionsEthereumTx) Descriptor() ([]byte, []int) { - return fileDescriptor_f75ac0a12d075f21, []int{4} + return fileDescriptor_f75ac0a12d075f21, []int{5} } func (m *ExtensionOptionsEthereumTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -322,7 +387,7 @@ func (m *MsgEthereumTxResponse) Reset() { *m = MsgEthereumTxResponse{} } func (m *MsgEthereumTxResponse) String() string { return proto.CompactTextString(m) } func (*MsgEthereumTxResponse) ProtoMessage() {} func (*MsgEthereumTxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f75ac0a12d075f21, []int{5} + return fileDescriptor_f75ac0a12d075f21, []int{6} } func (m *MsgEthereumTxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -364,7 +429,7 @@ func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } func (*MsgUpdateParams) ProtoMessage() {} func (*MsgUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_f75ac0a12d075f21, []int{6} + return fileDescriptor_f75ac0a12d075f21, []int{7} } func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -416,7 +481,7 @@ func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } func (*MsgUpdateParamsResponse) ProtoMessage() {} func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f75ac0a12d075f21, []int{7} + return fileDescriptor_f75ac0a12d075f21, []int{8} } func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -445,88 +510,195 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo +// MsgRegisterPreinstalls defines a Msg for creating preinstalls in evm state. +type MsgRegisterPreinstalls struct { + // authority is the address of the governance account. + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // preinstalls defines the preinstalls to create. + Preinstalls []Preinstall `protobuf:"bytes,2,rep,name=preinstalls,proto3" json:"preinstalls"` +} + +func (m *MsgRegisterPreinstalls) Reset() { *m = MsgRegisterPreinstalls{} } +func (m *MsgRegisterPreinstalls) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterPreinstalls) ProtoMessage() {} +func (*MsgRegisterPreinstalls) Descriptor() ([]byte, []int) { + return fileDescriptor_f75ac0a12d075f21, []int{9} +} +func (m *MsgRegisterPreinstalls) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterPreinstalls) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterPreinstalls.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRegisterPreinstalls) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterPreinstalls.Merge(m, src) +} +func (m *MsgRegisterPreinstalls) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterPreinstalls) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterPreinstalls.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterPreinstalls proto.InternalMessageInfo + +func (m *MsgRegisterPreinstalls) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgRegisterPreinstalls) GetPreinstalls() []Preinstall { + if m != nil { + return m.Preinstalls + } + return nil +} + +// MsgRegisterPreinstallsResponse defines the response structure for executing a +// MsgRegisterPreinstalls message. +type MsgRegisterPreinstallsResponse struct { +} + +func (m *MsgRegisterPreinstallsResponse) Reset() { *m = MsgRegisterPreinstallsResponse{} } +func (m *MsgRegisterPreinstallsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterPreinstallsResponse) ProtoMessage() {} +func (*MsgRegisterPreinstallsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f75ac0a12d075f21, []int{10} +} +func (m *MsgRegisterPreinstallsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterPreinstallsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterPreinstallsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRegisterPreinstallsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterPreinstallsResponse.Merge(m, src) +} +func (m *MsgRegisterPreinstallsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterPreinstallsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterPreinstallsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterPreinstallsResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgEthereumTx)(nil), "ethermint.evm.v1.MsgEthereumTx") proto.RegisterType((*LegacyTx)(nil), "ethermint.evm.v1.LegacyTx") proto.RegisterType((*AccessListTx)(nil), "ethermint.evm.v1.AccessListTx") proto.RegisterType((*DynamicFeeTx)(nil), "ethermint.evm.v1.DynamicFeeTx") + proto.RegisterType((*SetCodeTx)(nil), "ethermint.evm.v1.SetCodeTx") proto.RegisterType((*ExtensionOptionsEthereumTx)(nil), "ethermint.evm.v1.ExtensionOptionsEthereumTx") proto.RegisterType((*MsgEthereumTxResponse)(nil), "ethermint.evm.v1.MsgEthereumTxResponse") proto.RegisterType((*MsgUpdateParams)(nil), "ethermint.evm.v1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "ethermint.evm.v1.MsgUpdateParamsResponse") + proto.RegisterType((*MsgRegisterPreinstalls)(nil), "ethermint.evm.v1.MsgRegisterPreinstalls") + proto.RegisterType((*MsgRegisterPreinstallsResponse)(nil), "ethermint.evm.v1.MsgRegisterPreinstallsResponse") } func init() { proto.RegisterFile("ethermint/evm/v1/tx.proto", fileDescriptor_f75ac0a12d075f21) } var fileDescriptor_f75ac0a12d075f21 = []byte{ - // 1064 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xda, 0xeb, 0x5f, 0x63, 0x37, 0xad, 0x46, 0x89, 0xba, 0xb6, 0x88, 0xd7, 0x6c, 0xf9, - 0xe1, 0x16, 0x65, 0x57, 0x0d, 0xa8, 0x52, 0x73, 0x22, 0xdb, 0x24, 0x50, 0x94, 0x88, 0x6a, 0x71, - 0x2f, 0x80, 0x64, 0x4d, 0x76, 0x27, 0xeb, 0x55, 0xbd, 0x3b, 0xab, 0x9d, 0xb1, 0xb1, 0x91, 0x90, - 0xaa, 0x9e, 0x38, 0x52, 0xf1, 0x0f, 0x70, 0xe6, 0xd4, 0x43, 0xcf, 0x5c, 0xb8, 0x54, 0x9c, 0x2a, - 0xb8, 0xa0, 0x1e, 0x0c, 0x4a, 0x90, 0x2a, 0x72, 0xe4, 0xcc, 0x01, 0xcd, 0xcc, 0x3a, 0xb6, 0x6b, - 0x9c, 0x40, 0x25, 0xb8, 0xcd, 0x9b, 0xf7, 0xbd, 0x99, 0xf7, 0xbe, 0x6f, 0xf6, 0xbd, 0x05, 0x55, - 0xcc, 0x3a, 0x38, 0x09, 0x83, 0x88, 0x59, 0xb8, 0x1f, 0x5a, 0xfd, 0xeb, 0x16, 0x1b, 0x98, 0x71, - 0x42, 0x18, 0x81, 0x97, 0x4e, 0x5d, 0x26, 0xee, 0x87, 0x66, 0xff, 0x7a, 0xed, 0xb2, 0x4b, 0x68, - 0x48, 0xa8, 0x15, 0x52, 0x9f, 0x23, 0x43, 0xea, 0x4b, 0x68, 0xad, 0x2a, 0x1d, 0x6d, 0x61, 0x59, - 0xd2, 0x48, 0x5d, 0x2b, 0x3e, 0xf1, 0x89, 0xdc, 0xe7, 0xab, 0x74, 0xf7, 0x15, 0x9f, 0x10, 0xbf, - 0x8b, 0x2d, 0x14, 0x07, 0x16, 0x8a, 0x22, 0xc2, 0x10, 0x0b, 0x48, 0x34, 0x8e, 0xa9, 0xa6, 0x5e, - 0x61, 0x1d, 0xf4, 0x0e, 0x2d, 0x14, 0x0d, 0x53, 0xd7, 0x95, 0xb9, 0x7c, 0x91, 0xeb, 0x62, 0x4a, - 0xdb, 0xac, 0x17, 0x77, 0x71, 0x0a, 0xaa, 0xcd, 0x81, 0xba, 0x64, 0x9c, 0xea, 0xda, 0x9c, 0x2f, - 0x46, 0x09, 0x0a, 0xd3, 0xab, 0x8d, 0xfb, 0x19, 0x70, 0x61, 0x9f, 0xfa, 0x3b, 0x1c, 0x84, 0x7b, - 0x61, 0x6b, 0x00, 0x9b, 0x40, 0xf5, 0x10, 0x43, 0x9a, 0xd2, 0x50, 0x9a, 0xe5, 0x8d, 0x15, 0x53, - 0xe6, 0x66, 0x8e, 0x73, 0x33, 0xb7, 0xa2, 0xa1, 0x23, 0x10, 0xb0, 0x0a, 0x54, 0x1a, 0x7c, 0x8e, - 0xb5, 0x4c, 0x43, 0x69, 0x2a, 0x76, 0xee, 0x64, 0xa4, 0x2b, 0xeb, 0x8e, 0xd8, 0x82, 0xef, 0x80, - 0x8b, 0x1e, 0x8e, 0x13, 0xec, 0x22, 0x86, 0xbd, 0x76, 0x07, 0xd1, 0x8e, 0x96, 0x6d, 0x28, 0xcd, - 0x92, 0x5d, 0xfe, 0x63, 0xa4, 0x17, 0x92, 0x6e, 0xbc, 0x69, 0xac, 0x1b, 0xce, 0xf2, 0x04, 0xf3, - 0x3e, 0xa2, 0x1d, 0xf8, 0xd6, 0x4c, 0xd4, 0x61, 0x42, 0x42, 0x4d, 0x15, 0x51, 0x19, 0x4d, 0x99, - 0x06, 0xef, 0x26, 0x24, 0x84, 0x10, 0xa8, 0x02, 0x91, 0x6b, 0x28, 0xcd, 0x8a, 0x23, 0xd6, 0xf0, - 0x35, 0x90, 0x4d, 0xd0, 0x67, 0x5a, 0x9e, 0x6f, 0xd9, 0xf0, 0xc9, 0x48, 0x5f, 0x7a, 0x36, 0xd2, - 0xc1, 0xa4, 0x38, 0x87, 0xbb, 0x37, 0x2f, 0x7c, 0xf9, 0x8d, 0xbe, 0xf4, 0xe0, 0xf9, 0xa3, 0x6b, - 0x22, 0xc8, 0x78, 0x98, 0x01, 0xc5, 0x3d, 0xec, 0x23, 0x77, 0xd8, 0x1a, 0xc0, 0x15, 0x90, 0x8b, - 0x48, 0xe4, 0x62, 0x51, 0xbe, 0xea, 0x48, 0x03, 0xde, 0x00, 0x25, 0x1f, 0x71, 0xb9, 0x03, 0x57, - 0x96, 0x5b, 0xb2, 0xab, 0xcf, 0x46, 0xfa, 0xaa, 0x54, 0x9e, 0x7a, 0xf7, 0xcc, 0x80, 0x58, 0x21, - 0x62, 0x1d, 0xf3, 0x76, 0xc4, 0x9c, 0xa2, 0x8f, 0xe8, 0x1d, 0x0e, 0x85, 0x75, 0x90, 0xf5, 0x11, - 0x15, 0xa5, 0xab, 0x76, 0xe5, 0x68, 0xa4, 0x17, 0xdf, 0x43, 0x74, 0x2f, 0x08, 0x03, 0xe6, 0x70, - 0x07, 0x5c, 0x06, 0x19, 0x46, 0x64, 0x8d, 0x4e, 0x86, 0x11, 0x78, 0x13, 0xe4, 0xfa, 0xa8, 0xdb, - 0xc3, 0xa2, 0xa8, 0x92, 0x7d, 0x65, 0xe1, 0x1d, 0x47, 0x23, 0x3d, 0xbf, 0x15, 0x92, 0x5e, 0xc4, - 0x1c, 0x19, 0xc1, 0xe9, 0x10, 0xb2, 0xe5, 0x25, 0x1d, 0x42, 0xa0, 0x0a, 0x50, 0xfa, 0x5a, 0x41, - 0x6c, 0x28, 0x7d, 0x6e, 0x25, 0x5a, 0x51, 0x5a, 0x09, 0xb7, 0xa8, 0x56, 0x92, 0x16, 0xdd, 0x5c, - 0xe6, 0x94, 0xfc, 0xf0, 0x78, 0x3d, 0xdf, 0x1a, 0x6c, 0x23, 0x86, 0x8c, 0xef, 0xb2, 0xa0, 0xb2, - 0x25, 0x1e, 0xda, 0x5e, 0x40, 0x59, 0x6b, 0x00, 0x3f, 0x00, 0x45, 0xb7, 0x83, 0x82, 0xa8, 0x1d, - 0x78, 0x82, 0x9a, 0x92, 0x6d, 0x9d, 0x95, 0x5c, 0xe1, 0x16, 0x07, 0xdf, 0xde, 0x3e, 0x19, 0xe9, - 0x05, 0x57, 0x2e, 0x9d, 0x74, 0xe1, 0x4d, 0x38, 0xce, 0x2c, 0xe4, 0x38, 0xfb, 0xaf, 0x39, 0x56, - 0xcf, 0xe6, 0x38, 0x37, 0xcf, 0x71, 0xfe, 0xa5, 0x39, 0x2e, 0x4c, 0x71, 0xfc, 0x09, 0x28, 0xca, - 0x2f, 0x12, 0x53, 0xad, 0xd8, 0xc8, 0x36, 0xcb, 0x1b, 0x6b, 0xe6, 0x8b, 0x8d, 0xc4, 0x94, 0x54, - 0xb6, 0xf8, 0x27, 0x6b, 0x37, 0xf8, 0xb3, 0x3c, 0x19, 0xe9, 0x00, 0x9d, 0xf2, 0xfb, 0xed, 0x2f, - 0x3a, 0x98, 0xb0, 0xed, 0x9c, 0x1e, 0x28, 0x05, 0x2c, 0xcd, 0x08, 0x08, 0x66, 0x04, 0x2c, 0x2f, - 0x12, 0xf0, 0xcf, 0x2c, 0xa8, 0x6c, 0x0f, 0x23, 0x14, 0x06, 0xee, 0x2e, 0xc6, 0xff, 0x8b, 0x80, - 0x37, 0x41, 0x99, 0x0b, 0xc8, 0x82, 0xb8, 0xed, 0xa2, 0xf8, 0x7c, 0x09, 0xb9, 0xdc, 0xad, 0x20, - 0xbe, 0x85, 0xe2, 0x71, 0xe8, 0x21, 0xc6, 0x22, 0x54, 0xfd, 0x27, 0xa1, 0xbb, 0x18, 0xf3, 0xd0, - 0x54, 0xfe, 0xdc, 0xd9, 0xf2, 0xe7, 0xe7, 0xe5, 0x2f, 0xbc, 0xb4, 0xfc, 0xc5, 0x05, 0xf2, 0x97, - 0xfe, 0x13, 0xf9, 0xc1, 0x8c, 0xfc, 0xe5, 0x19, 0xf9, 0x2b, 0x8b, 0xe4, 0x37, 0x40, 0x6d, 0x67, - 0xc0, 0x70, 0x44, 0x03, 0x12, 0x7d, 0x18, 0x8b, 0x59, 0x33, 0xe9, 0x82, 0x9b, 0x2a, 0x47, 0x1b, - 0xdf, 0x2b, 0x60, 0x75, 0xa6, 0xf5, 0x3b, 0x98, 0xc6, 0x24, 0xa2, 0xa2, 0x50, 0xd1, 0xb2, 0xc5, - 0x3b, 0x71, 0xc4, 0x1a, 0x5e, 0x05, 0x6a, 0x97, 0xf8, 0x54, 0xcb, 0x88, 0x22, 0x57, 0xe7, 0x8b, - 0xdc, 0x23, 0xbe, 0x23, 0x20, 0xf0, 0x12, 0xc8, 0x26, 0x98, 0x89, 0x07, 0x50, 0x71, 0xf8, 0x12, - 0x56, 0x41, 0xb1, 0x1f, 0xb6, 0x71, 0x92, 0x90, 0x24, 0xed, 0x76, 0x85, 0x7e, 0xb8, 0xc3, 0x4d, - 0xee, 0xe2, 0xd2, 0xf7, 0x28, 0xf6, 0xa4, 0x88, 0x4e, 0xc1, 0x47, 0xf4, 0x2e, 0xc5, 0x1e, 0x5c, - 0x03, 0xe0, 0xa0, 0x4b, 0xdc, 0x7b, 0x72, 0x7e, 0xc8, 0xc6, 0x56, 0x12, 0x3b, 0x7c, 0x5a, 0xa4, - 0x55, 0x3c, 0x54, 0xc0, 0xc5, 0x7d, 0xea, 0xdf, 0x8d, 0x3d, 0xc4, 0xf0, 0x1d, 0x31, 0xda, 0x78, - 0x2b, 0x41, 0x3d, 0xd6, 0x21, 0x49, 0xc0, 0x86, 0xe9, 0x63, 0xd7, 0x7e, 0x7c, 0xbc, 0xbe, 0x92, - 0x0e, 0xea, 0x2d, 0xcf, 0x4b, 0x30, 0xa5, 0x1f, 0xb1, 0x24, 0x88, 0x7c, 0x67, 0x02, 0x85, 0x37, - 0x40, 0x5e, 0x0e, 0x47, 0xf1, 0xb0, 0xcb, 0x1b, 0xda, 0x7c, 0x95, 0xf2, 0x06, 0x5b, 0xe5, 0x2a, - 0x3a, 0x29, 0x7a, 0x73, 0x99, 0x0f, 0x93, 0xc9, 0x39, 0x46, 0x15, 0x5c, 0x7e, 0x21, 0xa5, 0x31, - 0xb5, 0x1b, 0xbf, 0x2b, 0x20, 0xbb, 0x4f, 0x7d, 0xf8, 0x05, 0x98, 0x1a, 0x4b, 0x50, 0x9f, 0xbf, - 0x68, 0x46, 0x99, 0xda, 0x9b, 0xe7, 0x00, 0xc6, 0xe7, 0x1b, 0xaf, 0x3f, 0xf8, 0xe9, 0xb7, 0xaf, - 0x33, 0xba, 0xb1, 0x66, 0xcd, 0xcd, 0x7d, 0x9c, 0xa2, 0xdb, 0x6c, 0x00, 0x3f, 0x05, 0x95, 0x19, - 0xc6, 0x5e, 0xfd, 0xdb, 0xf3, 0xa7, 0x21, 0xb5, 0xab, 0xe7, 0x42, 0xc6, 0x49, 0xd4, 0x72, 0xf7, - 0x9f, 0x3f, 0xba, 0xa6, 0xd8, 0xef, 0x3e, 0x39, 0xaa, 0x2b, 0x4f, 0x8f, 0xea, 0xca, 0xaf, 0x47, - 0x75, 0xe5, 0xab, 0xe3, 0xfa, 0xd2, 0xd3, 0xe3, 0xfa, 0xd2, 0xcf, 0xc7, 0xf5, 0xa5, 0x8f, 0xdf, - 0xf0, 0x03, 0xd6, 0xe9, 0x1d, 0x98, 0x2e, 0x09, 0x79, 0x76, 0x84, 0x4e, 0x65, 0x3b, 0x10, 0xf9, - 0xb2, 0x61, 0x8c, 0xe9, 0x41, 0x5e, 0xfc, 0x75, 0xbc, 0xfd, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xb5, 0x29, 0xc9, 0x6e, 0xb6, 0x09, 0x00, 0x00, + // 1241 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x57, 0xcf, 0x8f, 0xdb, 0xc4, + 0x17, 0x5f, 0x27, 0xce, 0x0f, 0x4f, 0xd2, 0x6d, 0xbf, 0xfe, 0x6e, 0xa9, 0x13, 0x75, 0xe3, 0x34, + 0x85, 0x92, 0x16, 0x6d, 0x4c, 0x17, 0x54, 0xa9, 0x7b, 0x22, 0xee, 0x0f, 0x28, 0xda, 0x15, 0x95, + 0x9b, 0x5e, 0x00, 0x29, 0x9a, 0xb5, 0xa7, 0x8e, 0xd5, 0xd8, 0x63, 0x3c, 0x93, 0x90, 0x54, 0x42, + 0xaa, 0x7a, 0xe2, 0x48, 0xc5, 0x3f, 0xc0, 0x11, 0xc1, 0xa5, 0x87, 0x9e, 0xb9, 0x70, 0xa9, 0x38, + 0x55, 0x70, 0x41, 0x55, 0x15, 0xd0, 0x16, 0xa9, 0x52, 0x8f, 0x9c, 0x39, 0xa0, 0x99, 0x71, 0x7e, + 0xd5, 0x49, 0xb7, 0xac, 0x04, 0x12, 0x12, 0x97, 0x68, 0xde, 0xbc, 0xcf, 0x9b, 0x99, 0xf7, 0xf9, + 0xbc, 0xf1, 0xbc, 0x80, 0x12, 0xa2, 0x1d, 0x14, 0xf9, 0x5e, 0x40, 0x0d, 0xd4, 0xf7, 0x8d, 0xfe, + 0x59, 0x83, 0x0e, 0x1a, 0x61, 0x84, 0x29, 0x56, 0x8f, 0x4c, 0x5c, 0x0d, 0xd4, 0xf7, 0x1b, 0xfd, + 0xb3, 0xe5, 0xff, 0x41, 0xdf, 0x0b, 0xb0, 0xc1, 0x7f, 0x05, 0xa8, 0x7c, 0xcc, 0xc6, 0xc4, 0xc7, + 0xc4, 0xf0, 0x89, 0xcb, 0x82, 0x7d, 0xe2, 0xc6, 0x8e, 0x92, 0x70, 0xb4, 0xb9, 0x65, 0x08, 0x23, + 0x76, 0xad, 0xb9, 0xd8, 0xc5, 0x62, 0x9e, 0x8d, 0xe2, 0xd9, 0xe3, 0x2e, 0xc6, 0x6e, 0x17, 0x19, + 0x30, 0xf4, 0x0c, 0x18, 0x04, 0x98, 0x42, 0xea, 0xe1, 0x60, 0x1c, 0x53, 0x8a, 0xbd, 0xdc, 0xda, + 0xed, 0xdd, 0x30, 0x60, 0x30, 0x8c, 0x5d, 0x27, 0x13, 0x29, 0x40, 0xdb, 0x46, 0x84, 0xb4, 0x69, + 0x2f, 0xec, 0xa2, 0x18, 0x54, 0x4e, 0x80, 0xba, 0x78, 0x7c, 0xd4, 0xf5, 0x84, 0x2f, 0x84, 0x11, + 0xf4, 0xc7, 0x5b, 0x9f, 0x48, 0xba, 0x23, 0xe4, 0x05, 0x84, 0xc2, 0x6e, 0x37, 0x86, 0x6c, 0x24, + 0x20, 0x04, 0xd1, 0xb6, 0x8d, 0x1d, 0xd4, 0x86, 0x3d, 0xda, 0xc1, 0x91, 0x77, 0x8b, 0x67, 0x23, + 0xe0, 0xb5, 0xdb, 0x29, 0x70, 0x68, 0x87, 0xb8, 0x97, 0x58, 0x10, 0xea, 0xf9, 0xad, 0x81, 0x5a, + 0x07, 0xb2, 0x03, 0x29, 0xd4, 0xa4, 0xaa, 0x54, 0x2f, 0x6c, 0xae, 0x35, 0x44, 0xb6, 0x8d, 0x71, + 0xb6, 0x8d, 0x66, 0x30, 0xb4, 0x38, 0x42, 0x2d, 0x01, 0x99, 0x78, 0xb7, 0x90, 0x96, 0xaa, 0x4a, + 0x75, 0xc9, 0xcc, 0x3c, 0x1b, 0xe9, 0xd2, 0x86, 0xc5, 0xa7, 0xd4, 0xb7, 0xc1, 0x61, 0x07, 0x85, + 0x11, 0xb2, 0x21, 0x45, 0x4e, 0xbb, 0x03, 0x49, 0x47, 0x4b, 0x57, 0xa5, 0xba, 0x62, 0x16, 0x7e, + 0x1f, 0xe9, 0xb9, 0xa8, 0x1b, 0x6e, 0xd5, 0x36, 0x6a, 0xd6, 0xea, 0x14, 0xf3, 0x1e, 0x24, 0x1d, + 0xf5, 0x8d, 0xb9, 0xa8, 0x1b, 0x11, 0xf6, 0x35, 0x99, 0x47, 0xa5, 0x34, 0x69, 0x16, 0x7c, 0x39, + 0xc2, 0xbe, 0xaa, 0x02, 0x99, 0x23, 0x32, 0x55, 0xa9, 0x5e, 0xb4, 0xf8, 0x58, 0x7d, 0x15, 0xa4, + 0x23, 0xf8, 0xa9, 0x96, 0x65, 0x53, 0xa6, 0xfa, 0x60, 0xa4, 0xaf, 0x3c, 0x1a, 0xe9, 0x60, 0x9a, + 0x9c, 0xc5, 0xdc, 0x5b, 0x87, 0x3e, 0xff, 0x4a, 0x5f, 0xb9, 0xf3, 0xf4, 0xde, 0x19, 0x1e, 0x54, + 0xbb, 0x9b, 0x02, 0xf9, 0x6d, 0xe4, 0x42, 0x7b, 0xd8, 0x1a, 0xa8, 0x6b, 0x20, 0x13, 0xe0, 0xc0, + 0x46, 0x3c, 0x7d, 0xd9, 0x12, 0x86, 0x7a, 0x0e, 0x28, 0x2e, 0x64, 0x05, 0xe4, 0xd9, 0x22, 0x5d, + 0xc5, 0x2c, 0x3d, 0x1a, 0xe9, 0x47, 0x45, 0x2d, 0x11, 0xe7, 0x66, 0xc3, 0xc3, 0x86, 0x0f, 0x69, + 0xa7, 0x71, 0x25, 0xa0, 0x56, 0xde, 0x85, 0xe4, 0x2a, 0x83, 0xaa, 0x15, 0x90, 0x76, 0x21, 0xe1, + 0xa9, 0xcb, 0x66, 0x71, 0x6f, 0xa4, 0xe7, 0xdf, 0x85, 0x64, 0xdb, 0xf3, 0x3d, 0x6a, 0x31, 0x87, + 0xba, 0x0a, 0x52, 0x14, 0x8b, 0x1c, 0xad, 0x14, 0xc5, 0xea, 0x79, 0x90, 0xe9, 0xc3, 0x6e, 0x0f, + 0xf1, 0xa4, 0x14, 0xf3, 0xe4, 0xd2, 0x3d, 0xf6, 0x46, 0x7a, 0xb6, 0xe9, 0xe3, 0x5e, 0x40, 0x2d, + 0x11, 0xc1, 0xe8, 0xe0, 0xb2, 0x65, 0x05, 0x1d, 0x5c, 0xa0, 0x22, 0x90, 0xfa, 0x5a, 0x8e, 0x4f, + 0x48, 0x7d, 0x66, 0x45, 0x5a, 0x5e, 0x58, 0x11, 0xb3, 0x88, 0xa6, 0x08, 0x8b, 0x6c, 0xad, 0x32, + 0x4a, 0x7e, 0xb8, 0xbf, 0x91, 0x6d, 0x0d, 0x2e, 0x42, 0x0a, 0x6b, 0xdf, 0xa5, 0x41, 0xb1, 0xc9, + 0x4b, 0x77, 0xdb, 0x23, 0xb4, 0x35, 0x50, 0xdf, 0x07, 0x79, 0xbb, 0x03, 0xbd, 0xa0, 0xed, 0x39, + 0x9c, 0x1a, 0xc5, 0x34, 0x5e, 0x74, 0xb8, 0xdc, 0x05, 0x06, 0xbe, 0x72, 0xf1, 0xd9, 0x48, 0xcf, + 0xd9, 0x62, 0x68, 0xc5, 0x03, 0x67, 0xca, 0x71, 0x6a, 0x29, 0xc7, 0xe9, 0xbf, 0xcc, 0xb1, 0xfc, + 0x62, 0x8e, 0x33, 0x49, 0x8e, 0xb3, 0x07, 0xe6, 0x38, 0x37, 0xc3, 0xf1, 0x47, 0x20, 0x2f, 0xee, + 0x38, 0x22, 0x5a, 0xbe, 0x9a, 0xae, 0x17, 0x36, 0xd7, 0x1b, 0xcf, 0x7f, 0xad, 0x1a, 0x82, 0xca, + 0x16, 0xfb, 0x08, 0x98, 0x55, 0x56, 0x96, 0xcf, 0x46, 0x3a, 0x80, 0x13, 0x7e, 0xbf, 0xf9, 0x45, + 0x07, 0x53, 0xb6, 0xad, 0xc9, 0x82, 0x42, 0x40, 0x65, 0x4e, 0x40, 0x30, 0x27, 0x60, 0x61, 0x99, + 0x80, 0x7f, 0xa4, 0x41, 0xf1, 0xe2, 0x30, 0x80, 0xbe, 0x67, 0x5f, 0x46, 0xe8, 0x1f, 0x11, 0xf0, + 0x3c, 0x28, 0x30, 0x01, 0xa9, 0x17, 0xb6, 0x6d, 0x18, 0xee, 0x2f, 0x21, 0x93, 0xbb, 0xe5, 0x85, + 0x17, 0x60, 0x38, 0x0e, 0xbd, 0x81, 0x10, 0x0f, 0x95, 0x5f, 0x26, 0xf4, 0x32, 0x42, 0x2c, 0x34, + 0x96, 0x3f, 0xf3, 0x62, 0xf9, 0xb3, 0x49, 0xf9, 0x73, 0x07, 0x96, 0x3f, 0xbf, 0x44, 0x7e, 0xe5, + 0x6f, 0x91, 0x1f, 0xcc, 0xc9, 0x5f, 0x98, 0x93, 0xbf, 0xb8, 0x4c, 0xfe, 0xc7, 0x32, 0x50, 0xae, + 0x21, 0x7a, 0x01, 0x3b, 0xff, 0x69, 0xff, 0xef, 0xd4, 0x1e, 0x02, 0x85, 0xbd, 0xd7, 0xed, 0xae, + 0x47, 0xa8, 0x06, 0xf8, 0xea, 0xa7, 0x92, 0xab, 0xc7, 0x1a, 0x37, 0x67, 0x5f, 0x76, 0xf3, 0x78, + 0xbc, 0x4d, 0x9e, 0x2d, 0x10, 0x6f, 0x92, 0x6f, 0xc6, 0x63, 0x6b, 0x32, 0x2b, 0xca, 0xab, 0x30, + 0x57, 0x5e, 0xc5, 0xb9, 0xf2, 0x3a, 0xb4, 0xac, 0xbc, 0x6a, 0xa0, 0x7c, 0x69, 0x40, 0x51, 0x40, + 0x3c, 0x1c, 0x7c, 0x10, 0xf2, 0xe6, 0x68, 0xfa, 0xc8, 0x6e, 0xc9, 0x0c, 0x5d, 0xfb, 0x5e, 0x02, + 0x47, 0xe7, 0x3a, 0x0b, 0x0b, 0x91, 0x10, 0x07, 0x84, 0x73, 0xc9, 0x3b, 0x02, 0x5e, 0x8a, 0x16, + 0x1f, 0xab, 0xa7, 0x81, 0xdc, 0xc5, 0x2e, 0xd1, 0x52, 0x3c, 0xd3, 0xa3, 0xc9, 0x4c, 0xb7, 0xb1, + 0x6b, 0x71, 0x88, 0x7a, 0x04, 0xa4, 0x23, 0x44, 0x79, 0x8d, 0x15, 0x2d, 0x36, 0x54, 0x4b, 0x20, + 0xdf, 0xf7, 0xdb, 0x28, 0x8a, 0x70, 0x14, 0x3f, 0xa6, 0xb9, 0xbe, 0x7f, 0x89, 0x99, 0xcc, 0xc5, + 0xaa, 0xab, 0x47, 0x90, 0x23, 0xea, 0xc4, 0xca, 0xb9, 0x90, 0x5c, 0x27, 0xc8, 0x51, 0xd7, 0x01, + 0xd8, 0xed, 0x62, 0xfb, 0xa6, 0x68, 0x4f, 0xc4, 0xbb, 0xa9, 0xf0, 0x19, 0xd6, 0x8c, 0xc4, 0x59, + 0xdc, 0x95, 0xc0, 0xe1, 0x1d, 0xe2, 0x5e, 0x0f, 0x1d, 0x48, 0xd1, 0x55, 0xde, 0x8b, 0xb1, 0x97, + 0x2a, 0x6e, 0xa5, 0xe8, 0x30, 0xbe, 0x4f, 0xda, 0x8f, 0xf7, 0x37, 0xd6, 0xe2, 0xce, 0xb2, 0xe9, + 0x38, 0x11, 0x22, 0xe4, 0x1a, 0x8d, 0xbc, 0xc0, 0xb5, 0xa6, 0x50, 0xf5, 0x1c, 0xc8, 0x8a, 0x6e, + 0x8e, 0xdf, 0x9d, 0xc2, 0xa6, 0x96, 0xcc, 0x52, 0xec, 0x60, 0xca, 0x4c, 0x41, 0x2b, 0x46, 0x6f, + 0xad, 0xb2, 0x5e, 0x65, 0xba, 0x4e, 0xad, 0x04, 0x8e, 0x3d, 0x77, 0xa4, 0x31, 0xb5, 0xb5, 0x6f, + 0x25, 0xf0, 0xca, 0x0e, 0x71, 0x2d, 0xe4, 0x7a, 0x84, 0xa2, 0xe8, 0xea, 0xa4, 0x3b, 0x3c, 0xf8, + 0xa9, 0xaf, 0x80, 0xc2, 0xb4, 0xc9, 0x1c, 0x0b, 0x74, 0x7c, 0xc1, 0xd1, 0x27, 0x20, 0x53, 0x61, + 0xc7, 0xff, 0xfa, 0xe9, 0xbd, 0x33, 0x92, 0x35, 0x1b, 0x9b, 0x48, 0xa4, 0x0a, 0x2a, 0x8b, 0x0f, + 0x3b, 0xce, 0x67, 0xf3, 0x71, 0x0a, 0xa4, 0x77, 0x88, 0xab, 0x7e, 0x06, 0x66, 0xba, 0x38, 0x55, + 0x4f, 0xee, 0x3e, 0x57, 0x69, 0xe5, 0xd7, 0xf7, 0x01, 0x4c, 0xf8, 0x7a, 0xed, 0xce, 0x4f, 0xbf, + 0x7d, 0x99, 0xd2, 0x6b, 0xeb, 0x46, 0xa2, 0x6d, 0x46, 0x31, 0xba, 0x4d, 0x07, 0xea, 0xc7, 0xa0, + 0x38, 0x57, 0x01, 0x27, 0x16, 0xae, 0x3f, 0x0b, 0x29, 0x9f, 0xde, 0x17, 0x32, 0xb9, 0x0f, 0x9f, + 0x80, 0xff, 0x2f, 0x12, 0xac, 0xbe, 0x70, 0x85, 0x05, 0xc8, 0xf2, 0x9b, 0x2f, 0x8b, 0x1c, 0x6f, + 0x59, 0xce, 0xdc, 0x66, 0xea, 0x98, 0xef, 0x3c, 0xd8, 0xab, 0x48, 0x0f, 0xf7, 0x2a, 0xd2, 0xaf, + 0x7b, 0x15, 0xe9, 0x8b, 0x27, 0x95, 0x95, 0x87, 0x4f, 0x2a, 0x2b, 0x3f, 0x3f, 0xa9, 0xac, 0x7c, + 0x78, 0xca, 0xf5, 0x68, 0xa7, 0xb7, 0xdb, 0xb0, 0xb1, 0xcf, 0x08, 0xc1, 0x64, 0x86, 0xa0, 0x01, + 0xa7, 0x88, 0x0e, 0x43, 0x44, 0x76, 0xb3, 0xfc, 0x7f, 0xc1, 0x5b, 0x7f, 0x06, 0x00, 0x00, 0xff, + 0xff, 0x8a, 0x83, 0x91, 0x5e, 0xbd, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -546,6 +718,9 @@ type MsgClient interface { // UpdateParams defined a governance operation for updating the x/evm module parameters. // The authority is hard-coded to the Cosmos SDK x/gov module account UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // UpdateParams defined a governance operation for updating the x/evm module parameters. + // The authority is hard-coded to the Cosmos SDK x/gov module account + RegisterPreinstalls(ctx context.Context, in *MsgRegisterPreinstalls, opts ...grpc.CallOption) (*MsgRegisterPreinstallsResponse, error) } type msgClient struct { @@ -574,6 +749,15 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } +func (c *msgClient) RegisterPreinstalls(ctx context.Context, in *MsgRegisterPreinstalls, opts ...grpc.CallOption) (*MsgRegisterPreinstallsResponse, error) { + out := new(MsgRegisterPreinstallsResponse) + err := c.cc.Invoke(ctx, "/ethermint.evm.v1.Msg/RegisterPreinstalls", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // EthereumTx defines a method submitting Ethereum transactions. @@ -581,6 +765,9 @@ type MsgServer interface { // UpdateParams defined a governance operation for updating the x/evm module parameters. // The authority is hard-coded to the Cosmos SDK x/gov module account UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // UpdateParams defined a governance operation for updating the x/evm module parameters. + // The authority is hard-coded to the Cosmos SDK x/gov module account + RegisterPreinstalls(context.Context, *MsgRegisterPreinstalls) (*MsgRegisterPreinstallsResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -593,6 +780,9 @@ func (*UnimplementedMsgServer) EthereumTx(ctx context.Context, req *MsgEthereumT func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (*UnimplementedMsgServer) RegisterPreinstalls(ctx context.Context, req *MsgRegisterPreinstalls) (*MsgRegisterPreinstallsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterPreinstalls not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -634,6 +824,24 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_RegisterPreinstalls_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRegisterPreinstalls) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RegisterPreinstalls(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ethermint.evm.v1.Msg/RegisterPreinstalls", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RegisterPreinstalls(ctx, req.(*MsgRegisterPreinstalls)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "ethermint.evm.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -646,6 +854,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "RegisterPreinstalls", + Handler: _Msg_RegisterPreinstalls_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "ethermint/evm/v1/tx.proto", @@ -1063,30 +1275,7 @@ func (m *DynamicFeeTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ExtensionOptionsEthereumTx) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ExtensionOptionsEthereumTx) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ExtensionOptionsEthereumTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgEthereumTxResponse) Marshal() (dAtA []byte, err error) { +func (m *SetCodeTx) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1096,46 +1285,55 @@ func (m *MsgEthereumTxResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgEthereumTxResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *SetCodeTx) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgEthereumTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SetCodeTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.BlockHash) > 0 { - i -= len(m.BlockHash) - copy(dAtA[i:], m.BlockHash) - i = encodeVarintTx(dAtA, i, uint64(len(m.BlockHash))) + if len(m.S) > 0 { + i -= len(m.S) + copy(dAtA[i:], m.S) + i = encodeVarintTx(dAtA, i, uint64(len(m.S))) i-- - dAtA[i] = 0x32 + dAtA[i] = 0x6a } - if m.GasUsed != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.GasUsed)) + if len(m.R) > 0 { + i -= len(m.R) + copy(dAtA[i:], m.R) + i = encodeVarintTx(dAtA, i, uint64(len(m.R))) i-- - dAtA[i] = 0x28 + dAtA[i] = 0x62 } - if len(m.VmError) > 0 { - i -= len(m.VmError) - copy(dAtA[i:], m.VmError) - i = encodeVarintTx(dAtA, i, uint64(len(m.VmError))) + if len(m.V) > 0 { + i -= len(m.V) + copy(dAtA[i:], m.V) + i = encodeVarintTx(dAtA, i, uint64(len(m.V))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x5a } - if len(m.Ret) > 0 { - i -= len(m.Ret) - copy(dAtA[i:], m.Ret) - i = encodeVarintTx(dAtA, i, uint64(len(m.Ret))) - i-- - dAtA[i] = 0x1a + if len(m.AuthList) > 0 { + for iNdEx := len(m.AuthList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AuthList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } } - if len(m.Logs) > 0 { - for iNdEx := len(m.Logs) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Accesses) > 0 { + for iNdEx := len(m.Accesses) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Accesses[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1143,46 +1341,204 @@ func (m *MsgEthereumTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x4a } } - if len(m.Hash) > 0 { - i -= len(m.Hash) - copy(dAtA[i:], m.Hash) - i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTx(dAtA, i, uint64(len(m.Data))) i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + dAtA[i] = 0x42 } - return dAtA[:n], nil -} - -func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Amount != nil { + { + size := m.Amount.Size() + i -= size + if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x3a + } + if len(m.To) > 0 { + i -= len(m.To) + copy(dAtA[i:], m.To) + i = encodeVarintTx(dAtA, i, uint64(len(m.To))) + i-- + dAtA[i] = 0x32 + } + if m.GasLimit != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.GasLimit)) + i-- + dAtA[i] = 0x28 + } + if m.GasFeeCap != nil { + { + size := m.GasFeeCap.Size() + i -= size + if _, err := m.GasFeeCap.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.GasTipCap != nil { + { + size := m.GasTipCap.Size() + i -= size + if _, err := m.GasTipCap.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Nonce != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Nonce)) + i-- + dAtA[i] = 0x10 + } + if m.ChainID != nil { + { + size := m.ChainID.Size() + i -= size + if _, err := m.ChainID.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ExtensionOptionsEthereumTx) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExtensionOptionsEthereumTx) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExtensionOptionsEthereumTx) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgEthereumTxResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEthereumTxResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEthereumTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.BlockHash) > 0 { + i -= len(m.BlockHash) + copy(dAtA[i:], m.BlockHash) + i = encodeVarintTx(dAtA, i, uint64(len(m.BlockHash))) + i-- + dAtA[i] = 0x32 + } + if m.GasUsed != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.GasUsed)) + i-- + dAtA[i] = 0x28 + } + if len(m.VmError) > 0 { + i -= len(m.VmError) + copy(dAtA[i:], m.VmError) + i = encodeVarintTx(dAtA, i, uint64(len(m.VmError))) + i-- + dAtA[i] = 0x22 + } + if len(m.Ret) > 0 { + i -= len(m.Ret) + copy(dAtA[i:], m.Ret) + i = encodeVarintTx(dAtA, i, uint64(len(m.Ret))) + i-- + dAtA[i] = 0x1a + } + if len(m.Logs) > 0 { + for iNdEx := len(m.Logs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Logs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x12 @@ -1219,6 +1575,73 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgRegisterPreinstalls) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRegisterPreinstalls) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterPreinstalls) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Preinstalls) > 0 { + for iNdEx := len(m.Preinstalls) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Preinstalls[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRegisterPreinstallsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRegisterPreinstallsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterPreinstallsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1413,30 +1836,93 @@ func (m *DynamicFeeTx) Size() (n int) { return n } -func (m *ExtensionOptionsEthereumTx) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgEthereumTxResponse) Size() (n int) { +func (m *SetCodeTx) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Hash) - if l > 0 { + if m.ChainID != nil { + l = m.ChainID.Size() n += 1 + l + sovTx(uint64(l)) } - if len(m.Logs) > 0 { - for _, e := range m.Logs { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } + if m.Nonce != 0 { + n += 1 + sovTx(uint64(m.Nonce)) + } + if m.GasTipCap != nil { + l = m.GasTipCap.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.GasFeeCap != nil { + l = m.GasFeeCap.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.GasLimit != 0 { + n += 1 + sovTx(uint64(m.GasLimit)) + } + l = len(m.To) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Amount != nil { + l = m.Amount.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Accesses) > 0 { + for _, e := range m.Accesses { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + if len(m.AuthList) > 0 { + for _, e := range m.AuthList { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + l = len(m.V) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.R) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.S) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *ExtensionOptionsEthereumTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEthereumTxResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Logs) > 0 { + for _, e := range m.Logs { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } } l = len(m.Ret) if l > 0 { @@ -1480,6 +1966,34 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } +func (m *MsgRegisterPreinstalls) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Preinstalls) > 0 { + for _, e := range m.Preinstalls { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgRegisterPreinstallsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1505,21 +2019,268 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgEthereumTx: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgEthereumTx: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgEthereumTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEthereumTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &types.Any{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Size_ = float64(math.Float64frombits(v)) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeprecatedHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedFrom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeprecatedFrom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.From = append(m.From[:0], dAtA[iNdEx:postIndex]...) + if m.From == nil { + m.From = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Raw", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Raw.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LegacyTx) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LegacyTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LegacyTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GasPrice", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -1529,42 +2290,50 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Data == nil { - m.Data = &types.Any{} - } - if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + var v cosmossdk_io_math.Int + m.GasPrice = &v + if err := m.GasPrice.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: - if wireType != 1 { - return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GasLimit", wireType) } - var v uint64 - if (iNdEx + 8) > l { - return io.ErrUnexpectedEOF + m.GasLimit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GasLimit |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - m.Size_ = float64(math.Float64frombits(v)) - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedHash", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field To", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1592,11 +2361,11 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DeprecatedHash = string(dAtA[iNdEx:postIndex]) + m.To = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedFrom", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1624,11 +2393,15 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DeprecatedFrom = string(dAtA[iNdEx:postIndex]) + var v cosmossdk_io_math.Int + m.Amount = &v + if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -1655,14 +2428,14 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.From = append(m.From[:0], dAtA[iNdEx:postIndex]...) - if m.From == nil { - m.From = []byte{} + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} } iNdEx = postIndex - case 6: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Raw", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field V", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -1689,8 +2462,77 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Raw.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.V = append(m.V[:0], dAtA[iNdEx:postIndex]...) + if m.V == nil { + m.V = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field R", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.R = append(m.R[:0], dAtA[iNdEx:postIndex]...) + if m.R == nil { + m.R = []byte{} + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field S", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.S = append(m.S[:0], dAtA[iNdEx:postIndex]...) + if m.S == nil { + m.S = []byte{} } iNdEx = postIndex default: @@ -1714,7 +2556,7 @@ func (m *MsgEthereumTx) Unmarshal(dAtA []byte) error { } return nil } -func (m *LegacyTx) Unmarshal(dAtA []byte) error { +func (m *AccessListTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1737,13 +2579,49 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: LegacyTx: wiretype end group for non-group") + return fmt.Errorf("proto: AccessListTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: LegacyTx: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AccessListTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.ChainID = &v + if err := m.ChainID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) } @@ -1762,7 +2640,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { break } } - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field GasPrice", wireType) } @@ -1798,7 +2676,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field GasLimit", wireType) } @@ -1817,7 +2695,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { break } } - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field To", wireType) } @@ -1849,7 +2727,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { } m.To = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) } @@ -1885,7 +2763,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } @@ -1919,7 +2797,41 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { m.Data = []byte{} } iNdEx = postIndex - case 7: + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Accesses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Accesses = append(m.Accesses, AccessTuple{}) + if err := m.Accesses[len(m.Accesses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field V", wireType) } @@ -1953,7 +2865,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { m.V = []byte{} } iNdEx = postIndex - case 8: + case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field R", wireType) } @@ -1987,7 +2899,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { m.R = []byte{} } iNdEx = postIndex - case 9: + case 11: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field S", wireType) } @@ -2042,7 +2954,7 @@ func (m *LegacyTx) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessListTx) Unmarshal(dAtA []byte) error { +func (m *DynamicFeeTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2065,10 +2977,10 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessListTx: wiretype end group for non-group") + return fmt.Errorf("proto: DynamicFeeTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessListTx: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DynamicFeeTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2128,7 +3040,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { } case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GasPrice", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GasTipCap", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2157,12 +3069,48 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } var v cosmossdk_io_math.Int - m.GasPrice = &v - if err := m.GasPrice.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.GasTipCap = &v + if err := m.GasTipCap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GasFeeCap", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.Int + m.GasFeeCap = &v + if err := m.GasFeeCap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field GasLimit", wireType) } @@ -2181,7 +3129,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { break } } - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field To", wireType) } @@ -2213,7 +3161,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { } m.To = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) } @@ -2249,7 +3197,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 7: + case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } @@ -2283,7 +3231,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { m.Data = []byte{} } iNdEx = postIndex - case 8: + case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Accesses", wireType) } @@ -2317,7 +3265,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 9: + case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field V", wireType) } @@ -2351,7 +3299,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { m.V = []byte{} } iNdEx = postIndex - case 10: + case 11: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field R", wireType) } @@ -2385,7 +3333,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { m.R = []byte{} } iNdEx = postIndex - case 11: + case 12: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field S", wireType) } @@ -2440,7 +3388,7 @@ func (m *AccessListTx) Unmarshal(dAtA []byte) error { } return nil } -func (m *DynamicFeeTx) Unmarshal(dAtA []byte) error { +func (m *SetCodeTx) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2463,10 +3411,10 @@ func (m *DynamicFeeTx) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DynamicFeeTx: wiretype end group for non-group") + return fmt.Errorf("proto: SetCodeTx: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DynamicFeeTx: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetCodeTx: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2752,6 +3700,40 @@ func (m *DynamicFeeTx) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AuthList = append(m.AuthList, SetCodeAuthorization{}) + if err := m.AuthList[len(m.AuthList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field V", wireType) } @@ -2785,7 +3767,7 @@ func (m *DynamicFeeTx) Unmarshal(dAtA []byte) error { m.V = []byte{} } iNdEx = postIndex - case 11: + case 12: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field R", wireType) } @@ -2819,7 +3801,7 @@ func (m *DynamicFeeTx) Unmarshal(dAtA []byte) error { m.R = []byte{} } iNdEx = postIndex - case 12: + case 13: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field S", wireType) } @@ -3324,6 +4306,172 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgRegisterPreinstalls) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgRegisterPreinstalls: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterPreinstalls: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Preinstalls", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Preinstalls = append(m.Preinstalls, Preinstall{}) + if err := m.Preinstalls[len(m.Preinstalls)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRegisterPreinstallsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgRegisterPreinstallsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterPreinstallsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/evm/types/tx_args.go b/x/evm/types/tx_args.go index dd7b6475e4..f59cdbe0e5 100644 --- a/x/evm/types/tx_args.go +++ b/x/evm/types/tx_args.go @@ -18,13 +18,15 @@ package types import ( "errors" "fmt" + "math" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + ethermint "github.com/evmos/ethermint/types" + "github.com/holiman/uint256" ) // TransactionArgs represents the arguments to construct a new transaction @@ -49,7 +51,9 @@ type TransactionArgs struct { // Introduced by AccessListTxType transaction. AccessList *types.AccessList `json:"accessList,omitempty"` - ChainID *hexutil.Big `json:"chainId,omitempty"` + // For SetCodeTxType + AuthorizationList []types.SetCodeAuthorization `json:"authorizationList"` + ChainID *hexutil.Big `json:"chainId,omitempty"` } // String return the struct in a string format @@ -80,6 +84,23 @@ func (args *TransactionArgs) ToTransaction() *MsgEthereumTx { var data types.TxData switch { + case args.AuthorizationList != nil: + al := types.AccessList{} + if args.AccessList != nil { + al = *args.AccessList + } + data = &types.SetCodeTx{ + To: *args.To, + ChainID: uint256.MustFromBig(args.ChainID.ToInt()), + Nonce: uint64(*args.Nonce), + Gas: uint64(*args.Gas), + GasFeeCap: uint256.MustFromBig((*big.Int)(args.MaxFeePerGas)), + GasTipCap: uint256.MustFromBig((*big.Int)(args.MaxPriorityFeePerGas)), + Value: uint256.MustFromBig((*big.Int)(args.Value)), + Data: args.GetData(), + AccessList: al, + AuthList: args.AuthorizationList, + } case args.MaxFeePerGas != nil: al := types.AccessList{} if args.AccessList != nil { @@ -135,18 +156,16 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (* // Set sender address or use zero address if none specified. addr := args.GetFrom() - - // Set default gas & gas price if none were set - gas := globalGasCap - if gas == 0 { - gas = uint64(math.MaxUint64 / 2) - } + // Ethereum block size is ~36000000, we use this value as default in case neither gas or global cap is specified, to protect against DOS + defaultGas := uint64(100000000) + gas := defaultGas if args.Gas != nil { gas = uint64(*args.Gas) } if globalGasCap != 0 && globalGasCap < gas { gas = globalGasCap } + var ( gasPrice *big.Int gasFeeCap *big.Int @@ -178,7 +197,7 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (* // Backfill the legacy gasPrice for EVM execution, unless we're all zeroes gasPrice = new(big.Int) if gasFeeCap.BitLen() > 0 || gasTipCap.BitLen() > 0 { - gasPrice = math.BigMin(new(big.Int).Add(gasTipCap, baseFee), gasFeeCap) + gasPrice = ethermint.BigMin(new(big.Int).Add(gasTipCap, baseFee), gasFeeCap) } } } @@ -198,17 +217,19 @@ func (args *TransactionArgs) ToMessage(globalGasCap uint64, baseFee *big.Int) (* } msg := &core.Message{ - From: addr, - To: args.To, - Nonce: nonce, - Value: value, - GasLimit: gas, - GasPrice: gasPrice, - GasFeeCap: gasFeeCap, - GasTipCap: gasTipCap, - Data: data, - AccessList: accessList, - SkipAccountChecks: true, + From: addr, + To: args.To, + Nonce: nonce, + Value: value, + GasLimit: gas, + GasPrice: gasPrice, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Data: data, + AccessList: accessList, + SetCodeAuthorizations: args.AuthorizationList, + SkipNonceChecks: true, + SkipTransactionChecks: true, } return msg, nil } @@ -231,3 +252,196 @@ func (args *TransactionArgs) GetData() []byte { } return nil } + +// ToSimMessage converts the arguments to a core.Message for eth_simulateV1. +// It controls SkipNonceChecks based on validation mode and skips transaction-only checks. +// Gas is not capped by globalGasCap (the simulator manages gas budgets separately). +func (args *TransactionArgs) ToSimMessage(baseFee *big.Int, skipNonce bool) (*core.Message, error) { + // Reject invalid combinations of pre- and post-1559 fee styles + if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) { + return nil, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified") + } + + addr := args.GetFrom() + gas := uint64(0) + if args.Gas != nil { + gas = uint64(*args.Gas) + } + + var ( + gasPrice *big.Int + gasFeeCap *big.Int + gasTipCap *big.Int + ) + if baseFee == nil { + gasPrice = new(big.Int) + if args.GasPrice != nil { + gasPrice = args.GasPrice.ToInt() + } + gasFeeCap, gasTipCap = gasPrice, gasPrice + } else { + if args.GasPrice != nil { + gasPrice = args.GasPrice.ToInt() + gasFeeCap, gasTipCap = gasPrice, gasPrice + } else { + gasFeeCap = new(big.Int) + if args.MaxFeePerGas != nil { + gasFeeCap = args.MaxFeePerGas.ToInt() + } + gasTipCap = new(big.Int) + if args.MaxPriorityFeePerGas != nil { + gasTipCap = args.MaxPriorityFeePerGas.ToInt() + } + gasPrice = new(big.Int) + if gasFeeCap.BitLen() > 0 || gasTipCap.BitLen() > 0 { + gasPrice = ethermint.BigMin(new(big.Int).Add(gasTipCap, baseFee), gasFeeCap) + } + } + } + value := new(big.Int) + if args.Value != nil { + value = args.Value.ToInt() + } + data := args.GetData() + var accessList types.AccessList + if args.AccessList != nil { + accessList = *args.AccessList + } + nonce := uint64(0) + if args.Nonce != nil { + nonce = uint64(*args.Nonce) + } + return &core.Message{ + From: addr, + To: args.To, + Nonce: nonce, + Value: value, + GasLimit: gas, + GasPrice: gasPrice, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Data: data, + AccessList: accessList, + SetCodeAuthorizations: args.AuthorizationList, + SkipNonceChecks: skipNonce, + SkipTransactionChecks: true, + }, nil +} + +// CallDefaults fills in default values for unset fields in TransactionArgs +// for simulation calls. This is adapted from go-ethereum's TransactionArgs.CallDefaults. +func (args *TransactionArgs) CallDefaults(globalGasCap uint64, baseFee *big.Int, chainID *big.Int) error { + if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) { + return errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified") + } + if args.ChainID == nil { + args.ChainID = (*hexutil.Big)(chainID) + } else { + if have := (*big.Int)(args.ChainID); have.Cmp(chainID) != 0 { + return fmt.Errorf("chainId does not match node's (have=%v, want=%v)", have, chainID) + } + } + if args.Gas == nil { + gas := globalGasCap + if gas == 0 { + gas = uint64(math.MaxUint64 / 2) + } + args.Gas = (*hexutil.Uint64)(&gas) + } else if globalGasCap > 0 && globalGasCap < uint64(*args.Gas) { + args.Gas = (*hexutil.Uint64)(&globalGasCap) + } + if args.Nonce == nil { + args.Nonce = new(hexutil.Uint64) + } + if args.Value == nil { + args.Value = new(hexutil.Big) + } + if baseFee == nil { + if args.GasPrice == nil { + args.GasPrice = new(hexutil.Big) + } + } else if args.GasPrice == nil { + if args.MaxFeePerGas == nil { + args.MaxFeePerGas = new(hexutil.Big) + } + if args.MaxPriorityFeePerGas == nil { + args.MaxPriorityFeePerGas = new(hexutil.Big) + } + } + return nil +} + +// ToEthTransaction converts the arguments to an ethereum types.Transaction. +// Used by the simulator to produce transactions for block construction. +func (args *TransactionArgs) ToEthTransaction() *types.Transaction { + var txData types.TxData + nonce := uint64(0) + if args.Nonce != nil { + nonce = uint64(*args.Nonce) + } + gas := uint64(0) + if args.Gas != nil { + gas = uint64(*args.Gas) + } + + switch { + case args.AuthorizationList != nil: + al := types.AccessList{} + if args.AccessList != nil { + al = *args.AccessList + } + to := common.Address{} + if args.To != nil { + to = *args.To + } + txData = &types.SetCodeTx{ + To: to, + ChainID: uint256.MustFromBig(args.ChainID.ToInt()), + Nonce: nonce, + Gas: gas, + GasFeeCap: uint256.MustFromBig((*big.Int)(args.MaxFeePerGas)), + GasTipCap: uint256.MustFromBig((*big.Int)(args.MaxPriorityFeePerGas)), + Value: uint256.MustFromBig((*big.Int)(args.Value)), + Data: args.GetData(), + AccessList: al, + AuthList: args.AuthorizationList, + } + case args.MaxFeePerGas != nil: + al := types.AccessList{} + if args.AccessList != nil { + al = *args.AccessList + } + txData = &types.DynamicFeeTx{ + To: args.To, + ChainID: (*big.Int)(args.ChainID), + Nonce: nonce, + Gas: gas, + GasFeeCap: (*big.Int)(args.MaxFeePerGas), + GasTipCap: (*big.Int)(args.MaxPriorityFeePerGas), + Value: (*big.Int)(args.Value), + Data: args.GetData(), + AccessList: al, + } + case args.AccessList != nil: + txData = &types.AccessListTx{ + To: args.To, + ChainID: (*big.Int)(args.ChainID), + Nonce: nonce, + Gas: gas, + GasPrice: (*big.Int)(args.GasPrice), + Value: (*big.Int)(args.Value), + Data: args.GetData(), + AccessList: *args.AccessList, + } + default: + txData = &types.LegacyTx{ + To: args.To, + Nonce: nonce, + Gas: gas, + GasPrice: (*big.Int)(args.GasPrice), + Value: (*big.Int)(args.Value), + Data: args.GetData(), + } + } + return types.NewTx(txData) +} diff --git a/x/evm/types/tx_args_test.go b/x/evm/types/tx_args_test.go index 9e8c20aa0b..a6f503ed8a 100644 --- a/x/evm/types/tx_args_test.go +++ b/x/evm/types/tx_args_test.go @@ -2,10 +2,11 @@ package types import ( "fmt" + "math" "math/big" "github.com/ethereum/go-ethereum/common" - //"github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" ) @@ -286,3 +287,415 @@ func (suite *TxDataTestSuite) TestGetData() { suite.Require().Equal(retrievedData, tc.expectedOutput) } } + +func (suite *TxDataTestSuite) TestMaxGasCap() { + testCases := []struct { + name string + globalGasCap uint64 + txArgs TransactionArgs + expectedOutput uint64 + }{ + { + "globalGasCap is below default gas", + 25000000, + TransactionArgs{ + Gas: nil, + Input: nil, + }, + 25000000, + }, + { + "globalGasCap is above default gas", + math.MaxInt64, + TransactionArgs{ + Gas: nil, + Input: nil, + }, + 100000000, + }, + { + "globalGasCap is zero", + 0, + TransactionArgs{ + Gas: nil, + Input: nil, + }, + 100000000, + }, + } + for _, tc := range testCases { + res, err := tc.txArgs.ToMessage(tc.globalGasCap, nil) + suite.Require().Nil(err) + suite.Require().Equal(res.GasLimit, tc.expectedOutput) + } +} + +// --------------------------------------------------------------------------- +// ToSimMessage +// --------------------------------------------------------------------------- + +func (suite *TxDataTestSuite) TestToSimMessage() { + chainID := big.NewInt(9001) + baseFee := big.NewInt(1e9) + + testCases := []struct { + name string + txArgs TransactionArgs + baseFee *big.Int + skipNonce bool + expError bool + }{ + { + "empty args, no basefee, skip nonce", + TransactionArgs{}, + nil, + true, + false, + }, + { + "both gasPrice and maxFeePerGas specified", + TransactionArgs{ + GasPrice: &suite.hexBigInt, + MaxFeePerGas: &suite.hexBigInt, + }, + nil, + false, + true, + }, + { + "non-1559: gasPrice specified", + TransactionArgs{ + From: &suite.addr, + To: &suite.addr, + Gas: &suite.hexUint64, + GasPrice: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + }, + nil, + false, + false, + }, + { + "1559: gasPrice specified with basefee (legacy conversion)", + TransactionArgs{ + From: &suite.addr, + To: &suite.addr, + Gas: &suite.hexUint64, + GasPrice: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + }, + baseFee, + false, + false, + }, + { + "1559: maxFeePerGas and maxPriorityFeePerGas", + TransactionArgs{ + From: &suite.addr, + To: &suite.addr, + Gas: &suite.hexUint64, + MaxFeePerGas: &suite.hexBigInt, + MaxPriorityFeePerGas: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + }, + baseFee, + true, + false, + }, + { + "1559: nil MaxFeePerGas and nil MaxPriorityFeePerGas with basefee", + TransactionArgs{ + From: &suite.addr, + To: &suite.addr, + Nonce: &suite.hexUint64, + }, + baseFee, + true, + false, + }, + { + "with access list and authorization list", + TransactionArgs{ + From: &suite.addr, + To: &suite.addr, + Gas: &suite.hexUint64, + MaxFeePerGas: &suite.hexBigInt, + MaxPriorityFeePerGas: &suite.hexBigInt, + AccessList: ðtypes.AccessList{{Address: suite.addr}}, + ChainID: (*hexutil.Big)(chainID), + Nonce: &suite.hexUint64, + }, + baseFee, + false, + false, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + msg, err := tc.txArgs.ToSimMessage(tc.baseFee, tc.skipNonce) + if tc.expError { + suite.Require().Error(err) + } else { + suite.Require().NoError(err) + suite.Require().NotNil(msg) + suite.Require().Equal(tc.skipNonce, msg.SkipNonceChecks) + suite.Require().True(msg.SkipTransactionChecks) + } + }) + } +} + +// --------------------------------------------------------------------------- +// CallDefaults +// --------------------------------------------------------------------------- + +func (suite *TxDataTestSuite) TestCallDefaults() { + chainID := big.NewInt(9001) + wrongChainID := big.NewInt(1) + baseFee := big.NewInt(1e9) + + testCases := []struct { + name string + txArgs TransactionArgs + globalGas uint64 + baseFee *big.Int + chainID *big.Int + expError bool + expErrMsg string + }{ + { + "empty args - nil chainID set from provided", + TransactionArgs{}, + 0, + nil, + chainID, + false, + "", + }, + { + "both gasPrice and maxFeePerGas error", + TransactionArgs{ + GasPrice: &suite.hexBigInt, + MaxFeePerGas: &suite.hexBigInt, + }, + 0, + nil, + chainID, + true, + "both gasPrice and", + }, + { + "chainID mismatch error", + TransactionArgs{ + ChainID: (*hexutil.Big)(wrongChainID), + }, + 0, + nil, + chainID, + true, + "chainId does not match", + }, + { + "nil gas with globalGasCap 0 - gets MaxUint64/2", + TransactionArgs{}, + 0, + nil, + chainID, + false, + "", + }, + { + "nil gas with globalGasCap > 0", + TransactionArgs{}, + 25_000_000, + nil, + chainID, + false, + "", + }, + { + "gas exceeds globalGasCap - capped", + TransactionArgs{ + Gas: (*hexutil.Uint64)(func() *uint64 { g := uint64(50_000_000); return &g }()), + }, + 25_000_000, + nil, + chainID, + false, + "", + }, + { + "no baseFee - sets GasPrice to zero", + TransactionArgs{}, + 0, + nil, + chainID, + false, + "", + }, + { + "with baseFee - sets MaxFeePerGas and MaxPriorityFeePerGas", + TransactionArgs{}, + 0, + baseFee, + chainID, + false, + "", + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + err := tc.txArgs.CallDefaults(tc.globalGas, tc.baseFee, tc.chainID) + if tc.expError { + suite.Require().Error(err) + if tc.expErrMsg != "" { + suite.Require().Contains(err.Error(), tc.expErrMsg) + } + } else { + suite.Require().NoError(err) + // Gas should always be set + suite.Require().NotNil(tc.txArgs.Gas) + // Nonce, Value should be set + suite.Require().NotNil(tc.txArgs.Nonce) + suite.Require().NotNil(tc.txArgs.Value) + } + }) + } +} + +// --------------------------------------------------------------------------- +// ToEthTransaction +// --------------------------------------------------------------------------- + +func (suite *TxDataTestSuite) TestToEthTransaction() { + chainID := big.NewInt(9001) + + testCases := []struct { + name string + txArgs TransactionArgs + }{ + { + "legacy tx - default case", + TransactionArgs{ + To: &suite.addr, + Gas: &suite.hexUint64, + GasPrice: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + }, + }, + { + "access list tx", + TransactionArgs{ + To: &suite.addr, + Gas: &suite.hexUint64, + GasPrice: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + AccessList: ðtypes.AccessList{{Address: suite.addr}}, + ChainID: (*hexutil.Big)(chainID), + }, + }, + { + "dynamic fee tx", + TransactionArgs{ + To: &suite.addr, + Gas: &suite.hexUint64, + MaxFeePerGas: &suite.hexBigInt, + MaxPriorityFeePerGas: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + ChainID: (*hexutil.Big)(chainID), + }, + }, + { + "nil gas and nonce", + TransactionArgs{ + To: &suite.addr, + }, + }, + { + "contract creation (nil To)", + TransactionArgs{ + Gas: &suite.hexUint64, + GasPrice: &suite.hexBigInt, + Value: &suite.hexBigInt, + Nonce: &suite.hexUint64, + Data: &suite.hexDataBytes, + }, + }, + } + + for _, tc := range testCases { + suite.Run(tc.name, func() { + tx := tc.txArgs.ToEthTransaction() + suite.Require().NotNil(tx) + }) + } +} + +// --------------------------------------------------------------------------- +// ToTransaction — SetCodeTx branch +// --------------------------------------------------------------------------- + +func (suite *TxDataTestSuite) TestToTransactionSetCode() { + chainID := big.NewInt(9001) + nonce := hexutil.Uint64(1) + gas := hexutil.Uint64(21000) + val := hexutil.Big(*big.NewInt(0)) + maxFee := hexutil.Big(*big.NewInt(2e9)) + maxTip := hexutil.Big(*big.NewInt(1e8)) + + authList := []ethtypes.SetCodeAuthorization{ + {Address: suite.addr}, + } + + args := TransactionArgs{ + To: &suite.addr, + ChainID: (*hexutil.Big)(chainID), + Nonce: &nonce, + Gas: &gas, + Value: &val, + MaxFeePerGas: &maxFee, + MaxPriorityFeePerGas: &maxTip, + AuthorizationList: authList, + } + tx := args.ToTransaction() + suite.Require().NotNil(tx) +} + +// --------------------------------------------------------------------------- +// ToEthTransaction — SetCodeTx branch +// --------------------------------------------------------------------------- + +func (suite *TxDataTestSuite) TestToEthTransactionSetCode() { + chainID := big.NewInt(9001) + nonce := hexutil.Uint64(1) + gas := hexutil.Uint64(21000) + val := hexutil.Big(*big.NewInt(0)) + maxFee := hexutil.Big(*big.NewInt(2e9)) + maxTip := hexutil.Big(*big.NewInt(1e8)) + + authList := []ethtypes.SetCodeAuthorization{ + {Address: suite.addr}, + } + + args := TransactionArgs{ + To: &suite.addr, + ChainID: (*hexutil.Big)(chainID), + Nonce: &nonce, + Gas: &gas, + Value: &val, + MaxFeePerGas: &maxFee, + MaxPriorityFeePerGas: &maxTip, + AuthorizationList: authList, + } + tx := args.ToEthTransaction() + suite.Require().NotNil(tx) + suite.Require().Equal(uint8(ethtypes.SetCodeTxType), tx.Type()) +} diff --git a/x/evm/types/tx_data.go b/x/evm/types/tx_data.go index 99243d5e09..4e5dcb6992 100644 --- a/x/evm/types/tx_data.go +++ b/x/evm/types/tx_data.go @@ -26,6 +26,7 @@ var ( _ TxData = &LegacyTx{} _ TxData = &AccessListTx{} _ TxData = &DynamicFeeTx{} + _ TxData = &SetCodeTx{} ) // TxData implements the Ethereum transaction tx structure. It is used @@ -72,6 +73,8 @@ func NewTxDataFromTx(tx *ethtypes.Transaction) (TxData, error) { txData, err = newDynamicFeeTx(tx) case ethtypes.AccessListTxType: txData, err = newAccessListTx(tx) + case ethtypes.SetCodeTxType: + txData, err = newSetCodeTx(tx) default: txData, err = newLegacyTx(tx) } diff --git a/x/evm/types/utils.go b/x/evm/types/utils.go index 72b9f451ce..6f139e1d01 100644 --- a/x/evm/types/utils.go +++ b/x/evm/types/utils.go @@ -16,6 +16,7 @@ package types import ( + "bytes" "encoding/hex" "encoding/json" "fmt" @@ -29,10 +30,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" + ethermint "github.com/evmos/ethermint/types" ) // DefaultPriorityReduction is the default amount of price values required for 1 unit of priority. @@ -76,10 +77,6 @@ func DecodeTxResponses(in []byte) ([]*MsgEthereumTxResponse, error) { } func logsFromTxResponse(dst []*ethtypes.Log, rsp *MsgEthereumTxResponse, blockNumber uint64) []*ethtypes.Log { - if len(rsp.Logs) == 0 { - return nil - } - if dst == nil { dst = make([]*ethtypes.Log, 0, len(rsp.Logs)) } @@ -211,7 +208,7 @@ func UnwrapEthereumMsg(tx *sdk.Tx, ethHash common.Hash) (*MsgEthereumTx, error) } // BinSearch execute the binary search and hone in on an executable gas limit -func BinSearch(lo, hi uint64, executable func(uint64) (bool, *MsgEthereumTxResponse, error)) (uint64, error) { +func BinSearch(lo, hi uint64, executable func(uint64) (bool, *EVMResult, error)) (uint64, error) { for lo+1 < hi { mid := (hi + lo) / 2 failed, _, err := executable(mid) @@ -233,7 +230,7 @@ func BinSearch(lo, hi uint64, executable func(uint64) (bool, *MsgEthereumTxRespo // EffectiveGasPrice compute the effective gas price based on eip-1159 rules // `effectiveGasPrice = min(baseFee + tipCap, feeCap)` func EffectiveGasPrice(baseFee *big.Int, feeCap *big.Int, tipCap *big.Int) *big.Int { - return math.BigMin(new(big.Int).Add(tipCap, baseFee), feeCap) + return ethermint.BigMin(new(big.Int).Add(tipCap, baseFee), feeCap) } // HexAddress encode ethereum address without checksum, faster to run for state machine @@ -255,3 +252,8 @@ func GetBaseFee(height int64, ethCfg *params.ChainConfig, feemarketParams *feema } return baseFee } + +// IsEmptyCodeHash checks if the given byte slice represents an empty code hash. +func IsEmptyCodeHash(bz []byte) bool { + return bytes.Equal(bz, EmptyCodeHash) +} diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index b9f3ccf98e..801c97b811 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -70,11 +70,11 @@ func TestUnwrapEthererumMsg(t *testing.T) { } func TestBinSearch(t *testing.T) { - success_executable := func(gas uint64) (bool, *evmtypes.MsgEthereumTxResponse, error) { + success_executable := func(gas uint64) (bool, *evmtypes.EVMResult, error) { target := uint64(21000) return gas < target, nil, nil } - failed_executable := func(gas uint64) (bool, *evmtypes.MsgEthereumTxResponse, error) { + failed_executable := func(gas uint64) (bool, *evmtypes.EVMResult, error) { return true, nil, errors.New("contract failed") } diff --git a/x/feemarket/keeper/abci.go b/x/feemarket/keeper/abci.go index d721496da9..b96b305e32 100644 --- a/x/feemarket/keeper/abci.go +++ b/x/feemarket/keeper/abci.go @@ -17,13 +17,13 @@ package keeper import ( "fmt" - "math" "github.com/evmos/ethermint/x/feemarket/types" sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" + ethermint "github.com/evmos/ethermint/types" ) // BeginBlock updates base fee @@ -38,7 +38,7 @@ func (k *Keeper) BeginBlock(ctx sdk.Context) error { k.SetBaseFee(ctx, baseFee) defer func() { - telemetry.SetGauge(float32(baseFee.Int64()), "feemarket", "base_fee") + telemetry.SetGauge(float32(baseFee.Int64()), "feemarket", "base_fee") //nolint:staticcheck }() // Store current base fee in event @@ -56,14 +56,13 @@ func (k *Keeper) BeginBlock(ctx sdk.Context) error { // an empty slice. func (k *Keeper) EndBlock(ctx sdk.Context) error { gasWanted := ctx.BlockGasWanted() - gasUsed := ctx.BlockGasUsed() - - if gasWanted > math.MaxInt64 { - return fmt.Errorf("integer overflow by integer type conversion. Gas wanted %d > MaxInt64", gasWanted) + gw, err := ethermint.SafeInt64(gasWanted) + if err != nil { + return err } - - if gasUsed > math.MaxInt64 { - return fmt.Errorf("integer overflow by integer type conversion. Gas used %d > MaxInt64", gasUsed) + gasUsed, err := ethermint.SafeInt64(ctx.BlockGasUsed()) + if err != nil { + return err } // to prevent BaseFee manipulation we limit the gasWanted so that @@ -71,12 +70,12 @@ func (k *Keeper) EndBlock(ctx sdk.Context) error { // this will be keep BaseFee protected from un-penalized manipulation // more info here https://github.com/evmos/ethermint/pull/1105#discussion_r888798925 minGasMultiplier := k.GetParams(ctx).MinGasMultiplier - limitedGasWanted := sdkmath.LegacyNewDec(int64(gasWanted)).Mul(minGasMultiplier) - gasWanted = sdkmath.LegacyMaxDec(limitedGasWanted, sdkmath.LegacyNewDec(int64(gasUsed))).TruncateInt().Uint64() + limitedGasWanted := sdkmath.LegacyNewDec(gw).Mul(minGasMultiplier) + gasWanted = sdkmath.LegacyMaxDec(limitedGasWanted, sdkmath.LegacyNewDec(gasUsed)).TruncateInt().Uint64() k.SetBlockGasWanted(ctx, gasWanted) defer func() { - telemetry.SetGauge(float32(gasWanted), "feemarket", "block_gas") + telemetry.SetGauge(float32(gasWanted), "feemarket", "block_gas") //nolint:staticcheck }() ctx.EventManager().EmitEvent(sdk.NewEvent( diff --git a/x/feemarket/keeper/abci_test.go b/x/feemarket/keeper/abci_test.go index fad8f3b284..52f6552aa0 100644 --- a/x/feemarket/keeper/abci_test.go +++ b/x/feemarket/keeper/abci_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" "github.com/evmos/ethermint/testutil" "github.com/stretchr/testify/suite" ) diff --git a/x/feemarket/keeper/eip1559.go b/x/feemarket/keeper/eip1559.go index 0a6d53fc99..0d30b5a85f 100644 --- a/x/feemarket/keeper/eip1559.go +++ b/x/feemarket/keeper/eip1559.go @@ -22,7 +22,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" + ethermint "github.com/evmos/ethermint/types" ) // CalculateBaseFee calculates the base fee for the current block. This is only calculated once per @@ -83,7 +83,7 @@ func (k Keeper) CalculateBaseFee(ctx sdk.Context) *big.Int { gasUsedDelta := new(big.Int).SetUint64(parentGasUsed - parentGasTarget) x := new(big.Int).Mul(parentBaseFee, gasUsedDelta) y := x.Div(x, parentGasTargetBig) - baseFeeDelta := math.BigMax( + baseFeeDelta := ethermint.BigMax( x.Div(y, baseFeeChangeDenominator), common.Big1, ) @@ -101,5 +101,5 @@ func (k Keeper) CalculateBaseFee(ctx sdk.Context) *big.Int { // Set global min gas price as lower bound of the base fee, transactions below // the min gas price don't even reach the mempool. minGasPrice := params.MinGasPrice.TruncateInt().BigInt() - return math.BigMax(x.Sub(parentBaseFee, baseFeeDelta), minGasPrice) + return ethermint.BigMax(x.Sub(parentBaseFee, baseFeeDelta), minGasPrice) } diff --git a/x/feemarket/keeper/grpc_query.go b/x/feemarket/keeper/grpc_query.go index 82ea42b6bd..d77be6d5ff 100644 --- a/x/feemarket/keeper/grpc_query.go +++ b/x/feemarket/keeper/grpc_query.go @@ -21,6 +21,7 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + ethermint "github.com/evmos/ethermint/types" "github.com/evmos/ethermint/x/feemarket/types" ) @@ -54,9 +55,11 @@ func (k Keeper) BaseFee(c context.Context, _ *types.QueryBaseFeeRequest) (*types // BlockGas implements the Query/BlockGas gRPC method func (k Keeper) BlockGas(c context.Context, _ *types.QueryBlockGasRequest) (*types.QueryBlockGasResponse, error) { ctx := sdk.UnwrapSDKContext(c) - gas := k.GetBlockGasWanted(ctx) - + gas, err := ethermint.SafeInt64(k.GetBlockGasWanted(ctx)) + if err != nil { + return nil, err + } return &types.QueryBlockGasResponse{ - Gas: int64(gas), + Gas: gas, }, nil } diff --git a/x/feemarket/keeper/keeper.go b/x/feemarket/keeper/keeper.go index 94730358e1..cef2a0ed81 100644 --- a/x/feemarket/keeper/keeper.go +++ b/x/feemarket/keeper/keeper.go @@ -18,9 +18,9 @@ package keeper import ( "math/big" - "cosmossdk.io/log" - storetypes "cosmossdk.io/store/types" + "cosmossdk.io/log/v2" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/evmos/ethermint/x/feemarket/types" diff --git a/x/feemarket/migrations/v4/migrate.go b/x/feemarket/migrations/v4/migrate.go index 66a1fdb2de..acc2150e10 100644 --- a/x/feemarket/migrations/v4/migrate.go +++ b/x/feemarket/migrations/v4/migrate.go @@ -1,8 +1,8 @@ package v4 import ( - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/evmos/ethermint/x/feemarket/types" ) diff --git a/x/feemarket/migrations/v4/migrate_test.go b/x/feemarket/migrations/v4/migrate_test.go index f92ec545eb..bb54230fe7 100644 --- a/x/feemarket/migrations/v4/migrate_test.go +++ b/x/feemarket/migrations/v4/migrate_test.go @@ -3,7 +3,7 @@ package v4_test import ( "testing" - storetypes "cosmossdk.io/store/types" + storetypes "github.com/cosmos/cosmos-sdk/store/v2/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/evmos/ethermint/encoding" diff --git a/x/feemarket/module.go b/x/feemarket/module.go index 68fdb89505..036d646058 100644 --- a/x/feemarket/module.go +++ b/x/feemarket/module.go @@ -20,12 +20,9 @@ import ( "encoding/json" "fmt" - "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/cometbft/cometbft/abci/types" - "cosmossdk.io/core/appmodule" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -41,11 +38,13 @@ import ( ) var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} - - _ appmodule.HasEndBlocker = AppModule{} - _ appmodule.HasBeginBlocker = AppModule{} + _ module.AppModuleSimulation = (*AppModule)(nil) + _ module.HasGenesis = AppModule{} + _ module.HasServices = (*AppModule)(nil) + _ appmodule.AppModule = (*AppModule)(nil) + _ appmodule.HasEndBlocker = AppModule{} + _ appmodule.HasBeginBlocker = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} ) // AppModuleBasic defines the basic application module used by the fee market module. @@ -62,7 +61,7 @@ func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { } // ConsensusVersion returns the consensus state-breaking version for the module. -func (AppModuleBasic) ConsensusVersion() uint64 { +func (AppModule) ConsensusVersion() uint64 { return 4 } @@ -82,11 +81,6 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingCo return genesisState.Validate() } -// RegisterRESTRoutes performs a no-op as the EVM module doesn't expose REST -// endpoints -func (AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) { -} - func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) { if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil { panic(err) @@ -127,15 +121,6 @@ func NewAppModule(k keeper.Keeper, ss types.Subspace) AppModule { } } -// Name returns the fee market module's name. -func (AppModule) Name() string { - return types.ModuleName -} - -// RegisterInvariants interface for registering invariants. Performs a no-op -// as the fee market module doesn't expose invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} - // RegisterServices registers the GRPC query service and migrator service to respond to the // module-specific GRPC queries and handle the upgrade store migration for the module. func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -161,12 +146,11 @@ func (am AppModule) EndBlock(ctx context.Context) error { // InitGenesis performs genesis initialization for the fee market module. It returns // no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} } // ExportGenesis returns the exported genesis state as raw bytes for the fee market diff --git a/x/feemarket/types/codec.go b/x/feemarket/types/codec.go index 9899e9cdf9..c89f05ac1d 100644 --- a/x/feemarket/types/codec.go +++ b/x/feemarket/types/codec.go @@ -14,7 +14,7 @@ var ( ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) // AminoCdc is a amino codec created to support amino JSON compatible msgs. - AminoCdc = codec.NewAminoCodec(amino) //nolint:staticcheck + AminoCdc = codec.NewLegacyAmino() ) const ( diff --git a/x/feemarket/types/msg.go b/x/feemarket/types/msg.go index 71d49fdbc9..f24cef817f 100644 --- a/x/feemarket/types/msg.go +++ b/x/feemarket/types/msg.go @@ -7,12 +7,6 @@ import ( var _ sdk.Msg = &MsgUpdateParams{} -// GetSigners returns the expected signers for a MsgUpdateParams message. -func (m *MsgUpdateParams) GetSigners() []sdk.AccAddress { - addr := sdk.MustAccAddressFromBech32(m.Authority) - return []sdk.AccAddress{addr} -} - // ValidateBasic does a sanity check of the provided data func (m *MsgUpdateParams) ValidateBasic() error { if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { @@ -21,8 +15,3 @@ func (m *MsgUpdateParams) ValidateBasic() error { return m.Params.Validate() } - -// GetSignBytes implements the LegacyMsg interface. -func (m MsgUpdateParams) GetSignBytes() []byte { - return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&m)) -}