diff --git a/.github/codecov.yml b/.github/codecov.yml index b286094391..8a1bf7a4e9 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -16,4 +16,5 @@ ignore: - p2p - adapters/core2p2p - adapters/p2p2core - - docs \ No newline at end of file + - docs + - "**/*_enumer.go" \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..194c6f87cd --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "cargo" + directory: "/vm/rust" + schedule: + interval: "weekly" diff --git a/.github/workflow-scripts/verify_deployment.sh b/.github/workflow-scripts/verify_deployment.sh index b2a2682b3e..be70f828b4 100644 --- a/.github/workflow-scripts/verify_deployment.sh +++ b/.github/workflow-scripts/verify_deployment.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -ux + URL=$1 EXPECTED_VERSION=$2 MAX_ATTEMPTS=30 diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml deleted file mode 100644 index cdd37ab00c..0000000000 --- a/.github/workflows/build-and-deploy.yml +++ /dev/null @@ -1,166 +0,0 @@ -name: Docker Build, Publish and Deploy - -on: - push: - branches: [main] - tags: ['v*'] - workflow_dispatch: - -permissions: - id-token: write - contents: write - -jobs: - docker_build_and_publish: - runs-on: ubuntu-latest - outputs: - IMAGE_TAG: ${{ steps.image_tag.outputs.IMAGE_TAG }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Define_docker_image_tag - id: image_tag - run: | - echo "DOCKER_IMAGE_TAG=$(git describe --tags)" >> $GITHUB_ENV - echo "IMAGE_TAG=$(git describe --tags)" >> "$GITHUB_OUTPUT" - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and Push - uses: docker/build-push-action@v5 - with: - context: . - platforms: 'linux/amd64' - push: true - tags: nethermindeth/juno:${{ env.DOCKER_IMAGE_TAG }} - - deploy_to_dev: - permissions: - id-token: write - contents: write - needs: [docker_build_and_publish] - runs-on: ubuntu-latest - environment: - name: Development - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Repository Dispatch Dev - env: - EVENT_NAME: juno-dev - IMAGE_TAG: ${{ needs.docker_build_and_publish.outputs.IMAGE_TAG }} - SEPOLIA: apps/juno-dev/overlays/dev-sepolia/config.yaml - run: | - curl -L \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/repos/NethermindEth/argo/dispatches \ - -d '{"event_type": "${{ env.EVENT_NAME }}", "client_payload":{"name": "${{ env.EVENT_NAME }}", "sepolia_config": "${{ env.SEPOLIA }}", "tag": "${{ env.IMAGE_TAG }}"}}' - - - name: Verify Deployment Version (Dev) - run: bash .github/workflow-scripts/verify_deployment.sh ${{ secrets.DEV_SEPOLIA_URL }} ${{ needs.docker_build_and_publish.outputs.IMAGE_TAG }} - - dev-starknet-rs-tests: - needs: [deploy_to_dev] - uses: ./.github/workflows/starknet-rs-tests.yml - secrets: - STARKNET_RPC: ${{ secrets.DEV_SEPOLIA_URL }}/v0_6 - - dev-starknet-js-tests: - needs: [deploy_to_dev] - uses: ./.github/workflows/starknet-js-tests.yml - secrets: - TEST_RPC_URL: ${{ secrets.DEV_SEPOLIA_URL }}/v0_7 - TEST_ACCOUNT_ADDRESS: ${{ secrets.TEST_ACCOUNT_ADDRESS }} - TEST_ACCOUNT_PRIVATE_KEY: ${{ secrets.TEST_ACCOUNT_PRIVATE_KEY }} - - deploy_to_staging: - needs: [docker_build_and_publish, deploy_to_dev] - runs-on: ubuntu-latest - environment: - name: Staging - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Repository Dispatch Staging - env: - EVENT_NAME: juno-staging - IMAGE_TAG: ${{ needs.docker_build_and_publish.outputs.IMAGE_TAG }} - MAINNET: apps/juno-staging/overlays/staging-mainnet/config.yaml - SEPOLIA: apps/juno-staging/overlays/staging-sepolia/config.yaml - SEPOLIA_INTEGRATION: apps/juno-staging/overlays/staging-sepolia-integration/config.yaml - run: | - curl -L \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/repos/NethermindEth/argo/dispatches \ - -d '{"event_type": "${{ env.EVENT_NAME }}", "client_payload":{"name": "${{ env.EVENT_NAME }}", "mainnet_config": "${{ env.MAINNET }}", "sepolia_config": "${{ env.SEPOLIA }}", "sepolia_integration_config": "${{ env.SEPOLIA_INTEGRATION}}", "tag": "${{ env.IMAGE_TAG }}"}}' - - - name: Verify Deployment Version (Staging) - run: bash .github/workflow-scripts/verify_deployment.sh ${{ secrets.STAGING_SEPOLIA_URL }} ${{ needs.docker_build_and_publish.outputs.IMAGE_TAG }} - - staging-starknet-rs-tests: - needs: [deploy_to_staging] - uses: ./.github/workflows/starknet-rs-tests.yml - secrets: - STARKNET_RPC: ${{ secrets.STAGING_SEPOLIA_URL }}/v0_6 - - staging-starknet-js-tests: - needs: [deploy_to_staging] - uses: ./.github/workflows/starknet-js-tests.yml - secrets: - TEST_RPC_URL: ${{ secrets.STAGING_SEPOLIA_URL }}/v0_7 - TEST_ACCOUNT_ADDRESS: ${{ secrets.TEST_ACCOUNT_ADDRESS }} - TEST_ACCOUNT_PRIVATE_KEY: ${{ secrets.TEST_ACCOUNT_PRIVATE_KEY }} - - deploy_to_production: - needs: [docker_build_and_publish, deploy_to_staging] - runs-on: ubuntu-latest - environment: - name: Production - steps: - - name: Repository Dispatch Prod - env: - EVENT_NAME: juno-prod - IMAGE_TAG: ${{ needs.docker_build_and_publish.outputs.IMAGE_TAG }} - MAINNET: apps/juno-prod/overlays/prod-mainnet/config.yaml - SEPOLIA: apps/juno-prod/overlays/prod-sepolia/config.yaml - SEPOLIA_INTEGRATION: apps/juno-prod/overlays/prod-sepolia-integration/config.yaml - run: | - curl -L \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/repos/NethermindEth/argo/dispatches \ - -d '{"event_type": "${{ env.EVENT_NAME }}", "client_payload":{"name": "${{ env.EVENT_NAME }}", "mainnet_config": "${{ env.MAINNET }}", "sepolia_config": "${{ env.SEPOLIA }}", "sepolia_integration_config": "${{ env.SEPOLIA_INTEGRATION }}", "tag": "${{ env.IMAGE_TAG }}"}}' - - prod-starknet-rs-tests: - needs: [deploy_to_production] - uses: ./.github/workflows/starknet-rs-tests.yml - secrets: - STARKNET_RPC: ${{ secrets.PROD_SEPOLIA_URL }}/v0_6 - - prod-starknet-js-tests: - needs: [deploy_to_production] - uses: ./.github/workflows/starknet-js-tests.yml - secrets: - TEST_RPC_URL: ${{ secrets.PROD_SEPOLIA_URL }}/v0_7 - TEST_ACCOUNT_ADDRESS: ${{ secrets.TEST_ACCOUNT_ADDRESS }} - TEST_ACCOUNT_PRIVATE_KEY: ${{ secrets.TEST_ACCOUNT_PRIVATE_KEY }} \ No newline at end of file diff --git a/.github/workflows/build-binaries.yml b/.github/workflows/build-binaries.yml index 4ddc807123..0d7212e9ed 100644 --- a/.github/workflows/build-binaries.yml +++ b/.github/workflows/build-binaries.yml @@ -16,13 +16,13 @@ jobs: architecture: amd64 - os: macOS-latest architecture: amd64 - - os: self-hosted + - os: ubuntu-arm64-4-core architecture: arm64 runs-on: ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -30,7 +30,7 @@ jobs: id: tag run: echo "TAG=$(git describe --tags)" >> $GITHUB_ENV - - name: Install dependencies (Ubuntu or self-hosted) + - name: Install dependencies (Linux) if: runner.os == 'Linux' run: sudo apt-get update -qq && sudo apt-get install -y upx-ucl build-essential cargo git golang libjemalloc-dev libjemalloc2 -y @@ -39,7 +39,7 @@ jobs: run: brew install upx cargo-c jemalloc - name: Set up Go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.2 with: go-version-file: go.mod diff --git a/.github/workflows/ci-cd-pipeline.yml b/.github/workflows/ci-cd-pipeline.yml new file mode 100644 index 0000000000..0c4c3da0b7 --- /dev/null +++ b/.github/workflows/ci-cd-pipeline.yml @@ -0,0 +1,171 @@ +name: CI/CD pipeline + +env: + DOCKER_REGISTRY: nethermind.jfrog.io + + REPO_DEV: nubia-docker-local-dev + REPO_STAGING: nubia-docker-local-staging + REPO_PROD: nubia-docker-local-prod + + +on: + push: + branches: [main] + tags: ["v*"] + workflow_dispatch: + +permissions: + id-token: write + contents: write + +jobs: + build_docker_image: + runs-on: ubuntu-latest + outputs: + DOCKER_IMAGE_TAG: ${{ steps.set_tag.outputs.DOCKER_IMAGE_TAG }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Define image tag + id: set_tag + run: | + export DOCKER_IMAGE_TAG=$(git describe --tags) + + # This one is to be able to use the image tag in the next steps in this job + echo "DOCKER_IMAGE_TAG=$DOCKER_IMAGE_TAG" >> $GITHUB_ENV + + # This one is to be able to use the image tag in the next jobs + echo "DOCKER_IMAGE_TAG=$DOCKER_IMAGE_TAG" >> $GITHUB_OUTPUT + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to registry + run: | + docker login ${{ env.DOCKER_REGISTRY }} -u ${{ vars.ARTIFACTORY_NUBIA_USER }} -p ${{ secrets.ARTIFACTORY_NUBIA_CONTRIBUTOR}} + + - name: Build and Push + uses: docker/build-push-action@v6 + with: + context: . + platforms: "linux/amd64" + push: true + tags: ${{ env.DOCKER_REGISTRY }}/${{ env.REPO_DEV }}/juno:${{ env.DOCKER_IMAGE_TAG }} + + + validate_dev: + permissions: + id-token: write + contents: write + needs: [build_docker_image] + runs-on: ubuntu-latest + environment: + name: Development + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Verify Deployment Version (Dev) + run: | + bash .github/workflow-scripts/verify_deployment.sh ${{ secrets.DEV_SEPOLIA_URL }} ${{ needs.build_docker_image.outputs.DOCKER_IMAGE_TAG }} + + dev-starknet-rs-tests: + needs: [validate_dev] + uses: ./.github/workflows/starknet-rs-tests.yml + secrets: + STARKNET_RPC: ${{ secrets.DEV_SEPOLIA_URL }}/v0_6 + + dev-starknet-js-tests: + needs: [validate_dev] + uses: ./.github/workflows/starknet-js-tests.yml + secrets: + TEST_RPC_URL: ${{ secrets.DEV_SEPOLIA_URL }}/v0_7 + TEST_ACCOUNT_ADDRESS: ${{ secrets.TEST_ACCOUNT_ADDRESS }} + TEST_ACCOUNT_PRIVATE_KEY: ${{ secrets.TEST_ACCOUNT_PRIVATE_KEY }} + + promote_to_staging: + needs: [build_docker_image, validate_dev] + runs-on: ubuntu-latest + environment: + name: Staging + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to registry + run: | + docker login ${{ env.DOCKER_REGISTRY }} -u ${{ vars.ARTIFACTORY_NUBIA_USER }} -p ${{ secrets.ARTIFACTORY_NUBIA_CONTRIBUTOR}} + + - name: Promote to Staging + run: | + OLD_TAG=${{ env.DOCKER_REGISTRY }}/${{ env.REPO_DEV }}/juno:${{ needs.build_docker_image.outputs.DOCKER_IMAGE_TAG }} + NEW_TAG=${{ env.DOCKER_REGISTRY }}/${{ env.REPO_STAGING }}/juno:${{ needs.build_docker_image.outputs.DOCKER_IMAGE_TAG }} + + docker pull $OLD_TAG + docker tag $OLD_TAG $NEW_TAG + docker push $NEW_TAG + + - name: Verify Deployment Version (Staging) + run: | + bash .github/workflow-scripts/verify_deployment.sh ${{ secrets.STAGING_SEPOLIA_URL }} ${{ needs.build_docker_image.outputs.DOCKER_IMAGE_TAG }} + + staging-starknet-rs-tests: + needs: [promote_to_staging] + uses: ./.github/workflows/starknet-rs-tests.yml + secrets: + STARKNET_RPC: ${{ secrets.STAGING_SEPOLIA_URL }}/v0_6 + + staging-starknet-js-tests: + needs: [promote_to_staging] + uses: ./.github/workflows/starknet-js-tests.yml + secrets: + TEST_RPC_URL: ${{ secrets.STAGING_SEPOLIA_URL }}/v0_7 + TEST_ACCOUNT_ADDRESS: ${{ secrets.TEST_ACCOUNT_ADDRESS }} + TEST_ACCOUNT_PRIVATE_KEY: ${{ secrets.TEST_ACCOUNT_PRIVATE_KEY }} + + promote_to_production: + needs: [build_docker_image, promote_to_staging] + runs-on: ubuntu-latest + environment: + name: Production + steps: + - name: Login to registry + run: | + docker login ${{ env.DOCKER_REGISTRY }} -u ${{ vars.ARTIFACTORY_NUBIA_USER }} -p ${{ secrets.ARTIFACTORY_NUBIA_CONTRIBUTOR}} + + - name: Promote to Production + run: | + OLD_TAG=${{ env.DOCKER_REGISTRY }}/${{ env.REPO_STAGING }}/juno:${{ needs.build_docker_image.outputs.DOCKER_IMAGE_TAG }} + NEW_TAG=${{ env.DOCKER_REGISTRY }}/${{ env.REPO_PROD }}/juno:${{ needs.build_docker_image.outputs.DOCKER_IMAGE_TAG }} + + docker pull $OLD_TAG + docker tag $OLD_TAG $NEW_TAG + docker push $NEW_TAG + + test_in_production: + needs: [promote_to_production] + runs-on: ubuntu-latest + environment: + name: ProductionTests # Artificial gate to enforce manual approval + steps: + - name: Starting production tests + run: | + echo "Tests in production will start shortly." + + prod-starknet-rs-tests: + needs: [test_in_production] + uses: ./.github/workflows/starknet-rs-tests.yml + secrets: + STARKNET_RPC: ${{ secrets.PROD_SEPOLIA_URL }}/v0_6 + + prod-starknet-js-tests: + needs: [test_in_production] + uses: ./.github/workflows/starknet-js-tests.yml + secrets: + TEST_RPC_URL: ${{ secrets.PROD_SEPOLIA_URL }}/v0_7 + TEST_ACCOUNT_ADDRESS: ${{ secrets.TEST_ACCOUNT_ADDRESS }} + TEST_ACCOUNT_PRIVATE_KEY: ${{ secrets.TEST_ACCOUNT_PRIVATE_KEY }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index df82874073..9efe8a23b9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,11 +38,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -53,7 +53,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # 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@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -67,4 +67,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/docker-image-build-push.yml b/.github/workflows/docker-image-build-push.yml index 153770f583..a0daf4ac0a 100644 --- a/.github/workflows/docker-image-build-push.yml +++ b/.github/workflows/docker-image-build-push.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -29,13 +29,13 @@ jobs: uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: . platforms: 'linux/amd64' @@ -44,10 +44,10 @@ jobs: build_and_push_docker_image_arm: if: github.repository_owner == 'NethermindEth' - runs-on: self-hosted + runs-on: ubuntu-arm64-4-core steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -55,13 +55,13 @@ jobs: uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push ARM - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: . platforms: 'linux/arm64' @@ -81,7 +81,7 @@ jobs: uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index de21ff8a5e..28451b2ffd 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -14,7 +14,7 @@ jobs: name: Deploy to GitHub Pages runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version-file: docs/.nvmrc diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 4536100089..2874fa57c6 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -10,7 +10,7 @@ jobs: name: Test deployment runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: node-version-file: docs/.nvmrc diff --git a/.github/workflows/juno-lint.yml b/.github/workflows/juno-lint.yml index c3455f1b4b..cc24ef1ac2 100644 --- a/.github/workflows/juno-lint.yml +++ b/.github/workflows/juno-lint.yml @@ -14,8 +14,8 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v4.1.0 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5.0.2 with: go-version-file: go.mod cache: false @@ -25,4 +25,4 @@ jobs: uses: golangci/golangci-lint-action@v3 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: v1.56.2 \ No newline at end of file + version: v1.59.1 diff --git a/.github/workflows/juno-test.yml b/.github/workflows/juno-test.yml index f1dbad0cfd..96273dcf18 100644 --- a/.github/workflows/juno-test.yml +++ b/.github/workflows/juno-test.yml @@ -14,17 +14,16 @@ jobs: fail-fast: false matrix: go: [ '1.22.2' ] - os: [ ubuntu-latest, macos-latest, self-hosted-linux-arm64] + os: [ ubuntu-latest, macos-latest, ubuntu-arm64-2-core] runs-on: ${{ matrix.os }} env: VM_DEBUG: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.2 with: go-version-file: go.mod - cache: true - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: @@ -36,25 +35,34 @@ jobs: - name: Install deps run: make install-deps - - name: Install Jemalloc (Ubuntu or self-hosted) + - name: Install Jemalloc (Linux) if: runner.os == 'Linux' run: sudo apt-get update -qq && sudo apt-get install -y libjemalloc-dev libjemalloc2 -y - name: Install dependencies (macOS) if: runner.os == 'macOS' run: brew install jemalloc - - - name: Tests + + - name: Tests (Coverage) + if: matrix.os == 'ubuntu-latest' run: make test-cover + - name: Tests (No Coverage) + if: matrix.os != 'ubuntu-latest' + run: make test + +# Tests with race condition detector are flaky; we're disabling them for now +# - name: Tests (Race Detection) +# if: matrix.os == 'ubuntu-latest' +# run: make test-race + - name: Benchmark run: make benchmarks - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4.2.0 if: matrix.os == 'ubuntu-latest' + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true - files: ./coverage/coverage.out - verbose: true \ No newline at end of file + files: coverage.out diff --git a/.github/workflows/load-tests.yml b/.github/workflows/load-tests.yml index e0f1b3a986..e016c2e065 100644 --- a/.github/workflows/load-tests.yml +++ b/.github/workflows/load-tests.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout Juno Smoke Tests - uses: actions/checkout@v3.5.2 + uses: actions/checkout@v4 with: repository: NethermindEth/juno-smoke-tests token: ${{ secrets.REPOSITORY_DISPATCH_TOKEN }} diff --git a/.github/workflows/rpc-tests.yml b/.github/workflows/rpc-tests.yml index 701bef8036..0a2eb26904 100644 --- a/.github/workflows/rpc-tests.yml +++ b/.github/workflows/rpc-tests.yml @@ -17,13 +17,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Juno Smoke Tests - uses: actions/checkout@v3.5.2 + uses: actions/checkout@v4 with: repository: NethermindEth/juno-smoke-tests token: ${{ secrets.REPOSITORY_DISPATCH_TOKEN }} - name: Setup Go Environment - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.2 with: go-version-file: rpc-tests/go.mod diff --git a/.github/workflows/starknet-rs-tests.yml b/.github/workflows/starknet-rs-tests.yml index 3c0b7e7141..91467d9a73 100644 --- a/.github/workflows/starknet-rs-tests.yml +++ b/.github/workflows/starknet-rs-tests.yml @@ -26,7 +26,7 @@ jobs: - name: Run jsonrpc tests run: | cd starknet-providers && cargo test jsonrpc - cd ../starknet-accounts && cargo test jsonrpc + cd ../starknet-accounts && cargo test jsonrpc -- --skip can_declare_cairo0_contract_with_jsonrpc env: STARKNET_RPC: ${{ secrets.STARKNET_RPC }} RUST_BACKTRACE: full \ No newline at end of file diff --git a/.github/workflows/sync_first_100_blocks_smoke_test.yml b/.github/workflows/sync_first_100_blocks_smoke_test.yml index 4f1f29b59b..c2bbf3d278 100644 --- a/.github/workflows/sync_first_100_blocks_smoke_test.yml +++ b/.github/workflows/sync_first_100_blocks_smoke_test.yml @@ -13,11 +13,20 @@ jobs: runs-on: ubuntu-latest if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository steps: + - name: Generate a token + id: generate-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + repositories: "juno,juno-smoke-tests" + - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.2 with: go-version-file: go.mod cache: true @@ -27,12 +36,12 @@ jobs: - name: Build docker image run: docker build --build-arg VM_DEBUG=true -t nethermindeth/juno . - + - name: Checkout Juno Smoke Tests - uses: actions/checkout@v3.5.2 + uses: actions/checkout@v4 with: repository: NethermindEth/juno-smoke-tests - token: ${{ secrets.REPOSITORY_DISPATCH_TOKEN }} + token: ${{ steps.generate-token.outputs.token }} - name: Run smoke tests run: | diff --git a/.gitignore b/.gitignore index 6c02bffbab..44e4b65aac 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,8 @@ .dist build/ coverage/* -courtney/ -__pycache__/ config/ .envrc - -# pyenv -.python-version +# Default path for Juno DB files. It will get created if you follow the +# README and/or run `./build/juno` command. +juno/ diff --git a/.golangci.yaml b/.golangci.yaml index 068f99cd04..8838350c20 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -31,7 +31,7 @@ linters-settings: min-complexity: 15 goimports: local-prefixes: github.com/golangci/golangci-lint - gomnd: + mnd: # don't include the "operation" and "assign" checks: - argument @@ -39,15 +39,15 @@ linters-settings: - condition - return ignored-numbers: - - '0' - - '1' - - '2' - - '3' + - "0" + - "1" + - "2" + - "3" ignored-functions: - strings.SplitN govet: - check-shadowing: true + shadow: true settings: printf: funcs: @@ -64,6 +64,9 @@ linters-settings: require-explanation: false # don't require an explanation for nolint directives require-specific: false # don't require nolint directives to be specific about which linter is being skipped + exhaustruct: + include: [] + linters: disable-all: true enable: @@ -79,7 +82,7 @@ linters: - gocritic - gocyclo - gofumpt - - gomnd + - mnd - goprintffuncname - gosec - gosimple @@ -88,6 +91,7 @@ linters: - lll - misspell - nakedret + - nilerr - noctx - nolintlint - staticcheck @@ -96,9 +100,11 @@ linters: - unconvert - unparam - unused + - usestdlibvars - whitespace - tparallel - gci + - exhaustruct # don't enable: # - asciicheck @@ -121,10 +127,15 @@ issues: exclude-rules: - path: _test\.go linters: - - gomnd + - mnd - funlen - lll - gosec + - exhaustruct + + - path-except: 'adapters/.+\.go' # run specified linters only on files that reside inside adapters + linters: + - exhaustruct - linters: - lll @@ -145,11 +156,11 @@ issues: text: "SA1019: (.+).(GoVersion|LangVersion) is deprecated: use the global `run.go` instead." - path: pkg/golinters/unused.go text: "rangeValCopy: each iteration copies 160 bytes \\(consider pointers or indexing\\)" - -run: - timeout: 5m - skip-dirs: + exclude-dirs: - test/testdata_etc # test files - internal/cache # extracted from Go code - internal/renameio # extracted from Go code - internal/robustio # extracted from Go code + +run: + timeout: 5m diff --git a/Dockerfile b/Dockerfile index ed40d57697..30b0c4b551 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ # Stage 1: Build golang dependencies and binaries -FROM ubuntu:24.04 AS build +FROM ubuntu:24.10 AS build ARG VM_DEBUG -# Install Alpine Dependencies -# removal is temp. to fix https://github.com/orgs/community/discussions/120966 -RUN apt-get update && \ - apt-get install build-essential cargo git golang upx-ucl libjemalloc-dev libjemalloc2 -y + +RUN apt-get -qq update && \ + apt-get -qq install curl build-essential git golang upx-ucl libjemalloc-dev libjemalloc2 -y +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -q -y WORKDIR /app @@ -14,13 +14,13 @@ WORKDIR /app COPY . . # Build the project -RUN VM_DEBUG=${VM_DEBUG} make juno +RUN bash -c 'source ~/.cargo/env && VM_DEBUG=${VM_DEBUG} make juno' # Compress the executable with UPX RUN upx-ucl /app/build/juno # Stage 2: Build Docker image -FROM ubuntu:23.10 AS runtime +FROM ubuntu:24.10 AS runtime RUN apt-get update && apt-get install -y ca-certificates curl gawk grep libjemalloc-dev libjemalloc2 diff --git a/Makefile b/Makefile index 87cadb6cd3..c5a4db751b 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,12 @@ endif ifeq ($(shell uname -s),Darwin) export CGO_LDFLAGS=-framework Foundation -framework SystemConfiguration + # for test-race we need to pass -ldflags to fix linker warnings on macOS + # see https://github.com/golang/go/issues/61229#issuecomment-1988965927 + TEST_RACE_LDFLAGS=-ldflags=-extldflags=-Wl,-ld_classic +else + export CGO_LDFLAGS=-ldl -lm + TEST_RACE_LDFLAGS= endif rustdeps: vm core-rust compiler @@ -47,12 +53,12 @@ test-cached: rustdeps ## tests with existing cache go test $(GO_TAGS) ./... test-race: clean-testcache rustdeps - go test $(GO_TAGS) ./... -race + go test $(GO_TAGS) ./... -race $(TEST_RACE_LDFLAGS) benchmarks: rustdeps ## benchmarking go test $(GO_TAGS) ./... -run=^# -bench=. -benchmem -test-cover: rustdeps ## tests with coverage +test-cover: clean-testcache rustdeps ## tests with coverage mkdir -p coverage go test $(GO_TAGS) -coverpkg=./... -coverprofile=coverage/coverage.out -covermode=atomic ./... go tool cover -html=coverage/coverage.out -o coverage/coverage.html @@ -66,7 +72,7 @@ install-mockgen: go install go.uber.org/mock/mockgen@latest install-golangci-lint: - go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.2 + go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.59.1 lint: @which golangci-lint || make install-golangci-lint @@ -75,7 +81,10 @@ lint: tidy: ## add missing and remove unused modules go mod tidy -format: ## run go formatter +format: ## run go & rust formatters + $(MAKE) -C vm/rust format + $(MAKE) -C core/rust format + $(MAKE) -C starknet/rust format gofumpt -l -w . clean: ## clean project builds @@ -87,7 +96,7 @@ clean: ## clean project builds help: ## show this help @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' -feedernode: +feedernode: juno-cached ./build/juno \ --network=sepolia \ --log-level=debug \ @@ -98,7 +107,9 @@ feedernode: --p2p-private-key="5f6cdc3aebcc74af494df054876100368ef6126e3a33fa65b90c765b381ffc37a0a63bbeeefab0740f24a6a38dabb513b9233254ad0020c721c23e69bc820089" \ --metrics-port=9090 -node1: +node1: juno-cached +# todo remove rm before merge + rm -rf ./p2p-dbs/node1/ && \ ./build/juno \ --network=sepolia \ --log-level=debug \ @@ -132,3 +143,12 @@ node3: --p2p-private-key="54a695e2a5d5717d5ba8730efcafe6f17251a1955733cffc55a4085fbf7f5d2c1b4009314092069ef7ca9b364ce3eb3072531c64dfb2799c6bad76720a5bdff0" \ --metrics-port=9093 +pathfinder: juno-cached + ./build/juno \ + --network=sepolia \ + --log-level=debug \ + --db-path=./p2p-dbs/node-pathfinder \ + --p2p \ + --p2p-peers=/ip4/127.0.0.1/tcp/8888/p2p/12D3KooWF1JrZWQoBiBSjsFSuLbDiDvqcmJQRLaFQLmpVkHA9duk \ + --p2p-private-key="54a695e2a5d5717d5ba8730efcafe6f17251a1955733cffc55a4085fbf7f5d2c1b4009314092069ef7ca9b364ce3eb3072531c64dfb2799c6bad76720a5bdff0" \ + --metrics-port=9094 diff --git a/README.md b/README.md index 1fdd6e6323..8d66d0a37b 100644 --- a/README.md +++ b/README.md @@ -49,18 +49,20 @@ the official Golang [download](https://go.dev/doc/install) page. - [Rust](https://www.rust-lang.org/tools/install). - A C compiler: `gcc` or `clang`. -- Install `jemalloc` on your system: +- Install `jemalloc` and `pkg-config` on your system: - macOS ```bash brew install jemalloc + brew install pkg-config ``` - Ubuntu ```bash sudo apt-get install -y libjemalloc-dev + sudo apt-get install -y pkg-config ``` - To ensure a successful build, you either need to synchronize the tags from the upstream repository or create a new tag. @@ -107,15 +109,27 @@ Use the provided snapshots to quickly sync your Juno node with the current state #### Mainnet -| Version | Size | Block | Download Link | -| ------- | ---- | ----- | ------------- | -| **>=v0.9.2** | **182 GB** | **640855** | [**juno_mainnet.tar**](https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.7_640855.tar) | +| Version | Download Link | +| ------- | ------------- | +| **>=v0.9.2** | [**juno_mainnet.tar**](https://juno-snapshots.nethermind.dev/files/mainnet/latest) | #### Sepolia -| Version | Size | Block | Download Link | -| ------- | ---- | ----- | ------------- | -| **>=v0.9.2** | **5 GB** | **66477** | [**juno_sepolia.tar**](https://juno-snapshots.nethermind.dev/sepolia/juno_sepolia_v0.11.7_66477.tar) | +| Version | Download Link | +| ------- | ------------- | +| **>=v0.9.2** | [**juno_sepolia.tar**](https://juno-snapshots.nethermind.dev/files/sepolia/latest) | + +### Getting the size for each snapshot +```console +$date +Thu 1 Aug 2024 09:49:30 BST + +$curl -s -I -L https://juno-snapshots.nethermind.dev/files/mainnet/latest | gawk -v IGNORECASE=1 '/^Content-Length/ { printf "%.2f GB\n", $2/1024/1024/1024 }' +172.47 GB + +$curl -s -I -L https://juno-snapshots.nethermind.dev/files/sepolia/latest | gawk -v IGNORECASE=1 '/^Content-Length/ { printf "%.2f GB\n", $2/1024/1024/1024 }' +5.67 GB +``` ### Run Juno Using Snapshot @@ -124,7 +138,7 @@ Use the provided snapshots to quickly sync your Juno node with the current state Fetch the snapshot from the provided URL: ```bash - wget -O juno_mainnet.tar https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.7_640855.tar + wget -O juno_mainnet.tar https://juno-snapshots.nethermind.dev/files/mainnet/latest ``` 2. **Prepare Directory** @@ -164,7 +178,7 @@ After following these steps, Juno should be up and running on your machine, util ## ✔ Supported Features -- Starknet [v0.13.1](https://docs.starknet.io/documentation/starknet_versions/version_notes/) support. +- Starknet [v0.13.1](https://docs.starknet.io/starknet-versions/version-notes/) support. - JSON-RPC [v0.7.0](https://github.com/starkware-libs/starknet-specs/releases/tag/v0.7.0-rc2) (Available under `/v0_7` and default`/` endpoints) - `starknet_chainId` - `starknet_blockNumber` diff --git a/adapters/core2p2p/block.go b/adapters/core2p2p/block.go index 262c35ef86..3495df361d 100644 --- a/adapters/core2p2p/block.go +++ b/adapters/core2p2p/block.go @@ -1,13 +1,12 @@ package core2p2p import ( - "time" + "fmt" "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" - "google.golang.org/protobuf/types/known/timestamppb" ) func AdaptBlockID(header *core.Header) *spec.BlockID { @@ -28,29 +27,48 @@ func AdaptSignature(sig []*felt.Felt) *spec.ConsensusSignature { } } -func AdaptHeader(header *core.Header, commitments *core.BlockCommitments) *spec.BlockHeader { - return &spec.BlockHeader{ +func AdaptHeader(header *core.Header, commitments *core.BlockCommitments, + stateDiffCommitment *felt.Felt, stateDiffLength uint64, +) *spec.SignedBlockHeader { + return &spec.SignedBlockHeader{ + BlockHash: AdaptHash(header.Hash), ParentHash: AdaptHash(header.ParentHash), Number: header.Number, - Time: timestamppb.New(time.Unix(int64(header.Timestamp), 0)), + Time: header.Timestamp, SequencerAddress: AdaptAddress(header.SequencerAddress), - ProofFact: nil, // not defined yet - Receipts: nil, // not defined yet - StateDiffs: nil, // not defined yet - State: &spec.Patricia{ - Height: core.ContractStorageTrieHeight, - Root: AdaptHash(header.GlobalStateRoot), - }, - Transactions: &spec.Merkle{ - NLeaves: uint32(header.TransactionCount), + StateRoot: AdaptHash(header.GlobalStateRoot), + Transactions: &spec.Patricia{ + NLeaves: header.TransactionCount, Root: AdaptHash(commitments.TransactionCommitment), }, - Events: &spec.Merkle{ - NLeaves: uint32(header.EventCount), + Events: &spec.Patricia{ + NLeaves: header.EventCount, Root: AdaptHash(commitments.EventCommitment), }, + // todo fill receipts with receipt commitment + Receipts: AdaptHash(&felt.Zero), ProtocolVersion: header.ProtocolVersion, - GasPrice: AdaptFelt(header.GasPrice), + GasPriceFri: AdaptUint128(header.GasPrice), + Signatures: utils.Map(header.Signatures, AdaptSignature), + StateDiffCommitment: &spec.StateDiffCommitment{ + StateDiffLength: stateDiffLength, + Root: AdaptHash(stateDiffCommitment), + }, + GasPriceWei: AdaptUint128(header.GasPriceSTRK), + DataGasPriceFri: AdaptUint128(header.L1DataGasPrice.PriceInFri), + DataGasPriceWei: AdaptUint128(header.L1DataGasPrice.PriceInWei), + L1DataAvailabilityMode: adaptL1DA(header.L1DAMode), + } +} + +func adaptL1DA(da core.L1DAMode) spec.L1DataAvailabilityMode { + switch da { + case core.Calldata: + return spec.L1DataAvailabilityMode_Calldata + case core.Blob: + return spec.L1DataAvailabilityMode_Blob + default: + panic(fmt.Errorf("unknown L1DAMode %v", da)) } } diff --git a/adapters/core2p2p/class.go b/adapters/core2p2p/class.go index d23adac275..0b3badf537 100644 --- a/adapters/core2p2p/class.go +++ b/adapters/core2p2p/class.go @@ -1,7 +1,6 @@ package core2p2p import ( - "encoding/json" "fmt" "github.com/NethermindEth/juno/core" @@ -19,25 +18,20 @@ func AdaptClass(class core.Class) *spec.Class { return &spec.Class{ Class: &spec.Class_Cairo0{ Cairo0: &spec.Cairo0Class{ - Abi: v.Abi, + Abi: string(v.Abi), Externals: utils.Map(v.Externals, adaptEntryPoint), L1Handlers: utils.Map(v.L1Handlers, adaptEntryPoint), Constructors: utils.Map(v.Constructors, adaptEntryPoint), - Program: []byte(v.Program), + Program: v.Program, }, }, + Domain: 0, // todo(kirill) recheck } case *core.Cairo1Class: - // Todo: Add compiled class struct to p2p spec. For now we will use json encoding - compiledBytes, err := json.Marshal(v.Compiled) - if err != nil { - panic(fmt.Errorf("unable to marshal compiled class hash to json: %v", err)) - } - return &spec.Class{ Class: &spec.Class_Cairo1{ Cairo1: &spec.Cairo1Class{ - Abi: []byte(v.Abi), + Abi: v.Abi, EntryPoints: &spec.Cairo1EntryPoints{ Externals: utils.Map(v.EntryPoints.External, adaptSierra), L1Handlers: utils.Map(v.EntryPoints.L1Handler, adaptSierra), @@ -45,9 +39,9 @@ func AdaptClass(class core.Class) *spec.Class { }, Program: utils.Map(v.Program, AdaptFelt), ContractClassVersion: v.SemanticVersion, - Compiled: compiledBytes, }, }, + Domain: 0, // todo(kirill) recheck } default: panic(fmt.Errorf("unsupported cairo class %T (version=%d)", v, class.Version())) @@ -64,6 +58,6 @@ func adaptSierra(e core.SierraEntryPoint) *spec.SierraEntryPoint { func adaptEntryPoint(e core.EntryPoint) *spec.EntryPoint { return &spec.EntryPoint{ Selector: AdaptFelt(e.Selector), - Offset: AdaptFelt(e.Offset), + Offset: e.Offset.Uint64(), } } diff --git a/adapters/core2p2p/felt.go b/adapters/core2p2p/felt.go index cfaa9ab396..67cf3cfc84 100644 --- a/adapters/core2p2p/felt.go +++ b/adapters/core2p2p/felt.go @@ -45,3 +45,13 @@ func AdaptAddress(f *felt.Felt) *spec.Address { Elements: f.Marshal(), } } + +func AdaptUint128(f *felt.Felt) *spec.Uint128 { + // bits represents value in little endian byte order + // i.e. first is least significant byte + bits := f.Bits() + return &spec.Uint128{ + Low: bits[0], + High: bits[1], + } +} diff --git a/adapters/core2p2p/receipt.go b/adapters/core2p2p/receipt.go index 225ed48186..dafc692cf8 100644 --- a/adapters/core2p2p/receipt.go +++ b/adapters/core2p2p/receipt.go @@ -2,6 +2,7 @@ package core2p2p import ( "github.com/NethermindEth/juno/core" + "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" ) @@ -62,12 +63,28 @@ func AdaptReceipt(r *core.TransactionReceipt, txn core.Transaction) *spec.Receip } func receiptCommon(r *core.TransactionReceipt) *spec.Receipt_Common { + var revertReason *string + if r.RevertReason != "" { + revertReason = &r.RevertReason + } + return &spec.Receipt_Common{ - TransactionHash: AdaptHash(r.TransactionHash), ActualFee: AdaptFelt(r.Fee), + PriceUnit: adaptPriceUnit(r.FeeUnit), MessagesSent: utils.Map(r.L2ToL1Message, AdaptMessageToL1), ExecutionResources: AdaptExecutionResources(r.ExecutionResources), - RevertReason: r.RevertReason, + RevertReason: revertReason, + } +} + +func adaptPriceUnit(unit core.FeeUnit) spec.PriceUnit { + switch unit { + case core.WEI: + return spec.PriceUnit_Wei + case core.STRK: + return spec.PriceUnit_Fri // todo(kirill) recheck + default: + panic("unreachable adaptPriceUnit") } } @@ -84,6 +101,11 @@ func AdaptExecutionResources(er *core.ExecutionResources) *spec.Receipt_Executio return nil } + var l1Gas, l1DataGas *spec.Felt252 + if da := er.DataAvailability; da != nil { // todo(kirill) check that it might be null + l1Gas = AdaptFelt(new(felt.Felt).SetUint64(da.L1Gas)) + l1DataGas = AdaptFelt(new(felt.Felt).SetUint64(da.L1DataGas)) + } return &spec.Receipt_ExecutionResources{ Builtins: &spec.Receipt_ExecutionResources_BuiltinCounter{ Bitwise: uint32(er.BuiltinInstanceCounter.Bitwise), @@ -93,8 +115,11 @@ func AdaptExecutionResources(er *core.ExecutionResources) *spec.Receipt_Executio RangeCheck: uint32(er.BuiltinInstanceCounter.RangeCheck), Poseidon: uint32(er.BuiltinInstanceCounter.Poseidon), Keccak: uint32(er.BuiltinInstanceCounter.Keccak), + Output: uint32(er.BuiltinInstanceCounter.Output), }, Steps: uint32(er.Steps), MemoryHoles: uint32(er.MemoryHoles), + L1Gas: l1Gas, + L1DataGas: l1DataGas, } } diff --git a/adapters/core2p2p/state.go b/adapters/core2p2p/state.go index 3ebfcbd0c8..ef4d023541 100644 --- a/adapters/core2p2p/state.go +++ b/adapters/core2p2p/state.go @@ -6,12 +6,13 @@ import ( "github.com/NethermindEth/juno/utils" ) -func AdaptStateDiff(addr, nonce *felt.Felt, diff map[felt.Felt]*felt.Felt) *spec.StateDiff_ContractDiff { - return &spec.StateDiff_ContractDiff{ +func AdaptContractDiff(addr, nonce, classHash *felt.Felt, storageDiff map[felt.Felt]*felt.Felt) *spec.ContractDiff { + return &spec.ContractDiff{ Address: AdaptAddress(addr), Nonce: AdaptFelt(nonce), - ClassHash: nil, // This will need to be set if deployed_contracts and replaced_classes are removed from StateDiff - Values: AdaptStorageDiff(diff), + ClassHash: AdaptHash(classHash), // This will need to be set if deployed_contracts and replaced_classes are removed from StateDiff + Values: AdaptStorageDiff(storageDiff), + Domain: 0, } } @@ -23,10 +24,3 @@ func AdaptStorageDiff(diff map[felt.Felt]*felt.Felt) []*spec.ContractStoredValue } }) } - -func AdaptAddressClassHashPair(address felt.Felt, classHash *felt.Felt) *spec.StateDiff_ContractAddrToClassHash { - return &spec.StateDiff_ContractAddrToClassHash{ - ContractAddr: AdaptAddress(&address), - ClassHash: AdaptHash(classHash), - } -} diff --git a/adapters/core2p2p/transaction.go b/adapters/core2p2p/transaction.go index 358a884856..d8ce842e3e 100644 --- a/adapters/core2p2p/transaction.go +++ b/adapters/core2p2p/transaction.go @@ -6,6 +6,7 @@ import ( "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" + "github.com/NethermindEth/juno/utils" ) //nolint:funlen,gocyclo @@ -35,18 +36,16 @@ func AdaptTransaction(transaction core.Transaction) *spec.Transaction { case tx.Version.Is(3): specTx.Txn = &spec.Transaction_DeployAccountV3_{ DeployAccountV3: &spec.Transaction_DeployAccountV3{ - MaxFee: AdaptFelt(tx.MaxFee), - Signature: AdaptAccountSignature(tx.Signature()), - ClassHash: AdaptHash(tx.ClassHash), - Nonce: AdaptFelt(tx.Nonce), - AddressSalt: AdaptFelt(tx.ContractAddressSalt), - Calldata: AdaptFeltSlice(tx.ConstructorCallData), - L1Gas: adaptResourceLimits(tx.ResourceBounds[core.ResourceL1Gas]), - L2Gas: adaptResourceLimits(tx.ResourceBounds[core.ResourceL2Gas]), - Tip: AdaptFelt(new(felt.Felt).SetUint64(tx.Tip)), - Paymaster: nil, - NonceDomain: fmt.Sprintf("%v", tx.NonceDAMode), - FeeDomain: fmt.Sprintf("%v", tx.FeeDAMode), + Signature: AdaptAccountSignature(tx.Signature()), + ClassHash: AdaptHash(tx.ClassHash), + Nonce: AdaptFelt(tx.Nonce), + AddressSalt: AdaptFelt(tx.ContractAddressSalt), + Calldata: AdaptFeltSlice(tx.ConstructorCallData), + ResourceBounds: adaptResourceBounds(tx.ResourceBounds), + Tip: tx.Tip, + PaymasterData: utils.Map(tx.PaymasterData, AdaptFelt), + NonceDataAvailabilityMode: adaptVolitionDomain(tx.NonceDAMode), + FeeDataAvailabilityMode: adaptVolitionDomain(tx.FeeDAMode), }, } default: @@ -81,24 +80,23 @@ func AdaptTransaction(transaction core.Transaction) *spec.Transaction { Signature: AdaptAccountSignature(tx.Signature()), ClassHash: AdaptHash(tx.ClassHash), Nonce: AdaptFelt(tx.Nonce), - CompiledClassHash: AdaptFelt(tx.CompiledClassHash), + CompiledClassHash: AdaptHash(tx.CompiledClassHash), }, } case tx.Version.Is(3): specTx.Txn = &spec.Transaction_DeclareV3_{ DeclareV3: &spec.Transaction_DeclareV3{ - Sender: AdaptAddress(tx.SenderAddress), - MaxFee: AdaptFelt(tx.MaxFee), - Signature: AdaptAccountSignature(tx.Signature()), - ClassHash: AdaptHash(tx.ClassHash), - Nonce: AdaptFelt(tx.Nonce), - CompiledClassHash: AdaptFelt(tx.CompiledClassHash), - L1Gas: adaptResourceLimits(tx.ResourceBounds[core.ResourceL1Gas]), - L2Gas: adaptResourceLimits(tx.ResourceBounds[core.ResourceL2Gas]), - Tip: AdaptFelt(new(felt.Felt).SetUint64(tx.Tip)), - Paymaster: nil, - NonceDomain: fmt.Sprintf("%v", tx.NonceDAMode), - FeeDomain: fmt.Sprintf("%v", tx.FeeDAMode), + Sender: AdaptAddress(tx.SenderAddress), + Signature: AdaptAccountSignature(tx.Signature()), + ClassHash: AdaptHash(tx.ClassHash), + Nonce: AdaptFelt(tx.Nonce), + CompiledClassHash: AdaptHash(tx.CompiledClassHash), + ResourceBounds: adaptResourceBounds(tx.ResourceBounds), + Tip: tx.Tip, + PaymasterData: utils.Map(tx.PaymasterData, AdaptFelt), + AccountDeploymentData: utils.Map(tx.AccountDeploymentData, AdaptFelt), + NonceDataAvailabilityMode: adaptVolitionDomain(tx.NonceDAMode), + FeeDataAvailabilityMode: adaptVolitionDomain(tx.FeeDAMode), }, } default: @@ -129,17 +127,16 @@ func AdaptTransaction(transaction core.Transaction) *spec.Transaction { case tx.Version.Is(3): specTx.Txn = &spec.Transaction_InvokeV3_{ InvokeV3: &spec.Transaction_InvokeV3{ - Sender: AdaptAddress(tx.SenderAddress), - MaxFee: AdaptFelt(tx.MaxFee), - Signature: AdaptAccountSignature(tx.Signature()), - Calldata: AdaptFeltSlice(tx.CallData), - Nonce: AdaptFelt(tx.Nonce), - L1Gas: adaptResourceLimits(tx.ResourceBounds[core.ResourceL1Gas]), - L2Gas: adaptResourceLimits(tx.ResourceBounds[core.ResourceL2Gas]), - Tip: AdaptFelt(new(felt.Felt).SetUint64(tx.Tip)), - Paymaster: nil, - NonceDomain: fmt.Sprintf("%v", tx.NonceDAMode), - FeeDomain: fmt.Sprintf("%v", tx.FeeDAMode), + Sender: AdaptAddress(tx.SenderAddress), + Signature: AdaptAccountSignature(tx.Signature()), + Calldata: AdaptFeltSlice(tx.CallData), + ResourceBounds: adaptResourceBounds(tx.ResourceBounds), + Tip: tx.Tip, + PaymasterData: utils.Map(tx.PaymasterData, AdaptFelt), + AccountDeploymentData: utils.Map(tx.AccountDeploymentData, AdaptFelt), + NonceDataAvailabilityMode: adaptVolitionDomain(tx.NonceDAMode), + FeeDataAvailabilityMode: adaptVolitionDomain(tx.FeeDAMode), + Nonce: AdaptFelt(tx.Nonce), }, } default: @@ -160,19 +157,27 @@ func adaptResourceLimits(bounds core.ResourceBounds) *spec.ResourceLimits { } } +func adaptResourceBounds(rb map[core.Resource]core.ResourceBounds) *spec.ResourceBounds { + return &spec.ResourceBounds{ + L1Gas: adaptResourceLimits(rb[core.ResourceL1Gas]), + L2Gas: adaptResourceLimits(rb[core.ResourceL2Gas]), + } +} + func adaptDeployTransaction(tx *core.DeployTransaction) *spec.Transaction_Deploy_ { return &spec.Transaction_Deploy_{ Deploy: &spec.Transaction_Deploy{ ClassHash: AdaptHash(tx.ClassHash), AddressSalt: AdaptFelt(tx.ContractAddressSalt), Calldata: AdaptFeltSlice(tx.ConstructorCallData), + Version: 0, // todo(kirill) remove field from spec? tx is deprecated so no future versions }, } } func adaptL1HandlerTransaction(tx *core.L1HandlerTransaction) *spec.Transaction_L1Handler { return &spec.Transaction_L1Handler{ - L1Handler: &spec.Transaction_L1HandlerV1{ + L1Handler: &spec.Transaction_L1HandlerV0{ Nonce: AdaptFelt(tx.Nonce), Address: AdaptAddress(tx.ContractAddress), EntryPointSelector: AdaptFelt(tx.EntryPointSelector), @@ -180,3 +185,14 @@ func adaptL1HandlerTransaction(tx *core.L1HandlerTransaction) *spec.Transaction_ }, } } + +func adaptVolitionDomain(mode core.DataAvailabilityMode) spec.VolitionDomain { + switch mode { + case core.DAModeL1: + return spec.VolitionDomain_L1 + case core.DAModeL2: + return spec.VolitionDomain_L2 + default: + panic("unreachable in adaptVolitionDomain") + } +} diff --git a/adapters/core2sn/class.go b/adapters/core2sn/class.go index fcce826a24..34789353a3 100644 --- a/adapters/core2sn/class.go +++ b/adapters/core2sn/class.go @@ -49,6 +49,7 @@ func AdaptSierraClass(class *core.Cairo1Class) *starknet.SierraDefinition { handlers := utils.Map(utils.NonNilSlice(class.EntryPoints.L1Handler), adapt) return &starknet.SierraDefinition{ + Abi: class.Abi, Version: class.SemanticVersion, Program: class.Program, EntryPoints: starknet.SierraEntryPoints{ diff --git a/adapters/p2p2core/block.go b/adapters/p2p2core/block.go index 9d4c0c62be..4b54d12f9a 100644 --- a/adapters/p2p2core/block.go +++ b/adapters/p2p2core/block.go @@ -1,10 +1,13 @@ package p2p2core import ( + "fmt" + "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" + "github.com/bits-and-blooms/bloom/v3" ) func AdaptEvent(e *spec.Event) *core.Event { @@ -19,22 +22,41 @@ func AdaptEvent(e *spec.Event) *core.Event { } } -func AdaptSignature(cs *spec.ConsensusSignature) []*felt.Felt { - return []*felt.Felt{AdaptFelt(cs.R), AdaptFelt(cs.S)} -} - -func AdaptBlockHeader(h *spec.BlockHeader) core.Header { - return core.Header{ - Hash: nil, // todo: add this when building the block +func AdaptBlockHeader(h *spec.SignedBlockHeader, eventsBloom *bloom.BloomFilter) *core.Header { + return &core.Header{ + Hash: AdaptHash(h.BlockHash), ParentHash: AdaptHash(h.ParentHash), Number: h.Number, - GlobalStateRoot: AdaptHash(h.State.Root), + GlobalStateRoot: AdaptHash(h.StateRoot), SequencerAddress: AdaptAddress(h.SequencerAddress), - TransactionCount: uint64(h.Transactions.NLeaves), - EventCount: uint64(h.Events.NLeaves), - Timestamp: uint64(h.Time.AsTime().Unix()), + TransactionCount: h.Transactions.NLeaves, + EventCount: h.Events.NLeaves, + Timestamp: h.Time, ProtocolVersion: h.ProtocolVersion, - EventsBloom: nil, // Todo: add this in when building the block - GasPrice: AdaptFelt(h.GasPrice), + EventsBloom: eventsBloom, + Signatures: utils.Map(h.Signatures, adaptSignature), + L1DAMode: adaptDA(h.L1DataAvailabilityMode), + L1DataGasPrice: &core.GasPrice{ + PriceInWei: AdaptUint128(h.DataGasPriceWei), + PriceInFri: AdaptUint128(h.DataGasPriceFri), + }, + // todo(kirill) check prices + GasPrice: AdaptUint128(h.GasPriceWei), + GasPriceSTRK: AdaptUint128(h.GasPriceFri), + } +} + +func adaptSignature(cs *spec.ConsensusSignature) []*felt.Felt { + return []*felt.Felt{AdaptFelt(cs.R), AdaptFelt(cs.S)} +} + +func adaptDA(da spec.L1DataAvailabilityMode) core.L1DAMode { + switch da { + case spec.L1DataAvailabilityMode_Calldata: + return core.Calldata + case spec.L1DataAvailabilityMode_Blob: + return core.Blob + default: + panic(fmt.Errorf("unsupported DA mode %v", da)) } } diff --git a/adapters/p2p2core/class.go b/adapters/p2p2core/class.go index bef52e82bc..40c5a7bc51 100644 --- a/adapters/p2p2core/class.go +++ b/adapters/p2p2core/class.go @@ -4,9 +4,12 @@ import ( "encoding/json" "fmt" + "github.com/NethermindEth/juno/adapters/sn2core" "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/core/crypto" + "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" + "github.com/NethermindEth/juno/starknet" "github.com/NethermindEth/juno/utils" ) @@ -17,44 +20,51 @@ func AdaptClass(class *spec.Class) core.Class { switch cls := class.Class.(type) { case *spec.Class_Cairo0: + adaptEP := func(points []*spec.EntryPoint) []core.EntryPoint { + // usage of NonNilSlice is essential because relevant core class fields are non nil + return utils.Map(utils.NonNilSlice(points), adaptEntryPoint) + } + cairo0 := cls.Cairo0 return &core.Cairo0Class{ - Abi: cairo0.Abi, - Externals: utils.Map(cairo0.Externals, adaptEntryPoint), - L1Handlers: utils.Map(cairo0.L1Handlers, adaptEntryPoint), - Constructors: utils.Map(cairo0.Constructors, adaptEntryPoint), - Program: string(cairo0.Program), + Abi: json.RawMessage(cairo0.Abi), + Externals: adaptEP(cairo0.Externals), + L1Handlers: adaptEP(cairo0.L1Handlers), + Constructors: adaptEP(cairo0.Constructors), + Program: cairo0.Program, } case *spec.Class_Cairo1: cairo1 := cls.Cairo1 - abiHash, err := crypto.StarknetKeccak(cairo1.Abi) + abiHash := crypto.StarknetKeccak([]byte(cairo1.Abi)) + + program := utils.Map(cairo1.Program, AdaptFelt) + compiled, err := createCompiledClass(cairo1) if err != nil { panic(err) } - // Todo: remove once compiled class hash is added to p2p spec. - compiledC := new(core.CompiledClass) - if err := json.Unmarshal(cairo1.Compiled, compiledC); err != nil { - panic(fmt.Errorf("unable to unmarshal json compiled class: %v", err)) + adaptEP := func(points []*spec.SierraEntryPoint) []core.SierraEntryPoint { + // usage of NonNilSlice is essential because relevant core class fields are non nil + return utils.Map(utils.NonNilSlice(points), adaptSierra) } - program := utils.Map(cairo1.Program, AdaptFelt) + entryPoints := cairo1.EntryPoints return &core.Cairo1Class{ - Abi: string(cairo1.Abi), + Abi: cairo1.Abi, AbiHash: abiHash, EntryPoints: struct { Constructor []core.SierraEntryPoint External []core.SierraEntryPoint L1Handler []core.SierraEntryPoint }{ - Constructor: utils.Map(cairo1.EntryPoints.Constructors, adaptSierra), - External: utils.Map(cairo1.EntryPoints.Externals, adaptSierra), - L1Handler: utils.Map(cairo1.EntryPoints.L1Handlers, adaptSierra), + Constructor: adaptEP(entryPoints.Constructors), + External: adaptEP(entryPoints.Externals), + L1Handler: adaptEP(entryPoints.L1Handlers), }, Program: program, ProgramHash: crypto.PoseidonArray(program...), SemanticVersion: cairo1.ContractClassVersion, - Compiled: compiledC, + Compiled: compiled, } default: panic(fmt.Errorf("unsupported class %T", cls)) @@ -71,6 +81,39 @@ func adaptSierra(e *spec.SierraEntryPoint) core.SierraEntryPoint { func adaptEntryPoint(e *spec.EntryPoint) core.EntryPoint { return core.EntryPoint{ Selector: AdaptFelt(e.Selector), - Offset: AdaptFelt(e.Offset), + Offset: new(felt.Felt).SetUint64(e.Offset), + } +} + +func createCompiledClass(cairo1 *spec.Cairo1Class) (*core.CompiledClass, error) { + if cairo1 == nil { + return nil, nil } + + adapt := func(ep *spec.SierraEntryPoint) starknet.SierraEntryPoint { + return starknet.SierraEntryPoint{ + Index: ep.Index, + Selector: AdaptFelt(ep.Selector), + } + } + ep := cairo1.EntryPoints + def := &starknet.SierraDefinition{ + Abi: cairo1.Abi, + EntryPoints: starknet.SierraEntryPoints{ + // WARNING: usage of utils.NonNilSlice is essential, otherwise compilation will finish with errors + // todo move NonNilSlice to Compile ? + Constructor: utils.Map(utils.NonNilSlice(ep.Constructors), adapt), + External: utils.Map(utils.NonNilSlice(ep.Externals), adapt), + L1Handler: utils.Map(utils.NonNilSlice(ep.L1Handlers), adapt), + }, + Program: utils.Map(cairo1.Program, AdaptFelt), + Version: cairo1.ContractClassVersion, + } + + compiledClass, err := starknet.Compile(def) + if err != nil { + return nil, err + } + + return sn2core.AdaptCompiledClass(compiledClass) } diff --git a/adapters/p2p2core/felt.go b/adapters/p2p2core/felt.go index 5e558f6433..62c5f64cd7 100644 --- a/adapters/p2p2core/felt.go +++ b/adapters/p2p2core/felt.go @@ -29,3 +29,8 @@ func adapt(v interface{ GetElements() []byte }) *felt.Felt { return new(felt.Felt).SetBytes(v.GetElements()) } + +func AdaptUint128(u *spec.Uint128) *felt.Felt { + // todo handle u128 + return &felt.Zero +} diff --git a/adapters/p2p2core/receipt.go b/adapters/p2p2core/receipt.go index 2dd583a616..66c28a1499 100644 --- a/adapters/p2p2core/receipt.go +++ b/adapters/p2p2core/receipt.go @@ -2,11 +2,13 @@ package p2p2core import ( "github.com/NethermindEth/juno/core" + "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" ) -func AdaptReceipt(r *spec.Receipt) *core.TransactionReceipt { +// todo change type of txHash to spec +func AdaptReceipt(r *spec.Receipt, txHash *felt.Felt) *core.TransactionReceipt { var common *spec.Receipt_Common switch r.Type.(type) { @@ -24,13 +26,14 @@ func AdaptReceipt(r *spec.Receipt) *core.TransactionReceipt { return &core.TransactionReceipt{ Fee: AdaptFelt(common.ActualFee), + FeeUnit: 0, // todo(kirill) recheck Events: nil, // todo SPEC , current specification does not maintain the mapping of events to transactions receipts ExecutionResources: adaptExecutionResources(common.ExecutionResources), L1ToL2Message: nil, L2ToL1Message: utils.Map(common.MessagesSent, adaptMessageToL1), - TransactionHash: AdaptHash(common.TransactionHash), - Reverted: common.RevertReason != "", // todo is it correct? - RevertReason: common.RevertReason, + TransactionHash: txHash, + Reverted: common.RevertReason != nil, // todo is it correct? + RevertReason: common.GetRevertReason(), } } @@ -40,24 +43,31 @@ func adaptExecutionResources(er *spec.Receipt_ExecutionResources) *core.Executio } return &core.ExecutionResources{ BuiltinInstanceCounter: core.BuiltinInstanceCounter{ - Pedersen: uint64(er.GetBuiltins().GetPedersen()), - RangeCheck: uint64(er.GetBuiltins().GetRangeCheck()), - Bitwise: uint64(er.GetBuiltins().GetBitwise()), - Output: 0, // todo SPEC - Ecsda: uint64(er.GetBuiltins().GetEcdsa()), - EcOp: uint64(er.GetBuiltins().GetEcOp()), - Keccak: uint64(er.GetBuiltins().GetKeccak()), - Poseidon: uint64(er.GetBuiltins().GetPoseidon()), + Pedersen: uint64(er.GetBuiltins().GetPedersen()), + RangeCheck: uint64(er.GetBuiltins().GetRangeCheck()), + Bitwise: uint64(er.GetBuiltins().GetBitwise()), + Output: uint64(er.GetBuiltins().GetOutput()), + Ecsda: uint64(er.GetBuiltins().GetEcdsa()), + EcOp: uint64(er.GetBuiltins().GetEcOp()), + Keccak: uint64(er.GetBuiltins().GetKeccak()), + Poseidon: uint64(er.GetBuiltins().GetPoseidon()), + SegmentArena: 0, // todo(kirill) recheck + // todo(kirill) set fields after spec update + AddMod: 0, + MulMod: 0, + RangeCheck96: 0, }, - MemoryHoles: uint64(er.MemoryHoles), - Steps: uint64(er.Steps), // todo SPEC 32 -> 64 bytes + DataAvailability: nil, // todo(kirill) recheck + MemoryHoles: uint64(er.MemoryHoles), + Steps: uint64(er.Steps), // todo SPEC 32 -> 64 bytes + TotalGasConsumed: nil, // todo(kirill) fill after spec update } } func adaptMessageToL1(m *spec.MessageToL1) *core.L2ToL1Message { return &core.L2ToL1Message{ From: AdaptFelt(m.FromAddress), - Payload: utils.Map(m.Payload, AdaptFelt), To: AdaptEthAddress(m.ToAddress), + Payload: utils.Map(m.Payload, AdaptFelt), } } diff --git a/adapters/p2p2core/state.go b/adapters/p2p2core/state.go index fa6e857c37..a51958798c 100644 --- a/adapters/p2p2core/state.go +++ b/adapters/p2p2core/state.go @@ -1,15 +1,17 @@ package p2p2core import ( + "errors" "fmt" "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/core/felt" + "github.com/NethermindEth/juno/db" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" ) -func AdaptStateDiff(s *spec.StateDiff, classes []*spec.Class) *core.StateDiff { +func AdaptStateDiff(reader core.StateReader, contractDiffs []*spec.ContractDiff, classes []*spec.Class) *core.StateDiff { var ( declaredV0Classes []*felt.Felt declaredV1Classes = make(map[felt.Felt]*felt.Felt) @@ -25,28 +27,60 @@ func AdaptStateDiff(s *spec.StateDiff, classes []*spec.Class) *core.StateDiff { declaredV0Classes = append(declaredV0Classes, h) case *core.Cairo1Class: declaredV1Classes[*h] = c.Compiled.Hash() + // todo add type? } } + var deployedContracts, replacedClasses []addrToClassHash // addr -> {key -> value, ...} storageDiffs := make(map[felt.Felt]map[felt.Felt]*felt.Felt) nonces := make(map[felt.Felt]*felt.Felt) - for _, diff := range s.ContractDiffs { + for _, diff := range contractDiffs { address := AdaptAddress(diff.Address) if diff.Nonce != nil { nonces[*address] = AdaptFelt(diff.Nonce) } storageDiffs[*address] = utils.ToMap(diff.Values, adaptStoredValue) + + // todo recheck this logic + if diff.ClassHash != nil { + addrToClsHash := addrToClassHash{ + addr: diff.Address, + classHash: diff.ClassHash, + } + + var stateClassHash *felt.Felt + if reader == nil { + // zero block + stateClassHash = &felt.Zero + } else { + var err error + stateClassHash, err = reader.ContractClassHash(address) + if err != nil { + if errors.Is(err, db.ErrKeyNotFound) { + stateClassHash = &felt.Zero + } else { + panic(err) + } + } + } + + if !stateClassHash.IsZero() { + replacedClasses = append(replacedClasses, addrToClsHash) + } else { + deployedContracts = append(deployedContracts, addrToClsHash) + } + } } return &core.StateDiff{ StorageDiffs: storageDiffs, Nonces: nonces, - DeployedContracts: utils.ToMap(s.DeployedContracts, adaptAddrToClassHash), + DeployedContracts: utils.ToMap(deployedContracts, adaptAddrToClassHash), DeclaredV0Classes: declaredV0Classes, DeclaredV1Classes: declaredV1Classes, - ReplacedClasses: utils.ToMap(s.ReplacedClasses, adaptAddrToClassHash), + ReplacedClasses: utils.ToMap(replacedClasses, adaptAddrToClassHash), } } @@ -54,7 +88,12 @@ func adaptStoredValue(v *spec.ContractStoredValue) (felt.Felt, *felt.Felt) { return *AdaptFelt(v.Key), AdaptFelt(v.Value) } +type addrToClassHash struct { + addr *spec.Address + classHash *spec.Hash +} + // todo rename -func adaptAddrToClassHash(v *spec.StateDiff_ContractAddrToClassHash) (felt.Felt, *felt.Felt) { - return *AdaptAddress(v.ContractAddr), AdaptHash(v.ClassHash) +func adaptAddrToClassHash(v addrToClassHash) (felt.Felt, *felt.Felt) { + return *AdaptAddress(v.addr), AdaptHash(v.classHash) } diff --git a/adapters/p2p2core/transaction.go b/adapters/p2p2core/transaction.go index b8506a55b4..7abd23cc26 100644 --- a/adapters/p2p2core/transaction.go +++ b/adapters/p2p2core/transaction.go @@ -2,7 +2,6 @@ package p2p2core import ( "fmt" - "strconv" "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/core/felt" @@ -30,13 +29,22 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_DeclareV0_: tx := t.GetDeclareV0() declareTx := &core.DeclareTransaction{ + TransactionHash: nil, // overridden below Nonce: nil, // for v0 nonce is not used for hash calculation ClassHash: AdaptHash(tx.ClassHash), SenderAddress: AdaptAddress(tx.Sender), MaxFee: AdaptFelt(tx.MaxFee), TransactionSignature: adaptAccountSignature(tx.Signature), Version: txVersion(0), - CompiledClassHash: nil, + // version 2 field + CompiledClassHash: nil, + // version 3 fields (zero values) + ResourceBounds: nil, + PaymasterData: nil, + AccountDeploymentData: nil, + Tip: 0, + NonceDAMode: 0, + FeeDAMode: 0, } declareTx.TransactionHash = hash(declareTx) @@ -44,13 +52,22 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_DeclareV1_: tx := t.GetDeclareV1() declareTx := &core.DeclareTransaction{ + TransactionHash: nil, // overridden below ClassHash: AdaptHash(tx.ClassHash), SenderAddress: AdaptAddress(tx.Sender), MaxFee: AdaptFelt(tx.MaxFee), TransactionSignature: adaptAccountSignature(tx.Signature), Nonce: AdaptFelt(tx.Nonce), Version: txVersion(1), - CompiledClassHash: nil, + // version 2 field + CompiledClassHash: nil, + // version 3 fields (zero values) + ResourceBounds: nil, + PaymasterData: nil, + AccountDeploymentData: nil, + Tip: 0, + NonceDAMode: 0, + FeeDAMode: 0, } declareTx.TransactionHash = hash(declareTx) @@ -58,13 +75,21 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_DeclareV2_: tx := t.GetDeclareV2() declareTx := &core.DeclareTransaction{ + TransactionHash: nil, // overridden below ClassHash: AdaptHash(tx.ClassHash), SenderAddress: AdaptAddress(tx.Sender), MaxFee: AdaptFelt(tx.MaxFee), TransactionSignature: adaptAccountSignature(tx.Signature), Nonce: AdaptFelt(tx.Nonce), Version: txVersion(2), - CompiledClassHash: AdaptFelt(tx.CompiledClassHash), + CompiledClassHash: AdaptHash(tx.CompiledClassHash), + // version 3 fields (zero values) + ResourceBounds: nil, + PaymasterData: nil, + AccountDeploymentData: nil, + Tip: 0, + NonceDAMode: 0, + FeeDAMode: 0, } declareTx.TransactionHash = hash(declareTx) @@ -72,33 +97,34 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_DeclareV3_: tx := t.GetDeclareV3() - nDAMode, err := strconv.ParseUint(tx.GetNonceDomain(), 10, 32) + nDAMode, err := adaptVolitionDomain(tx.NonceDataAvailabilityMode) if err != nil { - panic(fmt.Sprintf("Failed to convert Nonce DA mode: %v to uint32", tx.GetNonceDomain())) + panic(fmt.Sprintf("Failed to convert Nonce DA mode: %v to uint32", tx.NonceDataAvailabilityMode)) } - fDAMode, err := strconv.ParseUint(tx.GetFeeDomain(), 10, 32) + fDAMode, err := adaptVolitionDomain(tx.FeeDataAvailabilityMode) if err != nil { - panic(fmt.Sprintf("Failed to convert Fee DA mode: %v to uint32", tx.GetFeeDomain())) + panic(fmt.Sprintf("Failed to convert Fee DA mode: %v to uint32", tx.FeeDataAvailabilityMode)) } declareTx := &core.DeclareTransaction{ + TransactionHash: nil, // overridden below ClassHash: AdaptHash(tx.ClassHash), SenderAddress: AdaptAddress(tx.Sender), - MaxFee: AdaptFelt(tx.MaxFee), + MaxFee: nil, // in 3 version this field was removed TransactionSignature: adaptAccountSignature(tx.Signature), Nonce: AdaptFelt(tx.Nonce), Version: txVersion(3), - CompiledClassHash: AdaptFelt(tx.CompiledClassHash), - Tip: AdaptFelt(tx.Tip).Uint64(), + CompiledClassHash: AdaptHash(tx.CompiledClassHash), + Tip: tx.Tip, ResourceBounds: map[core.Resource]core.ResourceBounds{ - core.ResourceL1Gas: adaptResourceLimits(tx.L1Gas), - core.ResourceL2Gas: adaptResourceLimits(tx.L2Gas), + core.ResourceL1Gas: adaptResourceLimits(tx.ResourceBounds.L1Gas), + core.ResourceL2Gas: adaptResourceLimits(tx.ResourceBounds.L2Gas), }, - PaymasterData: nil, // Todo: P2P needs to change the pay master data to a list - AccountDeploymentData: nil, // Todo: update p2p spec to include this - NonceDAMode: core.DataAvailabilityMode(nDAMode), - FeeDAMode: core.DataAvailabilityMode(fDAMode), + PaymasterData: utils.Map(tx.PaymasterData, AdaptFelt), + AccountDeploymentData: utils.Map(tx.AccountDeploymentData, AdaptFelt), + NonceDAMode: nDAMode, + FeeDAMode: fDAMode, } declareTx.TransactionHash = hash(declareTx) @@ -110,6 +136,7 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact classHash := AdaptHash(tx.ClassHash) callData := utils.Map(tx.Calldata, AdaptFelt) deployTx := &core.DeployTransaction{ + TransactionHash: nil, // overridden below ContractAddress: core.ContractAddress(&felt.Zero, classHash, addressSalt, callData), ContractAddressSalt: addressSalt, ClassHash: classHash, @@ -127,6 +154,7 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact callData := utils.Map(tx.Calldata, AdaptFelt) deployAccTx := &core.DeployAccountTransaction{ DeployTransaction: core.DeployTransaction{ + TransactionHash: nil, // overridden below ContractAddressSalt: addressSalt, ContractAddress: core.ContractAddress(&felt.Zero, classHash, addressSalt, callData), ClassHash: classHash, @@ -136,6 +164,12 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact MaxFee: AdaptFelt(tx.MaxFee), TransactionSignature: adaptAccountSignature(tx.Signature), Nonce: AdaptFelt(tx.Nonce), + // version 3 fields (zero values) + ResourceBounds: nil, + PaymasterData: nil, + Tip: 0, + NonceDAMode: 0, + FeeDAMode: 0, } deployAccTx.DeployTransaction.TransactionHash = hash(deployAccTx) @@ -143,14 +177,14 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_DeployAccountV3_: tx := t.GetDeployAccountV3() - nDAMode, err := strconv.ParseUint(tx.GetNonceDomain(), 10, 32) + nDAMode, err := adaptVolitionDomain(tx.NonceDataAvailabilityMode) if err != nil { - panic(fmt.Sprintf("Failed to convert Nonce DA mode: %v to uint32", tx.GetNonceDomain())) + panic(fmt.Sprintf("Failed to convert Nonce DA mode: %v to uint32", tx.NonceDataAvailabilityMode)) } - fDAMode, err := strconv.ParseUint(tx.GetFeeDomain(), 10, 32) + fDAMode, err := adaptVolitionDomain(tx.FeeDataAvailabilityMode) if err != nil { - panic(fmt.Sprintf("Failed to convert Fee DA mode: %v to uint32", tx.GetFeeDomain())) + panic(fmt.Sprintf("Failed to convert Fee DA mode: %v to uint32", tx.FeeDataAvailabilityMode)) } addressSalt := AdaptFelt(tx.AddressSalt) @@ -158,23 +192,24 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact callData := utils.Map(tx.Calldata, AdaptFelt) deployAccTx := &core.DeployAccountTransaction{ DeployTransaction: core.DeployTransaction{ + TransactionHash: nil, // overridden below ContractAddressSalt: addressSalt, ContractAddress: core.ContractAddress(&felt.Zero, classHash, addressSalt, callData), ClassHash: classHash, ConstructorCallData: callData, Version: txVersion(3), }, - MaxFee: AdaptFelt(tx.MaxFee), + MaxFee: nil, // todo(kirill) update spec? missing field TransactionSignature: adaptAccountSignature(tx.Signature), Nonce: AdaptFelt(tx.Nonce), - Tip: AdaptFelt(tx.Tip).Uint64(), + Tip: tx.Tip, ResourceBounds: map[core.Resource]core.ResourceBounds{ - core.ResourceL1Gas: adaptResourceLimits(tx.L1Gas), - core.ResourceL2Gas: adaptResourceLimits(tx.L2Gas), + core.ResourceL1Gas: adaptResourceLimits(tx.ResourceBounds.L1Gas), + core.ResourceL2Gas: adaptResourceLimits(tx.ResourceBounds.L2Gas), }, - PaymasterData: nil, // Todo: P2P needs to change the pay master data to a list - NonceDAMode: core.DataAvailabilityMode(nDAMode), - FeeDAMode: core.DataAvailabilityMode(fDAMode), + PaymasterData: utils.Map(tx.PaymasterData, AdaptFelt), + NonceDAMode: nDAMode, + FeeDAMode: fDAMode, } deployAccTx.DeployTransaction.TransactionHash = hash(deployAccTx) @@ -182,14 +217,23 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_InvokeV0_: tx := t.GetInvokeV0() invTx := &core.InvokeTransaction{ - Nonce: nil, // not used in v0 - SenderAddress: nil, // not used in v0 + TransactionHash: nil, // overridden below CallData: utils.Map(tx.Calldata, AdaptFelt), TransactionSignature: adaptAccountSignature(tx.Signature), MaxFee: AdaptFelt(tx.MaxFee), ContractAddress: AdaptAddress(tx.Address), Version: txVersion(0), EntryPointSelector: AdaptFelt(tx.EntryPointSelector), + // version 1 fields (zero values) + Nonce: nil, + SenderAddress: nil, + // version 3 fields (zero values) + ResourceBounds: nil, + Tip: 0, + PaymasterData: nil, + AccountDeploymentData: nil, + NonceDAMode: 0, + FeeDAMode: 0, } invTx.TransactionHash = hash(invTx) @@ -197,7 +241,8 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_InvokeV1_: tx := t.GetInvokeV1() invTx := &core.InvokeTransaction{ - ContractAddress: nil, // not used in v1 + TransactionHash: nil, // overridden below + ContractAddress: nil, // todo call core.ContractAddress() ? Nonce: AdaptFelt(tx.Nonce), SenderAddress: AdaptAddress(tx.Sender), CallData: utils.Map(tx.Calldata, AdaptFelt), @@ -205,6 +250,13 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact MaxFee: AdaptFelt(tx.MaxFee), Version: txVersion(1), EntryPointSelector: nil, + // version 3 fields (zero values) + ResourceBounds: nil, + Tip: 0, + PaymasterData: nil, + AccountDeploymentData: nil, + NonceDAMode: 0, + FeeDAMode: 0, } invTx.TransactionHash = hash(invTx) @@ -212,33 +264,35 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_InvokeV3_: tx := t.GetInvokeV3() - nDAMode, err := strconv.ParseUint(tx.GetNonceDomain(), 10, 32) + nDAMode, err := adaptVolitionDomain(tx.NonceDataAvailabilityMode) if err != nil { - panic(fmt.Sprintf("Failed to convert Nonce DA mode: %v to uint32", tx.GetNonceDomain())) + panic(fmt.Sprintf("Failed to convert Nonce DA mode: %v to uint32", tx.NonceDataAvailabilityMode)) } - fDAMode, err := strconv.ParseUint(tx.GetFeeDomain(), 10, 32) + fDAMode, err := adaptVolitionDomain(tx.FeeDataAvailabilityMode) if err != nil { - panic(fmt.Sprintf("Failed to convert Fee DA mode: %v to uint32", tx.GetFeeDomain())) + panic(fmt.Sprintf("Failed to convert Fee DA mode: %v to uint32", tx.FeeDataAvailabilityMode)) } invTx := &core.InvokeTransaction{ - ContractAddress: nil, // is it ok? + TransactionHash: nil, // overridden below + ContractAddress: nil, // todo call core.ContractAddress() ? CallData: utils.Map(tx.Calldata, AdaptFelt), TransactionSignature: adaptAccountSignature(tx.Signature), - MaxFee: AdaptFelt(tx.MaxFee), + MaxFee: nil, // in 3 version this field was removed Version: txVersion(3), Nonce: AdaptFelt(tx.Nonce), SenderAddress: AdaptAddress(tx.Sender), EntryPointSelector: nil, - Tip: AdaptFelt(tx.Tip).Uint64(), + Tip: tx.Tip, ResourceBounds: map[core.Resource]core.ResourceBounds{ - core.ResourceL1Gas: adaptResourceLimits(tx.L1Gas), - core.ResourceL2Gas: adaptResourceLimits(tx.L2Gas), + core.ResourceL1Gas: adaptResourceLimits(tx.ResourceBounds.L1Gas), + core.ResourceL2Gas: adaptResourceLimits(tx.ResourceBounds.L2Gas), }, - PaymasterData: nil, // Todo: P2P needs to change the pay master data to a list - NonceDAMode: core.DataAvailabilityMode(nDAMode), - FeeDAMode: core.DataAvailabilityMode(fDAMode), + PaymasterData: utils.Map(tx.PaymasterData, AdaptFelt), + NonceDAMode: nDAMode, + FeeDAMode: fDAMode, + AccountDeploymentData: nil, // todo(kirill) recheck } invTx.TransactionHash = hash(invTx) @@ -246,6 +300,7 @@ func AdaptTransaction(t *spec.Transaction, network *utils.Network) core.Transact case *spec.Transaction_L1Handler: tx := t.GetL1Handler() l1Tx := &core.L1HandlerTransaction{ + TransactionHash: nil, // overridden below ContractAddress: AdaptAddress(tx.Address), EntryPointSelector: AdaptFelt(tx.EntryPointSelector), Nonce: AdaptFelt(tx.Nonce), @@ -274,3 +329,14 @@ func adaptAccountSignature(s *spec.AccountSignature) []*felt.Felt { func txVersion(v uint64) *core.TransactionVersion { return new(core.TransactionVersion).SetUint64(v) } + +func adaptVolitionDomain(v spec.VolitionDomain) (core.DataAvailabilityMode, error) { + switch v { + case spec.VolitionDomain_L1: + return core.DAModeL1, nil + case spec.VolitionDomain_L2: + return core.DAModeL2, nil + default: + return 0, fmt.Errorf("unknown volition domain %d", v) + } +} diff --git a/adapters/sn2core/sn2core.go b/adapters/sn2core/sn2core.go index 479d65218c..ead1605a64 100644 --- a/adapters/sn2core/sn2core.go +++ b/adapters/sn2core/sn2core.go @@ -67,6 +67,7 @@ func AdaptTransactionReceipt(response *starknet.TransactionReceipt) *core.Transa } return &core.TransactionReceipt{ + FeeUnit: 0, // todo(kirill) recheck Fee: response.ActualFee, TransactionHash: response.TransactionHash, Events: utils.Map(utils.NonNilSlice(response.Events), AdaptEvent), @@ -78,6 +79,17 @@ func AdaptTransactionReceipt(response *starknet.TransactionReceipt) *core.Transa } } +func adaptGasConsumed(response *starknet.GasConsumed) *core.GasConsumed { + if response == nil { + return nil + } + + return &core.GasConsumed{ + L1Gas: response.L1Gas, + L1DataGas: response.L1DataGas, + } +} + func AdaptEvent(response *starknet.Event) *core.Event { if response == nil { return nil @@ -100,6 +112,7 @@ func AdaptExecutionResources(response *starknet.ExecutionResources) *core.Execut MemoryHoles: response.MemoryHoles, Steps: response.Steps, DataAvailability: (*core.DataAvailability)(response.DataAvailability), + TotalGasConsumed: adaptGasConsumed(response.TotalGasConsumed), } } @@ -255,15 +268,11 @@ func AdaptCairo1Class(response *starknet.SierraDefinition, compiledClass *starkn class.ProgramHash = crypto.PoseidonArray(class.Program...) class.Abi = response.Abi - class.AbiHash, err = crypto.StarknetKeccak([]byte(class.Abi)) - if err != nil { - return nil, err - } + class.AbiHash = crypto.StarknetKeccak([]byte(class.Abi)) adapt := func(ep starknet.SierraEntryPoint) core.SierraEntryPoint { return core.SierraEntryPoint{Index: ep.Index, Selector: ep.Selector} } - class.EntryPoints.External = utils.Map(utils.NonNilSlice(response.EntryPoints.External), adapt) class.EntryPoints.L1Handler = utils.Map(utils.NonNilSlice(response.EntryPoints.L1Handler), adapt) class.EntryPoints.Constructor = utils.Map(utils.NonNilSlice(response.EntryPoints.Constructor), adapt) diff --git a/adapters/vm2core/vm2core.go b/adapters/vm2core/vm2core.go index 57efdc210f..3c83713740 100644 --- a/adapters/vm2core/vm2core.go +++ b/adapters/vm2core/vm2core.go @@ -21,9 +21,15 @@ func AdaptExecutionResources(resources *vm.ExecutionResources) *core.ExecutionRe Keccak: resources.Keccak, Poseidon: resources.Poseidon, SegmentArena: resources.SegmentArena, + Output: 0, // todo(kirill) recheck, add Output field to core? + AddMod: resources.AddMod, + MulMod: resources.MulMod, + RangeCheck96: resources.RangeCheck96, }, - MemoryHoles: resources.MemoryHoles, - Steps: resources.Steps, + MemoryHoles: resources.MemoryHoles, + Steps: resources.Steps, + DataAvailability: adaptDA(resources.DataAvailability), + TotalGasConsumed: nil, // todo: fill after 0.13.2 } } @@ -56,3 +62,14 @@ func AdaptOrderedEvents(events []vm.OrderedEvent) []*core.Event { }) return utils.Map(events, AdaptOrderedEvent) } + +func adaptDA(da *vm.DataAvailability) *core.DataAvailability { + if da == nil { + return nil + } + + return &core.DataAvailability{ + L1Gas: da.L1Gas, + L1DataGas: da.L1DataGas, + } +} diff --git a/blockchain/blockchain.go b/blockchain/blockchain.go index 36d622991c..ee2411c471 100644 --- a/blockchain/blockchain.go +++ b/blockchain/blockchain.go @@ -51,7 +51,7 @@ type Reader interface { var ( ErrParentDoesNotMatchHead = errors.New("block's parent hash does not match head block hash") - supportedStarknetVersion = semver.MustParse("0.13.1") + supportedStarknetVersion = semver.MustParse("0.13.2") ) func checkBlockVersion(protocolVersion string) error { @@ -340,6 +340,7 @@ func (b *Blockchain) Store(block *core.Block, blockCommitments *core.BlockCommit if err := verifyBlock(txn, block); err != nil { return err } + if err := core.NewState(txn).Update(block.Number, stateUpdate, newClasses); err != nil { return err } @@ -636,7 +637,7 @@ func (b *Blockchain) SanityCheckNewHeight(block *core.Block, stateUpdate *core.S return nil, err } - return core.VerifyBlockHash(block, b.network) + return core.VerifyBlockHash(block, b.network, stateUpdate.StateDiff) } type txAndReceiptDBKey struct { diff --git a/blockchain/blockchain_test.go b/blockchain/blockchain_test.go index 76ebc1b164..c0c3666a91 100644 --- a/blockchain/blockchain_test.go +++ b/blockchain/blockchain_test.go @@ -268,6 +268,31 @@ func TestStore(t *testing.T) { }) } +func TestBlockCommitments(t *testing.T) { + chain := blockchain.New(pebble.NewMemTest(t), &utils.Mainnet) + client := feeder.NewTestClient(t, &utils.Mainnet) + gw := adaptfeeder.New(client) + + b, err := gw.BlockByNumber(context.Background(), 0) + require.NoError(t, err) + + su, err := gw.StateUpdate(context.Background(), 0) + require.NoError(t, err) + + expectedCommitments := &core.BlockCommitments{ + TransactionCommitment: new(felt.Felt).SetUint64(1), + EventCommitment: new(felt.Felt).SetUint64(2), + ReceiptCommitment: new(felt.Felt).SetUint64(3), + StateDiffCommitment: new(felt.Felt).SetUint64(4), + } + + require.NoError(t, chain.Store(b, expectedCommitments, su, nil)) + + commitments, err := chain.BlockCommitmentsByNumber(0) + require.NoError(t, err) + require.Equal(t, expectedCommitments, commitments) +} + func TestTransactionAndReceipt(t *testing.T) { chain := blockchain.New(pebble.NewMemTest(t), &utils.Mainnet) diff --git a/clients/feeder/feeder.go b/clients/feeder/feeder.go index f938da349e..82e99390ad 100644 --- a/clients/feeder/feeder.go +++ b/clients/feeder/feeder.go @@ -128,10 +128,8 @@ func newTestServer(t *testing.T, network *utils.Network) *httptest.Server { assert.Equal(t, []string{"API_KEY"}, r.Header["X-Throttling-Bypass"]) assert.Equal(t, []string{"Juno/v0.0.1-test Starknet Implementation"}, r.Header["User-Agent"]) - wd, err := os.Getwd() require.NoError(t, err) - base := wd[:strings.LastIndex(wd, "juno")+4] queryArg := "" dir := "" const blockNumberArg = "blockNumber" @@ -173,7 +171,11 @@ func newTestServer(t *testing.T, network *utils.Network) *httptest.Server { return } - path := filepath.Join(base, "clients", "feeder", "testdata", network.String(), dir, fileName[0]+".json") + dataPath, err := findTargetDirectory("clients/feeder/testdata") + if err != nil { + t.Fatalf("failed to find testdata directory: %v", err) + } + path := filepath.Join(dataPath, network.String(), dir, fileName[0]+".json") read, err := os.ReadFile(path) if err != nil { handleNotFound(dir, queryArg, w) @@ -447,3 +449,23 @@ func (c *Client) BlockTrace(ctx context.Context, blockHash string) (*starknet.Bl } return traces, nil } + +func findTargetDirectory(targetRelPath string) (string, error) { + root, err := os.Getwd() + if err != nil { + return "", err + } + for { + targetPath := filepath.Join(root, targetRelPath) + if _, err := os.Stat(targetPath); err == nil { + return targetPath, nil + } else if !os.IsNotExist(err) { + return "", err + } + newRoot := filepath.Dir(root) + if newRoot == root { + return "", os.ErrNotExist + } + root = newRoot + } +} diff --git a/clients/feeder/feeder_test.go b/clients/feeder/feeder_test.go index 8aa4fe94fa..a22590a943 100644 --- a/clients/feeder/feeder_test.go +++ b/clients/feeder/feeder_test.go @@ -334,6 +334,22 @@ func TestBlockHeaderV0131Unmarshal(t *testing.T) { require.Equal(t, uint64(128), block.Receipts[0].ExecutionResources.DataAvailability.L1DataGas) } +func TestBlockHeaderv0132Unmarshal(t *testing.T) { + client := feeder.NewTestClient(t, &utils.SepoliaIntegration) + block, err := client.Block(context.Background(), "35748") + require.NoError(t, err) + + // Only focus on checking the new fields + require.Equal(t, utils.HexToFelt(t, "0x1ea2a9cfa3df5297d58c0a04d09d276bc68d40fe64701305bbe2ed8f417e869"), block.Hash) + require.Equal(t, utils.HexToFelt(t, "0x77140bef51bbb4d1932f17cc5081825ff18465a1df4440ca0429a4fa80f1dc5"), block.ParentHash) + require.Equal(t, utils.HexToFelt(t, "0x6f12628d21a8df7f158b631d801fc0dd20034b9e22eca255bddc0c1c1bc283f"), block.ReceiptCommitment) + require.Equal(t, utils.HexToFelt(t, "0x23587c54d590b57b8e25acbf1e1a422eb4cd104e95ee4a681021a6bb7456afa"), block.StateDiffCommitment) + require.Equal(t, uint64(6), block.StateDiffLength) + require.Equal(t, "0.13.2", block.Version) + require.Equal(t, uint64(117620), block.Receipts[0].ExecutionResources.TotalGasConsumed.L1Gas) + require.Equal(t, uint64(192), block.Receipts[0].ExecutionResources.TotalGasConsumed.L1DataGas) +} + func TestClassV0Unmarshal(t *testing.T) { client := feeder.NewTestClient(t, &utils.Mainnet) diff --git a/clients/feeder/testdata/sepolia-integration/block/35748.json b/clients/feeder/testdata/sepolia-integration/block/35748.json new file mode 100644 index 0000000000..870aaf3836 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/block/35748.json @@ -0,0 +1,134 @@ +{ + "block_hash": "0x1ea2a9cfa3df5297d58c0a04d09d276bc68d40fe64701305bbe2ed8f417e869", + "parent_block_hash": "0x77140bef51bbb4d1932f17cc5081825ff18465a1df4440ca0429a4fa80f1dc5", + "block_number": 35748, + "state_root": "0x38e01cbe2d5721780b2e1a478fd131f2ffcc099528dd2e1289f26b027127790", + "transaction_commitment": "0x54f43cf29b80cc83aef36f3195b73cb165ad12553eae147b4cce62adbf0b180", + "event_commitment": "0x12dfbe9dbbaba9c34b5a4c0ba622dcd8e2bb0264481c77f073008b59825a758", + "receipt_commitment": "0x6f12628d21a8df7f158b631d801fc0dd20034b9e22eca255bddc0c1c1bc283f", + "state_diff_commitment": "0x23587c54d590b57b8e25acbf1e1a422eb4cd104e95ee4a681021a6bb7456afa", + "state_diff_length": 6, + "status": "ACCEPTED_ON_L1", + "l1_da_mode": "BLOB", + "l1_gas_price": { + "price_in_wei": "0x7427e87c4", + "price_in_fri": "0x9346cee0949c" + }, + "l1_data_gas_price": { + "price_in_wei": "0x3b095dc6", + "price_in_fri": "0x4ada914d823" + }, + "transactions": [ + { + "transaction_hash": "0x5ac644bbd6ae98d3be2d988439854e33f0961e24f349a63b43e16d172bfe747", + "version": "0x2", + "max_fee": "0x4f6ac5195e92e4", + "signature": [ + "0x43ad3c7c77f7b7762db41ee9d33958813ee25efed77bc7199e08f4f40b1a59", + "0xfedb8715405faf28de29a07a3f3f06f078bac3fcb67ac7f5ae392e15a75921" + ], + "nonce": "0xd", + "class_hash": "0x2fd9e122406490dc0f299f3070eaaa8df854d97ff81b47e91da32b8cd9d757a", + "compiled_class_hash": "0x55d1e0ee31f8f937fc75b37045129fbe0e01747baacb44b89d2d3d2c649117e", + "sender_address": "0x472aa8128e01eb0df145810c9511a92852d62a68ba8198ce5fa414e6337a365", + "type": "DECLARE" + }, + { + "transaction_hash": "0x21bc0afe54123b946855e1bf9389d943313df5c5c396fbf0630234a44f6f592", + "version": "0x2", + "max_fee": "0xe6e9346a5ae75a", + "signature": [ + "0x12a928f7042a66c5419fc5182da6879c357f013335d8b61d0ad774009afbb40", + "0x63479f4343dc2f068bff99fbbf0027250a672999fb5675cee1f2d1a64d33844" + ], + "nonce": "0xe", + "class_hash": "0x19de7881922dbc95846b1bb9464dba34046c46470cfb5e18b4cb2892fd4111f", + "compiled_class_hash": "0x6506976af042088c9ea49e6cc9c9a12838ee6920bb989dce02f5c6467667367", + "sender_address": "0x472aa8128e01eb0df145810c9511a92852d62a68ba8198ce5fa414e6337a365", + "type": "DECLARE" + } + ], + "timestamp": 1720426817, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "transaction_receipts": [ + { + "execution_status": "SUCCEEDED", + "transaction_index": 0, + "transaction_hash": "0x5ac644bbd6ae98d3be2d988439854e33f0961e24f349a63b43e16d172bfe747", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x472aa8128e01eb0df145810c9511a92852d62a68ba8198ce5fa414e6337a365", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xd07af45c84550", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 3950, + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 157, + "ecdsa_builtin": 1, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 117620, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xd07af45c84550" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 1, + "transaction_hash": "0x21bc0afe54123b946855e1bf9389d943313df5c5c396fbf0630234a44f6f592", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x472aa8128e01eb0df145810c9511a92852d62a68ba8198ce5fa414e6337a365", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0x471426f16c4330", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 3950, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ecdsa_builtin": 1, + "range_check_builtin": 157, + "pedersen_builtin": 16 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 641644, + "l1_data_gas": 192 + } + }, + "actual_fee": "0x471426f16c4330" + } + ], + "starknet_version": "0.13.2" +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/block/35749.json b/clients/feeder/testdata/sepolia-integration/block/35749.json new file mode 100644 index 0000000000..1118bb2952 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/block/35749.json @@ -0,0 +1,526 @@ +{ + "block_hash": "0x23b37df7360bc6c434d32a6a4f46f1705efb4fdf7142bfd66929f5b40035a6", + "parent_block_hash": "0x1ea2a9cfa3df5297d58c0a04d09d276bc68d40fe64701305bbe2ed8f417e869", + "block_number": 35749, + "state_root": "0x8638b46e7b92719ae718dc352c793d1df15c55956be999a539e9a27c260337", + "transaction_commitment": "0x6e4a0087d38efb943193326a3e50f5b50f6affd893cbf750e4c5a7f51d118cd", + "event_commitment": "0x70e08de500e11f8bce2949735ff6ea749520235c7dbcf1b058f1142ec0f9d61", + "receipt_commitment": "0x6977f725ce9c5d88611dc180e5b70c78c7b1dc82a4bbe4947534a41c3c2965b", + "state_diff_commitment": "0x323feeef51cadc14d4a025eb541227b177f69d1e6052854de262ca5e18055a1", + "state_diff_length": 17, + "status": "ACCEPTED_ON_L1", + "l1_da_mode": "BLOB", + "l1_gas_price": { + "price_in_wei": "0x9c3948c46", + "price_in_fri": "0xc62a5896c8ed" + }, + "l1_data_gas_price": { + "price_in_wei": "0x55a8378e", + "price_in_fri": "0x6ca75229e0a" + }, + "transactions": [ + { + "transaction_hash": "0x639b6e601676d9a70b639b34b38626aa26d3c51ae6fae8195dfe7729b4573d4", + "version": "0x0", + "contract_address": "0x4c5772d1914fe6ce891b64eb35bf3522aeae1315647314aac58b01137607f3f", + "entry_point_selector": "0x2d757788a8d8d6f21d1cd40bce38a8222d70654214e96ff95d8086e684fbee5", + "nonce": "0x4b", + "calldata": [ + "0x6bc7a9f029e5e0cfe84c5b8b1acc0ea952eaed3b", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x29a2241af62c0000", + "0x0" + ], + "type": "L1_HANDLER" + }, + { + "transaction_hash": "0x37ebf44a83f3337bb61f8c572d100fbfcbe94b5a8f8a190bb38c06c2e9b2d53", + "version": "0x0", + "contract_address": "0x594c1582459ea03f77deaf9eb7e3917d6994a03c13405ba42867f83d85f085d", + "entry_point_selector": "0x2d757788a8d8d6f21d1cd40bce38a8222d70654214e96ff95d8086e684fbee5", + "nonce": "0x4c", + "calldata": [ + "0x6fe45befc2c0e0f619d5ccfb6fa4d40590f6bc53", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x10f0cf064dd59200000", + "0x0" + ], + "type": "L1_HANDLER" + }, + { + "transaction_hash": "0xcdfc5bfdcd4de0f3aa61271e0123cce9d153d543b08f85eb55e63d04ae9c74", + "version": "0x3", + "signature": [ + "0x708bd207d80d802385109c08fc8dbf1bec7f5adfe063f2e95913996e81005d3", + "0x59f731369dab2219f4f5562e38088eaa389105988fb9eac1966bdfc4fa5c103" + ], + "nonce": "0x0", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0xe35fa931a000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "contract_address_salt": "0xbd8c4621bc47bf25dfdd21b4317e5cb93184814a9432f4b53c1ff338b00fd", + "class_hash": "0x2fd9e122406490dc0f299f3070eaaa8df854d97ff81b47e91da32b8cd9d757a", + "constructor_calldata": [ + "0x406a640b3b70dad390d661c088df1fbaeb5162a07d57cf29ba794e2b0e3c804" + ], + "type": "DEPLOY_ACCOUNT" + }, + { + "transaction_hash": "0x6963ec558745a5eb34927ff945631d0157e842df64baafc0acdc45c7530c436", + "version": "0x1", + "max_fee": "0x354a6ba7a18000", + "signature": [ + "0x11c610f8578c27feea285705a89ff2b0ad5ec5aa0910bdf3f313332bd55d406", + "0x961786f7a83874a4d2dfbba3b893dcce74a4164b422692aa35cd60e6da3242" + ], + "nonce": "0x1", + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x1", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", + "0x4", + "0x19de7881922dbc95846b1bb9464dba34046c46470cfb5e18b4cb2892fd4111f", + "0x2eac6e4530acbb64eeb07c7a1d81dbd359f14bc22edd20f149c0d63cdb356c7", + "0x0", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xc1a48191dd00ee2f05cb6b0c8f9e3e7767cbf13e55f0907f45339e662898c1", + "version": "0x3", + "signature": [ + "0x2ad5aee3fa655da192ebed4913e0dd7f295ac37d4b92c5a7546ca8fb28fd63c", + "0x1ecd893d8fe7a30e575b2a3af4f3ca1695537eca5ebf47e94a05d5db780ab6b" + ], + "nonce": "0x2", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0xe35fa931a000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x1", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", + "0x4", + "0x19de7881922dbc95846b1bb9464dba34046c46470cfb5e18b4cb2892fd4111f", + "0x2eac6e4530acbb64eeb07c7a1d81dbd359f14bc22edd20f149c0d63cdb356c8", + "0x0", + "0x0" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3b96f398134800efa13f9b6566ff7c23b2524e4d2f5d22d8fe9f684214473b2", + "version": "0x3", + "signature": [ + "0x1983a6378d753f2a3818470517cadb1e83299e1b2c060bd68a4b33062ad3d88", + "0x234dd02a8500a90fca140975c7fcdb4a356cf532d9d184d4fd7aa3eb44baf3b" + ], + "nonce": "0x3", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0xe35fa931a000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x1", + "0x65cdd7892656f7f89887c2c84bb3cea8f8c1b472a4f61838496c1fc7cc8733b", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x23bf06fbbf6634459b7cd052e704bcf80f07e85cbdede138ce8e1e3aace24ac", + "0x4617cc24c69548663a20ccd75a98355fab6a7c70b13cb427194943e34298ba6" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5d17a95dff10124142c65a247439ac7a33171b927f8e43b3d90360d6352bb83", + "version": "0x3", + "signature": [ + "0x34ee3d7ee07f00b8a91a9896a3505cc2a9660f62b95342c41ea45f91c4c9e11", + "0x19b88727c89ab7187569b1e3b639581d4f1dcd79a6b6242cf061f2931c5535" + ], + "nonce": "0x4", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0xe35fa931a000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x1", + "0x65cdd7892656f7f89887c2c84bb3cea8f8c1b472a4f61838496c1fc7cc8733b", + "0x2468d193cd15b621b24c2a602b8dbcfa5eaa14f88416c40c09d7fd12592cb4b", + "0x0" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + } + ], + "timestamp": 1720427256, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "transaction_receipts": [ + { + "execution_status": "SUCCEEDED", + "transaction_index": 0, + "transaction_hash": "0x639b6e601676d9a70b639b34b38626aa26d3c51ae6fae8195dfe7729b4573d4", + "l1_to_l2_consumed_message": { + "from_address": "0x6BC7a9f029E5E0CFe84c5b8b1acC0EA952EAed3b", + "to_address": "0x4c5772d1914fe6ce891b64eb35bf3522aeae1315647314aac58b01137607f3f", + "selector": "0x2d757788a8d8d6f21d1cd40bce38a8222d70654214e96ff95d8086e684fbee5", + "payload": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x29a2241af62c0000", + "0x0" + ], + "nonce": "0x4b" + }, + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x0", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x29a2241af62c0000", + "0x0" + ] + }, + { + "from_address": "0x4c5772d1914fe6ce891b64eb35bf3522aeae1315647314aac58b01137607f3f", + "keys": [ + "0x221e5a5008f7a28564f0eaa32cdeb0848d10657c449aed3e15d12150a7c2db3" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x29a2241af62c0000", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 10106, + "builtin_instance_counter": { + "range_check_builtin": 245, + "pedersen_builtin": 18, + "poseidon_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 128 + }, + "total_gas_consumed": { + "l1_gas": 17430, + "l1_data_gas": 128 + } + }, + "actual_fee": "0x0" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 1, + "transaction_hash": "0x37ebf44a83f3337bb61f8c572d100fbfcbe94b5a8f8a190bb38c06c2e9b2d53", + "l1_to_l2_consumed_message": { + "from_address": "0x6FE45BEFC2C0E0F619D5ccFB6fA4D40590f6bC53", + "to_address": "0x594c1582459ea03f77deaf9eb7e3917d6994a03c13405ba42867f83d85f085d", + "selector": "0x2d757788a8d8d6f21d1cd40bce38a8222d70654214e96ff95d8086e684fbee5", + "payload": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x10f0cf064dd59200000", + "0x0" + ], + "nonce": "0x4c" + }, + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x0", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a" + ], + "data": [ + "0x10f0cf064dd59200000", + "0x0" + ] + }, + { + "from_address": "0x594c1582459ea03f77deaf9eb7e3917d6994a03c13405ba42867f83d85f085d", + "keys": [ + "0x221e5a5008f7a28564f0eaa32cdeb0848d10657c449aed3e15d12150a7c2db3" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x10f0cf064dd59200000", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 11999, + "builtin_instance_counter": { + "bitwise_builtin": 4, + "range_check_builtin": 410, + "pedersen_builtin": 20, + "poseidon_builtin": 9 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 320 + }, + "total_gas_consumed": { + "l1_gas": 17434, + "l1_data_gas": 320 + } + }, + "actual_fee": "0x0" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 2, + "transaction_hash": "0xcdfc5bfdcd4de0f3aa61271e0123cce9d153d543b08f85eb55e63d04ae9c74", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0x10c777568945b6", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 5472, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 206, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 224 + }, + "total_gas_consumed": { + "l1_gas": 14, + "l1_data_gas": 224 + } + }, + "actual_fee": "0x10c777568945b6" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 3, + "transaction_hash": "0x6963ec558745a5eb34927ff945631d0157e842df64baafc0acdc45c7530c436", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0x1372c028dc4", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 8305, + "builtin_instance_counter": { + "pedersen_builtin": 29, + "poseidon_builtin": 5, + "range_check_builtin": 309, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 288 + }, + "total_gas_consumed": { + "l1_gas": 22, + "l1_data_gas": 288 + } + }, + "actual_fee": "0x1372c028dc4" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 4, + "transaction_hash": "0xc1a48191dd00ee2f05cb6b0c8f9e3e7767cbf13e55f0907f45339e662898c1", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0x18ab6763e70f9e", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 8305, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 5, + "range_check_builtin": 309, + "pedersen_builtin": 29 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 288 + }, + "total_gas_consumed": { + "l1_gas": 22, + "l1_data_gas": 288 + } + }, + "actual_fee": "0x18ab6763e70f9e" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 5, + "transaction_hash": "0x3b96f398134800efa13f9b6566ff7c23b2524e4d2f5d22d8fe9f684214473b2", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0x157f99b5cef397", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 6833, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 5, + "range_check_builtin": 267, + "pedersen_builtin": 20 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 256 + }, + "total_gas_consumed": { + "l1_gas": 19, + "l1_data_gas": 256 + } + }, + "actual_fee": "0x157f99b5cef397" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 6, + "transaction_hash": "0x5d17a95dff10124142c65a247439ac7a33171b927f8e43b3d90360d6352bb83", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0xfc7e01abb93d0", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 6234, + "builtin_instance_counter": { + "pedersen_builtin": 18, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 195 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 128 + }, + "total_gas_consumed": { + "l1_gas": 16, + "l1_data_gas": 128 + } + }, + "actual_fee": "0xfc7e01abb93d0" + } + ], + "starknet_version": "0.13.2" +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/block/37500.json b/clients/feeder/testdata/sepolia-integration/block/37500.json new file mode 100644 index 0000000000..ff059d7d03 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/block/37500.json @@ -0,0 +1,418 @@ +{ + "block_hash": "0xf7471e29d9f546fce49b82c15eb3f2d62d27526884e7787277c9002b9cac83", + "parent_block_hash": "0x133666b2b23b7dd617bf33b6e67255aaa1c0cbf9e3141cf4cc3c57b849fd6f8", + "block_number": 37500, + "state_root": "0x702f54f4fc777b52bfe061727dd0c5fd42e233a22c5f1f0015ebc5926ef6269", + "transaction_commitment": "0x4eaf412ea378ca8faa0fd2be8741d2a6aba9257c89f7a34621a6f434fdd6968", + "event_commitment": "0x7cd0fe9642e37e269a58acf8dd9574cb8642ac7198555fe0e1f00c53bbc7fd1", + "receipt_commitment": "0x4452609f7a3f015fbc85c52d49376dd575b5e0b2c52f57989e72888ef9ddca1", + "state_diff_commitment": "0x114e85f23a3dc3febd8dccb01d701220dbf314dd30b2db2c649edcd4bc35b2b", + "state_diff_length": 12, + "status": "ACCEPTED_ON_L1", + "l1_da_mode": "BLOB", + "l1_gas_price": { + "price_in_wei": "0x3eb371c7", + "price_in_fri": "0x58a6cc20b68" + }, + "l1_data_gas_price": { + "price_in_wei": "0x186a0", + "price_in_fri": "0x15080c" + }, + "transactions": [ + { + "transaction_hash": "0x44b6906258a90541e6e4aed4fc7dac92437ddaabad90d23632b614e86e2dcab", + "version": "0x3", + "signature": [ + "0x841bb360b5193c00e3a68018861194daf5bea36df909517e2fc58c468574e2", + "0x4272438e23b5ee407dc9b7f4273f2e05cd70856dea0de2ab21da663aaa63e08" + ], + "nonce": "0xc74a", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0x71afd498d0000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x5", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x57bf0d97a5df93699924802cca2b94f116b8143b5461eed2a22f1678924db05", + "0x1a809bc02e2b01f90889c9f0f12fc328bfced04b5682c5ae560a83a8ea5f66d", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0xb17d8a2731ba7ca1816631e6be14f0fc1b8390422d649fa27f0fbb0c91eea8", + "0x0", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x3d6933bfd424d3116f778553944913a49af3b8a33f3bc830d5b1a4e1e462998", + "0x44462f71dbc43b3d14b2c6a24535e5d68e50a5bd02bdc1601a5c0944a799bb5", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x241f3ff573208515225eb136d2132bb89bd593e4c844225ead202a1657cfe64", + "0x0", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x31aafc75f498fdfa7528880ad27246b4c15af4954f96228c9a132b328de1c92", + "0x6", + "0x2f78417b6726ecf2026e1af2be144746694cc95ee5a8e90f0ff48661bd6edd0", + "0x3", + "0x53fca29524498ed8f6ae7c3f89a448a945c1cf8191d3340a516f085131487c4", + "0x64eefe77c302f44b86564ab0a2d170bd67335b14286fc5a1c95db1dfd6224ea", + "0x25186844c66733b8933b0578e3d93957439f3919abe7c600c6bededa06a47f5", + "0x23ee8cb1edc358caaa2070cc26a33cf79f5cbc87ee65fefcc5b155af86a08c5" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4bb7f489b60c0bf2ca71b6450ac73c50086b83d524829081f6a77db1103a30a", + "version": "0x3", + "signature": [ + "0x7ba785f83928a040c9f5841f7cf41eac68bca516a664f507ef9519b1f18813b", + "0x2d45b9d3bcdbcbf76d9fe96c40dea02ea9f6030aacdb4db4853e3f63c6763ab" + ], + "nonce": "0xc74b", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0x71afd498d0000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x4", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x31aafc75f498fdfa7528880ad27246b4c15af4954f96228c9a132b328de1c92", + "0x6", + "0x59f09cd5246b7e97df2628aa952b8b35ce8773bbbead9e9b296f2a7d47e47e9", + "0x3", + "0x3e0a7e8006ce6627d5045df3dafb13832af1601a01b893e3797755b58e0cba6", + "0x2632cd9a7f23c86320492ced6f9e8bae7b42df63d0c52e7cfcaf1f2fe1695e9", + "0x46faa07bfa1f4e6fccd5d55e9e076a614739b3eebf65bcd0c4aeceb24ac8fd3", + "0x9e8f7eee7186b67b5f3e8eaa6f1cc06385b40fb4cf6e8d7aea6ae3888e55f6", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0xb17d8a2731ba7ca1816631e6be14f0fc1b8390422d649fa27f0fbb0c91eea8", + "0x0", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x64382489d9f51a6bbd49f2790a0d5d085bf9e4819ebfe9ada2129000ad8279f", + "0x77f4adf16a16df35338fbfa45678d3428331df7240c9a2be7e3c66b832f7181", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x49667a6a1ed14647a07a7282dbf17a06cc133f4abcd3274b27a914e6fcbf89b", + "0x3d033db8de9c3d64a3396ee9c875bbc68556cc9f2951ce58d645c014ac79b22" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6475d4835b56f3bf05fc4430d00ee7d36fc8879e71ad3d93f264623d48b1f46", + "version": "0x3", + "signature": [ + "0xcd8d6e56826b24a3920e70f4f112546554c62c9ad6254a0224a14cd4f69759", + "0x209213220664cb4d86396972c7ba170183d9f756c97dd9cdd55ccc90a9cda06" + ], + "nonce": "0xc74c", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0x71afd498d0000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x5", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x5df99ae77df976b4f0e5cf28c7dcfe09bd6e81aab787b19ac0c08e03d928cf", + "0x1", + "0x70bbe9682d50049c3297b4489b75cd818a935c783a8f4bf2955f58357ff0809", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x1136789e1c76159d9b9eca06fcef05bdcf77f5d51bd4d9e09f2bc8d7520d8e6", + "0x2", + "0x61954db246f3ad51fdc03f45a7db0e35", + "0x18f525f1e58344fb4783dfdb14400b4f", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x5df99ae77df976b4f0e5cf28c7dcfe09bd6e81aab787b19ac0c08e03d928cf", + "0x1", + "0x4e37e20ddf11c80fbf1bb53ca8d9bc11a7362b1c9209c749ccce9a909698a05", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x77ceef1f69814554b166b6eb599e12e7c950b8635c78e7fdb3ca1470060e85d", + "0x5847d80389f672bf855d2c1e3a60ac472b67c7a92b00eee9e93ba7734a0e67b", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x1136789e1c76159d9b9eca06fcef05bdcf77f5d51bd4d9e09f2bc8d7520d8e6", + "0x2", + "0xa45acf59021c58467b23962af751d6ca", + "0x489181d0de41fa8fb4dd612272ccadd2" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1e6bcdc4b2074abc0ea1e0fb8eec864317cc4b4c28e53abd5f776f6fbb15f60", + "version": "0x3", + "signature": [ + "0x12ed3767a5a50eda8cdc22e4532b8e0d42e445b3306657fc4e10b391f669e0", + "0xfc09dec214535dde57215ae373ad1fd7af17dacdb74744d828b017c57f340a" + ], + "nonce": "0xc74d", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_GAS": { + "max_amount": "0xc3500", + "max_price_per_unit": "0x71afd498d0000" + }, + "L2_GAS": { + "max_amount": "0x0", + "max_price_per_unit": "0x0" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "calldata": [ + "0x4", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x27420377e357df917f46f7da15f75eef9a54209b04f0e7c1ced77ebf946ac22", + "0x6a50b14efece100bb11677ee2d60b64ce87bb2016272b2f4680cd430411ff0f", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x3604cea1cdb094a73a31144f14a3e5861613c008e1e879939ebc4827d10cd50", + "0x4", + "0x1e91a14420438f40f08486792bd70f80c10d42da783f41c7e64e6d18fcd528e", + "0x5df99ae77df976b4f0e5cf28c7dcfe09bd6e81aab787b19ac0c08e03d928cf", + "0x1", + "0x49da9aa978742794623aeb8962eca0d4c7bcd3e51cd5821e4588a712db15176", + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x5824decd0a03f4a6158888c7b32ab20a3c7da4a2111224736d8a9601ccdb128", + "0x5a7a736db3204fe897ebe35170d303011ba6894dc669ae2895d7d252c8b7d73", + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x7431f86a4b86525ba04a618ee9341ba2700f9140f7d3a4cef2bed168853aca", + "0x73d68a78c82678e56e8b773c93be758a2d78357e3873183df2113757249497e" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + } + ], + "timestamp": 1721499599, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "transaction_receipts": [ + { + "execution_status": "SUCCEEDED", + "transaction_index": 0, + "transaction_hash": "0x44b6906258a90541e6e4aed4fc7dac92437ddaabad90d23632b614e86e2dcab", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf", + "keys": [ + "0x15bd0500dc9d7e69ab9577f73a8d753e8761bed10f25ba0f124254dc4edb8b4" + ], + "data": [ + "0x2f78417b6726ecf2026e1af2be144746694cc95ee5a8e90f0ff48661bd6edd0", + "0x3", + "0x53fca29524498ed8f6ae7c3f89a448a945c1cf8191d3340a516f085131487c4", + "0x64eefe77c302f44b86564ab0a2d170bd67335b14286fc5a1c95db1dfd6224ea", + "0x25186844c66733b8933b0578e3d93957439f3919abe7c600c6bededa06a47f5" + ] + }, + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0x1915b2820db5d8", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 266546, + "builtin_instance_counter": { + "poseidon_builtin": 7, + "pedersen_builtin": 40, + "range_check_builtin": 28894, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 384 + }, + "total_gas_consumed": { + "l1_gas": 1159, + "l1_data_gas": 384 + } + }, + "actual_fee": "0x1915b2820db5d8" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 1, + "transaction_hash": "0x4bb7f489b60c0bf2ca71b6450ac73c50086b83d524829081f6a77db1103a30a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b", + "keys": [ + "0x15bd0500dc9d7e69ab9577f73a8d753e8761bed10f25ba0f124254dc4edb8b4" + ], + "data": [ + "0x59f09cd5246b7e97df2628aa952b8b35ce8773bbbead9e9b296f2a7d47e47e9", + "0x3", + "0x3e0a7e8006ce6627d5045df3dafb13832af1601a01b893e3797755b58e0cba6", + "0x2632cd9a7f23c86320492ced6f9e8bae7b42df63d0c52e7cfcaf1f2fe1695e9", + "0x46faa07bfa1f4e6fccd5d55e9e076a614739b3eebf65bcd0c4aeceb24ac8fd3" + ] + }, + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xb6d8248f8a68", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 11630, + "builtin_instance_counter": { + "range_check_builtin": 477, + "poseidon_builtin": 7, + "pedersen_builtin": 37, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 384 + }, + "total_gas_consumed": { + "l1_gas": 33, + "l1_data_gas": 384 + } + }, + "actual_fee": "0xb6d8248f8a68" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 2, + "transaction_hash": "0x6475d4835b56f3bf05fc4430d00ee7d36fc8879e71ad3d93f264623d48b1f46", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0x11a93bfb051b8", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 18903, + "builtin_instance_counter": { + "pedersen_builtin": 38, + "poseidon_builtin": 5, + "ec_op_builtin": 3, + "range_check_builtin": 1005 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 256 + }, + "total_gas_consumed": { + "l1_gas": 51, + "l1_data_gas": 256 + } + }, + "actual_fee": "0x11a93bfb051b8" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 3, + "transaction_hash": "0x1e6bcdc4b2074abc0ea1e0fb8eec864317cc4b4c28e53abd5f776f6fbb15f60", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xc1ed0355a438", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 12431, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 37, + "range_check_builtin": 517, + "poseidon_builtin": 8 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 448 + }, + "total_gas_consumed": { + "l1_gas": 35, + "l1_data_gas": 448 + } + }, + "actual_fee": "0xc1ed0355a438" + } + ], + "starknet_version": "0.13.2" +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/block/38748.json b/clients/feeder/testdata/sepolia-integration/block/38748.json new file mode 100644 index 0000000000..2b69a38fd0 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/block/38748.json @@ -0,0 +1,14284 @@ +{ + "block_hash": "0x40b9de4d20b6537151895df0fa2520be3639a2a2a65915b5d27855efd1d78fe", + "parent_block_hash": "0x710baa1c4af671a3016fc23f881161b1241cf7664cc3e8de19d4b3395699ca4", + "block_number": 38748, + "state_root": "0x4628191c1b4000fdd0f64686a38b4701e42dafaa3ea730a6d57c55f69c3b618", + "transaction_commitment": "0x6271d5efad2c3b54b78f97ef2c53810b924b28c0b25109e943970d24aad613f", + "event_commitment": "0x5d1b7c74d6fadbcd14281d28916a34a59fc0e2f14b4b65898b4793e31567ed4", + "receipt_commitment": "0x1a6ecd3a1eb1b3d74d3c2a375c8c77d1fb5b860d0bdb13cda633c1541f090f5", + "state_diff_commitment": "0x2bb5df3dccd80b8eb8ad3f759b0ba045d467a79f032605d35380c87f8e730be", + "state_diff_length": 500, + "status": "ACCEPTED_ON_L1", + "l1_da_mode": "BLOB", + "l1_gas_price": { + "price_in_wei": "0x6da1f4747", + "price_in_fri": "0xa1889540f45b" + }, + "l1_data_gas_price": { + "price_in_wei": "0x186a0", + "price_in_fri": "0x186a0" + }, + "transactions": [ + { + "transaction_hash": "0x656a5948f817e538a4ea7ab86dadc1d351db38cb84fc34f43de45959f3d99e8", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x657d900335916a90a7db4eb281c8a76e407251ddb016fbf52b5482749d6a5bd", + "0xbc34650982498581456ffe671a44778313e5d2cb7df704292b32d26bbe7d9f" + ], + "nonce": "0x37", + "sender_address": "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x84bde295632e0884a4da2ac3e59d450a5d1c50628480316202aa9b9258464b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x77bf77fdacf7c42c92f88ccdc0e47faabe4fd544f8418880c9aedc9c122cdc8", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6caa463e5c025aee7d50f8a0b289a94a46786899c6504241b302df840d16d60", + "0x526d302dab114955afdd0d66eb5bce39082f0d584400395ba99bf7098cb0b3e" + ], + "nonce": "0x20", + "sender_address": "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3fadcecafa9e47255cb635659c8998fc57e0ac8a780572a0b9936b4f1947a46", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3b5daa647e491e8fdd09e38901cbf8af8b3f6c4b9bed6c9519b015a8f7e3861", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x654bde5a25c800da95f18748cd48d901ecb244e6dbef156e5303f77363e37d4", + "0x4dfabaa6078f94d037853a7fbafc3bd1abb4095bc2bdb7ed6678acde84c534a" + ], + "nonce": "0x31", + "sender_address": "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x56d6364ef2185be391153e866bd87a6a98cda9987f33e37df583c4d2bb3ec00", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x210d258284362c34cb0dd115cd12d5481ee07f424ca2179616e01314ec8520d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x24811534f36ebd93f10a41f4d2388300496d47b216e8c57aadb63e57dbf4ce6", + "0x159ff011e40bd1792f46ccc474bab31780763069d9051075b44a0fa6d717d5f" + ], + "nonce": "0x32", + "sender_address": "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x27cb50f80270672f1fd0351a7abc49289ad9b1f8b34f21c0856f5016d1fdca", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x24f0b8d99ff58e931658c8c9db4db308375bc2ab028f39f3183326da621062b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7a77134f1a10dc9b4bd3c2586142aff951e9a71504ed8317d7d60425ea2741e", + "0x6808a05dc7e9119e1c6702ab572f438477ace3021e2248d7943633fb8c9d9b0" + ], + "nonce": "0x16", + "sender_address": "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1aa17d35edc3ee0c5b365595db91c1f48b9ad8dfb6a6b2aaa357d2bb01b4dbf", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x74c851a56435473eeee26bd0f33cfba5bcc2d86676847fe093ee10955b3e41c", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x15ec5a6b55b7cf7a2d3f05c1b44136951f60ebd3ef356b9cc8f01e69f1ced96", + "0x7215ff6f4455e2c149174e9581e9477c62c2f8ca90f1cfed4d8c3c570671e19" + ], + "nonce": "0x31", + "sender_address": "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x73a6c571a923b0de62c56e0ff8d91fa03d1940f12a3044923db283fe7d52bb", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x683e8de59fbdda5bf2655a5b56ca713dd4708b653e3ea2d0eed5fec5c782f59", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x21a0f5d8e1da1c39e2f7230161c0eb9b287a362127ecf72c932e0d6cf3a9764", + "0x490276ea7325261b1fba4b2562cc12fa6abe5ea55470c8971e287208d757572" + ], + "nonce": "0x3e", + "sender_address": "0x275c01d887730e6551ff416d8ef128d2a79afcbc244c776c819aefbea1818bb", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x785cea5ab7fc2a8b2ec4de10f787da9afc826be52dba9883becf9351d59d6ff", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3ef0b3561556607b1fd19468dfb5bbd66f493dc648d5a14dbda6943bec9481", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x69dc98b51c43a00864b8abeeb4aa9e0a3023f3b89b0fa59f60bd980f8c5a2cb", + "0x1b59d32cca82af0816915c2f99518a4debc18ecee7d41e09274237cb6414725" + ], + "nonce": "0x13", + "sender_address": "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x29595745aa0c07dcaedb213ff8adda5a32a10184a3f8b67fa81372be9f84176", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3821214c3836ba0f4e58181ad0d0212acb5c448265f3f376f18c460531e2256", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x524d7fdb77b6a1ff37a83c1e5743b5f65992ed126a9cbbb9663c6d1db957967", + "0x7c37210ad72f743bfff2f1e558d6d6b9e327bae7dd13631946d9c0eb2879d25" + ], + "nonce": "0x2e", + "sender_address": "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x56c0469f6e05e124f8072a8e40dc278fc4788bc5ab2d9f083b2abae727d51f3", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xa8d6fa6804a4738c82f9ecb50b61d6ed0c6f0b5d095aa244a83390ebaad6e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x796bbddccf599fb0bcdedd9af1e241dbf9233019ae7c5f1b79381ac41b665a", + "0x547c0a0a7ebfd8d9e09b5c0b2f309ce32923d4b208da92889073d11e2bd14c" + ], + "nonce": "0x21", + "sender_address": "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x54c2a598d057bcd861c7d9faaa527f829b5b8055e83dd0d733e5c0a5bcf392b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2ed387a8556608d107de35e3314fbafe0bf2871af0b5d2034d92e56c899eaa4", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x70873881cb6567b50193aa73206e951fb2404faaee067c0d36bf3720e6437da", + "0x108a0e1c16ec51ce52b776fc1d98a467c52b101199ab32405c87378ecac6836" + ], + "nonce": "0x5f", + "sender_address": "0x2655cd6a02dcc25554bdddc055f304c84bb130828e1b162c82958bbc92dfee", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1de3a6279c19fc65001bd37d37156e33b82a892a1620d14a82b8101b5fd2592", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6ad74b9ea5705c5b36c899b004acdde0680b383efcd0f4a6e6323aa254dfba5", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x59103443bcb42bbe0d7016d0b0f85a98e202ac3ea0dab1eaad6b163b0e6d4e2", + "0x59697218dc2719176f2c9cda0872cf16af1dc0419a7651ddd64d017e791838" + ], + "nonce": "0x32", + "sender_address": "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xfa08ecebee06e3f4ab3024d55b2e1a5646a2e8f14054c21a22929c08444bf3", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x584739a828472d302c76113ca2380f66fad7e8db93a5b33bab83b26f57f6192", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6b00b79d5d25b7de73a1168bf328edd2fd6001142f9790bcf26f570022c8331", + "0x480836a81e47b2f4332eee2bdbdb6138c840f53974586f4bda839b80143e019" + ], + "nonce": "0x7d", + "sender_address": "0x13372661462e9437e3be7442c0bb7f0a28642510ec3879927eebfdaa11c6b64", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x478a36fdc297561841694773015a2b756503f499b50d72415e6f92b731cb4e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2d2ff22e0a1f3d6e43acb5da75ab4a7c9bc6219350953a0c29025271ac64bfe", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xb85e34a831d216cdabab4a5c3cc212a5ee2bd36eb46b6c33e4982d0dccd915", + "0x191ed3326f108777e9dfb895054561e5a905849fc67eed139fd1ba620c77e5d" + ], + "nonce": "0x58", + "sender_address": "0x6133eb7e32610962c067accae847789b414e52ef69407bcda0dbc4e0562235e", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xebcee6a064eb96a9c7046d247d108b5d724749ef666df3a110fd6de085cdbf", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x79f9d3d4aee74c24d0bd7c6f7ee78bfe5a3553fd6d9b3622c744bfcc0eef189", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x981bc5cef86ad67c04ceca17641b765a03da5e427c17b1a2116d33a28c99c1", + "0x265158bfd8680f4b54c05d5f570df0843e027807278378006c6acd8b22e409c" + ], + "nonce": "0x39", + "sender_address": "0x77c28f25bc25bd5207ab10317a8ad029b560f22d77b3492cc910236a2ce1278", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1aaf85715f7f99649113cc8ae476ef19d6aea4626efd7690aba563582eaf876", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x14a53a8cebb83a7bde0734b5ca9687b1345e9933286eb0c6835d0bc6d937d6f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4e3c7ac72d6f8fcecc038b17354a761f5e3319f7b185d66569f51abf44b9f2a", + "0xf39c6585b60cd0d5195d7a8cd59ae84517ae23f7e7cf0429cb68859614d14d" + ], + "nonce": "0x11", + "sender_address": "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5fdef3d45e4cb5d8c05adf2c05d24d13ceaed27254cd4571beb9f8652cf6a69", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x140e311a333d622148eb3ab8aaf0facd38b74b5cffd5b48ce795fbda701009f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x22014862a64f2ca192df99311a95d21905feda98ff91fd478419252ae145b59", + "0x474ecb407e6e0751455909415dea44ecd910caae0ceb3bc31ad5ef8441e0b8a" + ], + "nonce": "0x3f", + "sender_address": "0x3341e828e15b839729b07957cabc597cb6556e61649a0f3bf98578f4b542c9e", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x78acb5290012e08fbf2aca15c32d6d3a70d86b02a77568df648068695555a43", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2c51827298b7e36686f02c0bb9b43cfbe878d5a6332ffa430d63cbbe6993632", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7d36ae5db2a7fae94dd83b0253727e200a40287519f15544295ca610147c8c4", + "0x66ca9766528fe59d828c033a0890b2d4fd9de8c1eb2476dfeae0f3310c13048" + ], + "nonce": "0x4d", + "sender_address": "0x2709f3ff0b285074ffbebef3078d2ccd7d26d0fd7bcd4422d8ceb5e9a6a40ff", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x660586392cd851387fa2a005d5e2f8045e4a56d423739c91b5586a3e5e3a271", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x13ee0bc0399bec6c2a8970ef0da8e655780a28be5909799db90057686c94c06", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3f898ae50552c9435f9b9121af2738304f7f5e950f514e9ecf6731036cd2224", + "0x200967003b91404f533b9ab90e122155cf8a57e6abe63aa7c74d02978ecb5b2" + ], + "nonce": "0x1d", + "sender_address": "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4821573fb5df2b7a3ecb05bef19f7deff03c68c7f1eedcb2245ea5c04fe0dca", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x11d22470bc9f43107645caf334e36f403f0b352587ab9515742043b60bd8f41", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1b8a98a1241137491818bbc7a340f2ae9e4ebff26f4a6b57583b058d605e356", + "0x77801989490a00c830976cfe8e8e9a22b71930b8361b45622fb2807934be448" + ], + "nonce": "0x64", + "sender_address": "0x59c0424db8476a9d158e52848aea567f806afcb99141b8ef0a543758db2ce60", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x395e2721f3625ef250ef44e1d2f746b331891f2431b3df17d65e0037459a5a3", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2b5ed98f483bfbbf412eb2ef1b9075a16381f39a8296a951dd55085d6394e8a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3269d7fc94a01888aa6e7716074f07f8eb52c3371f34bb0c914e2ac4efa5b8a", + "0x1a8970dde3cff2962b6f522c11930f02159dff6195f3be712b40308bd2b712" + ], + "nonce": "0x46", + "sender_address": "0xcc4c8e4096a5dc1b161bde1c0207c34f82f4c0195cd428253f1baed6308d5a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x33a0847247d19ba053893b0b31ffe11c0895e97806476fa383f70fe49f2585d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2dc6f4e98d1aa63ceb803559f287084a84db3665306dd2bc52a1237934a415e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x342df7c7040708652ae47f8b9205d9a292d1e7bf22aa4364378c634b755655d", + "0x79f251f59c6906f825e10ab7b85d8fa978c072c9ca3d2c622e9b95e413c1939" + ], + "nonce": "0x30", + "sender_address": "0x9a747a346243aff99283048beabf09c2ef25bfbbc8a177945f3a0eab0d3882", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x21aeb9df0d8dce0b45960d1644a4d81a83f9a0f8fce69a812f4af05893f411", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x378d05a544d7df1fdbd3745204223b47aec76bd3f14f98147c572c206e461d5", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x12c82c96f40158df756363f3a557d2dc7cc4688aa31486d3de88a6cbc3ca934", + "0x572f8755409e2f945ca1c7c9a600227b881c86d320dc12cffb55afade3d7a1a" + ], + "nonce": "0x28", + "sender_address": "0x4c37d767a43169fce247342e46438d0bea2b0d7f4efcd4a4686615e20a7c417", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3d958b59764c3d117f7513a53bf399d80f1d454b17db76317bb046b86cacb7f", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2087bac692be145742133fc040cb270807006f0f95272eab6d847d47ee8665b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2692806d550b7d8b2bd70c907b0e6417ea137e6909ebe5f1ea67bc54a91956b", + "0x33158603f492cf5b9d355548544bcbc7fa0af75aef902993c4e0bee20169e18" + ], + "nonce": "0x2a", + "sender_address": "0x7b3f54f0755766215caa99b8ce31250020050ac00bdbdc25bbeb1cf5035388c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4c05cda4a1d91e09a4ed80dffb64c2c2bb74b62b87e2546185a30d2be76f3db", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x10119548275e625a700f0cbff8323d03e4cec856dc7b1377bc91fcf42eaddb6", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x12f3812ea0fbc8f46130e2e67293f02a4ae1d9513c497ab2bc52302fbbe88ea", + "0x742cd405f150ba142d8fd6b6271676d2133eb95ec17f5865fef8f7b76ef4841" + ], + "nonce": "0x3d", + "sender_address": "0x45588fdb74513b42789edc109403dc2c2ac13e1a7bbe19a99d9ec45297f7450", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x391bc0289a116b822c3c5439091eb16114ed7f83196a06a97f14e0a3c6faa9a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2f4750c62fdd789fb68179b9197946f0faf3501654619ec73b63451323cd6f1", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x48767c88617f086cb201556443ec93162a1018f787d67248afe8baae9e8e366", + "0x75d32e3ba10a5d92f4231bc44d33d45c8ad1b9af7b0cf87b2cf258aca1e3067" + ], + "nonce": "0x45", + "sender_address": "0x1bf2463473be14da2f0ba583dfe08a8465ba99771450d67599de126fb58da9d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7308fe8a4ff72e79142e2c32073bd55e493c4d10864879e2cb7c5a4257224c9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3effc0e555c49d5e11abef41d6d1182fa5aee5202cc5d89733dce5859330057", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1b7fb90f3d883cc2eaf752b92d6c30b05dc87b4647a0736298c7160e444230c", + "0x4a357380c5ba246aebe4a4c95e308b2d091b6a23bb2ec865e317f108d1c2626" + ], + "nonce": "0x39", + "sender_address": "0x11e0a33ad5c43d5bd2f7f0ccc2b66f591c6c908910c1f2f377c6f586a458eb0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x37ddc556900ab31026fc6882947787335152a0efe67633af40a7e064fc204ce", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x33af48b568e7471388d64ce6261f698c4452772dc0950703cd8970326454663", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5a0b04cdce53a6bb7074c0180527cbea6dfc773fe5ce5c2b5845d5eba592019", + "0x5380bbed4ffbd0dea2635fb965bbe10ec2c674e55df8634875a5434a67313cb" + ], + "nonce": "0x35", + "sender_address": "0x768a45776c6e33860c802ea8b6f69170b275d576ff5ea0b6ed54c7b0da443e9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6eca19ab5a57bffb4a7aa89d27a4ff3a6314c8b4313565de209270ecad579dd", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x58f3d4f56d5d73445f9539f87c57604ba1a7558dd89395ad67246e5dbe54ed9", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1d29d4c990193f8af358ec9e10e1c31faf62bbccc70a22f52840087bf628ace", + "0x176be6bd8ffdb2bf442c4b4728cfd46b3143059d8636f38da0308ffc4d40c6c" + ], + "nonce": "0x68", + "sender_address": "0x7b4ca69e72ffdbb43edb9266a3ce13b385e714e06f6aee2d7f2215b405f6a9a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x452d5bce0e02200bcb5e8b1d306ea71dcf9d2c686c45eb037c69961757c606a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5efa3153e3cdafc7575fd30d6a32c777a5bdcdf5bc1af3b8e54f46bbb80085e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x11b4b849fb7b7e7af4c198156236147f8318b2bb508675c8bc74192c884a754", + "0x6f04c75fc71750bf40675d0f29b19b819783c63a5b0bfc28c95f2a289afa746" + ], + "nonce": "0x45", + "sender_address": "0x2ec59285aa2e4cbfefaddc331f3d876f207aed3b028f5b62957b0a464f92918", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4b44dcf7f50ff4eab2271a0826997ce11512d4a9cdd5de9e2cc60cb970c50fd", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x244e0157f6ba489d5470cda9d2bfe76f508267cc6784f059dcda8a997e467b2", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5aa171da9f2513df68625db687e316a75286d9f58a0dc012f58834ccb87abbe", + "0x1f55eeb1323319c84948aed845e11fc62cbf20bb30ad019a827b2a387bc3c0b" + ], + "nonce": "0x23", + "sender_address": "0x451d8a5c0ea89978d07a24ac6c594e1f0b57ca0a141ba357d8e169fd73151a3", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2dee60c143474cb2205f17ab17b0f8fea5f6a01c86cf8e44b419a456f8c7e1", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x34a973c5db6d82d636614d3ee29548769516670ff3b8497b0dceaad68ca48d8", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1ac144c1c83d6e118510140924bac0f232a66de40a0c2631666bed98b8ff7b1", + "0x6d73527ad53b4190563adb1e8967ccc6b5fc7dbded3faaacdb64eca3228d4fc" + ], + "nonce": "0x49", + "sender_address": "0x253b4898f783590539e8ff61faee36bbe6f4022af6f5742fd80ed8a609d8cea", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7a1e29a8753805b7e934bbf1cd9bcb597d2c7b44d2697fd8ac948fd70330263", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7e0cab05b44a35458c1bc9fd8d968c8c56d131ba02e6a6243993f445ae7a392", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xfc3f968fb260bfbd7074761e5999effafce3c57c45d033a183d8d0b984cc0", + "0x5bc48b3674e5d01c41c2bfeb435665aea65e02c428347b53bad0910d2de8fff" + ], + "nonce": "0x42", + "sender_address": "0x689549c1747f38f450a34084202987ae19adc553d7ce10c3d5136ed8f768334", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5f1dfed748b556201babf0356c65525210ec3d0ad2e30acf3ad708bd63f136c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x19e04c41b99e60d3a5a95cfbc0127bdf3d63f9547ea862df7303e24cc9f692f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3b53a1bd56eee1811946f77c07e48904fb66282b05a776c192a39bdadf8837c", + "0x17d7140a5eebd04a5b3bb759dda236a185d3d94cfa206e01ef57b68b68faebe" + ], + "nonce": "0x52", + "sender_address": "0x5aa0c4b6d10882180ed3bf70dc5bb99fad462fb926c251329f4c0f997cd5ae9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x37cadeefb58ef26828cb8e74d5a1115388e279d00f5812f7c86ed76372778f0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x38515fa92e8ea300fd8d9093f81d2164f73006cc51e105d7538ef303df32d3a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3aa5215cb7ac715a049276eebc16707e54d70de26717374a9cbd72b70816262", + "0x12258755c8097179732974166534428a1c6dd32fa5e31e674aad49b1645f4d" + ], + "nonce": "0x3a", + "sender_address": "0x2390a4d84cf00928adf4058ff1f15c8fe615ccaa3ccc1cd9b571d8be7ae806a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7012059a4cd41f6bf89e7ec7a82ca1d9cd083da0c282138b0b9e8239c386978", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x44c1cc2a46a949e72c37d323fa5627bbbf0e7f8bbe6f73296773add0bfda3f2", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xbbf42a380c2254ef81692ababfe55e87efd0c9f77bf2f0029aa543f6811e6f", + "0x18256ee6395707f1947f5db68511afebcfbf65bbce0f48550677747f2a5206e" + ], + "nonce": "0x49", + "sender_address": "0x2e19f222ead0bc05ad25d190bf89a63ecabf82f53f7d6bf383d05553acaf123", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x365bd268b91dd5dff4d54b7037d0b4b411e3fe15953f83b8a61102ca19b8509", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x22af4343899d28a47c93d8c140b2570d0a910596594c51ef6e8dc0548c8f13b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7940a9d9a1231d748f7e7ffa39b59066a442d41f300b1fe6b9aff2c2450d7c1", + "0x2cf2eac4cce97379da63b6300f1e5ef40a17339867349ca5f5770dca10d78a8" + ], + "nonce": "0x38", + "sender_address": "0x63e18fe7f3cb5a5194204ba9107a7f425c503c6adef0b686127b14bdeb5d302", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x714bed568aa17143177d8c83afb9446a685aa64a5a506e732ce592adbb770e9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1e3af76a9fb580153dce7f03a0d2e74418c47e301c875fc7862c8201d1ba8bf", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xbbaf243db49b943b94178e333f48045c23964599622a7799bba27730abe6ee", + "0xa595008e3917daae015d8f0757e71bd5c308c3626989005c107093783930eb" + ], + "nonce": "0x41", + "sender_address": "0x6804962ed2a44ddd07ad2931838b13ebc114b3e7f91b220fee99a5aca96e83b", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x74add3c8e5cd6da0b2255c94c86de236951e29660a46815afb91611c872413d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x43fc4f993027fe63d1bd05764c997658e07106bed4e01b90eb715491f5481ae", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x70d1ef2019e1031e214b84b9761037081162a9d9215dba18f9d931ec4d6b338", + "0x260f1afc5713c1c55c78bc5a58179cd8e5ea99381449c7a1c90ca0935b3b3ae" + ], + "nonce": "0x31", + "sender_address": "0x2333f8254e3d2a9f527f4ed292f0f84b35af2dac6c0e664691ed48c7251ecd", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6d6838f0ffc2d82f7e61221507a767634e9fbf282dc1016133a3b9f8e88943f", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7775ba1c7d8779ea4e3d5fffc509f37c983af9eef79f1d392603a25d5b1eb59", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x37d655d4e2267d76f54838bc94a902bb05f8cbdcee1edfd34a0fc94f7004ba3", + "0xfc7029668824194bd2de31423fc172828b2c5c6e5310a000a490fdd2a21f22" + ], + "nonce": "0x51", + "sender_address": "0x200c519983a0104346afba82a2dc4eccd4a4373aa70a13316626e932cb6e58d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6b1c39ba34d99b5b73eeb4506bff45a05410fe07f14e461967ea8d930e93c8a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6ec2c34b64429db15b38e39ee43df93a80a0ef87a5393833cf65cc8a461ac1d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x66b2796e1db4ea4d2633261561b21ffc0092bcef6fea08dcd8c2c3fb9c1b7eb", + "0x72dfbde6ce38ad2159449015c00d0a2480809ef3a5ee4d9d1f612ec2db28b6f" + ], + "nonce": "0x44", + "sender_address": "0x48cd92c018be0434daffcbcbcd6722aceda59a54ad1efe411fec777f41f8caf", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x582f41ed435a925057c9a1580823da6a37565e33ed96136cf70278bb29f38bc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x78cd795423a239f87e569a05f713ab523ceba55bcc100b428aa145aa4d44d3a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x73933cdd35e1a9632098dc6cf32b05556b433f1aacf74650116bad1aa08d76c", + "0x5f87c0ffc89d08ae9dbd2f3c1d50e1ad216170685f21bf431371b6593d59ec9" + ], + "nonce": "0x62", + "sender_address": "0x3acd1c7261d5bda1736a89318f1b662d1ff804ba44a0c510cd2832156bc4a6f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x376f58b6945bf8c6f6964e7b514a958da8b3699bd39b3f3ae0484f349f95ce0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2e6f7749036b34360b234e974d63a51edca243f61d2493d1756aa12ede6dcbe", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3693e74ed5369b508434e506d9a4f9e29c83ff4f16957703475389f1530d030", + "0x1ad1f4a0c85378b4b7d445a44a3e2b7a91aee8c7fb225d7d83b815076353af3" + ], + "nonce": "0x4c", + "sender_address": "0x2cbd65c97f07d4b0830802c819049523e1b8d30cc0bf8d4246df94854faa766", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7e7661daecb8a0fca7dbd2ca85fb063680c311d0341940fc611cc5e4a6e60c7", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x95de0efc6d55c4c762100029aa94cb46dbdb0ee3307eee7bb83a5127fb5554", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x186fe97a0460660bf95a2ad9189483eb81feb5cc45e078dc9904a6fdcaaf43e", + "0x228e781648147ef30fb3c9d31661dc76d1296549dee9c8ab773fee0c3b7cd7d" + ], + "nonce": "0x48", + "sender_address": "0x5b574462c662b90b11ce7c5750ac6b71d21d5b84c62a6085220557f3e54c14", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5636db2bce3ab1d1df307dee084d35d20eaf66970b2fb83cc12f7247ab1212e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6c2178115ae217acb8ea704cb08258c873ab13abc296ed16f2979ce25287417", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2257aa2204257ae889b38be6b628fb2c375c4adabdb4f69c6e9b48f7804017d", + "0x2c4999699d6354896c8cc57c0a7e0dccd9c50bf81915b35cfbf60800f77d562" + ], + "nonce": "0x52", + "sender_address": "0xe2fce66497ffbc0b04f6d1c27eec2f8da3c4b7ac78a24cab67595644173eed", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7ec48ff00c0e2c1fbacb1c8b6dfe3e0f43a9b196134d0b2132ca973bb1f1bf7", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x60dabf1d8850e62b5c6efc27e0c98fbc3d808fe21251bf5d19c55ff5d848754", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x449e6c256f96d2f1615e7d8a88a424906567d68a9ea7dbff513e159b2d57d6c", + "0x69e1e96abe440a54cd2f118feb7f834fde05da57a8d585dfde4ea45a2a26d14" + ], + "nonce": "0x66", + "sender_address": "0x38f5a14f93aa2041cbab6a0a2eb909f268a10be56addc697592c87c68eed875", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2c10d6b259d6fed242b6136fc51c549f0937a44a493367fc86ccc529b462959", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x79dc84c42dac21d740ec7e54cad6d88ec6e26233eb932e1a511f7a1e21c53b7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x34152323eb40532d263a290dc52536334c71ccb4050319e320f5744cfa14d12", + "0x572aecb2663f6a34d6c478a1e946445a3963cfdf64b3ca7e4427373ba29cd51" + ], + "nonce": "0x4e", + "sender_address": "0xc24b71d1cdb836ea2a8a5d364fb9131c44fd4e15d1129f2233e3dbcdfe855c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1d3462f4184e648b3848f1ebfaf75f4b23742924a725d56bf1cfc9492d0ace9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4082594ebf3656e1c4d1145e8ec5ba563e5d63a7868aecdec6a23800a2e259b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x695a20facfe5aa1f2c297b3fb25beccacd8b2b44762e9becee7825ee6a2bb47", + "0x504e8404b097bc7beac715f9dac2b72a79f24d41792646e706df8e6ca6e8d99" + ], + "nonce": "0x46", + "sender_address": "0x6fe8b5ce08982b6ee4321997594e23a9637fe0d45bfd5b5d718695f08b38a72", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7da1dbb3f1942891cc5a5f737ed2d6655b9f15582a05944a6d163dbec3c2aab", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xa5f543803af4433ac765c778c1a93d288f3dc468b0babc789517fe9a2002ed", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x152c5f05df666c0af1181014005454640891c12a02d37bda283644f5bae7e44", + "0x1cb83b3a8537e4a68384b7624460bfb5a5fa5cbb51501ec41a85700991a41ce" + ], + "nonce": "0x40", + "sender_address": "0x13d16147f8cd04b852cfdab7107c6cb96de2bfa2a020b22694e8067c87eaacf", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7809d1fdaf131c0eb339186cdf617d946c86668e50924d13159346e12381e07", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x143fb91a0731cba83f1482c1030b525ba4e2146c8fa97ecf2ad5b330c222a50", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x544b59b95f3c79da05e40428faa6fccd00c621e34c899398e20b06c177b6b98", + "0x2a63dc36d3dec59163c060efd90d1e921e81c50c83796ed7a0ecb3a55ed4e86" + ], + "nonce": "0x42", + "sender_address": "0x1b7e553d9d69a2a1fcf9ae3a72bd41bac0ae603acc77c783ae58bf1ba08b80c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5c18c54ef498819a83ea6596096922c38c1aa9319bb3b03415252db3128f8f8", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x12cf58ab83665591f01058566c199fbb0ad79be88165b347e3e5dd83fc5d791", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x600501ea763291dfde684ac1095695a9555639955859cf418beb6bf60acc933", + "0x6e1052d9177f22b259bc99398bccba665584813522c57595d16945c4f40dc3d" + ], + "nonce": "0x62", + "sender_address": "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x13241a67c8f9d5a88357d3833595cf1e77d517c5b25daed279a81be8f74c8b5", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x65f58aa22346b4d4529f3dfc29aac5de2002da9dc86124630edf5716fa3a7bb", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3612a4ea88cea34a296fc6447e0e603c15bfc282c6672193e4b63d083e6bae6", + "0x5db693da1a5fd61375a8608c787616803e330efe298b082bfe9ed3d3797accc" + ], + "nonce": "0x74", + "sender_address": "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x76245470ac3d77e859be12b55e3b16dc48dfe3e0cc85640d75e3e4894ec8182", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x21ed75413223b673aad90b18352e7e2287c4426f0c607818dfacc211ea242e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5d849ca35cae01e6eccd5314ff8371cd96690420896c43322f15fd36d3edafe", + "0x52e5e1f255cc12860c73997a313db1164eda6619e3125b14a6373c29e5fa2b1" + ], + "nonce": "0x52", + "sender_address": "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x113616d16bee3d91ed9efe44c83cb47d9d9e4b5a0f2c8b5626a4464c645ea9e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x20e5e2e9b41628cbf962f505b4333b37f4f78a87dcaead10c83b770404577ab", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6ba05a47db9b68ab23560894989385ad7e2ca8f27cab22d87d0705f8e1be82e", + "0x57939399987c95b3bc9f8e71484579b9b566f4071599f16fd28c02f7c3ff3d" + ], + "nonce": "0x43", + "sender_address": "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x58b40fae2a6667866875dc98dfd9464fe80c588572dbeca17a0559cd0bfd84", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xdea235030568597ee39a993d504ee2ae9c6a9da4a3fc2b794212d261066134", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4063794fe3cc202dc47be8c73e1258eaa5ea57211836ef56e56168696d3976", + "0x1ea2b21ea55fd5aa01fddba0ac00c1c50e35e788393192ec2f4abf10bf39944" + ], + "nonce": "0x7a", + "sender_address": "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x74bdc4dc032e25adc01d136e1ce09aa07b7141e06c4205bcb4895bca4555222", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x51b0712881b4972ad7118d3bbbf7a91cf9d35a802171e83f5a13a3459b9434f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1fb9175073864095b791a68f29a44ec8727b3b96ea3bb44b442291e11360c7f", + "0xda84007c2757acf210a79546430ca310cd3fbc95fa797feae7ea3983bc046c" + ], + "nonce": "0x58", + "sender_address": "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x646ac6558218dc6e64f03be3d4c4e93f2343c859f80a1a86af088452def27e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3f4b90fa23e982dca8352c6894247d0b8b83286cd8bcd6123b07768446e5d85", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6ac115b73a23a007cca3f36e36fecc0f7c4e02092ce95e05355bb260f0bae8e", + "0x273466da9c626016c3c1d9826dbbcc3afb2129b17a5be2588b40d49ac49fb30" + ], + "nonce": "0x6d", + "sender_address": "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x9ff0f306bb54ef1e56f29c4170b8a5b3b4f0472ff0f5b95cc929cbeba0025d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1e543ed4ece9fb852bf7f1ce95aeed73348db7d0dac21b7beb95e7e05dc39c0", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2d9e76287bad867bc0c542e7ce535fc3d27c882f080b6c32e4a0e18536ecff", + "0x35148ed776d225038ec8e3ca4b9d3fcdf06226f8dfca817886d00679b8572c" + ], + "nonce": "0x48", + "sender_address": "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x663795ae8908c52238228322554f5b9faf14b1a5bb28a7a2bd09d4d416afa03", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x10331f033fbbf1f03f5ec1bf58a2a659d852ce69bcdf9d1feaa6c5815695e18", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x34cc434e7934b970738f797e8e8d4a862e475f2114824aaf42b545bd5351707", + "0x6e6c62a70d9d9b9ecf69ea5f1bf5da58884e2d9038d7deb466d6cc75b5e0a44" + ], + "nonce": "0x32", + "sender_address": "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7b00a28fb03b564bc74669f017620eea809d6bba3dfa58ca0f67142aa34ea56", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x288d178762aa361a1c08b55ae567bf4c18a55c4e3595624d087d938c1968e46", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5eb6697eeda9eaebb1ff24779fbea52093671105fc7144feb4f434f6bb1bc5d", + "0x2d6849a6e92df3253f1048ad8cadda5d734af99737b42263acab30abb250750" + ], + "nonce": "0x2f", + "sender_address": "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x28d2582d04f3f466057b8d051c42f6702e1dc8f7cd6460e8b2b01a96ac05bdc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6b080b77b69390d6b4f4dd16d8a90b75dccd5373b6cd501fc6043100bdc7573", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1f1fddf1cf116b0ca6d9415185868fd1a6c26ed0f9a21b8447f6a1d9e5d3012", + "0xc980661e7b39e55cc76dbed3e69974abf3d34ca7e5994f938f3c4efde3bd6d" + ], + "nonce": "0x22", + "sender_address": "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1a8a56658ea7529d7d8bbe74bb4d1ec0d70acc6f87a36252aa6e2921f7d901b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2f068f077a841ffef9a5cfc42f31b7c6683cbeb683048c789aac35d3fc1cdcb", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x61a6c24b1cd94eef27b6efac7c137790b1d8bc43c92037b1e013618cbc2dd64", + "0x34cccc9aa7be339ca96d30aa4e9355c9c136f984318faccecd2dd5f711e997c" + ], + "nonce": "0x12", + "sender_address": "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3df3f563b04bb3c63c1848e73367135e3d4a9f2ed579aca6e40ffa970fb22ab", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6ccbfae2657efa74c7759996c5799744ef3d14a05cbd1c6f82e59cb8d786a8f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1c24377567c2576def40e7144e77b70ecf046d6ef54a4535db6d3fc88b7fd6f", + "0x18eca3bfccbf31d8e553692cff87ce53daeb547d84465801bf5ecc095ee1fc1" + ], + "nonce": "0x1e", + "sender_address": "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x8ff02d921c310dedbcb26822102d1a5d85f5225073ef65427843dc208d86b9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x310a30391bd886a88914e488fd5991c05431fcf60027a64e60541ded7ee085", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x20ae64dc14130d4973492bf39a01020178a33229724daaeade5273a5856ac52", + "0x2b538798dcde647fd7508d129869e14016a985695254f6af76201f1672aaad6" + ], + "nonce": "0x7c", + "sender_address": "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1843d0466921d394ce28999ab4b20c7573aa2d6e48303c9e42fa9bc753910b9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4c13766734f3b71821a4c8805174008572b7d7c2d5885e88a4c7e0b9a1b200", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x560565bc0575bb2b0487aca9cfb9c178f325d419f3318b7607ecacbd0bf0d71", + "0x3272e33b2a5005aed770c9bf7e3c2edf4fd0801e413960fbe856356dc834693" + ], + "nonce": "0x28", + "sender_address": "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2b8512868598e247c9a1413424980001d50bd00a5a263b484c3b53284f086f0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3537235a308efee36346feb8f3bd1bd754f6bcf3961069c796b995f6c087aa7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x76577129fd58561a52f4c52594a77a99535b4d2190d001b8cca03f434664e86", + "0x7b8f206cbe26d7f317fb2bd05061f1259a8074c08a0b65efe3eaf3574eec041" + ], + "nonce": "0x21", + "sender_address": "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7b1f9cb425a54d10107cf8ea80b7ad02901a30525f1d960d093d5450b3cbbf8", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5121f255931b3faa334a629d7f4fd4faf1aa0454fbea144450a9a6cb3f7fe99", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x43067bddd3a594c5f100ba7dde26cbce4952227cf4c020c5d6d687d910fb354", + "0x4987f98db77371921e83f7716e581071788b50b6be8b04b025f78a5f0a8023e" + ], + "nonce": "0x14", + "sender_address": "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3d799d2ebf90ad00171bc66ff2faaa38157b08b5e34ae825b44aef6e3b0119e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x395c2a4f9df24ef4ea8743e643996aebaa1ffb9c9605d837adfcdfdc00eb0df", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x830d83f6ba351b8619c3327534997751a2c7fa8b862e626e642340f4a7b9cc", + "0x1e21619e10ad839f1ebcd2edc6f7367d6d7c35629ef60502bff948b98909bca" + ], + "nonce": "0x33", + "sender_address": "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x679273e0e8dae325714657992fc3296ac0ddf637852c46888f6f0ff18f2bddb", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2672313365f1686250e360ef40af7d8bd7bd96012f602553162af5b2b4ed74f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7657ffa05589ebb372bd6c3ace1ae8a9adb57a766106efe276845b113679562", + "0x6f2053e6220ccc29eb98d63fad3aab2bd63c4c5f5ef28a2c12384f551b77e15" + ], + "nonce": "0x17", + "sender_address": "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x53b2277673108514c99d88fe4cc555fcc03a661af45d1a4b7388b6824b7253d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x77c50c779bdb835ab85ae739c4924abac8b7419889592efccd46ad36df6b5b8", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x317d0b3605e38d1d706e66087019d80e6cd6ca44b05f99e573dbba27b405090", + "0x4c13a4f6a4e87fc87c3ef80f41080faa0701f1dd2e4fa58793d120eed71a367" + ], + "nonce": "0x32", + "sender_address": "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x72c65ce2d24e7c3fb48960296fd401ffde34589508ac9ffe1e1386552a2e005", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x491e39f5de84b88472a9b7bdaf9bfcd1d094b05f6358165c15e7cbe5db52f7d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x52e6afd67a15f489774a5972e39ce34eb8350b15f5ad501e631a85462389d33", + "0x4ae16fe23b312bb3b78ba0bfd9b8db814f858f74631bf9dd9e6147b1e886980" + ], + "nonce": "0x22", + "sender_address": "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x745fc497aa89c73e48b5bd2f54d20dd0eadb7381a3670168a99d43aea8c6bff", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x591b1d14fd90869133097b265eb22e95d0415a7643f3c8235eb58191619d5d2", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6be53feda73a4ab6e2ddf0e25b97922f1907a1911ef6dda2a7a67bb6a40bedf", + "0x4708e8b873c5539185da6b75b10d9e4b269da9c626673739cf7bd6d5a62f29" + ], + "nonce": "0x33", + "sender_address": "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x675fca6eb609c22ba375db97fc717f5284b370be42743195c965bdc2046c666", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x22b7235fdce25cf5495a6ca670254684561d45f536208ca9b6fbc275946c316", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x39e12ea6916e2bbbf01d207ecbb0f84c9a1d344894fb21590c86ed18b2cc791", + "0x552d3e63afb84d52c4215a3485bd1c7fd32c08cf6442d966f17ba138bcef16a" + ], + "nonce": "0x38", + "sender_address": "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x386777696ab90e403e83ab4bb5d1986c8a0c66b8c7ffe34e37fef0d2e4113fc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x448d7bedca0c5b233f8ab9de5c373b708b6ad3a53c5f81397c36f887fa7cf4c", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7d868ffa8d926d4b12962dab01829ffa1a14c614d2dadae5a55bc7d84d17d93", + "0x43a41af010e9d22593d92331ebad1ec9a45047a30a5e552ad04b249a34c89f3" + ], + "nonce": "0x51", + "sender_address": "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xfbbbca39f675f1d5e3e9e5616b83fde2a586881ab158d1dd35d83e4361ba3c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7ad9b0ef75176a11dc46824b18df70ef14a4f32c2426e682043d92f22a1b061", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3cdd9a0db903ccd82372211e2b820320d71b51746079db0bbdf05d480646b1d", + "0x21dbba9cd1a851eb0f012da0d71969fd42941b7b55c28113f9e5cad369142de" + ], + "nonce": "0x47", + "sender_address": "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x371a30b6c11017e1ad45a5182279dc6354c295c62fb2b62a64a88cf98172075", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6f14a667249063ca52f3b4b5708fa021ce678edfd8b4a63dc955d5c017d044d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x760c6123b847da94f49cf70251407e1ec24fd55433691c0adac97c71b3d330d", + "0x11189e87aeb5224f95f104b436d369a3a85052290615d2b9228763e1e82e1f1" + ], + "nonce": "0x3f", + "sender_address": "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5aaf885f007d12012021700e9ff303343c63d216f5b1e75725380adbbe78ab1", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x28ac04c7d21a8ae32bafd02384b20c1c13bab56b3d4aec7183934c897b158b7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x50a7fa6b8a22c699cb81a9beaf1c92b8698395017ce43be77e60a3a5c8aca67", + "0x2aa30156ac136bcce2ce057c7d06ab875ad181769864efb94f2685698046697" + ], + "nonce": "0x5e", + "sender_address": "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5510c25011742b06815be6d020576cee83b6f659d11c19a8c9c905400c6b2c0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5aaafbf7d18bad664c093f6204015da223e0a0bd2d2bce648b702ac54a02419", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x474348f888b9a71fa3d2eefc7bd90364993042b2de09498a0530f96803cb428", + "0x624183b9389d6d7d4b2fb412d85b5002ced442c0209dbc512dfbb733008c533" + ], + "nonce": "0x53", + "sender_address": "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x71b52f0a7589b5972d7c37baa0b2056f085f6f6817a287cbdcac978b7dad26c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x561b16d059f7e4c3a04650e118b4d995d917ef4cbe1125d4783ce66c81a828f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x211daaa3fa5603c92b639aa0837e107290424ec58a708254582a6130921d13", + "0x397c7cbed3fddbf2273bc7778d969e8486f611a62880042eae8128cfa05b1ac" + ], + "nonce": "0x41", + "sender_address": "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xfd6ffd67c2e30772fa28728803ee853b16492ed1e5f72e91847115caf45bd3", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x370cb459e3b42e03867e6d9c957c5b61c9b34f3771a267c34102135441baec0", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x765aff9ada85633dd880c469f420fad70bbb4a1b444a2946ce0a2f28b024b4c", + "0xf145f013f9cd6adc15008a507ff448d8498837644e451f2d84ac0b17d165b0" + ], + "nonce": "0x6c", + "sender_address": "0x3a70b8ddcec9d026ff4a3fb2024f7815fd47dcf62716107d34a6ae5ee861e0f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2011b0569bdc4c525bf03e7b55a9365de1cf194249966c88c24707f4d850406", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x46df785050a9aea2cbcb90f6ce1cebf789ec5c3d9498656c38a06c29b5ee85b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x32e64f466da902f8321bd1c1292514def0ce94ce3ae74155c106cbd7c30a98a", + "0x6ccd6535043d98007336de9697c1aa3cff6d0e0b2ea7dea8d152380786db148" + ], + "nonce": "0x58", + "sender_address": "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4434a91a0b85b4efaad7d9b70ee2ff598a071c9dee4a10b06b3697b671e005a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x59a7de5f6180b1a0bca493ede1fefa263b081efccf50bc2347b94b1877d9dcf", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x68056b15616713bfe99e08655662462c89cb1f1574ae7546ccefd38e6280f0a", + "0x732529b230ec62970dddf5de85798ae1febf5145bc614fe8c317bdaee127317" + ], + "nonce": "0x6a", + "sender_address": "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x9d05e196b5d20018731b9172e9041f6098014243a3d18d4678f046a28898ea", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2224c30ae25741fea63e9474b2f0f057fff88de73e4b248175a1e927b8848", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x19a6c3d374daa879af80b4016d0be484492b71417a02aea20e9fadd90efe3b3", + "0x7547be8e02902012ad1ae505de9039021a37838831df211e91264325e34aa57" + ], + "nonce": "0x42", + "sender_address": "0x72a90329f10cca92a43cb8014ea168049ee3e1b9013638afa026a4671863ca1", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x513c58ca8af13ecb6006f00151ecd119cc527dc13ff9e3c56b1c5dd05b84f13", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x23f51e1b32d65027a8319c74dfb6dd9c738364405e626783ed6ffb1fb3659fb", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x34e5357e804ca4f5d7db9956a173656bbe5400d8ab2fb13b1e1d769f87842e2", + "0x6a2a186ed1b56ba9d1e728d688d54e7c07f9aa0be5d5a9be26971faaff31a7" + ], + "nonce": "0x51", + "sender_address": "0x1862d76a292338a2634814f9f2ecb90684c52e1c3f600388865df686cf4e54a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5dc35a6caa3c8b98a96bbe3a21bad65a803c445bfce698aed1e090881d1996a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2a4e4999fb73d8f3642c3ba7156049cf13cf61252cfe452ffbc8ca602090108", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x485910a4645549200085108907914ea62c248cd4b828d44c2d45c8e4509bdbd", + "0x5ed58b17f858f9788b409267e1aa248589b57b4055a122c1617199774bec0fb" + ], + "nonce": "0x5f", + "sender_address": "0x41157baa0cd2f7bc1029be65db77a81f97784d3f5aa16f77775d9edbb4cb615", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x323d32c8dadf08a0a06268910505e377d4775633e178c6b7d279b931ba0ee35", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1b04a7e6d3428539d6898984bee2c018ac39a8f1d2863e8ce1ddd31a1abd353", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x432fcc9314b33f7eab0d7aef6fa9b5e10d8d7727be023cd4df822f12ec45bd3", + "0x55ff7af36ec8b737191caff39c5a8315734a70db198b4dfdd45d4e324639ae3" + ], + "nonce": "0x6a", + "sender_address": "0x7707b0c961121ae62f4ef63605121041f2754bb095e682a4544b021aee7e2b3", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3fbcfa51836a171596f2c6bff0edb9e1f0825e9062aed979683b9ba73369117", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1524dddf3c3bd1767cac929b8a4058e48526719d7cb0ab1515ba2842a70c107", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2b1d28fc487f7a78aaf243b74e861023f7f242071c8918595ff74c5d272ec27", + "0x2901679d4b0561018ec7b52f63bf9575e46c7f09555ad37a0c21eacec4dbac6" + ], + "nonce": "0x5f", + "sender_address": "0x7b3796a71a75e9d55aad1d46057f6facb3040eaea69d255c6cca52c9124e94c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4683d52b5c5da50d154b9eee85be9b335acfb2edac7f0a46b0d15df18d9034e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x28ed4b6a40b7d06a56267d52c73453a2072d27774b33e9b6557eca0dd680fd", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4ba438ec49957bc5f6e14c4416e4882026350814fa6809648c96f63552e4a8", + "0x562fbcdaf66ca00025229461359e6face47328c87958abd63519019e638853a" + ], + "nonce": "0x44", + "sender_address": "0x14169d652eaae2abcfa6fda7c924f8da98566eb1f5f9f33fbf09629ae2b2327", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x550ebab892aaa6e219c862574b8457989b937ae35453d7508e9977635447920", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x384c56e94c958e8861f371247a7eaf75909687116adcca565ba717a7e7f3b85", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xc2d41dd93683502cb372d0f71335adfe025ce26123f30eab4250b1e2f6e2e6", + "0x3ba0159255dd5dd356e3cd5054a56f3cfca42152586fb24df115dada26d1815" + ], + "nonce": "0x42", + "sender_address": "0x17fb33a9db88d0e4e3b382dad1733522ec8024647716f463066bedbb490978d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6d73c6075cb31839dc618587821690839376b005faf20e554c81cf22f638c16", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5b3183a07e55ce39930fd7552f0e083fcca6d15d5632b51974565eca9b85032", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x39754c2bcdd9a530b55ccd4732f582feb138dc255e55ce5380ea0d44441d1e4", + "0x77a1fe017ca3f41382154435b54439dbfff9aff07f41baa1961da3ba2bf8b24" + ], + "nonce": "0x59", + "sender_address": "0xa0e0c780524827e8f094bf8c199269f06f86309d30c65af0f7dac6968de3c3", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3dec2ebe2f47ae0947ee9693ab01dcdb74a2ac279fc32a35c8b84b722199ccd", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3bb049cc0666a6ceb2be10a9dcd99ad9bb880f63e8bda0b91c99d94fa2a8fb7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x698c682c25013099438b8c3a5711e9def8aa19596c0180646ccdc49344e730f", + "0x713ad7c5e44328e998c753a937dfadb9f2bdcd034a52ffa1cf521de6c5f2dbd" + ], + "nonce": "0x68", + "sender_address": "0x6f4bd4995a3282be1860aca91fe2a498942add440516467aca9da8a1bcf4a41", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1e8bf0e6b000c281bb959a8f22d2f6967c363c699bbe6e924e13e480ada39a2", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2bc854f3c7bb9cf902c79b21858c6cf64f2d963c108c7769a25bc312a45ae4f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4cd89a7f640838b691d452b417d52e6e8354b04905897d110a711a6c4193e75", + "0x45b4b1fb63caf033dfd6fc76153590f691ee7c5d5f7c9af0a860171a13fef15" + ], + "nonce": "0x46", + "sender_address": "0x524987ff394990a95fa0015a8eb66e61ff9f8626291dedd4f7d50a5f020f797", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x51fc3b4494e6dd9bcfc73c0540669a20632f42c4ff5e769294b05804e320770", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x23806ad7f5ff539aff9bc0fb9f4774c42acaddbd4239fcc90349c62a2230d2f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x59ba4d92820ecb9edd063c10b53607c4901e937d4e76efee04f16ce48a10fc8", + "0x2ae7ec77161d584662546bf87868c39a79843c20a0b62f85dfa2b8f7f8c980b" + ], + "nonce": "0x58", + "sender_address": "0x77845f6d3bebb7c5e30619c191333c3cae03565c2d367fe68bf73dfe1197bb9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5d3a3de6a7d1237648882bc55b7b7c01ddd528414d015aec205a1bd5631e768", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x713489f9ee9e4774505a908308dccc31b5d710c12236fec91cb999ed230fb0c", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x55cdb4736c1777f46839ce6128a715f8f5d8e8fa0ff3e73f4a0148d6c763fdd", + "0x12be7586404508ce6bd9d0909476bbfd1a9e9a9323086562f7674b0a974f8c2" + ], + "nonce": "0x4e", + "sender_address": "0x5032f6bd44ec915ff81e2a450cf2dcd1e28534d804ea9cd38d186dc64c1ce80", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x29ee199399a32a98bface17c60ef40c159a7f2ff97157504a83e5474b51399c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x26d796ef85fafcbc2020caf8f2f15a47ba57d687974f9100c4a3632c0a4d9bb", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x36a03bbeaf4018f341dba1d9676b8d3aee1600060b44469355fae7ec0d0ba1e", + "0x767b70ee1e33705ab2f274b4d2fcc23c2de56d5c2d751f3c07a26e1fb5dd13a" + ], + "nonce": "0x45", + "sender_address": "0x5f34cd49c033df5b7d3da352020e839e88ca2c28025e25f70a6a485d68fc0ea", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x129c9dbc05f4bd012b6c8863cd002192ebdd5bb3b6a5d5de450c4291fa27ddb", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1d6bf7bd16cfad947146e6cc3abc9243d80bfda51a13d089c843420c9dbb63a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6c6afee6fe7843feac599f0e37385317481cdcbde7c76a45f6a47ce8e28a71a", + "0x4f0f198ccea5aa51f618ca94d0eb06f4ebe1780ef14d9f9a579bd7bec82dd9" + ], + "nonce": "0x34", + "sender_address": "0x3f9e6e9b92cb5febf0b6b79209a9080a53bc94642b01bfb5fe2b61289f18b2c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x59d6e886bfda7f1764012f766f355478f4b8e3b9d257c9e6b690756f7ec1bc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x388163a57668c9d23bc3ce6cd727deb48551023c407b446cb970d2ba7d7c100", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7592a00b78211997eaef32e31a3fc804fb0b7e4bc98b4b5086562a3a2440c19", + "0x6d649a08cfe12a540e6b872f097526da3f9eb54ca315c9caa376ab42bad87c" + ], + "nonce": "0x43", + "sender_address": "0x46388b18ad7cd2514d20b64c07904b351d313f9b185eb864e9cef8a129a9db0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4221d59d8749ab42e821d5e81292afc59e324f9d85a9ed23cca1d9be222b465", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1474614b42c0c2a7f735648cfe9e69c6ba27c13fbba7de971332c6107f87a3e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x128f28e3aa40c000422ed71910a2c957ef28a0b8d7768f0c28972812fd28418", + "0x47ed8e96d9f83773cc53ad1a63e127886b39795e235c6dd90bc77f4f90aed7f" + ], + "nonce": "0x6b", + "sender_address": "0x385f7376f9614f368023e004031b50167fcd10b85b9cd45ea52b56c7dc2431f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5f56be4577874ca03db43b658ce1293cb7ff3bed0b469a2b754990f1c162aab", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x22419dd35389da8db0763c8807385986fe6aabc0334b627cf3f71724e7c13e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x34c51e64eab29426f4de96934f2f671bd25eb04a2fcad871e456e044dbadf8", + "0x68979141dc4c43fb5f946d5d5cd6336cee4c5ddf88733bee6836f0f3212f4ae" + ], + "nonce": "0x68", + "sender_address": "0x3591c61d75a1d75ee576d70a366138be4c288034605022086e8abd6cc6a282a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6495a9290f42e2e7134d42fcaad2c01d7770a1e03ac8b235530ddd6a1fa126d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1b44b717869617eb64b00d65507005ea9617107340c1e90db801eef4e684651", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x47565317a66205f4a3626f13156e7559647102a4f4be5931db9b8114bee729d", + "0x5a4e1b0ab1bdf279d2f253b831fe052eb573e7810a038ad323bfc8c93327141" + ], + "nonce": "0x44", + "sender_address": "0x6028344c83f128591c5a1905e734c37f6449505087573a54b99891e864ef8f7", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2d60a254144a4a4dd7d7f7c9c657e3d5867207fc1600925e6e9fd6111354b9a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6b2b4c33d9a7b0a8f16d04fa27f3039576c11105cd0cd7b3d42e9008faf2a5d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5492f1947165a80af765ed4854e51b98bd8669ec15b5917ff56f300e4edf190", + "0x2cbfcde544d30a8e61c77d4b1f099cabf143981e4129b98702753e80d6f5ed3" + ], + "nonce": "0x59", + "sender_address": "0x34535ded79eb990827817ffa6c14988cd29970cd3cb4d5943684335f8360720", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x114f3f20c5050e8f45084e50db4835ab12a8c40a1d827b0ea6789cb1915542c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5999e0a6edffdcdd21f41ff9e7bdb7d2d573c474d07bc890654e9c7dfe7b694", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3da17db01a2edfabe74a231d8c82430cdd6424deeaa857467769dfdf5cb3ab9", + "0x5aeff415d0e1471f0981db59868070db7ee4e26df02f06aa9b8363bb92577b2" + ], + "nonce": "0x4a", + "sender_address": "0x5ea1cbe943d1a798d02899e2b74b7626b315d2b81febf7b8adf33d8e57dc91", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x735c98e557704fffcd219c694dc8b9efad6a56d0d5c1c7ccf9f2cc70e1846", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x21f1dcefe9a6cf9dabcae1a5e5e5da5d1415d5f7004a10729d4c13f859af8b0", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2c8d3171e6cc941d96fa186851dbe5eb3e31f6b1c84f7f1ebefb44d35d02ed8", + "0xb695ddb2ce590e04cae6de7899e23198870f5bc0e79ce3ade7c27710a5e066" + ], + "nonce": "0x7b", + "sender_address": "0x1a06329b78575c630b343cf559544f84241bc44f3c63bfb013678aa8145215d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xd6fc49fcb2516cd6a882f3aab1c0e239d3619bf91f817373e3ecd462ff862f", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x62ae74ef5c8daab02aff07a12a7c7a8a9479eb7eab545449f78ef0e33b89547", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x46c052cf0fe9cb2a8c8a132d61daaf297036439a57496b2e4987a2e7c6a3c0e", + "0x543aa3f29e2f1a9cfdde06a6310b31fdf7967a92cf4b69f0f98814d5ce3b46c" + ], + "nonce": "0x46", + "sender_address": "0x12b01545b7bbd20fcdffb03575a25cad0b30698ad7ad4781be1221f554f4741", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6b0d9e9e62d6bcadf1eb70e5a3e69f8748763ec128d65fffa4bad2fca590857", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5b3cdd91022ca02e6c0cc0f1cd1470e1299f6015725d514fb700450548869cd", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7394c9e0cf9a5eaa4b349b46800c1c4ec0f490ff9390d5fc63bf9ba468f97aa", + "0x14a4242e76b904e7714e1b2f29549877a513ef59ebd704b73b241c8d75b6799" + ], + "nonce": "0x63", + "sender_address": "0x12e4dfa71ee52225ff301eb69e2fc08fbc001b0821578be07648a7ea493021f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3c74d8d103a37010c3628756b056e1795098b1248692e890d4b973c5c572193", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1a2ef6245f64b5d87d3227ec399c0ada923753931b2f2c6003eb6b060848383", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x42f28cbcef02f429c0c339845fea7eefddefac9d0eaceaba0826d004aedbce9", + "0x34ece019f4d6a4d37a7ac8f1319c13fbd8fa31295b37879d6eb70282d15bfbd" + ], + "nonce": "0x4d", + "sender_address": "0x3dda73cf3d5558a6e785f54cc6e7207b0173f0cc3cce20f64992566ee734d7a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x73827b38945fcb8a1852327a0db3c1341f498e66ddf45e917b43263beb65ea5", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x178861bfced753d5c29ff84b42c34098a4a617aa9ebe3d8515ab0e456f153bf", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x16dbdf9f236e2bc2a833864f745b804bb88faaaaaa001ad3bcbecc52db1b9a5", + "0x4733a75efcac8f376a575af41c9d016f1e1eb692f71b64bec4acd53be491554" + ], + "nonce": "0x5a", + "sender_address": "0x6ae831431e8fa2128b079844633e084604422d63b7f1ad1a79fb81e37447463", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x259d0346def6321e772dcc7960478b28b60686f87fdf357b158d338c32d0d9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x143f059f6772efeaa0eee19434ae43600d48b94112cf2125e075853d794b4ad", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x151ad5ace906f67ca851605dc848366a6b90e99f982ac023383c34a36e04664", + "0x3941e0f06cc5be2b85551c23a346b03a431597d9cfa93407c0dd729c4b3b58e" + ], + "nonce": "0x65", + "sender_address": "0x4bad3730634830da8c2cea36bc8c0103c47a074f259edd5aba3852e1245a9bc", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5b45d83ead5c4b5061ffeb3b3169ef51c2c9635cfa471633b91e3577e6ddab", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4379a6a0466e0102b5db78269b03bbcd84df24a35212995944d19ff921f80a0", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3da22c062ad0c430be728e98cae194c58dce83f84e063ead7f81764151c1db4", + "0x4d5637cae4a9a34b943c956757ad34edded5aec1be242a38314b66f1e325856" + ], + "nonce": "0x52", + "sender_address": "0x7e83c177ff630265eda312465978a679b25f8eb253c000a925fa5f42bb233fe", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3e5259b886cba48b86d25215a305f4fd0f3892cfd3e4480287748c691571d30", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xeeb3e52134cfa9b421260478bc2af4b896c2c7deeffc7c20ae9462ddef86f2", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1902373a70437df409bc54a867368df1c59b4bbe0c3f52079aaa5cd309ad8d", + "0x6a945672eb9821cee10ec8c4a8b140c56d959a356a92707f8c80539e578b5b5" + ], + "nonce": "0x5c", + "sender_address": "0x1835c7d07311634fe0abc0e12897de6de8420f56fc0e9e1cf0550a71c31f7da", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xfa6ef9fbacebf91627a6d6e9298caae7354b63378b7c59f36de9cefd32c708", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1508bea8d25546169759b20e5e576daf060ddfde0ba4699cfad13bf46ae47d6", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x724202bd2b168bfcf19641bccb560102d956af02e5de63519d190bd4d4012b7", + "0x5337fb992c2da61a465e49d71da6e4b19c638006207cc3ba1af594197f37fd6" + ], + "nonce": "0x45", + "sender_address": "0x1d00cc561c943b49f5f2bac27591530a55970c3d0716317ad42b78cd6fb469f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7522d5283ed7b9aced7261bfb91f73fb0bcc5afc05e0ad3e25e0efae03f4bc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3cc7a2bc717ddb4c64358ddd4b0338ef71338a29e486b4df466bd1acaa6d87a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x70ea45e763e23701844c52e586ae15c1d911c98726c643da604b999b4991d4b", + "0x61d5fbddc24ba70adb5ba8f924a99a5d8c18de23b532f55c2359352ae79e1a2" + ], + "nonce": "0x49", + "sender_address": "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x150387eafe5fb0a8725f2fa1b3d450c886b3f93698fb2ea579f55c829b37621", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4f22683162858d005fcad495620d4194b634c2ee9be1f11f9e91348ebfb7d8d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7234644fe83f728590b85e21ee0afa70759721e15a8cc1750c979737b62e7a2", + "0x67c0fbfcf7954487390efbff17a7a3baa16d1ee352325cae5b1d44a1e971f2c" + ], + "nonce": "0x6e", + "sender_address": "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1cb41f8efb81bfde450ffece8927952542bffcc4956c917dcd099a5c2f334f7", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x103381a88f800582d200e7cb4239c558992f8e2107eac50570f48b29784ae4d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3b51f0ce87e39cdcb65c3be6a49d6f862306d6b7d821ffc699cb192b6499f48", + "0x44333f3bb93f6716cd6d1849baf2923472f0b3d7799fdf112d23c30b76e1f62" + ], + "nonce": "0x7b", + "sender_address": "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x838b9210d52ff4e227d6519041237881b96e3779057801451ee13266ef0a10", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2e0d84b614c67b7d788a546f04e9314735d19e8af7648bd980f4cc4d5ecf1f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2cf80cb400cddc6a6a72313d85c655e6db1f9788cdb6debc0ee5623faaff197", + "0x1ab63c82e82934d056812c2f67435d3e3f2ee3a319b56302609775877eae6d4" + ], + "nonce": "0x75", + "sender_address": "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3ef4f36ea03fa22b3ace1944e9c30d2d3db1ba1b829803ccdbc8fb10f91876a", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4cc74e3a3b93e8869d01b42c7b0ba4377163705e2927d390bc8825902a0cee6", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7cabf91dcf0d22b4cacab39da49c13b77292627ab020aeca60e7e880b30cf00", + "0x21a0b8967b193c1a133bce5375f9a43ea1cfc27e82ba677587561e6ef5bee1d" + ], + "nonce": "0x53", + "sender_address": "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x44dce543187f9da87ac682c03fe29e16b8ca948c724d6bd270aca20346cf91c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x631a91925e1e7a9a0985738ae29f3afd3b0816171df5ad247f7559ddcdc4f8", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7c27845490dbad9c08f4c129883d776fa9089597bcbc594dd86382c450f0a4", + "0x3eabe9413a3dc447217a5f007e43887609183bc27d9c5d96ccf720bd498c06" + ], + "nonce": "0x63", + "sender_address": "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x239b57eb82dbca89f0a16cda7a9d9a825804f7b8316bf130bcffc2af7525f42", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x37f798b39deb534b7a9888d76afeebe76685035e628c696a0bf96e27b8ed72f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x51dbf4522c5d54971874dabb636cc312318166a2967962cb88b2f9a957141c7", + "0x35feac694155e6b81f0e0846fae649961a4cb38dd55b8f28b908fe2d2c5c579" + ], + "nonce": "0x44", + "sender_address": "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x358369a82c0c27912027bd581fefa76774fd3085af46dfc66c40fb8c1ee773d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4ab4bb1f5fc4df7264f57a0ebe46ac3ac66e1b1524bbe6b401dbc27484be99", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x37a1d91f78a8648c0100974b3570a65ac1df8755f8a4180b8f82a23370667e8", + "0x7c0ed5cf63d8a3ed18d2e14f29d7591bf8748e67a5b79b1ac2ad051fc82d" + ], + "nonce": "0x59", + "sender_address": "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x45c790388f6d017a4821c1f51a92e9e3146fc2d421346457728abc6b545668d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5b277f8d91aeb7da62ae9545abdb44c154ceb0a09659a84f5ae2e3a0acd7ca", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x346971f185b6f3013283a4c195f26a40918d3aecbf3cd586897916da9512545", + "0x7446b363315c68d197bd381cb00888678d14ea9c7c0eecdb241761c0810b812" + ], + "nonce": "0x4b", + "sender_address": "0x3c875403ce3066337b984c541ecb4f47557e421e859816e65bc85a402abeda9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x15cd63dfe84340f7816ffafd37fd253d97598749fe60dd6fd002b2f2cfe8cfe", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2132548ebbde369d32a37a82f8fc2d74278f0b73b166818bbf03927d4dabf14", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5d88ec34e1f927aa5254535f216847233ee0660df7ea728e4692f28db34f791", + "0x6456ac97a829c90e8b199be9638edd22bda92bc9a848fd560e85e9834658a35" + ], + "nonce": "0x3d", + "sender_address": "0x6bf239cfd8ddfb4edacc070a23929b9b2522585548656ed1de1033d1765b25c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x47899478e2418f2e085ff45c6880a2a9549ff19bb2d7ea5ee46388b2f439562", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2ee469b6fcca6cbcec46c7c11c2a701a1f0926be880b71471d07d3d6aa430fe", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4bd2f01e67ba008cac3e51e525070b27464ebe59fe208ea62116d8d55c5bee1", + "0x6656317585cf6f2de1ea68706273135044deb35986dd93487fb3de3f001ff9b" + ], + "nonce": "0x39", + "sender_address": "0x20f2f2964d6cb9859f1d264e759fe089eec481f131defb7137878c36478bc9", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4c3479ccb311fdaf337dadd954d9ce03548472bf8b4bc32c6475043a99dea58", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x496b37055585ed59bd991a954f7f3c950a6c4a0117d45e8831fcd544d9b278a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x53e37eac0722920b43bb3c8a9707340234894c0e85036ade3423d80b84b075a", + "0x4642a3f5512acc0be5b7dd53dc187832bd58c2770d438c1bbe48b4a95c8d8f" + ], + "nonce": "0x3b", + "sender_address": "0x5c4f4e4ae30a422a1b735b38c52bdf5739ad64b2f95492ab6ccd93b4f6be2df", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7a4f52d39ab901cbf7d2ead756cb3a8516110eeb8f4f958ec01f72674df76ab", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1a19f0db9a0d4fa69a0df59a0982b64dd9c53c0034d8b4f16d6912e564d87de", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x53dfe530728f6222523c6d0f660db6c12ab712008ab4173b9b26aad0706b4a9", + "0x80a72eb44b702bdd183ff1aff094014689505a165de9119de4d9fd19fa94c7" + ], + "nonce": "0x2b", + "sender_address": "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3baf4487184344596cb078af8730466937df2d938ff56688442c9a146e682da", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3aba052a7ac31196b103efea508299044c4987be17ed9db4a142ad205a3be2b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2f8da23dced8de0e716e07beb0aea8d35975c11612c31cfdb4edfe9f955bdc1", + "0x2da1450dcfc9991b7e80fcb798b8e32001a53a2e01b076cf6d5a8acffaf904a" + ], + "nonce": "0x63", + "sender_address": "0x1c23816c01bfbd90fd57873025b4d5b86ee2cccfbad90d3a7fa25dc569638cf", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x11e5e35e8075473dfab70566e0f9e071c7d1f5debcc8fc79c0bd374ea610681", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1cdbbd431edd81c19c08d52b2ca047b39bb9773a8c9332ad91e3508ae8ebb7d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x32ed0b0fe8e7868c651348e791ee9e0ce0e98b2a1a716a40e7f0ca078aaefe6", + "0x4977ee2c42d280fa244dd561f613a2c750c0a4f927927d84a9284eadbcd7f8a" + ], + "nonce": "0x50", + "sender_address": "0x40de1d323a5870a9b1011b1476bfd58f92a35ba59b1f9f3c69cb083fcba122a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x786a7b8e6c19a882ee918202201abffbd1369d30ed694406da52c3e615b0d32", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7c0661b8022ccd16b2ea405f20b4fb72e2d458e7807952c462e266fb0d79325", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x422c2bb6780e1c6304e3bbff3d32581081f721de226acfc340d7a837c64739e", + "0x49b8c73c95c90f5b601d152974c8a86fc04a86ad0c5ae030c0b9b1e6862b55d" + ], + "nonce": "0x4d", + "sender_address": "0x51d568676ce46d5f9a0d7c23c7c72cdb8536f38d74b3138f3cb9acae98b074d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5bca2c958cea7ac17e1d4dae90155d11a911a917f91a486ed5013c9dad2088f", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3cdf111085aa25cf5bb06aaa4506bd17aea4648d790264a88b205fe7d4f2bad", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2f44c93390b5678e488ce0b158020df832141b40dda2b267b7ca48dad523146", + "0xbfaf85838425013bab2f8eda583d0fc45d555ec659e10f54d386856d1b86df" + ], + "nonce": "0x50", + "sender_address": "0x2ec71fc858681fa0cca225185a86060926a9bfd338d749f256910d415770d1d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2bd2704ade8daf80d330f575446499b44783a6cc21e3ff95de2aad82648e491", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5d426134165dfbc7943021571e8b9f1014c1cc368c2ca2456b9c0f26fd547a3", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x77d1e3025c2465f3568f721ee12d0b23a4c53a81f94d106c2ed7491f0a9150e", + "0x2f1a6cca14bb70268b2a86e0a8d59f9d909ec542bd85fef30523b23db78be71" + ], + "nonce": "0x41", + "sender_address": "0x5726d58c2c6bc370074cb67581d03cab05e1304365ca0ee9f4ebf3faade40c4", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x397bb315d341edb330605784790faf476d4162ca5ce07d269ef8f39aa5f8401", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5280f3167d771ca99febce9e6dd60705a0db2f5ad65f8aa839add5ce23221f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3ec31978fcffbd308dd85f46f325a446665ac52c55c3e3b1b3a9e2da8fced57", + "0x37126d40153525ecab0d3e419e48e10b8f68749f648d033d85783dc91e565b" + ], + "nonce": "0x59", + "sender_address": "0x73f94dad20c07abaa57a278d02d169b48882bce673c421251686075a986db83", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x20be5a51198a030c08ef3886a5b47661a773b186f4407f3f2d3c2252828e80b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x173ae09604a69ccf8c0b4699f38a3e20cd03f3eec2c817ca537d17a9084b266", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1947107d7dd631e9aa7dd30ecad4e266286986ef3ef25d01ab6db385009c0c0", + "0x174807ef91d9682a00f5595a764ca683a1e0d60eb5be819ea89b699360e118d" + ], + "nonce": "0x23", + "sender_address": "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xff9247899738818e2b47acde31012975dfa023f5c860a19110dcd8d17af54f", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5b718ec976fbe5a287430bac79254dff399b4d06cf7b40952d02dd37107575", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1d7c2fc083db276f6152d379bf9305e0474c10b6fcf3ae57fafad9d1d1c97de", + "0x1994db422ac6d962ed2c06733f7b38606651b62f81ed5556d6e231f41626286" + ], + "nonce": "0x33", + "sender_address": "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x31293244a17ef815b86baaf64c80c6885f900c74c51fcf57512d7d0a16beeb6", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x25014de16daf7e0b7616c884fc0f7f347bd4fbc0581ceb8f8fafb62201cf08b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x559d83e423e200fc7b3582618905b75c31f42cf527bfda3fda981e67833e931", + "0x53bfd508bbdcfe624d0bb967a028eeaeaae776345282f6180e93e7ac9b8bbc9" + ], + "nonce": "0x13", + "sender_address": "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x177bb3f2d216e4b5fbd795644ed4f764e4d44e88c6baec669dd7c961a0d5459", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7173b79f089b5c3a04387f24fc50e335cbf17519153cb96b1d76ddb2b963b62", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x503f18124c4f19a7f26e6dff8fe9a3e623a11ddb4d71343481f798c97c88aad", + "0x4cd688fc6a56d053ff52f48d8e0f595191b6d656a6dfc4c33b6d267e294e8ed" + ], + "nonce": "0x23", + "sender_address": "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x78c79109fb270aedd672f34ee762cbb13182eac88902e83dba9ff8067ccaff5", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4c2af11345d1c14e61e42cd6f9aaf30e3198742ca02fe80ff8779b6f4c3529a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x73b53a20908f1408150e077fc7a1a5dca36be49e21ae379978401818b9188e1", + "0x5eed6cb7228dd6a1803511a46d7de5923cd8186fd5045a26c1f56c7fb31fa82" + ], + "nonce": "0x1f", + "sender_address": "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x553865b8c00b13964c2ca979ab644e5a78698d1a432dd79a139212edc2a3bb1", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x73cb474823be71fa131985a878728582720db457b0b93a88510bd5117473314", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x618e45ee94447e60f3484349aa6e02c4752e1da91b25b0b505bc872e8994623", + "0x5470c6ad6cf15e6ce72ece561a46ad220f462f87d4c1947b4fd34cf4fdfc332" + ], + "nonce": "0x23", + "sender_address": "0xd9def9409244513635be50767308e1c80a10bb5d116efdf78b9de36620bcbb", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x23a84f6c04e12e95156f3a95bba5fb937962497684343aa8b383e0eb9544b4b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3e449ca641cd0bd1ff73c932f69202871c2ad2543b8bc11cdad527b74f8d0cf", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x24936f9cc98fbc60ac3720b24841b2af04f0958b38b3134af3c4be36c4b90bd", + "0x52309319fdcfd3d2f3b4999bc3c0c4b8a1cbc47778ce7becb0b2595e96c8088" + ], + "nonce": "0x34", + "sender_address": "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5b356f0bdc58baca5e3b09d7924a9c149c04018ac44c4b9ac8ea8e909f273e2", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6502bcfbdc0ff581dd427b3352cd5612647f4423496dea5a86d5bc58c549f40", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1e962f7dae07cf748e4246e710d2c8578157dccaaf3a9eacaab998c57e30431", + "0x22b3af21c7f92fb509be8a158cc9b5ac16bec3ef11d0b66b75684b0ed51f7b" + ], + "nonce": "0x15", + "sender_address": "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x448352a22b7d13d447579abd96b903bd4775e3706adb4c849b27ad8c35920b3", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x12201b7537453148e286b8db7ae963c8caa2c97546dde9e4b3bfdd68479bdb8", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xd7447e1058acd01fffc4e63914d650b37da08a2c72f1c24662e92582b58db4", + "0x5a732257f7c5adc75f426ac19e19bd4be01a0a4ed35eda94a908e0acdb9f46a" + ], + "nonce": "0x33", + "sender_address": "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4ff825824c14191fb3ab092af3398dc43fac2f39b6bedc38e9a59eb1830353b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x71b3cb789db36c1eb5c123ffa8022b7636e0ff532a66817ba4aa40becb87600", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x28f2a2a5066c01fb93a87b828080f786dffe542ecd0d5f756110e94402e7003", + "0x3534d145049982b7a54ad9016283a6d3f9a96f6347a7545c2761da94edd4a77" + ], + "nonce": "0x30", + "sender_address": "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x98a0c24e9409c975c4d00b538786fcef3e6917c87c2bc4f6fa6f0030d2c0ed", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x53beaccdfa5cb43c14a8906db9bd6617ab60afea57dba13c655d5c98df3a4ce", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1f882ac460634ee181a6b75c13d4f00c6cfa370a0f1d4361bbc429e8abd8e05", + "0x1c9626ffe083884a3f67fcd45bc32f33556178ec2f8c55e3b4cc77c53ff970e" + ], + "nonce": "0x34", + "sender_address": "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xe5fb2d5857d353e096b22ef0f8e9f99ff95b806e02a100de157a10b9f0dbe0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x67102dba80499dbb2d003d8a9788624e66850545e06f8161e0c1ee67865e8fd", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x560cbd1393c4297ddb75aef100b41b0cc0526203023f544940cd6fcc8053ef", + "0x70e7663bd63f7442b5413ee502076728574815aca7f58555462a196d526693c" + ], + "nonce": "0x18", + "sender_address": "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4dc90cb95f997f48e57659a8b967e8e274efc50efaa44e151d3f06d5c09888d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x839e5b87c654d05241a6b948abfc731d9769330040b8c51152b0333bfa7a62", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x737a5ba108f092925b531754d229dfc5e24c261e8301c576435c29459ef2184", + "0xe125d49fa1360aa6ce37e6114d3eac06def1aefc5c246808e8a95a747aa56a" + ], + "nonce": "0x22", + "sender_address": "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2b23e674ac1780db2739b1120bfa338a1f5f70a1e2f504c420e3b36e67d2e7e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6044face7ce6c8aa9f8a9dff0ad8404e0b7e94b51b2f0ab18f4839ba48ae63b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x10e5677f653e8f75b03dafcb63888947cb90c421ea593e62e23d2a658d95bb2", + "0xf5f6310000df27dd578f31a511dc9633fa955cc4cec17a345ddf28a6ee3746" + ], + "nonce": "0x39", + "sender_address": "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5084d51029195f1ad25cdc2f9dc1ca7a6b852a0403d64cedcbea6823ad60406", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2b4211bb8fe9826cd759f600ace0d683928c5d01828673cb636c5960fccd33c", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x46234c6b3d1780f5c29b02a9db338e9ef5efc2b2b86077af22d7e3f13cd75f8", + "0x327c8f0a10b84d71c5e5ea15313484846791cbb51e804bfdddca08b08e6e271" + ], + "nonce": "0x17", + "sender_address": "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x7f4b923ceb59db39ea45e8bc509ee21a794f6bf519195843196383a7f41c733", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x76df89475d06c33ecdf3388123641a370c1966530b3368fcba532f5c0968065", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6e712408916b6b533d69c154e2d6fb51b28dbba44715fbdc1e5b0b334c8151a", + "0x6d84a28ef0bc11670c63aa30f178e072f425a8bef41ed3eb0e351e509ff68f5" + ], + "nonce": "0x36", + "sender_address": "0x6c55ba1f4efe13d3eb06441582c3aef616542be06363571d970ecbceb893de2", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xe84b189ad866d825e7acba6c35b1896bbe63af2c978c252b560095dd624475", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3602546a1a075eeee06156aaf95e563c67fa62f9a49aac2462192b76a714bcf", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x10351c6f771686a2642e1fcb2b224ef61e0bebef0c0972024e797ad9e3d1014", + "0x338390313aa4b367c359d62ee2b22a2d204425cdcf195822964a9cb693b92ff" + ], + "nonce": "0x29", + "sender_address": "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2469bb3a01d85d5c494b4ec4b395892aa1471d39f9b8ee02e867c22d9fbc9e0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3dd182a9cfeab84580ea77bc8302af732566c692d5f2bf3a744e0831834985", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x20c24f1611d31f9884f15dc27bbfc961844dcff3350dd36a7185374b74386b5", + "0x4507535d4d8a21f1c8371f1aa300bb2441ff4827060b65705d8380de98282d7" + ], + "nonce": "0x2b", + "sender_address": "0x79b0d5fe892237bcdc0979892a9b2790f23781d41aaa8adf351c7980c8b65", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4d28aeb4a73825e8e220be72fdc88a1c7f3e3a07f7b11b5266e4ce09c5d4e45", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3e06fbeb0a6fb7993e15ded8434b8c93c040ef49a47ab53c027d4bd61f6ebb6", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3403eea477251b59391ebcecb52092eec8c25f4c3bcc5566e06284f3a661bba", + "0x439c70268ff5b7cc2dbf56dc0a24e2dcf6abc636a5b6d305af665cc7eb24f36" + ], + "nonce": "0x31", + "sender_address": "0x6be5a0624172c2f0a3d116d03a861375e023f340caaa6363854c9ae4a460f5", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xb83de952bc6d08a2717450a62dc63d8b7388be348c34d35e02a4e721fffebe", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x57b506804275c73627fc751672a4f05f6cd1dc4aa7d63b80d7ad0e693fa421f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7dcc4819b47acd5f65928b70291e55c7640c1d1236f7790b8636e2e554345de", + "0x6aace486b85fb89e9f214555789b19344b89ae7999959e5c3a32a12bd4f1c14" + ], + "nonce": "0x21", + "sender_address": "0x6a4213ccb648d4cc272690144073efdb184bc5c0253f798973666761b231827", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x15bdbe09c4994bcbf777fa5e7a96f75ca7f48ae9adc8bb4729b9eebb8421dd4", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7404ba50c6ab74de5a464496aebb760bfe9d057f67b0f10ffd238266a1929c5", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x42666896980fc2d9970714e70997b2211fea807f3f1a77aaa61b31050ee6023", + "0x472cc6789bac9ce24e442268109441848ba42621e33b911a37b80bca4b50e03" + ], + "nonce": "0x41", + "sender_address": "0x2f50b3c524482dfd39d8236ea2c114df8d8fd907711584de81eddbeca7b7921", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1ce326645bad9e0e6a403e59fd425b44228ebd91fbd4bc859ef3931db28350e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6336498d27b2d2c2498092d18e81fe90a6f910265fd73032691404ba01c97c2", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6981e2452987b045e1327e8d799d4cf912cfd4cf794b234e93b359622513ddd", + "0x160096d3a41972c3963053ff127418ae48446474f3ac1a46e5c47983d0c7669" + ], + "nonce": "0x2f", + "sender_address": "0x6d7caa4818f9d3d4fcc09f69e5c776ad60978fa701d99a6c5a0c70b7b25e1d5", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x52a42025cf1191517e1d6320decbcbd29a0e9b4d6d541642d236c94a1129b28", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x25a369e7d198733982640d84abb9231e0370233df715cb883e0ca96fbf3c8b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5f2c19e03ffd6153f8a48a23ca01fd8a557bdea633f2c90a64e3b0517af58a", + "0x54344d9d5f89ad85e015fa33a08012d2ae421c3de054e1ff75f35f489b20c14" + ], + "nonce": "0x36", + "sender_address": "0x46e53968a2b5fe68b9b0d6ba6d8a475211b845759822e9161e3cea1afbb1c5f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x243276cffa081d5820d2cd5957559e7c9079b04ac9ccdf89a98ae76cd9e336", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7d975576bd417092e8a4240a9dd394936c0403ed924492543257a71161efe", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3b27b7beb64f4ff0b643c611820d1ac886a4ee2c5b100a9015d62fe0ee59bec", + "0x3c119930418190f9286e93ec2d9f63d88c8f43971755344624a8a9b2e73c90a" + ], + "nonce": "0x33", + "sender_address": "0x47666c862e5e3db0e5a43aafd2d1ba5b1e8eb498ea5b42ebc6cd01ee3a16609", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x53ce509fa10a89f8e84c1a757c6ebb9f619c88fcf6cf4cf7f3a0dffdc98fc38", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4bce71a291a23339f70b0364cc38ad842f590f915cfee77388a781d2b7463e0", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x203bd4dabb5942c6a7296c707d4f839767ab79a6426e1ad00565c61b0d5c30a", + "0x73f1285b5b5a2956e962c2c101c1daaa38bc4e0814853ebd81697cbc77e993a" + ], + "nonce": "0x2d", + "sender_address": "0x2b24cb0ac3991cb6362f305bb241e0e874784d44e89d08859536270a29a3799", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x33c72c1fc6bdde04aa50b65cfd0942f84e09105f402e4007212e62076abf042", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x247e7f82d7c0dc9c7d932adf83b1043c6065d704af574587481c2423733d3ad", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6a10409eae967590074f40cb1350fee3b323e1136981c645886da6d2014999c", + "0x56a920144b079204f37ce02212f910658f2961df0c0df0316ed173ca1251e39" + ], + "nonce": "0x40", + "sender_address": "0x43438d30a486df0100bfb40f7dddbdcf9b9c21f2079ae785a22b2816d09d842", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x77649160825a0fa1efcc286ccad2f293f8188372b5c1417e6cab143f15ce0a2", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1c08dce6167fb92654cdd8859b7a497ba1bb8822bc9c65b0d06af4e2e6236e1", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5d058fdf1a6c41b73bfe40a376b61d299cf078c4e09cc15debcf05fd19b256c", + "0x6f72721bed9fdf79fe5c144508202529d43761a4e7b0fc494eca85f9993760" + ], + "nonce": "0x45", + "sender_address": "0x708610e23e4fff8c6434eefadcc284215b0ca10c5b2530d784a547ab7ba6c1e", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x66ffeea403d80b5ce56f240cc1dc71f29de7ddcc678ffb2243b83781fe203c0", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x384448c90680c595d337a129ea224d736e633086d0658f834487de73e081146", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x27de295b78f631ba298235c75237cc3429abcfc2572a78074ba5b4b1aad62a2", + "0x6f5a38983c8dc56c24e3d16f7cb4987df2f87e61d360633ea413a99f2b925a8" + ], + "nonce": "0x35", + "sender_address": "0x73ea2bf4f84c4ef4f95f6a5a03af3317277deb63039330d881ea20e33d0738c", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x651234373645c402aa2545fa765084ad73e170f52563a3412e7e629a6aa955", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x39a051c998a67dba681a4d4b62ce5566b01c50d591c8d8fbde29e7cb9cade5d", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x43503096872a3349c363375f5693e10d95a6f14e4f34685dcecc6c70cb3a014", + "0x4cf889f25deddb67fdb34ed8c0d4c1a2756fd1b568ee7b35584e2edd65c7013" + ], + "nonce": "0x20", + "sender_address": "0x4c7fbf3010747ded03b3cbd0a8bfb888cdeb9080a06f5d0d1e32e36473ac5ac", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3e1e01b344a4bfa097e226570fbc97e94a202e1bff7621f5ffd2b614ce97d13", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x125beb29b36da82b913ca9c974555a5cbbd504257b65be41118fa2f9b1ebbcc", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x50b55f61113c4d50d207e5a769d322581109d59da1dab64e69fb8520d73cad1", + "0x5f0b7a0425f78ee3562fea515672787082cbb7897d54a46ea12f64c5ad5136c" + ], + "nonce": "0x34", + "sender_address": "0x688e05ac8427736a7bc419f86ad7a90ea6157d2d82ed30f09149b18c97a2391", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x44d6b751b21d24bb3b3e4acc9940f62f41450f3bd30339394931aba3d00c6e9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4d066bd10fef687175b64486069240b99e9efc085d29f66b8430e8d352d9151", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x28e8fc4deee9e2d0f35a96193c470ac4eb02c94bc00843788e36223a9f1e303", + "0x328a44ba31703999df6c5f3cb65d23adeed25fb1535ea48d94da9dfafb5da2f" + ], + "nonce": "0x40", + "sender_address": "0x57dfd6da6e2abc9b831a908fe8d4ef45fe2830c3ea287ec2341c4bd88046574", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2b8806c5526bf682c03a69f6cfa4a9c95414e5e315fb1f91fa3440a5d78264e", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xe6dd45f7f047eb5b9a0b48d75e53328166b15a65966a192583fb9597907f04", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1e29cd10c49aa853e9f86350795e72561cde719dc9f5744114933d4a93756c3", + "0x3e0adbdaa87a7a82575682fd37667409d6258365b27b330b094da7a2331cd4a" + ], + "nonce": "0x3c", + "sender_address": "0x66a981c57e4253cf8d24eaaed89f7719c9a697be3b41a0371b24c8fc00a1cad", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3d1b043f11316ab21133bd66d438d2bc801304d810be7f0a7f9bf7635fd7d12", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x310ce6a7234f51d7a7b3e5c43d230ce21389730a9d5287ba357e31279cd1303", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2e0072fb814e225a228f2702fbc4069a94bc4e6b69eba820e215fe2b9caa5a3", + "0x45777afa12bfdc038d8951838038597edaec0c85fe240de5bd2a83c2bf0dcf7" + ], + "nonce": "0x36", + "sender_address": "0x36b39a015dc8b78a90ebc74d8f98a7b5a6cdc718118014291966650d6df65", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x425b622d8284bddba9a4ab7266daacda17a1877430ed52a3f69892853648d4", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1b7d100fc1a90371e9e64e943d5369eb7bd12b54aa034a983fa81213a2bbea7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6503ebe26ffbecf60765bae2b80c59e25db4bbda943bf0489cb39dc1a4ae192", + "0x4d207df40b9b11c0a2486093af60d45357fd9fe6a5aed769ef9045fdf785fb5" + ], + "nonce": "0x3e", + "sender_address": "0x3fd8c55203651e0b3c6cac235b8b489b0a302731691e1c4b860b7dc41a6d6be", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0xe4072b51b39c9eed5d3f6a4df783d4824e7655b471e878e1a03fad678bccf2", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x23591380c2f899686689d0ea209b3586aa27f7f644ac06d3efb376b9379a8fb", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x7182ca9091f3d8af3718eb4dfbd07bc8c4007fa6c97fd6158f9b0094ea5d3f8", + "0x7fa7c6e3198a67081362ec45d5a20b90b7e40e45333a6d6db3a930886525c42" + ], + "nonce": "0x1c", + "sender_address": "0x22ccb773bb8c536d70c99ad4be229b6425be5e8014a1330c72495760d2f4b60", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3a120f0603f880eb3ebcf2f51ad8b510ff45c52e2b19397487eb59f7d215384", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6aa9bf81f896ab255495901ede9c7de8423457c79b9852ad000d92b7a054be1", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x50042072bd8570e5e3dca47cb7a0c52c7f4aab9e256e3032d1bcc635956107b", + "0x67f43a38ceca81d7d60e3510a8cad672d229ada35b0c5b7ba8cd988414f9bd8" + ], + "nonce": "0x2c", + "sender_address": "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x2b8d25ad36db79ee9f1ef1900aa3831745dae07e1d5ee7a161a2b1cddf0dcdb", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3d8144276a490ca957d3b050f193c30f8d2e98c49e09946af09877b2d14f6a1", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4bd5a931ff0b2389dc8535394f79ed401c9c1eb4c39e052bcea832fb9a77260", + "0x4b719776a22112c446bacf76345aa216886fa4459856e302ff2565e0e4e95ab" + ], + "nonce": "0x30", + "sender_address": "0x1624d229b7b2733f0e4f72f205ab058c0b247045ff371aa5a7aa95a7a037906", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x44edc98aa09d3c48b4da189467ea3e582fe32859d0df8ca47b768156b85a260", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3ea0ff3cd693c15c2a125fb6c8b233954db1abefbc1d5236acbafcce2b9603b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x946c6e463ae3620c0b7425093d39003e7e2d159f3941c9a87965195b6477df", + "0x1e0921eb138283932822b4cc6913d50aa46f678ca91f53374f1a75d1e5df04e" + ], + "nonce": "0x40", + "sender_address": "0x4dde2846e7cce0c39e57113809340c87421454d8d7c48167a7a2db9d0ef7067", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6399dcfb7c3ac836f32632f0395b1c7ff6c72ea353ec122b86f0a49e045a96f", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xb1de3fa66983a9dcfc33e4c44eb691a4e4746c7f4709d97fdda0df5dbe31f7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3848ac1e3db337f7c880a88eea36e308bf552eb7977aa1360067684eade4ce3", + "0x8ba3b0cf9352e202117b72266661c3b34dcd05e0d26c0790d34dea2a6bede9" + ], + "nonce": "0x12", + "sender_address": "0x384152c373546b914f69e6c011747c08c519c3f43a4dc4b4b51849ca0e99ded", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6e7616c3ad7f00e59f65e276653601a535125a577127235122ddd92d9a2792d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7a14ae239b5ef52cac2e795354a2507fbc721a441b1b0c27899747aa5b0d56a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x31b8c51c2c24c561b1c64d4f232ca2a03dd4f20ae95e250bc4085e39c317e0d", + "0x813d384c420a04a7a2555a3955825bfacc2ea3f7c722fd285314ca1ec8b588" + ], + "nonce": "0x11", + "sender_address": "0x115f012bd02db4cad77f3fb19bea28087d03a4d03f965781711cd9a9379d100", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x613caab7214bad95f132347d5afe5bbb421fdb6b127b1f525fd64651f88415", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4ffb0b6085a2ef31164f2268de6d215636a5a7d8fbcce5a8ec52d2da0018b74", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2131941fa98a072bdc74691807b5b6a83b06d23dfa794ae833fcd6849b91474", + "0x1219e6da19d4059d82985c10bb1f7c03942275cb28f861057884e9c8af6a84e" + ], + "nonce": "0x37", + "sender_address": "0x4102dafaf51f5e6c854259a48f6ccde4fac083d2dec07e784c5c38e7c6e9a8d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1df4af2d02656e93c276ddf4cf618d79e21a04e271b73e0358eaeecd2798e9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x7f72aa25d42ae1dee8aba34b61f43b1641dcb42b02112084bd59e385bda1bbb", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6584568da1b03c2ec69ba6fd989abe2126c550f76385ab11ccb2be6a1eef8d1", + "0xaedad057d293e9edd8dccbd269c03a44f067a987c1971249bfe8af34868bcf" + ], + "nonce": "0x12", + "sender_address": "0x7d3644f1c8cc3d0fde11a7c69ccdd59e392199be927e2e283d21b5445357ab1", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6c39bfb03ce74f827587993c35fee75b194aca03d6933e55b39506810b924bc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x130d45032978cd3896f347f0607471a7a700ad0726007fdb8457eaf37ff0eca", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4fd6b747023361b7fdcb9e1e841be05ef3b0faf3a7d5382fcd8e2a80dfcb579", + "0x5d22583c57ff7bb588bfd7e9a773e7c5b892b8bd5148a1bf12c4c946274b4c2" + ], + "nonce": "0x3b", + "sender_address": "0x176c25d47570070342b173716432127caf510d2b00189a3d8c9c0266297ec30", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x45b3e73736ffa7d2b57dccd9b2a08bb53f5db9c4a87e1495b6550a13f5be47c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x70c571657e610e7a8fd0f9974ed9a6b086ff05d00129b0025698d5dee3ff3f3", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x70aa49c623dbdddbb0bfd0ceb5092f10f912c973d11c51ae41ae553afde6bfd", + "0x718b0142f6360d60e605669ea9dc05ae9120ae12d9615eb7b91c3ae83f8cab2" + ], + "nonce": "0x2e", + "sender_address": "0x15bab3e51c95b9d58b038c49fcbd26d6e163cafd66d2f2cccfce75cee26b762", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x14e8744f0fb2432cf027fa55a36bf65488f59ef104988c702cc91adc51509f1", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x35928dbd8c4e8bde8f375b19550eec284538b00c09e97d3b85a45893eb965e0", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x309f05253232c753bcca61e749cf14a285d909bc0485b117b7ef2de71e7762", + "0x204625c91a27d55fbf2cd5267568d9cbdcd993f4fd4b3b4a81024639c2a54e" + ], + "nonce": "0x2e", + "sender_address": "0x481d6bc11e059a6f76ef7f3967cf22b9a0ad02236c59bfd641076cbf371628", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1ff782ab0e8c2ce9758509f291895642a960db30e4e375aa7ac72bc3c939038", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x6e4548e3c81b0f6226307a787dd1a8a95290721f0b92faaa54eed362c30dfa7", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x17c1005df98c741da7f8e2bae6efff9d2e84df4b0de477d5495831e9fec516b", + "0x1470251540dfa27a5878a828ec409c88e39ad49481adf333f737ddc36cb953a" + ], + "nonce": "0x25", + "sender_address": "0x541b4a8bb25092e7a52dbe8f07810e5c9efcb2774d52b567845fe8d3dc3c92a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x15a7bc9dfe4fae868070df836f78e7a6256a00e8b2e1355886a2adc28917969", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2b331ae0f7d03c9fd6088604f704980c919dfcd030ce4cf2d2e5194dde6cf24", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1a4e75f779779eacb3e90c69e290fdcfdb3ebced454735a9167e19d6e67d4d4", + "0x7b333b7cca5082a8eca5ef1d0703f16cf13416159b0c75909699fe597a4598e" + ], + "nonce": "0x2b", + "sender_address": "0x21bf47cfe73804095e3e1b25e656ca2ca9787651de3e69c9950943f501e30ce", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x43f3e848709d1347ef8fec1564050ef48b2c4b4b8848686228ca7d48d6b8952", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2a07b11c3d126f88fb09ff5be4b14e9616a0bf43d7548ea8439537934ff15cd", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xcc672a2555b5c13ff31385e7ab924ba0777ed2528880f3c6563dcb1fcb8c9e", + "0x474ef4cd918a3749a774223918cccd916083f3622269c58a892a49ad545d44d" + ], + "nonce": "0x22", + "sender_address": "0xa91641858e346eee18cdb5985b97a73eedc7fdc92de8fd3cef0b42bdbc00d3", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x12d803efb6b14fe4cbf885e67618f79c9cecc522ecf9549703d3d0f3bb22b19", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2c1aa19b694ce946c474d6fe12552c53e208699384c3824d0300971fdd2288", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x8b47ce73d6bbb0558e8b25787bf63d189144ac35f009309e8a382cdaff5dce", + "0x46b65e2e7a4ddf1f0931b5aa156dacbbb14cbe9404422b20268dfdadf16c8de" + ], + "nonce": "0x2d", + "sender_address": "0x4e17f08446389b5cd0df8953acf3a0f2f6a6b2a80abd762b0101e7c6c103157", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1f2f2027b73f9ded8c6beab8934566d563a0a0d8b4e0aa80ca0d9e11c24cd90", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x476ed4d8f3194c6441a8b6a3a6611f4df286a30a11d621d61706e5cd597854e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x30d332ad0e57018f1a7cb53fb4dbc1fdae16061a2e48056f40834904beb3bdc", + "0x5129bbc9c8d3e19ab1fac09c93e0d82ae9a6e2d81453e19e4844af69d1ca839" + ], + "nonce": "0x2c", + "sender_address": "0x71a161b38b1229d32ae61b14a2f44bdc73e6664ff8b3a4184f66abca2735fdf", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x16933ea9c914684bfaacbeefe89927f6ea29267fb0fa4661d0c1f3752530cc9", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0xc3b7c3b42d74864f7989003a61626c08849fd91b4f6464b932745555224dd", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1e91301fef1aa0111f5a37a113eec92f1c310fe63f28dae24d63828f6a54b28", + "0x3f451ef46b8c407915bc02747094ca718e16a556673cda20873fcc10d678562" + ], + "nonce": "0x3f", + "sender_address": "0x9b0e317d0bc8a7d797d9a4575dad53eccf44b671c0591c7ba82f5804d12985", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x9fcbb62b9953a3b658b5c63e3610a168a6951943aeb253788558094d935166", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x310ab042ae9a8904f63c4010f53f89a213bb91539403324d5c176905df2386a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4e4b1ad42a87a70d6d590cb4c4fdfe993f1f9a18404476344a796aa115f3db0", + "0x61d3fe35cebee270f4170af7ac703ec663fc354378ecee313bef9ae8cb73fcb" + ], + "nonce": "0x2c", + "sender_address": "0x64db11e31dea49ac0945a548fed4b38657452f98f0f29f413062b12873f4afa", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x120f5f0ae30ffad55612dde70c1a0a07af8d89abce94b8b9ea111e52d1e3b0b", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x776f598d4c2650c49f1fa9a1c4121e652b6feba8d701753a39bd44bcb85719e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1bbc56bfc6f5380fa22f665c549617628f200af2493189c0848e4b89032a91a", + "0x2af11bee1f3626be3c1df5c0567558384c40f8b447b727862daecaa03f513a2" + ], + "nonce": "0x30", + "sender_address": "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x1cc1f97e9284232d34653d58fa8e30a8563801c1730176700f72339367a953d", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x362a854ae7efbc4d08b9c6b4e34105e46cca68c929829262d117f990f32e50b", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4692fd63311d82575d63aa33bb49a0abd51e3145fd37316d020c99ac0e0871c", + "0x688bd2c1a39e0f647b870f68514d53c2cfa41022afde96aa0cd0d9d4ac29dad" + ], + "nonce": "0x1f", + "sender_address": "0x3b02187b88b06e6993158e652acc2836e15b6f0a95d4abf74891334b462f741", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x319f651f63b9d8c006771fe19839a340c1148d0bfaec7f54b9b7a4d74d95aa2", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x20d0bab6be590f5197ffc051803472e695eb6ffae36adb6a1974a72ecc7289c", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x56c656f395c671b97e8761427e982a312c0dea10237e40b4989f9e68f93a5ba", + "0xbed14490773781583125c9b0af4b85634fcc2b66ece4f7e2b0e5b0e576ac61" + ], + "nonce": "0x29", + "sender_address": "0xba1224bab4ce060da0b89da3294a672ffd0b4c313430b67aa6397510739502", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x3a0c01b4483148f2ed4933cd567c57082963db6fcbd7d2e742428b7485afc43", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x2781b1d51a8e2e2b3bddd5ca550d9c02f635ccda46dbc5cbabaaf99df615df", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x611d8f9d248881f5cf23a8a69ce1764c7d7d00ed207fe8b3afcc1bc882b47cb", + "0x644fcbbaef815f66a7adfd1d3e9f49d2ca4e86b2c88ff7ac066691090042128" + ], + "nonce": "0x6b", + "sender_address": "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x533ad6924cb390e6745bbe6194f5bad2f5327939799d4090e7d042d7f1f28d3", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4df7753f4f657d63c10941494ebac856c9648c736f396706fe4d5fe673f2912", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x30016d25b06aa6a58d080f1dcf528cef8092e989780ad68a56f134f363605ba", + "0x52dccbcb0f8a2b4657481b8d1a8118fcd91bb453c0d2a0ff7d2ba7bd1fc666d" + ], + "nonce": "0x40", + "sender_address": "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6111ee156a2965b9bfe980c405c3cc7e86ec0b536c611cd2d164f9cd50269d2", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x5847a37545b923764f761184420769c30c8ec648807bdbdc2007f7ff599aebc", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x1584d79ec993c80d870c214fc3297e2219197b1831e8de6b74e0c3ea23e519d", + "0x564f17ba56bad717191b9ecd5bbf1ef48bdbe9a5a9076efa83ecd9ce5a49f87" + ], + "nonce": "0x48", + "sender_address": "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x15400564c0d933f03eba288c0fffe3c76b06a5ed792dbe86c53b2a4f48661bc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x66ae9cb40a20a47596bc290aaaf99e07c827be610499644aa6d6fcb725c398f", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x618afae6800b62559747dfabe2010f14a539b5fe8a79b3ae24beaf57239e840", + "0x62b732bdec7f87322666dadea7cc0f83e90ec2896f83d9a830f61bcdf262d22" + ], + "nonce": "0x5f", + "sender_address": "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6138951e7cea2a9949fa4197aeb29b079cfd99f658cc73c500765da96f2f857", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x37e2884609b45d1ec06b2043dffe99fb58f85243baaecce3ae0fe1fe6f2697a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x4875fe5528fc63a914c18fabd6e1c4bb70efa245c84fa7d02fe4b490a45367", + "0x1939a2ed7e048c37cc88f6cd69abd8d677db14c514458948481aa076d076bd3" + ], + "nonce": "0x7d", + "sender_address": "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x4a2fcc8551fb5e58a54f67c6b1a100cc101bca7b8bc76a506ddbf23caf7495c", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x53e768cf8ccf4c4b125ae529f0050823f067e078f8529f95a932b1e5b2a1a02", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6a7a49657e7af683812e4e57901b97cf7d4766a27c6bffa7d21138b47d692c5", + "0x252600fc6dd21734b0927298336f724f96df279618aeae8909034b6dfb56506" + ], + "nonce": "0x52", + "sender_address": "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x42fc16f540975c3129cdbbe88275cbc6b926a4b183f08ea4802734963f246d1", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x120d051ffd11af42cb251813729cbd5feadad5685b9816de68455e96bff0e75", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x6f356dccfcd0bd9707e1920d3a1cedc147bd52e1a7dacf398f8db8c366753f6", + "0x6bbfabf8175909c8720013245eba39f1906c511ada95d0b24d39b46a859c42c" + ], + "nonce": "0x54", + "sender_address": "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x10121ed85e757b09180a9f23c1e0d0dde516b990550639b3e4b8db6f1519db8", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x167445965643cf3511fd7ec067085acf68fe2080c420659597324ce700f2f8e", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x5d81b379e6da6586255b79c3c9d5c5bf853dd4ab9d869c1fceab8e439dff4f6", + "0x66ec2322beb4a7bfeabce011d8d54e717d9a610364339d5086dccf65afc43e3" + ], + "nonce": "0x42", + "sender_address": "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x53f5e8f152398f2918082611d71ed7d38f1a895e38a9b627086bbd553152cbe", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4156cbecc1048d42a74297277e70cdfa2e3e87566a554567712236b1674f908", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0xf9f023c336aa775c547e1d03f5f6140043f70708492b6c2735c07b7341741", + "0x6b2069bdebefae4a5bb234f2940cad3ec024802ff8b3a08e474160cdb4b63bc" + ], + "nonce": "0x59", + "sender_address": "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5033cb6a734b81a5033a6ed3367ee6998f70b01e563071d73f27e0dfb59f9a1", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x42e6f653c1f61632af8605be03e119b5808ff0b35153011e28431a574b40603", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3700543988a46372eac6e324e1a938ba75f46486b0286ac8647d4be3fed8765", + "0x6e40b904af17cf64fa890946b46791e9b8b7ee8eea9246f7d7c7662accf6102" + ], + "nonce": "0x18", + "sender_address": "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x5b707625bd4195d215fa54e99f1a132db60ac14bc882585a8f51a3e7ddf8367", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x309ecaad1fced9d3c639dbc5fa49e82b5eca514f476d56b8c92355d6797d43c", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x2674699c320692fe79e3de815ba8f2ec911cc62d3c3c68a2518f2498c2b0307", + "0x55cd6507fec9b3b2b50f2132bb9017beeb392544c0ecf15150d016659d92ffa" + ], + "nonce": "0x31", + "sender_address": "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x634dbcc6decf882804e254340b0ccfe9a931e27685121e873979f9256fbd977", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x1dde6a5db2fd1f795cb3c21f4e40eec2547e1aaee8cfb96e0e565554bf8ec97", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x124d28844fe82464e2e62cdd6e7c84ed9ff9cf5634828bd77cb8a2b6c3f3aee", + "0x680a03f672897054a75360a1b1b0fe0315a753eec0db228ed1f1416fef3c8b7" + ], + "nonce": "0x35", + "sender_address": "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x72ad5c3a194d4dc87ed27b317f00d5762c0362bcb93d7295887e1be8080a555", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x4469d51fe173183fa4b330b9151b756d50be2140709ae3b7540cc0ec481d20a", + "version": "0x1", + "max_fee": "0x71afd498d0000", + "signature": [ + "0x3c62c4d5b9a862e9386a18aeff6211e2200c65193a1b3e515cf36878c40223", + "0x1404fab307dca3398dd1d94240c416659af76f712876d95707eb35b6e8619c9" + ], + "nonce": "0x34", + "sender_address": "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "calldata": [ + "0x1", + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "0x3", + "0x6a592b56049cd8d77e5466efdf21e5efe15fb0c9bf78d0f3928ffd83ba4cfbc", + "0x1", + "0x0" + ], + "type": "INVOKE_FUNCTION" + } + ], + "timestamp": 1721925122, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "transaction_receipts": [ + { + "execution_status": "SUCCEEDED", + "transaction_index": 0, + "transaction_hash": "0x656a5948f817e538a4ea7ab86dadc1d351db38cb84fc34f43de45959f3d99e8", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "0x84bde295632e0884a4da2ac3e59d450a5d1c50628480316202aa9b9258464b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 1, + "transaction_hash": "0x77bf77fdacf7c42c92f88ccdc0e47faabe4fd544f8418880c9aedc9c122cdc8", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "0x3fadcecafa9e47255cb635659c8998fc57e0ac8a780572a0b9936b4f1947a46", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 2, + "transaction_hash": "0x3b5daa647e491e8fdd09e38901cbf8af8b3f6c4b9bed6c9519b015a8f7e3861", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x56d6364ef2185be391153e866bd87a6a98cda9987f33e37df583c4d2bb3ec00", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 3, + "transaction_hash": "0x210d258284362c34cb0dd115cd12d5481ee07f424ca2179616e01314ec8520d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "0x27cb50f80270672f1fd0351a7abc49289ad9b1f8b34f21c0856f5016d1fdca", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 4, + "transaction_hash": "0x24f0b8d99ff58e931658c8c9db4db308375bc2ab028f39f3183326da621062b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "0x1aa17d35edc3ee0c5b365595db91c1f48b9ad8dfb6a6b2aaa357d2bb01b4dbf", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 5, + "transaction_hash": "0x74c851a56435473eeee26bd0f33cfba5bcc2d86676847fe093ee10955b3e41c", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "0x73a6c571a923b0de62c56e0ff8d91fa03d1940f12a3044923db283fe7d52bb", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 6, + "transaction_hash": "0x683e8de59fbdda5bf2655a5b56ca713dd4708b653e3ea2d0eed5fec5c782f59", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x275c01d887730e6551ff416d8ef128d2a79afcbc244c776c819aefbea1818bb", + "0x785cea5ab7fc2a8b2ec4de10f787da9afc826be52dba9883becf9351d59d6ff", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x275c01d887730e6551ff416d8ef128d2a79afcbc244c776c819aefbea1818bb", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 7, + "transaction_hash": "0x3ef0b3561556607b1fd19468dfb5bbd66f493dc648d5a14dbda6943bec9481", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "0x29595745aa0c07dcaedb213ff8adda5a32a10184a3f8b67fa81372be9f84176", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 8, + "transaction_hash": "0x3821214c3836ba0f4e58181ad0d0212acb5c448265f3f376f18c460531e2256", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "0x56c0469f6e05e124f8072a8e40dc278fc4788bc5ab2d9f083b2abae727d51f3", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 9, + "transaction_hash": "0xa8d6fa6804a4738c82f9ecb50b61d6ed0c6f0b5d095aa244a83390ebaad6e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "0x54c2a598d057bcd861c7d9faaa527f829b5b8055e83dd0d733e5c0a5bcf392b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 10, + "transaction_hash": "0x2ed387a8556608d107de35e3314fbafe0bf2871af0b5d2034d92e56c899eaa4", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2655cd6a02dcc25554bdddc055f304c84bb130828e1b162c82958bbc92dfee", + "0x1de3a6279c19fc65001bd37d37156e33b82a892a1620d14a82b8101b5fd2592", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2655cd6a02dcc25554bdddc055f304c84bb130828e1b162c82958bbc92dfee", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 11, + "transaction_hash": "0x6ad74b9ea5705c5b36c899b004acdde0680b383efcd0f4a6e6323aa254dfba5", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0xfa08ecebee06e3f4ab3024d55b2e1a5646a2e8f14054c21a22929c08444bf3", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 12, + "transaction_hash": "0x584739a828472d302c76113ca2380f66fad7e8db93a5b33bab83b26f57f6192", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x13372661462e9437e3be7442c0bb7f0a28642510ec3879927eebfdaa11c6b64", + "0x478a36fdc297561841694773015a2b756503f499b50d72415e6f92b731cb4e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x13372661462e9437e3be7442c0bb7f0a28642510ec3879927eebfdaa11c6b64", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 13, + "transaction_hash": "0x2d2ff22e0a1f3d6e43acb5da75ab4a7c9bc6219350953a0c29025271ac64bfe", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6133eb7e32610962c067accae847789b414e52ef69407bcda0dbc4e0562235e", + "0xebcee6a064eb96a9c7046d247d108b5d724749ef666df3a110fd6de085cdbf", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6133eb7e32610962c067accae847789b414e52ef69407bcda0dbc4e0562235e", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 14, + "transaction_hash": "0x79f9d3d4aee74c24d0bd7c6f7ee78bfe5a3553fd6d9b3622c744bfcc0eef189", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x77c28f25bc25bd5207ab10317a8ad029b560f22d77b3492cc910236a2ce1278", + "0x1aaf85715f7f99649113cc8ae476ef19d6aea4626efd7690aba563582eaf876", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x77c28f25bc25bd5207ab10317a8ad029b560f22d77b3492cc910236a2ce1278", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 15, + "transaction_hash": "0x14a53a8cebb83a7bde0734b5ca9687b1345e9933286eb0c6835d0bc6d937d6f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "0x5fdef3d45e4cb5d8c05adf2c05d24d13ceaed27254cd4571beb9f8652cf6a69", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 16, + "transaction_hash": "0x140e311a333d622148eb3ab8aaf0facd38b74b5cffd5b48ce795fbda701009f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3341e828e15b839729b07957cabc597cb6556e61649a0f3bf98578f4b542c9e", + "0x78acb5290012e08fbf2aca15c32d6d3a70d86b02a77568df648068695555a43", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3341e828e15b839729b07957cabc597cb6556e61649a0f3bf98578f4b542c9e", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 17, + "transaction_hash": "0x2c51827298b7e36686f02c0bb9b43cfbe878d5a6332ffa430d63cbbe6993632", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2709f3ff0b285074ffbebef3078d2ccd7d26d0fd7bcd4422d8ceb5e9a6a40ff", + "0x660586392cd851387fa2a005d5e2f8045e4a56d423739c91b5586a3e5e3a271", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2709f3ff0b285074ffbebef3078d2ccd7d26d0fd7bcd4422d8ceb5e9a6a40ff", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 18, + "transaction_hash": "0x13ee0bc0399bec6c2a8970ef0da8e655780a28be5909799db90057686c94c06", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "0x4821573fb5df2b7a3ecb05bef19f7deff03c68c7f1eedcb2245ea5c04fe0dca", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 19, + "transaction_hash": "0x11d22470bc9f43107645caf334e36f403f0b352587ab9515742043b60bd8f41", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x59c0424db8476a9d158e52848aea567f806afcb99141b8ef0a543758db2ce60", + "0x395e2721f3625ef250ef44e1d2f746b331891f2431b3df17d65e0037459a5a3", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x59c0424db8476a9d158e52848aea567f806afcb99141b8ef0a543758db2ce60", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 20, + "transaction_hash": "0x2b5ed98f483bfbbf412eb2ef1b9075a16381f39a8296a951dd55085d6394e8a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xcc4c8e4096a5dc1b161bde1c0207c34f82f4c0195cd428253f1baed6308d5a", + "0x33a0847247d19ba053893b0b31ffe11c0895e97806476fa383f70fe49f2585d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xcc4c8e4096a5dc1b161bde1c0207c34f82f4c0195cd428253f1baed6308d5a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 21, + "transaction_hash": "0x2dc6f4e98d1aa63ceb803559f287084a84db3665306dd2bc52a1237934a415e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9a747a346243aff99283048beabf09c2ef25bfbbc8a177945f3a0eab0d3882", + "0x21aeb9df0d8dce0b45960d1644a4d81a83f9a0f8fce69a812f4af05893f411", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9a747a346243aff99283048beabf09c2ef25bfbbc8a177945f3a0eab0d3882", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 22, + "transaction_hash": "0x378d05a544d7df1fdbd3745204223b47aec76bd3f14f98147c572c206e461d5", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4c37d767a43169fce247342e46438d0bea2b0d7f4efcd4a4686615e20a7c417", + "0x3d958b59764c3d117f7513a53bf399d80f1d454b17db76317bb046b86cacb7f", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4c37d767a43169fce247342e46438d0bea2b0d7f4efcd4a4686615e20a7c417", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 23, + "transaction_hash": "0x2087bac692be145742133fc040cb270807006f0f95272eab6d847d47ee8665b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7b3f54f0755766215caa99b8ce31250020050ac00bdbdc25bbeb1cf5035388c", + "0x4c05cda4a1d91e09a4ed80dffb64c2c2bb74b62b87e2546185a30d2be76f3db", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7b3f54f0755766215caa99b8ce31250020050ac00bdbdc25bbeb1cf5035388c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 24, + "transaction_hash": "0x10119548275e625a700f0cbff8323d03e4cec856dc7b1377bc91fcf42eaddb6", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x45588fdb74513b42789edc109403dc2c2ac13e1a7bbe19a99d9ec45297f7450", + "0x391bc0289a116b822c3c5439091eb16114ed7f83196a06a97f14e0a3c6faa9a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x45588fdb74513b42789edc109403dc2c2ac13e1a7bbe19a99d9ec45297f7450", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 25, + "transaction_hash": "0x2f4750c62fdd789fb68179b9197946f0faf3501654619ec73b63451323cd6f1", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1bf2463473be14da2f0ba583dfe08a8465ba99771450d67599de126fb58da9d", + "0x7308fe8a4ff72e79142e2c32073bd55e493c4d10864879e2cb7c5a4257224c9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1bf2463473be14da2f0ba583dfe08a8465ba99771450d67599de126fb58da9d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 26, + "transaction_hash": "0x3effc0e555c49d5e11abef41d6d1182fa5aee5202cc5d89733dce5859330057", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11e0a33ad5c43d5bd2f7f0ccc2b66f591c6c908910c1f2f377c6f586a458eb0", + "0x37ddc556900ab31026fc6882947787335152a0efe67633af40a7e064fc204ce", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11e0a33ad5c43d5bd2f7f0ccc2b66f591c6c908910c1f2f377c6f586a458eb0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 27, + "transaction_hash": "0x33af48b568e7471388d64ce6261f698c4452772dc0950703cd8970326454663", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x768a45776c6e33860c802ea8b6f69170b275d576ff5ea0b6ed54c7b0da443e9", + "0x6eca19ab5a57bffb4a7aa89d27a4ff3a6314c8b4313565de209270ecad579dd", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x768a45776c6e33860c802ea8b6f69170b275d576ff5ea0b6ed54c7b0da443e9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 28, + "transaction_hash": "0x58f3d4f56d5d73445f9539f87c57604ba1a7558dd89395ad67246e5dbe54ed9", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7b4ca69e72ffdbb43edb9266a3ce13b385e714e06f6aee2d7f2215b405f6a9a", + "0x452d5bce0e02200bcb5e8b1d306ea71dcf9d2c686c45eb037c69961757c606a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7b4ca69e72ffdbb43edb9266a3ce13b385e714e06f6aee2d7f2215b405f6a9a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 29, + "transaction_hash": "0x5efa3153e3cdafc7575fd30d6a32c777a5bdcdf5bc1af3b8e54f46bbb80085e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2ec59285aa2e4cbfefaddc331f3d876f207aed3b028f5b62957b0a464f92918", + "0x4b44dcf7f50ff4eab2271a0826997ce11512d4a9cdd5de9e2cc60cb970c50fd", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2ec59285aa2e4cbfefaddc331f3d876f207aed3b028f5b62957b0a464f92918", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 30, + "transaction_hash": "0x244e0157f6ba489d5470cda9d2bfe76f508267cc6784f059dcda8a997e467b2", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x451d8a5c0ea89978d07a24ac6c594e1f0b57ca0a141ba357d8e169fd73151a3", + "0x2dee60c143474cb2205f17ab17b0f8fea5f6a01c86cf8e44b419a456f8c7e1", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x451d8a5c0ea89978d07a24ac6c594e1f0b57ca0a141ba357d8e169fd73151a3", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 31, + "transaction_hash": "0x34a973c5db6d82d636614d3ee29548769516670ff3b8497b0dceaad68ca48d8", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x253b4898f783590539e8ff61faee36bbe6f4022af6f5742fd80ed8a609d8cea", + "0x7a1e29a8753805b7e934bbf1cd9bcb597d2c7b44d2697fd8ac948fd70330263", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x253b4898f783590539e8ff61faee36bbe6f4022af6f5742fd80ed8a609d8cea", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 32, + "transaction_hash": "0x7e0cab05b44a35458c1bc9fd8d968c8c56d131ba02e6a6243993f445ae7a392", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x689549c1747f38f450a34084202987ae19adc553d7ce10c3d5136ed8f768334", + "0x5f1dfed748b556201babf0356c65525210ec3d0ad2e30acf3ad708bd63f136c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x689549c1747f38f450a34084202987ae19adc553d7ce10c3d5136ed8f768334", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 33, + "transaction_hash": "0x19e04c41b99e60d3a5a95cfbc0127bdf3d63f9547ea862df7303e24cc9f692f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5aa0c4b6d10882180ed3bf70dc5bb99fad462fb926c251329f4c0f997cd5ae9", + "0x37cadeefb58ef26828cb8e74d5a1115388e279d00f5812f7c86ed76372778f0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5aa0c4b6d10882180ed3bf70dc5bb99fad462fb926c251329f4c0f997cd5ae9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 34, + "transaction_hash": "0x38515fa92e8ea300fd8d9093f81d2164f73006cc51e105d7538ef303df32d3a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2390a4d84cf00928adf4058ff1f15c8fe615ccaa3ccc1cd9b571d8be7ae806a", + "0x7012059a4cd41f6bf89e7ec7a82ca1d9cd083da0c282138b0b9e8239c386978", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2390a4d84cf00928adf4058ff1f15c8fe615ccaa3ccc1cd9b571d8be7ae806a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 35, + "transaction_hash": "0x44c1cc2a46a949e72c37d323fa5627bbbf0e7f8bbe6f73296773add0bfda3f2", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2e19f222ead0bc05ad25d190bf89a63ecabf82f53f7d6bf383d05553acaf123", + "0x365bd268b91dd5dff4d54b7037d0b4b411e3fe15953f83b8a61102ca19b8509", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2e19f222ead0bc05ad25d190bf89a63ecabf82f53f7d6bf383d05553acaf123", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 36, + "transaction_hash": "0x22af4343899d28a47c93d8c140b2570d0a910596594c51ef6e8dc0548c8f13b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x63e18fe7f3cb5a5194204ba9107a7f425c503c6adef0b686127b14bdeb5d302", + "0x714bed568aa17143177d8c83afb9446a685aa64a5a506e732ce592adbb770e9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x63e18fe7f3cb5a5194204ba9107a7f425c503c6adef0b686127b14bdeb5d302", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 37, + "transaction_hash": "0x1e3af76a9fb580153dce7f03a0d2e74418c47e301c875fc7862c8201d1ba8bf", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6804962ed2a44ddd07ad2931838b13ebc114b3e7f91b220fee99a5aca96e83b", + "0x74add3c8e5cd6da0b2255c94c86de236951e29660a46815afb91611c872413d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6804962ed2a44ddd07ad2931838b13ebc114b3e7f91b220fee99a5aca96e83b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 38, + "transaction_hash": "0x43fc4f993027fe63d1bd05764c997658e07106bed4e01b90eb715491f5481ae", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2333f8254e3d2a9f527f4ed292f0f84b35af2dac6c0e664691ed48c7251ecd", + "0x6d6838f0ffc2d82f7e61221507a767634e9fbf282dc1016133a3b9f8e88943f", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2333f8254e3d2a9f527f4ed292f0f84b35af2dac6c0e664691ed48c7251ecd", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 39, + "transaction_hash": "0x7775ba1c7d8779ea4e3d5fffc509f37c983af9eef79f1d392603a25d5b1eb59", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x200c519983a0104346afba82a2dc4eccd4a4373aa70a13316626e932cb6e58d", + "0x6b1c39ba34d99b5b73eeb4506bff45a05410fe07f14e461967ea8d930e93c8a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x200c519983a0104346afba82a2dc4eccd4a4373aa70a13316626e932cb6e58d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 40, + "transaction_hash": "0x6ec2c34b64429db15b38e39ee43df93a80a0ef87a5393833cf65cc8a461ac1d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x48cd92c018be0434daffcbcbcd6722aceda59a54ad1efe411fec777f41f8caf", + "0x582f41ed435a925057c9a1580823da6a37565e33ed96136cf70278bb29f38bc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x48cd92c018be0434daffcbcbcd6722aceda59a54ad1efe411fec777f41f8caf", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 41, + "transaction_hash": "0x78cd795423a239f87e569a05f713ab523ceba55bcc100b428aa145aa4d44d3a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3acd1c7261d5bda1736a89318f1b662d1ff804ba44a0c510cd2832156bc4a6f", + "0x376f58b6945bf8c6f6964e7b514a958da8b3699bd39b3f3ae0484f349f95ce0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3acd1c7261d5bda1736a89318f1b662d1ff804ba44a0c510cd2832156bc4a6f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 42, + "transaction_hash": "0x2e6f7749036b34360b234e974d63a51edca243f61d2493d1756aa12ede6dcbe", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2cbd65c97f07d4b0830802c819049523e1b8d30cc0bf8d4246df94854faa766", + "0x7e7661daecb8a0fca7dbd2ca85fb063680c311d0341940fc611cc5e4a6e60c7", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2cbd65c97f07d4b0830802c819049523e1b8d30cc0bf8d4246df94854faa766", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 43, + "transaction_hash": "0x95de0efc6d55c4c762100029aa94cb46dbdb0ee3307eee7bb83a5127fb5554", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5b574462c662b90b11ce7c5750ac6b71d21d5b84c62a6085220557f3e54c14", + "0x5636db2bce3ab1d1df307dee084d35d20eaf66970b2fb83cc12f7247ab1212e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5b574462c662b90b11ce7c5750ac6b71d21d5b84c62a6085220557f3e54c14", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 44, + "transaction_hash": "0x6c2178115ae217acb8ea704cb08258c873ab13abc296ed16f2979ce25287417", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe2fce66497ffbc0b04f6d1c27eec2f8da3c4b7ac78a24cab67595644173eed", + "0x7ec48ff00c0e2c1fbacb1c8b6dfe3e0f43a9b196134d0b2132ca973bb1f1bf7", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe2fce66497ffbc0b04f6d1c27eec2f8da3c4b7ac78a24cab67595644173eed", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 45, + "transaction_hash": "0x60dabf1d8850e62b5c6efc27e0c98fbc3d808fe21251bf5d19c55ff5d848754", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x38f5a14f93aa2041cbab6a0a2eb909f268a10be56addc697592c87c68eed875", + "0x2c10d6b259d6fed242b6136fc51c549f0937a44a493367fc86ccc529b462959", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x38f5a14f93aa2041cbab6a0a2eb909f268a10be56addc697592c87c68eed875", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 46, + "transaction_hash": "0x79dc84c42dac21d740ec7e54cad6d88ec6e26233eb932e1a511f7a1e21c53b7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xc24b71d1cdb836ea2a8a5d364fb9131c44fd4e15d1129f2233e3dbcdfe855c", + "0x1d3462f4184e648b3848f1ebfaf75f4b23742924a725d56bf1cfc9492d0ace9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xc24b71d1cdb836ea2a8a5d364fb9131c44fd4e15d1129f2233e3dbcdfe855c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 47, + "transaction_hash": "0x4082594ebf3656e1c4d1145e8ec5ba563e5d63a7868aecdec6a23800a2e259b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6fe8b5ce08982b6ee4321997594e23a9637fe0d45bfd5b5d718695f08b38a72", + "0x7da1dbb3f1942891cc5a5f737ed2d6655b9f15582a05944a6d163dbec3c2aab", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6fe8b5ce08982b6ee4321997594e23a9637fe0d45bfd5b5d718695f08b38a72", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 48, + "transaction_hash": "0xa5f543803af4433ac765c778c1a93d288f3dc468b0babc789517fe9a2002ed", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x13d16147f8cd04b852cfdab7107c6cb96de2bfa2a020b22694e8067c87eaacf", + "0x7809d1fdaf131c0eb339186cdf617d946c86668e50924d13159346e12381e07", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x13d16147f8cd04b852cfdab7107c6cb96de2bfa2a020b22694e8067c87eaacf", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 49, + "transaction_hash": "0x143fb91a0731cba83f1482c1030b525ba4e2146c8fa97ecf2ad5b330c222a50", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1b7e553d9d69a2a1fcf9ae3a72bd41bac0ae603acc77c783ae58bf1ba08b80c", + "0x5c18c54ef498819a83ea6596096922c38c1aa9319bb3b03415252db3128f8f8", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1b7e553d9d69a2a1fcf9ae3a72bd41bac0ae603acc77c783ae58bf1ba08b80c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 50, + "transaction_hash": "0x12cf58ab83665591f01058566c199fbb0ad79be88165b347e3e5dd83fc5d791", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99", + "0x13241a67c8f9d5a88357d3833595cf1e77d517c5b25daed279a81be8f74c8b5", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 51, + "transaction_hash": "0x65f58aa22346b4d4529f3dfc29aac5de2002da9dc86124630edf5716fa3a7bb", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609", + "0x76245470ac3d77e859be12b55e3b16dc48dfe3e0cc85640d75e3e4894ec8182", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 52, + "transaction_hash": "0x21ed75413223b673aad90b18352e7e2287c4426f0c607818dfacc211ea242e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e", + "0x113616d16bee3d91ed9efe44c83cb47d9d9e4b5a0f2c8b5626a4464c645ea9e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 53, + "transaction_hash": "0x20e5e2e9b41628cbf962f505b4333b37f4f78a87dcaead10c83b770404577ab", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6", + "0x58b40fae2a6667866875dc98dfd9464fe80c588572dbeca17a0559cd0bfd84", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 54, + "transaction_hash": "0xdea235030568597ee39a993d504ee2ae9c6a9da4a3fc2b794212d261066134", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b", + "0x74bdc4dc032e25adc01d136e1ce09aa07b7141e06c4205bcb4895bca4555222", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 55, + "transaction_hash": "0x51b0712881b4972ad7118d3bbbf7a91cf9d35a802171e83f5a13a3459b9434f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd", + "0x646ac6558218dc6e64f03be3d4c4e93f2343c859f80a1a86af088452def27e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 56, + "transaction_hash": "0x3f4b90fa23e982dca8352c6894247d0b8b83286cd8bcd6123b07768446e5d85", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9", + "0x9ff0f306bb54ef1e56f29c4170b8a5b3b4f0472ff0f5b95cc929cbeba0025d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 57, + "transaction_hash": "0x1e543ed4ece9fb852bf7f1ce95aeed73348db7d0dac21b7beb95e7e05dc39c0", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c", + "0x663795ae8908c52238228322554f5b9faf14b1a5bb28a7a2bd09d4d416afa03", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 58, + "transaction_hash": "0x10331f033fbbf1f03f5ec1bf58a2a659d852ce69bcdf9d1feaa6c5815695e18", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "0x7b00a28fb03b564bc74669f017620eea809d6bba3dfa58ca0f67142aa34ea56", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 59, + "transaction_hash": "0x288d178762aa361a1c08b55ae567bf4c18a55c4e3595624d087d938c1968e46", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "0x28d2582d04f3f466057b8d051c42f6702e1dc8f7cd6460e8b2b01a96ac05bdc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 60, + "transaction_hash": "0x6b080b77b69390d6b4f4dd16d8a90b75dccd5373b6cd501fc6043100bdc7573", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "0x1a8a56658ea7529d7d8bbe74bb4d1ec0d70acc6f87a36252aa6e2921f7d901b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 61, + "transaction_hash": "0x2f068f077a841ffef9a5cfc42f31b7c6683cbeb683048c789aac35d3fc1cdcb", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "0x3df3f563b04bb3c63c1848e73367135e3d4a9f2ed579aca6e40ffa970fb22ab", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 62, + "transaction_hash": "0x6ccbfae2657efa74c7759996c5799744ef3d14a05cbd1c6f82e59cb8d786a8f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "0x8ff02d921c310dedbcb26822102d1a5d85f5225073ef65427843dc208d86b9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 63, + "transaction_hash": "0x310a30391bd886a88914e488fd5991c05431fcf60027a64e60541ded7ee085", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5", + "0x1843d0466921d394ce28999ab4b20c7573aa2d6e48303c9e42fa9bc753910b9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 64, + "transaction_hash": "0x4c13766734f3b71821a4c8805174008572b7d7c2d5885e88a4c7e0b9a1b200", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d", + "0x2b8512868598e247c9a1413424980001d50bd00a5a263b484c3b53284f086f0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 65, + "transaction_hash": "0x3537235a308efee36346feb8f3bd1bd754f6bcf3961069c796b995f6c087aa7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "0x7b1f9cb425a54d10107cf8ea80b7ad02901a30525f1d960d093d5450b3cbbf8", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 66, + "transaction_hash": "0x5121f255931b3faa334a629d7f4fd4faf1aa0454fbea144450a9a6cb3f7fe99", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "0x3d799d2ebf90ad00171bc66ff2faaa38157b08b5e34ae825b44aef6e3b0119e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 67, + "transaction_hash": "0x395c2a4f9df24ef4ea8743e643996aebaa1ffb9c9605d837adfcdfdc00eb0df", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "0x679273e0e8dae325714657992fc3296ac0ddf637852c46888f6f0ff18f2bddb", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 68, + "transaction_hash": "0x2672313365f1686250e360ef40af7d8bd7bd96012f602553162af5b2b4ed74f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "0x53b2277673108514c99d88fe4cc555fcc03a661af45d1a4b7388b6824b7253d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 69, + "transaction_hash": "0x77c50c779bdb835ab85ae739c4924abac8b7419889592efccd46ad36df6b5b8", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x72c65ce2d24e7c3fb48960296fd401ffde34589508ac9ffe1e1386552a2e005", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 70, + "transaction_hash": "0x491e39f5de84b88472a9b7bdaf9bfcd1d094b05f6358165c15e7cbe5db52f7d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486", + "0x745fc497aa89c73e48b5bd2f54d20dd0eadb7381a3670168a99d43aea8c6bff", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 71, + "transaction_hash": "0x591b1d14fd90869133097b265eb22e95d0415a7643f3c8235eb58191619d5d2", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x675fca6eb609c22ba375db97fc717f5284b370be42743195c965bdc2046c666", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 72, + "transaction_hash": "0x22b7235fdce25cf5495a6ca670254684561d45f536208ca9b6fbc275946c316", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "0x386777696ab90e403e83ab4bb5d1986c8a0c66b8c7ffe34e37fef0d2e4113fc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 73, + "transaction_hash": "0x448d7bedca0c5b233f8ab9de5c373b708b6ad3a53c5f81397c36f887fa7cf4c", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d", + "0xfbbbca39f675f1d5e3e9e5616b83fde2a586881ab158d1dd35d83e4361ba3c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 74, + "transaction_hash": "0x7ad9b0ef75176a11dc46824b18df70ef14a4f32c2426e682043d92f22a1b061", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471", + "0x371a30b6c11017e1ad45a5182279dc6354c295c62fb2b62a64a88cf98172075", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 75, + "transaction_hash": "0x6f14a667249063ca52f3b4b5708fa021ce678edfd8b4a63dc955d5c017d044d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970", + "0x5aaf885f007d12012021700e9ff303343c63d216f5b1e75725380adbbe78ab1", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 76, + "transaction_hash": "0x28ac04c7d21a8ae32bafd02384b20c1c13bab56b3d4aec7183934c897b158b7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6", + "0x5510c25011742b06815be6d020576cee83b6f659d11c19a8c9c905400c6b2c0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 77, + "transaction_hash": "0x5aaafbf7d18bad664c093f6204015da223e0a0bd2d2bce648b702ac54a02419", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574", + "0x71b52f0a7589b5972d7c37baa0b2056f085f6f6817a287cbdcac978b7dad26c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 78, + "transaction_hash": "0x561b16d059f7e4c3a04650e118b4d995d917ef4cbe1125d4783ce66c81a828f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2", + "0xfd6ffd67c2e30772fa28728803ee853b16492ed1e5f72e91847115caf45bd3", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 79, + "transaction_hash": "0x370cb459e3b42e03867e6d9c957c5b61c9b34f3771a267c34102135441baec0", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3a70b8ddcec9d026ff4a3fb2024f7815fd47dcf62716107d34a6ae5ee861e0f", + "0x2011b0569bdc4c525bf03e7b55a9365de1cf194249966c88c24707f4d850406", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3a70b8ddcec9d026ff4a3fb2024f7815fd47dcf62716107d34a6ae5ee861e0f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 80, + "transaction_hash": "0x46df785050a9aea2cbcb90f6ce1cebf789ec5c3d9498656c38a06c29b5ee85b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a", + "0x4434a91a0b85b4efaad7d9b70ee2ff598a071c9dee4a10b06b3697b671e005a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 81, + "transaction_hash": "0x59a7de5f6180b1a0bca493ede1fefa263b081efccf50bc2347b94b1877d9dcf", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f", + "0x9d05e196b5d20018731b9172e9041f6098014243a3d18d4678f046a28898ea", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 82, + "transaction_hash": "0x2224c30ae25741fea63e9474b2f0f057fff88de73e4b248175a1e927b8848", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x72a90329f10cca92a43cb8014ea168049ee3e1b9013638afa026a4671863ca1", + "0x513c58ca8af13ecb6006f00151ecd119cc527dc13ff9e3c56b1c5dd05b84f13", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x72a90329f10cca92a43cb8014ea168049ee3e1b9013638afa026a4671863ca1", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 83, + "transaction_hash": "0x23f51e1b32d65027a8319c74dfb6dd9c738364405e626783ed6ffb1fb3659fb", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1862d76a292338a2634814f9f2ecb90684c52e1c3f600388865df686cf4e54a", + "0x5dc35a6caa3c8b98a96bbe3a21bad65a803c445bfce698aed1e090881d1996a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1862d76a292338a2634814f9f2ecb90684c52e1c3f600388865df686cf4e54a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 84, + "transaction_hash": "0x2a4e4999fb73d8f3642c3ba7156049cf13cf61252cfe452ffbc8ca602090108", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x41157baa0cd2f7bc1029be65db77a81f97784d3f5aa16f77775d9edbb4cb615", + "0x323d32c8dadf08a0a06268910505e377d4775633e178c6b7d279b931ba0ee35", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x41157baa0cd2f7bc1029be65db77a81f97784d3f5aa16f77775d9edbb4cb615", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 85, + "transaction_hash": "0x1b04a7e6d3428539d6898984bee2c018ac39a8f1d2863e8ce1ddd31a1abd353", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7707b0c961121ae62f4ef63605121041f2754bb095e682a4544b021aee7e2b3", + "0x3fbcfa51836a171596f2c6bff0edb9e1f0825e9062aed979683b9ba73369117", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7707b0c961121ae62f4ef63605121041f2754bb095e682a4544b021aee7e2b3", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 86, + "transaction_hash": "0x1524dddf3c3bd1767cac929b8a4058e48526719d7cb0ab1515ba2842a70c107", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7b3796a71a75e9d55aad1d46057f6facb3040eaea69d255c6cca52c9124e94c", + "0x4683d52b5c5da50d154b9eee85be9b335acfb2edac7f0a46b0d15df18d9034e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7b3796a71a75e9d55aad1d46057f6facb3040eaea69d255c6cca52c9124e94c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 87, + "transaction_hash": "0x28ed4b6a40b7d06a56267d52c73453a2072d27774b33e9b6557eca0dd680fd", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x14169d652eaae2abcfa6fda7c924f8da98566eb1f5f9f33fbf09629ae2b2327", + "0x550ebab892aaa6e219c862574b8457989b937ae35453d7508e9977635447920", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x14169d652eaae2abcfa6fda7c924f8da98566eb1f5f9f33fbf09629ae2b2327", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 88, + "transaction_hash": "0x384c56e94c958e8861f371247a7eaf75909687116adcca565ba717a7e7f3b85", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x17fb33a9db88d0e4e3b382dad1733522ec8024647716f463066bedbb490978d", + "0x6d73c6075cb31839dc618587821690839376b005faf20e554c81cf22f638c16", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x17fb33a9db88d0e4e3b382dad1733522ec8024647716f463066bedbb490978d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 89, + "transaction_hash": "0x5b3183a07e55ce39930fd7552f0e083fcca6d15d5632b51974565eca9b85032", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xa0e0c780524827e8f094bf8c199269f06f86309d30c65af0f7dac6968de3c3", + "0x3dec2ebe2f47ae0947ee9693ab01dcdb74a2ac279fc32a35c8b84b722199ccd", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xa0e0c780524827e8f094bf8c199269f06f86309d30c65af0f7dac6968de3c3", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 90, + "transaction_hash": "0x3bb049cc0666a6ceb2be10a9dcd99ad9bb880f63e8bda0b91c99d94fa2a8fb7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6f4bd4995a3282be1860aca91fe2a498942add440516467aca9da8a1bcf4a41", + "0x1e8bf0e6b000c281bb959a8f22d2f6967c363c699bbe6e924e13e480ada39a2", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6f4bd4995a3282be1860aca91fe2a498942add440516467aca9da8a1bcf4a41", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 91, + "transaction_hash": "0x2bc854f3c7bb9cf902c79b21858c6cf64f2d963c108c7769a25bc312a45ae4f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x524987ff394990a95fa0015a8eb66e61ff9f8626291dedd4f7d50a5f020f797", + "0x51fc3b4494e6dd9bcfc73c0540669a20632f42c4ff5e769294b05804e320770", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x524987ff394990a95fa0015a8eb66e61ff9f8626291dedd4f7d50a5f020f797", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 92, + "transaction_hash": "0x23806ad7f5ff539aff9bc0fb9f4774c42acaddbd4239fcc90349c62a2230d2f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x77845f6d3bebb7c5e30619c191333c3cae03565c2d367fe68bf73dfe1197bb9", + "0x5d3a3de6a7d1237648882bc55b7b7c01ddd528414d015aec205a1bd5631e768", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x77845f6d3bebb7c5e30619c191333c3cae03565c2d367fe68bf73dfe1197bb9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 93, + "transaction_hash": "0x713489f9ee9e4774505a908308dccc31b5d710c12236fec91cb999ed230fb0c", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5032f6bd44ec915ff81e2a450cf2dcd1e28534d804ea9cd38d186dc64c1ce80", + "0x29ee199399a32a98bface17c60ef40c159a7f2ff97157504a83e5474b51399c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5032f6bd44ec915ff81e2a450cf2dcd1e28534d804ea9cd38d186dc64c1ce80", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 94, + "transaction_hash": "0x26d796ef85fafcbc2020caf8f2f15a47ba57d687974f9100c4a3632c0a4d9bb", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5f34cd49c033df5b7d3da352020e839e88ca2c28025e25f70a6a485d68fc0ea", + "0x129c9dbc05f4bd012b6c8863cd002192ebdd5bb3b6a5d5de450c4291fa27ddb", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5f34cd49c033df5b7d3da352020e839e88ca2c28025e25f70a6a485d68fc0ea", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 95, + "transaction_hash": "0x1d6bf7bd16cfad947146e6cc3abc9243d80bfda51a13d089c843420c9dbb63a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3f9e6e9b92cb5febf0b6b79209a9080a53bc94642b01bfb5fe2b61289f18b2c", + "0x59d6e886bfda7f1764012f766f355478f4b8e3b9d257c9e6b690756f7ec1bc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3f9e6e9b92cb5febf0b6b79209a9080a53bc94642b01bfb5fe2b61289f18b2c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 96, + "transaction_hash": "0x388163a57668c9d23bc3ce6cd727deb48551023c407b446cb970d2ba7d7c100", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x46388b18ad7cd2514d20b64c07904b351d313f9b185eb864e9cef8a129a9db0", + "0x4221d59d8749ab42e821d5e81292afc59e324f9d85a9ed23cca1d9be222b465", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x46388b18ad7cd2514d20b64c07904b351d313f9b185eb864e9cef8a129a9db0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 97, + "transaction_hash": "0x1474614b42c0c2a7f735648cfe9e69c6ba27c13fbba7de971332c6107f87a3e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x385f7376f9614f368023e004031b50167fcd10b85b9cd45ea52b56c7dc2431f", + "0x5f56be4577874ca03db43b658ce1293cb7ff3bed0b469a2b754990f1c162aab", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x385f7376f9614f368023e004031b50167fcd10b85b9cd45ea52b56c7dc2431f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 98, + "transaction_hash": "0x22419dd35389da8db0763c8807385986fe6aabc0334b627cf3f71724e7c13e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3591c61d75a1d75ee576d70a366138be4c288034605022086e8abd6cc6a282a", + "0x6495a9290f42e2e7134d42fcaad2c01d7770a1e03ac8b235530ddd6a1fa126d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3591c61d75a1d75ee576d70a366138be4c288034605022086e8abd6cc6a282a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 99, + "transaction_hash": "0x1b44b717869617eb64b00d65507005ea9617107340c1e90db801eef4e684651", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6028344c83f128591c5a1905e734c37f6449505087573a54b99891e864ef8f7", + "0x2d60a254144a4a4dd7d7f7c9c657e3d5867207fc1600925e6e9fd6111354b9a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6028344c83f128591c5a1905e734c37f6449505087573a54b99891e864ef8f7", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 100, + "transaction_hash": "0x6b2b4c33d9a7b0a8f16d04fa27f3039576c11105cd0cd7b3d42e9008faf2a5d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x34535ded79eb990827817ffa6c14988cd29970cd3cb4d5943684335f8360720", + "0x114f3f20c5050e8f45084e50db4835ab12a8c40a1d827b0ea6789cb1915542c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x34535ded79eb990827817ffa6c14988cd29970cd3cb4d5943684335f8360720", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 101, + "transaction_hash": "0x5999e0a6edffdcdd21f41ff9e7bdb7d2d573c474d07bc890654e9c7dfe7b694", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5ea1cbe943d1a798d02899e2b74b7626b315d2b81febf7b8adf33d8e57dc91", + "0x735c98e557704fffcd219c694dc8b9efad6a56d0d5c1c7ccf9f2cc70e1846", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5ea1cbe943d1a798d02899e2b74b7626b315d2b81febf7b8adf33d8e57dc91", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 102, + "transaction_hash": "0x21f1dcefe9a6cf9dabcae1a5e5e5da5d1415d5f7004a10729d4c13f859af8b0", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1a06329b78575c630b343cf559544f84241bc44f3c63bfb013678aa8145215d", + "0xd6fc49fcb2516cd6a882f3aab1c0e239d3619bf91f817373e3ecd462ff862f", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1a06329b78575c630b343cf559544f84241bc44f3c63bfb013678aa8145215d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 103, + "transaction_hash": "0x62ae74ef5c8daab02aff07a12a7c7a8a9479eb7eab545449f78ef0e33b89547", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x12b01545b7bbd20fcdffb03575a25cad0b30698ad7ad4781be1221f554f4741", + "0x6b0d9e9e62d6bcadf1eb70e5a3e69f8748763ec128d65fffa4bad2fca590857", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x12b01545b7bbd20fcdffb03575a25cad0b30698ad7ad4781be1221f554f4741", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 104, + "transaction_hash": "0x5b3cdd91022ca02e6c0cc0f1cd1470e1299f6015725d514fb700450548869cd", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x12e4dfa71ee52225ff301eb69e2fc08fbc001b0821578be07648a7ea493021f", + "0x3c74d8d103a37010c3628756b056e1795098b1248692e890d4b973c5c572193", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x12e4dfa71ee52225ff301eb69e2fc08fbc001b0821578be07648a7ea493021f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 105, + "transaction_hash": "0x1a2ef6245f64b5d87d3227ec399c0ada923753931b2f2c6003eb6b060848383", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3dda73cf3d5558a6e785f54cc6e7207b0173f0cc3cce20f64992566ee734d7a", + "0x73827b38945fcb8a1852327a0db3c1341f498e66ddf45e917b43263beb65ea5", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3dda73cf3d5558a6e785f54cc6e7207b0173f0cc3cce20f64992566ee734d7a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 106, + "transaction_hash": "0x178861bfced753d5c29ff84b42c34098a4a617aa9ebe3d8515ab0e456f153bf", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6ae831431e8fa2128b079844633e084604422d63b7f1ad1a79fb81e37447463", + "0x259d0346def6321e772dcc7960478b28b60686f87fdf357b158d338c32d0d9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6ae831431e8fa2128b079844633e084604422d63b7f1ad1a79fb81e37447463", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 107, + "transaction_hash": "0x143f059f6772efeaa0eee19434ae43600d48b94112cf2125e075853d794b4ad", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4bad3730634830da8c2cea36bc8c0103c47a074f259edd5aba3852e1245a9bc", + "0x5b45d83ead5c4b5061ffeb3b3169ef51c2c9635cfa471633b91e3577e6ddab", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4bad3730634830da8c2cea36bc8c0103c47a074f259edd5aba3852e1245a9bc", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 108, + "transaction_hash": "0x4379a6a0466e0102b5db78269b03bbcd84df24a35212995944d19ff921f80a0", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7e83c177ff630265eda312465978a679b25f8eb253c000a925fa5f42bb233fe", + "0x3e5259b886cba48b86d25215a305f4fd0f3892cfd3e4480287748c691571d30", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7e83c177ff630265eda312465978a679b25f8eb253c000a925fa5f42bb233fe", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 109, + "transaction_hash": "0xeeb3e52134cfa9b421260478bc2af4b896c2c7deeffc7c20ae9462ddef86f2", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1835c7d07311634fe0abc0e12897de6de8420f56fc0e9e1cf0550a71c31f7da", + "0xfa6ef9fbacebf91627a6d6e9298caae7354b63378b7c59f36de9cefd32c708", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1835c7d07311634fe0abc0e12897de6de8420f56fc0e9e1cf0550a71c31f7da", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 110, + "transaction_hash": "0x1508bea8d25546169759b20e5e576daf060ddfde0ba4699cfad13bf46ae47d6", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1d00cc561c943b49f5f2bac27591530a55970c3d0716317ad42b78cd6fb469f", + "0x7522d5283ed7b9aced7261bfb91f73fb0bcc5afc05e0ad3e25e0efae03f4bc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1d00cc561c943b49f5f2bac27591530a55970c3d0716317ad42b78cd6fb469f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 111, + "transaction_hash": "0x3cc7a2bc717ddb4c64358ddd4b0338ef71338a29e486b4df466bd1acaa6d87a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c", + "0x150387eafe5fb0a8725f2fa1b3d450c886b3f93698fb2ea579f55c829b37621", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 112, + "transaction_hash": "0x4f22683162858d005fcad495620d4194b634c2ee9be1f11f9e91348ebfb7d8d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9", + "0x1cb41f8efb81bfde450ffece8927952542bffcc4956c917dcd099a5c2f334f7", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 113, + "transaction_hash": "0x103381a88f800582d200e7cb4239c558992f8e2107eac50570f48b29784ae4d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b", + "0x838b9210d52ff4e227d6519041237881b96e3779057801451ee13266ef0a10", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 114, + "transaction_hash": "0x2e0d84b614c67b7d788a546f04e9314735d19e8af7648bd980f4cc4d5ecf1f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609", + "0x3ef4f36ea03fa22b3ace1944e9c30d2d3db1ba1b829803ccdbc8fb10f91876a", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 115, + "transaction_hash": "0x4cc74e3a3b93e8869d01b42c7b0ba4377163705e2927d390bc8825902a0cee6", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e", + "0x44dce543187f9da87ac682c03fe29e16b8ca948c724d6bd270aca20346cf91c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 116, + "transaction_hash": "0x631a91925e1e7a9a0985738ae29f3afd3b0816171df5ad247f7559ddcdc4f8", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99", + "0x239b57eb82dbca89f0a16cda7a9d9a825804f7b8316bf130bcffc2af7525f42", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 117, + "transaction_hash": "0x37f798b39deb534b7a9888d76afeebe76685035e628c696a0bf96e27b8ed72f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6", + "0x358369a82c0c27912027bd581fefa76774fd3085af46dfc66c40fb8c1ee773d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 118, + "transaction_hash": "0x4ab4bb1f5fc4df7264f57a0ebe46ac3ac66e1b1524bbe6b401dbc27484be99", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd", + "0x45c790388f6d017a4821c1f51a92e9e3146fc2d421346457728abc6b545668d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 119, + "transaction_hash": "0x5b277f8d91aeb7da62ae9545abdb44c154ceb0a09659a84f5ae2e3a0acd7ca", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3c875403ce3066337b984c541ecb4f47557e421e859816e65bc85a402abeda9", + "0x15cd63dfe84340f7816ffafd37fd253d97598749fe60dd6fd002b2f2cfe8cfe", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3c875403ce3066337b984c541ecb4f47557e421e859816e65bc85a402abeda9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 120, + "transaction_hash": "0x2132548ebbde369d32a37a82f8fc2d74278f0b73b166818bbf03927d4dabf14", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6bf239cfd8ddfb4edacc070a23929b9b2522585548656ed1de1033d1765b25c", + "0x47899478e2418f2e085ff45c6880a2a9549ff19bb2d7ea5ee46388b2f439562", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6bf239cfd8ddfb4edacc070a23929b9b2522585548656ed1de1033d1765b25c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 121, + "transaction_hash": "0x2ee469b6fcca6cbcec46c7c11c2a701a1f0926be880b71471d07d3d6aa430fe", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x20f2f2964d6cb9859f1d264e759fe089eec481f131defb7137878c36478bc9", + "0x4c3479ccb311fdaf337dadd954d9ce03548472bf8b4bc32c6475043a99dea58", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x20f2f2964d6cb9859f1d264e759fe089eec481f131defb7137878c36478bc9", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 122, + "transaction_hash": "0x496b37055585ed59bd991a954f7f3c950a6c4a0117d45e8831fcd544d9b278a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5c4f4e4ae30a422a1b735b38c52bdf5739ad64b2f95492ab6ccd93b4f6be2df", + "0x7a4f52d39ab901cbf7d2ead756cb3a8516110eeb8f4f958ec01f72674df76ab", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5c4f4e4ae30a422a1b735b38c52bdf5739ad64b2f95492ab6ccd93b4f6be2df", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 123, + "transaction_hash": "0x1a19f0db9a0d4fa69a0df59a0982b64dd9c53c0034d8b4f16d6912e564d87de", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0", + "0x3baf4487184344596cb078af8730466937df2d938ff56688442c9a146e682da", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 124, + "transaction_hash": "0x3aba052a7ac31196b103efea508299044c4987be17ed9db4a142ad205a3be2b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1c23816c01bfbd90fd57873025b4d5b86ee2cccfbad90d3a7fa25dc569638cf", + "0x11e5e35e8075473dfab70566e0f9e071c7d1f5debcc8fc79c0bd374ea610681", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1c23816c01bfbd90fd57873025b4d5b86ee2cccfbad90d3a7fa25dc569638cf", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 125, + "transaction_hash": "0x1cdbbd431edd81c19c08d52b2ca047b39bb9773a8c9332ad91e3508ae8ebb7d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x40de1d323a5870a9b1011b1476bfd58f92a35ba59b1f9f3c69cb083fcba122a", + "0x786a7b8e6c19a882ee918202201abffbd1369d30ed694406da52c3e615b0d32", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x40de1d323a5870a9b1011b1476bfd58f92a35ba59b1f9f3c69cb083fcba122a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 126, + "transaction_hash": "0x7c0661b8022ccd16b2ea405f20b4fb72e2d458e7807952c462e266fb0d79325", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x51d568676ce46d5f9a0d7c23c7c72cdb8536f38d74b3138f3cb9acae98b074d", + "0x5bca2c958cea7ac17e1d4dae90155d11a911a917f91a486ed5013c9dad2088f", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x51d568676ce46d5f9a0d7c23c7c72cdb8536f38d74b3138f3cb9acae98b074d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 127, + "transaction_hash": "0x3cdf111085aa25cf5bb06aaa4506bd17aea4648d790264a88b205fe7d4f2bad", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2ec71fc858681fa0cca225185a86060926a9bfd338d749f256910d415770d1d", + "0x2bd2704ade8daf80d330f575446499b44783a6cc21e3ff95de2aad82648e491", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2ec71fc858681fa0cca225185a86060926a9bfd338d749f256910d415770d1d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 128, + "transaction_hash": "0x5d426134165dfbc7943021571e8b9f1014c1cc368c2ca2456b9c0f26fd547a3", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5726d58c2c6bc370074cb67581d03cab05e1304365ca0ee9f4ebf3faade40c4", + "0x397bb315d341edb330605784790faf476d4162ca5ce07d269ef8f39aa5f8401", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5726d58c2c6bc370074cb67581d03cab05e1304365ca0ee9f4ebf3faade40c4", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 129, + "transaction_hash": "0x5280f3167d771ca99febce9e6dd60705a0db2f5ad65f8aa839add5ce23221f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x73f94dad20c07abaa57a278d02d169b48882bce673c421251686075a986db83", + "0x20be5a51198a030c08ef3886a5b47661a773b186f4407f3f2d3c2252828e80b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x73f94dad20c07abaa57a278d02d169b48882bce673c421251686075a986db83", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 130, + "transaction_hash": "0x173ae09604a69ccf8c0b4699f38a3e20cd03f3eec2c817ca537d17a9084b266", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "0xff9247899738818e2b47acde31012975dfa023f5c860a19110dcd8d17af54f", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 131, + "transaction_hash": "0x5b718ec976fbe5a287430bac79254dff399b4d06cf7b40952d02dd37107575", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "0x31293244a17ef815b86baaf64c80c6885f900c74c51fcf57512d7d0a16beeb6", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 132, + "transaction_hash": "0x25014de16daf7e0b7616c884fc0f7f347bd4fbc0581ceb8f8fafb62201cf08b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "0x177bb3f2d216e4b5fbd795644ed4f764e4d44e88c6baec669dd7c961a0d5459", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 133, + "transaction_hash": "0x7173b79f089b5c3a04387f24fc50e335cbf17519153cb96b1d76ddb2b963b62", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486", + "0x78c79109fb270aedd672f34ee762cbb13182eac88902e83dba9ff8067ccaff5", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 134, + "transaction_hash": "0x4c2af11345d1c14e61e42cd6f9aaf30e3198742ca02fe80ff8779b6f4c3529a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "0x553865b8c00b13964c2ca979ab644e5a78698d1a432dd79a139212edc2a3bb1", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 135, + "transaction_hash": "0x73cb474823be71fa131985a878728582720db457b0b93a88510bd5117473314", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xd9def9409244513635be50767308e1c80a10bb5d116efdf78b9de36620bcbb", + "0x23a84f6c04e12e95156f3a95bba5fb937962497684343aa8b383e0eb9544b4b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xd9def9409244513635be50767308e1c80a10bb5d116efdf78b9de36620bcbb", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 136, + "transaction_hash": "0x3e449ca641cd0bd1ff73c932f69202871c2ad2543b8bc11cdad527b74f8d0cf", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x5b356f0bdc58baca5e3b09d7924a9c149c04018ac44c4b9ac8ea8e909f273e2", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 137, + "transaction_hash": "0x6502bcfbdc0ff581dd427b3352cd5612647f4423496dea5a86d5bc58c549f40", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "0x448352a22b7d13d447579abd96b903bd4775e3706adb4c849b27ad8c35920b3", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 138, + "transaction_hash": "0x12201b7537453148e286b8db7ae963c8caa2c97546dde9e4b3bfdd68479bdb8", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x4ff825824c14191fb3ab092af3398dc43fac2f39b6bedc38e9a59eb1830353b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 139, + "transaction_hash": "0x71b3cb789db36c1eb5c123ffa8022b7636e0ff532a66817ba4aa40becb87600", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "0x98a0c24e9409c975c4d00b538786fcef3e6917c87c2bc4f6fa6f0030d2c0ed", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 140, + "transaction_hash": "0x53beaccdfa5cb43c14a8906db9bd6617ab60afea57dba13c655d5c98df3a4ce", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "0xe5fb2d5857d353e096b22ef0f8e9f99ff95b806e02a100de157a10b9f0dbe0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 141, + "transaction_hash": "0x67102dba80499dbb2d003d8a9788624e66850545e06f8161e0c1ee67865e8fd", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "0x4dc90cb95f997f48e57659a8b967e8e274efc50efaa44e151d3f06d5c09888d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 142, + "transaction_hash": "0x839e5b87c654d05241a6b948abfc731d9769330040b8c51152b0333bfa7a62", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "0x2b23e674ac1780db2739b1120bfa338a1f5f70a1e2f504c420e3b36e67d2e7e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 143, + "transaction_hash": "0x6044face7ce6c8aa9f8a9dff0ad8404e0b7e94b51b2f0ab18f4839ba48ae63b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "0x5084d51029195f1ad25cdc2f9dc1ca7a6b852a0403d64cedcbea6823ad60406", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 144, + "transaction_hash": "0x2b4211bb8fe9826cd759f600ace0d683928c5d01828673cb636c5960fccd33c", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd", + "0x7f4b923ceb59db39ea45e8bc509ee21a794f6bf519195843196383a7f41c733", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 145, + "transaction_hash": "0x76df89475d06c33ecdf3388123641a370c1966530b3368fcba532f5c0968065", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6c55ba1f4efe13d3eb06441582c3aef616542be06363571d970ecbceb893de2", + "0xe84b189ad866d825e7acba6c35b1896bbe63af2c978c252b560095dd624475", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6c55ba1f4efe13d3eb06441582c3aef616542be06363571d970ecbceb893de2", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 146, + "transaction_hash": "0x3602546a1a075eeee06156aaf95e563c67fa62f9a49aac2462192b76a714bcf", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d", + "0x2469bb3a01d85d5c494b4ec4b395892aa1471d39f9b8ee02e867c22d9fbc9e0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 147, + "transaction_hash": "0x3dd182a9cfeab84580ea77bc8302af732566c692d5f2bf3a744e0831834985", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x79b0d5fe892237bcdc0979892a9b2790f23781d41aaa8adf351c7980c8b65", + "0x4d28aeb4a73825e8e220be72fdc88a1c7f3e3a07f7b11b5266e4ce09c5d4e45", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x79b0d5fe892237bcdc0979892a9b2790f23781d41aaa8adf351c7980c8b65", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 148, + "transaction_hash": "0x3e06fbeb0a6fb7993e15ded8434b8c93c040ef49a47ab53c027d4bd61f6ebb6", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6be5a0624172c2f0a3d116d03a861375e023f340caaa6363854c9ae4a460f5", + "0xb83de952bc6d08a2717450a62dc63d8b7388be348c34d35e02a4e721fffebe", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6be5a0624172c2f0a3d116d03a861375e023f340caaa6363854c9ae4a460f5", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 149, + "transaction_hash": "0x57b506804275c73627fc751672a4f05f6cd1dc4aa7d63b80d7ad0e693fa421f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6a4213ccb648d4cc272690144073efdb184bc5c0253f798973666761b231827", + "0x15bdbe09c4994bcbf777fa5e7a96f75ca7f48ae9adc8bb4729b9eebb8421dd4", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6a4213ccb648d4cc272690144073efdb184bc5c0253f798973666761b231827", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 150, + "transaction_hash": "0x7404ba50c6ab74de5a464496aebb760bfe9d057f67b0f10ffd238266a1929c5", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2f50b3c524482dfd39d8236ea2c114df8d8fd907711584de81eddbeca7b7921", + "0x1ce326645bad9e0e6a403e59fd425b44228ebd91fbd4bc859ef3931db28350e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2f50b3c524482dfd39d8236ea2c114df8d8fd907711584de81eddbeca7b7921", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 151, + "transaction_hash": "0x6336498d27b2d2c2498092d18e81fe90a6f910265fd73032691404ba01c97c2", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6d7caa4818f9d3d4fcc09f69e5c776ad60978fa701d99a6c5a0c70b7b25e1d5", + "0x52a42025cf1191517e1d6320decbcbd29a0e9b4d6d541642d236c94a1129b28", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x6d7caa4818f9d3d4fcc09f69e5c776ad60978fa701d99a6c5a0c70b7b25e1d5", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 152, + "transaction_hash": "0x25a369e7d198733982640d84abb9231e0370233df715cb883e0ca96fbf3c8b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x46e53968a2b5fe68b9b0d6ba6d8a475211b845759822e9161e3cea1afbb1c5f", + "0x243276cffa081d5820d2cd5957559e7c9079b04ac9ccdf89a98ae76cd9e336", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x46e53968a2b5fe68b9b0d6ba6d8a475211b845759822e9161e3cea1afbb1c5f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 153, + "transaction_hash": "0x7d975576bd417092e8a4240a9dd394936c0403ed924492543257a71161efe", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x47666c862e5e3db0e5a43aafd2d1ba5b1e8eb498ea5b42ebc6cd01ee3a16609", + "0x53ce509fa10a89f8e84c1a757c6ebb9f619c88fcf6cf4cf7f3a0dffdc98fc38", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x47666c862e5e3db0e5a43aafd2d1ba5b1e8eb498ea5b42ebc6cd01ee3a16609", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 154, + "transaction_hash": "0x4bce71a291a23339f70b0364cc38ad842f590f915cfee77388a781d2b7463e0", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2b24cb0ac3991cb6362f305bb241e0e874784d44e89d08859536270a29a3799", + "0x33c72c1fc6bdde04aa50b65cfd0942f84e09105f402e4007212e62076abf042", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x2b24cb0ac3991cb6362f305bb241e0e874784d44e89d08859536270a29a3799", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 155, + "transaction_hash": "0x247e7f82d7c0dc9c7d932adf83b1043c6065d704af574587481c2423733d3ad", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x43438d30a486df0100bfb40f7dddbdcf9b9c21f2079ae785a22b2816d09d842", + "0x77649160825a0fa1efcc286ccad2f293f8188372b5c1417e6cab143f15ce0a2", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x43438d30a486df0100bfb40f7dddbdcf9b9c21f2079ae785a22b2816d09d842", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 156, + "transaction_hash": "0x1c08dce6167fb92654cdd8859b7a497ba1bb8822bc9c65b0d06af4e2e6236e1", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x708610e23e4fff8c6434eefadcc284215b0ca10c5b2530d784a547ab7ba6c1e", + "0x66ffeea403d80b5ce56f240cc1dc71f29de7ddcc678ffb2243b83781fe203c0", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x708610e23e4fff8c6434eefadcc284215b0ca10c5b2530d784a547ab7ba6c1e", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 157, + "transaction_hash": "0x384448c90680c595d337a129ea224d736e633086d0658f834487de73e081146", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x73ea2bf4f84c4ef4f95f6a5a03af3317277deb63039330d881ea20e33d0738c", + "0x651234373645c402aa2545fa765084ad73e170f52563a3412e7e629a6aa955", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x73ea2bf4f84c4ef4f95f6a5a03af3317277deb63039330d881ea20e33d0738c", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 158, + "transaction_hash": "0x39a051c998a67dba681a4d4b62ce5566b01c50d591c8d8fbde29e7cb9cade5d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4c7fbf3010747ded03b3cbd0a8bfb888cdeb9080a06f5d0d1e32e36473ac5ac", + "0x3e1e01b344a4bfa097e226570fbc97e94a202e1bff7621f5ffd2b614ce97d13", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4c7fbf3010747ded03b3cbd0a8bfb888cdeb9080a06f5d0d1e32e36473ac5ac", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 159, + "transaction_hash": "0x125beb29b36da82b913ca9c974555a5cbbd504257b65be41118fa2f9b1ebbcc", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x688e05ac8427736a7bc419f86ad7a90ea6157d2d82ed30f09149b18c97a2391", + "0x44d6b751b21d24bb3b3e4acc9940f62f41450f3bd30339394931aba3d00c6e9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x688e05ac8427736a7bc419f86ad7a90ea6157d2d82ed30f09149b18c97a2391", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 160, + "transaction_hash": "0x4d066bd10fef687175b64486069240b99e9efc085d29f66b8430e8d352d9151", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x57dfd6da6e2abc9b831a908fe8d4ef45fe2830c3ea287ec2341c4bd88046574", + "0x2b8806c5526bf682c03a69f6cfa4a9c95414e5e315fb1f91fa3440a5d78264e", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x57dfd6da6e2abc9b831a908fe8d4ef45fe2830c3ea287ec2341c4bd88046574", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 161, + "transaction_hash": "0xe6dd45f7f047eb5b9a0b48d75e53328166b15a65966a192583fb9597907f04", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x66a981c57e4253cf8d24eaaed89f7719c9a697be3b41a0371b24c8fc00a1cad", + "0x3d1b043f11316ab21133bd66d438d2bc801304d810be7f0a7f9bf7635fd7d12", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x66a981c57e4253cf8d24eaaed89f7719c9a697be3b41a0371b24c8fc00a1cad", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 162, + "transaction_hash": "0x310ce6a7234f51d7a7b3e5c43d230ce21389730a9d5287ba357e31279cd1303", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x36b39a015dc8b78a90ebc74d8f98a7b5a6cdc718118014291966650d6df65", + "0x425b622d8284bddba9a4ab7266daacda17a1877430ed52a3f69892853648d4", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x36b39a015dc8b78a90ebc74d8f98a7b5a6cdc718118014291966650d6df65", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 163, + "transaction_hash": "0x1b7d100fc1a90371e9e64e943d5369eb7bd12b54aa034a983fa81213a2bbea7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3fd8c55203651e0b3c6cac235b8b489b0a302731691e1c4b860b7dc41a6d6be", + "0xe4072b51b39c9eed5d3f6a4df783d4824e7655b471e878e1a03fad678bccf2", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3fd8c55203651e0b3c6cac235b8b489b0a302731691e1c4b860b7dc41a6d6be", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 164, + "transaction_hash": "0x23591380c2f899686689d0ea209b3586aa27f7f644ac06d3efb376b9379a8fb", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x22ccb773bb8c536d70c99ad4be229b6425be5e8014a1330c72495760d2f4b60", + "0x3a120f0603f880eb3ebcf2f51ad8b510ff45c52e2b19397487eb59f7d215384", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x22ccb773bb8c536d70c99ad4be229b6425be5e8014a1330c72495760d2f4b60", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 165, + "transaction_hash": "0x6aa9bf81f896ab255495901ede9c7de8423457c79b9852ad000d92b7a054be1", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0", + "0x2b8d25ad36db79ee9f1ef1900aa3831745dae07e1d5ee7a161a2b1cddf0dcdb", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 166, + "transaction_hash": "0x3d8144276a490ca957d3b050f193c30f8d2e98c49e09946af09877b2d14f6a1", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1624d229b7b2733f0e4f72f205ab058c0b247045ff371aa5a7aa95a7a037906", + "0x44edc98aa09d3c48b4da189467ea3e582fe32859d0df8ca47b768156b85a260", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x1624d229b7b2733f0e4f72f205ab058c0b247045ff371aa5a7aa95a7a037906", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 167, + "transaction_hash": "0x3ea0ff3cd693c15c2a125fb6c8b233954db1abefbc1d5236acbafcce2b9603b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4dde2846e7cce0c39e57113809340c87421454d8d7c48167a7a2db9d0ef7067", + "0x6399dcfb7c3ac836f32632f0395b1c7ff6c72ea353ec122b86f0a49e045a96f", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4dde2846e7cce0c39e57113809340c87421454d8d7c48167a7a2db9d0ef7067", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 168, + "transaction_hash": "0xb1de3fa66983a9dcfc33e4c44eb691a4e4746c7f4709d97fdda0df5dbe31f7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x384152c373546b914f69e6c011747c08c519c3f43a4dc4b4b51849ca0e99ded", + "0x6e7616c3ad7f00e59f65e276653601a535125a577127235122ddd92d9a2792d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x384152c373546b914f69e6c011747c08c519c3f43a4dc4b4b51849ca0e99ded", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 169, + "transaction_hash": "0x7a14ae239b5ef52cac2e795354a2507fbc721a441b1b0c27899747aa5b0d56a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x115f012bd02db4cad77f3fb19bea28087d03a4d03f965781711cd9a9379d100", + "0x613caab7214bad95f132347d5afe5bbb421fdb6b127b1f525fd64651f88415", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x115f012bd02db4cad77f3fb19bea28087d03a4d03f965781711cd9a9379d100", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 170, + "transaction_hash": "0x4ffb0b6085a2ef31164f2268de6d215636a5a7d8fbcce5a8ec52d2da0018b74", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4102dafaf51f5e6c854259a48f6ccde4fac083d2dec07e784c5c38e7c6e9a8d", + "0x1df4af2d02656e93c276ddf4cf618d79e21a04e271b73e0358eaeecd2798e9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4102dafaf51f5e6c854259a48f6ccde4fac083d2dec07e784c5c38e7c6e9a8d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 171, + "transaction_hash": "0x7f72aa25d42ae1dee8aba34b61f43b1641dcb42b02112084bd59e385bda1bbb", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7d3644f1c8cc3d0fde11a7c69ccdd59e392199be927e2e283d21b5445357ab1", + "0x6c39bfb03ce74f827587993c35fee75b194aca03d6933e55b39506810b924bc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x7d3644f1c8cc3d0fde11a7c69ccdd59e392199be927e2e283d21b5445357ab1", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 172, + "transaction_hash": "0x130d45032978cd3896f347f0607471a7a700ad0726007fdb8457eaf37ff0eca", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x176c25d47570070342b173716432127caf510d2b00189a3d8c9c0266297ec30", + "0x45b3e73736ffa7d2b57dccd9b2a08bb53f5db9c4a87e1495b6550a13f5be47c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x176c25d47570070342b173716432127caf510d2b00189a3d8c9c0266297ec30", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 173, + "transaction_hash": "0x70c571657e610e7a8fd0f9974ed9a6b086ff05d00129b0025698d5dee3ff3f3", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x15bab3e51c95b9d58b038c49fcbd26d6e163cafd66d2f2cccfce75cee26b762", + "0x14e8744f0fb2432cf027fa55a36bf65488f59ef104988c702cc91adc51509f1", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x15bab3e51c95b9d58b038c49fcbd26d6e163cafd66d2f2cccfce75cee26b762", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 174, + "transaction_hash": "0x35928dbd8c4e8bde8f375b19550eec284538b00c09e97d3b85a45893eb965e0", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x481d6bc11e059a6f76ef7f3967cf22b9a0ad02236c59bfd641076cbf371628", + "0x1ff782ab0e8c2ce9758509f291895642a960db30e4e375aa7ac72bc3c939038", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x481d6bc11e059a6f76ef7f3967cf22b9a0ad02236c59bfd641076cbf371628", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 175, + "transaction_hash": "0x6e4548e3c81b0f6226307a787dd1a8a95290721f0b92faaa54eed362c30dfa7", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x541b4a8bb25092e7a52dbe8f07810e5c9efcb2774d52b567845fe8d3dc3c92a", + "0x15a7bc9dfe4fae868070df836f78e7a6256a00e8b2e1355886a2adc28917969", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x541b4a8bb25092e7a52dbe8f07810e5c9efcb2774d52b567845fe8d3dc3c92a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 176, + "transaction_hash": "0x2b331ae0f7d03c9fd6088604f704980c919dfcd030ce4cf2d2e5194dde6cf24", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x21bf47cfe73804095e3e1b25e656ca2ca9787651de3e69c9950943f501e30ce", + "0x43f3e848709d1347ef8fec1564050ef48b2c4b4b8848686228ca7d48d6b8952", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x21bf47cfe73804095e3e1b25e656ca2ca9787651de3e69c9950943f501e30ce", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 177, + "transaction_hash": "0x2a07b11c3d126f88fb09ff5be4b14e9616a0bf43d7548ea8439537934ff15cd", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xa91641858e346eee18cdb5985b97a73eedc7fdc92de8fd3cef0b42bdbc00d3", + "0x12d803efb6b14fe4cbf885e67618f79c9cecc522ecf9549703d3d0f3bb22b19", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xa91641858e346eee18cdb5985b97a73eedc7fdc92de8fd3cef0b42bdbc00d3", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 178, + "transaction_hash": "0x2c1aa19b694ce946c474d6fe12552c53e208699384c3824d0300971fdd2288", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4e17f08446389b5cd0df8953acf3a0f2f6a6b2a80abd762b0101e7c6c103157", + "0x1f2f2027b73f9ded8c6beab8934566d563a0a0d8b4e0aa80ca0d9e11c24cd90", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4e17f08446389b5cd0df8953acf3a0f2f6a6b2a80abd762b0101e7c6c103157", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 179, + "transaction_hash": "0x476ed4d8f3194c6441a8b6a3a6611f4df286a30a11d621d61706e5cd597854e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x71a161b38b1229d32ae61b14a2f44bdc73e6664ff8b3a4184f66abca2735fdf", + "0x16933ea9c914684bfaacbeefe89927f6ea29267fb0fa4661d0c1f3752530cc9", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x71a161b38b1229d32ae61b14a2f44bdc73e6664ff8b3a4184f66abca2735fdf", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "range_check_builtin": 268, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 180, + "transaction_hash": "0xc3b7c3b42d74864f7989003a61626c08849fd91b4f6464b932745555224dd", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9b0e317d0bc8a7d797d9a4575dad53eccf44b671c0591c7ba82f5804d12985", + "0x9fcbb62b9953a3b658b5c63e3610a168a6951943aeb253788558094d935166", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x9b0e317d0bc8a7d797d9a4575dad53eccf44b671c0591c7ba82f5804d12985", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 181, + "transaction_hash": "0x310ab042ae9a8904f63c4010f53f89a213bb91539403324d5c176905df2386a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x64db11e31dea49ac0945a548fed4b38657452f98f0f29f413062b12873f4afa", + "0x120f5f0ae30ffad55612dde70c1a0a07af8d89abce94b8b9ea111e52d1e3b0b", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x64db11e31dea49ac0945a548fed4b38657452f98f0f29f413062b12873f4afa", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 182, + "transaction_hash": "0x776f598d4c2650c49f1fa9a1c4121e652b6feba8d701753a39bd44bcb85719e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b", + "0x1cc1f97e9284232d34653d58fa8e30a8563801c1730176700f72339367a953d", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 183, + "transaction_hash": "0x362a854ae7efbc4d08b9c6b4e34105e46cca68c929829262d117f990f32e50b", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3b02187b88b06e6993158e652acc2836e15b6f0a95d4abf74891334b462f741", + "0x319f651f63b9d8c006771fe19839a340c1148d0bfaec7f54b9b7a4d74d95aa2", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x3b02187b88b06e6993158e652acc2836e15b6f0a95d4abf74891334b462f741", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 184, + "transaction_hash": "0x20d0bab6be590f5197ffc051803472e695eb6ffae36adb6a1974a72ecc7289c", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xba1224bab4ce060da0b89da3294a672ffd0b4c313430b67aa6397510739502", + "0x3a0c01b4483148f2ed4933cd567c57082963db6fcbd7d2e742428b7485afc43", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0xba1224bab4ce060da0b89da3294a672ffd0b4c313430b67aa6397510739502", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 185, + "transaction_hash": "0x2781b1d51a8e2e2b3bddd5ca550d9c02f635ccda46dbc5cbabaaf99df615df", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f", + "0x533ad6924cb390e6745bbe6194f5bad2f5327939799d4090e7d042d7f1f28d3", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 186, + "transaction_hash": "0x4df7753f4f657d63c10941494ebac856c9648c736f396706fe4d5fe673f2912", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970", + "0x6111ee156a2965b9bfe980c405c3cc7e86ec0b536c611cd2d164f9cd50269d2", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 187, + "transaction_hash": "0x5847a37545b923764f761184420769c30c8ec648807bdbdc2007f7ff599aebc", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471", + "0x15400564c0d933f03eba288c0fffe3c76b06a5ed792dbe86c53b2a4f48661bc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 188, + "transaction_hash": "0x66ae9cb40a20a47596bc290aaaf99e07c827be610499644aa6d6fcb725c398f", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6", + "0x6138951e7cea2a9949fa4197aeb29b079cfd99f658cc73c500765da96f2f857", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 189, + "transaction_hash": "0x37e2884609b45d1ec06b2043dffe99fb58f85243baaecce3ae0fe1fe6f2697a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5", + "0x4a2fcc8551fb5e58a54f67c6b1a100cc101bca7b8bc76a506ddbf23caf7495c", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "pedersen_builtin": 25, + "range_check_builtin": 268, + "ec_op_builtin": 3, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 190, + "transaction_hash": "0x53e768cf8ccf4c4b125ae529f0050823f067e078f8529f95a932b1e5b2a1a02", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d", + "0x42fc16f540975c3129cdbbe88275cbc6b926a4b183f08ea4802734963f246d1", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "pedersen_builtin": 25, + "poseidon_builtin": 4, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 191, + "transaction_hash": "0x120d051ffd11af42cb251813729cbd5feadad5685b9816de68455e96bff0e75", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574", + "0x10121ed85e757b09180a9f23c1e0d0dde516b990550639b3e4b8db6f1519db8", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "range_check_builtin": 268, + "pedersen_builtin": 25, + "ec_op_builtin": 3 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 192, + "transaction_hash": "0x167445965643cf3511fd7ec067085acf68fe2080c420659597324ce700f2f8e", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2", + "0x53f5e8f152398f2918082611d71ed7d38f1a895e38a9b627086bbd553152cbe", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 193, + "transaction_hash": "0x4156cbecc1048d42a74297277e70cdfa2e3e87566a554567712236b1674f908", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a", + "0x5033cb6a734b81a5033a6ed3367ee6998f70b01e563071d73f27e0dfb59f9a1", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 194, + "transaction_hash": "0x42e6f653c1f61632af8605be03e119b5808ff0b35153011e28431a574b40603", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd", + "0x5b707625bd4195d215fa54e99f1a132db60ac14bc882585a8f51a3e7ddf8367", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 195, + "transaction_hash": "0x309ecaad1fced9d3c639dbc5fa49e82b5eca514f476d56b8c92355d6797d43c", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b", + "0x634dbcc6decf882804e254340b0ccfe9a931e27685121e873979f9256fbd977", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "range_check_builtin": 268, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "poseidon_builtin": 4 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 196, + "transaction_hash": "0x1dde6a5db2fd1f795cb3c21f4e40eec2547e1aaee8cfb96e0e565554bf8ec97", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x72ad5c3a194d4dc87ed27b317f00d5762c0362bcb93d7295887e1be8080a555", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "pedersen_builtin": 25, + "ec_op_builtin": 3, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 197, + "transaction_hash": "0x4469d51fe173183fa4b330b9151b756d50be2140709ae3b7540cc0ec481d20a", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x6a592b56049cd8d77e5466efdf21e5efe15fb0c9bf78d0f3928ffd83ba4cfbc", + "0x1", + "0x0" + ] + }, + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9" + ], + "data": [ + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "0xab4e32edef", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 9233, + "builtin_instance_counter": { + "poseidon_builtin": 4, + "ec_op_builtin": 3, + "pedersen_builtin": 25, + "range_check_builtin": 268 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 192 + }, + "total_gas_consumed": { + "l1_gas": 25, + "l1_data_gas": 192 + } + }, + "actual_fee": "0xab4e32edef" + } + ], + "starknet_version": "0.13.2" +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/signature/16350.json b/clients/feeder/testdata/sepolia-integration/signature/16350.json index ac7d4fed7e..4942743725 100644 --- a/clients/feeder/testdata/sepolia-integration/signature/16350.json +++ b/clients/feeder/testdata/sepolia-integration/signature/16350.json @@ -1,11 +1,7 @@ { - "block_number": 16350, + "block_hash": "0x660be3d095f36ffebf314c8bdea6823ba5e1f02fec2db61c84eb6faa859195", "signature": [ - "0x10fe667903a11a659d5cf95ab3ca441ef6888833b4e2036d0c6761e6498faf4", - "0x334061004caf8145136479b44112611fe9c90b3251189094c6e453d29bd6973" - ], - "signature_input": { - "block_hash": "0x660be3d095f36ffebf314c8bdea6823ba5e1f02fec2db61c84eb6faa859195", - "state_diff_commitment": "0x62c1b2056ff46e764b1103523ac104c0b9377593a4458e574b73133d00221e5" - } + "0x7ee8a86cd921053e037181b4b57b813db63b88ad5a5975ecada151d079322ae", + "0x6f97aefb8f14351f8a60f66c936ab8175744217522d7b335deadae8a4f15c68" + ] } \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/signature/35748.json b/clients/feeder/testdata/sepolia-integration/signature/35748.json new file mode 100644 index 0000000000..d8598c65a5 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/signature/35748.json @@ -0,0 +1,7 @@ +{ + "block_hash": "0x1ea2a9cfa3df5297d58c0a04d09d276bc68d40fe64701305bbe2ed8f417e869", + "signature": [ + "0x45161746eecbeae297f45a1f407ab702310f4e52c5e9350ed6f542fa8e98413", + "0x3e67cfbc5b179ba55a3b687228d8fe40626233f6691b4aabe308fcd6d71dcdb" + ] +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/signature/35749.json b/clients/feeder/testdata/sepolia-integration/signature/35749.json new file mode 100644 index 0000000000..26f5ab8392 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/signature/35749.json @@ -0,0 +1,7 @@ +{ + "block_hash": "0x23b37df7360bc6c434d32a6a4f46f1705efb4fdf7142bfd66929f5b40035a6", + "signature": [ + "0x12c78ec06dd5736e8c4db89f45a6be9fb38b61821b0c2fe5ec960dd29a6c734", + "0x498086fd30062224ce7bfab9a6b4a875ccc129982ae6f909be8478e4a429dbd" + ] +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/signature/37500.json b/clients/feeder/testdata/sepolia-integration/signature/37500.json new file mode 100644 index 0000000000..2c4eea2921 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/signature/37500.json @@ -0,0 +1,7 @@ +{ + "block_hash": "0xf7471e29d9f546fce49b82c15eb3f2d62d27526884e7787277c9002b9cac83", + "signature": [ + "0x61aa44c52ed27ba5e95339b1a77aa75e849f18cbaacf868398bef20dc5ac395", + "0x74a81536d17b0c3d8949346d54842d15974f82313a17cb3806c7f737b9889fe" + ] +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/signature/38748.json b/clients/feeder/testdata/sepolia-integration/signature/38748.json new file mode 100644 index 0000000000..a4f9e3b902 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/signature/38748.json @@ -0,0 +1,7 @@ +{ + "block_hash": "0x40b9de4d20b6537151895df0fa2520be3639a2a2a65915b5d27855efd1d78fe", + "signature": [ + "0x41e1c125c6b41eb8df6cfb116930cf7db423834e38090015bf6630757682a71", + "0x1580850614ee0401dce1c950c87cf900ebc3b50ad58bd9b38599565d0cfd313" + ] +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/state_update/35748.json b/clients/feeder/testdata/sepolia-integration/state_update/35748.json new file mode 100644 index 0000000000..fd213bb604 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/state_update/35748.json @@ -0,0 +1,41 @@ +{ + "block_hash": "0x1ea2a9cfa3df5297d58c0a04d09d276bc68d40fe64701305bbe2ed8f417e869", + "new_root": "0x38e01cbe2d5721780b2e1a478fd131f2ffcc099528dd2e1289f26b027127790", + "old_root": "0xb120f982c77eab1b25f29349fb1458f32157887c64feb91e51e7f4cad62721", + "state_diff": { + "storage_diffs": { + "0x1": [ + { + "key": "0x8b9a", + "value": "0x6ae6fe45c608e642524de25140f19a44d40dc26286e38d3f184c7fb2fd21767" + } + ], + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7": [ + { + "key": "0x84a17db3276b7f8c33d3cdae9067d3db20b6a24b5c29fd185df2f7f42c0713", + "value": "0x90d0c5a3d34c3e73" + }, + { + "key": "0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a", + "value": "0x55620cf9acab16e56" + } + ] + }, + "nonces": { + "0x472aa8128e01eb0df145810c9511a92852d62a68ba8198ce5fa414e6337a365": "0xf" + }, + "deployed_contracts": [], + "old_declared_contracts": [], + "declared_classes": [ + { + "class_hash": "0x19de7881922dbc95846b1bb9464dba34046c46470cfb5e18b4cb2892fd4111f", + "compiled_class_hash": "0x6506976af042088c9ea49e6cc9c9a12838ee6920bb989dce02f5c6467667367" + }, + { + "class_hash": "0x2fd9e122406490dc0f299f3070eaaa8df854d97ff81b47e91da32b8cd9d757a", + "compiled_class_hash": "0x55d1e0ee31f8f937fc75b37045129fbe0e01747baacb44b89d2d3d2c649117e" + } + ], + "replaced_classes": [] + } +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/state_update/35749.json b/clients/feeder/testdata/sepolia-integration/state_update/35749.json new file mode 100644 index 0000000000..bf23816c05 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/state_update/35749.json @@ -0,0 +1,93 @@ +{ + "block_hash": "0x23b37df7360bc6c434d32a6a4f46f1705efb4fdf7142bfd66929f5b40035a6", + "new_root": "0x8638b46e7b92719ae718dc352c793d1df15c55956be999a539e9a27c260337", + "old_root": "0x38e01cbe2d5721780b2e1a478fd131f2ffcc099528dd2e1289f26b027127790", + "state_diff": { + "storage_diffs": { + "0x65cdd7892656f7f89887c2c84bb3cea8f8c1b472a4f61838496c1fc7cc8733b": [ + { + "key": "0x23bf06fbbf6634459b7cd052e704bcf80f07e85cbdede138ce8e1e3aace24ac", + "value": "0x4617cc24c69548663a20ccd75a98355fab6a7c70b13cb427194943e34298ba6" + }, + { + "key": "0x3b28019ccfdbd30ffc65951d94bb85c9e2b8434111a000b5afd533ce65f57a4", + "value": "0x7075626c69635f6b6579" + } + ], + "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d": [ + { + "key": "0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a", + "value": "0x403702d55d9d63cf0000" + }, + { + "key": "0x1b5af78b6c417eca272a1b502eabe32e63f5f3c8d738ba6b995027beaeb217c", + "value": "0x668ba2f8000000000000000000000000003ff41da4afa083c70000" + }, + { + "key": "0x38c10662a48073f77efadb4820d93ad877d4de93741e9165b24bc8877d93b78", + "value": "0x10" + }, + { + "key": "0x391a2fd317962118227a3ef0f473318220a4e94843d9c9be5a7b8c608c89cfe", + "value": "0x10f0ca1aa84ce252345" + }, + { + "key": "0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a", + "value": "0x9b6770b5e60ea7ac46a" + } + ], + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7": [ + { + "key": "0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a", + "value": "0x1b8ef773d001192ee4" + }, + { + "key": "0x391a2fd317962118227a3ef0f473318220a4e94843d9c9be5a7b8c608c89cfe", + "value": "0x29a222e3ca29723c" + }, + { + "key": "0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a", + "value": "0x55620d0d1f6b3fc1a" + } + ], + "0x1": [ + { + "key": "0x8b9b", + "value": "0xb4ede87d129aee5d94af6e3bcc09bdf73b76ee1138ca98565069efe6353443" + } + ], + "0x5e4cecd764121b8547d6e0ebec94618edc0933f97918af264d4d7064e70dc36": [ + { + "key": "0x3b28019ccfdbd30ffc65951d94bb85c9e2b8434111a000b5afd533ce65f57a4", + "value": "0x7075626c69635f6b6579" + } + ], + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a": [ + { + "key": "0x3b28019ccfdbd30ffc65951d94bb85c9e2b8434111a000b5afd533ce65f57a4", + "value": "0x406a640b3b70dad390d661c088df1fbaeb5162a07d57cf29ba794e2b0e3c804" + } + ] + }, + "nonces": { + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a": "0x5" + }, + "deployed_contracts": [ + { + "address": "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a", + "class_hash": "0x2fd9e122406490dc0f299f3070eaaa8df854d97ff81b47e91da32b8cd9d757a" + }, + { + "address": "0x5e4cecd764121b8547d6e0ebec94618edc0933f97918af264d4d7064e70dc36", + "class_hash": "0x19de7881922dbc95846b1bb9464dba34046c46470cfb5e18b4cb2892fd4111f" + }, + { + "address": "0x65cdd7892656f7f89887c2c84bb3cea8f8c1b472a4f61838496c1fc7cc8733b", + "class_hash": "0x19de7881922dbc95846b1bb9464dba34046c46470cfb5e18b4cb2892fd4111f" + } + ], + "old_declared_contracts": [], + "declared_classes": [], + "replaced_classes": [] + } +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/state_update/37500.json b/clients/feeder/testdata/sepolia-integration/state_update/37500.json new file mode 100644 index 0000000000..246a7907b6 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/state_update/37500.json @@ -0,0 +1,68 @@ +{ + "block_hash": "0xf7471e29d9f546fce49b82c15eb3f2d62d27526884e7787277c9002b9cac83", + "new_root": "0x702f54f4fc777b52bfe061727dd0c5fd42e233a22c5f1f0015ebc5926ef6269", + "old_root": "0x16f20cc1f75887804afe3caf2b71634c01b2c88eeda6262c092a42c87f89c92", + "state_diff": { + "storage_diffs": { + "0x4b4f08b68696ba6ca3fd389029d9bb995b4766137d3b677531bbf4daf4cdaaf": [ + { + "key": "0x7431f86a4b86525ba04a618ee9341ba2700f9140f7d3a4cef2bed168853aca", + "value": "0x73d68a78c82678e56e8b773c93be758a2d78357e3873183df2113757249497e" + }, + { + "key": "0x27420377e357df917f46f7da15f75eef9a54209b04f0e7c1ced77ebf946ac22", + "value": "0x6a50b14efece100bb11677ee2d60b64ce87bb2016272b2f4680cd430411ff0f" + }, + { + "key": "0x57bf0d97a5df93699924802cca2b94f116b8143b5461eed2a22f1678924db05", + "value": "0x1a809bc02e2b01f90889c9f0f12fc328bfced04b5682c5ae560a83a8ea5f66d" + }, + { + "key": "0x64382489d9f51a6bbd49f2790a0d5d085bf9e4819ebfe9ada2129000ad8279f", + "value": "0x77f4adf16a16df35338fbfa45678d3428331df7240c9a2be7e3c66b832f7181" + }, + { + "key": "0x77ceef1f69814554b166b6eb599e12e7c950b8635c78e7fdb3ca1470060e85d", + "value": "0x5847d80389f672bf855d2c1e3a60ac472b67c7a92b00eee9e93ba7734a0e67b" + } + ], + "0x13185b3ac5099a063cad6e464eb30ffa6a2852cb4a66de900cdd8617b7e3f9b": [ + { + "key": "0x3d6933bfd424d3116f778553944913a49af3b8a33f3bc830d5b1a4e1e462998", + "value": "0x44462f71dbc43b3d14b2c6a24535e5d68e50a5bd02bdc1601a5c0944a799bb5" + }, + { + "key": "0x49667a6a1ed14647a07a7282dbf17a06cc133f4abcd3274b27a914e6fcbf89b", + "value": "0x3d033db8de9c3d64a3396ee9c875bbc68556cc9f2951ce58d645c014ac79b22" + }, + { + "key": "0x5824decd0a03f4a6158888c7b32ab20a3c7da4a2111224736d8a9601ccdb128", + "value": "0x5a7a736db3204fe897ebe35170d303011ba6894dc669ae2895d7d252c8b7d73" + } + ], + "0x1": [ + { + "key": "0x9272", + "value": "0x130895094f3512f385588f703e3d773bdba31b19da08efafa3e5f971f3a586" + } + ], + "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d": [ + { + "key": "0x391a2fd317962118227a3ef0f473318220a4e94843d9c9be5a7b8c608c89cfe", + "value": "0xf1bc7d75ab4802d2ea" + }, + { + "key": "0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a", + "value": "0xa76689b06448a4a2dad" + } + ] + }, + "nonces": { + "0x4136ff8eb3070b7141dccfd95e248ec747a904433449f3ea9e80664719c0f8a": "0xc74e" + }, + "deployed_contracts": [], + "old_declared_contracts": [], + "declared_classes": [], + "replaced_classes": [] + } +} \ No newline at end of file diff --git a/clients/feeder/testdata/sepolia-integration/state_update/38748.json b/clients/feeder/testdata/sepolia-integration/state_update/38748.json new file mode 100644 index 0000000000..4c9c79ee84 --- /dev/null +++ b/clients/feeder/testdata/sepolia-integration/state_update/38748.json @@ -0,0 +1,1569 @@ +{ + "block_hash": "0x40b9de4d20b6537151895df0fa2520be3639a2a2a65915b5d27855efd1d78fe", + "new_root": "0x4628191c1b4000fdd0f64686a38b4701e42dafaa3ea730a6d57c55f69c3b618", + "old_root": "0x73490b361e55608d6572ce3ee39d686a71eab58b16511c9887498b7c2724968", + "state_diff": { + "storage_diffs": { + "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7": [ + { + "key": "0x2cae20d6f722dde1124d0983ef0949cef3ba37ecfe346a429844d7302fec2", + "value": "0x1" + }, + { + "key": "0xb71ac4583a03a2d436e6a5651a6368eff96896dda181f606ac3f540730470", + "value": "0x1" + }, + { + "key": "0xde610375ad32ca53161456c413aeda52a30e079684b361a2dac0164f8ad31", + "value": "0x1" + }, + { + "key": "0xe0b571af9e985c63c43fc77181e8eb525736ca838538f8b2e041265c5c2a4", + "value": "0x8e0f1cce8fb2b6" + }, + { + "key": "0x12f7e7142efa9318bec44c718867c7f30a126cb385e762d58a8c3414a362cc", + "value": "0x1" + }, + { + "key": "0x13a2e6345934de0330b6054740318571255adfe68447884562642c37234000", + "value": "0x1" + }, + { + "key": "0x14b313bf7bd5499a962f56784de028e80989f76c3434feb4323900ffab9165", + "value": "0x1" + }, + { + "key": "0x2009599232d246b2aef1a58d9a76c7229440b57524b439c5dc0cf62a8fef49", + "value": "0x1" + }, + { + "key": "0x22e05f5da5178ce7aab408113210ebad4c8a43b53ee5fdf198a05ceb22bafc", + "value": "0x1" + }, + { + "key": "0x287f381e6d10e828a757fb3ee6322014cccd6149f00590155d3005bbfa06ea", + "value": "0x8def3f68b7e9ac" + }, + { + "key": "0x2fc65d993d7d14e94cd22c97907d20829b13999de85913203ac12d736ade92", + "value": "0x8e04dcf8ef1e09" + }, + { + "key": "0x30064e218b5de6166cb8d83fa96450096fa8e3271244164745d0aa63c7e943", + "value": "0x1" + }, + { + "key": "0x30e0b9953f9a9d0fc1dd6cb8aeb8d335467cefdd497c58acf17edce7bc89e0", + "value": "0x8dd702b0a830c0" + }, + { + "key": "0x31f93d9c536332f75bf6263f84cb1263d5d21b0300cd02ec89b764728256be", + "value": "0x1" + }, + { + "key": "0x48976fe95fa6666dc62894d929e7c65b37f6bed0c2cdc803ba1056f9d0d1c5", + "value": "0x8de98f1c995495" + }, + { + "key": "0x4fa19410ed187bdc944a74bb796ae1ccca71c3aec99aafc1d41db2501d9676", + "value": "0x1" + }, + { + "key": "0x56a8ab1f2c24d761800ce76106c30e6831a14195531f3b6c72913ea17eb3b1", + "value": "0x1" + }, + { + "key": "0x5bff0a41e2ebdb431c1a09070777ee717a3dece4baf74735b7d90bbcc7dcde", + "value": "0x8de28081d9fe5f" + }, + { + "key": "0x618a048a55d84fa64020eacfd3b4ce59c587d5463e677a79bf2b158ce24143", + "value": "0x1" + }, + { + "key": "0x6b4d0438d5c4c922acd7c60c97fb82ea0625486329d81b4d9448fa50c08c11", + "value": "0x1" + }, + { + "key": "0x73775f97fd92deba07cd0015a530ad86ac748c852db5fe0a234af8bc5a0b60", + "value": "0x1" + }, + { + "key": "0x759f422a63ea8637972d8ff09f4aa5cecbc84ef74d2ba06a9299a2e6fe87ac", + "value": "0x8df40831b1a904" + }, + { + "key": "0x7a927268a06eeea27e2524594f70fd28f2a6c38b74d34bd71ec9c500609a07", + "value": "0x1" + }, + { + "key": "0x7d7c6c149e2013aed4620fb6ca06525959a6e75e343ef266284e0878fa75cb", + "value": "0x1" + }, + { + "key": "0x88fa0739b9e0c1998d69df9ca6c23cd55cee4c6316e94d999511bd21b7d06f", + "value": "0x8dd0e1c8a8ec0d" + }, + { + "key": "0x92a49aa1a7d88feceaf880ae20b27e2c6997b9ba57fcdc149c61c096023ce0", + "value": "0x1" + }, + { + "key": "0x96cda0b4bdd4168c98c6444775ce5022b61a60719785a5f6e7a900e9cc12e5", + "value": "0x1" + }, + { + "key": "0x989062e46371d015d50706ac31ab4cdfdcca611eab53bd7564036ec8e30be8", + "value": "0x8dc535fa7f143e" + }, + { + "key": "0xabee496d61b8878d27cfc3b50b4dd5d0c8e8f892e4939dac9d149c4878412a", + "value": "0x1" + }, + { + "key": "0xae9486a43b9e064dd537eda39db1b791d15ca35f7faec363de43327b8345b7", + "value": "0x1" + }, + { + "key": "0xb1c69fe626bd6d931244ab8182901674b7f4f067d7ca2ed9b1633dbed68015", + "value": "0x8de704549f9158" + }, + { + "key": "0xb8f902834f83607565847c9de9eae9c5d3584c46c53cef97633870ac8b16a5", + "value": "0x1" + }, + { + "key": "0xbbabba018368d17e65266639f758ddf03489afa231203465345a15c30e6e26", + "value": "0x8dd56caf8eca88" + }, + { + "key": "0xc01655196d167069df4bedab61ede2a699e769c334462a67e2ebd003b9e21f", + "value": "0x8dd0c9c54ee898" + }, + { + "key": "0xc83212690db8edceeeea9145cabb8e12d754b1b5ed55f6de756ffd82988731", + "value": "0x8df994306f0dbd" + }, + { + "key": "0xcdca81656e7cf13114750ebaf0550e88fbb39ee345b5f933b093651663d74a", + "value": "0x1" + }, + { + "key": "0xcef8bf9734733322ea8c40c4141f022c045152513eb48f450a50e38cf59cbd", + "value": "0x8df5ee309d3d61" + }, + { + "key": "0xd0063537c3feca8f74e36c953a4bc07544f3487fe62fcfeca203351c7415e4", + "value": "0x1" + }, + { + "key": "0xd1dbf38f91cdccaa9872785ad9ecbb2c053f6bf629ca3e094d1c39adf87307", + "value": "0x8def65fb313496" + }, + { + "key": "0xd3eef632b9bcc00ae7e1a9ce52a3ddc2be5ad95c60c83fd6227a01a3fcd912", + "value": "0x8df2b5947d8808" + }, + { + "key": "0xdda3c201e24095a4f6e09060c36728ecdb39cddf4e407c65febf872a902518", + "value": "0x8dfa61a52e8ca5" + }, + { + "key": "0xddac96de2c4f2c5dc99e5a6c605215d2eb6ce37692aeec7e041600adba8bf9", + "value": "0x8df68fe97edf6b" + }, + { + "key": "0xe616eb3e1d77f413c69646ea22ca7c34a24866525ea50ab0d7ec769a742da6", + "value": "0x1" + }, + { + "key": "0xefd2b39bcd46eaf0cf9f8377dd6a5be0cfc1aa147abf6cef20421779b0debb", + "value": "0x1" + }, + { + "key": "0xf108bcb7b0bdd5a52f4bffa00ee6b6d7b739f368a41152002a237e9793d6a8", + "value": "0x1" + }, + { + "key": "0xf2e8aa9ba8b0bcc71ebb4a9d5a5fbbc2f3390c78b8727d71813ee40d964194", + "value": "0x8de5ad1c08817a" + }, + { + "key": "0x100683dc269178fc51b4dd10ac092617ba9730db291cf2448e6792ab68eb8c8", + "value": "0x1" + }, + { + "key": "0x1106ca865907c9fef52a56c2a1a243115eef151d62aa40e2e42bd5592e84ca0", + "value": "0x8e02f0dd34f23f" + }, + { + "key": "0x113213df70b3275e8151d385747206004c3eb89d5e462ad14ef6a7b7093a774", + "value": "0x1" + }, + { + "key": "0x115467517b2abc844c25ba953dc0a883ce1c9add4691b05fceca0d5e5c5f36a", + "value": "0x1" + }, + { + "key": "0x116909e9d173f4409b3145e1224f72b53aa74983250429c48af34e2772680e9", + "value": "0x8df3000f76d86a" + }, + { + "key": "0x11f603d9416d64faf8a3747a1dcbb544b94dbe55b3900a0cd511ca476e9a307", + "value": "0x1" + }, + { + "key": "0x1219a6a260cccde0d684a1140650f9c432cf192cd83ecf8b0b34968738b17ee", + "value": "0x1" + }, + { + "key": "0x12786970fa4ce7b3fbd843714c257c11fcebdc680a58b1cf1d94ce4a60af797", + "value": "0x1" + }, + { + "key": "0x1289e62b80dd306f7ea8b71a1c28e10071ca64725670488356e0a152b2400f0", + "value": "0x1" + }, + { + "key": "0x12b29a431dc3c6a4d96e97726f942c8fb179034eea0c80a1addddd21f5262c4", + "value": "0x8e0e7145dfc190" + }, + { + "key": "0x12dda0fa98ec2b3923a6dc72217e8713770fab8ddea661519a0594b81ecd0be", + "value": "0x1" + }, + { + "key": "0x12f5b2bc51b8f163647f2fa1ef9a63cd2588374df6a0f5942d4a7e29978fd02", + "value": "0x8def3025f73aa8" + }, + { + "key": "0x12fee4c3c17c9102aaf0ae2338d0843e2164d7d065495ab5bf7f82e0884cb5d", + "value": "0x8de8d4689ae8fa" + }, + { + "key": "0x141b8120f330f3c6a0ae1e539e47690be4631885f1fc3872e31a963012197c7", + "value": "0x1" + }, + { + "key": "0x15298672b0aa6c2f54c7c1b4e7590179d7778f06f2bf62dd571592db91b099f", + "value": "0x1" + }, + { + "key": "0x15eb6d26789365ad79b97f773add9f3889bc8ac78d927d4def3a890942260b4", + "value": "0x1" + }, + { + "key": "0x15ee6676d75dcd4ce80c0569bafd56bc0646f472db8afb1a23de9267eb12a54", + "value": "0x8e03112fc20dd7" + }, + { + "key": "0x160c2313996fc20a4362c1cfbfc75cbb759cddf60b71f9109e42c2cd6bb95a9", + "value": "0x1" + }, + { + "key": "0x166302e10581a8be4a62a69b444a597303eb0a61eb061b5c7291984272c90a1", + "value": "0x1" + }, + { + "key": "0x16b9a5031f51ff40e40a21b967c588683c12ba50dfa59b06a9388b65da573a8", + "value": "0x8ddd921e0f0b6c" + }, + { + "key": "0x16ce4042a2e2f63a3e851cc0be9f55eb21e855e911bbeb97c58cb3037b5acda", + "value": "0x1" + }, + { + "key": "0x17406f542e0274a3ab640886d63e067117bf78e54e8a59591347ac1ad6bb078", + "value": "0x8df175eb1e5d5d" + }, + { + "key": "0x1770bf09f252bfd0d116935fc5c4a28db8e5bb04b4d295719ed65b7c411fd11", + "value": "0x1" + }, + { + "key": "0x17acc29a46421ea750f369aca35a7353154d69782012558224233d0f076d948", + "value": "0x1" + }, + { + "key": "0x17ca79278fa640b884e60c33c98d62ad1128ae45bf87ce0c843b07909d335c9", + "value": "0x8dfd30f01085f7" + }, + { + "key": "0x17fa7073da7a230a61630f45f03da73e0a25df0880eb3803f2f9f69d613e96d", + "value": "0x8ddc4655781151" + }, + { + "key": "0x1803a29070da1e3bb9dae113fbc9ccab377eb6d8d71892e14fd7506dd683ba4", + "value": "0x8e02eb5d70b3dd" + }, + { + "key": "0x19c30afe905a53fb0a1813ef53574e39235902811c8b713a29dac93a60e1ad2", + "value": "0x1" + }, + { + "key": "0x19efce91e78b59d7ca89486a06606bb1bd4ae0639a55360e5516cdc761e3e3d", + "value": "0x1" + }, + { + "key": "0x1a3e973bcb75ed42e272ce09f7070b04f85661808696fffa04791b32d062963", + "value": "0x1" + }, + { + "key": "0x1a6dd7a72633a4bf9ef1100907db3510c6acdb35c48d69de9e6e69e522d24b9", + "value": "0x1" + }, + { + "key": "0x1ad92cfe00915dcc095058dbad0e824075bc26479a38086fdfdf86904d4bbd0", + "value": "0x8e013a26c36d2a" + }, + { + "key": "0x1adfce0f896d673330146d7454aa8e04679423c958645604aa74a7c92da525a", + "value": "0x1" + }, + { + "key": "0x1af46a2b2d04a1320df3966e1e86c5c2b145e5fd4aa25ff8c7b9fb99a95c4d1", + "value": "0x8df79369a515ff" + }, + { + "key": "0x1c5257db686e02021c4526419a6b4391bed7acaa3b910c32f42fb6853b3c6eb", + "value": "0x1" + }, + { + "key": "0x1ccf7f4e6e9b4c33e43fb60b8217cbb2eb9562a620be3bf39fe746c1c7d3a10", + "value": "0x8dfd7a4c6c1f8e" + }, + { + "key": "0x1cf29e3f2a24694f6842f313f7f76fcab97266c68ae0a4498bf37faeb53ac65", + "value": "0x1" + }, + { + "key": "0x1d5da14ebcf1f6d53c8f643921f0f5fc3ea41d5eab14ecd6a376f60fa27e384", + "value": "0x1" + }, + { + "key": "0x1d89ab4394ec415bfeee0f45367832d44a3bb8c06011d234e06af8c40d08804", + "value": "0x1" + }, + { + "key": "0x1dab879fd6928781d860817b355e4f378e02cf2d0427525433fb3aacd5b9ebf", + "value": "0x1" + }, + { + "key": "0x1f1949836b4f32a9aa35965ff4d5a16f0f6b997ea8ce8bf2bdf93cea54849fa", + "value": "0x1" + }, + { + "key": "0x1f4e6b90eef5e926c2b118cb4388b8096df355183c325427f42072989e7de7b", + "value": "0x8dea27354382cb" + }, + { + "key": "0x1f5315afd677936a3d010a8ec48408db437d86f51a1bfeaea9227114e45d2e6", + "value": "0x1" + }, + { + "key": "0x1f5a8e5dd66d11fc3458e533a815d872faf79fc86a6660c4a710f41156863fc", + "value": "0x1" + }, + { + "key": "0x1fedc5be4429da6426371213532d9f3880fcc320bb3eadc0b6e1977b860783e", + "value": "0x8df0477789b757" + }, + { + "key": "0x2085b4645ed3c7310c005ab0491a6f678ec12a5a48c7e620eb289fe88d3c4c5", + "value": "0x8de8056857064c" + }, + { + "key": "0x20e4d41d299ddc0e0485d23b8646e71d5366421f9557c52a53fb55ea91adc37", + "value": "0x8deaf9cda4cd93" + }, + { + "key": "0x2168079a832cdb9aeda11ee820bb53d4ad872cea717ba0c885c75af48263239", + "value": "0x8dff5237741c8d" + }, + { + "key": "0x21fb49b41efcaaaebdcdcec8afd8af300ebcc04f10174754baf279197809110", + "value": "0x1" + }, + { + "key": "0x2200d80fc115010ff512eddf5b530e0557edc94e17c216c5c13ecfe4bf1bbf7", + "value": "0x8df85d970d1e8f" + }, + { + "key": "0x2201a9c60bdb707184a55eec2664caa29d7d5b41ec4dafb90b72dae5bbace83", + "value": "0x1" + }, + { + "key": "0x2212a060701a4cc5987dcec8644cd6d1c09e7d4a4810ad0b908985dc25a86d5", + "value": "0x1" + }, + { + "key": "0x221a643ebc1e890665b3651e02d6e04a904b40ce350746a34a11e1088ea22a6", + "value": "0x8dec6538b9f70b" + }, + { + "key": "0x223dd1e237404fdc9550fa7c16a346c08cdf8ea6ede3beeb00bee45efaf894f", + "value": "0x1" + }, + { + "key": "0x231e43460d7481352e1e6cb1cf83be630576de46a5cbced941b2fb1dac5d8f1", + "value": "0x1" + }, + { + "key": "0x235b30788c547d428ce5386013a5d8c2561b40e48132b7eca3e0f24b0b3a2ec", + "value": "0x1" + }, + { + "key": "0x2362aed92b9ab80bd6dd095a81e1e2890875c4d820a54bf36705e23a074a34c", + "value": "0x8de49ede4a1f43" + }, + { + "key": "0x239970446a52db27f8acbfcdf462813869ef8b57b7ee83801968f35da4a7989", + "value": "0x1" + }, + { + "key": "0x239d38c852d14a9829e56f115820b7d34e7f7ed2239dd12d9721ddc815ba030", + "value": "0x1" + }, + { + "key": "0x239da6b5e1db92a2e113b0ba67adc0cbfc46b07dbaacaec2708044b5d3dc592", + "value": "0x1" + }, + { + "key": "0x24276aab142df614a55c01a8c81619edc0ea7541c5a383d728d85c4a92c330e", + "value": "0x8df6bdb0d6bb7d" + }, + { + "key": "0x249c824819071a7861473a6faa19e871e5e372d80b7d18fa231b61b979af359", + "value": "0x8e0a70088e8425" + }, + { + "key": "0x252b975029573b7a9bc18340adbf4318a3bdc3c0a155cf342426fb35dfc7859", + "value": "0x1" + }, + { + "key": "0x253e1f9a0b7d6f3ad8ac55f27a1952328e9d15dd4d02017d89e65350ac5c558", + "value": "0x1" + }, + { + "key": "0x2656159dc3e67fb2909119669c12be1ca2aa54c0b6738aff46d3b194f6d1a44", + "value": "0x1" + }, + { + "key": "0x26e8e0b9497a85a22d6859fb2a2bf48cd55a6637d145bb51c82baca0f150e3b", + "value": "0x1" + }, + { + "key": "0x277cb0bcd08397d8edd4f1b5bb31119607c9dea9b4e03f3acf5eb066a4e4119", + "value": "0x1" + }, + { + "key": "0x27a143237c4443f6c79aed401c840bfb6e1df259410880dcc44012a5d46bfb5", + "value": "0x1" + }, + { + "key": "0x28ef9a15fa52ed4314c2eebc1dee7c75ecec3489c6505cd2b4ee78f754377bd", + "value": "0x1" + }, + { + "key": "0x29449b45f1505e52bf9ffbebc53244e7159a7082a5eede1df0e81663a0d45bb", + "value": "0x1" + }, + { + "key": "0x2947bf059e9a75e783d22e487dda212164ab9a137ee8d3a55616646d06da8b1", + "value": "0x8de1326de79568" + }, + { + "key": "0x29666eb7861a1d9920416e69866e52e313c25dad889a4fd3a22821b21f4420c", + "value": "0x8dc37cdf8982b7" + }, + { + "key": "0x29b16afce4e8df93a2fda5923cf341855b9611f7ca906c3508863c39b6947ed", + "value": "0x8e07c2f00a8643" + }, + { + "key": "0x29fdee1fe99092296f5250f22665d5b77c287f9922f22d5e38df0238a9f8521", + "value": "0x1" + }, + { + "key": "0x2af44e2283c0b984704f65d15917d3ce455eb8fbc0e90c7b3025a5d16366ce2", + "value": "0x1" + }, + { + "key": "0x2b2a9fd807202cccd36cd7017ef1db110057adf2ef851a3917a61673eeff7c0", + "value": "0x8df5525d94a2ba" + }, + { + "key": "0x2b49603fd5c1ad46eeec972d61afe1db7c975f2afec1cb5d10e525b836f09c1", + "value": "0x8dfad8027ec0e9" + }, + { + "key": "0x2b9b7d18ab9282a4cfcd33fdf050cb4a8875c3ae25630545d2f198b920fceb1", + "value": "0x8dea36ab2c8dec" + }, + { + "key": "0x2ba233b611d3b999844b8db9fa589f44f7d010de536733726a528c61a13f15d", + "value": "0x1" + }, + { + "key": "0x2baef9565c3521f9872bf8eb0c05741e2228d6b048b9c1b6537d91d82bcf3d1", + "value": "0x8de31b655b01be" + }, + { + "key": "0x2c1ee4a677d9f5ae7eb16095be6174643dd8c5d5676e74171b8f72b31753e0b", + "value": "0x8deb822ba4344e" + }, + { + "key": "0x2c5fe596b0140488335add24f94205564eabe942bf5c2d238e840bf862d60da", + "value": "0x1" + }, + { + "key": "0x2cb69bf0e86898d6ae450cc20b5ee74c1f3f89f55f65706f7d2e6f551409280", + "value": "0x1" + }, + { + "key": "0x2d5c92f36942c2a94a15a8624bbc11c3f8585c9e20b2c9ef9a9999c8ebee626", + "value": "0x1" + }, + { + "key": "0x2d5d0843aac7bd6c72204fbae61fac4d27be78267c56956aa5a4d47333e8edd", + "value": "0x8debd947c829f9" + }, + { + "key": "0x2d617dd390070b4c93930044812828c11f64915b520d70c8d6dc195d5b1d192", + "value": "0x1" + }, + { + "key": "0x2d7a6e385f57fd8da3f1eb3b1b8df1e329ceb457481a718d66ef98d06cdf264", + "value": "0x1" + }, + { + "key": "0x2d8e2187213b4af6dd3d3c5dfa38df554091e216799fc773a71aaba8bda4b2e", + "value": "0x8dfac0312890c7" + }, + { + "key": "0x2daaf788fc5e7fe1752059090cd2276dca5e8e68373cfddc131b2e73f1abdad", + "value": "0x1" + }, + { + "key": "0x2e6d9a4fb201d3f4c69b3cd83520b451f7a0fab7a2b9dcda06543f5c0b7f3de", + "value": "0x1" + }, + { + "key": "0x2e794994f9caeea310a700b186586e272769e602aa9f0e5823dc9b57696516a", + "value": "0x8dfb6a4b3ac23e" + }, + { + "key": "0x2f7ce7e4af10f103a30ae0055b922b718bb9ac6ffe6350227fda32c159ce285", + "value": "0x1" + }, + { + "key": "0x2fddec9d4d430c1e252f399def60dc851f1fa7e777ed81a8c75a18e6b5639f0", + "value": "0x1" + }, + { + "key": "0x2fe0458eb51e935a73b881338873dc040f3d60d1fa156f2a775864df819faeb", + "value": "0x1" + }, + { + "key": "0x2ffa4c4c8d4a0c3e6855e316190ea3839f6b382f4068413c85119dff34e067e", + "value": "0x8ddd4904ec45fb" + }, + { + "key": "0x30bc4c4197cf9e14b9d6a677a71f394fd160fd22a42c54fa94996c2c6ca9fbf", + "value": "0x8dd0d9f8614785" + }, + { + "key": "0x31b7b54d177f1afc53af67ebd60d7fb5b4066995ed7f5d1fadba3ac6824b06c", + "value": "0x1" + }, + { + "key": "0x32442a6d2db6867682f871abecd2595b41182a259968d23fcc412ed01aa6f78", + "value": "0x1" + }, + { + "key": "0x32b4bd77abdbb7b4cff8e1a5eab723fc9cd48ad31d8a13f8ca40a3145a89ae5", + "value": "0x1" + }, + { + "key": "0x32f78216c1f67a465460e0457c8af4def2b264821fa7e6f0e0eb4ecd7c3c064", + "value": "0x1" + }, + { + "key": "0x331a9c84f6c01410722b3943541a966f3a7a1fe4c2c6cc310e39a8901d0b882", + "value": "0x1" + }, + { + "key": "0x33246439787adf7836a6d596d30837ab876e4cc4e301354b311afc3aa228646", + "value": "0x8ded5e57ee8316" + }, + { + "key": "0x33b0fb0ce3ffca1310574d80e71e3c828314e95495be0130b4df6ca60289bd9", + "value": "0x8ddc858e79fdc1" + }, + { + "key": "0x3455e66d5bbe58b8f930aec6495610bda3028028706604b3698a903e275420d", + "value": "0x8dec4d8e9cb4c8" + }, + { + "key": "0x3457adb01684a7809a4040a308945fa82a28c6877a8580babff35f4cb69552a", + "value": "0x1" + }, + { + "key": "0x347f9cedb47cb3e80815cdc4542f003d492adabb65e81830a49876aaa336d70", + "value": "0x8dd2a4b74208de" + }, + { + "key": "0x34b3b591e1a5e575089bce3ba39411210c649ef7df9aab08a6e1cb6a54e5eec", + "value": "0x8dea10d19e2195" + }, + { + "key": "0x35741e597b02b407008393501930f2710417f813755f12911f9870fdce473b8", + "value": "0x1" + }, + { + "key": "0x358b654583e17a6c89524f324d1da661daee25ad440a4e5a764feb05fb4a441", + "value": "0x1" + }, + { + "key": "0x35f465f9f9d107296bb7f689d9ddb81d5e9aaa6f32e681614ee6b8884b1a3b4", + "value": "0x1" + }, + { + "key": "0x361b29905384ba563255d329328904422ae8d911a1705346926d12d42d09876", + "value": "0x8dcaa3774e643f" + }, + { + "key": "0x3661fb80ee0ff242083bd702fadf26357b961012797fd0c8f7289384e0daf25", + "value": "0x1" + }, + { + "key": "0x36e7701997c0e4ea018e4f9c6ce5df386c1b604ef0ffce5320295ec5ef85152", + "value": "0x1" + }, + { + "key": "0x37585865971c98086f810152171cb8e1ffa42e2ec26c9fd5722143b3e82b57b", + "value": "0x8dc55546c3c783" + }, + { + "key": "0x3855455efb485a3415b03833e4991994d7684172e7aa4f7ca36afec52e0c1cd", + "value": "0x1" + }, + { + "key": "0x389a00bc8bcf1b98bdbf9583d7df871f840bcc39bab2e0be1815115c648e6fb", + "value": "0x1" + }, + { + "key": "0x38f956a99996399ea2930964f8dbaae85272e199e180a339e49e8665adafcf5", + "value": "0x1" + }, + { + "key": "0x3904e0cea330a6df4a08b0c4e937c46830f1413f60bdbedd2e7fb1a6c93f172", + "value": "0x8ded5cfd834741" + }, + { + "key": "0x396cc5879320b85a09789a7f84a82efea9d40779347558bd15c0735aa67fb7a", + "value": "0x1" + }, + { + "key": "0x39a3e732737456e58a2446e1e553c9fdab84bfbdbb8be02ccaf843b347838f2", + "value": "0x8de3ea8e44079c" + }, + { + "key": "0x3a34da40854577852aa21e0cf4b778ce32bd89ad39cab3e16e627716127f054", + "value": "0x1" + }, + { + "key": "0x3afcc39fa40cda7719382e517ee9d07001b44f43a5c0951c5569820f8888994", + "value": "0x1" + }, + { + "key": "0x3b50d30d67076f3816ae943fcf25678ef5a0ab731cfc403f7f3a32a9e578a30", + "value": "0x1" + }, + { + "key": "0x3c4a17fda8826b30cfe651920477bb557de62050147685bce25ad5da4e3b7ee", + "value": "0x1" + }, + { + "key": "0x3c4b4f729c6d762ece6d1bcec5efde6e101722df6a5a67682dd7a4e0934cb2a", + "value": "0x1" + }, + { + "key": "0x3c57a74c779f6e2831b3a9c6b71d7bf3fde76998bcaebca74ae1f8a4c6945c1", + "value": "0x1" + }, + { + "key": "0x3c77eb0db214b949e5486cd43db06732d55cbdacabe43c8c9bd4e9c827d0697", + "value": "0x1" + }, + { + "key": "0x3cb7630d6cd6f91577ac5cbc2a66d360277a6de42e9fe39d38a7429780fdc47", + "value": "0x8dea88c507eb91" + }, + { + "key": "0x3cccc184b0b291fe23633d15f9a2a41201bd07d77ebc1520c72c8cf48155c47", + "value": "0x1" + }, + { + "key": "0x3d46b8637eb650c14015c4a3136610a3bbddd08d09c4f0b790e1ccb480e3e15", + "value": "0x8dfc28d6e2053b" + }, + { + "key": "0x3df82d63f61c38b16492abf032970595c5f95b2f977ae8f1572f9bb27ada1f0", + "value": "0x1" + }, + { + "key": "0x3e8b019b30e28438d9868f7bd1f5ebae4fd115105818666dc59349fea8079db", + "value": "0x8dfd064285cbb0" + }, + { + "key": "0x3ee4f14405bc87a76448263a4d1d6c8a74aa232f3ef433ecc2d4b0b59437c89", + "value": "0x8dde6da88fa9ab" + }, + { + "key": "0x3f39a3610f2d8c3fd1f3a14bab9a0ca3f91c91138b3f523a4788fe3eefe22c0", + "value": "0x1" + }, + { + "key": "0x3f658f512bbfa0885fe4cc4594c46e58eef091313aaa938704acd8c205ab69f", + "value": "0x1" + }, + { + "key": "0x3ff50882b640c3eb73194990145c971e9fcbb8faa75a2b72fa4f2b1ee9fc185", + "value": "0x8de2c8cc43d2c6" + }, + { + "key": "0x400a6d4ecbecc894010216a65688fbe8fe6f3a5bf5ef94156acb235255eef90", + "value": "0x1" + }, + { + "key": "0x41dff08191913269b91db46de107b705a34206ca66f88b2c47a979558c5171b", + "value": "0x1" + }, + { + "key": "0x42663116fbc7689173bc13bed9c673df82e810c80f8e40fc55cd0d643a58429", + "value": "0x1" + }, + { + "key": "0x428d123e9c718c602afef4f9a2a7eac3ed4f138cad6f1b81f8881502c17e4c3", + "value": "0x1" + }, + { + "key": "0x434445e006464139b571d6823e9a0adfa2ec8815f6c6ebeb7c298176360819c", + "value": "0x1" + }, + { + "key": "0x43600a6940c44f5ab3a775f2feaa453942308e80192879872e03855b7cb7725", + "value": "0x1" + }, + { + "key": "0x438d785f138e852a09140662761e7297d9ad296e62c09b73bac2941d67ef2b2", + "value": "0x1" + }, + { + "key": "0x43d0c436efa280d0df83542b6f8bc5f8ff8b00131f1c200ee1a5a33f8f19f76", + "value": "0x8dd28d50dfcf17" + }, + { + "key": "0x444579fa1991ff6e3ced752cb179258cdbd2f69f254b262ae802a8e338dc8ad", + "value": "0x1" + }, + { + "key": "0x449e523db4d1e3bfa9c2f745461ada9bd6986694cd8abc3dbdaaec564da75be", + "value": "0x1" + }, + { + "key": "0x450c8591ca0539225510bb1c0e9ff53b5ff68337056fc5195dd6c143ce2eb8a", + "value": "0x8dd3e28b756cfc" + }, + { + "key": "0x4624a9217017c8f9b89f064ce13ed6d7e1ad7808c89329ce8fb0ab9cff54f6f", + "value": "0x1" + }, + { + "key": "0x467d7613318baa61c07f9855a432380876592346b9de1703442f6cc1c5e6603", + "value": "0x1" + }, + { + "key": "0x4692da77a7b0b76e4116bb922b56432fae68ecc84a6a252725d2b2c9b2a3d6a", + "value": "0x8df68103289b30" + }, + { + "key": "0x46a3e3c657b8d77fbcd61407b64079f131354a5fdc2b5798d7a9e2fc0531244", + "value": "0x1" + }, + { + "key": "0x46b254458f0e949a6c5c0d30d7353ed8673ab5f15ca81964c10e91230032ff6", + "value": "0x8df64e2efd7137" + }, + { + "key": "0x4765dc79df8b2ff9cb00947b615d9b22de878ba18ef545e4d56183493dfeb00", + "value": "0x8df6c4a99e4510" + }, + { + "key": "0x47b472d9b2e8295957ee17958cacf864b23882c650a3e030f0be4545b5f82d0", + "value": "0x8dff0958ae2138" + }, + { + "key": "0x47d36c76afe2ddcb1d6fed0a05733ca6087f52dcc77e36962f34b4a2d6715a0", + "value": "0x1" + }, + { + "key": "0x4800a46d53a452cef06412426027b97aa5bf8ede2f0ada3a6572d54af59f4b7", + "value": "0x1" + }, + { + "key": "0x483d45474228b56426807712d629994f62dc3af3848f4e08862265be773ac3b", + "value": "0x1" + }, + { + "key": "0x485d3b59026b6de0fd5da944569d5afa19ce7a84b8c684f4d4b8d8fdb379732", + "value": "0x8e0e73f3274a2f" + }, + { + "key": "0x48615efa52cd3e67bf1bfbc679468c953bd243291248dfc86732a6edc515a84", + "value": "0x1" + }, + { + "key": "0x48b9c695cea50493e2dee8795661cc06484682b34200b91db89e4dbec3596cd", + "value": "0x8e0c71ea61b57f" + }, + { + "key": "0x48c26133bd24fe0d67e5bd2d3d0dac8119bf7bce5752e10e79a3a6936ad5703", + "value": "0x1" + }, + { + "key": "0x4926244e3947504cc44d6eb31416bf3d2d72b21ec923b77aa3bbede744cd299", + "value": "0x1" + }, + { + "key": "0x49849c5ead978177920a1178be1c9b0e9caf97cda93104bf193cbaf0277684c", + "value": "0x8dedffbdbae492" + }, + { + "key": "0x49e3975d754f726f5ec605794b6c676c77a40e8ccfd035d0ca27dc23ebcf43b", + "value": "0x8def750f8a5cdc" + }, + { + "key": "0x4a871ac8b63ca66409e0ed2b983dff213223379e981d2858c2ff16164b469e0", + "value": "0x1" + }, + { + "key": "0x4b3cac3b282bc2496af9d4e58db75cab212cffdd0118d9e0787bb684bad2f99", + "value": "0x8de807541e417c" + }, + { + "key": "0x4bcddc63760285ba6398028935f62e1d07cb9326ce5959953dec0a6b4ad77f0", + "value": "0x8dd4bab63fcb7d" + }, + { + "key": "0x4c4526af15d9abddd2c26d3668620ededc9af9055e58912a04e4ed2c58c5ac9", + "value": "0x8de091cdd8c09a" + }, + { + "key": "0x4c972ed4926ddeb69bb20b873f57d28cd768a98607f56c75a6f5be3d0aaf2cf", + "value": "0x8de1bb0b67560b" + }, + { + "key": "0x4d0f7e249d7d03a72484973a081bb479a35a25550e5028e93a01650a993cdec", + "value": "0x1" + }, + { + "key": "0x4d9891e4da4d9cabd9d6530352f4b429035a9dd2d6f8991c93220799e8343e3", + "value": "0x1" + }, + { + "key": "0x4db6898278f59f3f669f50f36fa0052726bd0a64d79ac8f7c84b8435c0dce82", + "value": "0x8de8a245cfa492" + }, + { + "key": "0x4eef7e71f2cb56d1b2032b387c79a6e3d3fe23016beef73167990949791bac6", + "value": "0x1" + }, + { + "key": "0x4f03e428db4a998e6116a8aa8db9523afbf2ce9883e5bc9e7e2ddf67ea1f437", + "value": "0x8df4b23b3c73d1" + }, + { + "key": "0x4f6253109b4cac2bbec754a2eca79359a5f06d0cfa048e8ffc13a1b385dd8f8", + "value": "0x1" + }, + { + "key": "0x4f69aaa85fd2abc0e4d8889ac52d5b0ec7321389d25f8e9e3566323cbfa2a2b", + "value": "0x1" + }, + { + "key": "0x4ff39a65a7078cf719d42b81fa55137be6e113eef335d43c5ef77d1d598b017", + "value": "0x8de473cc0aeb0f" + }, + { + "key": "0x50a1abde7ac8a250da7d26e053aa71883f182cc599278f42b27ef98964f8585", + "value": "0x8dd3c823281bda" + }, + { + "key": "0x520f5fbc9812c45b4c7c8c3fdb44d3efd70e9c5ede3664a0a60cc61e3ca3e14", + "value": "0x1" + }, + { + "key": "0x524d68345533dc3112a8adca7ebd00db09033d0d843b917d24e916354b6ca8b", + "value": "0x1" + }, + { + "key": "0x53a47d355d78e426b17c4c2a3891b15c59cf15e77a7194d30fc7e511d25d9e0", + "value": "0x8dfcceaf7ce6e0" + }, + { + "key": "0x53e554d61078d36e9f9c792f23a4d4db6b29dc4e8b3e9f8ee1ee1166cccc515", + "value": "0x8df29ed9799f08" + }, + { + "key": "0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a", + "value": "0x55f0dd811994b2a93" + }, + { + "key": "0x54984012f1f5027e1dca6600bf9f24ea9cfeccd5c15926714cc582a55bcca3e", + "value": "0x1" + }, + { + "key": "0x556c77b8426528f7a12f0c6db708ba5b195152c0329f0e242184686ed9b2490", + "value": "0x8dce7b07af5c81" + }, + { + "key": "0x55eedd99b3c640f2dffa94d3d7bfe1e75bfa3290496f7200a7c2ca1852e0df1", + "value": "0x8e03be134dbd50" + }, + { + "key": "0x573666ded98c097dece5dc928e752d5ac46e22c71b02f12d02078f47ca001d1", + "value": "0x8ded7e404eba1b" + }, + { + "key": "0x57963069447dcd8b95809ac3be92fa00f533264cf0dc3b48670db3cdafc1395", + "value": "0x8df056380831cc" + }, + { + "key": "0x585c5db4d99d90733684d6c8b7eadc4ab894ab1a9e610ed405c9a449200b523", + "value": "0x8dfc5369706d76" + }, + { + "key": "0x586e01797305ad6031b9d42351921efe615f3ce2f14c46062be90f58842644b", + "value": "0x8dd0317f9a81aa" + }, + { + "key": "0x58d09e65a09ea242c974f98f0c0c4dd69a777f595de4698186b1ee77cec6010", + "value": "0x8e04614a4a77c2" + }, + { + "key": "0x590bf74e426f1ddd41909047e4edb59fb769e818a584548bd667f09b266c6dc", + "value": "0x1" + }, + { + "key": "0x595f8bd5646ead1e7964bb92d3f14bb8167bca3a8ca45f466dff0b914c677a5", + "value": "0x1" + }, + { + "key": "0x59670ab395bdbac1b3a8c4009b738badfa74cdac52f74b2b13931dcbfa20131", + "value": "0x8df6daa853acf4" + }, + { + "key": "0x5974743be3f049de3187e08b2af31a47ae86df5b7a9a9e95f00455d16802b20", + "value": "0x8dd9292e0c1e77" + }, + { + "key": "0x59d8be276b904d76266be6f3fb22ff560eb387a36f796a39d414fef917429b9", + "value": "0x1" + }, + { + "key": "0x59df3b8a60482b7a1483ced9dd8ae9522c2ac282e1da1c0b7eaaf208df64b1e", + "value": "0x8ddc8a52e60fb2" + }, + { + "key": "0x5a141bbcd7752d2059f2bdbf070d7071c6559b6df61cac1b78a77ed63270eae", + "value": "0x1" + }, + { + "key": "0x5a4170aa7ded377b9c7f1d0256d079be3400b1b18b54d5696b221c3b3914331", + "value": "0x8e0dc8a4f45c3f" + }, + { + "key": "0x5aee1722c2a4e24ad53a6cedadeb45fee8c6ede9a4ad14d8266b43196fdd3b3", + "value": "0x1" + }, + { + "key": "0x5af084d9f883c3ca2810e715936ab4f624d21d0c5886a62b5c5bf28c34c134b", + "value": "0x1" + }, + { + "key": "0x5bdd9bbb239440dfa26f37aebc86320877d870be701c7e0e60c848cabb4f2e3", + "value": "0x8df0d19486c01f" + }, + { + "key": "0x5c41fead4a1ce2479da98eaa149ec2597fe4eda2f83dae91f9add1149b683f4", + "value": "0x1" + }, + { + "key": "0x5c62aeaf526cd94bb6ed07c9d66750d39dd08182df4b2ee87df92c0e3ced406", + "value": "0x8dec97cb8e1506" + }, + { + "key": "0x5c9b982bde83ad8cd8f4f68dfd6dcf5f35bfc7c8fbbb7fbd19a93bc27c5e4b9", + "value": "0x8de15026533b1c" + }, + { + "key": "0x5d0e6d7247e0952473d2c3105b5c28d9f349d1131fc1fe6180fce90e638c8eb", + "value": "0x8e04ff5421c7f3" + }, + { + "key": "0x5d1ff1a3106ca278be0ad4336113d7bc65a841e99adf8694bdebbed88081848", + "value": "0x8dd8ea25a5d8cc" + }, + { + "key": "0x5d2e0b7aa7fe3b46501a9ed6724769ac4229a7459dc22036511a1e4800b847b", + "value": "0x1" + }, + { + "key": "0x5d8b5cdb54285f0077509094b9f9e4a16eb0f1d28b3c49e99b451be886fa5ab", + "value": "0x1" + }, + { + "key": "0x5e261f7cc9bfc56d28bdc4e01e110a9f47c8afdfdf976893350d465b05f6a3b", + "value": "0x1" + }, + { + "key": "0x5e5ac122f1bd5cf60b302e661bba571b87047a4232fdb418e9ea5c2d0148157", + "value": "0x1" + }, + { + "key": "0x5ea17cadf9cc312fa00c6a31b76bea87dbc970d903461d1aa5818f274ff93e0", + "value": "0x1" + }, + { + "key": "0x5eb8e1bb6baa45ca2c6192eea33674bc22782a8f63dfd42915ded0631f06182", + "value": "0x1" + }, + { + "key": "0x5ef92b14bd604fa164defb67038b774c831fdef6fd2679490deabdd8bc6b541", + "value": "0x8deb831cba94fc" + }, + { + "key": "0x5f19b0750c2e59be5f24fdbda322eecefaf39089ca31eb241376657106cef04", + "value": "0x1" + }, + { + "key": "0x5f5a37308679b2838b6893a0bb977bc7509b5f31d2b246e0b76c4051e921cdf", + "value": "0x1" + }, + { + "key": "0x5fa1c3e53547ac4f7376415a8a6c28f19c6835630af7fec71c35de17e06d1b1", + "value": "0x8dee49535a0fef" + }, + { + "key": "0x5fe9236c79c9fc8ee7e5efe2646a001eafc9e51711e4f0a9e12342bd12eff72", + "value": "0x1" + }, + { + "key": "0x602947848bc5c77040c8416d3b68103bc37f1c593df4d91f9e3059505ffd940", + "value": "0x1" + }, + { + "key": "0x612fa032a6b469d619750a711aba717c2e86bd2d9f805f7905766f5c5b9428c", + "value": "0x1" + }, + { + "key": "0x61586f90b94364db496927f36aad0359b95222492a0b76058a60f3d168d4a8c", + "value": "0x1" + }, + { + "key": "0x61885371c96c6bdb3340ec1d747fd6b9940e48dbb36e1447be1d58f605d4677", + "value": "0x8df03104cae30e" + }, + { + "key": "0x61a3a43fcdd2c641a858d51d03d574702a5761478c9806f16b076ddcd39b48b", + "value": "0x8decf6f201f338" + }, + { + "key": "0x6260962b86043946be8e838d17d9e2d0ff737dfca64d5e8561bb98c48fda105", + "value": "0x8e02575b8a2c99" + }, + { + "key": "0x62714224de0774c23fa821e1260d25d631c1f52071d02d0d1902752acbef438", + "value": "0x1" + }, + { + "key": "0x627d14dd9e29abd685638cfc7c5895f19688d54c3be1dd8122cb617f58ad4ac", + "value": "0x8df659728f970f" + }, + { + "key": "0x62abb91c7a917b630fead054baf606b06ae8b52eba8a59638ef5b410ef39bd1", + "value": "0x8df9b1d2c9d906" + }, + { + "key": "0x62ac16eef085942eae7fcc4ba7b090f6c6029b9b0fbd6a8df72f49a10e405d5", + "value": "0x1" + }, + { + "key": "0x642489877b663afd825daad8b696c95b6b9c51f71972fd2fb9d3f460b502206", + "value": "0x1" + }, + { + "key": "0x64276354b8fb3897ee3b048f0175eb32547775ac07d2d033f925bc59a678914", + "value": "0x8dee6739ed670c" + }, + { + "key": "0x6470151033e57b681e4919a7a0b2432b0698cb63c06d252c59f0663408ffef4", + "value": "0x8de14acb0f04c0" + }, + { + "key": "0x64c90e8def8cc67aa84f8a97b7a990c56303eb2a3ffe908f68281e0f5ae011c", + "value": "0x8de12604941b98" + }, + { + "key": "0x6502d9596f6ea1c2dfe1ad228ff089b8aebc130b7724d64659293788acd9f46", + "value": "0x1" + }, + { + "key": "0x655923ef3dcc53c4fe43ab00ca279aa2aef7eacf812e63f69db47c65b9c3c84", + "value": "0x1" + }, + { + "key": "0x657634e2fb85b52606bff68bf0f22a9391774f3171fe5c3442112e02c4c772f", + "value": "0x8de46b70f6322c" + }, + { + "key": "0x65c216af08bc9fd8cee995d1d31bce4be924379b59d8be77e67a160536bb053", + "value": "0x1" + }, + { + "key": "0x65c23924ab9005c8f9b47f9fb47ad31f6f562483cd91ba8fe7aaf33b33935cb", + "value": "0x1" + }, + { + "key": "0x65cb3a80531507498bb42246862c4915e9cb69f8b86d336b0889f7342e81d02", + "value": "0x8df3849ad192fa" + }, + { + "key": "0x661a5dae935856372b739cef24c3ec5822042a0aff08549dc200bf2d0b4e490", + "value": "0x8de681c37889dd" + }, + { + "key": "0x66f9f164539a75ea40a1aa64889a4bb90feae902e54e48280dd1ecb7bdcb961", + "value": "0x1" + }, + { + "key": "0x6775caafca32898e237cc3f7d7544105354ba32adbb92421ab09da58be22ab8", + "value": "0x8dd49f7e83c902" + }, + { + "key": "0x689db6c3d42fb77bdde2908e6bfb50ae1a264deb74f011a4033840221ef5f36", + "value": "0x8dfe03b9d44a94" + }, + { + "key": "0x694b96f5139847db506c6d00d72f5009e78bfe89b0ede797cfbe553ebc899fb", + "value": "0x1" + }, + { + "key": "0x69b64b30d9c234022f0a0386a2ee0b05625f0606e3563462361ad2e8f195a54", + "value": "0x1" + }, + { + "key": "0x69badc62f450611ed8fbf0ff1dd698d937e52fded263b51d4a7462fdfe5ecfd", + "value": "0x8df979d9af5767" + }, + { + "key": "0x6a37412c03a9e0a8014f7e8954a7f65a6dcf3b41030ad7be90bb2f0eaeefca2", + "value": "0x8df141c994d44d" + }, + { + "key": "0x6a55f11e3520dbac332bdd0a4f5ff71fc3b945574b2c580c1a1b2449c8591fb", + "value": "0x8dd8fce6437a8c" + }, + { + "key": "0x6a5ef7200647f8cd9720057264f59e24e7d13958b901534bb9009a46e9ef556", + "value": "0x1" + }, + { + "key": "0x6c57b54f74e602b85f35572473257e9cc74f3a1ddd33e4486af4e5b9a9451b9", + "value": "0x1" + }, + { + "key": "0x6cdd012e4760cf720dcd8564aa8ccf25831a07a5f4cfa851c7bd512a7bed05d", + "value": "0x8dfaab9902b89a" + }, + { + "key": "0x6cefe2dd5afb48745543010943eff9c98bc8f1ddc3e689e7383fdb8dcb91fc4", + "value": "0x1" + }, + { + "key": "0x6cf4cdb2c5a49bb36ec0a99d139ae9f6ce15af58d6fd0e1f28ee41f0ef259cb", + "value": "0x1" + }, + { + "key": "0x6d91141570e158b6710992b8d8935d7bcf5829b34a93bdc4b01d27e582a2489", + "value": "0x1" + }, + { + "key": "0x6dafb14967ec9d27cbee417a03b25fb8d89a2521e7ca84495b45dd06f4b7a60", + "value": "0x1" + }, + { + "key": "0x6e7368f7ed09938ec6d33aa889390d8bfbbdc82552e39e51be513e343460b82", + "value": "0x1" + }, + { + "key": "0x6f10ecf24f16095dc3e157aaf80fd21c50f31d687b0254ab52af7266fb1aec1", + "value": "0x1" + }, + { + "key": "0x6f59c62bfc9237d040c9a7724a3abb1ac477817b7beff141fadcf28691f5546", + "value": "0x1" + }, + { + "key": "0x6fa4bdaec9e9e15edbd9fba5d06a6619a34cf1b2d4d5e4d543ad31f34df350f", + "value": "0x1" + }, + { + "key": "0x6fb4cc900c622b8f551ed04ffc05dcc06440c1debdead45a06109a5a10dc99d", + "value": "0x8e05b2cc68a5a2" + }, + { + "key": "0x6fef1326975969712551275cb742c444dfa1a8bf3d28698ddd2b7df883a2d9b", + "value": "0x8df4158991a39f" + }, + { + "key": "0x70a34e992008687439eb7b3d27f9092c2dfd5c746fa91b83c979c1d6e0eedd9", + "value": "0x8df85fd8c28db5" + }, + { + "key": "0x713a84374fd65f5a32f7ad33bf7364f5aa54d4b808b26d67f6df4e3ffbcebe0", + "value": "0x8e0a74d521eb66" + }, + { + "key": "0x7141159d944b50ef836b0562043d480bad37b11c3226c45094459fa6d551450", + "value": "0x8deeed38753172" + }, + { + "key": "0x717af73cab9866eaccb464f20c6860f3b5718d9483f2044946b77a14be5e106", + "value": "0x1" + }, + { + "key": "0x71bbd68db1b1f6308a737d6aea9f3bb98d49fcb83ac81c78f1da660c10ce727", + "value": "0x8dfe61c6bf0a36" + }, + { + "key": "0x71df2acbebfbddfebd5323c4d6187556b4f664c002986262d209b8471e9ea7d", + "value": "0x1" + }, + { + "key": "0x72df145c025ca49a0590e8a2111d79aae5f53d780d7c338014531433fc1c535", + "value": "0x1" + }, + { + "key": "0x7321726c779db8844abc91ac2013f7aeefb3a436203900f46d6b05caf56a5db", + "value": "0x1" + }, + { + "key": "0x742b036cfce90c0f8e905baad06b6fba117da6d411fbb605c0561bd3ebc0d02", + "value": "0x8e02580d724b83" + }, + { + "key": "0x74f3e574355fa1250a1d96df058333bc96646fe308f55764c4bd4470f821d14", + "value": "0x1" + }, + { + "key": "0x74fb3055479b6bb2ec9de7adbb5d2ce148607b1b2ca7be64e65354124afcef4", + "value": "0x1" + }, + { + "key": "0x75775398361d13bce39f7e68bd3d0f86cff2e71a7b9711fec768edddebe0e3e", + "value": "0x8df30d77c579a2" + }, + { + "key": "0x7589b4e29694e3f024fb591ee5f0838d6406f5bb6bd161aab97053c4d885443", + "value": "0x1" + }, + { + "key": "0x76779deada7d3ec92b7d5aca51c07ced4126232cc293aa89f865533ee66b7e4", + "value": "0x8ddce36d8f4762" + }, + { + "key": "0x769fa04e087de09e86833711e816496102b664c25707b6dfda4816e16619c31", + "value": "0x8dc3e4e9d56a35" + }, + { + "key": "0x76bfde9959afdc94a39daf72356597b847c0b2ddfb17ad56a37dff74ea27bb6", + "value": "0x1" + }, + { + "key": "0x77312bd48274bf71c86ac60c05b2b1a94d2287ad7b8de8a12d3201a03f5bc4e", + "value": "0x1" + }, + { + "key": "0x776c150c774b62503b7b74f8a7b9be62c9a3a5843dcae772d9ae4dd5c2ec1b9", + "value": "0x8debd6bcae6ba8" + }, + { + "key": "0x779ff3ce786b1baf0bea8205c51801f6a9204dc12314df41a710cb162b1c2a1", + "value": "0x1" + }, + { + "key": "0x77b25789c4942ecbc9858ac48a01e236dff0968f2adab8ce2faab033f5b3d63", + "value": "0x8dd8bc976fb9d6" + }, + { + "key": "0x77e3c7856dd304278ff93b120e76451dcb9ccf473985294b1b9f728f55adcdb", + "value": "0x8deae7f135bf4f" + }, + { + "key": "0x786079baf35f6e76bed9ad4d338e854f2168631811602b50d2df291185982bf", + "value": "0x1" + }, + { + "key": "0x78fb2bdd4a439f07768894ffd2f161aaa2bc020c5c1169622eba8fe7391bcb0", + "value": "0x8deefa70db01cf" + }, + { + "key": "0x795d5e103b62b3bacf21a67694c52e0a24acfbee84d65ac4d919bec86c09f1b", + "value": "0x8dd1c5de9cc302" + }, + { + "key": "0x79bc20d989a620cb9cde3505b4586cfe02390acef6790223a237baf5880ae09", + "value": "0x1" + }, + { + "key": "0x79e3f144b52d54da7197acc79a2da563aff9360f14da0699da5538f199a4e4c", + "value": "0x1" + }, + { + "key": "0x7a444376af096a7ffa024ff7a31584a85dc7baae556228deb00517c52fd8fb4", + "value": "0x8deaec50316c0e" + }, + { + "key": "0x7ab2990a5d9a9104f4e32744b40b729311fbe7eb7133f75711dca171d3d4d50", + "value": "0x1" + }, + { + "key": "0x7b465dcfc9855260499ba9a6021f7eb03696caae853744f9574b059fef7e22d", + "value": "0x8de65d879976b5" + }, + { + "key": "0x7c31b2d9acff770c5e5fa9f9899830e61d030399a907164753b17f093c74a53", + "value": "0x8de98c1a54703c" + }, + { + "key": "0x7c70358fce864d123b19f4bba61bfa1160e9b56f0c1c78e72fc8cf3de1e7108", + "value": "0x8dd5f00f54f06d" + }, + { + "key": "0x7cc4f3d56f9964311c40a834ab6322e21ff058c8993a2b10a31947793513fcf", + "value": "0x8de587958cc799" + }, + { + "key": "0x7ce952b4b2ba3585ab388c86002610b0ed30add8c3b21c357957198ff858e6b", + "value": "0x8de96919e551d9" + }, + { + "key": "0x7d086bca7aeb680167e9be8dae7f122b7a986328bb47009af4b9933beb84312", + "value": "0x1" + }, + { + "key": "0x7d9764430e9c442e245ff9729efb89aa0b7c453e460404f06cdbdd6fd9e20fe", + "value": "0x8df77c615011a1" + }, + { + "key": "0x7da0a82b3b955a971cc28e6134e29e612130b87b59914261db581d24f5ae07e", + "value": "0x1" + }, + { + "key": "0x7e0875a92a2578f4814a64addb6bf7c01187af2d8f22720364252289983b81d", + "value": "0x8ddaf729f17f63" + }, + { + "key": "0x7e5cfa03e5a5250141f671b578d21e2bb4ee95080cacefc5b523c309ca59c35", + "value": "0x1" + }, + { + "key": "0x7e64f78462e406d8f0bdc79f8e40a8ba82acd9ae221fdc07fb556a5baa1dd5b", + "value": "0x8df92cc5d53311" + }, + { + "key": "0x7e887139891880a283d0379a7c045071c56fd1a51a8a20dff126b94bbf2022c", + "value": "0x1" + }, + { + "key": "0x7f5cded0bb1f4138fe07b7cb88054d1b3c76335d876adad47559100b0a07dab", + "value": "0x1" + }, + { + "key": "0x7fd2d29743040cdbe40dd47a78d9c4b3a48a05b4e42e462a7a0ebbf9886e930", + "value": "0x8ddd424b938376" + }, + { + "key": "0x7fea98501906010712d3fd0275a36f698bf612a38722882e26c70ba2000f693", + "value": "0x1" + } + ], + "0x1": [ + { + "key": "0x9752", + "value": "0x446099625482113f8d7025cf27a20eedce56a96bc3f8547591d22271e4afc12" + } + ] + }, + "nonces": { + "0x6028344c83f128591c5a1905e734c37f6449505087573a54b99891e864ef8f7": "0x45", + "0xa91641858e346eee18cdb5985b97a73eedc7fdc92de8fd3cef0b42bdbc00d3": "0x23", + "0x7b3796a71a75e9d55aad1d46057f6facb3040eaea69d255c6cca52c9124e94c": "0x60", + "0x19994bf4904edd8efa817a79fecb999e7c622f2643aea5d54647c0031d724c6": "0x60", + "0x5ea1cbe943d1a798d02899e2b74b7626b315d2b81febf7b8adf33d8e57dc91": "0x4b", + "0x4c37d767a43169fce247342e46438d0bea2b0d7f4efcd4a4686615e20a7c417": "0x29", + "0x385f7376f9614f368023e004031b50167fcd10b85b9cd45ea52b56c7dc2431f": "0x6c", + "0x3341e828e15b839729b07957cabc597cb6556e61649a0f3bf98578f4b542c9e": "0x40", + "0x6d7caa4818f9d3d4fcc09f69e5c776ad60978fa701d99a6c5a0c70b7b25e1d5": "0x30", + "0x481d6bc11e059a6f76ef7f3967cf22b9a0ad02236c59bfd641076cbf371628": "0x2f", + "0x11f8473d749770009ec91b9e6f723403f9be76e2c93c62919d14989aa9f343d": "0x36", + "0x3a70b8ddcec9d026ff4a3fb2024f7815fd47dcf62716107d34a6ae5ee861e0f": "0x6d", + "0x275c01d887730e6551ff416d8ef128d2a79afcbc244c776c819aefbea1818bb": "0x3f", + "0x41157baa0cd2f7bc1029be65db77a81f97784d3f5aa16f77775d9edbb4cb615": "0x60", + "0x45588fdb74513b42789edc109403dc2c2ac13e1a7bbe19a99d9ec45297f7450": "0x3e", + "0x14169d652eaae2abcfa6fda7c924f8da98566eb1f5f9f33fbf09629ae2b2327": "0x45", + "0x1bf2463473be14da2f0ba583dfe08a8465ba99771450d67599de126fb58da9d": "0x46", + "0x75eacc62294b96b3a09da916ec3e77bc37fa6ab5176e5bbd28aaf588d74baa2": "0x43", + "0x3f9e6e9b92cb5febf0b6b79209a9080a53bc94642b01bfb5fe2b61289f18b2c": "0x35", + "0x4540dc7107f1d6a135b575115091ee56ab13c5cb22a6188a2e7fccda0e009a": "0x5a", + "0x5826e2098829177a40c6b697dedb6b2c24d0378abb5a0dd870a19aef97cb78c": "0x4a", + "0x1d00cc561c943b49f5f2bac27591530a55970c3d0716317ad42b78cd6fb469f": "0x46", + "0x755a7995c1b920ef28e18c4978d73a1c935ce206722c4a8398a1735548abe2d": "0x16", + "0x691301df126b5190e5227b9fd62788723db7b5ea790c4e1da8f85aa6235d46d": "0x53", + "0x7e83c177ff630265eda312465978a679b25f8eb253c000a925fa5f42bb233fe": "0x53", + "0x1a06329b78575c630b343cf559544f84241bc44f3c63bfb013678aa8145215d": "0x7c", + "0x64db11e31dea49ac0945a548fed4b38657452f98f0f29f413062b12873f4afa": "0x2d", + "0x6f4bd4995a3282be1860aca91fe2a498942add440516467aca9da8a1bcf4a41": "0x69", + "0x143e4f7f4f62e00b9a027fc1d1e3e91fb655bb0c68d152a3bd81bee1ea38471": "0x49", + "0x78a19562b686d6cca5841bb192c83795cd8a1d9ffde0c0b4a53cb004575818b": "0x7c", + "0x13d16147f8cd04b852cfdab7107c6cb96de2bfa2a020b22694e8067c87eaacf": "0x41", + "0x5b574462c662b90b11ce7c5750ac6b71d21d5b84c62a6085220557f3e54c14": "0x49", + "0x21bf47cfe73804095e3e1b25e656ca2ca9787651de3e69c9950943f501e30ce": "0x2c", + "0x46e53968a2b5fe68b9b0d6ba6d8a475211b845759822e9161e3cea1afbb1c5f": "0x37", + "0x3dda73cf3d5558a6e785f54cc6e7207b0173f0cc3cce20f64992566ee734d7a": "0x4e", + "0xd9def9409244513635be50767308e1c80a10bb5d116efdf78b9de36620bcbb": "0x24", + "0x59c0424db8476a9d158e52848aea567f806afcb99141b8ef0a543758db2ce60": "0x65", + "0x3732d673d40f828b64bfc85236012ce2c280d3c936aacfb8104f7d4c8c74bb0": "0x3a", + "0x1c23816c01bfbd90fd57873025b4d5b86ee2cccfbad90d3a7fa25dc569638cf": "0x64", + "0x200c519983a0104346afba82a2dc4eccd4a4373aa70a13316626e932cb6e58d": "0x52", + "0x2ec59285aa2e4cbfefaddc331f3d876f207aed3b028f5b62957b0a464f92918": "0x46", + "0x5726d58c2c6bc370074cb67581d03cab05e1304365ca0ee9f4ebf3faade40c4": "0x42", + "0x9b0e317d0bc8a7d797d9a4575dad53eccf44b671c0591c7ba82f5804d12985": "0x40", + "0x2655cd6a02dcc25554bdddc055f304c84bb130828e1b162c82958bbc92dfee": "0x60", + "0x1e6da06bc1d877fb69dd4110f38f0e5a206174c57305df51653141381aaaf43": "0x35", + "0x2390a4d84cf00928adf4058ff1f15c8fe615ccaa3ccc1cd9b571d8be7ae806a": "0x3b", + "0x451d8a5c0ea89978d07a24ac6c594e1f0b57ca0a141ba357d8e169fd73151a3": "0x24", + "0x689549c1747f38f450a34084202987ae19adc553d7ce10c3d5136ed8f768334": "0x43", + "0x350e280198d66aaecfeeb902b02089e026bc792f5ddfb88b04ebc92218f8fcb": "0x24", + "0x67e4d23e57541aa5d087eb95ec42bff6a9feadb0ca6dece4b60cb6e9b8c1970": "0x41", + "0xba1224bab4ce060da0b89da3294a672ffd0b4c313430b67aa6397510739502": "0x2a", + "0x40de1d323a5870a9b1011b1476bfd58f92a35ba59b1f9f3c69cb083fcba122a": "0x51", + "0x15bab3e51c95b9d58b038c49fcbd26d6e163cafd66d2f2cccfce75cee26b762": "0x2f", + "0xe04c9e37787de848379c7898612cde59fbf95ec633deeea3e34e81f1d7df56": "0x19", + "0x57dfd6da6e2abc9b831a908fe8d4ef45fe2830c3ea287ec2341c4bd88046574": "0x41", + "0x33128bd86065b89665dccf20b8224238a3f169cc2aa63ea3de1d4e1b4431db0": "0x2d", + "0x5f34cd49c033df5b7d3da352020e839e88ca2c28025e25f70a6a485d68fc0ea": "0x46", + "0x87b5c2536abec4170cd59c7ad72798d6dd22bf2a77cb5d36cb68876d59d258": "0x14", + "0x6075da58eeaeb2c380b51f5115dfcafbafc70ea16a200175ad50937d50cbc3d": "0x2a", + "0x6bf239cfd8ddfb4edacc070a23929b9b2522585548656ed1de1033d1765b25c": "0x3e", + "0x49872eb6a8d0b7336f6577bbefdd1667fc0ed6f6df6509a6b52d62048a38fc6": "0x45", + "0x6fe8b5ce08982b6ee4321997594e23a9637fe0d45bfd5b5d718695f08b38a72": "0x47", + "0x4dde2846e7cce0c39e57113809340c87421454d8d7c48167a7a2db9d0ef7067": "0x41", + "0x58643681bd6dbef6bcf4828660ddeec18f3d669b12ec626f14092306fe80e99": "0x64", + "0x2cbd65c97f07d4b0830802c819049523e1b8d30cc0bf8d4246df94854faa766": "0x4d", + "0xc24b71d1cdb836ea2a8a5d364fb9131c44fd4e15d1129f2233e3dbcdfe855c": "0x4f", + "0x6804962ed2a44ddd07ad2931838b13ebc114b3e7f91b220fee99a5aca96e83b": "0x42", + "0x36b39a015dc8b78a90ebc74d8f98a7b5a6cdc718118014291966650d6df65": "0x37", + "0x594a6c429ca64604465758db99ef286d5c00d847c8072fec3ff5f0e6b65cf64": "0x35", + "0x4c7fbf3010747ded03b3cbd0a8bfb888cdeb9080a06f5d0d1e32e36473ac5ac": "0x21", + "0x79b0d5fe892237bcdc0979892a9b2790f23781d41aaa8adf351c7980c8b65": "0x2c", + "0x7b4ca69e72ffdbb43edb9266a3ce13b385e714e06f6aee2d7f2215b405f6a9a": "0x69", + "0x176c25d47570070342b173716432127caf510d2b00189a3d8c9c0266297ec30": "0x3c", + "0x73f94dad20c07abaa57a278d02d169b48882bce673c421251686075a986db83": "0x5a", + "0x51d568676ce46d5f9a0d7c23c7c72cdb8536f38d74b3138f3cb9acae98b074d": "0x4e", + "0x40a560ccc59fff23ec01af1087d97bab10001e48e0fb493bec9c4c7e6831cbd": "0x5a", + "0x5032f6bd44ec915ff81e2a450cf2dcd1e28534d804ea9cd38d186dc64c1ce80": "0x4f", + "0x401930eb5465af9c93f63defae98fa9ededf374a901f24f1210a150923d10f7": "0x20", + "0x2b24cb0ac3991cb6362f305bb241e0e874784d44e89d08859536270a29a3799": "0x2e", + "0x20f2f2964d6cb9859f1d264e759fe089eec481f131defb7137878c36478bc9": "0x3a", + "0x34535ded79eb990827817ffa6c14988cd29970cd3cb4d5943684335f8360720": "0x5a", + "0x63e18fe7f3cb5a5194204ba9107a7f425c503c6adef0b686127b14bdeb5d302": "0x39", + "0x7b3f54f0755766215caa99b8ce31250020050ac00bdbdc25bbeb1cf5035388c": "0x2b", + "0x708610e23e4fff8c6434eefadcc284215b0ca10c5b2530d784a547ab7ba6c1e": "0x46", + "0x4bad3730634830da8c2cea36bc8c0103c47a074f259edd5aba3852e1245a9bc": "0x66", + "0x1d751f8d431c913531632cdaee1f2598821304cdb401170a91c76f0d5919a9e": "0x54", + "0x1862d76a292338a2634814f9f2ecb90684c52e1c3f600388865df686cf4e54a": "0x52", + "0x77845f6d3bebb7c5e30619c191333c3cae03565c2d367fe68bf73dfe1197bb9": "0x59", + "0x4e17f08446389b5cd0df8953acf3a0f2f6a6b2a80abd762b0101e7c6c103157": "0x2e", + "0x247d1a8c411f2a456bc8a538fcf23efbd493c71b73f7421a8a4657147a59609": "0x76", + "0x4102dafaf51f5e6c854259a48f6ccde4fac083d2dec07e784c5c38e7c6e9a8d": "0x38", + "0x3acd1c7261d5bda1736a89318f1b662d1ff804ba44a0c510cd2832156bc4a6f": "0x63", + "0x4a724a4229813f34e274837684c652260f7621f76e9457942f05cb59fe4469d": "0x23", + "0x71a161b38b1229d32ae61b14a2f44bdc73e6664ff8b3a4184f66abca2735fdf": "0x2d", + "0x3c875403ce3066337b984c541ecb4f47557e421e859816e65bc85a402abeda9": "0x4c", + "0x7707b0c961121ae62f4ef63605121041f2754bb095e682a4544b021aee7e2b3": "0x6b", + "0x6c55ba1f4efe13d3eb06441582c3aef616542be06363571d970ecbceb893de2": "0x37", + "0xe2fce66497ffbc0b04f6d1c27eec2f8da3c4b7ac78a24cab67595644173eed": "0x53", + "0x2333f8254e3d2a9f527f4ed292f0f84b35af2dac6c0e664691ed48c7251ecd": "0x32", + "0x5c4f4e4ae30a422a1b735b38c52bdf5739ad64b2f95492ab6ccd93b4f6be2df": "0x3c", + "0x66a981c57e4253cf8d24eaaed89f7719c9a697be3b41a0371b24c8fc00a1cad": "0x3d", + "0x73ea2bf4f84c4ef4f95f6a5a03af3317277deb63039330d881ea20e33d0738c": "0x36", + "0x6be5a0624172c2f0a3d116d03a861375e023f340caaa6363854c9ae4a460f5": "0x32", + "0x104745966fa5cd518bab10b5f1a741f4a3435d7d9b060b8a11778cb36fcb574": "0x55", + "0x48cd92c018be0434daffcbcbcd6722aceda59a54ad1efe411fec777f41f8caf": "0x45", + "0xa0e0c780524827e8f094bf8c199269f06f86309d30c65af0f7dac6968de3c3": "0x5a", + "0x12e4dfa71ee52225ff301eb69e2fc08fbc001b0821578be07648a7ea493021f": "0x64", + "0x541b4a8bb25092e7a52dbe8f07810e5c9efcb2774d52b567845fe8d3dc3c92a": "0x26", + "0x2ec71fc858681fa0cca225185a86060926a9bfd338d749f256910d415770d1d": "0x51", + "0x10bd0687cdf260d35210af52a93a9712d51a403868a103e91e491eaf17973cd": "0x19", + "0x253b4898f783590539e8ff61faee36bbe6f4022af6f5742fd80ed8a609d8cea": "0x4a", + "0x77c28f25bc25bd5207ab10317a8ad029b560f22d77b3492cc910236a2ce1278": "0x3a", + "0x768a45776c6e33860c802ea8b6f69170b275d576ff5ea0b6ed54c7b0da443e9": "0x36", + "0x273d24a6e32e7dc5531d7e1d17df2b2f91b7c50da2c9142a78c02de878cdd5f": "0x34", + "0x688e05ac8427736a7bc419f86ad7a90ea6157d2d82ed30f09149b18c97a2391": "0x35", + "0x2f50b3c524482dfd39d8236ea2c114df8d8fd907711584de81eddbeca7b7921": "0x42", + "0x3fd8c55203651e0b3c6cac235b8b489b0a302731691e1c4b860b7dc41a6d6be": "0x3f", + "0xcc4c8e4096a5dc1b161bde1c0207c34f82f4c0195cd428253f1baed6308d5a": "0x47", + "0x1835c7d07311634fe0abc0e12897de6de8420f56fc0e9e1cf0550a71c31f7da": "0x5d", + "0x3b02187b88b06e6993158e652acc2836e15b6f0a95d4abf74891334b462f741": "0x20", + "0x2709f3ff0b285074ffbebef3078d2ccd7d26d0fd7bcd4422d8ceb5e9a6a40ff": "0x4e", + "0x22ccb773bb8c536d70c99ad4be229b6425be5e8014a1330c72495760d2f4b60": "0x1d", + "0x12b01545b7bbd20fcdffb03575a25cad0b30698ad7ad4781be1221f554f4741": "0x47", + "0x17fb33a9db88d0e4e3b382dad1733522ec8024647716f463066bedbb490978d": "0x43", + "0x11e0a33ad5c43d5bd2f7f0ccc2b66f591c6c908910c1f2f377c6f586a458eb0": "0x3a", + "0x500eb16558214463a5c37ac189e1b12443e97a3bdf89ec0c0c4986376bfb00f": "0x6c", + "0x47666c862e5e3db0e5a43aafd2d1ba5b1e8eb498ea5b42ebc6cd01ee3a16609": "0x34", + "0x3591c61d75a1d75ee576d70a366138be4c288034605022086e8abd6cc6a282a": "0x69", + "0x43438d30a486df0100bfb40f7dddbdcf9b9c21f2079ae785a22b2816d09d842": "0x41", + "0x56ffd7a92298ef76ddbd31936c19c23d29edc2f34207f1b0b5b270aa511d8d5": "0x7e", + "0x5112b78113307795cf45051a65e9d2b535a236cb8ff8a93b9f4f460357b705b": "0x32", + "0x6133eb7e32610962c067accae847789b414e52ef69407bcda0dbc4e0562235e": "0x59", + "0x5aa0c4b6d10882180ed3bf70dc5bb99fad462fb926c251329f4c0f997cd5ae9": "0x53", + "0x6ae831431e8fa2128b079844633e084604422d63b7f1ad1a79fb81e37447463": "0x5b", + "0x524987ff394990a95fa0015a8eb66e61ff9f8626291dedd4f7d50a5f020f797": "0x47", + "0x2e19f222ead0bc05ad25d190bf89a63ecabf82f53f7d6bf383d05553acaf123": "0x4a", + "0x309e46e00ee3cfb4d1bd1f42267126cfc9b7c501f439a9c60093330c7e0cfa9": "0x6f", + "0x7d3644f1c8cc3d0fde11a7c69ccdd59e392199be927e2e283d21b5445357ab1": "0x13", + "0x38f5a14f93aa2041cbab6a0a2eb909f268a10be56addc697592c87c68eed875": "0x67", + "0x6a4213ccb648d4cc272690144073efdb184bc5c0253f798973666761b231827": "0x22", + "0x115f012bd02db4cad77f3fb19bea28087d03a4d03f965781711cd9a9379d100": "0x12", + "0x9a747a346243aff99283048beabf09c2ef25bfbbc8a177945f3a0eab0d3882": "0x31", + "0x384152c373546b914f69e6c011747c08c519c3f43a4dc4b4b51849ca0e99ded": "0x13", + "0x1624d229b7b2733f0e4f72f205ab058c0b247045ff371aa5a7aa95a7a037906": "0x31", + "0x1b7e553d9d69a2a1fcf9ae3a72bd41bac0ae603acc77c783ae58bf1ba08b80c": "0x43", + "0x13372661462e9437e3be7442c0bb7f0a28642510ec3879927eebfdaa11c6b64": "0x7e", + "0x1050347b94b0cbce9abe2ceab62f47257071169a4ab22b4fb67f3a731e0b486": "0x24", + "0x9529b7734deb881652cb0903f26875b01134cb0b091822f85edc697164e7d1": "0x31", + "0x72a90329f10cca92a43cb8014ea168049ee3e1b9013638afa026a4671863ca1": "0x43", + "0x46388b18ad7cd2514d20b64c07904b351d313f9b185eb864e9cef8a129a9db0": "0x44" + }, + "deployed_contracts": [], + "old_declared_contracts": [], + "declared_classes": [], + "replaced_classes": [] + } +} \ No newline at end of file diff --git a/cmd/juno/dbsize.go b/cmd/juno/dbsize.go new file mode 100644 index 0000000000..11f1dbb6f4 --- /dev/null +++ b/cmd/juno/dbsize.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + + "github.com/NethermindEth/juno/db" + "github.com/NethermindEth/juno/db/pebble" + "github.com/NethermindEth/juno/utils" + "github.com/spf13/cobra" +) + +func DBSize() *cobra.Command { + dbSizeCmd := &cobra.Command{ + Use: "db-size", + Short: "Calculate's Juno's DB size.", + RunE: func(cmd *cobra.Command, args []string) error { + dbPath, err := cmd.Flags().GetString(dbPathF) + if err != nil { + return err + } + + if dbPath == "" { + return fmt.Errorf("--%v cannot be empty", dbPathF) + } + + pebbleDB, err := pebble.New(dbPath) + if err != nil { + return err + } + + var totalSize, stateSizeWithoutHistory, stateSizeWithHistory uint + + _, err = fmt.Fprintln(cmd.OutOrStdout(), "Total number of DB buckets:", len(db.BucketValues())) + if err != nil { + return err + } + + var bucketSize uint + for _, b := range db.BucketValues() { + bucketSize, err = pebble.CalculatePrefixSize(cmd.Context(), pebbleDB.(*pebble.DB), []byte{byte(b)}) + if err != nil { + return err + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), uint(b)+1, "Size of", b, "=", bucketSize) + if err != nil { + return err + } + + totalSize += bucketSize + + if utils.AnyOf(b, db.StateTrie, db.ContractStorage, db.Class, db.ContractNonce, + db.ContractDeploymentHeight) { + stateSizeWithoutHistory += bucketSize + stateSizeWithHistory += bucketSize + } + + if utils.AnyOf(b, db.ContractStorageHistory, db.ContractNonceHistory, db.ContractClassHashHistory) { + stateSizeWithHistory += bucketSize + } + } + + _, err = fmt.Fprintln(cmd.OutOrStdout()) + if err != nil { + return err + } + _, err = fmt.Fprintln(cmd.OutOrStdout(), "State size without history =", stateSizeWithoutHistory) + if err != nil { + return err + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), "State size with history =", stateSizeWithHistory) + if err != nil { + return err + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), "Total DB size =", totalSize) + return err + }, + } + + // Persistent Flag was not used from the Juno command because GenP2PKeyPair would also inherit it while PersistentPreRun was not used + // because none of the subcommand required access to the node.Config. + defaultDBPath, dbPathShort := "", "p" + dbSizeCmd.Flags().StringP(dbPathF, dbPathShort, defaultDBPath, dbPathUsage) + + return dbSizeCmd +} diff --git a/cmd/juno/genp2pkeypair.go b/cmd/juno/genp2pkeypair.go new file mode 100644 index 0000000000..8be1d0dd12 --- /dev/null +++ b/cmd/juno/genp2pkeypair.go @@ -0,0 +1,49 @@ +package main + +import ( + "encoding/hex" + "fmt" + + "github.com/NethermindEth/juno/p2p" + "github.com/spf13/cobra" +) + +func GenP2PKeyPair() *cobra.Command { + return &cobra.Command{ + Use: "genp2pkeypair", + Short: "Generate private key pair for p2p.", + RunE: func(cmd *cobra.Command, _ []string) error { + priv, pub, id, err := p2p.GenKeyPair() + if err != nil { + return err + } + + rawPriv, err := priv.Raw() + if err != nil { + return err + } + + privHex := make([]byte, hex.EncodedLen(len(rawPriv))) + hex.Encode(privHex, rawPriv) + _, err = fmt.Fprintln(cmd.OutOrStdout(), "P2P Private Key:", string(privHex)) + if err != nil { + return err + } + + rawPub, err := pub.Raw() + if err != nil { + return err + } + + pubHex := make([]byte, hex.EncodedLen(len(rawPub))) + hex.Encode(pubHex, rawPub) + _, err = fmt.Fprintln(cmd.OutOrStdout(), "P2P Public Key:", string(pubHex)) + if err != nil { + return err + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), "P2P PeerID:", id) + return err + }, + } +} diff --git a/cmd/juno/juno.go b/cmd/juno/juno.go index 0c68968e90..65ffa90c51 100644 --- a/cmd/juno/juno.go +++ b/cmd/juno/juno.go @@ -2,7 +2,6 @@ package main import ( "context" - "encoding/hex" "fmt" "math" "math/big" @@ -16,7 +15,6 @@ import ( _ "github.com/NethermindEth/juno/jemalloc" "github.com/NethermindEth/juno/node" - "github.com/NethermindEth/juno/p2p" "github.com/NethermindEth/juno/utils" "github.com/ethereum/go-ethereum/common" "github.com/mitchellh/mapstructure" @@ -38,50 +36,51 @@ Juno is a Go implementation of a Starknet full-node client created by Nethermind ` const ( - configF = "config" - logLevelF = "log-level" - httpF = "http" - httpHostF = "http-host" - httpPortF = "http-port" - wsF = "ws" - wsHostF = "ws-host" - wsPortF = "ws-port" - dbPathF = "db-path" - networkF = "network" - ethNodeF = "eth-node" - pprofF = "pprof" - pprofHostF = "pprof-host" - pprofPortF = "pprof-port" - colourF = "colour" - pendingPollIntervalF = "pending-poll-interval" - p2pF = "p2p" - p2pAddrF = "p2p-addr" - p2pPeersF = "p2p-peers" - p2pFeederNodeF = "p2p-feeder-node" - p2pPrivateKey = "p2p-private-key" - metricsF = "metrics" - metricsHostF = "metrics-host" - metricsPortF = "metrics-port" - grpcF = "grpc" - grpcHostF = "grpc-host" - grpcPortF = "grpc-port" - maxVMsF = "max-vms" - maxVMQueueF = "max-vm-queue" - remoteDBF = "remote-db" - rpcMaxBlockScanF = "rpc-max-block-scan" - dbCacheSizeF = "db-cache-size" - dbMaxHandlesF = "db-max-handles" - gwAPIKeyF = "gw-api-key" //nolint: gosec - gwTimeoutF = "gw-timeout" //nolint: gosec - cnNameF = "cn-name" - cnFeederURLF = "cn-feeder-url" - cnGatewayURLF = "cn-gateway-url" - cnL1ChainIDF = "cn-l1-chain-id" - cnL2ChainIDF = "cn-l2-chain-id" - cnCoreContractAddressF = "cn-core-contract-address" - cnUnverifiableRangeF = "cn-unverifiable-range" - callMaxStepsF = "rpc-call-max-steps" - corsEnableF = "rpc-cors-enable" + configF = "config" + logLevelF = "log-level" + httpF = "http" + httpHostF = "http-host" + httpPortF = "http-port" + wsF = "ws" + wsHostF = "ws-host" + wsPortF = "ws-port" + dbPathF = "db-path" + networkF = "network" + ethNodeF = "eth-node" + pprofF = "pprof" + pprofHostF = "pprof-host" + pprofPortF = "pprof-port" + colourF = "colour" + pendingPollIntervalF = "pending-poll-interval" + p2pF = "p2p" + p2pAddrF = "p2p-addr" + p2pPeersF = "p2p-peers" + p2pFeederNodeF = "p2p-feeder-node" + p2pPrivateKey = "p2p-private-key" + metricsF = "metrics" + metricsHostF = "metrics-host" + metricsPortF = "metrics-port" + grpcF = "grpc" + grpcHostF = "grpc-host" + grpcPortF = "grpc-port" + maxVMsF = "max-vms" + maxVMQueueF = "max-vm-queue" + remoteDBF = "remote-db" + rpcMaxBlockScanF = "rpc-max-block-scan" + dbCacheSizeF = "db-cache-size" + dbMaxHandlesF = "db-max-handles" + gwAPIKeyF = "gw-api-key" //nolint: gosec + gwTimeoutF = "gw-timeout" //nolint: gosec + cnNameF = "cn-name" + cnFeederURLF = "cn-feeder-url" + cnGatewayURLF = "cn-gateway-url" + cnL1ChainIDF = "cn-l1-chain-id" + cnL2ChainIDF = "cn-l2-chain-id" + cnCoreContractAddressF = "cn-core-contract-address" + cnUnverifiableRangeF = "cn-unverifiable-range" + callMaxStepsF = "rpc-call-max-steps" + corsEnableF = "rpc-cors-enable" + versionedConstantsFileF = "versioned-constants-file" defaultConfig = "" defaulHost = "localhost" @@ -117,6 +116,7 @@ const ( defaultCallMaxSteps = 4_000_000 defaultGwTimeout = 5 * time.Second defaultCorsEnable = false + defaultVersionedConstantsFile = "" configFlagUsage = "The YAML configuration file." logLevelFlagUsage = "Options: trace, debug, info, warn, error." @@ -165,7 +165,8 @@ const ( gwTimeoutUsage = "Timeout for requests made to the gateway" //nolint: gosec callMaxStepsUsage = "Maximum number of steps to be executed in starknet_call requests. " + "The upper limit is 4 million steps, and any higher value will still be capped at 4 million." - corsEnableUsage = "Enable CORS on RPC endpoints" + corsEnableUsage = "Enable CORS on RPC endpoints" + versionedConstantsFileUsage = "Use custom versioned constants from provided file" ) var Version string @@ -187,7 +188,10 @@ func main() { config := new(node.Config) cmd := NewCmd(config, func(cmd *cobra.Command, _ []string) error { - fmt.Printf(greeting, Version) + _, err := fmt.Fprintf(cmd.OutOrStdout(), greeting, Version) + if err != nil { + return err + } n, err := node.New(config, Version) if err != nil { @@ -214,7 +218,7 @@ func main() { //nolint:funlen func NewCmd(config *node.Config, run func(*cobra.Command, []string) error) *cobra.Command { junoCmd := &cobra.Command{ - Use: "juno [flags]", + Use: "juno", Short: "Starknet client implementation in Go.", Version: Version, RunE: run, @@ -245,7 +249,7 @@ func NewCmd(config *node.Config, run func(*cobra.Command, []string) error) *cobr v.SetEnvPrefix("JUNO") v.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) if err := v.BindPFlags(cmd.Flags()); err != nil { - return nil + return nil //nolint:nilerr } // TextUnmarshallerHookFunc allows us to unmarshal values that satisfy the @@ -345,42 +349,11 @@ func NewCmd(config *node.Config, run func(*cobra.Command, []string) error) *cobr junoCmd.Flags().Uint(callMaxStepsF, defaultCallMaxSteps, callMaxStepsUsage) junoCmd.Flags().Duration(gwTimeoutF, defaultGwTimeout, gwTimeoutUsage) junoCmd.Flags().Bool(corsEnableF, defaultCorsEnable, corsEnableUsage) + junoCmd.Flags().String(versionedConstantsFileF, defaultVersionedConstantsFile, versionedConstantsFileUsage) junoCmd.MarkFlagsMutuallyExclusive(p2pFeederNodeF, p2pPeersF) + junoCmd.AddCommand(GenP2PKeyPair()) + junoCmd.AddCommand(DBSize()) return junoCmd } - -func GenP2PKeyPair() *cobra.Command { - return &cobra.Command{ - Use: "genp2pkeypair", - Short: "Generate private key pair for p2p.", - RunE: func(*cobra.Command, []string) error { - priv, pub, id, err := p2p.GenKeyPair() - if err != nil { - return err - } - - rawPriv, err := priv.Raw() - if err != nil { - return err - } - - privHex := make([]byte, hex.EncodedLen(len(rawPriv))) - hex.Encode(privHex, rawPriv) - fmt.Println("P2P Private Key:", string(privHex)) - - rawPub, err := pub.Raw() - if err != nil { - return err - } - - pubHex := make([]byte, hex.EncodedLen(len(rawPub))) - hex.Encode(pubHex, rawPub) - fmt.Println("P2P Public Key:", string(pubHex)) - - fmt.Println("P2P PeerID:", id) - return nil - }, - } -} diff --git a/cmd/juno/juno_test.go b/cmd/juno/juno_test.go index a677dc9007..162f41a525 100644 --- a/cmd/juno/juno_test.go +++ b/cmd/juno/juno_test.go @@ -24,12 +24,11 @@ func TestConfigPrecedence(t *testing.T) { pwd, err := os.Getwd() require.NoError(t, err) - // The purpose of these tests are to ensure the precedence of our config + // The purpose of these tests is to ensure the precedence of our config // values is respected. Since viper offers this feature, it would be // redundant to enumerate all combinations. Thus, only a select few are // tested for sanity. These tests are not intended to perform semantics - // checks on the config, those will be checked by the StarknetNode - // implementation. + // checks on the config, those will be checked by the node implementation. defaultHost := "localhost" defaultLogLevel := utils.INFO defaultHTTP := false diff --git a/core/block.go b/core/block.go index 44bb78a46c..b9ff81e2af 100644 --- a/core/block.go +++ b/core/block.go @@ -4,7 +4,9 @@ import ( "encoding/binary" "errors" "fmt" + "slices" + "github.com/Masterminds/semver/v3" "github.com/NethermindEth/juno/core/crypto" "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/utils" @@ -66,11 +68,13 @@ type Block struct { type BlockCommitments struct { TransactionCommitment *felt.Felt EventCommitment *felt.Felt + ReceiptCommitment *felt.Felt + StateDiffCommitment *felt.Felt } // VerifyBlockHash verifies the block hash. Due to bugs in Starknet alpha, not all blocks have // verifiable hashes. -func VerifyBlockHash(b *Block, network *utils.Network) (*BlockCommitments, error) { +func VerifyBlockHash(b *Block, network *utils.Network, stateDiff *StateDiff) (*BlockCommitments, error) { if len(b.Transactions) != len(b.Receipts) { return nil, fmt.Errorf("len of transactions: %v do not match len of receipts: %v", len(b.Transactions), len(b.Receipts)) @@ -88,7 +92,7 @@ func VerifyBlockHash(b *Block, network *utils.Network) (*BlockCommitments, error unverifiableRange := metaInfo.UnverifiableRange skipVerification := unverifiableRange != nil && b.Number >= unverifiableRange[0] && b.Number <= unverifiableRange[1] //nolint:gocritic - + // todo should we still keep it after p2p ? if !skipVerification { if err := VerifyTransactions(b.Transactions, network, b.ProtocolVersion); err != nil { return nil, err @@ -99,13 +103,14 @@ func VerifyBlockHash(b *Block, network *utils.Network) (*BlockCommitments, error if metaInfo.FallBackSequencerAddress != nil { fallbackSeqAddresses = append(fallbackSeqAddresses, metaInfo.FallBackSequencerAddress) } + for _, fallbackSeq := range fallbackSeqAddresses { var overrideSeq *felt.Felt if b.SequencerAddress == nil { overrideSeq = fallbackSeq } - hash, commitments, err := blockHash(b, network, overrideSeq) + hash, commitments, err := blockHash(b, stateDiff, network, overrideSeq) if err != nil { return nil, err } @@ -125,6 +130,7 @@ func VerifyBlockHash(b *Block, network *utils.Network) (*BlockCommitments, error // BlockHash assumes block.SequencerAddress is not nil as this is called with post v0.12.0 // and by then issues with unverifiable block hash were resolved. // In future, this may no longer be required. +// Todo: Pass stateDiff so that p2p layer can calculate post 0.13.2 Block Hash func BlockHash(b *Block) (*felt.Felt, error) { if b.SequencerAddress == nil { return nil, errors.New("block.SequencerAddress is nil") @@ -135,18 +141,30 @@ func BlockHash(b *Block) (*felt.Felt, error) { } // blockHash computes the block hash, with option to override sequence address -func blockHash(b *Block, network *utils.Network, overrideSeqAddr *felt.Felt) (*felt.Felt, *BlockCommitments, error) { +func blockHash(b *Block, stateDiff *StateDiff, network *utils.Network, overrideSeqAddr *felt.Felt) (*felt.Felt, + *BlockCommitments, error, +) { metaInfo := network.BlockHashMetaInfo - if b.Number < metaInfo.First07Block { - return pre07Hash(b, network.L2ChainIDFelt()) + blockVer, err := ParseBlockVersion(b.ProtocolVersion) + if err != nil { + return nil, nil, err + } + v0_13_2 := semver.MustParse("0.13.2") + + if blockVer.LessThan(v0_13_2) { + if b.Number < metaInfo.First07Block { + return pre07Hash(b, network.L2ChainIDFelt()) + } + return post07Hash(b, overrideSeqAddr) } - return post07Hash(b, overrideSeqAddr) + + return Post0132Hash(b, stateDiff) } // pre07Hash computes the block hash for blocks generated before Cairo 0.7.0 func pre07Hash(b *Block, chain *felt.Felt) (*felt.Felt, *BlockCommitments, error) { - txCommitment, err := transactionCommitment(b.Transactions, b.Header.ProtocolVersion) + txCommitment, err := transactionCommitmentPedersen(b.Transactions, b.Header.ProtocolVersion) if err != nil { return nil, nil, err } @@ -167,6 +185,67 @@ func pre07Hash(b *Block, chain *felt.Felt) (*felt.Felt, *BlockCommitments, error ), &BlockCommitments{TransactionCommitment: txCommitment}, nil } +func Post0132Hash(b *Block, stateDiff *StateDiff) (*felt.Felt, *BlockCommitments, error) { + wg := conc.NewWaitGroup() + var txCommitment, eCommitment, rCommitment, sdCommitment *felt.Felt + var sdLength uint64 + var tErr, eErr, rErr error + + wg.Go(func() { + txCommitment, tErr = transactionCommitmentPoseidon(b.Transactions) + }) + wg.Go(func() { + eCommitment, eErr = eventCommitmentPoseidon(b.Receipts) + }) + wg.Go(func() { + rCommitment, rErr = receiptCommitment(b.Receipts) + }) + + wg.Go(func() { + sdLength = stateDiff.Length() + sdCommitment = stateDiff.Hash() + }) + + wg.Wait() + + if tErr != nil { + return nil, nil, tErr + } + if eErr != nil { + return nil, nil, eErr + } + if rErr != nil { + return nil, nil, rErr + } + + concatCounts := concatCounts(b.TransactionCount, b.EventCount, sdLength, b.L1DAMode) + + return crypto.PoseidonArray( + new(felt.Felt).SetBytes([]byte("STARKNET_BLOCK_HASH0")), + new(felt.Felt).SetUint64(b.Number), // block number + b.GlobalStateRoot, // global state root + b.SequencerAddress, // sequencer address + new(felt.Felt).SetUint64(b.Timestamp), // block timestamp + concatCounts, + sdCommitment, + txCommitment, // transaction commitment + eCommitment, // event commitment + rCommitment, // receipt commitment + b.GasPrice, // gas price in wei + b.GasPriceSTRK, // gas price in fri + b.L1DataGasPrice.PriceInWei, + b.L1DataGasPrice.PriceInFri, + new(felt.Felt).SetBytes([]byte(b.ProtocolVersion)), + &felt.Zero, // reserved: extra data + b.ParentHash, // parent block hash + ), &BlockCommitments{ + TransactionCommitment: txCommitment, + EventCommitment: eCommitment, + ReceiptCommitment: rCommitment, + StateDiffCommitment: sdCommitment, + }, nil +} + // post07Hash computes the block hash for blocks generated after Cairo 0.7.0 func post07Hash(b *Block, overrideSeqAddr *felt.Felt) (*felt.Felt, *BlockCommitments, error) { seqAddr := b.SequencerAddress @@ -179,10 +258,10 @@ func post07Hash(b *Block, overrideSeqAddr *felt.Felt) (*felt.Felt, *BlockCommitm var tErr, eErr error wg.Go(func() { - txCommitment, tErr = transactionCommitment(b.Transactions, b.Header.ProtocolVersion) + txCommitment, tErr = transactionCommitmentPedersen(b.Transactions, b.Header.ProtocolVersion) }) wg.Go(func() { - eCommitment, eErr = eventCommitment(b.Receipts) + eCommitment, eErr = eventCommitmentPedersen(b.Receipts) }) wg.Wait() @@ -222,3 +301,26 @@ func MarshalBlockNumber(blockNumber uint64) []byte { return numBytes } + +func concatCounts(txCount, eventCount, stateDiffLen uint64, l1Mode L1DAMode) *felt.Felt { + var l1DAByte byte + if l1Mode == Blob { + l1DAByte = 0b10000000 + } + + var txCountBytes, eventCountBytes, stateDiffLenBytes [8]byte + binary.BigEndian.PutUint64(txCountBytes[:], txCount) + binary.BigEndian.PutUint64(eventCountBytes[:], eventCount) + binary.BigEndian.PutUint64(stateDiffLenBytes[:], stateDiffLen) + + zeroPadding := make([]byte, 7) //nolint:mnd + + concatBytes := slices.Concat( + txCountBytes[:], + eventCountBytes[:], + stateDiffLenBytes[:], + []byte{l1DAByte}, + zeroPadding, + ) + return new(felt.Felt).SetBytes(concatBytes) +} diff --git a/core/block_test.go b/core/block_test.go index 96ba8f719d..81cac95e5b 100644 --- a/core/block_test.go +++ b/core/block_test.go @@ -181,7 +181,7 @@ func TestBlockHash(t *testing.T) { block, err := gw.BlockByNumber(context.Background(), tc.number) require.NoError(t, err) - commitments, err := core.VerifyBlockHash(block, &tc.chain) + commitments, err := core.VerifyBlockHash(block, &tc.chain, nil) assert.NoError(t, err) assert.NotNil(t, commitments) }) @@ -199,7 +199,7 @@ func TestBlockHash(t *testing.T) { mainnetBlock1.Hash = h1 expectedErr := "can not verify hash in block header" - commitments, err := core.VerifyBlockHash(mainnetBlock1, &utils.Mainnet) + commitments, err := core.VerifyBlockHash(mainnetBlock1, &utils.Mainnet, nil) assert.EqualError(t, err, expectedErr) assert.Nil(t, commitments) }) @@ -210,7 +210,7 @@ func TestBlockHash(t *testing.T) { block119802, err := goerliGW.BlockByNumber(context.Background(), 119802) require.NoError(t, err) - commitments, err := core.VerifyBlockHash(block119802, &utils.Goerli) + commitments, err := core.VerifyBlockHash(block119802, &utils.Goerli, nil) assert.NoError(t, err) assert.NotNil(t, commitments) }) @@ -224,7 +224,7 @@ func TestBlockHash(t *testing.T) { expectedErr := fmt.Sprintf("len of transactions: %v do not match len of receipts: %v", len(mainnetBlock1.Transactions), len(mainnetBlock1.Receipts)) - commitments, err := core.VerifyBlockHash(mainnetBlock1, &utils.Mainnet) + commitments, err := core.VerifyBlockHash(mainnetBlock1, &utils.Mainnet, nil) assert.EqualError(t, err, expectedErr) assert.Nil(t, commitments) }) @@ -238,12 +238,37 @@ func TestBlockHash(t *testing.T) { "transaction hash (%v) at index: %v does not match receipt's hash (%v)", mainnetBlock1.Transactions[1].Hash().String(), 1, mainnetBlock1.Receipts[1].TransactionHash) - commitments, err := core.VerifyBlockHash(mainnetBlock1, &utils.Mainnet) + commitments, err := core.VerifyBlockHash(mainnetBlock1, &utils.Mainnet, nil) assert.EqualError(t, err, expectedErr) assert.Nil(t, commitments) }) } +func Test0132BlockHash(t *testing.T) { + t.Parallel() + client := feeder.NewTestClient(t, &utils.SepoliaIntegration) + gw := adaptfeeder.New(client) + + for _, test := range []struct { + blockNum uint64 + }{ + {blockNum: 35748}, {blockNum: 35749}, {blockNum: 37500}, {blockNum: 38748}, + } { + t.Run(fmt.Sprintf("blockNum=%v", test.blockNum), func(t *testing.T) { + t.Parallel() + b, err := gw.BlockByNumber(context.Background(), test.blockNum) + require.NoError(t, err) + + su, err := gw.StateUpdate(context.Background(), test.blockNum) + require.NoError(t, err) + + c, err := core.VerifyBlockHash(b, &utils.SepoliaIntegration, su.StateDiff) + require.NoError(t, err) + assert.NotNil(t, c) + }) + } +} + func TestBlockHashP2P(t *testing.T) { mainnetGW := adaptfeeder.New(feeder.NewTestClient(t, &utils.Mainnet)) diff --git a/core/class_hash.go b/core/class_hash.go index 9cc4f94990..be39065cf9 100644 --- a/core/class_hash.go +++ b/core/class_hash.go @@ -5,8 +5,8 @@ package core //#include // // extern void Cairo0ClassHash(char* class_json_str, char* hash); -// #cgo vm_debug LDFLAGS: -L./rust/target/debug -ljuno_starknet_core_rs -ldl -lm -// #cgo !vm_debug LDFLAGS: -L./rust/target/release -ljuno_starknet_core_rs -ldl -lm +// #cgo vm_debug LDFLAGS: -L./rust/target/debug -ljuno_starknet_core_rs +// #cgo !vm_debug LDFLAGS: -L./rust/target/release -ljuno_starknet_core_rs import "C" import ( diff --git a/core/contract.go b/core/contract.go index fe679fd79d..2af1fd8c4c 100644 --- a/core/contract.go +++ b/core/contract.go @@ -69,7 +69,7 @@ func ContractAddress(callerAddress, classHash, salt *felt.Felt, constructorCallD prefix := new(felt.Felt).SetBytes([]byte("STARKNET_CONTRACT_ADDRESS")) callDataHash := crypto.PedersenArray(constructorCallData...) - // https://docs.starknet.io/documentation/architecture_and_concepts/Contracts/contract-address + // https://docs.starknet.io/architecture-and-concepts/smart-contracts/contract-address/ return crypto.PedersenArray( prefix, callerAddress, diff --git a/core/crypto/keccak.go b/core/crypto/keccak.go index bb217f9890..5e2554d91a 100644 --- a/core/crypto/keccak.go +++ b/core/crypto/keccak.go @@ -1,21 +1,25 @@ package crypto import ( + "fmt" + "github.com/NethermindEth/juno/core/felt" "golang.org/x/crypto/sha3" ) // StarknetKeccak implements [Starknet keccak] // -// [Starknet keccak]: https://docs.starknet.//io/documentation/develop/Hashing/hash-functions/#starknet_keccak -func StarknetKeccak(b []byte) (*felt.Felt, error) { +// [Starknet keccak]: https://docs.starknet.io/architecture-and-concepts/cryptography/hash-functions/#starknet_keccak +func StarknetKeccak(b []byte) *felt.Felt { h := sha3.NewLegacyKeccak256() _, err := h.Write(b) if err != nil { - return nil, err + // actual implementation (sha3.state{} type) doesn't return error in Write method + // we keep this panic as an assertion in case they will modify the implementation + panic(fmt.Errorf("failed to write to LegacyKeccak256 hash: %w", err)) } d := h.Sum(nil) // Remove the first 6 bits from the first byte d[0] &= 3 - return new(felt.Felt).SetBytes(d), nil + return new(felt.Felt).SetBytes(d) } diff --git a/core/crypto/keccak_test.go b/core/crypto/keccak_test.go index 39dc24a0e7..5b5d7cbccc 100644 --- a/core/crypto/keccak_test.go +++ b/core/crypto/keccak_test.go @@ -6,7 +6,6 @@ import ( "github.com/NethermindEth/juno/core/crypto" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestStarknetKeccak(t *testing.T) { @@ -22,11 +21,9 @@ func TestStarknetKeccak(t *testing.T) { t.Parallel() for _, test := range tests { - test := test t.Run(test.input, func(t *testing.T) { t.Parallel() - d, err := crypto.StarknetKeccak([]byte(test.input)) - require.NoError(t, err) + d := crypto.StarknetKeccak([]byte(test.input)) got := fmt.Sprintf("%x", d.Bytes()) assert.Equal(t, test.want, got) diff --git a/core/crypto/pedersen_hash.go b/core/crypto/pedersen_hash.go index 8685af1a46..583d557cb9 100644 --- a/core/crypto/pedersen_hash.go +++ b/core/crypto/pedersen_hash.go @@ -8,7 +8,7 @@ import ( // PedersenArray implements [Pedersen array hashing]. // -// [Pedersen array hashing]: https://docs.starknet.io/documentation/develop/Hashing/hash-functions/#array_hashing +// [Pedersen array hashing]: https://docs.starknet.io/architecture-and-concepts/cryptography/hash-functions/#array_hashing func PedersenArray(elems ...*felt.Felt) *felt.Felt { var digest PedersenDigest return digest.Update(elems...).Finish() @@ -16,7 +16,7 @@ func PedersenArray(elems ...*felt.Felt) *felt.Felt { // Pedersen implements the [Pedersen hash]. // -// [Pedersen hash]: https://docs.starknet.io/documentation/develop/Hashing/hash-functions/#pedersen_hash +// [Pedersen hash]: https://docs.starknet.io/architecture-and-concepts/cryptography/hash-functions/#pedersen_hash func Pedersen(a, b *felt.Felt) *felt.Felt { hash := pedersenhash.Pedersen(a.Impl(), b.Impl()) return felt.NewFelt(&hash) diff --git a/core/crypto/pedersen_hash_test.go b/core/crypto/pedersen_hash_test.go index f4352dd594..d93dc5e774 100644 --- a/core/crypto/pedersen_hash_test.go +++ b/core/crypto/pedersen_hash_test.go @@ -58,8 +58,7 @@ func TestPedersenArray(t *testing.T) { // Contract address calculation. See the following links for how the // calculation is carried out and the result referenced. // - // https://docs.starknet.io/documentation/develop/Contracts/contract-address/ - // https://alpha4.starknet.io/feeder_gateway/get_transaction?transactionHash=0x1b50380d45ebd70876518203f131a12428b2ac1a3a75f1a74241a4abdd614e8 + // https://docs.starknet.io/architecture-and-concepts/smart-contracts/contract-address/ { input: []string{ // Hex representation of []byte("STARKNET_CONTRACT_ADDRESS"). diff --git a/core/crypto/poseidon_hash.go b/core/crypto/poseidon_hash.go index 4290bf2105..eaf9e1f5c2 100644 --- a/core/crypto/poseidon_hash.go +++ b/core/crypto/poseidon_hash.go @@ -42,7 +42,7 @@ func round(state []felt.Felt, full bool, index int) { mixLayer(state) } -func hadesPermutation(state []felt.Felt) { +func HadesPermutation(state []felt.Felt) { initialiseRoundKeys.Do(setRoundKeys) totalRounds := fullRounds + partialRounds for i := 0; i < totalRounds; i++ { @@ -55,10 +55,10 @@ var two = new(felt.Felt).SetUint64(2) // Poseidon implements the [Poseidon hash]. // -// [Poseidon hash]: https://docs.starknet.io/documentation/architecture_and_concepts/Hashing/hash-functions/#poseidon_hash +// [Poseidon hash]: https://docs.starknet.io/architecture-and-concepts/cryptography/hash-functions/#poseidon_hash func Poseidon(x, y *felt.Felt) *felt.Felt { state := []felt.Felt{*x, *y, *two} - hadesPermutation(state) + HadesPermutation(state) return new(felt.Felt).Set(&state[0]) } @@ -70,14 +70,14 @@ var one = new(felt.Felt).SetUint64(1) // // PoseidonArray implements [Poseidon array hashing]. // -// [Poseidon array hashing]: https://docs.starknet.io/documentation/architecture_and_concepts/Hashing/hash-functions/#poseidon_array_hash +// [Poseidon array hashing]: https://docs.starknet.io/architecture-and-concepts/cryptography/hash-functions/#poseidon_array_hash func PoseidonArray(elems ...*felt.Felt) *felt.Felt { state := []felt.Felt{{}, {}, {}} for i := 0; i < len(elems)/2; i++ { state[0].Add(&state[0], elems[2*i]) state[1].Add(&state[1], elems[2*i+1]) - hadesPermutation(state) + HadesPermutation(state) } rem := len(elems) % 2 @@ -85,7 +85,7 @@ func PoseidonArray(elems ...*felt.Felt) *felt.Felt { state[0].Add(&state[0], elems[len(elems)-1]) } state[rem].Add(&state[rem], one) - hadesPermutation(state) + HadesPermutation(state) return new(felt.Felt).Set(&state[0]) } @@ -127,7 +127,7 @@ func (d *PoseidonDigest) Update(elems ...*felt.Felt) Digest { } else { d.state[0].Add(&d.state[0], d.lastElem) d.state[1].Add(&d.state[1], elems[idx]) - hadesPermutation(d.state[:]) + HadesPermutation(d.state[:]) d.lastElem = nil } } @@ -141,7 +141,7 @@ func (d *PoseidonDigest) Finish() *felt.Felt { d.state[0].Add(&d.state[0], d.lastElem) d.state[1].Add(&d.state[1], one) } - hadesPermutation(d.state[:]) + HadesPermutation(d.state[:]) return &d.state[0] } diff --git a/core/crypto/poseidon_hash_pkg_test.go b/core/crypto/poseidon_hash_pkg_test.go index a668af4aad..06484364b2 100644 --- a/core/crypto/poseidon_hash_pkg_test.go +++ b/core/crypto/poseidon_hash_pkg_test.go @@ -10,7 +10,7 @@ import ( // Test vector from https://github.com/starkware-industries/poseidon func TestPermutate(t *testing.T) { state := []felt.Felt{{}, {}, {}} - hadesPermutation(state) + HadesPermutation(state) assert.Equal(t, "3446325744004048536138401612021367625846492093718951375866996507163446763827", state[0].Text(10)) assert.Equal(t, "1590252087433376791875644726012779423683501236913937337746052470473806035332", state[1].Text(10)) assert.Equal(t, "867921192302518434283879514999422690776342565400001269945778456016268852423", state[2].Text(10)) diff --git a/core/receipt.go b/core/receipt.go new file mode 100644 index 0000000000..0984118c28 --- /dev/null +++ b/core/receipt.go @@ -0,0 +1,83 @@ +package core + +import ( + "github.com/NethermindEth/juno/core/crypto" + "github.com/NethermindEth/juno/core/felt" + "github.com/NethermindEth/juno/core/trie" +) + +type GasConsumed struct { + L1Gas uint64 + L1DataGas uint64 +} + +type TransactionReceipt struct { + Fee *felt.Felt + FeeUnit FeeUnit + Events []*Event + ExecutionResources *ExecutionResources + L1ToL2Message *L1ToL2Message + L2ToL1Message []*L2ToL1Message + TransactionHash *felt.Felt + Reverted bool + RevertReason string +} + +func (r *TransactionReceipt) hash() *felt.Felt { + revertReasonHash := &felt.Zero + if r.Reverted { + revertReasonHash = crypto.StarknetKeccak([]byte(r.RevertReason)) + } + + var totalGasConsumed GasConsumed + // pre 0.13.2 TotalGasConsumed property is not set, in this case we rely on zero value above + if r.ExecutionResources != nil && r.ExecutionResources.TotalGasConsumed != nil { + totalGasConsumed = *r.ExecutionResources.TotalGasConsumed + } + + return crypto.PoseidonArray( + r.TransactionHash, + r.Fee, + messagesSentHash(r.L2ToL1Message), + revertReasonHash, + &felt.Zero, // L2 gas consumed + new(felt.Felt).SetUint64(totalGasConsumed.L1Gas), + new(felt.Felt).SetUint64(totalGasConsumed.L1DataGas), + ) +} + +func messagesSentHash(messages []*L2ToL1Message) *felt.Felt { + chain := []*felt.Felt{ + new(felt.Felt).SetUint64(uint64(len(messages))), + } + for _, msg := range messages { + msgTo := new(felt.Felt).SetBytes(msg.To.Bytes()) + payloadSize := new(felt.Felt).SetUint64(uint64(len(msg.Payload))) + chain = append(chain, msg.From, msgTo, payloadSize) + chain = append(chain, msg.Payload...) + } + + return crypto.PoseidonArray(chain...) +} + +func receiptCommitment(receipts []*TransactionReceipt) (*felt.Felt, error) { + var commitment *felt.Felt + + return commitment, trie.RunOnTempTriePoseidon(commitmentTrieHeight, func(trie *trie.Trie) error { + for i, receipt := range receipts { + receiptTrieKey := new(felt.Felt).SetUint64(uint64(i)) + _, err := trie.Put(receiptTrieKey, receipt.hash()) + if err != nil { + return err + } + } + + root, err := trie.Root() + if err != nil { + return err + } + commitment = root + + return nil + }) +} diff --git a/core/state.go b/core/state.go index 7c619f016a..b7f148183a 100644 --- a/core/state.go +++ b/core/state.go @@ -511,7 +511,6 @@ func (s *State) updateDeclaredClassesTrie(declaredClasses map[felt.Felt]*felt.Fe continue } - // https://docs.starknet.io/documentation/starknet_versions/upcoming_versions/#commitment leafValue := crypto.Poseidon(leafVersion, compiledClassHash) if _, err = classesTrie.Put(&classHash, leafValue); err != nil { return err @@ -603,7 +602,8 @@ func (s *State) Revert(blockNumber uint64, update *StateUpdate) error { } func (s *State) removeDeclaredClasses(blockNumber uint64, v0Classes []*felt.Felt, v1Classes map[felt.Felt]*felt.Felt) error { - var classHashes []*felt.Felt + totalCapacity := len(v0Classes) + len(v1Classes) + classHashes := make([]*felt.Felt, 0, totalCapacity) classHashes = append(classHashes, v0Classes...) for classHash := range v1Classes { classHashes = append(classHashes, classHash.Clone()) diff --git a/core/state_update.go b/core/state_update.go index 63e291e402..50501e9479 100644 --- a/core/state_update.go +++ b/core/state_update.go @@ -1,8 +1,8 @@ package core import ( - "fmt" - "sort" + "maps" + "slices" "github.com/NethermindEth/juno/core/crypto" "github.com/NethermindEth/juno/core/felt" @@ -35,6 +35,61 @@ func EmptyStateDiff() *StateDiff { } } +func (d *StateDiff) Length() uint64 { + var length int + + for _, storageDiff := range d.StorageDiffs { + length += len(storageDiff) + } + length += len(d.Nonces) + length += len(d.DeployedContracts) + length += len(d.DeclaredV0Classes) + length += len(d.DeclaredV1Classes) + length += len(d.ReplacedClasses) + + return uint64(length) +} + +func (d *StateDiff) Hash() *felt.Felt { + digest := new(crypto.PoseidonDigest) + + digest.Update(new(felt.Felt).SetBytes([]byte("STARKNET_STATE_DIFF0"))) + + // updated_contracts = deployedContracts + replacedClasses + // Digest: [number_of_updated_contracts, address_0, class_hash_0, address_1, class_hash_1, ...]. + updatedContractsDigest(d.DeployedContracts, d.ReplacedClasses, digest) + + // declared classes + // Digest: [number_of_declared_classes, class_hash_0, compiled_class_hash_0, class_hash_1, compiled_class_hash_1, + // ...]. + declaredClassesDigest(d.DeclaredV1Classes, digest) + + // deprecated_declared_classes + // Digest: [number_of_old_declared_classes, class_hash_0, class_hash_1, ...]. + deprecatedDeclaredClassesDigest(d.DeclaredV0Classes, digest) + + // Placeholder values + digest.Update(new(felt.Felt).SetUint64(1), new(felt.Felt).SetUint64(0)) + + // storage_diffs + // Digest: [ + // number_of_updated_contracts, + // contract_address_0, number_of_updates_in_contract_0, key_0, value0, key1, value1, ..., + // contract_address_1, number_of_updates_in_contract_1, key_0, value0, key1, value1, ..., + // ] + storageDiffDigest(d.StorageDiffs, digest) + + // nonces + // Digest: [number_of_updated_contracts nonces, contract_address_0, nonce_0, contract_address_1, nonce_1, ...] + noncesDigest(d.Nonces, digest) + + /*Poseidon( + "STARKNET_STATE_DIFF0", deployed_contracts_and_replaced_classes, declared_classes, deprecated_declared_classes, + 1, 0, storage_diffs, nonces + )*/ + return digest.Finish() +} + func (d *StateDiff) Commitment() *felt.Felt { version := felt.Zero var tmpFelt felt.Felt @@ -43,59 +98,21 @@ func (d *StateDiff) Commitment() *felt.Felt { hash_of_deployed_contracts=hash([number_of_deployed_contracts, address_1, class_hash_1, address_2, class_hash_2, ...]) */ - var hashOfDeployedContracts crypto.PoseidonDigest - deployedReplacedAddresses := make([]felt.Felt, 0, len(d.DeployedContracts)+len(d.ReplacedClasses)) - for addr := range d.DeployedContracts { - deployedReplacedAddresses = append(deployedReplacedAddresses, addr) - } - for addr := range d.ReplacedClasses { - deployedReplacedAddresses = append(deployedReplacedAddresses, addr) - } - hashOfDeployedContracts.Update(tmpFelt.SetUint64(uint64(len(deployedReplacedAddresses)))) - sort.Slice(deployedReplacedAddresses, func(i, j int) bool { - switch deployedReplacedAddresses[i].Cmp(&deployedReplacedAddresses[j]) { - case -1: - return true - case 1: - return false - default: - // The sequencer guarantees that a contract cannot be: - // - deployed twice, - // - deployed and have its class replaced in the same state diff, or - // - have its class replaced multiple times in the same state diff. - panic(fmt.Sprintf("address appears twice in deployed and replaced addresses: %s", &deployedReplacedAddresses[i])) - } - }) - for idx := range deployedReplacedAddresses { - addr := deployedReplacedAddresses[idx] - classHash, ok := d.DeployedContracts[addr] - if !ok { - classHash = d.ReplacedClasses[addr] - } - hashOfDeployedContracts.Update(&addr, classHash) - } + hashOfDeployedContracts := new(crypto.PoseidonDigest) + updatedContractsDigest(d.DeployedContracts, d.ReplacedClasses, hashOfDeployedContracts) /* hash_of_declared_classes = hash([number_of_declared_classes, class_hash_1, compiled_class_hash_1, class_hash_2, compiled_class_hash_2, ...]) */ - var hashOfDeclaredClasses crypto.PoseidonDigest - hashOfDeclaredClasses.Update(tmpFelt.SetUint64(uint64(len(d.DeclaredV1Classes)))) - declaredV1ClassHashes := sortedFeltKeys(d.DeclaredV1Classes) - for idx := range declaredV1ClassHashes { - classHash := declaredV1ClassHashes[idx] - hashOfDeclaredClasses.Update(&classHash, d.DeclaredV1Classes[classHash]) - } + hashOfDeclaredClasses := new(crypto.PoseidonDigest) + declaredClassesDigest(d.DeclaredV1Classes, hashOfDeclaredClasses) /* hash_of_old_declared_classes = hash([number_of_old_declared_classes, class_hash_1, class_hash_2, ...]) */ - var hashOfOldDeclaredClasses crypto.PoseidonDigest - hashOfOldDeclaredClasses.Update(tmpFelt.SetUint64(uint64(len(d.DeclaredV0Classes)))) - sort.Slice(d.DeclaredV0Classes, func(i, j int) bool { - return d.DeclaredV0Classes[i].Cmp(d.DeclaredV0Classes[j]) == -1 - }) - hashOfOldDeclaredClasses.Update(d.DeclaredV0Classes...) + hashOfOldDeclaredClasses := new(crypto.PoseidonDigest) + deprecatedDeclaredClassesDigest(d.DeclaredV0Classes, hashOfOldDeclaredClasses) /* flattened_storage_diffs = [number_of_updated_contracts, contract_address_1, number_of_updates_in_contract, @@ -104,26 +121,11 @@ func (d *StateDiff) Commitment() *felt.Felt { hash_of_storage_domain_state_diff = hash([*flattened_storage_diffs, *flattened_nonces]) */ daModeL1 := 0 - hashOfStorageDomains := make([]crypto.PoseidonDigest, 1) - - sortedStorageDiffAddrs := sortedFeltKeys(d.StorageDiffs) - hashOfStorageDomains[daModeL1].Update(tmpFelt.SetUint64(uint64(len(sortedStorageDiffAddrs)))) - for idx, addr := range sortedStorageDiffAddrs { - hashOfStorageDomains[daModeL1].Update(&sortedStorageDiffAddrs[idx]) - diffKeys := sortedFeltKeys(d.StorageDiffs[sortedStorageDiffAddrs[idx]]) - - hashOfStorageDomains[daModeL1].Update(tmpFelt.SetUint64(uint64(len(diffKeys)))) - for idx := range diffKeys { - key := diffKeys[idx] - hashOfStorageDomains[daModeL1].Update(&key, d.StorageDiffs[addr][key]) - } - } + hashOfStorageDomains := make([]*crypto.PoseidonDigest, 1) + hashOfStorageDomains[daModeL1] = new(crypto.PoseidonDigest) - sortedNonceKeys := sortedFeltKeys(d.Nonces) - hashOfStorageDomains[daModeL1].Update(tmpFelt.SetUint64(uint64(len(sortedNonceKeys)))) - for idx := range sortedNonceKeys { - hashOfStorageDomains[daModeL1].Update(&sortedNonceKeys[idx], d.Nonces[sortedNonceKeys[idx]]) - } + storageDiffDigest(d.StorageDiffs, hashOfStorageDomains[daModeL1]) + noncesDigest(d.Nonces, hashOfStorageDomains[daModeL1]) /* flattened_total_state_diff = hash([state_diff_version, @@ -131,7 +133,7 @@ func (d *StateDiff) Commitment() *felt.Felt { hash_of_old_declared_classes, number_of_DA_modes, DA_mode_0, hash_of_storage_domain_state_diff_0, DA_mode_1, hash_of_storage_domain_state_diff_1, …]) */ - var commitmentDigest crypto.PoseidonDigest + commitmentDigest := new(crypto.PoseidonDigest) commitmentDigest.Update(&version, hashOfDeployedContracts.Finish(), hashOfDeclaredClasses.Finish(), hashOfOldDeclaredClasses.Finish()) commitmentDigest.Update(tmpFelt.SetUint64(uint64(len(hashOfStorageDomains)))) for idx := range hashOfStorageDomains { @@ -145,9 +147,69 @@ func sortedFeltKeys[V any](m map[felt.Felt]V) []felt.Felt { for addr := range m { keys = append(keys, addr) } - sort.Slice(keys, func(i, j int) bool { - return keys[i].Cmp(&keys[j]) == -1 - }) - + slices.SortFunc(keys, func(a, b felt.Felt) int { return a.Cmp(&b) }) return keys } + +func updatedContractsDigest(deployedContracts, replacedClasses map[felt.Felt]*felt.Felt, digest *crypto.PoseidonDigest) { + numOfUpdatedContracts := uint64(len(deployedContracts) + len(replacedClasses)) + digest.Update(new(felt.Felt).SetUint64(numOfUpdatedContracts)) + + // The sequencer guarantees that a contract cannot be: + // - deployed twice, + // - deployed and have its class replaced in the same state diff, or + // - have its class replaced multiple times in the same state diff. + updatedContracts := make(map[felt.Felt]*felt.Felt) + maps.Copy(updatedContracts, deployedContracts) + maps.Copy(updatedContracts, replacedClasses) + + sortedUpdatedContractsHashes := sortedFeltKeys(updatedContracts) + for _, hash := range sortedUpdatedContractsHashes { + digest.Update(&hash, updatedContracts[hash]) + } +} + +func declaredClassesDigest(declaredV1Classes map[felt.Felt]*felt.Felt, digest *crypto.PoseidonDigest) { + numOfDeclaredClasses := uint64(len(declaredV1Classes)) + digest.Update(new(felt.Felt).SetUint64(numOfDeclaredClasses)) + + sortedDeclaredV1ClassHashes := sortedFeltKeys(declaredV1Classes) + for _, classHash := range sortedDeclaredV1ClassHashes { + digest.Update(&classHash, declaredV1Classes[classHash]) + } +} + +func deprecatedDeclaredClassesDigest(declaredV0Classes []*felt.Felt, digest *crypto.PoseidonDigest) { + numOfDeclaredV0Classes := uint64(len(declaredV0Classes)) + digest.Update(new(felt.Felt).SetUint64(numOfDeclaredV0Classes)) + + slices.SortFunc(declaredV0Classes, func(a, b *felt.Felt) int { return a.Cmp(b) }) + digest.Update(declaredV0Classes...) +} + +func storageDiffDigest(storageDiffs map[felt.Felt]map[felt.Felt]*felt.Felt, digest *crypto.PoseidonDigest) { + numOfStorageDiffs := uint64(len(storageDiffs)) + digest.Update(new(felt.Felt).SetUint64(numOfStorageDiffs)) + + sortedStorageDiffAddrs := sortedFeltKeys(storageDiffs) + for _, addr := range sortedStorageDiffAddrs { + digest.Update(&addr) + + sortedDiffKeys := sortedFeltKeys(storageDiffs[addr]) + digest.Update(new(felt.Felt).SetUint64(uint64(len(sortedDiffKeys)))) + + for _, k := range sortedDiffKeys { + digest.Update(&k, storageDiffs[addr][k]) + } + } +} + +func noncesDigest(nonces map[felt.Felt]*felt.Felt, digest *crypto.PoseidonDigest) { + numOfNonces := uint64(len(nonces)) + digest.Update(new(felt.Felt).SetUint64(numOfNonces)) + + sortedNoncesAddrs := sortedFeltKeys(nonces) + for _, addr := range sortedNoncesAddrs { + digest.Update(&addr, nonces[addr]) + } +} diff --git a/core/state_update_test.go b/core/state_update_test.go index 0d03b4f67e..74fac50699 100644 --- a/core/state_update_test.go +++ b/core/state_update_test.go @@ -2,6 +2,7 @@ package core_test import ( "context" + "fmt" "testing" "github.com/NethermindEth/juno/clients/feeder" @@ -36,9 +37,65 @@ func TestStateDiffCommitment(t *testing.T) { expected: "0x32a531da56a82f993a29b3cfe4102b1589ddbc64bfd7be24706ab2b5ac2dba5", }, } { - su, err := gw.StateUpdate(context.Background(), test.blockNum) - require.NoError(t, err) - commitment := su.StateDiff.Commitment() - assert.Equal(t, utils.HexToFelt(t, test.expected), commitment) + t.Run(fmt.Sprintf("blockNum=%d", test.blockNum), func(t *testing.T) { + su, err := gw.StateUpdate(context.Background(), test.blockNum) + require.NoError(t, err) + commitment := su.StateDiff.Commitment() + assert.Equal(t, utils.HexToFelt(t, test.expected), commitment) + }) + } +} + +func TestStateDiffHash(t *testing.T) { + client := feeder.NewTestClient(t, &utils.SepoliaIntegration) + gw := adaptfeeder.New(client) + + for _, test := range []struct { + blockNum uint64 + expected string + }{ + { + blockNum: 37500, + expected: "0x114e85f23a3dc3febd8dccb01d701220dbf314dd30b2db2c649edcd4bc35b2b", + }, + { + blockNum: 35748, + expected: "0x23587c54d590b57b8e25acbf1e1a422eb4cd104e95ee4a681021a6bb7456afa", + }, + { + blockNum: 35749, + expected: "0x323feeef51cadc14d4a025eb541227b177f69d1e6052854de262ca5e18055a1", + }, + { + blockNum: 38748, + expected: "0x2bb5df3dccd80b8eb8ad3f759b0ba045d467a79f032605d35380c87f8e730be", + }, + } { + t.Run(fmt.Sprintf("blockNum_%d", test.blockNum), func(t *testing.T) { + su, err := gw.StateUpdate(context.Background(), test.blockNum) + require.NoError(t, err) + assert.Equal(t, utils.HexToFelt(t, test.expected), su.StateDiff.Hash()) + }) + } +} + +func TestStateDiffLength(t *testing.T) { + client := feeder.NewTestClient(t, &utils.Sepolia) + gw := adaptfeeder.New(client) + + for _, test := range []struct { + blockNum uint64 + expectedLength uint64 + }{ + {blockNum: 0, expectedLength: 11}, + {blockNum: 1, expectedLength: 1}, + {blockNum: 2, expectedLength: 1}, + } { + t.Run(fmt.Sprintf("blockNum=%d", test.blockNum), func(t *testing.T) { + su, err := gw.StateUpdate(context.Background(), test.blockNum) + require.NoError(t, err) + length := su.StateDiff.Length() + assert.Equal(t, test.expectedLength, length) + }) } } diff --git a/core/transaction.go b/core/transaction.go index 1f22c5dcb2..194a7b9ae7 100644 --- a/core/transaction.go +++ b/core/transaction.go @@ -64,7 +64,7 @@ type ResourceBounds struct { } func (rb ResourceBounds) Bytes(resource Resource) []byte { - maxAmountBytes := make([]byte, 8) //nolint:gomnd + maxAmountBytes := make([]byte, 8) //nolint:mnd binary.BigEndian.PutUint64(maxAmountBytes, rb.MaxAmount) maxPriceBytes := rb.MaxPricePerUnit.Bytes() return slices.Concat( @@ -100,6 +100,7 @@ type ExecutionResources struct { MemoryHoles uint64 Steps uint64 DataAvailability *DataAvailability + TotalGasConsumed *GasConsumed } type DataAvailability struct { @@ -117,18 +118,9 @@ type BuiltinInstanceCounter struct { Keccak uint64 Poseidon uint64 SegmentArena uint64 -} - -type TransactionReceipt struct { - Fee *felt.Felt - FeeUnit FeeUnit - Events []*Event - ExecutionResources *ExecutionResources - L1ToL2Message *L1ToL2Message - L2ToL1Message []*L2ToL1Message - TransactionHash *felt.Felt - Reverted bool - RevertReason string + AddMod uint64 + MulMod uint64 + RangeCheck96 uint64 } type Transaction interface { @@ -263,6 +255,7 @@ type InvokeTransaction struct { // Additional information given by the sender, used to validate the transaction. TransactionSignature []*felt.Felt // The maximum fee that the sender is willing to pay for the transaction + // Available in version 1 only MaxFee *felt.Felt // The address of the contract invoked by this transaction. ContractAddress *felt.Felt @@ -313,6 +306,7 @@ type DeclareTransaction struct { // The address of the account initiating the transaction. SenderAddress *felt.Felt // The maximum fee that the sender is willing to pay for the transaction. + // Available in versions 1, 2 MaxFee *felt.Felt // Additional information given by the sender, used to validate the transaction. TransactionSignature []*felt.Felt @@ -411,6 +405,8 @@ func TransactionHash(transaction Transaction, n *utils.Network) (*felt.Felt, err case *InvokeTransaction: return invokeTransactionHash(t, n) case *DeployTransaction: + // it's not always correct assumption because p2p peers do not provide this field + // so essentially we might return nil field for non-sepolia network and p2p sync // deploy transactions are deprecated after re-genesis therefore we don't verify // transaction hash return t.TransactionHash, nil @@ -634,12 +630,12 @@ func VerifyTransactions(txs []Transaction, n *utils.Network, protocolVersion str const commitmentTrieHeight = 64 -// transactionCommitment is the root of a height 64 binary Merkle Patricia tree of the +// transactionCommitmentPedersen is the root of a height 64 binary Merkle Patricia tree of the // transaction hashes and signatures in a block. -func transactionCommitment(transactions []Transaction, protocolVersion string) (*felt.Felt, error) { +func transactionCommitmentPedersen(transactions []Transaction, protocolVersion string) (*felt.Felt, error) { var commitment *felt.Felt v0_11_1 := semver.MustParse("0.11.1") - return commitment, trie.RunOnTempTrie(commitmentTrieHeight, func(trie *trie.Trie) error { + return commitment, trie.RunOnTempTriePedersen(commitmentTrieHeight, func(trie *trie.Trie) error { blockVersion, err := ParseBlockVersion(protocolVersion) if err != nil { return err @@ -669,6 +665,32 @@ func transactionCommitment(transactions []Transaction, protocolVersion string) ( }) } +func transactionCommitmentPoseidon(transactions []Transaction) (*felt.Felt, error) { + var commitment *felt.Felt + return commitment, trie.RunOnTempTriePoseidon(commitmentTrieHeight, func(trie *trie.Trie) error { + for i, transaction := range transactions { + var digest crypto.PoseidonDigest + digest.Update(transaction.Hash()) + + if txSignature := transaction.Signature(); len(txSignature) > 0 { + digest.Update(txSignature...) + } else { + digest.Update(&felt.Zero) + } + + if _, err := trie.Put(new(felt.Felt).SetUint64(uint64(i)), digest.Finish()); err != nil { + return err + } + } + root, err := trie.Root() + if err != nil { + return err + } + commitment = root + return nil + }) +} + // ParseBlockVersion computes the block version, defaulting to "0.0.0" for empty strings func ParseBlockVersion(protocolVersion string) (*semver.Version, error) { if protocolVersion == "" { @@ -684,10 +706,72 @@ func ParseBlockVersion(protocolVersion string) (*semver.Version, error) { return semver.NewVersion(strings.Join(digits[:3], sep)) } -// eventCommitment computes the event commitment for a block. -func eventCommitment(receipts []*TransactionReceipt) (*felt.Felt, error) { +// eventCommitmentPoseidon computes the event commitment for a block. +func eventCommitmentPoseidon(receipts []*TransactionReceipt) (*felt.Felt, error) { + var commitment *felt.Felt + return commitment, trie.RunOnTempTriePoseidon(commitmentTrieHeight, func(trie *trie.Trie) error { + eventCount := uint64(0) + numWorkers := runtime.GOMAXPROCS(0) + receiptPerWorker := len(receipts) / numWorkers + if receiptPerWorker == 0 { + receiptPerWorker = 1 + } + workerPool := pool.New().WithErrors().WithMaxGoroutines(numWorkers) + var trieMutex sync.Mutex + + for receiptIdx := range receipts { + if receiptIdx%receiptPerWorker == 0 { + curReceiptIdx := receiptIdx + curEventIdx := eventCount + + workerPool.Go(func() error { + maxIndex := curReceiptIdx + receiptPerWorker + if maxIndex > len(receipts) { + maxIndex = len(receipts) + } + receiptsSliced := receipts[curReceiptIdx:maxIndex] + + for _, receipt := range receiptsSliced { + for _, event := range receipt.Events { + hashElems := []*felt.Felt{event.From, receipt.TransactionHash} + hashElems = append(hashElems, new(felt.Felt).SetUint64(uint64(len(event.Keys)))) + hashElems = append(hashElems, event.Keys...) + hashElems = append(hashElems, new(felt.Felt).SetUint64(uint64(len(event.Data)))) + hashElems = append(hashElems, event.Data...) + + eventHash := crypto.PoseidonArray(hashElems...) + + eventTrieKey := new(felt.Felt).SetUint64(curEventIdx) + trieMutex.Lock() + _, err := trie.Put(eventTrieKey, eventHash) + trieMutex.Unlock() + if err != nil { + return err + } + curEventIdx++ + } + } + return nil + }) + } + eventCount += uint64(len(receipts[receiptIdx].Events)) + } + if err := workerPool.Wait(); err != nil { + return err + } + root, err := trie.Root() + if err != nil { + return err + } + commitment = root + return nil + }) +} + +// eventCommitmentPedersen computes the event commitment for a block. +func eventCommitmentPedersen(receipts []*TransactionReceipt) (*felt.Felt, error) { var commitment *felt.Felt - return commitment, trie.RunOnTempTrie(commitmentTrieHeight, func(trie *trie.Trie) error { + return commitment, trie.RunOnTempTriePedersen(commitmentTrieHeight, func(trie *trie.Trie) error { eventCount := uint64(0) numWorkers := runtime.GOMAXPROCS(0) receiptPerWorker := len(receipts) / numWorkers diff --git a/core/transaction_test.go b/core/transaction_test.go index c58517ac53..9b23ded7bd 100644 --- a/core/transaction_test.go +++ b/core/transaction_test.go @@ -277,7 +277,7 @@ func TestTransactionV3Hash(t *testing.T) { } } -func TestTransactionVersi(t *testing.T) { +func TestTransactionVersion(t *testing.T) { f := utils.HexToFelt(t, "0x100000000000000000000000000000002") v := (*core.TransactionVersion)(f) diff --git a/core/trie/key.go b/core/trie/key.go index dc946a5ef6..7f0e6af609 100644 --- a/core/trie/key.go +++ b/core/trie/key.go @@ -3,6 +3,7 @@ package trie import ( "bytes" "encoding/hex" + "errors" "fmt" "math/big" @@ -23,13 +24,13 @@ func NewKey(length uint8, keyBytes []byte) Key { return k } -func (k *Key) SubKey(n uint8) *Key { +func (k *Key) SubKey(n uint8) (*Key, error) { if n > k.len { - panic("n is greater than the length of the key") + return nil, errors.New(fmt.Sprint("cannot subtract key of length %i from key of length %i", n, k.len)) } newKey := &Key{len: n} - copy(newKey.bitset[:], k.bitset[len(k.bitset)-int((k.len+7)/8):]) //nolint:gomnd + copy(newKey.bitset[:], k.bitset[len(k.bitset)-int((k.len+7)/8):]) //nolint:mnd // Shift right by the number of bits that are not needed shift := k.len - n @@ -40,7 +41,7 @@ func (k *Key) SubKey(n uint8) *Key { } } - return newKey + return newKey, nil } func (k *Key) bytesNeeded() uint { diff --git a/core/trie/node.go b/core/trie/node.go index 7f4fb746e8..2975607390 100644 --- a/core/trie/node.go +++ b/core/trie/node.go @@ -8,10 +8,13 @@ import ( ) // A Node represents a node in the [Trie] +// https://docs.starknet.io/architecture-and-concepts/network-architecture/starknet-state/#trie_construction type Node struct { - Value *felt.Felt - Left *Key - Right *Key + Value *felt.Felt + Left *Key + Right *Key + LeftHash *felt.Felt + RightHash *felt.Felt } // Hash calculates the hash of a [Node] @@ -24,12 +27,17 @@ func (n *Node) Hash(path *Key, hashFunc hashFunc) *felt.Felt { } pathFelt := path.Felt() - // https://docs.starknet.io/documentation/develop/State/starknet-state/ hash := hashFunc(n.Value, &pathFelt) pathFelt.SetUint64(uint64(path.Len())) return hash.Add(hash, &pathFelt) } +// Hash calculates the hash of a [Node] +func (n *Node) HashFromParent(parnetKey, nodeKey *Key, hashFunc hashFunc) *felt.Felt { + path := path(nodeKey, parnetKey) + return n.Hash(&path, hashFunc) +} + func (n *Node) WriteTo(buf *bytes.Buffer) (int64, error) { if n.Value == nil { return 0, errors.New("cannot marshal node with nil value") @@ -45,18 +53,38 @@ func (n *Node) WriteTo(buf *bytes.Buffer) (int64, error) { } if n.Left != nil { - wrote, err := n.Left.WriteTo(buf) + wrote, errInner := n.Left.WriteTo(buf) totalBytes += wrote if err != nil { - return totalBytes, err + return totalBytes, errInner } - wrote, err = n.Right.WriteTo(buf) // n.Right is non-nil by design + wrote, errInner = n.Right.WriteTo(buf) // n.Right is non-nil by design totalBytes += wrote if err != nil { - return totalBytes, err + return totalBytes, errInner } } + if n.LeftHash == nil && n.RightHash == nil { + return totalBytes, nil + } else if (n.LeftHash != nil && n.RightHash == nil) || (n.LeftHash == nil && n.RightHash != nil) { + return totalBytes, errors.New("cannot store only one lefthash or righthash") + } + + leftHashB := n.LeftHash.Bytes() + wrote, err = buf.Write(leftHashB[:]) + totalBytes += int64(wrote) + if err != nil { + return totalBytes, err + } + + rightHashB := n.RightHash.Bytes() + wrote, err = buf.Write(rightHashB[:]) + totalBytes += int64(wrote) + if err != nil { + return totalBytes, err + } + return totalBytes, nil } @@ -74,6 +102,8 @@ func (n *Node) UnmarshalBinary(data []byte) error { if len(data) == 0 { n.Left = nil n.Right = nil + n.LeftHash = nil + n.RightHash = nil return nil } @@ -85,5 +115,26 @@ func (n *Node) UnmarshalBinary(data []byte) error { if err := n.Left.UnmarshalBinary(data); err != nil { return err } - return n.Right.UnmarshalBinary(data[n.Left.EncodedLen():]) + data = data[n.Left.EncodedLen():] + if err := n.Right.UnmarshalBinary(data); err != nil { + return err + } + data = data[n.Right.EncodedLen():] + + if n.LeftHash == nil { + n.LeftHash = new(felt.Felt) + } + if n.RightHash == nil { + n.RightHash = new(felt.Felt) + } + if len(data) == 0 { + return nil + } + if len(data) != 2*felt.Bytes { + return errors.New("the node does not contain both left and right hash") + } + n.LeftHash.SetBytes(data[:felt.Bytes]) + data = data[felt.Bytes:] + n.RightHash.SetBytes(data[:felt.Bytes]) + return nil } diff --git a/core/trie/proof.go b/core/trie/proof.go index 57e6bdeac0..f8f0e325ad 100644 --- a/core/trie/proof.go +++ b/core/trie/proof.go @@ -1,6 +1,7 @@ package trie import ( + "errors" "fmt" "github.com/NethermindEth/juno/core/felt" @@ -28,6 +29,13 @@ func (pn *ProofNode) Hash(hash hashFunc) *felt.Felt { } } +func (pn *ProofNode) Len() uint8 { + if pn.Binary != nil { + return 1 + } + return pn.Edge.Path.len +} + func (pn *ProofNode) PrettyPrint() { if pn.Binary != nil { fmt.Printf(" Binary:\n") @@ -38,7 +46,6 @@ func (pn *ProofNode) PrettyPrint() { fmt.Printf(" Edge:\n") fmt.Printf(" Child: %v\n", pn.Edge.Child) fmt.Printf(" Path: %v\n", pn.Edge.Path) - fmt.Printf(" Value: %v\n", pn.Edge.Value) } } @@ -48,12 +55,26 @@ type Binary struct { } type Edge struct { - Child *felt.Felt - Path *Key - Value *felt.Felt + Child *felt.Felt // child hash + Path *Key // path from parent to child +} + +func GetBoundaryProofs(leftBoundary, rightBoundary *Key, tri *Trie) ([2][]ProofNode, error) { + proofs := [2][]ProofNode{} + leftProof, err := GetProof(leftBoundary, tri) + if err != nil { + return proofs, err + } + rightProof, err := GetProof(rightBoundary, tri) + if err != nil { + return proofs, err + } + proofs[0] = leftProof + proofs[1] = rightProof + return proofs, nil } -func isEdge(parentKey *Key, sNode storageNode) bool { +func isEdge(parentKey *Key, sNode StorageNode) bool { sNodeLen := sNode.key.len if parentKey == nil { // Root return sNodeLen != 0 @@ -63,7 +84,7 @@ func isEdge(parentKey *Key, sNode storageNode) bool { // Note: we need to account for the fact that Junos Trie has nodes that are Binary AND Edge, // whereas the protocol requires nodes that are Binary XOR Edge -func transformNode(tri *Trie, parentKey *Key, sNode storageNode) (*Edge, *Binary, error) { +func transformNode(tri *Trie, parentKey *Key, sNode StorageNode) (*Edge, *Binary, error) { isEdgeBool := isEdge(parentKey, sNode) var edge *Edge @@ -87,7 +108,7 @@ func transformNode(tri *Trie, parentKey *Key, sNode storageNode) (*Edge, *Binary } rightHash := rNode.Value - if isEdge(sNode.key, storageNode{node: rNode, key: sNode.node.Right}) { + if isEdge(sNode.key, StorageNode{node: rNode, key: sNode.node.Right}) { edgePath := path(sNode.node.Right, sNode.key) rEdge := ProofNode{Edge: &Edge{ Path: &edgePath, @@ -96,7 +117,7 @@ func transformNode(tri *Trie, parentKey *Key, sNode storageNode) (*Edge, *Binary rightHash = rEdge.Hash(tri.hash) } leftHash := lNode.Value - if isEdge(sNode.key, storageNode{node: lNode, key: sNode.node.Left}) { + if isEdge(sNode.key, StorageNode{node: lNode, key: sNode.node.Left}) { edgePath := path(sNode.node.Left, sNode.key) lEdge := ProofNode{Edge: &Edge{ Path: &edgePath, @@ -113,9 +134,10 @@ func transformNode(tri *Trie, parentKey *Key, sNode storageNode) (*Edge, *Binary } // https://github.com/eqlabs/pathfinder/blob/main/crates/merkle-tree/src/tree.rs#L514 -func GetProof(leaf *felt.Felt, tri *Trie) ([]ProofNode, error) { - leafKey := tri.feltToKey(leaf) - nodesToLeaf, err := tri.nodesFromRoot(&leafKey) +// GetProof generates a set of proof nodes from the root to the leaf. +// The proof never contains the leaf node if it is set, as we already know it's hash. +func GetProof(key *Key, tri *Trie) ([]ProofNode, error) { + nodesFromRoot, err := tri.nodesFromRoot(key) if err != nil { return nil, err } @@ -123,8 +145,7 @@ func GetProof(leaf *felt.Felt, tri *Trie) ([]ProofNode, error) { var parentKey *Key - for i := 0; i < len(nodesToLeaf); i++ { - sNode := nodesToLeaf[i] + for i, sNode := range nodesFromRoot { sNodeEdge, sNodeBinary, err := transformNode(tri, parentKey, sNode) if err != nil { return nil, err @@ -140,7 +161,7 @@ func GetProof(leaf *felt.Felt, tri *Trie) ([]ProofNode, error) { } else if sNodeEdge == nil && sNodeBinary == nil { // sNode is a binary leaf break } - parentKey = nodesToLeaf[i].key + parentKey = nodesFromRoot[i].key } return proofNodes, nil } @@ -148,17 +169,13 @@ func GetProof(leaf *felt.Felt, tri *Trie) ([]ProofNode, error) { // verifyProof checks if `leafPath` leads from `root` to `leafHash` along the `proofNodes` // https://github.com/eqlabs/pathfinder/blob/main/crates/merkle-tree/src/tree.rs#L2006 func VerifyProof(root *felt.Felt, key *Key, value *felt.Felt, proofs []ProofNode, hash hashFunc) bool { - if key.Len() != 251 { //nolint:gomnd - return false - } - expectedHash := root - remainingPath := key - - for _, proofNode := range proofs { + remainingPath := NewKey(key.len, key.bitset[:]) + for i, proofNode := range proofs { if !proofNode.Hash(hash).Equal(expectedHash) { return false } + switch { case proofNode.Binary != nil: if remainingPath.Test(remainingPath.Len() - 1) { @@ -168,12 +185,333 @@ func VerifyProof(root *felt.Felt, key *Key, value *felt.Felt, proofs []ProofNode } remainingPath.RemoveLastBit() case proofNode.Edge != nil: - if !proofNode.Edge.Path.Equal(remainingPath.SubKey(proofNode.Edge.Path.Len())) { + subKey, err := remainingPath.SubKey(proofNode.Edge.Path.Len()) + if err != nil { + return false + } + + // Todo: + // If we are verifying the key doesn't exist, then we should + // update subKey to point in the other direction + if value == nil && i == len(proofs)-1 { + return true + } + + if !proofNode.Edge.Path.Equal(subKey) { return false } expectedHash = proofNode.Edge.Child - remainingPath.Truncate(proofNode.Edge.Path.Len()) + remainingPath.Truncate(251 - proofNode.Edge.Path.Len()) //nolint:mnd } } + return expectedHash.Equal(value) } + +// VerifyRangeProof verifies the range proof for the given range of keys. +// This is achieved by constructing a trie from the boundary proofs, and the supplied key-values. +// If the root of the reconstructed trie matches the supplied root, then the verification passes. +// If the trie is constructed incorrectly then the root will have an incorrect key(len,path), and value, +// and therefore it's hash won't match the expected root. +// ref: https://github.com/ethereum/go-ethereum/blob/v1.14.3/trie/proof.go#L484 +func VerifyRangeProof(root *felt.Felt, keys, values []*felt.Felt, proofKeys [2]*Key, proofValues [2]*felt.Felt, + proofs [2][]ProofNode, hash hashFunc, +) (bool, error) { + // Step 0: checks + if len(keys) != len(values) { + return false, fmt.Errorf("inconsistent proof data, number of keys: %d, number of values: %d", len(keys), len(values)) + } + + // Ensure all keys are monotonic increasing + if err := ensureMonotonicIncreasing(proofKeys, keys); err != nil { + return false, err + } + + // Ensure the inner values contain no deletions + for _, value := range values { + if value.Equal(&felt.Zero) { + return false, errors.New("range contains deletion") + } + } + + // Step 1: Verify proofs, and get proof paths + var proofPaths [2][]StorageNode + var err error + for i := 0; i < 2; i++ { + if proofs[i] != nil { + if !VerifyProof(root, proofKeys[i], proofValues[i], proofs[i], hash) { + return false, fmt.Errorf("invalid proof for key %x", proofKeys[i].String()) + } + + proofPaths[i], err = ProofToPath(proofs[i], proofKeys[i], hash) + if err != nil { + return false, err + } + } + } + + // Step 2: Build trie from proofPaths and keys + tmpTrie, err := BuildTrie(proofPaths[0], proofPaths[1], keys, values) + if err != nil { + return false, err + } + + // Verify that the recomputed root hash matches the provided root hash + recomputedRoot, err := tmpTrie.Root() + if err != nil { + return false, err + } + if !recomputedRoot.Equal(root) { + return false, errors.New("root hash mismatch") + } + + return true, nil +} + +func ensureMonotonicIncreasing(proofKeys [2]*Key, keys []*felt.Felt) error { + if proofKeys[0] != nil { + leftProofFelt := proofKeys[0].Felt() + if leftProofFelt.Cmp(keys[0]) >= 0 { + return errors.New("range is not monotonically increasing") + } + } + if proofKeys[1] != nil { + rightProofFelt := proofKeys[1].Felt() + if keys[len(keys)-1].Cmp(&rightProofFelt) >= 0 { + return errors.New("range is not monotonically increasing") + } + } + if len(keys) >= 2 { + for i := 0; i < len(keys)-1; i++ { + if keys[i].Cmp(keys[i+1]) >= 0 { + return errors.New("range is not monotonically increasing") + } + } + } + return nil +} + +// compressNode determines if the node needs compressed, and if so, the len needed to arrive at the next key +func compressNode(idx int, proofNodes []ProofNode, hashF hashFunc) (int, uint8, error) { + parent := &proofNodes[idx] + + if idx == len(proofNodes)-1 { + if parent.Edge != nil { + return 1, parent.Len(), nil + } + return 0, parent.Len(), nil + } + + child := &proofNodes[idx+1] + + switch { + case parent.Edge != nil && child.Binary != nil: + return 1, parent.Edge.Path.len, nil + case parent.Binary != nil && child.Edge != nil: + childHash := child.Hash(hashF) + if parent.Binary.LeftHash.Equal(childHash) || parent.Binary.RightHash.Equal(childHash) { + return 1, child.Edge.Path.len, nil + } else { + return 0, 0, errors.New("can't determine the child hash from the parent and child") + } + } + + return 0, 1, nil +} + +func assignChild(i, compressedParent int, parentNode *Node, + nilKey, leafKey, parentKey *Key, proofNodes []ProofNode, hashF hashFunc, +) (*Key, error) { + childInd := i + compressedParent + 1 + childKey, err := getChildKey(childInd, parentKey, leafKey, nilKey, proofNodes, hashF) + if err != nil { + return nil, err + } + if leafKey.Test(leafKey.len - parentKey.len - 1) { + parentNode.Right = childKey + parentNode.Left = nilKey + } else { + parentNode.Right = nilKey + parentNode.Left = childKey + } + return childKey, nil +} + +// ProofToPath returns a set of storage nodes from the root to the end of the proof path. +// The storage nodes will have the hashes of the children, but only the key of the child +// along the path outlined by the proof. +func ProofToPath(proofNodes []ProofNode, leafKey *Key, hashF hashFunc) ([]StorageNode, error) { + pathNodes := []StorageNode{} + + // Child keys that can't be derived are set to nilKey, so that we can store the node + zeroFeltBytes := new(felt.Felt).Bytes() + nilKey := NewKey(0, zeroFeltBytes[:]) + + for i, pNode := range proofNodes { + // Keep moving along the path (may need to skip nodes that were compressed into the last path node) + if i != 0 { + if skipNode(pNode, pathNodes, hashF) { + continue + } + } + + var parentKey *Key + parentNode := Node{} + + // Set the key of the current node + compressParent, compressParentOffset, err := compressNode(i, proofNodes, hashF) + if err != nil { + return nil, err + } + parentKey, err = getParentKey(i, compressParentOffset, leafKey, pNode, pathNodes, proofNodes) + if err != nil { + return nil, err + } + + // Don't store leafs along proof paths + if parentKey.len == 251 { //nolint:mnd + break + } + + // Set the value of the current node + parentNode.Value = pNode.Hash(hashF) + + // Set the child key of the current node. + childKey, err := assignChild(i, compressParent, &parentNode, &nilKey, leafKey, parentKey, proofNodes, hashF) + if err != nil { + return nil, err + } + + // Set the LeftHash and RightHash values + parentNode.LeftHash, parentNode.RightHash, err = getLeftRightHash(i, proofNodes) + if err != nil { + return nil, err + } + pathNodes = append(pathNodes, StorageNode{key: parentKey, node: &parentNode}) + + // break early since we don't store leafs along proof paths, or if no more nodes exist along the proof paths + if childKey.len == 0 || childKey.len == 251 { + break + } + } + return pathNodes, nil +} + +func skipNode(pNode ProofNode, pathNodes []StorageNode, hashF hashFunc) bool { + lastNode := pathNodes[len(pathNodes)-1].node + noLeftMatch, noRightMatch := false, false + if lastNode.LeftHash != nil && !pNode.Hash(hashF).Equal(lastNode.LeftHash) { + noLeftMatch = true + } + if lastNode.RightHash != nil && !pNode.Hash(hashF).Equal(lastNode.RightHash) { + noRightMatch = true + } + if noLeftMatch && noRightMatch { + return true + } + return false +} + +func getLeftRightHash(parentInd int, proofNodes []ProofNode) (*felt.Felt, *felt.Felt, error) { + parent := &proofNodes[parentInd] + if parent.Binary == nil { + if parentInd+1 > len(proofNodes)-1 { + return nil, nil, errors.New("cant get hash of children from proof node, out of range") + } + parent = &proofNodes[parentInd+1] + } + return parent.Binary.LeftHash, parent.Binary.RightHash, nil +} + +func getParentKey(idx int, compressedParentOffset uint8, leafKey *Key, + pNode ProofNode, pathNodes []StorageNode, proofNodes []ProofNode, +) (*Key, error) { + var crntKey *Key + var err error + + var height uint8 + if len(pathNodes) > 0 { + if proofNodes[idx].Edge != nil { + height = pathNodes[len(pathNodes)-1].key.len + proofNodes[idx].Edge.Path.len + } else { + height = pathNodes[len(pathNodes)-1].key.len + 1 + } + } else { + height = 0 + } + + if pNode.Binary != nil { + crntKey, err = leafKey.SubKey(height) + } else { + crntKey, err = leafKey.SubKey(height + compressedParentOffset) + } + return crntKey, err +} + +func getChildKey(childIdx int, crntKey, leafKey, nilKey *Key, proofNodes []ProofNode, hashF hashFunc) (*Key, error) { + if childIdx > len(proofNodes)-1 { + return nilKey, nil + } + + compressChild, compressChildOffset, err := compressNode(childIdx, proofNodes, hashF) + if err != nil { + return nil, err + } + + if crntKey.len+uint8(compressChild)+compressChildOffset == 251 { //nolint:mnd + return nilKey, nil + } + + return leafKey.SubKey(crntKey.len + uint8(compressChild) + compressChildOffset) +} + +// BuildTrie builds a trie using the proof paths (including inner nodes), and then sets all the keys-values (leaves) +func BuildTrie(leftProofPath, rightProofPath []StorageNode, keys, values []*felt.Felt) (*Trie, error) { //nolint:gocyclo + tempTrie, err := NewTriePedersen(newMemStorage(), 251) //nolint:mnd + if err != nil { + return nil, err + } + + // merge proof paths + for i := range min(len(leftProofPath), len(rightProofPath)) { + // Can't store nil keys so stop merging + if leftProofPath[i].node.Left == nil || leftProofPath[i].node.Right == nil || + rightProofPath[i].node.Left == nil || rightProofPath[i].node.Right == nil { + break + } + if leftProofPath[i].key.Equal(rightProofPath[i].key) { + leftProofPath[i].node.Right = rightProofPath[i].node.Right + rightProofPath[i].node.Left = leftProofPath[i].node.Left + } else { + break + } + } + + for _, sNode := range leftProofPath { + if sNode.node.Left == nil || sNode.node.Right == nil { + break + } + _, err := tempTrie.PutInner(sNode.key, sNode.node) + if err != nil { + return nil, err + } + } + + for _, sNode := range rightProofPath { + if sNode.node.Left == nil || sNode.node.Right == nil { + break + } + _, err := tempTrie.PutInner(sNode.key, sNode.node) + if err != nil { + return nil, err + } + } + + for i := range len(keys) { + _, err := tempTrie.PutWithProof(keys[i], values[i], leftProofPath, rightProofPath) + if err != nil { + return nil, err + } + } + return tempTrie, nil +} diff --git a/core/trie/proof_test.go b/core/trie/proof_test.go index 0ae9c78513..a566ac2d02 100644 --- a/core/trie/proof_test.go +++ b/core/trie/proof_test.go @@ -1,7 +1,6 @@ package trie_test import ( - "fmt" "testing" "github.com/NethermindEth/juno/core/crypto" @@ -14,9 +13,9 @@ import ( ) func buildSimpleTrie(t *testing.T) *trie.Trie { - // (250, 0, x1) + // (250, 0, x1) edge // | - // (0,0,x1) + // (0,0,x1) binary // / \ // (2) (3) // Build trie @@ -24,7 +23,7 @@ func buildSimpleTrie(t *testing.T) *trie.Trie { txn, err := memdb.NewTransaction(true) require.NoError(t, err) - tempTrie, err := trie.NewTriePedersen(trie.NewStorage(txn, []byte{1}), 251) + tempTrie, err := trie.NewTriePedersen(trie.NewStorage(txn, []byte{0}), 251) require.NoError(t, err) // Update trie @@ -44,12 +43,18 @@ func buildSimpleTrie(t *testing.T) *trie.Trie { } func buildSimpleBinaryRootTrie(t *testing.T) *trie.Trie { + // PF // (0, 0, x) // / \ // (250, 0, cc) (250, 11111.., dd) // | | // (cc) (dd) - // Build trie + + // JUNO + // (0, 0, x) + // / \ + // (251, 0, cc) (251, 11111.., dd) + memdb := pebble.NewMemTest(t) txn, err := memdb.NewTransaction(true) require.NoError(t, err) @@ -72,7 +77,15 @@ func buildSimpleBinaryRootTrie(t *testing.T) *trie.Trie { return tempTrie } -func buildSimpleDoubleBinaryTrie(t *testing.T) *trie.Trie { +func buildSimpleDoubleBinaryTrie(t *testing.T) (*trie.Trie, []trie.ProofNode) { + // (249,0,x3) // Edge + // | + // (0, 0, x3) // Binary + // / \ + // (0,0,x1) // B (1, 1, 5) // Edge leaf + // / \ | + // (2) (3) (5) + // Build trie memdb := pebble.NewMemTest(t) txn, err := memdb.NewTransaction(true) @@ -99,11 +112,148 @@ func buildSimpleDoubleBinaryTrie(t *testing.T) *trie.Trie { require.NoError(t, err) require.NoError(t, tempTrie.Commit()) + + zero := trie.NewKey(249, []byte{0}) + key3Bytes := new(felt.Felt).SetUint64(1).Bytes() + path3 := trie.NewKey(1, key3Bytes[:]) + expectedProofNodes := []trie.ProofNode{ + { + Edge: &trie.Edge{ + Path: &zero, + Child: utils.HexToFelt(t, "0x055C81F6A791FD06FC2E2CCAD922397EC76C3E35F2E06C0C0D43D551005A8DEA"), + }, + }, + { + Binary: &trie.Binary{ + LeftHash: utils.HexToFelt(t, "0x05774FA77B3D843AE9167ABD61CF80365A9B2B02218FC2F628494B5BDC9B33B8"), + RightHash: utils.HexToFelt(t, "0x07C5BC1CC68B7BC8CA2F632DE98297E6DA9594FA23EDE872DD2ABEAFDE353B43"), + }, + }, + { + Edge: &trie.Edge{ + Path: &path3, + Child: value3, + }, + }, + } + + return tempTrie, expectedProofNodes +} + +func build3KeyTrie(t *testing.T) *trie.Trie { + // Starknet + // -------- + // + // Edge + // | + // Binary with len 249 parent + // / \ + // Binary (250) Edge with len 250 + // / \ / + // 0x4 0x5 0x6 child + + // Juno + // ---- + // + // Node (path 249) + // / \ + // Node (binary) \ + // / \ / + // 0x4 0x5 0x6 + + // Build trie + memdb := pebble.NewMemTest(t) + txn, err := memdb.NewTransaction(true) + require.NoError(t, err) + + tempTrie, err := trie.NewTriePedersen(trie.NewStorage(txn, []byte{0}), 251) + require.NoError(t, err) + + // Update trie + key1 := new(felt.Felt).SetUint64(0) + key2 := new(felt.Felt).SetUint64(1) + key3 := new(felt.Felt).SetUint64(2) + value1 := new(felt.Felt).SetUint64(4) + value2 := new(felt.Felt).SetUint64(5) + value3 := new(felt.Felt).SetUint64(6) + + _, err = tempTrie.Put(key1, value1) + require.NoError(t, err) + + _, err = tempTrie.Put(key3, value3) + require.NoError(t, err) + _, err = tempTrie.Put(key2, value2) + require.NoError(t, err) + + require.NoError(t, tempTrie.Commit()) + return tempTrie +} + +func build4KeyTrie(t *testing.T) *trie.Trie { + // Juno + // 248 + // / \ + // 249 \ + // / \ \ + // 250 \ \ + // / \ /\ /\ + // 0 1 2 4 + + // Juno - should be able to reconstruct this from proofs + // 248 + // / \ + // 249 // Note we cant derive the right key, but need to store it's hash + // / \ + // 250 \ + // / \ / (Left hash set, no key) + // 0 + + // Pathfinder (???) + // 0 Edge + // | + // 248 Binary + // / \ + // 249 \ Binary Edge ?? + // / \ \ + // 250 250 250 Binary Edge ?? + // / \ / / + // 0 1 2 4 + + // Build trie + memdb := pebble.NewMemTest(t) + txn, err := memdb.NewTransaction(true) + require.NoError(t, err) + + tempTrie, err := trie.NewTriePedersen(trie.NewStorage(txn, []byte{0}), 251) + require.NoError(t, err) + + // Update trie + key1 := new(felt.Felt).SetUint64(0) + key2 := new(felt.Felt).SetUint64(1) + key3 := new(felt.Felt).SetUint64(2) + key5 := new(felt.Felt).SetUint64(4) + value1 := new(felt.Felt).SetUint64(4) + value2 := new(felt.Felt).SetUint64(5) + value3 := new(felt.Felt).SetUint64(6) + value5 := new(felt.Felt).SetUint64(7) + + _, err = tempTrie.Put(key1, value1) + require.NoError(t, err) + + _, err = tempTrie.Put(key3, value3) + require.NoError(t, err) + _, err = tempTrie.Put(key2, value2) + require.NoError(t, err) + _, err = tempTrie.Put(key5, value5) + require.NoError(t, err) + + require.NoError(t, tempTrie.Commit()) + return tempTrie } -func TestGetProofs(t *testing.T) { - t.Run("Simple Trie - simple binary", func(t *testing.T) { +func TestGetProof(t *testing.T) { + t.Run("GP Simple Trie - simple binary", func(t *testing.T) { tempTrie := buildSimpleTrie(t) zero := trie.NewKey(250, []byte{0}) @@ -121,91 +271,55 @@ func TestGetProofs(t *testing.T) { }, }, } - - proofNodes, err := trie.GetProof(new(felt.Felt).SetUint64(0), tempTrie) + leafFelt := new(felt.Felt).SetUint64(0).Bytes() + leafKey := trie.NewKey(251, leafFelt[:]) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) require.NoError(t, err) // Better inspection - for _, pNode := range proofNodes { - pNode.PrettyPrint() - } + // for _, pNode := range proofNodes { + // pNode.PrettyPrint() + // } require.Equal(t, expectedProofNodes, proofNodes) }) - t.Run("Simple Trie - simple double binary", func(t *testing.T) { - tempTrie := buildSimpleDoubleBinaryTrie(t) + t.Run("GP Simple Trie - simple double binary", func(t *testing.T) { + tempTrie, expectedProofNodes := buildSimpleDoubleBinaryTrie(t) - zero := trie.NewKey(249, []byte{0}) - expectedProofNodes := []trie.ProofNode{ - { - Edge: &trie.Edge{ - Path: &zero, - Child: utils.HexToFelt(t, "0x055C81F6A791FD06FC2E2CCAD922397EC76C3E35F2E06C0C0D43D551005A8DEA"), - }, - }, - { - Binary: &trie.Binary{ - LeftHash: utils.HexToFelt(t, "0x05774FA77B3D843AE9167ABD61CF80365A9B2B02218FC2F628494B5BDC9B33B8"), - RightHash: utils.HexToFelt(t, "0x07C5BC1CC68B7BC8CA2F632DE98297E6DA9594FA23EDE872DD2ABEAFDE353B43"), - }, - }, - { - Binary: &trie.Binary{ - LeftHash: utils.HexToFelt(t, "0x0000000000000000000000000000000000000000000000000000000000000002"), - RightHash: utils.HexToFelt(t, "0x0000000000000000000000000000000000000000000000000000000000000003"), - }, + expectedProofNodes[2] = trie.ProofNode{ + Binary: &trie.Binary{ + LeftHash: utils.HexToFelt(t, "0x0000000000000000000000000000000000000000000000000000000000000002"), + RightHash: utils.HexToFelt(t, "0x0000000000000000000000000000000000000000000000000000000000000003"), }, } - proofNodes, err := trie.GetProof(new(felt.Felt).SetUint64(0), tempTrie) + leafFelt := new(felt.Felt).SetUint64(0).Bytes() + leafKey := trie.NewKey(251, leafFelt[:]) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) require.NoError(t, err) // Better inspection - for _, pNode := range proofNodes { - pNode.PrettyPrint() - } + // for _, pNode := range proofNodes { + // pNode.PrettyPrint() + // } require.Equal(t, expectedProofNodes, proofNodes) }) - t.Run("Simple Trie - simple double binary edge", func(t *testing.T) { - tempTrie := buildSimpleDoubleBinaryTrie(t) - - zero := trie.NewKey(249, []byte{0}) - value3 := new(felt.Felt).SetUint64(5) - key3Bytes := new(felt.Felt).SetUint64(1).Bytes() - path3 := trie.NewKey(1, key3Bytes[:]) - expectedProofNodes := []trie.ProofNode{ - { - Edge: &trie.Edge{ - Path: &zero, - Child: utils.HexToFelt(t, "0x055C81F6A791FD06FC2E2CCAD922397EC76C3E35F2E06C0C0D43D551005A8DEA"), - }, - }, - { - Binary: &trie.Binary{ - LeftHash: utils.HexToFelt(t, "0x05774FA77B3D843AE9167ABD61CF80365A9B2B02218FC2F628494B5BDC9B33B8"), - RightHash: utils.HexToFelt(t, "0x07C5BC1CC68B7BC8CA2F632DE98297E6DA9594FA23EDE872DD2ABEAFDE353B43"), - }, - }, - { - Edge: &trie.Edge{ - Path: &path3, - Child: value3, - }, - }, - } - - proofNodes, err := trie.GetProof(new(felt.Felt).SetUint64(3), tempTrie) + t.Run("GP Simple Trie - simple double binary edge", func(t *testing.T) { + tempTrie, expectedProofNodes := buildSimpleDoubleBinaryTrie(t) + leafFelt := new(felt.Felt).SetUint64(3).Bytes() + leafKey := trie.NewKey(251, leafFelt[:]) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) require.NoError(t, err) // Better inspection - for _, pNode := range proofNodes { - pNode.PrettyPrint() - } + // for _, pNode := range proofNodes { + // pNode.PrettyPrint() + // } require.Equal(t, expectedProofNodes, proofNodes) }) - t.Run("Simple Trie - simple binary root", func(t *testing.T) { + t.Run("GP Simple Trie - simple binary root", func(t *testing.T) { tempTrie := buildSimpleBinaryRootTrie(t) key1Bytes := new(felt.Felt).SetUint64(0).Bytes() @@ -224,18 +338,20 @@ func TestGetProofs(t *testing.T) { }, }, } + leafFelt := new(felt.Felt).SetUint64(0).Bytes() + leafKey := trie.NewKey(251, leafFelt[:]) - proofNodes, err := trie.GetProof(new(felt.Felt).SetUint64(0), tempTrie) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) require.NoError(t, err) // Better inspection - for _, pNode := range proofNodes { - pNode.PrettyPrint() - } + // for _, pNode := range proofNodes { + // pNode.PrettyPrint() + // } require.Equal(t, expectedProofNodes, proofNodes) }) - t.Run("Simple Trie - left-right edge", func(t *testing.T) { + t.Run("GP Simple Trie - left-right edge", func(t *testing.T) { // (251,0xff,0xaa) // / // \ @@ -267,22 +383,67 @@ func TestGetProofs(t *testing.T) { }, }, } + leafFelt := new(felt.Felt).SetUint64(0).Bytes() + leafKey := trie.NewKey(251, leafFelt[:]) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) + require.NoError(t, err) + + // Better inspection + // for _, pNode := range proofNodes { + // pNode.PrettyPrint() + // } + require.Equal(t, expectedProofNodes, proofNodes) + }) + + t.Run("GP Simple Trie - proof for non-set key", func(t *testing.T) { + tempTrie, expectedProofNodes := buildSimpleDoubleBinaryTrie(t) - proofNodes, err := trie.GetProof(new(felt.Felt).SetUint64(0), tempTrie) + leafFelt := new(felt.Felt).SetUint64(123).Bytes() // The (root) edge node would have a shorter len if this key was set + leafKey := trie.NewKey(251, leafFelt[:]) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) require.NoError(t, err) // Better inspection - for i, pNode := range proofNodes { - fmt.Println(i) + for _, pNode := range proofNodes { + pNode.PrettyPrint() + } + require.Equal(t, expectedProofNodes[0:2], proofNodes) + }) + + t.Run("GP Simple Trie - proof for inner key", func(t *testing.T) { + tempTrie, expectedProofNodes := buildSimpleDoubleBinaryTrie(t) + + innerFelt := new(felt.Felt).SetUint64(2).Bytes() + innerKey := trie.NewKey(123, innerFelt[:]) // The (root) edge node has len 249 which shows this doesn't exist + proofNodes, err := trie.GetProof(&innerKey, tempTrie) + require.NoError(t, err) + + // Better inspection + for _, pNode := range proofNodes { + pNode.PrettyPrint() + } + require.Equal(t, expectedProofNodes[0:2], proofNodes) + }) + + t.Run("GP Simple Trie - proof for non-set key, with leafs set to right and left", func(t *testing.T) { + tempTrie, expectedProofNodes := buildSimpleDoubleBinaryTrie(t) + + leafFelt := new(felt.Felt).SetUint64(2).Bytes() + leafKey := trie.NewKey(251, leafFelt[:]) + proofNodes, err := trie.GetProof(&leafKey, tempTrie) + require.NoError(t, err) + + // Better inspection + for _, pNode := range proofNodes { pNode.PrettyPrint() } require.Equal(t, expectedProofNodes, proofNodes) }) } -func TestVerifyProofs(t *testing.T) { +func TestVerifyProof(t *testing.T) { // https://github.com/eqlabs/pathfinder/blob/main/crates/merkle-tree/src/tree.rs#L2137 - t.Run("Simple binary trie", func(t *testing.T) { + t.Run("VP Simple binary trie", func(t *testing.T) { tempTrie := buildSimpleTrie(t) zero := trie.NewKey(250, []byte{0}) expectedProofNodes := []trie.ProofNode{ @@ -302,15 +463,16 @@ func TestVerifyProofs(t *testing.T) { root, err := tempTrie.Root() require.NoError(t, err) - key1Bytes := new(felt.Felt).SetUint64(0).Bytes() - key1 := trie.NewKey(251, key1Bytes[:]) val1 := new(felt.Felt).SetUint64(2) - assert.True(t, trie.VerifyProof(root, &key1, val1, expectedProofNodes, crypto.Pedersen)) + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + leafkey := trie.NewKey(251, zeroFeltBytes[:]) + assert.True(t, trie.VerifyProof(root, &leafkey, val1, expectedProofNodes, crypto.Pedersen)) }) // https://github.com/eqlabs/pathfinder/blob/main/crates/merkle-tree/src/tree.rs#L2167 - t.Run("Simple double binary trie", func(t *testing.T) { - tempTrie := buildSimpleDoubleBinaryTrie(t) + t.Run("VP Simple double binary trie", func(t *testing.T) { + tempTrie, _ := buildSimpleDoubleBinaryTrie(t) zero := trie.NewKey(249, []byte{0}) expectedProofNodes := []trie.ProofNode{ { @@ -335,9 +497,375 @@ func TestVerifyProofs(t *testing.T) { root, err := tempTrie.Root() require.NoError(t, err) - key1Bytes := new(felt.Felt).SetUint64(0).Bytes() - key1 := trie.NewKey(251, key1Bytes[:]) val1 := new(felt.Felt).SetUint64(2) - assert.True(t, trie.VerifyProof(root, &key1, val1, expectedProofNodes, crypto.Pedersen)) + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + leafkey := trie.NewKey(251, zeroFeltBytes[:]) + assert.True(t, trie.VerifyProof(root, &leafkey, val1, expectedProofNodes, crypto.Pedersen)) + }) + + t.Run("VP three key trie", func(t *testing.T) { + tempTrie := build3KeyTrie(t) + zero := trie.NewKey(249, []byte{0}) + felt2 := new(felt.Felt).SetUint64(0).Bytes() + lastPath := trie.NewKey(1, felt2[:]) + expectedProofNodes := []trie.ProofNode{ + { + Edge: &trie.Edge{ + Path: &zero, + Child: utils.HexToFelt(t, "0x0768DEB8D0795D80AAAC2E5E326141F33044759F97A1BF092D8EB9C4E4BE9234"), + }, + }, + { + Binary: &trie.Binary{ + LeftHash: utils.HexToFelt(t, "0x057166F9476D0A2D6875124251841EB85A9AE37462FAE3CBF7304BCD593938E7"), + RightHash: utils.HexToFelt(t, "0x060FBDE29F96F706498EFD132DC7F312A4C99A9AE051BF152C2AF2B3CAF31E5B"), + }, + }, + { + Edge: &trie.Edge{ + Path: &lastPath, + Child: utils.HexToFelt(t, "0x6"), + }, + }, + } + + root, err := tempTrie.Root() + require.NoError(t, err) + val6 := new(felt.Felt).SetUint64(6) + + twoFeltBytes := new(felt.Felt).SetUint64(2).Bytes() + leafkey := trie.NewKey(251, twoFeltBytes[:]) + gotProof, err := trie.GetProof(&leafkey, tempTrie) + require.NoError(t, err) + require.Equal(t, expectedProofNodes, gotProof) + + assert.True(t, trie.VerifyProof(root, &leafkey, val6, expectedProofNodes, crypto.Pedersen)) + }) + + t.Run("VP non existent key - less than root edge", func(t *testing.T) { + tempTrie, _ := buildSimpleDoubleBinaryTrie(t) + + nonExistentKey := trie.NewKey(123, []byte{0}) // Diverges before the root node (len root node = 249) + nonExistentKeyValue := new(felt.Felt).SetUint64(2) + proofNodes, err := trie.GetProof(&nonExistentKey, tempTrie) + require.NoError(t, err) + + root, err := tempTrie.Root() + require.NoError(t, err) + + require.False(t, trie.VerifyProof(root, &nonExistentKey, nonExistentKeyValue, proofNodes, crypto.Pedersen)) + }) + + t.Run("VP non existent leaf key", func(t *testing.T) { + tempTrie, _ := buildSimpleDoubleBinaryTrie(t) + + nonExistentKeyByte := new(felt.Felt).SetUint64(2).Bytes() // Key not set + nonExistentKey := trie.NewKey(251, nonExistentKeyByte[:]) + nonExistentKeyValue := new(felt.Felt).SetUint64(2) + proofNodes, err := trie.GetProof(&nonExistentKey, tempTrie) + require.NoError(t, err) + + root, err := tempTrie.Root() + require.NoError(t, err) + + require.False(t, trie.VerifyProof(root, &nonExistentKey, nonExistentKeyValue, proofNodes, crypto.Pedersen)) + }) +} + +func TestProofToPath(t *testing.T) { + t.Run("PTP Proof To Path Simple binary trie proof to path", func(t *testing.T) { + tempTrie := buildSimpleTrie(t) + zeroFeltByte := new(felt.Felt).Bytes() + zero := trie.NewKey(250, zeroFeltByte[:]) + leafValue := utils.HexToFelt(t, "0x0000000000000000000000000000000000000000000000000000000000000002") + siblingValue := utils.HexToFelt(t, "0x0000000000000000000000000000000000000000000000000000000000000003") + proofNodes := []trie.ProofNode{ + { + Edge: &trie.Edge{ + Path: &zero, + Child: utils.HexToFelt(t, "0x05774FA77B3D843AE9167ABD61CF80365A9B2B02218FC2F628494B5BDC9B33B8"), + }, + }, + { + Binary: &trie.Binary{ + LeftHash: leafValue, + RightHash: siblingValue, + }, + }, + } + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + leafkey := trie.NewKey(251, zeroFeltBytes[:]) + sns, err := trie.ProofToPath(proofNodes, &leafkey, crypto.Pedersen) + require.NoError(t, err) + + rootKey := tempTrie.RootKey() + + require.Equal(t, 1, len(sns)) + require.Equal(t, rootKey.Len(), sns[0].Key().Len()) + require.Equal(t, leafValue.String(), sns[0].Node().LeftHash.String()) + require.Equal(t, siblingValue.String(), sns[0].Node().RightHash.String()) + }) + + t.Run("PTP Simple double binary trie proof to path", func(t *testing.T) { + tempTrie := buildSimpleBinaryRootTrie(t) + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + leafkey := trie.NewKey(251, zeroFeltBytes[:]) + path1 := trie.NewKey(250, zeroFeltBytes[:]) + proofNodes := []trie.ProofNode{ + { + Binary: &trie.Binary{ + LeftHash: utils.HexToFelt(t, "0x06E08BF82793229338CE60B65D1845F836C8E2FBFE2BC59FF24AEDBD8BA219C4"), + RightHash: utils.HexToFelt(t, "0x04F9B8E66212FB528C0C1BD02F43309C53B895AA7D9DC91180001BDD28A588FA"), + }, + }, + { + Edge: &trie.Edge{ + Path: &path1, + Child: utils.HexToFelt(t, "0xcc"), + }, + }, + } + + siblingValue := utils.HexToFelt(t, "0xdd") + sns, err := trie.ProofToPath(proofNodes, &leafkey, crypto.Pedersen) + require.NoError(t, err) + rootKey := tempTrie.RootKey() + rootNode, err := tempTrie.GetNodeFromKey(rootKey) + require.NoError(t, err) + leftNode, err := tempTrie.GetNodeFromKey(rootNode.Left) + require.NoError(t, err) + require.Equal(t, 1, len(sns)) + require.Equal(t, rootKey.Len(), sns[0].Key().Len()) + require.Equal(t, leftNode.HashFromParent(rootKey, rootNode.Left, crypto.Pedersen).String(), sns[0].Node().LeftHash.String()) + require.NotEqual(t, siblingValue.String(), sns[0].Node().RightHash.String()) + }) + + t.Run("PTP boundary proofs with three key trie", func(t *testing.T) { + tri := build3KeyTrie(t) + rootKey := tri.RootKey() + rootNode, err := tri.GetNodeFromKey(rootKey) + require.NoError(t, err) + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + zeroLeafkey := trie.NewKey(251, zeroFeltBytes[:]) + zeroLeafValue := new(felt.Felt).SetUint64(4) + oneLeafValue := new(felt.Felt).SetUint64(5) + twoFeltBytes := new(felt.Felt).SetUint64(2).Bytes() + twoLeafkey := trie.NewKey(251, twoFeltBytes[:]) + bProofs, err := trie.GetBoundaryProofs(&zeroLeafkey, &twoLeafkey, tri) + require.NoError(t, err) + + // Test 1 + leftProofPath, err := trie.ProofToPath(bProofs[0], &zeroLeafkey, crypto.Pedersen) + require.Equal(t, 2, len(leftProofPath)) + require.NoError(t, err) + left, err := tri.GetNodeFromKey(rootNode.Left) + require.NoError(t, err) + right, err := tri.GetNodeFromKey(rootNode.Right) + require.NoError(t, err) + require.Equal(t, rootKey, leftProofPath[0].Key()) + require.Equal(t, left.HashFromParent(rootKey, rootNode.Left, crypto.Pedersen).String(), leftProofPath[0].Node().LeftHash.String()) + require.Equal(t, right.HashFromParent(rootKey, rootNode.Right, crypto.Pedersen).String(), leftProofPath[0].Node().RightHash.String()) + require.Equal(t, rootNode.Left, leftProofPath[1].Key()) + require.Equal(t, zeroLeafValue.String(), leftProofPath[1].Node().LeftHash.String()) + require.Equal(t, oneLeafValue.String(), leftProofPath[1].Node().RightHash.String()) + + // Test 2 + rightProofPath, err := trie.ProofToPath(bProofs[1], &twoLeafkey, crypto.Pedersen) + require.Equal(t, 1, len(rightProofPath)) + require.NoError(t, err) + require.Equal(t, rootKey, rightProofPath[0].Key()) + require.NotEqual(t, rootNode.Right, rightProofPath[0].Node().Right) + require.NotEqual(t, uint8(0), rightProofPath[0].Node().Right) + require.Equal(t, right.HashFromParent(rootKey, rootNode.Right, crypto.Pedersen).String(), rightProofPath[0].Node().RightHash.String()) + }) +} + +func TestBuildTrie(t *testing.T) { + t.Run("Simple binary trie proof to path", func(t *testing.T) { + // Node (edge path 249) + // / \ + // Node (binary) 0x6 (leaf) + // / \ + // 0x4 0x5 (leaf, leaf) + + tri := build3KeyTrie(t) + rootKey := tri.RootKey() + rootCommitment, err := tri.Root() + require.NoError(t, err) + rootNode, err := tri.GetNodeFromKey(rootKey) + require.NoError(t, err) + leftNode, err := tri.GetNodeFromKey(rootNode.Left) + require.NoError(t, err) + leftleftNode, err := tri.GetNodeFromKey(leftNode.Left) + require.NoError(t, err) + leftrightNode, err := tri.GetNodeFromKey(leftNode.Right) + require.NoError(t, err) + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + zeroLeafkey := trie.NewKey(251, zeroFeltBytes[:]) + twoFeltBytes := new(felt.Felt).SetUint64(2).Bytes() + twoLeafkey := trie.NewKey(251, twoFeltBytes[:]) + bProofs, err := trie.GetBoundaryProofs(&zeroLeafkey, &twoLeafkey, tri) + require.NoError(t, err) + + leftProof, err := trie.ProofToPath(bProofs[0], &zeroLeafkey, crypto.Pedersen) + require.NoError(t, err) + + rightProof, err := trie.ProofToPath(bProofs[1], &twoLeafkey, crypto.Pedersen) + require.NoError(t, err) + + keys := []*felt.Felt{new(felt.Felt).SetUint64(1)} + values := []*felt.Felt{new(felt.Felt).SetUint64(5)} + builtTrie, err := trie.BuildTrie(leftProof, rightProof, keys, values) + require.NoError(t, err) + + builtRootKey := builtTrie.RootKey() + builtRootNode, err := builtTrie.GetNodeFromKey(builtRootKey) + require.NoError(t, err) + builtLeftNode, err := builtTrie.GetNodeFromKey(builtRootNode.Left) + require.NoError(t, err) + builtLeftRightNode, err := builtTrie.GetNodeFromKey(builtLeftNode.Right) + require.NoError(t, err) + + // Assert the structure / keys correct + require.Equal(t, rootKey, builtRootKey) + require.Equal(t, rootNode.Left, builtRootNode.Left, "left fail") + require.Equal(t, leftrightNode.Right, builtLeftRightNode.Right, "right fail") + require.Equal(t, uint8(0), builtRootNode.Right.Len(), "right fail") + require.Equal(t, uint8(0), builtLeftNode.Left.Len(), "left left fail") + + // Assert the leaf nodes have the correct values + require.Equal(t, leftleftNode.Value.String(), builtLeftNode.LeftHash.String(), "should be 0x4") + require.Equal(t, leftrightNode.Value.String(), builtLeftRightNode.Value.String(), "should be 0x5") + + // Given the above two asserts pass, we should be able to reconstruct the correct commitment + reconstructedRootCommitment, err := builtTrie.Root() + require.NoError(t, err) + require.Equal(t, rootCommitment.String(), reconstructedRootCommitment.String(), "root commitment not equal") + }) +} + +func TestVerifyRangeProof(t *testing.T) { + t.Run("VPR two proofs, single key trie", func(t *testing.T) { + // Node (edge path 249) + // / \ + // Node (binary) 0x6 (leaf) + // / \ + // 0x4 0x5 (leaf, leaf) + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + zeroLeafkey := trie.NewKey(251, zeroFeltBytes[:]) + twoFeltBytes := new(felt.Felt).SetUint64(2).Bytes() + twoLeafkey := trie.NewKey(251, twoFeltBytes[:]) + + tri := build3KeyTrie(t) + keys := []*felt.Felt{new(felt.Felt).SetUint64(1)} + values := []*felt.Felt{new(felt.Felt).SetUint64(5)} + proofKeys := [2]*trie.Key{&zeroLeafkey, &twoLeafkey} + proofValues := [2]*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(6)} + rootCommitment, err := tri.Root() + require.NoError(t, err) + proofs, err := trie.GetBoundaryProofs(proofKeys[0], proofKeys[1], tri) + require.NoError(t, err) + verif, err := trie.VerifyRangeProof(rootCommitment, keys, values, proofKeys, proofValues, proofs, crypto.Pedersen) + require.NoError(t, err) + require.True(t, verif) + }) + + t.Run("VPR all keys provided, no proofs needed", func(t *testing.T) { + // Node (edge path 249) + // / \ + // Node (binary) 0x6 (leaf) + // / \ + // 0x4 0x5 (leaf, leaf) + tri := build3KeyTrie(t) + keys := []*felt.Felt{new(felt.Felt).SetUint64(0), new(felt.Felt).SetUint64(1), new(felt.Felt).SetUint64(2)} + values := []*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(5), new(felt.Felt).SetUint64(6)} + proofKeys := [2]*trie.Key{} + proofValues := [2]*felt.Felt{} + proofs := [2][]trie.ProofNode{} + rootCommitment, err := tri.Root() + require.NoError(t, err) + verif, err := trie.VerifyRangeProof(rootCommitment, keys, values, proofKeys, proofValues, proofs, crypto.Pedersen) + require.NoError(t, err) + require.True(t, verif) + }) + + t.Run("VPR left proof, all right keys", func(t *testing.T) { + // Node (edge path 249) + // / \ + // Node (binary) 0x6 (leaf) + // / \ + // 0x4 0x5 (leaf, leaf) + + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + zeroLeafkey := trie.NewKey(251, zeroFeltBytes[:]) + + tri := build3KeyTrie(t) + keys := []*felt.Felt{new(felt.Felt).SetUint64(1), new(felt.Felt).SetUint64(2)} + values := []*felt.Felt{new(felt.Felt).SetUint64(5), new(felt.Felt).SetUint64(6)} + proofKeys := [2]*trie.Key{&zeroLeafkey} + proofValues := [2]*felt.Felt{new(felt.Felt).SetUint64(4)} + leftProof, err := trie.GetProof(proofKeys[0], tri) + require.NoError(t, err) + proofs := [2][]trie.ProofNode{leftProof} + rootCommitment, err := tri.Root() + require.NoError(t, err) + verif, err := trie.VerifyRangeProof(rootCommitment, keys, values, proofKeys, proofValues, proofs, crypto.Pedersen) + require.NoError(t, err) + require.True(t, verif) + }) + + t.Run("VPR right proof, all left keys", func(t *testing.T) { + // Node (edge path 249) + // / \ + // Node (binary) 0x6 (leaf) + // / \ + // 0x4 0x5 (leaf, leaf) + twoFeltBytes := new(felt.Felt).SetUint64(2).Bytes() + twoLeafkey := trie.NewKey(251, twoFeltBytes[:]) + + tri := build3KeyTrie(t) + keys := []*felt.Felt{new(felt.Felt).SetUint64(0), new(felt.Felt).SetUint64(1)} + values := []*felt.Felt{new(felt.Felt).SetUint64(4), new(felt.Felt).SetUint64(5)} + proofKeys := [2]*trie.Key{nil, &twoLeafkey} + proofValues := [2]*felt.Felt{nil, new(felt.Felt).SetUint64(6)} + rightProof, err := trie.GetProof(proofKeys[1], tri) + require.NoError(t, err) + proofs := [2][]trie.ProofNode{nil, rightProof} + rootCommitment, err := tri.Root() + require.NoError(t, err) + verif, err := trie.VerifyRangeProof(rootCommitment, keys, values, proofKeys, proofValues, proofs, crypto.Pedersen) + require.NoError(t, err) + require.True(t, verif) + }) + + t.Run("VPR left proof, all inner keys, right proof with non-set key", func(t *testing.T) { + zeroFeltBytes := new(felt.Felt).SetUint64(0).Bytes() + zeroLeafkey := trie.NewKey(251, zeroFeltBytes[:]) + + threeFeltBytes := new(felt.Felt).SetUint64(3).Bytes() + threeLeafkey := trie.NewKey(251, threeFeltBytes[:]) + + tri := build4KeyTrie(t) + keys := []*felt.Felt{new(felt.Felt).SetUint64(1), new(felt.Felt).SetUint64(2)} + values := []*felt.Felt{new(felt.Felt).SetUint64(5), new(felt.Felt).SetUint64(6)} + proofKeys := [2]*trie.Key{&zeroLeafkey, &threeLeafkey} + proofValues := [2]*felt.Felt{new(felt.Felt).SetUint64(4), nil} + leftProof, err := trie.GetProof(proofKeys[0], tri) + require.NoError(t, err) + rightProof, err := trie.GetProof(proofKeys[1], tri) + require.NoError(t, err) + + proofs := [2][]trie.ProofNode{leftProof, rightProof} + rootCommitment, err := tri.Root() + require.NoError(t, err) + + verif, err := trie.VerifyRangeProof(rootCommitment, keys, values, proofKeys, proofValues, proofs, crypto.Pedersen) + require.NoError(t, err) + require.True(t, verif) }) } diff --git a/core/trie/storage.go b/core/trie/storage.go index 61f3bd6821..c4e5ae0915 100644 --- a/core/trie/storage.go +++ b/core/trie/storage.go @@ -27,7 +27,7 @@ func getBuffer() *bytes.Buffer { return buffer } -// TransactionStorage is a database transaction on a trie. +// Storage is a database transaction on a trie. type Storage struct { txn db.Transaction prefix []byte diff --git a/core/trie/trie.go b/core/trie/trie.go index 2496b724d4..c03357d3af 100644 --- a/core/trie/trie.go +++ b/core/trie/trie.go @@ -31,7 +31,7 @@ type hashFunc func(*felt.Felt, *felt.Felt) *felt.Felt // - key: represents the storage key for trie [Node]s. It is the full path to the node from the // root. // -// [specification]: https://docs.starknet.io/documentation/develop/State/starknet-state/ +// [specification]: https://docs.starknet.io/architecture-and-concepts/network-architecture/starknet-state/#merkle_patricia_trie type Trie struct { height uint8 rootKey *Key @@ -76,8 +76,8 @@ func newTrie(storage *Storage, height uint8, hash hashFunc) (*Trie, error) { }, nil } -// RunOnTempTrie creates an in-memory Trie of height `height` and runs `do` on that Trie -func RunOnTempTrie(height uint8, do func(*Trie) error) error { +// RunOnTempTriePedersen creates an in-memory Trie of height `height` and runs `do` on that Trie +func RunOnTempTriePedersen(height uint8, do func(*Trie) error) error { trie, err := NewTriePedersen(newMemStorage(), height) if err != nil { return err @@ -85,6 +85,14 @@ func RunOnTempTrie(height uint8, do func(*Trie) error) error { return do(trie) } +func RunOnTempTriePoseidon(height uint8, do func(*Trie) error) error { + trie, err := NewTriePoseidon(newMemStorage(), height) + if err != nil { + return err + } + return do(trie) +} + // feltToBitSet Converts a key, given in felt, to a trie.Key which when followed on a [Trie], // leads to the corresponding [Node] func (t *Trie) feltToKey(k *felt.Felt) Key { @@ -117,8 +125,6 @@ func isSubset(longerKey, shorterKey *Key) bool { // path returns the path as mentioned in the [specification] for commitment calculations. // path is suffix of key that diverges from parentKey. For example, // for a key 0b1011 and parentKey 0b10, this function would return the path object of 0b0. -// -// [specification]: https://docs.starknet.io/documentation/develop/State/starknet-state/ func path(key, parentKey *Key) Key { path := *key // drop parent key, and one more MSB since left/right relation already encodes that information @@ -130,24 +136,41 @@ func path(key, parentKey *Key) Key { // storageNode is the on-disk representation of a [Node], // where key is the storage key and node is the value. -type storageNode struct { +type StorageNode struct { key *Key node *Node } +func (sn *StorageNode) Key() *Key { + return sn.key +} + +func (sn *StorageNode) Node() *Node { + return sn.node +} + +func NewStorageNode(key *Key, node *Node) *StorageNode { + return &StorageNode{key: key, node: node} +} + // nodesFromRoot enumerates the set of [Node] objects that need to be traversed from the root // of the Trie to the node which is given by the key. // The [storageNode]s are returned in descending order beginning with the root. -func (t *Trie) nodesFromRoot(key *Key) ([]storageNode, error) { - var nodes []storageNode +func (t *Trie) nodesFromRoot(key *Key) ([]StorageNode, error) { + var nodes []StorageNode cur := t.rootKey for cur != nil { + // proof nodes set "nil" nodes to zero + if len(nodes) > 0 && cur.len == 0 { + return nodes, nil + } + node, err := t.storage.Get(cur) if err != nil { return nil, err } - nodes = append(nodes, storageNode{ + nodes = append(nodes, StorageNode{ key: cur, node: node, }) @@ -217,7 +240,7 @@ func (t *Trie) handleEmptyTrie(old felt.Felt, nodeKey Key, node *Node, value *fe return &old, nil } -func (t *Trie) deleteExistingKey(sibling storageNode, nodeKey Key, nodes []storageNode) (*felt.Felt, error) { +func (t *Trie) deleteExistingKey(sibling StorageNode, nodeKey Key, nodes []StorageNode) (*felt.Felt, error) { if nodeKey.Equal(sibling.key) { // we have to deference the Value, since the Node can released back // to the NodePool and be reused anytime @@ -230,7 +253,7 @@ func (t *Trie) deleteExistingKey(sibling storageNode, nodeKey Key, nodes []stora return nil, nil } -func (t *Trie) replaceLinkWithNewParent(key *Key, commonKey Key, siblingParent storageNode) { +func (t *Trie) replaceLinkWithNewParent(key *Key, commonKey Key, siblingParent StorageNode) { if siblingParent.node.Left.Equal(key) { *siblingParent.node.Left = commonKey } else { @@ -238,38 +261,58 @@ func (t *Trie) replaceLinkWithNewParent(key *Key, commonKey Key, siblingParent s } } -func (t *Trie) insertOrUpdateValue(nodeKey *Key, node *Node, nodes []storageNode, sibling storageNode) error { +func (t *Trie) insertOrUpdateValue(nodeKey *Key, node *Node, nodes []StorageNode, sibling StorageNode, siblingIsParentProof bool) error { commonKey, _ := findCommonKey(nodeKey, sibling.key) newParent := &Node{} var leftChild, rightChild *Node + var err error - if nodeKey.Test(nodeKey.Len() - commonKey.Len() - 1) { - newParent.Left, newParent.Right = sibling.key, nodeKey - leftChild, rightChild = sibling.node, node + // Update the (proof) parents child and hash + if siblingIsParentProof { + newParent, err = t.GetNodeFromKey(&commonKey) + if err != nil { + return err + } + if nodeKey.Test(nodeKey.Len() - commonKey.Len() - 1) { + newParent.Right = nodeKey + newParent.RightHash = node.Hash(nodeKey, t.hash) + } else { + newParent.Left = nodeKey + newParent.LeftHash = node.Hash(nodeKey, t.hash) + } + if err := t.storage.Put(&commonKey, newParent); err != nil { + return err + } + t.dirtyNodes = append(t.dirtyNodes, &commonKey) } else { - newParent.Left, newParent.Right = nodeKey, sibling.key - leftChild, rightChild = node, sibling.node - } + if nodeKey.Test(nodeKey.Len() - commonKey.Len() - 1) { + newParent.Left, newParent.Right = sibling.key, nodeKey + leftChild, rightChild = sibling.node, node + } else { + newParent.Left, newParent.Right = nodeKey, sibling.key + leftChild, rightChild = node, sibling.node + } - leftPath := path(newParent.Left, &commonKey) - rightPath := path(newParent.Right, &commonKey) + leftPath := path(newParent.Left, &commonKey) + rightPath := path(newParent.Right, &commonKey) - newParent.Value = t.hash(leftChild.Hash(&leftPath, t.hash), rightChild.Hash(&rightPath, t.hash)) - if err := t.storage.Put(&commonKey, newParent); err != nil { - return err - } + newParent.Value = t.hash(leftChild.Hash(&leftPath, t.hash), rightChild.Hash(&rightPath, t.hash)) + if err := t.storage.Put(&commonKey, newParent); err != nil { + return err + } - if len(nodes) > 1 { // sibling has a parent - siblingParent := (nodes)[len(nodes)-2] + if len(nodes) > 1 { // sibling has a parent + siblingParent := (nodes)[len(nodes)-2] - t.replaceLinkWithNewParent(sibling.key, commonKey, siblingParent) - if err := t.storage.Put(siblingParent.key, siblingParent.node); err != nil { - return err + t.replaceLinkWithNewParent(sibling.key, commonKey, siblingParent) + if err := t.storage.Put(siblingParent.key, siblingParent.node); err != nil { + return err + } + t.dirtyNodes = append(t.dirtyNodes, &commonKey) + } else { + t.setRootKey(&commonKey) } - t.dirtyNodes = append(t.dirtyNodes, &commonKey) - } else { - t.setRootKey(&commonKey) } if err := t.storage.Put(nodeKey, node); err != nil { @@ -296,7 +339,7 @@ func (t *Trie) Put(key, value *felt.Felt) (*felt.Felt, error) { return oldValue, err } - nodes, err := t.nodesFromRoot(&nodeKey) + nodes, err := t.nodesFromRoot(&nodeKey) // correct for key,value if err != nil { return nil, err } @@ -321,8 +364,79 @@ func (t *Trie) Put(key, value *felt.Felt) (*felt.Felt, error) { // trying to insert 0 to a key that does not exist return nil, nil // no-op } + err := t.insertOrUpdateValue(&nodeKey, node, nodes, sibling, false) + if err != nil { + return nil, err + } + return &old, nil + } +} - err := t.insertOrUpdateValue(&nodeKey, node, nodes, sibling) +// Put updates the corresponding `value` for a `key` +func (t *Trie) PutWithProof(key, value *felt.Felt, lProofPath, rProofPath []StorageNode) (*felt.Felt, error) { + if key.Cmp(t.maxKey) > 0 { + return nil, fmt.Errorf("key %s exceeds trie height %d", key, t.height) + } + + old := felt.Zero + nodeKey := t.feltToKey(key) + node := &Node{ + Value: value, + } + + oldValue, err := t.updateLeaf(nodeKey, node, value) + // xor operation, because we don't want to return result if the error is nil and the old value is nil + if (err != nil) != (oldValue != nil) { + return oldValue, err + } + + nodes, err := t.nodesFromRoot(&nodeKey) // correct for key,value + if err != nil { + return nil, err + } + defer func() { + for _, n := range nodes { + nodePool.Put(n.node) + } + }() + + // empty trie, make new value root + if len(nodes) == 0 { + return t.handleEmptyTrie(old, nodeKey, node, value) + } else { + // Since we short-circuit in leaf updates, we will only end up here for deletions + // Delete if key already exist + sibling := nodes[len(nodes)-1] + oldValue, err = t.deleteExistingKey(sibling, nodeKey, nodes) + // xor operation, because we don't want to return if the error is nil and the old value is nil + if (err != nil) != (oldValue != nil) { + return oldValue, err + } else if value.IsZero() { + // trying to insert 0 to a key that does not exist + return nil, nil // no-op + } + + // override the sibling to be the parent if it's a proof + parentIsProof, found := false, false + for _, proof := range lProofPath { + if proof.key.Equal(sibling.key) { + sibling = proof + parentIsProof = true + found = true + break + } + } + if !found { + for _, proof := range rProofPath { + if proof.key.Equal(sibling.key) { + sibling = proof + parentIsProof = true + break + } + } + } + + err := t.insertOrUpdateValue(&nodeKey, node, nodes, sibling, parentIsProof) if err != nil { return nil, err } @@ -330,12 +444,26 @@ func (t *Trie) Put(key, value *felt.Felt) (*felt.Felt, error) { } } +// Put updates the corresponding `value` for a `key` +func (t *Trie) PutInner(key *Key, node *Node) (*felt.Felt, error) { + if err := t.storage.Put(key, node); err != nil { + return nil, err + } + if t.rootKey == nil { + t.setRootKey(key) + } + return &felt.Zero, nil +} + func (t *Trie) setRootKey(newRootKey *Key) { t.rootKey = newRootKey t.rootKeyIsDirty = true } -func (t *Trie) updateValueIfDirty(key *Key) (*Node, error) { +func (t *Trie) updateValueIfDirty(key *Key) (*Node, error) { //nolint:gocyclo + zeroFeltBytes := new(felt.Felt).Bytes() + nilKey := NewKey(0, zeroFeltBytes[:]) + node, err := t.storage.Get(key) if err != nil { return nil, err @@ -356,49 +484,76 @@ func (t *Trie) updateValueIfDirty(key *Key) (*Node, error) { } } + // Update inner proof nodes + if node.Left.Equal(&nilKey) && node.Right.Equal(&nilKey) { // leaf + shouldUpdate = false + } else if node.Left.Equal(&nilKey) || node.Right.Equal(&nilKey) { // inner + shouldUpdate = true + } if !shouldUpdate { return node, nil } + var leftIsProof, rightIsProof bool + var leftHash, rightHash *felt.Felt + if node.Left.Equal(&nilKey) { + leftIsProof = true + leftHash = node.LeftHash + } + if node.Right.Equal(&nilKey) { + rightIsProof = true + rightHash = node.RightHash + } + // To avoid over-extending, only use concurrent updates when we are not too // deep in to traversing the trie. const concurrencyMaxDepth = 8 // heuristically selected value var leftChild, rightChild *Node if key.len <= concurrencyMaxDepth { - leftChild, rightChild, err = t.updateChildTriesConcurrently(node) + leftChild, rightChild, err = t.updateChildTriesConcurrently(node, leftIsProof, rightIsProof) } else { - leftChild, rightChild, err = t.updateChildTriesSerially(node) + leftChild, rightChild, err = t.updateChildTriesSerially(node, leftIsProof, rightIsProof) } if err != nil { return nil, err } - defer nodePool.Put(leftChild) - defer nodePool.Put(rightChild) - - leftPath := path(node.Left, key) - rightPath := path(node.Right, key) - - node.Value = t.hash(leftChild.Hash(&leftPath, t.hash), rightChild.Hash(&rightPath, t.hash)) + if !leftIsProof { + leftPath := path(node.Left, key) + defer nodePool.Put(leftChild) + leftHash = leftChild.Hash(&leftPath, t.hash) + } + if !rightIsProof { + rightPath := path(node.Right, key) + defer nodePool.Put(rightChild) + rightHash = rightChild.Hash(&rightPath, t.hash) + } + node.Value = t.hash(leftHash, rightHash) if err = t.storage.Put(key, node); err != nil { return nil, err } return node, nil } -func (t *Trie) updateChildTriesSerially(root *Node) (*Node, *Node, error) { - leftChild, err := t.updateValueIfDirty(root.Left) - if err != nil { - return nil, nil, err +func (t *Trie) updateChildTriesSerially(root *Node, leftIsProof, rightIsProof bool) (*Node, *Node, error) { + var leftChild, rightChild *Node + var err error + if !leftIsProof { + leftChild, err = t.updateValueIfDirty(root.Left) + if err != nil { + return nil, nil, err + } } - rightChild, err := t.updateValueIfDirty(root.Right) - if err != nil { - return nil, nil, err + if !rightIsProof { + rightChild, err = t.updateValueIfDirty(root.Right) + if err != nil { + return nil, nil, err + } } return leftChild, rightChild, nil } -func (t *Trie) updateChildTriesConcurrently(root *Node) (*Node, *Node, error) { +func (t *Trie) updateChildTriesConcurrently(root *Node, leftIsProof, rightIsProof bool) (*Node, *Node, error) { var leftChild, rightChild *Node var lErr, rErr error @@ -406,9 +561,13 @@ func (t *Trie) updateChildTriesConcurrently(root *Node) (*Node, *Node, error) { wg.Add(1) go func() { defer wg.Done() - leftChild, lErr = t.updateValueIfDirty(root.Left) + if !leftIsProof { + leftChild, lErr = t.updateValueIfDirty(root.Left) + } }() - rightChild, rErr = t.updateValueIfDirty(root.Right) + if !rightIsProof { + rightChild, rErr = t.updateValueIfDirty(root.Right) + } wg.Wait() if lErr != nil { @@ -421,7 +580,7 @@ func (t *Trie) updateChildTriesConcurrently(root *Node) (*Node, *Node, error) { } // deleteLast deletes the last node in the given list -func (t *Trie) deleteLast(nodes []storageNode) error { +func (t *Trie) deleteLast(nodes []StorageNode) error { last := nodes[len(nodes)-1] if err := t.storage.Delete(last.key); err != nil { return err diff --git a/core/trie/trie_test.go b/core/trie/trie_test.go index 1fc03fbd09..fb5460739d 100644 --- a/core/trie/trie_test.go +++ b/core/trie/trie_test.go @@ -22,7 +22,7 @@ import ( // - [*] Add more complicated Put and Delete scenarios func TestTriePut(t *testing.T) { t.Run("put zero to empty trie", func(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(251, func(tempTrie *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(251, func(tempTrie *trie.Trie) error { key := new(felt.Felt).SetUint64(1) zeroVal := new(felt.Felt).SetUint64(0) @@ -36,7 +36,7 @@ func TestTriePut(t *testing.T) { }) t.Run("put zero value", func(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(251, func(tempTrie *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(251, func(tempTrie *trie.Trie) error { keyNum, err := strconv.ParseUint("1101", 2, 64) require.NoError(t, err) @@ -57,7 +57,7 @@ func TestTriePut(t *testing.T) { }) t.Run("put to replace an existed value", func(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(251, func(tempTrie *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(251, func(tempTrie *trie.Trie) error { keyNum, err := strconv.ParseUint("1101", 2, 64) require.NoError(t, err) @@ -124,7 +124,7 @@ func TestTrieDeleteBasic(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(251, func(tempTrie *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(251, func(tempTrie *trie.Trie) error { // Build a basic trie _, err := tempTrie.Put(leftKey, leftVal) require.NoError(t, err) @@ -157,7 +157,7 @@ func TestTrieDeleteBasic(t *testing.T) { } func TestPutZero(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(251, func(tempTrie *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(251, func(tempTrie *trie.Trie) error { emptyRoot, err := tempTrie.Root() require.NoError(t, err) var roots []*felt.Felt @@ -227,7 +227,7 @@ func TestPutZero(t *testing.T) { } func TestOldData(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(251, func(tempTrie *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(251, func(tempTrie *trie.Trie) error { key := new(felt.Felt).SetUint64(12) old := new(felt.Felt) @@ -282,13 +282,13 @@ func TestOldData(t *testing.T) { func TestMaxTrieHeight(t *testing.T) { t.Run("create trie with invalid height", func(t *testing.T) { - assert.Error(t, trie.RunOnTempTrie(felt.Bits+1, func(_ *trie.Trie) error { + assert.Error(t, trie.RunOnTempTriePedersen(felt.Bits+1, func(_ *trie.Trie) error { return nil })) }) t.Run("insert invalid key", func(t *testing.T) { - require.NoError(t, trie.RunOnTempTrie(uint8(felt.Bits), func(tt *trie.Trie) error { + require.NoError(t, trie.RunOnTempTriePedersen(uint8(felt.Bits), func(tt *trie.Trie) error { badKey := new(felt.Felt).Sub(&felt.Zero, new(felt.Felt).SetUint64(1)) _, err := tt.Put(badKey, new(felt.Felt)) assert.Error(t, err) @@ -364,7 +364,7 @@ func BenchmarkTriePut(b *testing.B) { } one := new(felt.Felt).SetUint64(1) - require.NoError(b, trie.RunOnTempTrie(251, func(t *trie.Trie) error { + require.NoError(b, trie.RunOnTempTriePedersen(251, func(t *trie.Trie) error { b.ResetTimer() for i := 0; i < b.N; i++ { _, err := t.Put(keys[i], one) diff --git a/db/buckets.go b/db/buckets.go index 7b2476d70c..3918eb5f29 100644 --- a/db/buckets.go +++ b/db/buckets.go @@ -2,6 +2,7 @@ package db import "slices" +//go:generate go run github.com/dmarkham/enumer -type=Bucket -output=buckets_enumer.go type Bucket byte // Pebble does not support buckets to differentiate between groups of @@ -9,7 +10,7 @@ type Bucket byte // man's bucket alternative. const ( StateTrie Bucket = iota // state metadata (e.g., the state root) - Unused // Previously held contract storage roots and is now unused. May be reused in the future. + Peer // maps peer ID to peer multiaddresses ContractClassHash // maps contract addresses and class hashes ContractStorage // contract storages Class // maps class hashes to classes diff --git a/db/buckets_enumer.go b/db/buckets_enumer.go new file mode 100644 index 0000000000..0501198b61 --- /dev/null +++ b/db/buckets_enumer.go @@ -0,0 +1,166 @@ +// Code generated by "enumer -type=Bucket -output=buckets_enumer.go"; DO NOT EDIT. + +package db + +import ( + "fmt" + "strings" +) + +const _BucketName = "StateTriePeerContractClassHashContractStorageClassContractNonceChainHeightBlockHeaderNumbersByHashBlockHeadersByNumberTransactionBlockNumbersAndIndicesByHashTransactionsByBlockNumberAndIndexReceiptsByBlockNumberAndIndexStateUpdatesByBlockNumberClassesTrieContractStorageHistoryContractNonceHistoryContractClassHashHistoryContractDeploymentHeightL1HeightSchemaVersionPendingBlockCommitmentsTemporarySchemaIntermediateState" + +var _BucketIndex = [...]uint16{0, 9, 13, 30, 45, 50, 63, 74, 98, 118, 157, 190, 219, 244, 255, 277, 297, 321, 345, 353, 366, 373, 389, 398, 421} + +const _BucketLowerName = "statetriepeercontractclasshashcontractstorageclasscontractnoncechainheightblockheadernumbersbyhashblockheadersbynumbertransactionblocknumbersandindicesbyhashtransactionsbyblocknumberandindexreceiptsbyblocknumberandindexstateupdatesbyblocknumberclassestriecontractstoragehistorycontractnoncehistorycontractclasshashhistorycontractdeploymentheightl1heightschemaversionpendingblockcommitmentstemporaryschemaintermediatestate" + +func (i Bucket) String() string { + if i >= Bucket(len(_BucketIndex)-1) { + return fmt.Sprintf("Bucket(%d)", i) + } + return _BucketName[_BucketIndex[i]:_BucketIndex[i+1]] +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _BucketNoOp() { + var x [1]struct{} + _ = x[StateTrie-(0)] + _ = x[Peer-(1)] + _ = x[ContractClassHash-(2)] + _ = x[ContractStorage-(3)] + _ = x[Class-(4)] + _ = x[ContractNonce-(5)] + _ = x[ChainHeight-(6)] + _ = x[BlockHeaderNumbersByHash-(7)] + _ = x[BlockHeadersByNumber-(8)] + _ = x[TransactionBlockNumbersAndIndicesByHash-(9)] + _ = x[TransactionsByBlockNumberAndIndex-(10)] + _ = x[ReceiptsByBlockNumberAndIndex-(11)] + _ = x[StateUpdatesByBlockNumber-(12)] + _ = x[ClassesTrie-(13)] + _ = x[ContractStorageHistory-(14)] + _ = x[ContractNonceHistory-(15)] + _ = x[ContractClassHashHistory-(16)] + _ = x[ContractDeploymentHeight-(17)] + _ = x[L1Height-(18)] + _ = x[SchemaVersion-(19)] + _ = x[Pending-(20)] + _ = x[BlockCommitments-(21)] + _ = x[Temporary-(22)] + _ = x[SchemaIntermediateState-(23)] +} + +var _BucketValues = []Bucket{StateTrie, Peer, ContractClassHash, ContractStorage, Class, ContractNonce, ChainHeight, BlockHeaderNumbersByHash, BlockHeadersByNumber, TransactionBlockNumbersAndIndicesByHash, TransactionsByBlockNumberAndIndex, ReceiptsByBlockNumberAndIndex, StateUpdatesByBlockNumber, ClassesTrie, ContractStorageHistory, ContractNonceHistory, ContractClassHashHistory, ContractDeploymentHeight, L1Height, SchemaVersion, Pending, BlockCommitments, Temporary, SchemaIntermediateState} + +var _BucketNameToValueMap = map[string]Bucket{ + _BucketName[0:9]: StateTrie, + _BucketLowerName[0:9]: StateTrie, + _BucketName[9:13]: Peer, + _BucketLowerName[9:13]: Peer, + _BucketName[13:30]: ContractClassHash, + _BucketLowerName[13:30]: ContractClassHash, + _BucketName[30:45]: ContractStorage, + _BucketLowerName[30:45]: ContractStorage, + _BucketName[45:50]: Class, + _BucketLowerName[45:50]: Class, + _BucketName[50:63]: ContractNonce, + _BucketLowerName[50:63]: ContractNonce, + _BucketName[63:74]: ChainHeight, + _BucketLowerName[63:74]: ChainHeight, + _BucketName[74:98]: BlockHeaderNumbersByHash, + _BucketLowerName[74:98]: BlockHeaderNumbersByHash, + _BucketName[98:118]: BlockHeadersByNumber, + _BucketLowerName[98:118]: BlockHeadersByNumber, + _BucketName[118:157]: TransactionBlockNumbersAndIndicesByHash, + _BucketLowerName[118:157]: TransactionBlockNumbersAndIndicesByHash, + _BucketName[157:190]: TransactionsByBlockNumberAndIndex, + _BucketLowerName[157:190]: TransactionsByBlockNumberAndIndex, + _BucketName[190:219]: ReceiptsByBlockNumberAndIndex, + _BucketLowerName[190:219]: ReceiptsByBlockNumberAndIndex, + _BucketName[219:244]: StateUpdatesByBlockNumber, + _BucketLowerName[219:244]: StateUpdatesByBlockNumber, + _BucketName[244:255]: ClassesTrie, + _BucketLowerName[244:255]: ClassesTrie, + _BucketName[255:277]: ContractStorageHistory, + _BucketLowerName[255:277]: ContractStorageHistory, + _BucketName[277:297]: ContractNonceHistory, + _BucketLowerName[277:297]: ContractNonceHistory, + _BucketName[297:321]: ContractClassHashHistory, + _BucketLowerName[297:321]: ContractClassHashHistory, + _BucketName[321:345]: ContractDeploymentHeight, + _BucketLowerName[321:345]: ContractDeploymentHeight, + _BucketName[345:353]: L1Height, + _BucketLowerName[345:353]: L1Height, + _BucketName[353:366]: SchemaVersion, + _BucketLowerName[353:366]: SchemaVersion, + _BucketName[366:373]: Pending, + _BucketLowerName[366:373]: Pending, + _BucketName[373:389]: BlockCommitments, + _BucketLowerName[373:389]: BlockCommitments, + _BucketName[389:398]: Temporary, + _BucketLowerName[389:398]: Temporary, + _BucketName[398:421]: SchemaIntermediateState, + _BucketLowerName[398:421]: SchemaIntermediateState, +} + +var _BucketNames = []string{ + _BucketName[0:9], + _BucketName[9:13], + _BucketName[13:30], + _BucketName[30:45], + _BucketName[45:50], + _BucketName[50:63], + _BucketName[63:74], + _BucketName[74:98], + _BucketName[98:118], + _BucketName[118:157], + _BucketName[157:190], + _BucketName[190:219], + _BucketName[219:244], + _BucketName[244:255], + _BucketName[255:277], + _BucketName[277:297], + _BucketName[297:321], + _BucketName[321:345], + _BucketName[345:353], + _BucketName[353:366], + _BucketName[366:373], + _BucketName[373:389], + _BucketName[389:398], + _BucketName[398:421], +} + +// BucketString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func BucketString(s string) (Bucket, error) { + if val, ok := _BucketNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _BucketNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to Bucket values", s) +} + +// BucketValues returns all values of the enum +func BucketValues() []Bucket { + return _BucketValues +} + +// BucketStrings returns a slice of all String values of the enum +func BucketStrings() []string { + strs := make([]string, len(_BucketNames)) + copy(strs, _BucketNames) + return strs +} + +// IsABucket returns "true" if the value is listed in the enum definition. "false" otherwise +func (i Bucket) IsABucket() bool { + for _, v := range _BucketValues { + if i == v { + return true + } + } + return false +} diff --git a/db/pebble/db.go b/db/pebble/db.go index c55a4e3847..6b4869fb9f 100644 --- a/db/pebble/db.go +++ b/db/pebble/db.go @@ -1,6 +1,8 @@ package pebble import ( + "context" + "fmt" "sync" "testing" @@ -12,7 +14,8 @@ import ( const ( // minCache is the minimum amount of memory in megabytes to allocate to pebble read and write caching. - minCache = 8 + // This is also pebble's default value. + minCacheSizeMB = 8 ) var _ db.DB = (*DB)(nil) @@ -23,19 +26,25 @@ type DB struct { listener db.EventListener } -// New opens a new database at the given path -func New(path string, cache uint, maxOpenFiles int, logger pebble.Logger) (db.DB, error) { +// New opens a new database at the given path with default options +func New(path string) (db.DB, error) { + return newPebble(path, nil) +} + +func NewWithOptions(path string, cacheSizeMB uint, maxOpenFiles int, colouredLogger bool) (db.DB, error) { // Ensure that the specified cache size meets a minimum threshold. - cache = max(minCache, cache) - pDB, err := newPebble(path, &pebble.Options{ - Logger: logger, - Cache: pebble.NewCache(int64(cache * utils.Megabyte)), - MaxOpenFiles: maxOpenFiles, - }) + cacheSizeMB = max(cacheSizeMB, minCacheSizeMB) + + dbLog, err := utils.NewZapLogger(utils.ERROR, colouredLogger) if err != nil { - return nil, err + return nil, fmt.Errorf("create DB logger: %w", err) } - return pDB, nil + + return newPebble(path, &pebble.Options{ + Logger: dbLog, + Cache: pebble.NewCache(int64(cacheSizeMB * utils.Megabyte)), + MaxOpenFiles: maxOpenFiles, + }) } // NewMem opens a new in-memory database @@ -108,3 +117,32 @@ func (d *DB) Update(fn func(txn db.Transaction) error) error { func (d *DB) Impl() any { return d.pebble } + +func CalculatePrefixSize(ctx context.Context, pDB *DB, prefix []byte) (uint, error) { + var ( + err error + size uint + v []byte + ) + + const upperBoundofPrefix = 0xff + pebbleDB := pDB.Impl().(*pebble.DB) + it, err := pebbleDB.NewIter(&pebble.IterOptions{LowerBound: prefix, UpperBound: append(prefix, upperBoundofPrefix)}) + if err != nil { + // No need to call utils.RunAndWrapOnError() since iterator couldn't be created + return 0, err + } + + for it.First(); it.Valid(); it.Next() { + if ctx.Err() != nil { + return size, utils.RunAndWrapOnError(it.Close, ctx.Err()) + } + v, err = it.ValueAndErr() + if err != nil { + return 0, utils.RunAndWrapOnError(it.Close, err) + } + size += uint(len(it.Key()) + len(v)) + } + + return size, utils.RunAndWrapOnError(it.Close, err) +} diff --git a/db/pebble/db_test.go b/db/pebble/db_test.go index d277c2816a..a51e9e4c24 100644 --- a/db/pebble/db_test.go +++ b/db/pebble/db_test.go @@ -1,6 +1,7 @@ package pebble_test import ( + "context" "encoding/binary" "fmt" "sync" @@ -417,3 +418,51 @@ func TestPanic(t *testing.T) { })) }) } + +func TestCalculatePrefixSize(t *testing.T) { + t.Run("empty db", func(t *testing.T) { + testDB := pebble.NewMemTest(t).(*pebble.DB) + + s, err := pebble.CalculatePrefixSize(context.Background(), testDB, []byte("0")) + require.NoError(t, err) + assert.Equal(t, uint(0), s) + }) + + t.Run("non empty db but empty prefix", func(t *testing.T) { + testDB := pebble.NewMemTest(t) + require.NoError(t, testDB.Update(func(txn db.Transaction) error { + return txn.Set(append([]byte("0"), []byte("randomKey")...), []byte("someValue")) + })) + s, err := pebble.CalculatePrefixSize(context.Background(), testDB.(*pebble.DB), []byte("1")) + require.NoError(t, err) + assert.Equal(t, uint(0), s) + }) + + t.Run("size of all key value pair with the same prefix", func(t *testing.T) { + p := []byte("0") + k1, v1 := append(p, []byte("key1")...), []byte("value1") //nolint: gocritic + k2, v2 := append(p, []byte("key2")...), []byte("value2") //nolint: gocritic + k3, v3 := append(p, []byte("key3")...), []byte("value3") //nolint: gocritic + expectedSize := uint(len(k1) + len(v1) + len(k2) + len(v2) + len(k3) + len(v3)) + + testDB := pebble.NewMemTest(t) + require.NoError(t, testDB.Update(func(txn db.Transaction) error { + require.NoError(t, txn.Set(k1, v1)) + require.NoError(t, txn.Set(k2, v2)) + return txn.Set(k3, v3) + })) + + s, err := pebble.CalculatePrefixSize(context.Background(), testDB.(*pebble.DB), p) + require.NoError(t, err) + assert.Equal(t, expectedSize, s) + + t.Run("exit when context is cancelled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + s, err := pebble.CalculatePrefixSize(ctx, testDB.(*pebble.DB), p) + assert.EqualError(t, err, context.Canceled.Error()) + assert.Equal(t, uint(0), s) + }) + }) +} diff --git a/db/remote/db.go b/db/remote/db.go index 7c1877f883..734722adec 100644 --- a/db/remote/db.go +++ b/db/remote/db.go @@ -21,7 +21,7 @@ type DB struct { } func New(rawURL string, ctx context.Context, log utils.SimpleLogger, opts ...grpc.DialOption) (*DB, error) { - grpcClient, err := grpc.Dial(rawURL, opts...) + grpcClient, err := grpc.NewClient(rawURL, opts...) if err != nil { return nil, err } diff --git a/docs/docs/running-juno.md b/docs/docs/running-juno.md index 12ceea8833..4f7208cd8c 100644 --- a/docs/docs/running-juno.md +++ b/docs/docs/running-juno.md @@ -12,7 +12,7 @@ You can run a Juno node using several methods: - [Google Cloud Platform (GCP)](running-on-gcp) :::tip -You can use a snapshot for quickly synchronise your node with the network. Check out the [Database Snapshots](snapshots) guide to get started. +You can use a snapshot to quickly synchronise your node with the network. Check out the [Database Snapshots](snapshots) guide to get started. ::: ## Docker container diff --git a/docs/docs/snapshots.md b/docs/docs/snapshots.md index df70d26d9a..6fe913fdc4 100644 --- a/docs/docs/snapshots.md +++ b/docs/docs/snapshots.md @@ -10,7 +10,7 @@ You can download a snapshot of the Juno database to reduce the network syncing t | Version | Size | Block | Download Link | | ------------ | ---------- | ---------- | ----------------------------------------------------------------------------------------------------- | -| **>=v0.9.2** | **182 GB** | **640855** | [**juno_mainnet.tar**](https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.7_640855.tar) | +| **>=v0.9.2** | **172 GB** | **654881** | [**juno_mainnet.tar**](https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.9_654881.tar) | ## Sepolia @@ -25,7 +25,7 @@ You can download a snapshot of the Juno database to reduce the network syncing t First, download a snapshot from one of the provided URLs: ```bash -wget -O juno_mainnet.tar https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.7_640855.tar +wget -O juno_mainnet.tar https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.9_654464.tar ``` ### 2. Prepare a directory diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index e168e47b40..4662452e59 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -58,6 +58,25 @@ const config = { highlightSearchTermsOnTargetPage: true, }, ], + [ + "@docusaurus/plugin-client-redirects", + { + redirects: [ + { + from: "/config", + to: "/configuring", + }, + { + from: "/installing-on-gcp", + to: "/running-on-gcp", + }, + { + from: "/updating_node", + to: "/updating", + }, + ], + }, + ], ], themeConfig: diff --git a/docs/package-lock.json b/docs/package-lock.json index 27a907f12b..8c8d94a325 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@docusaurus/core": "3.2.1", + "@docusaurus/plugin-client-redirects": "3.2.1", "@docusaurus/preset-classic": "3.2.1", "@easyops-cn/docusaurus-search-local": "^0.40.1", "@mdx-js/react": "^3.0.0", @@ -219,11 +220,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -231,28 +232,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -276,11 +277,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -290,34 +291,34 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -335,18 +336,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -365,11 +366,11 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -404,68 +405,68 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -475,32 +476,32 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -510,13 +511,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -526,94 +527,93 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -687,9 +687,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -698,12 +698,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -713,11 +713,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -727,13 +727,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -743,12 +743,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -827,11 +827,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -841,11 +841,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -877,11 +877,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz", + "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -985,11 +985,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz", + "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1014,11 +1014,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1028,13 +1028,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1045,13 +1045,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1061,11 +1061,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1075,11 +1075,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1089,12 +1089,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1104,12 +1104,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1120,17 +1120,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -1141,12 +1141,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1156,11 +1156,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1170,12 +1170,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1185,11 +1185,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1199,11 +1199,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1214,12 +1214,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1229,11 +1229,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1244,12 +1244,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1259,13 +1259,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1275,11 +1275,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1290,11 +1290,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1304,11 +1304,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1319,11 +1319,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1333,12 +1333,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1348,13 +1348,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1364,14 +1364,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1381,12 +1381,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1396,12 +1396,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1411,11 +1411,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1425,11 +1425,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1440,11 +1440,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1455,14 +1455,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1472,12 +1472,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1487,11 +1487,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1502,12 +1502,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1518,11 +1518,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1532,12 +1532,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1547,13 +1547,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1564,11 +1564,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1578,11 +1578,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", - "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.6.tgz", + "integrity": "sha512-vQfyXRtG/kNIcTYRd/49uJnwvMig9X3R4XsTVXRml2RFupZFY+2RDuK+/ymb+MfX2WuIHAgUZc2xEvQrnI7QCg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1592,11 +1592,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz", + "integrity": "sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1606,15 +1606,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.6.tgz", + "integrity": "sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1624,11 +1624,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.6.tgz", + "integrity": "sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1638,12 +1638,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.6.tgz", + "integrity": "sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1653,11 +1653,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1668,11 +1668,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1682,12 +1682,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.6.tgz", + "integrity": "sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==", "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1709,11 +1709,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1723,12 +1723,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1738,11 +1738,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1752,11 +1752,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1766,11 +1766,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1780,14 +1780,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz", + "integrity": "sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1797,11 +1797,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1811,12 +1811,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1826,12 +1826,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1841,12 +1841,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1856,26 +1856,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1887,54 +1887,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1971,16 +1971,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.6.tgz", + "integrity": "sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-transform-react-display-name": "^7.24.6", + "@babel/plugin-transform-react-jsx": "^7.24.6", + "@babel/plugin-transform-react-jsx-development": "^7.24.6", + "@babel/plugin-transform-react-pure-annotations": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1990,15 +1990,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.6.tgz", + "integrity": "sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2013,9 +2013,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2024,9 +2024,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz", - "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.6.tgz", + "integrity": "sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2036,31 +2036,31 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2069,12 +2069,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2304,6 +2304,29 @@ "react-dom": "*" } }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.2.1.tgz", + "integrity": "sha512-GgzuqwbqNQSP5s/ouUrOQFuHI8m4Rn8a5CHuWkwpqj+5lbQMsABcvsoiWjrH9M00CzN48q+slSbJy7rtHjn7zg==", + "dependencies": { + "@docusaurus/core": "3.2.1", + "@docusaurus/logger": "3.2.1", + "@docusaurus/utils": "3.2.1", + "@docusaurus/utils-common": "3.2.1", + "@docusaurus/utils-validation": "3.2.1", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.2.1.tgz", @@ -5303,9 +5326,9 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", - "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -5647,9 +5670,9 @@ } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz", + "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==", "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -5711,9 +5734,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.20.0.tgz", - "integrity": "sha512-6EVhAmVug0+hdRHWbubF7hLHHhLoQ8NjLk6iS6d4k5chWawpS5EDexrF6Jx/hPZvUKIeNrzsbTpjAkcvrjNLHg==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.21.0.tgz", + "integrity": "sha512-hjVOrL15I3Y3K8xG0icwG1/tWE+MocqBrhW6uVBWpU+/kVEMK0BnM2xdssj6mZM61eJ4iRxHR0djEI3ENOpR8w==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -6210,9 +6233,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001621", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", - "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", + "version": "1.0.30001625", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz", + "integrity": "sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==", "funding": [ { "type": "opencollective", @@ -7460,9 +7483,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.777", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.777.tgz", - "integrity": "sha512-n02NCwLJ3wexLfK/yQeqfywCblZqLcXphzmid5e8yVPdtEcida7li0A5WQKghHNG0FeOMCzeFOzEbtAh5riXFw==" + "version": "1.4.783", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", + "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -8395,6 +8418,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9267,6 +9291,7 @@ "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.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9982,9 +10007,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -14289,6 +14314,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -14368,9 +14394,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { "version": "0.23.2", diff --git a/docs/package.json b/docs/package.json index d8f7a3dd2b..aec8a76f60 100644 --- a/docs/package.json +++ b/docs/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@docusaurus/core": "3.2.1", + "@docusaurus/plugin-client-redirects": "3.2.1", "@docusaurus/preset-classic": "3.2.1", "@easyops-cn/docusaurus-search-local": "^0.40.1", "@mdx-js/react": "^3.0.0", diff --git a/docs/sidebars.js b/docs/sidebars.js index 2e2147c0dc..10125a3020 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -31,7 +31,7 @@ const sidebars = { { type: "html", value: - 'Starknet RPC Request Builder ', + 'Starknet RPC Request Builder ', }, ], }, diff --git a/docs/versioned_docs/version-0.11.8/_config-options.md b/docs/versioned_docs/version-0.11.8/_config-options.md new file mode 100644 index 0000000000..a5f1b50360 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/_config-options.md @@ -0,0 +1,48 @@ + + +| Config Option | Default Value | Description | +| - | - | - | +| `cn-core-contract-address` | | Custom network core contract address | +| `cn-feeder-url` | | Custom network feeder URL | +| `cn-gateway-url` | | Custom network gateway URL | +| `cn-l1-chain-id` | | Custom network L1 chain id | +| `cn-l2-chain-id` | | Custom network L2 chain id | +| `cn-name` | | Custom network name | +| `cn-unverifiable-range` | `[]` | Custom network range of blocks to skip hash verifications (e.g. `0,100`) | +| `colour` | `true` | Use `--colour=false` command to disable colourized outputs (ANSI Escape Codes) | +| `config` | | The YAML configuration file | +| `db-cache-size` | `8` | Determines the amount of memory (in megabytes) allocated for caching data in the database | +| `db-max-handles` | `1024` | A soft limit on the number of open files that can be used by the DB | +| `db-path` | `juno` | Location of the database files | +| `eth-node` | | WebSocket endpoint of the Ethereum node. To verify the correctness of the L2 chain, Juno must connect to an Ethereum node and parse events in the Starknet contract | +| `grpc` | `false` | Enable the HTTP gRPC server on the default port | +| `grpc-host` | `localhost` | The interface on which the gRPC server will listen for requests | +| `grpc-port` | `6064` | The port on which the gRPC server will listen for requests | +| `gw-api-key` | | API key for gateway endpoints to avoid throttling | +| `gw-timeout` | `5` | Timeout for requests made to the gateway | +| `http` | `false` | Enables the HTTP RPC server on the default port and interface | +| `http-host` | `localhost` | The interface on which the HTTP RPC server will listen for requests | +| `http-port` | `6060` | The port on which the HTTP server will listen for requests | +| `log-level` | `info` | Options: trace, debug, info, warn, error | +| `max-vm-queue` | `2 * max-vms` | Maximum number for requests to queue after reaching max-vms before starting to reject incoming requests | +| `max-vms` | `3 * CPU Cores` | Maximum number for VM instances to be used for RPC calls concurrently | +| `metrics` | `false` | Enables the Prometheus metrics endpoint on the default port | +| `metrics-host` | `localhost` | The interface on which the Prometheus endpoint will listen for requests | +| `metrics-port` | `9090` | The port on which the Prometheus endpoint will listen for requests | +| `network` | `mainnet` | Options: mainnet, sepolia, sepolia-integration | +| `p2p` | `false` | EXPERIMENTAL: Enables p2p server | +| `p2p-addr` | | EXPERIMENTAL: Specify p2p source address as multiaddr | +| `p2p-feeder-node` | `false` | EXPERIMENTAL: Run juno as a feeder node which will only sync from feeder gateway and gossip the new blocks to the network | +| `p2p-peers` | | EXPERIMENTAL: Specify list of p2p peers split by a comma. These peers can be either Feeder or regular nodes | +| `p2p-private-key` | | EXPERIMENTAL: Hexadecimal representation of a private key on the Ed25519 elliptic curve | +| `pending-poll-interval` | `5` | Sets how frequently pending block will be updated (0s will disable fetching of pending block) | +| `pprof` | `false` | Enables the pprof endpoint on the default port | +| `pprof-host` | `localhost` | The interface on which the pprof HTTP server will listen for requests | +| `pprof-port` | `6062` | The port on which the pprof HTTP server will listen for requests | +| `remote-db` | | gRPC URL of a remote Juno node | +| `rpc-call-max-steps` | `4000000` | Maximum number of steps to be executed in starknet_call requests. The upper limit is 4 million steps, and any higher value will still be capped at 4 million | +| `rpc-cors-enable` | `false` | Enable CORS on RPC endpoints | +| `rpc-max-block-scan` | `18446744073709551615` | Maximum number of blocks scanned in single starknet_getEvents call | +| `ws` | `false` | Enables the WebSocket RPC server on the default port | +| `ws-host` | `localhost` | The interface on which the WebSocket RPC server will listen for requests | +| `ws-port` | `6061` | The port on which the WebSocket server will listen for requests | diff --git a/docs/versioned_docs/version-0.11.8/configuring.md b/docs/versioned_docs/version-0.11.8/configuring.md new file mode 100644 index 0000000000..c53d106676 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/configuring.md @@ -0,0 +1,102 @@ +--- +title: Configuring Juno +--- + +# Configuring Juno :gear: + +Juno can be configured using several methods, with the following order of precedence: + +1. [Command line parameters (flags)](#command-line-params) +2. [Environment variables](#environment-variables) +3. [Configuration file](#configuration-file) + +## Command line params + +Juno can be configured directly on the command line by prefixing `--` to each option name: + +```bash +./build/juno --http --http-port 6060 --http-host 0.0.0.0 +``` + +When using Docker, append the command line parameters after the image name to configure Juno: + +```bash +docker run nethermind/juno --http --http-port 6060 --http-host 0.0.0.0 +``` + +:::tip +Command line parameters override [environment variables](#environment-variables) and [configuration file](#configuration-file). +::: + +## Environment variables + +Juno can be configured through environment variables by prefixing the variable names with `JUNO_` and using the configuration options in [SCREAMING_SNAKE_CASE](https://en.wiktionary.org/wiki/screaming_snake_case) format. + +To set the `http`, `http-port`, and `http-host` configurations, Juno should be run in this format: + +```bash +JUNO_HTTP=true JUNO_HTTP_PORT=6060 JUNO_HTTP_HOST=0.0.0.0 ./build/juno +``` + +When using Docker, start Juno using the `-e` command option: + +```bash +docker run \ + -e "JUNO_HTTP=true JUNO_HTTP_PORT=6060 JUNO_HTTP_HOST=0.0.0.0" \ + nethermind/juno +``` + +:::tip +Environment variables rank second in configuration precedence. [Command line parameters](#command-line-params) override environment variables. +::: + +## Configuration file + +Juno can be configured using a [YAML](https://en.wikipedia.org/wiki/YAML) file: + +```yaml title="Sample YAML File" showLineNumbers +log-level: info +network: mainnet +http: true +http-port: 6060 +metrics: true +metrics-port: 9090 +``` + +To run Juno with a configuration file, use the `config` option to specify the path of the configuration file: + +```bash +# Standalone binary +./build/juno --config + +# Docker container +docker run nethermind/juno --config +``` + +:::info +By default, Juno looks for the configuration file in the `$XDG_CONFIG_HOME` directory. +::: + +:::tip +Configuration file rank third in configuration precedence. [Command line parameters](#command-line-params) and [environment variables](#environment-variables) override configuration file. +::: + +## Configuration options + +To list all available command line options, you can use the `--help` parameter: + +```bash +# Standalone binary +./build/juno --help + +# Docker container +docker run nethermind/juno --help +``` + +Below is a list of all configuration options available in Juno, along with their default values and descriptions: + +```mdx-code-block +import ConfigOptions from "./_config-options.md"; + + +``` diff --git a/docs/versioned_docs/version-0.11.8/faq.md b/docs/versioned_docs/version-0.11.8/faq.md new file mode 100644 index 0000000000..78828677ce --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/faq.md @@ -0,0 +1,125 @@ +--- +title: Frequently Asked Questions +--- + +# Frequently Asked Questions :question: + +
+ What is Juno? + +Juno is a Go implementation of a Starknet full-node client created by Nethermind to allow node operators to easily and reliably support the network and advance its decentralisation goals. Juno supports various node setups, from casual to production-grade indexers. + +
+ +
+ How can I run Juno? + +Check out the [Running Juno](running-juno) guide to learn the simplest and fastest ways to run a Juno node. You can also check the [Running Juno on GCP](running-on-gcp) guide to learn how to run Juno on GCP. + +
+ +
+ What are the hardware requirements for running Juno? + +We recommend running Juno with at least 4GB of RAM and 250GB of SSD storage. Check out the [Hardware Requirements](hardware-requirements) for more information. + +
+ +
+ How can I configure my Juno node? + +You can configure Juno using [command line parameters](configuring#command-line-params), [environment variables](configuring#environment-variables), and a [YAML configuration file](configuring#configuration-file). Check out the [Configuring Juno](configuring) guide to learn their usage and precedence. + +
+ +
+ How can I update my Juno node? + +Check out the [Updating Juno](updating) guide for instructions on updating your node to the latest version. + +
+ +
+ How can I interact with my Juno node? + +You can interact with a running Juno node using the [JSON-RPC](json-rpc) and [WebSocket](websocket) interfaces. + +
+ +
+ How can I monitor my Juno node? + +Juno captures metrics data using [Prometheus](https://prometheus.io), and you can visualise them using [Grafana](https://grafana.com). Check out the [Monitoring Juno](monitoring) guide to get started. + +
+ +
+ Do node operators receive any rewards, or is participation solely to support the network? + +Presently, running a node does not come with direct rewards; its primary purpose is contributing to the network's functionality and stability. However, operating a node provides valuable educational benefits and deepens your knowledge of the network's operation. + +
+ +
+ How can I view Juno logs from Docker? + +You can view logs from the Docker container using the following command: + +```bash +docker logs -f juno +``` + +
+ +
+ How can I get real-time updates of new blocks? + +The [WebSocket](websocket#subscribe-to-newly-created-blocks) interface provides a `juno_subscribeNewHeads` method that emits an event when new blocks are added to the blockchain. + +
+ +
+ Does Juno provide snapshots to sync with Starknet quickly? + +Yes, Juno provides snapshots for both the Starknet Mainnet and Sepolia networks. Check out the [Database Snapshots](snapshots) guide to get started. + +
+ +
+ How can I contribute to Juno? + +You can contribute to Juno by running a node, starring on GitHub, reporting bugs, and suggesting new features. Check out the [Contributions and Partnerships](/#contributions-and-partnerships) page for more information. + +
+ +
+ I noticed a warning in my logs saying: **Failed storing Block \{"err": "unsupported block version"\}**. How should I proceed? + +You can fix this problem by [updating to the latest version](updating) of Juno. Check for updates and install them to maintain compatibility with the latest block versions. + +
+ +
+ After updating Juno, I receive **error while migrating DB.** How should I proceed? + +This error suggests your database is corrupted, likely due to the node being interrupted during migration. This can occur if there are insufficient system resources, such as RAM, to finish the process. The only solution is to resynchronise the node from the beginning. To avoid this issue in the future, ensure your system has adequate resources and that the node remains uninterrupted during upgrades. + +
+ +
+ I receive **Error: unable to verify latest block hash; are the database and --network option compatible?** while running Juno. How should I proceed? + +To resolve this issue, ensure that the `eth-node` configuration aligns with the `network` option for the Starknet network. + +
+ +
+ I receive **process \ killed** and **./build/juno: invalid signature (code or signature have been modified)** while running the binary on macOS. How should I proceed? + +You need to re-sign the binary to resolve this issue using the following command: + +```bash +codesign --sign - ./build/juno +``` + +
diff --git a/docs/versioned_docs/version-0.11.8/hardware-requirements.md b/docs/versioned_docs/version-0.11.8/hardware-requirements.md new file mode 100644 index 0000000000..d980364051 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/hardware-requirements.md @@ -0,0 +1,23 @@ +--- +title: Hardware Requirements +--- + +# Hardware Requirements :computer: + +The following specifications outline the hardware required to run a Juno node. These specifications are categorised into minimal and recommended requirements for different usage scenarios. + +## Minimal requirements + +- **CPU**: At least 2 cores +- **RAM**: 4GB or more +- **Storage**: 250GB or more (SSD recommended; note: storage needs will grow over time) + +## Recommended requirements + +- **CPU**: High-performance CPU with 4 or more cores +- **RAM**: 8GB or more +- **Storage**: High-performance SSD with at least 250GB to accommodate future growth + +:::tip +We intend the above specifications as a guideline. The minimal requirements support basic node operations, and the recommended settings ensure optimal performance and scalability for future needs. +::: diff --git a/docs/versioned_docs/version-0.11.8/intro.md b/docs/versioned_docs/version-0.11.8/intro.md new file mode 100644 index 0000000000..e51ce1fee3 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/intro.md @@ -0,0 +1,78 @@ +--- +slug: / +title: Introduction +--- + +# Welcome to Juno :wave: + +Juno is a Go implementation of a Starknet full-node client created by Nethermind to allow node operators to easily and reliably support the network and advance its decentralisation goals. Juno supports various node setups, from casual to production-grade indexers. + +- :cd: **Small database footprint**: Approximately 182GB on mainnet. +- :zap: **Ultra-fast synchronisation**: Limited only by your hardware and the sequencer. +- :100: **Complete [JSON-RPC spec](https://github.com/starkware-libs/starknet-specs/tree/master) compliance**: Everything Starknet, accessible from a single point. +- :mag_right: **Minimal RPC response latency**: Ensuring your applications run smoothly. +- :globe_with_meridians: **Websocket interface**: For seamless real-time updates of the network. + +## Getting started + +Learn how to configure and manage your Juno node with the following resources: + +```mdx-code-block +import GuideCard from '@site/src/components/GuideCard'; + + + + + + + + +``` + +:::tip +You can access the Nethermind Starknet RPC service for free at https://data.voyager.online. +::: + +## Community and support + +Join our community for support, engaging discussions, and updates: + +- [Discord](https://discord.gg/SZkKcmmChJ): Connect in real-time with the Juno team and community. +- [X (Twitter)](https://x.com/NethermindStark): Follow for the latest news and insights from Nethermind. +- [Telegram](https://t.me/+LHRF4H8iQ3c5MDY0): Share ideas and stay informed with fellow Juno users. + +## Contributions and partnerships + +We value community contributions and are eager to support your involvement. Here’s how you can contribute: + +- :rocket: [Run a Juno node](running-juno) to strengthen the Starknet network. +- :star: Give Juno a [star on GitHub](https://github.com/NethermindEth/juno/stargazers). +- :memo: Share your thoughts on [X (Twitter)](https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2FNethermindEth%2Fjuno&via=nethermindeth&text=Juno%20is%20Awesome%2C%20they%20are%20working%20hard%20to%20bring%20decentralization%20to%20StarkNet&hashtags=StarkNet%2CJuno%2CEthereum). +- :beetle: [Report bugs](https://github.com/NethermindEth/juno/issues/new) or [suggest new features](https://github.com/NethermindEth/juno/issues/new). +- :mega: Encourage others to explore and use Juno. + +:::tip +If you're ready to make PRs but unsure where to start, join our [Discord](https://discord.gg/TcHbSZ9ATd), and we'll guide you through some beginner-friendly issues. +::: + +If you're interested in forming a partnership with the Juno team or have any suggestions or special requests, please don't hesitate to contact us via juno@nethermind.io diff --git a/docs/versioned_docs/version-0.11.8/json-rpc.md b/docs/versioned_docs/version-0.11.8/json-rpc.md new file mode 100644 index 0000000000..188c06a879 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/json-rpc.md @@ -0,0 +1,250 @@ +--- +title: JSON-RPC Interface +--- + +# JSON-RPC Interface :globe_with_meridians: + +Interacting with Juno requires sending requests to specific JSON-RPC API methods. Juno supports all of [Starknet's Node API Endpoints](https://playground.open-rpc.org/?uiSchema%5BappBar%5D%5Bui:splitView%5D=false&schemaUrl=https://raw.githubusercontent.com/starkware-libs/starknet-specs/v0.7.0/api/starknet_api_openrpc.json&uiSchema%5BappBar%5D%5Bui:input%5D=false&uiSchema%5BappBar%5D%5Bui:darkMode%5D=true&uiSchema%5BappBar%5D%5Bui:examplesDropdown%5D=false) over HTTP and [WebSocket](websocket). + +## Enable the JSON-RPC server + +To enable the JSON-RPC interface, use the following configuration options: + +- `http`: Enables the HTTP RPC server on the default port and interface (disabled by default). +- `http-host`: The interface on which the HTTP RPC server will listen for requests. If skipped, it defaults to `localhost`. +- `http-port`: The port on which the HTTP server will listen for requests. If skipped, it defaults to `6060`. + +```bash +# Docker container +docker run -d \ + --name juno \ + -p 6060:6060 \ + nethermind/juno \ + --http \ + --http-port 6060 \ + --http-host 0.0.0.0 + +# Standalone binary +./build/juno --http --http-port 6060 --http-host 0.0.0.0 +``` + +## Making JSON-RPC requests + +You can use any of [Starknet's Node API Endpoints](https://playground.open-rpc.org/?uiSchema%5BappBar%5D%5Bui:splitView%5D=false&schemaUrl=https://raw.githubusercontent.com/starkware-libs/starknet-specs/v0.7.0/api/starknet_api_openrpc.json&uiSchema%5BappBar%5D%5Bui:input%5D=false&uiSchema%5BappBar%5D%5Bui:darkMode%5D=true&uiSchema%5BappBar%5D%5Bui:examplesDropdown%5D=false) with Juno. Check the availability of Juno with the `juno_version` method: + +```mdx-code-block +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +``` + + + + +```json +{ + "jsonrpc": "2.0", + "method": "juno_version", + "params": [], + "id": 1 +} +``` + + + + +```bash +curl --location 'http://localhost:6060' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "juno_version", + "params": [], + "id": 1 +}' +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": "v0.11.7", + "id": 1 +} +``` + + + + +Get the most recent accepted block hash and number with the `starknet_blockHashAndNumber` method: + + + + +```json +{ + "jsonrpc": "2.0", + "method": "starknet_blockHashAndNumber", + "params": [], + "id": 1 +} +``` + + + + +```bash +curl --location 'http://localhost:6060' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "starknet_blockHashAndNumber", + "params": [], + "id": 1 +}' +``` + + + + +```js +const { RpcProvider } = require("starknet"); + +const provider = new RpcProvider({ + nodeUrl: "http://localhost:6060", +}); + +provider.getBlockLatestAccepted().then((blockHashAndNumber) => { + console.log(blockHashAndNumber); +}); +``` + + + + +```go +package main + +import ( + "context" + "fmt" + "log" + "github.com/NethermindEth/juno/core/felt" + "github.com/NethermindEth/starknet.go/rpc" + "github.com/NethermindEth/starknet.go/utils" +) + +func main() { + rpcUrl := "http://localhost:6060" + client, err := rpc.NewClient(rpcUrl) + if err != nil { + log.Fatal(err) + } + + provider := rpc.NewProvider(client) + result, err := provider.BlockHashAndNumber(context.Background()) + if err != nil { + log.Fatal(err) + } + fmt.Println("BlockHashAndNumber:", result) +} +``` + + + + +```rust +use starknet::providers::{ + jsonrpc::{HttpTransport, JsonRpcClient}, + Provider, Url, +}; + +#[tokio::main] +async fn main() { + let provider = JsonRpcClient::new(HttpTransport::new( + Url::parse("http://localhost:6060").unwrap(), + )); + + let result = provider.block_hash_and_number().await; + match result { + Ok(block_hash_and_number) => { + println!("{block_hash_and_number:#?}"); + } + Err(err) => { + eprintln!("Error: {err}"); + } + } +} +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": { + "block_hash": "0x637ae4d7468bb603c2f16ba7f9118d58c7d7c98a8210260372e83e7c9df443a", + "block_number": 640827 + }, + "id": 1 +} +``` + + + + +## Supported Starknet API versions + +Juno supports the following Starknet API versions: + +- **v0.7.0**: Accessible via endpoints `/v0_7`, `/rpc/v0_7`, or the default `/` +- **v0.6.0**: Accessible via endpoints `/v0_6` or `/rpc/v0_6` + +To use a specific API version, specify the version endpoint in your RPC calls: + + + + +```bash +curl --location 'http://localhost:6060' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "starknet_chainId", + "params": [], + "id": 1 +}' +``` + + + + +```bash +curl --location 'http://localhost:6060/v0_7' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "starknet_chainId", + "params": [], + "id": 1 +}' +``` + + + + +```bash +curl --location 'http://localhost:6060/v0_6' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "starknet_chainId", + "params": [], + "id": 1 +}' +``` + + + diff --git a/docs/versioned_docs/version-0.11.8/monitoring.md b/docs/versioned_docs/version-0.11.8/monitoring.md new file mode 100644 index 0000000000..f0abb49b35 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/monitoring.md @@ -0,0 +1,87 @@ +--- +title: Monitoring Juno +--- + +# Monitoring Juno :bar_chart: + +Juno uses [Prometheus](https://prometheus.io/) to monitor and collect metrics data, which you can visualise with [Grafana](https://grafana.com/). You can use these insights to understand what is happening when Juno is running. + +## Enable the metrics server + +To enable the metrics server, use the following configuration options: + +- `metrics`: Enables the Prometheus metrics endpoint on the default port (disabled by default). +- `metrics-host`: The interface on which the Prometheus endpoint will listen for requests. If skipped, it defaults to `localhost`. +- `metrics-port`: The port on which the Prometheus endpoint will listen for requests. If skipped, it defaults to `9090`. + +```bash +# Docker container +docker run -d \ + --name juno \ + -p 9090:9090 \ + nethermind/juno \ + --metrics \ + --metrics-port 9090 \ + --metrics-host 0.0.0.0 + +# Standalone binary +./build/juno --metrics --metrics-port 9090 --metrics-host=0.0.0.0 +``` + +## Configure Grafana dashboard + +### 1. Set up Grafana + +- Follow the [Set up Grafana](https://grafana.com/docs/grafana/latest/setup-grafana/) guide to install Grafana. +- Download and [configure](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#configuration-file-location) the [Grafana dashboard file](/juno_grafana.json). + +### 2. Set up Prometheus + +- Follow the [First steps with Prometheus](https://prometheus.io/docs/introduction/first_steps/) guide to install Prometheus. +- Add the Juno metrics endpoint in the `prometheus.yml` configuration file: + +```yaml title="prometheus.yml" showLineNumbers +scrape_configs: + - job_name: "juno" + static_configs: + - targets: ["localhost:9090"] +``` + +### 3. Set up Grafana Loki + +- Follow the [Get started with Grafana Loki](https://grafana.com/docs/loki/latest/get-started/) guide to install [Loki](https://grafana.com/oss/loki/). +- Configure Loki to [collect logs](https://grafana.com/docs/loki/latest/send-data/) from Juno. You might need to configure log paths or use [Promtail](https://grafana.com/docs/loki/latest/send-data/promtail/) (Loki's agent) to send logs to Loki: + +```yaml title="Sample Loki Configuration" showLineNumbers +scrape_configs: + - job_name: "juno-logs" + labels: + job: "juno" + __path__: "/path/to/juno/logs/*" +``` + +:::tip +To have Juno write logs to a file, use the command: + +```bash +./build/juno >> /path/juno.log 2>&1 +``` + +::: + +### 4. Configure the data sources + +1. Follow the [Grafana data sources](https://grafana.com/docs/grafana/latest/datasources/) guide to add data sources. +2. Choose **Prometheus** as a data source: + +- Enter the URL where Prometheus is running, e.g., `http://localhost:9090`. +- Click the **"Save & Test"** button. + +3. Choose **Loki** as a data source: + +- Enter the URL where Loki is running, e.g., `http://localhost:3100`. +- Click the **"Save & Test"** button. + +![Grafana dashboard](/img/grafana-1.png) + +![Grafana dashboard](/img/grafana-2.png) diff --git a/docs/versioned_docs/version-0.11.8/running-juno.md b/docs/versioned_docs/version-0.11.8/running-juno.md new file mode 100644 index 0000000000..4f7208cd8c --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/running-juno.md @@ -0,0 +1,153 @@ +--- +title: Running Juno +--- + +# Running Juno :rocket: + +You can run a Juno node using several methods: + +- [Docker container](#docker-container) +- [Standalone binary](#standalone-binary) +- [Building from source](#building-from-source) +- [Google Cloud Platform (GCP)](running-on-gcp) + +:::tip +You can use a snapshot to quickly synchronise your node with the network. Check out the [Database Snapshots](snapshots) guide to get started. +::: + +## Docker container + +### 1. Get the Docker image + +Juno Docker images can be found at the [nethermind/juno](https://hub.docker.com/r/nethermind/juno) repository on Docker Hub. Download the latest image: + +```bash +docker pull nethermind/juno +``` + +You can also build the image locally: + +```bash +# Clone the Juno repository +git clone https://github.com/NethermindEth/juno +cd juno + +# Build the Docker image +docker build -t nethermind/juno:latest . +``` + +### 2. Run the Docker container + +```bash +# Prepare the snapshots directory +mkdir -p $HOME/snapshots + +# Run the container +docker run -d \ + --name juno \ + -p 6060:6060 \ + -v $HOME/snapshots/juno_mainnet:/snapshots/juno_mainnet \ + nethermind/juno \ + --http \ + --http-port 6060 \ + --http-host 0.0.0.0 \ + --db-path /snapshots/juno_mainnet +``` + +You can view logs from the Docker container using the following command: + +```bash +docker logs -f juno +``` + +## Standalone binary + +Download standalone binaries from [Juno's GitHub Releases](https://github.com/NethermindEth/juno/releases/latest) as ZIP archives for Linux (amd64 and arm64) and macOS (amd64). For macOS (arm64) or Windows users, consider [running Juno using Docker](#docker-container). + +```bash +# Prepare the snapshots directory +mkdir -p $HOME/snapshots + +# Run the binary +./juno \ + --http \ + --http-port 6060 \ + --http-host 0.0.0.0 \ + --db-path $HOME/snapshots/juno_mainnet +``` + +## Building from source + +You can build the Juno binary or Docker image from the source code to access the latest updates or specific versions. + +### Prerequisites + +- [Golang 1.22](https://go.dev/doc/install) or later +- [Rust](https://www.rust-lang.org/tools/install) +- C compiler: `gcc` or `clang` +- [jemalloc](https://github.com/jemalloc/jemalloc) + +```mdx-code-block +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +``` + + + + +```bash +sudo apt-get install -y libjemalloc-dev +``` + + + + +```bash +brew install jemalloc +``` + + + + +### 1. Clone the repository + +Clone Juno's source code from our [GitHub repository](https://github.com/NethermindEth/juno): + +```bash +git clone https://github.com/NethermindEth/juno +cd juno +``` + +:::tip +You can use `git tag -l` to view specific version tags. +::: + +### 2. Build the binary or Docker image + +```bash +# Build the binary +make juno + +# Build the Docker image +docker build -t nethermind/juno:latest . +``` + +### 3. Run the binary + +Locate the standalone binary in the `./build/` directory: + +```bash +# Prepare the snapshots directory +mkdir -p $HOME/snapshots + +# Run the binary +./build/juno \ + --http \ + --http-port 6060 \ + --http-host 0.0.0.0 \ + --db-path $HOME/snapshots/juno_mainnet +``` + +:::tip +To learn how to configure Juno, check out the [Configuring Juno](configuring) guide. +::: diff --git a/docs/versioned_docs/version-0.11.8/running-on-gcp.md b/docs/versioned_docs/version-0.11.8/running-on-gcp.md new file mode 100644 index 0000000000..a589526f34 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/running-on-gcp.md @@ -0,0 +1,76 @@ +--- +title: Running Juno on GCP +--- + +# Running Juno on GCP :cloud: + +To run Juno on the Google Cloud Platform (GCP), you can use the Starknet RPC Virtual Machine (VM) developed by Nethermind. + +## 1. Install the Starknet RPC Node + +Head to the [Google Marketplace](https://console.cloud.google.com/marketplace/browse?q=Starknet%20RPC%20Node) and search for **"Starknet RPC Node"**. Then, click the **"GET STARTED"** button to begin the deployment process. + +![Starknet RPC Node overview](/img/installing_on_gcp/overview.png) + +## 2. Configure the Juno client + +Choose the configuration settings for the Juno client and click the **"DEPLOY"** button. + +![Starknet RPC Node configuration](/img/installing_on_gcp/config.png) + +## 3. Post-configuration and testing + +![Starknet RPC Node testing](/img/installing_on_gcp/testing.png) + +## 4. Enable Juno during startup + +1. Click on the name of the newly created VM instance to view its details. +2. Click the **"Edit"** button. +3. Head to the **"Automation"** section and enter the following startup script: + ```bash + #! /bin/bash + sudo /usr/local/bin/run_juno.sh + ``` +4. Click the **"Save"** button. +5. Restart the VM. + +## 5. Interact with the Juno node + +You can interact with Juno using its [JSON-RPC Interface](json-rpc). Here's an example to check the availability of Juno: + +```mdx-code-block +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +``` + + + + +```bash +curl --location 'http://localhost:6060' \ +--header 'Content-Type: application/json' \ +--data '{ + "jsonrpc": "2.0", + "method": "juno_version", + "params": [], + "id": 1 +}' +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": "v0.11.7", + "id": 1 +} +``` + + + + +:::tip +To learn how to configure Juno, check out the [Configuring Juno](configuring) guide. +::: diff --git a/docs/versioned_docs/version-0.11.8/running-p2p.md b/docs/versioned_docs/version-0.11.8/running-p2p.md new file mode 100644 index 0000000000..e78ec3a557 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/running-p2p.md @@ -0,0 +1,11 @@ +--- +title: Running a Juno P2P Node +--- + +# Running a Juno P2P Node + +Juno can be run as a peer-to-peer node for decentralised data synchronisation and to enhance the resilience and reliability of the Starknet network. Check out the [Juno peer-to-peer launch](https://medium.com/nethermind-eth/junos-experimental-peer-to-peer-launch-3040e195550d) guide to learn how it works. + +:::caution +The P2P feature is currently under active development and is being tested on smaller Juno networks. As a result, syncing with non-Juno nodes may be unstable. +::: diff --git a/docs/versioned_docs/version-0.11.8/snapshots.md b/docs/versioned_docs/version-0.11.8/snapshots.md new file mode 100644 index 0000000000..8b817685fe --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/snapshots.md @@ -0,0 +1,66 @@ +--- +title: Database Snapshots +--- + +# Database Snapshots :camera_flash: + +You can download a snapshot of the Juno database to reduce the network syncing time. Only the blocks created after the snapshot will be synced when you run the node. + +## Mainnet + +| Version | Size | Block | Download Link | +| ------------ | ---------- | ---------- | ----------------------------------------------------------------------------------------------------- | +| **>=v0.9.2** | **172 GB** | **654881** | [**juno_mainnet.tar**](https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.9_654881.tar) | + +## Sepolia + +| Version | Size | Block | Download Link | +| ------------ | -------- | --------- | ---------------------------------------------------------------------------------------------------- | +| **>=v0.9.2** | **5 GB** | **66477** | [**juno_sepolia.tar**](https://juno-snapshots.nethermind.dev/sepolia/juno_sepolia_v0.11.7_66477.tar) | + +## Run Juno with a snapshot + +### 1. Download the snapshot + +First, download a snapshot from one of the provided URLs: + +```bash +wget -O juno_mainnet.tar https://juno-snapshots.nethermind.dev/mainnet/juno_mainnet_v0.11.9_654881.tar +``` + +### 2. Prepare a directory + +Ensure you have a directory to store the snapshots. We will use the `$HOME/snapshots` directory: + +```bash +mkdir -p $HOME/snapshots +``` + +### 3. Extract the snapshot + +Extract the contents of the downloaded `.tar` file into the directory: + +```bash +tar -xvf juno_mainnet.tar -C $HOME/snapshots +``` + +### 4. Run Juno + +Run the Docker command to start Juno and provide the path to the snapshot using the `db-path` option: + +```bash +docker run -d \ + --name juno \ + -p 6060:6060 \ + -v $HOME/snapshots/juno_mainnet:/snapshots/juno_mainnet \ + nethermind/juno \ + --http \ + --http-port 6060 \ + --http-host 0.0.0.0 \ + --db-path /snapshots/juno_mainnet + --eth-node +``` + +:::info +Replace \ with the WebSocket endpoint of your Ethereum node. For Infura users, your address should be: `wss://mainnet.infura.io/ws/v3/your-infura-project-id`. Ensure you use the WebSocket URL (`ws`/`wss`) instead of the HTTP URL (`http`/`https`). +::: diff --git a/docs/versioned_docs/version-0.11.8/updating.md b/docs/versioned_docs/version-0.11.8/updating.md new file mode 100644 index 0000000000..54f449e351 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/updating.md @@ -0,0 +1,88 @@ +--- +title: Updating Juno +--- + +# Updating Juno :arrows_counterclockwise: + +It is important to run the latest version of Juno as each update brings new features, security patches, and improvements over previous versions. Follow these steps to update Juno: + +- [Docker container](#docker-container) +- [Standalone binary](#standalone-binary) +- [Updating from source](#updating-from-source) + +:::info +When running an updated node, use the same `db-path` as before to avoid restarting the sync and use the already synced database. +::: + +## Docker container + +### 1. Get the latest Docker image + +Download the latest Juno Docker image from the [nethermind/juno](https://hub.docker.com/r/nethermind/juno) repository: + +```bash +docker pull nethermind/juno:latest +``` + +### 2. Stop and remove the current Juno container + +Stop the currently running Juno container. If you're unsure of the container name, use `docker ps` to view all running containers: + +```bash +docker stop juno +``` + +Remove the old container to prevent any conflicts with the new version: + +```bash +docker rm juno +``` + +### 3. Start a new container with the updated image + +Run a new container using the updated Docker image: + +```bash +# Prepare the snapshots directory +mkdir -p $HOME/snapshots + +# Run the container +docker run -d \ + --name juno \ + -p 6060:6060 \ + -v $HOME/snapshots/juno_mainnet:/snapshots/juno_mainnet \ + nethermind/juno \ + --http \ + --http-port 6060 \ + --http-host 0.0.0.0 \ + --db-path /snapshots/juno_mainnet +``` + +Verify that the node is running correctly with the updated version: + +```bash +docker logs juno +``` + +## Standalone binary + +Download the latest binary from the [Juno GitHub Releases](https://github.com/NethermindEth/juno/releases/latest) page and replace the existing one. + +## Updating from source + +```bash +# Pull the latest updates to the codebase +git pull + +# Rebuild the binary +make juno + +# OR + +# Rebuild the Docker image +docker build -t nethermind/juno:latest . +``` + +:::tip +To learn how to configure Juno, check out the [Configuring Juno](configuring) guide. +::: diff --git a/docs/versioned_docs/version-0.11.8/websocket.md b/docs/versioned_docs/version-0.11.8/websocket.md new file mode 100644 index 0000000000..ba55e24db8 --- /dev/null +++ b/docs/versioned_docs/version-0.11.8/websocket.md @@ -0,0 +1,207 @@ +--- +title: WebSocket Interface +--- + +# WebSocket Interface :globe_with_meridians: + +Juno provides a WebSocket RPC interface that supports all of [Starknet's JSON-RPC API](https://playground.open-rpc.org/?uiSchema%5BappBar%5D%5Bui:splitView%5D=false&schemaUrl=https://raw.githubusercontent.com/starkware-libs/starknet-specs/v0.7.0/api/starknet_api_openrpc.json&uiSchema%5BappBar%5D%5Bui:input%5D=false&uiSchema%5BappBar%5D%5Bui:darkMode%5D=true&uiSchema%5BappBar%5D%5Bui:examplesDropdown%5D=false) endpoints and allows you to [subscribe to newly created blocks](#subscribe-to-newly-created-blocks). + +## Enable the WebSocket server + +To enable the WebSocket RPC server, use the following configuration options: + +- `ws`: Enables the Websocket RPC server on the default port (disabled by default). +- `ws-host`: The interface on which the Websocket RPC server will listen for requests. If skipped, it defaults to `localhost`. +- `ws-port`: The port on which the WebSocket server will listen for requests. If skipped, it defaults to `6061`. + +```bash +# Docker container +docker run -d \ + --name juno \ + -p 6061:6061 \ + nethermind/juno \ + --ws \ + --ws-port 6061 \ + --ws-host 0.0.0.0 + +# Standalone binary +./build/juno --ws --ws-port 6061 --ws-host 0.0.0.0 +``` + +## Making WebSocket requests + +You can use any of [Starknet's Node API Endpoints](https://playground.open-rpc.org/?uiSchema%5BappBar%5D%5Bui:splitView%5D=false&schemaUrl=https://raw.githubusercontent.com/starkware-libs/starknet-specs/v0.7.0/api/starknet_api_openrpc.json&uiSchema%5BappBar%5D%5Bui:input%5D=false&uiSchema%5BappBar%5D%5Bui:darkMode%5D=true&uiSchema%5BappBar%5D%5Bui:examplesDropdown%5D=false) with Juno. Check the availability of Juno with the `juno_version` method: + +```mdx-code-block +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +``` + + + + +```json +{ + "jsonrpc": "2.0", + "method": "juno_version", + "params": [], + "id": 1 +} +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": "v0.11.7", + "id": 1 +} +``` + + + + +Get the most recent accepted block hash and number with the `starknet_blockHashAndNumber` method: + + + + +```json +{ + "jsonrpc": "2.0", + "method": "starknet_blockHashAndNumber", + "params": [], + "id": 1 +} +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": { + "block_hash": "0x637ae4d7468bb603c2f16ba7f9118d58c7d7c98a8210260372e83e7c9df443a", + "block_number": 640827 + }, + "id": 1 +} +``` + + + + +## Subscribe to newly created blocks + +The WebSocket server provides a `juno_subscribeNewHeads` method that emits an event when new blocks are added to the blockchain: + + + + +```json +{ + "jsonrpc": "2.0", + "method": "juno_subscribeNewHeads", + "params": [], + "id": 1 +} +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": 16570962336122680234, + "id": 1 +} +``` + + + + +When a new block is added, you will receive a message like this: + +```json +{ + "jsonrpc": "2.0", + "method": "juno_subscribeNewHeads", + "params": { + "result": { + "block_hash": "0x840660a07a17ae6a55d39fb6d366698ecda11e02280ca3e9ca4b4f1bad741c", + "parent_hash": "0x529ca67a127e4f40f3ae637fc54c7a56c853b2e085011c64364911af74c9a5c", + "block_number": 65644, + "new_root": "0x4e88ddf34b52091611b34d72849e230d329902888eb57c8e3c1b9cc180a426c", + "timestamp": 1715451809, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "l1_gas_price": { + "price_in_fri": "0x3727bcc63f1", + "price_in_wei": "0x5f438c77" + }, + "l1_data_gas_price": { + "price_in_fri": "0x230e40e8866c6e", + "price_in_wei": "0x3c8c4a9ea51" + }, + "l1_da_mode": "BLOB", + "starknet_version": "0.13.1.1" + }, + "subscription": 16570962336122680234 + } +} +``` + +## Unsubscribe from newly created blocks + +Use the `juno_unsubscribe` method with the `result` value from the subscription response or the `subscription` field from any new block event to stop receiving updates for new blocks: + + + + +```json +{ + "jsonrpc": "2.0", + "method": "juno_unsubscribe", + "params": { + "id": 16570962336122680234 + }, + "id": 1 +} +``` + + + + +```json +{ + "jsonrpc": "2.0", + "result": true, + "id": 1 +} +``` + + + + +## Testing the WebSocket connection + +You can test your WebSocket connection using tools like [wscat](https://github.com/websockets/wscat) or [websocat](https://github.com/vi/websocat): + +```bash +# wscat +$ wscat -c ws://localhost:6061 + > {"jsonrpc": "2.0", "method": "juno_version", "id": 1} + < {"jsonrpc": "2.0", "result": "v0.11.7", "id": 1} + +# websocat +$ websocat -v ws://localhost:6061 + [INFO websocat::lints] Auto-inserting the line mode + [INFO websocat::stdio_threaded_peer] get_stdio_peer (threaded) + [INFO websocat::ws_client_peer] get_ws_client_peer + [INFO websocat::ws_client_peer] Connected to ws + {"jsonrpc": "2.0", "method": "juno_version", "id": 1} + {"jsonrpc": "2.0", "result": "v0.11.7", "id": 1} +``` diff --git a/docs/versioned_sidebars/version-0.11.8-sidebars.json b/docs/versioned_sidebars/version-0.11.8-sidebars.json new file mode 100644 index 0000000000..0a503e19ed --- /dev/null +++ b/docs/versioned_sidebars/version-0.11.8-sidebars.json @@ -0,0 +1,37 @@ +{ + "main": [ + "intro", + { + "type": "category", + "label": "Installation and Setup", + "collapsed": false, + "items": [ + "hardware-requirements", + "running-juno", + "configuring", + "running-on-gcp", + "updating" + ] + }, + { + "type": "category", + "label": "Interacting with Juno", + "collapsed": false, + "items": [ + "json-rpc", + "websocket", + { + "type": "html", + "value": "
Starknet Node API Endpoints " + }, + { + "type": "html", + "value": "Starknet RPC Request Builder " + } + ] + }, + "monitoring", + "snapshots", + "faq" + ] +} diff --git a/docs/versions.json b/docs/versions.json index 3e3ad50db2..97a7109c43 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1 +1,8 @@ -["0.11.0", "0.9.3", "0.8.0", "0.7.0", "0.6.3"] +[ + "0.11.8", + "0.11.0", + "0.9.3", + "0.8.0", + "0.7.0", + "0.6.3" +] diff --git a/go.mod b/go.mod index 6cf54c0e9d..4dd7e4adaa 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,12 @@ require ( github.com/Masterminds/semver/v3 v3.2.1 github.com/bits-and-blooms/bitset v1.13.0 github.com/bits-and-blooms/bloom/v3 v3.6.0 - github.com/cockroachdb/pebble v1.1.0 + github.com/cockroachdb/pebble v1.1.1 github.com/consensys/gnark-crypto v0.12.1 - github.com/ethereum/go-ethereum v1.13.10 - github.com/fxamacker/cbor/v2 v2.5.0 + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc + github.com/fxamacker/cbor/v2 v2.7.0 + github.com/ethereum/go-ethereum v1.14.7 github.com/go-playground/validator/v10 v10.17.0 - github.com/hashicorp/go-set/v2 v2.1.0 github.com/jinzhu/copier v0.4.0 github.com/libp2p/go-libp2p v0.32.2 github.com/libp2p/go-libp2p-kad-dht v0.25.2 @@ -21,7 +21,7 @@ require ( github.com/multiformats/go-multiaddr v0.12.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.0 - github.com/rs/cors v1.10.1 + github.com/rs/cors v1.11.0 github.com/sourcegraph/conc v0.3.0 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -30,35 +30,35 @@ require ( go.uber.org/automaxprocs v1.5.3 go.uber.org/mock v0.4.0 go.uber.org/zap v1.26.0 - golang.org/x/crypto v0.21.0 - google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.33.0 + golang.org/x/crypto v0.23.0 + google.golang.org/grpc v1.65.0 + google.golang.org/protobuf v1.34.1 gopkg.in/yaml.v3 v3.0.1 nhooyr.io/websocket v1.8.10 ) require ( github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // 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.2.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/flynn/noise v1.0.1 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect @@ -72,18 +72,17 @@ require ( github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240117000934-35fc243c5815 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/uint256 v1.3.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/boxo v0.17.0 // indirect @@ -169,14 +168,14 @@ require ( go.uber.org/fx v1.20.1 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.19.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/tools v0.20.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect gopkg.in/ini.v1 v1.67.0 // indirect lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/go.sum b/go.sum index c160d482e2..fa08901c73 100644 --- a/go.sum +++ b/go.sum @@ -12,10 +12,10 @@ github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -38,19 +38,21 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 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/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -70,10 +72,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/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= @@ -98,12 +100,14 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.10 h1:Ppdil79nN+Vc+mXfge0AuUgmKWuVv4eMqzoIVSdqZek= -github.com/ethereum/go-ethereum v1.13.10/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= -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/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.7 h1:EHpv3dE8evQmpVEQ/Ne2ahB06n2mQptdwqaMNhAT29g= +github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.1 h1:vPp/jdQLXC6ppsXSj/pM3W1BIJ5FEHE2TulSJBpb43Y= github.com/flynn/noise v1.0.1/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -114,14 +118,12 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 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/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE= -github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= 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/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -177,9 +179,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -190,7 +191,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= @@ -206,8 +206,8 @@ github.com/google/pprof v0.0.0-20240117000934-35fc243c5815/go.mod h1:czg5+yv1E0Z github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -224,20 +224,18 @@ github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpx github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-set/v2 v2.1.0 h1:iERPCQWks+I+4bTgy0CT2myZsCqNgBg79ZHqwniohXo= -github.com/hashicorp/go-set/v2 v2.1.0/go.mod h1:6q4nh8UCVZODn2tJ5RbJi8+ki7pjZBsAEYGt6yaGeTo= 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/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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= +github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -452,8 +450,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR 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/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -466,8 +464,6 @@ github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWR github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shoenig/test v0.6.7 h1:k92ohN9VyRfZn0ezNfwamtIBT/5byyfLVktRmL/Jmek= -github.com/shoenig/test v0.6.7/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -609,8 +605,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U 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-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= @@ -625,8 +621,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -644,8 +640,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY 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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -659,8 +655,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -681,14 +677,14 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc 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.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= @@ -710,8 +706,8 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= 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= @@ -732,8 +728,8 @@ google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -742,8 +738,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= 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= @@ -753,10 +749,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -765,8 +759,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/jsonrpc/http_test.go b/jsonrpc/http_test.go index 8326b59f52..c1ec68d762 100644 --- a/jsonrpc/http_test.go +++ b/jsonrpc/http_test.go @@ -37,7 +37,7 @@ func TestHTTP(t *testing.T) { client := new(http.Client) msg := `{"jsonrpc" : "2.0", "method" : "echo", "params" : [ "abc123" ], "id" : 1}` - req, err := http.NewRequestWithContext(ctx, "POST", srv.URL, bytes.NewReader([]byte(msg))) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, srv.URL, bytes.NewReader([]byte(msg))) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) @@ -55,7 +55,7 @@ func TestHTTP(t *testing.T) { t.Run("GET", func(t *testing.T) { t.Run("root path", func(t *testing.T) { - req, err := http.NewRequestWithContext(ctx, "GET", srv.URL, http.NoBody) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL, http.NoBody) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) @@ -64,7 +64,7 @@ func TestHTTP(t *testing.T) { }) t.Run("non-root path", func(t *testing.T) { - req, err := http.NewRequestWithContext(ctx, "GET", srv.URL+"/notfound", http.NoBody) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL+"/notfound", http.NoBody) require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) diff --git a/l1/eth_subscriber.go b/l1/eth_subscriber.go index 8ee42b1e46..38e7d377db 100644 --- a/l1/eth_subscriber.go +++ b/l1/eth_subscriber.go @@ -2,15 +2,15 @@ package l1 import ( "context" + "encoding/json" "fmt" "math/big" - "strconv" - "strings" "time" "github.com/NethermindEth/juno/l1/contract" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/rpc" @@ -54,28 +54,21 @@ func (s *EthSubscriber) ChainID(ctx context.Context) (*big.Int, error) { } func (s *EthSubscriber) FinalisedHeight(ctx context.Context) (uint64, error) { - finalisedBlock := make(map[string]any, 0) - if err := s.client.CallContext(ctx, &finalisedBlock, "eth_getBlockByNumber", "finalized", false); err != nil { //nolint:misspell + var raw json.RawMessage + if err := s.client.CallContext(ctx, &raw, "eth_getBlockByNumber", "finalized", false); err != nil { //nolint:misspell return 0, fmt.Errorf("get finalised Ethereum block: %w", err) } - number, ok := finalisedBlock["number"] - if !ok { - return 0, fmt.Errorf("number field not present in Ethereum block") + var head *types.Header + if err := json.Unmarshal(raw, &head); err != nil { + return 0, err } - numberString, ok := number.(string) - if !ok { - return 0, fmt.Errorf("block number is not a string: %v", number) + if head == nil { + return 0, fmt.Errorf("finalised block not found") } - numberString = strings.TrimPrefix(numberString, "0x") - numberUint, err := strconv.ParseUint(numberString, 16, 64) - if err != nil { - return 0, fmt.Errorf("parse block number: %s", numberString) - } - - return numberUint, nil + return head.Number.Uint64(), nil } func (s *EthSubscriber) Close() { diff --git a/l1/l1.go b/l1/l1.go index 1cc169e4f8..abad317057 100644 --- a/l1/l1.go +++ b/l1/l1.go @@ -178,6 +178,7 @@ func (c *Client) finalisedHeight(ctx context.Context) uint64 { return finalisedHeight } c.log.Debugw("Failed to retrieve L1 finalised height, retrying...", "error", err) + time.Sleep(c.resubscribeDelay) } } } diff --git a/l1/l1_test.go b/l1/l1_test.go index 84a4d208ea..44174b7d3c 100644 --- a/l1/l1_test.go +++ b/l1/l1_test.go @@ -4,6 +4,8 @@ import ( "context" "errors" "math/big" + "net" + "net/http" "testing" "time" @@ -15,6 +17,9 @@ import ( "github.com/NethermindEth/juno/l1/contract" "github.com/NethermindEth/juno/mocks" "github.com/NethermindEth/juno/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) @@ -154,3 +159,101 @@ func TestEventListener(t *testing.T) { StateRoot: new(felt.Felt), }, got) } + +func newTestL1Client(service service) *rpc.Server { + server := rpc.NewServer() + if err := server.RegisterName("eth", service); err != nil { + panic(err) + } + return server +} + +type service interface { + GetBlockByNumber(ctx context.Context, number string, fullTx bool) (interface{}, error) +} + +type testService struct{} + +func (testService) GetBlockByNumber(ctx context.Context, number string, fullTx bool) (interface{}, error) { + blockHeight := big.NewInt(100) + return types.Header{ + ParentHash: common.Hash{}, + UncleHash: common.Hash{}, + Root: common.Hash{}, + TxHash: common.Hash{}, + ReceiptHash: common.Hash{}, + Bloom: types.Bloom{}, + Difficulty: big.NewInt(0), + Number: blockHeight, + GasLimit: 0, + GasUsed: 0, + Time: 0, + Extra: []byte{}, + }, nil +} + +type testEmptyService struct{} + +func (testEmptyService) GetBlockByNumber(ctx context.Context, number string, fullTx bool) (interface{}, error) { + return nil, nil +} + +type testFaultyService struct{} + +func (testFaultyService) GetBlockByNumber(ctx context.Context, number string, fullTx bool) (interface{}, error) { + return uint(0), nil +} + +func TestEthSubscriber_FinalisedHeight(t *testing.T) { + tests := map[string]struct { + service service + expectedHeight uint64 + expectedError bool + }{ + "testService": { + service: testService{}, + expectedHeight: 100, + expectedError: false, + }, + "testEmptyService": { + service: testEmptyService{}, + expectedHeight: 0, + expectedError: true, + }, + "testFaultyService": { + service: testFaultyService{}, + expectedHeight: 0, + expectedError: true, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + startServer := func(addr string, service service) (*rpc.Server, net.Listener) { + srv := newTestL1Client(service) + l, err := net.Listen("tcp", addr) + if err != nil { + t.Fatal("can't listen:", err) + } + go func() { + _ = http.Serve(l, srv.WebsocketHandler([]string{"*"})) + }() + return srv, l + } + + ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second) + defer cancel() + + server, listener := startServer("127.0.0.1:0", test.service) + defer server.Stop() + + subscriber, err := l1.NewEthSubscriber("ws://"+listener.Addr().String(), common.Address{}) + require.NoError(t, err) + defer subscriber.Close() + + height, err := subscriber.FinalisedHeight(ctx) + require.Equal(t, test.expectedHeight, height) + require.Equal(t, test.expectedError, err != nil) + }) + } +} diff --git a/migration/bucket_migrator.go b/migration/bucket_migrator.go index 8b404545df..9bd2899a88 100644 --- a/migration/bucket_migrator.go +++ b/migration/bucket_migrator.go @@ -3,6 +3,10 @@ package migration import ( "bytes" "context" + "errors" + "os" + "os/signal" + "syscall" "github.com/NethermindEth/juno/db" "github.com/NethermindEth/juno/utils" @@ -72,14 +76,43 @@ func (m *BucketMigrator) Before(_ []byte) error { return nil } -func (m *BucketMigrator) Migrate(_ context.Context, txn db.Transaction, network *utils.Network) ([]byte, error) { +func (m *BucketMigrator) Migrate(ctx context.Context, txn db.Transaction, network *utils.Network, log utils.SimpleLogger) ([]byte, error) { remainingInBatch := m.batchSize iterator, err := txn.NewIterator() if err != nil { return nil, err } + var ( + firstInterrupt = ctx.Done() + secondInterrupt chan os.Signal // initially nil + ) for iterator.Seek(m.startFrom); iterator.Valid(); iterator.Next() { + select { + case <-firstInterrupt: + if errors.Is(ctx.Err(), context.Canceled) { + msg := "WARNING: Migration is in progress, but you tried to interrupt it.\n" + + "Database may be in an inconsistent state.\n" + + "To force cancellation and potentially corrupt data, send interrupt signal again.\n" + + "Otherwise, please allow the migration to complete." + log.Warnw(msg) + + // after context canceled on upper level there is no way to check how many interrupts were made from ctx.Done() + // but we can Initialise additional channel to receive the signals, they will be copied by runtime and provided + // to all callers (i.e. here and on upper level) + secondInterrupt = make(chan os.Signal, 1) + signal.Notify(secondInterrupt, os.Interrupt, syscall.SIGTERM) + // if we don't set firstInterrupt to nil this case may be fired all the time because + // execution order of cases in select is not guaranteed and selecting from nil channel is blocked operation + firstInterrupt = nil + } + case <-secondInterrupt: + err := errors.New("migration interrupt") + return nil, utils.RunAndWrapOnError(iterator.Close, err) + default: + // keep going + } + key := iterator.Key() if !bytes.HasPrefix(key, m.target.Key()) { break @@ -104,6 +137,7 @@ func (m *BucketMigrator) Migrate(_ context.Context, txn db.Transaction, network } } } + signal.Stop(secondInterrupt) return nil, iterator.Close() } diff --git a/migration/bucket_migrator_test.go b/migration/bucket_migrator_test.go index 79c540f572..19891e37b7 100644 --- a/migration/bucket_migrator_test.go +++ b/migration/bucket_migrator_test.go @@ -40,13 +40,13 @@ func TestBucketMover(t *testing.T) { err error ) err = testDB.Update(func(txn db.Transaction) error { - intermediateState, err = mover.Migrate(context.Background(), txn, &utils.Mainnet) + intermediateState, err = mover.Migrate(context.Background(), txn, &utils.Mainnet, nil) require.ErrorIs(t, err, migration.ErrCallWithNewTransaction) return nil }) require.NoError(t, err) err = testDB.Update(func(txn db.Transaction) error { - intermediateState, err = mover.Migrate(context.Background(), txn, &utils.Mainnet) + intermediateState, err = mover.Migrate(context.Background(), txn, &utils.Mainnet, nil) require.NoError(t, err) return nil }) diff --git a/migration/migration.go b/migration/migration.go index 3a69ac5b85..3e39c1831f 100644 --- a/migration/migration.go +++ b/migration/migration.go @@ -32,13 +32,13 @@ type schemaMetadata struct { type Migration interface { Before(intermediateState []byte) error // Migration should return intermediate state whenever it requests new txn or detects cancelled ctx. - Migrate(context.Context, db.Transaction, *utils.Network) ([]byte, error) + Migrate(context.Context, db.Transaction, *utils.Network, utils.SimpleLogger) ([]byte, error) } type MigrationFunc func(db.Transaction, *utils.Network) error // Migrate returns f(txn). -func (f MigrationFunc) Migrate(_ context.Context, txn db.Transaction, network *utils.Network) ([]byte, error) { +func (f MigrationFunc) Migrate(_ context.Context, txn db.Transaction, network *utils.Network, _ utils.SimpleLogger) ([]byte, error) { return nil, f(txn, network) } @@ -63,8 +63,8 @@ var defaultMigrations = []Migration{ NewBucketMigrator(db.ContractStorage, migrateTrieNodesFromBitsetToTrieKey(db.ContractStorage)). WithKeyFilter(nodesFilter(db.ContractStorage)), NewBucketMover(db.Temporary, db.ContractStorage), - NewBucketMigrator(db.StateUpdatesByBlockNumber, changeStateDiffStruct).WithBatchSize(100), //nolint:gomnd - NewBucketMigrator(db.Class, migrateCairo1CompiledClass).WithBatchSize(1_000), //nolint:gomnd + NewBucketMigrator(db.StateUpdatesByBlockNumber, changeStateDiffStruct).WithBatchSize(100), //nolint:mnd + NewBucketMigrator(db.Class, migrateCairo1CompiledClass).WithBatchSize(1_000), //nolint:mnd } var ErrCallWithNewTransaction = errors.New("call with new transaction") @@ -112,7 +112,7 @@ func migrateIfNeeded(ctx context.Context, targetDB db.DB, network *utils.Network for { callWithNewTransaction := false if dbErr := targetDB.Update(func(txn db.Transaction) error { - metadata.IntermediateState, err = migration.Migrate(ctx, txn, network) + metadata.IntermediateState, err = migration.Migrate(ctx, txn, network, log) switch { case err == nil || errors.Is(err, ctx.Err()): if metadata.IntermediateState == nil { @@ -210,7 +210,8 @@ func relocateContractStorageRootKeys(txn db.Transaction, _ *utils.Network) error // Iterate over all entries in the old bucket, copying each into memory. // Even with millions of contracts, this shouldn't be too expensive. oldEntries := make(map[string][]byte) - oldPrefix := db.Unused.Key() + // Previously ContractStorageRoot were stored in the Peer bucket. + oldPrefix := db.Peer.Key() var value []byte for it.Seek(oldPrefix); it.Valid(); it.Next() { // Stop iterating once we're out of the old bucket. @@ -366,7 +367,7 @@ func (n *node) _UnmarshalBinary(data []byte) error { return err } -func (m *changeTrieNodeEncoding) Migrate(_ context.Context, txn db.Transaction, _ *utils.Network) ([]byte, error) { +func (m *changeTrieNodeEncoding) Migrate(_ context.Context, txn db.Transaction, _ *utils.Network, _ utils.SimpleLogger) ([]byte, error) { // If we made n a trie.Node, the encoder would fall back to the custom encoding methods. // We instead define a cutom struct to force the encoder to use the default encoding. var n node @@ -449,7 +450,7 @@ func calculateBlockCommitments(txn db.Transaction, network *utils.Network) error } workerPool.Go(func() error { - commitments, err := core.VerifyBlockHash(block, network) + commitments, err := core.VerifyBlockHash(block, network, nil) if err != nil { return err } diff --git a/migration/migration_pkg_test.go b/migration/migration_pkg_test.go index 709bd11bfe..fbcc168a90 100644 --- a/migration/migration_pkg_test.go +++ b/migration/migration_pkg_test.go @@ -54,7 +54,7 @@ func TestRelocateContractStorageRootKeys(t *testing.T) { for i := 0; i < numberOfContracts; i++ { exampleBytes := new(felt.Felt).SetUint64(uint64(i)).Bytes() // Use exampleBytes for the key suffix (the contract address) and the value. - err := txn.Set(db.Unused.Key(exampleBytes[:]), exampleBytes[:]) + err := txn.Set(db.Peer.Key(exampleBytes[:]), exampleBytes[:]) require.NoError(t, err) } @@ -72,7 +72,7 @@ func TestRelocateContractStorageRootKeys(t *testing.T) { })) // Old entry does not exist. - oldKey := db.Unused.Key(exampleBytes[:]) + oldKey := db.Peer.Key(exampleBytes[:]) err := txn.Get(oldKey, func(val []byte) error { return nil }) require.ErrorIs(t, db.ErrKeyNotFound, err) } @@ -143,7 +143,7 @@ func TestChangeTrieNodeEncoding(t *testing.T) { m := new(changeTrieNodeEncoding) require.NoError(t, m.Before(nil)) require.NoError(t, testdb.Update(func(txn db.Transaction) error { - _, err := m.Migrate(context.Background(), txn, &utils.Mainnet) + _, err := m.Migrate(context.Background(), txn, &utils.Mainnet, nil) return err })) @@ -427,7 +427,7 @@ type testMigration struct { before func([]byte) error } -func (f testMigration) Migrate(ctx context.Context, txn db.Transaction, network *utils.Network) ([]byte, error) { +func (f testMigration) Migrate(ctx context.Context, txn db.Transaction, network *utils.Network, _ utils.SimpleLogger) ([]byte, error) { return f.exec(ctx, txn, network) } @@ -507,7 +507,7 @@ func TestChangeStateDiffStructEmptyDB(t *testing.T) { require.NoError(t, testdb.Update(func(txn db.Transaction) error { migrator := NewBucketMigrator(db.StateUpdatesByBlockNumber, changeStateDiffStruct) require.NoError(t, migrator.Before(nil)) - intermediateState, err := migrator.Migrate(context.Background(), txn, &utils.Mainnet) + intermediateState, err := migrator.Migrate(context.Background(), txn, &utils.Mainnet, nil) require.NoError(t, err) require.Nil(t, intermediateState) @@ -584,7 +584,7 @@ func TestChangeStateDiffStruct(t *testing.T) { require.NoError(t, testdb.Update(func(txn db.Transaction) error { migrator := NewBucketMigrator(db.StateUpdatesByBlockNumber, changeStateDiffStruct) require.NoError(t, migrator.Before(nil)) - intermediateState, err := migrator.Migrate(context.Background(), txn, &utils.Mainnet) + intermediateState, err := migrator.Migrate(context.Background(), txn, &utils.Mainnet, nil) require.NoError(t, err) require.Nil(t, intermediateState) return nil diff --git a/node/node.go b/node/node.go index de880617cf..6a20829e89 100644 --- a/node/node.go +++ b/node/node.go @@ -44,26 +44,27 @@ const ( // Config is the top-level juno configuration. type Config struct { - LogLevel utils.LogLevel `mapstructure:"log-level"` - HTTP bool `mapstructure:"http"` - HTTPHost string `mapstructure:"http-host"` - HTTPPort uint16 `mapstructure:"http-port"` - RPCCorsEnable bool `mapstructure:"rpc-cors-enable"` - Websocket bool `mapstructure:"ws"` - WebsocketHost string `mapstructure:"ws-host"` - WebsocketPort uint16 `mapstructure:"ws-port"` - GRPC bool `mapstructure:"grpc"` - GRPCHost string `mapstructure:"grpc-host"` - GRPCPort uint16 `mapstructure:"grpc-port"` - DatabasePath string `mapstructure:"db-path"` - Network utils.Network `mapstructure:"network"` - EthNode string `mapstructure:"eth-node"` - Pprof bool `mapstructure:"pprof"` - PprofHost string `mapstructure:"pprof-host"` - PprofPort uint16 `mapstructure:"pprof-port"` - Colour bool `mapstructure:"colour"` - PendingPollInterval time.Duration `mapstructure:"pending-poll-interval"` - RemoteDB string `mapstructure:"remote-db"` + LogLevel utils.LogLevel `mapstructure:"log-level"` + HTTP bool `mapstructure:"http"` + HTTPHost string `mapstructure:"http-host"` + HTTPPort uint16 `mapstructure:"http-port"` + RPCCorsEnable bool `mapstructure:"rpc-cors-enable"` + Websocket bool `mapstructure:"ws"` + WebsocketHost string `mapstructure:"ws-host"` + WebsocketPort uint16 `mapstructure:"ws-port"` + GRPC bool `mapstructure:"grpc"` + GRPCHost string `mapstructure:"grpc-host"` + GRPCPort uint16 `mapstructure:"grpc-port"` + DatabasePath string `mapstructure:"db-path"` + Network utils.Network `mapstructure:"network"` + EthNode string `mapstructure:"eth-node"` + Pprof bool `mapstructure:"pprof"` + PprofHost string `mapstructure:"pprof-host"` + PprofPort uint16 `mapstructure:"pprof-port"` + Colour bool `mapstructure:"colour"` + PendingPollInterval time.Duration `mapstructure:"pending-poll-interval"` + RemoteDB string `mapstructure:"remote-db"` + VersionedConstantsFile string `mapstructure:"versioned-constants-file"` Metrics bool `mapstructure:"metrics"` MetricsHost string `mapstructure:"metrics-host"` @@ -107,18 +108,14 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen return nil, err } - dbLog, err := utils.NewZapLogger(utils.ERROR, cfg.Colour) - if err != nil { - return nil, fmt.Errorf("create DB logger: %w", err) - } - dbIsRemote := cfg.RemoteDB != "" var database db.DB if dbIsRemote { database, err = remote.New(cfg.RemoteDB, context.TODO(), log, grpc.WithTransportCredentials(insecure.NewCredentials())) } else { - database, err = pebble.New(cfg.DatabasePath, cfg.DBCacheSize, cfg.DBMaxHandles, dbLog) + database, err = pebble.NewWithOptions(cfg.DatabasePath, cfg.DBCacheSize, cfg.DBMaxHandles, cfg.Colour) } + if err != nil { return nil, fmt.Errorf("open DB: %w", err) } @@ -134,12 +131,24 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen return nil, fmt.Errorf("get head block from database: %v", err) } if head != nil { + stateUpdate, err := chain.StateUpdateByNumber(head.Number) + if err != nil { + return nil, err + } + // We assume that there is at least one transaction in the block or that it is a pre-0.7 block. - if _, err = core.VerifyBlockHash(head, &cfg.Network); err != nil { + if _, err = core.VerifyBlockHash(head, &cfg.Network, stateUpdate.StateDiff); err != nil { return nil, errors.New("unable to verify latest block hash; are the database and --network option compatible?") } } + if cfg.VersionedConstantsFile != "" { + err = vm.SetVersionedConstants(cfg.VersionedConstantsFile) + if err != nil { + return nil, fmt.Errorf("failed to set versioned constants: %w", err) + } + } + client := feeder.NewClient(cfg.Network.FeederURL).WithUserAgent(ua).WithLogger(log). WithTimeout(cfg.GatewayTimeout).WithAPIKey(cfg.GatewayAPIKey) synchronizer := sync.New(chain, adaptfeeder.New(client), log, cfg.PendingPollInterval, dbIsRemote) @@ -156,7 +165,8 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen // Do not start the feeder synchronisation synchronizer = nil } - p2pService, err = p2p.New(cfg.P2PAddr, "juno", cfg.P2PPeers, cfg.P2PPrivateKey, cfg.P2PFeederNode, chain, &cfg.Network, log) + p2pService, err = p2p.New(cfg.P2PAddr, version, cfg.P2PPeers, cfg.P2PPrivateKey, cfg.P2PFeederNode, + chain, &cfg.Network, log, database) if err != nil { return nil, fmt.Errorf("set up p2p service: %w", err) } @@ -167,14 +177,14 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen services = append(services, synchronizer) } - throttledVM := NewThrottledVM(vm.New(log), cfg.MaxVMs, int32(cfg.MaxVMQueue)) + throttledVM := NewThrottledVM(vm.New(false, log), cfg.MaxVMs, int32(cfg.MaxVMQueue)) var syncReader sync.Reader = &sync.NoopSynchronizer{} if synchronizer != nil { syncReader = synchronizer } - rpcHandler := rpc.New(chain, syncReader, throttledVM, version, &cfg.Network, log).WithGateway(gatewayClient).WithFeeder(client) + rpcHandler := rpc.New(chain, syncReader, throttledVM, version, log).WithGateway(gatewayClient).WithFeeder(client) rpcHandler = rpcHandler.WithFilterLimit(cfg.RPCMaxBlockScan).WithCallMaxSteps(uint64(cfg.RPCCallMaxSteps)) services = append(services, rpcHandler) // to improve RPC throughput we double GOMAXPROCS diff --git a/node/node_test.go b/node/node_test.go index 0a6642ac4e..a9287e0e4e 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -67,7 +67,7 @@ func TestNetworkVerificationOnNonEmptyDB(t *testing.T) { t.Run(description, func(t *testing.T) { dbPath := t.TempDir() log := utils.NewNopZapLogger() - database, err := pebble.New(dbPath, 1, 1, log) + database, err := pebble.New(dbPath) require.NoError(t, err) chain := blockchain.New(database, &network) syncer := sync.New(chain, adaptfeeder.New(feeder.NewTestClient(t, &network)), log, 0, false) diff --git a/node/throttled_vm.go b/node/throttled_vm.go index f502d134d9..7151867c00 100644 --- a/node/throttled_vm.go +++ b/node/throttled_vm.go @@ -31,7 +31,8 @@ func (tvm *ThrottledVM) Call(callInfo *vm.CallInfo, blockInfo *vm.BlockInfo, sta } func (tvm *ThrottledVM) Execute(txns []core.Transaction, declaredClasses []core.Class, paidFeesOnL1 []*felt.Felt, - blockInfo *vm.BlockInfo, state core.StateReader, network *utils.Network, skipChargeFee, skipValidate, errOnRevert, useBlobData bool, + blockInfo *vm.BlockInfo, state core.StateReader, network *utils.Network, skipChargeFee, skipValidate, errOnRevert, + useBlobData bool, ) ([]*felt.Felt, []*felt.Felt, []vm.TransactionTrace, error) { var ret []*felt.Felt var traces []vm.TransactionTrace diff --git a/p2p/p2p.go b/p2p/p2p.go index c1ef8153e6..74fb5ab855 100644 --- a/p2p/p2p.go +++ b/p2p/p2p.go @@ -10,7 +10,9 @@ import ( "sync" "time" + "github.com/Masterminds/semver/v3" "github.com/NethermindEth/juno/blockchain" + "github.com/NethermindEth/juno/db" "github.com/NethermindEth/juno/p2p/starknet" junoSync "github.com/NethermindEth/juno/sync" "github.com/NethermindEth/juno/utils" @@ -31,6 +33,7 @@ import ( const ( keyLength = 2048 routingTableRefreshPeriod = 1 * time.Second + clientName = "juno" ) type Service struct { @@ -48,10 +51,11 @@ type Service struct { synchroniser *syncService feederNode bool + database db.DB } -func New(addr, userAgent, peers, privKeyStr string, feederNode bool, bc *blockchain.Blockchain, snNetwork *utils.Network, - log utils.SimpleLogger, +func New(addr, version, peers, privKeyStr string, feederNode bool, bc *blockchain.Blockchain, snNetwork *utils.Network, + log utils.SimpleLogger, database db.DB, ) (*Service, error) { if addr == "" { // 0.0.0.0/tcp/0 will listen on any interface device and assing a free port. @@ -67,24 +71,34 @@ func New(addr, userAgent, peers, privKeyStr string, feederNode bool, bc *blockch return nil, err } - p2pHost, err := libp2p.New(libp2p.ListenAddrs(sourceMultiAddr), libp2p.Identity(prvKey), libp2p.UserAgent(userAgent)) + p2pHost, err := libp2p.New(libp2p.ListenAddrs(sourceMultiAddr), libp2p.Identity(prvKey), libp2p.UserAgent(makeAgentName(version))) if err != nil { return nil, err } // Todo: try to understand what will happen if user passes a multiaddr with p2p public and a private key which doesn't match. // For example, a user passes the following multiaddr: --p2p-addr=/ip4/0.0.0.0/tcp/7778/p2p/(SomePublicKey) and also passes a // --p2p-private-key="SomePrivateKey". However, the private public key pair don't match, in this case what will happen? - return NewWithHost(p2pHost, peers, feederNode, bc, snNetwork, log) + return NewWithHost(p2pHost, peers, feederNode, bc, snNetwork, log, database) } func NewWithHost(p2phost host.Host, peers string, feederNode bool, bc *blockchain.Blockchain, snNetwork *utils.Network, - log utils.SimpleLogger, + log utils.SimpleLogger, database db.DB, ) (*Service, error) { - peersAddrInfoS := []peer.AddrInfo{} + var ( + peersAddrInfoS []peer.AddrInfo + err error + ) + + peersAddrInfoS, err = loadPeers(database) + if err != nil { + log.Warnw("Failed to load peers", "err", err) + } + if peers != "" { splitted := strings.Split(peers, ",") for _, peerStr := range splitted { - peerAddr, err := peer.AddrInfoFromString(peerStr) + var peerAddr *peer.AddrInfo + peerAddr, err = peer.AddrInfoFromString(peerStr) if err != nil { return nil, fmt.Errorf("addr info from %q: %w", peerStr, err) } @@ -93,7 +107,7 @@ func NewWithHost(p2phost host.Host, peers string, feederNode bool, bc *blockchai } } - p2pdht, err := makeDHT(p2phost, snNetwork, peersAddrInfoS) + p2pdht, err := makeDHT(p2phost, peersAddrInfoS) if err != nil { return nil, err } @@ -110,13 +124,14 @@ func NewWithHost(p2phost host.Host, peers string, feederNode bool, bc *blockchai feederNode: feederNode, topics: make(map[string]*pubsub.Topic), handler: starknet.NewHandler(bc, log), + database: database, } return s, nil } -func makeDHT(p2phost host.Host, snNetwork *utils.Network, addrInfos []peer.AddrInfo) (*dht.IpfsDHT, error) { +func makeDHT(p2phost host.Host, addrInfos []peer.AddrInfo) (*dht.IpfsDHT, error) { return dht.New(context.Background(), p2phost, - dht.ProtocolPrefix(snNetwork.ProtocolID()), + dht.ProtocolPrefix(starknet.KadPrefix()), dht.BootstrapPeers(addrInfos...), dht.RoutingTableRefreshPeriod(routingTableRefreshPeriod), dht.Mode(dht.ModeServer), @@ -213,6 +228,9 @@ func (s *Service) Run(ctx context.Context) error { } <-ctx.Done() + if err := s.persistPeers(); err != nil { + s.log.Warnw("Failed to persist peers", "err", err) + } if err := s.dht.Close(); err != nil { s.log.Warnw("Failed stopping DHT", "err", err.Error()) } @@ -220,13 +238,11 @@ func (s *Service) Run(ctx context.Context) error { } func (s *Service) setProtocolHandlers() { - s.SetProtocolHandler(starknet.BlockHeadersPID(s.network), s.handler.BlockHeadersHandler) - s.SetProtocolHandler(starknet.CurrentBlockHeaderPID(s.network), s.handler.CurrentBlockHeaderHandler) - s.SetProtocolHandler(starknet.ReceiptsPID(s.network), s.handler.ReceiptsHandler) - // todo discuss protocol id (should it be included in BlockHeadersPID) - s.SetProtocolHandler(starknet.BlockBodiesPID(s.network), s.handler.BlockBodiesHandler) - s.SetProtocolHandler(starknet.EventsPID(s.network), s.handler.EventsHandler) - s.SetProtocolHandler(starknet.TransactionsPID(s.network), s.handler.TransactionsHandler) + s.SetProtocolHandler(starknet.HeadersPID(), s.handler.HeadersHandler) + s.SetProtocolHandler(starknet.EventsPID(), s.handler.EventsHandler) + s.SetProtocolHandler(starknet.TransactionsPID(), s.handler.TransactionsHandler) + s.SetProtocolHandler(starknet.ClassesPID(), s.handler.ClassesHandler) + s.SetProtocolHandler(starknet.StateDiffPID(), s.handler.StateDiffHandler) } func (s *Service) callAndLogErr(f func() error, msg string) { @@ -242,7 +258,7 @@ func (s *Service) ListenAddrs() ([]multiaddr.Multiaddr, error) { return nil, err } - var listenAddrs []multiaddr.Multiaddr + listenAddrs := make([]multiaddr.Multiaddr, 0, len(s.host.Addrs())) for _, addr := range s.host.Addrs() { listenAddrs = append(listenAddrs, addr.Encapsulate(pidmhash)) } @@ -348,3 +364,85 @@ func (s *Service) WithListener(l junoSync.EventListener) { runMetrics(s.host.Peerstore()) s.synchroniser.WithListener(l) } + +// persistPeers stores the given peers in the peers database +func (s *Service) persistPeers() error { + txn, err := s.database.NewTransaction(true) + if err != nil { + return fmt.Errorf("create transaction: %w", err) + } + + store := s.host.Peerstore() + peers := store.Peers() + for _, peerID := range peers { + peerInfo := store.PeerInfo(peerID) + + encodedAddrs, err := EncodeAddrs(peerInfo.Addrs) + if err != nil { + return fmt.Errorf("encode addresses for peer %s: %w", peerID, err) + } + + if err := txn.Set(db.Peer.Key([]byte(peerID)), encodedAddrs); err != nil { + return fmt.Errorf("set data for peer %s: %w", peerID, err) + } + } + + if err := txn.Commit(); err != nil { + return fmt.Errorf("commit transaction: %w", err) + } + + s.log.Infow("Stored peers", "num", len(peers)) + + return nil +} + +// loadPeers loads the previously stored peers from the database +func loadPeers(database db.DB) ([]peer.AddrInfo, error) { + var peers []peer.AddrInfo + + err := database.View(func(txn db.Transaction) error { + it, err := txn.NewIterator() + if err != nil { + return fmt.Errorf("create iterator: %w", err) + } + defer it.Close() + + prefix := db.Peer.Key() + for it.Seek(prefix); it.Valid(); it.Next() { + peerIDBytes := it.Key()[len(prefix):] + peerID, err := peer.IDFromBytes(peerIDBytes) + if err != nil { + return fmt.Errorf("decode peer ID: %w", err) + } + + val, err := it.Value() + if err != nil { + return fmt.Errorf("get value: %w", err) + } + + addrs, err := decodeAddrs(val) + if err != nil { + return fmt.Errorf("decode addresses for peer %s: %w", peerID, err) + } + + peers = append(peers, peer.AddrInfo{ID: peerID, Addrs: addrs}) + } + + return nil + }) + if err != nil { + return nil, fmt.Errorf("load peers: %w", err) + } + + return peers, nil +} + +func makeAgentName(version string) string { + modVer := "0.0.0" + semVer, err := semver.NewVersion(version) + if err == nil { + modVer = fmt.Sprintf("%d.%d.%d", semVer.Major(), semVer.Minor(), semVer.Patch()) + } + + return fmt.Sprintf("%s/%s", clientName, modVer) +} diff --git a/p2p/p2p_test.go b/p2p/p2p_test.go index 5b536fa09a..e91281c48b 100644 --- a/p2p/p2p_test.go +++ b/p2p/p2p_test.go @@ -8,11 +8,15 @@ import ( "testing" "time" + "github.com/NethermindEth/juno/db" + "github.com/NethermindEth/juno/db/pebble" "github.com/NethermindEth/juno/p2p" "github.com/NethermindEth/juno/utils" "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + "github.com/multiformats/go-multiaddr" "github.com/stretchr/testify/require" ) @@ -33,6 +37,7 @@ func TestService(t *testing.T) { nil, &utils.Integration, utils.NewNopZapLogger(), + nil, ) require.NoError(t, err) @@ -42,7 +47,7 @@ func TestService(t *testing.T) { peerAddrs, err := peerA.ListenAddrs() require.NoError(t, err) - var peerAddrsString []string + peerAddrsString := make([]string, 0, len(peerAddrs)) for _, addr := range peerAddrs { peerAddrsString = append(peerAddrsString, addr.String()) } @@ -54,6 +59,7 @@ func TestService(t *testing.T) { nil, &utils.Integration, utils.NewNopZapLogger(), + nil, ) require.NoError(t, err) @@ -140,6 +146,7 @@ func TestInvalidKey(t *testing.T) { nil, &utils.Integration, utils.NewNopZapLogger(), + nil, ) require.Error(t, err) @@ -156,7 +163,43 @@ func TestValidKey(t *testing.T) { nil, &utils.Integration, utils.NewNopZapLogger(), + nil, ) require.NoError(t, err) } + +func TestLoadAndPersistPeers(t *testing.T) { + testDB := pebble.NewMemTest(t) + + txn, err := testDB.NewTransaction(true) + require.NoError(t, err) + + decodedID, err := peer.Decode("12D3KooWLdURCjbp1D7hkXWk6ZVfcMDPtsNnPHuxoTcWXFtvrxGG") + require.NoError(t, err) + + addrs := []multiaddr.Multiaddr{ + multiaddr.StringCast("/ip4/127.0.0.1/tcp/7777"), + } + encAddrs, err := p2p.EncodeAddrs(addrs) + require.NoError(t, err) + + err = txn.Set(db.Peer.Key([]byte(decodedID)), encAddrs) + require.NoError(t, err) + + err = txn.Commit() + require.NoError(t, err) + + _, err = p2p.New( + "/ip4/127.0.0.1/tcp/30301", + "peerA", + "", + "5f6cdc3aebcc74af494df054876100368ef6126e3a33fa65b90c765b381ffc37a0a63bbeeefab0740f24a6a38dabb513b9233254ad0020c721c23e69bc820089", + false, + nil, + &utils.Integration, + utils.NewNopZapLogger(), + testDB, + ) + require.NoError(t, err) +} diff --git a/p2p/peers.go b/p2p/peers.go new file mode 100644 index 0000000000..a5948281fb --- /dev/null +++ b/p2p/peers.go @@ -0,0 +1,43 @@ +package p2p + +import ( + "bytes" + "fmt" + + "github.com/fxamacker/cbor/v2" + "github.com/multiformats/go-multiaddr" +) + +// EncodeAddrs encodes a slice of multiaddrs into a byte slice +func EncodeAddrs(addrs []multiaddr.Multiaddr) ([]byte, error) { + multiAddrBytes := make([][]byte, len(addrs)) + for i, addr := range addrs { + multiAddrBytes[i] = addr.Bytes() + } + + var buf bytes.Buffer + if err := cbor.NewEncoder(&buf).Encode(multiAddrBytes); err != nil { + return nil, fmt.Errorf("encode addresses: %w", err) + } + + return buf.Bytes(), nil +} + +// decodeAddrs decodes a byte slice into a slice of multiaddrs +func decodeAddrs(b []byte) ([]multiaddr.Multiaddr, error) { + var multiAddrBytes [][]byte + if err := cbor.NewDecoder(bytes.NewReader(b)).Decode(&multiAddrBytes); err != nil { + return nil, fmt.Errorf("decode addresses: %w", err) + } + + addrs := make([]multiaddr.Multiaddr, 0, len(multiAddrBytes)) + for _, addrBytes := range multiAddrBytes { + addr, err := multiaddr.NewMultiaddrBytes(addrBytes) + if err != nil { + return nil, fmt.Errorf("parse multiaddr: %w", err) + } + addrs = append(addrs, addr) + } + + return addrs, nil +} diff --git a/p2p/starknet/block_bodies.go b/p2p/starknet/block_bodies.go deleted file mode 100644 index 2baa0761c7..0000000000 --- a/p2p/starknet/block_bodies.go +++ /dev/null @@ -1,226 +0,0 @@ -package starknet - -import ( - "crypto/rand" - "slices" - - "github.com/NethermindEth/juno/adapters/core2p2p" - "github.com/NethermindEth/juno/blockchain" - "github.com/NethermindEth/juno/core" - "github.com/NethermindEth/juno/core/felt" - "github.com/NethermindEth/juno/p2p/starknet/spec" - "github.com/NethermindEth/juno/utils" - "google.golang.org/protobuf/proto" -) - -type blockBodyStep int - -const ( - _ blockBodyStep = iota - - sendDiff // initial - sendClasses - sendProof - sendBlockFin - terminal // final step -) - -type blockBodyIterator struct { - log utils.SimpleLogger - stateReader core.StateReader - stateCloser func() error - - step blockBodyStep - header *core.Header - - stateUpdate *core.StateUpdate -} - -func newBlockBodyIterator(bcReader blockchain.Reader, header *core.Header, log utils.SimpleLogger) (*blockBodyIterator, error) { - stateUpdate, err := bcReader.StateUpdateByNumber(header.Number) - if err != nil { - return nil, err - } - - stateReader, closer, err := bcReader.StateAtBlockNumber(header.Number) - if err != nil { - return nil, err - } - - return &blockBodyIterator{ - step: sendDiff, - header: header, - log: log, - stateReader: stateReader, - stateCloser: closer, - stateUpdate: stateUpdate, - }, nil -} - -func (b *blockBodyIterator) hasNext() bool { - return slices.Contains([]blockBodyStep{ - sendDiff, - sendClasses, - sendProof, - sendBlockFin, - }, b.step) -} - -// Either BlockBodiesResponse_Diff, *_Classes, *_Proof, *_Fin -func (b *blockBodyIterator) next() (msg proto.Message, valid bool) { - switch b.step { - case sendDiff: - msg, valid = b.diff() - b.step = sendClasses - case sendClasses: - msg, valid = b.classes() - b.step = sendProof - case sendProof: - msg, valid = b.proof() - b.step = sendBlockFin - case sendBlockFin: - // fin changes step to terminal internally - msg, valid = b.fin() - case terminal: - panic("next called on terminal step") - default: - b.log.Errorw("Unknown step in blockBodyIterator", "step", b.step) - } - - return -} - -func (b *blockBodyIterator) classes() (proto.Message, bool) { - var classes []*spec.Class - - stateDiff := b.stateUpdate.StateDiff - - for _, hash := range stateDiff.DeclaredV0Classes { - cls, err := b.stateReader.Class(hash) - if err != nil { - return b.fin() - } - - classes = append(classes, core2p2p.AdaptClass(cls.Class)) - } - for classHash := range stateDiff.DeclaredV1Classes { - cls, err := b.stateReader.Class(&classHash) - if err != nil { - return b.fin() - } - classes = append(classes, core2p2p.AdaptClass(cls.Class)) - } - - res := &spec.BlockBodiesResponse{ - Id: b.blockID(), - BodyMessage: &spec.BlockBodiesResponse_Classes{ - Classes: &spec.Classes{ - Domain: 0, - Classes: classes, - }, - }, - } - - return res, true -} - -type contractDiff struct { - address *felt.Felt - storageDiffs map[felt.Felt]*felt.Felt - nonce *felt.Felt -} - -func (b *blockBodyIterator) diff() (proto.Message, bool) { - var err error - diff := b.stateUpdate.StateDiff - - modifiedContracts := make(map[felt.Felt]*contractDiff) - - initContractDiff := func(addr *felt.Felt) *contractDiff { - return &contractDiff{address: addr} - } - updateModifiedContracts := func(addr felt.Felt, f func(*contractDiff)) error { - cDiff, ok := modifiedContracts[addr] - if !ok { - cDiff = initContractDiff(&addr) - if err != nil { - return err - } - modifiedContracts[addr] = cDiff - } - - f(cDiff) - return nil - } - - for addr, n := range diff.Nonces { - err = updateModifiedContracts(addr, func(diff *contractDiff) { - diff.nonce = n - }) - if err != nil { - b.log.Errorw("Failed to update modified contract", "err", err) - return b.fin() - } - } - - for addr, sDiff := range diff.StorageDiffs { - err = updateModifiedContracts(addr, func(diff *contractDiff) { - diff.storageDiffs = sDiff - }) - if err != nil { - b.log.Errorw("Failed to update modified contract", "err", err) - return b.fin() - } - } - - var contractDiffs []*spec.StateDiff_ContractDiff - for _, c := range modifiedContracts { - contractDiffs = append(contractDiffs, core2p2p.AdaptStateDiff(c.address, c.nonce, c.storageDiffs)) - } - - return &spec.BlockBodiesResponse{ - Id: b.blockID(), - BodyMessage: &spec.BlockBodiesResponse_Diff{ - Diff: &spec.StateDiff{ - Domain: 0, - ContractDiffs: contractDiffs, - ReplacedClasses: utils.ToSlice(diff.ReplacedClasses, core2p2p.AdaptAddressClassHashPair), - DeployedContracts: utils.ToSlice(diff.DeployedContracts, core2p2p.AdaptAddressClassHashPair), - }, - }, - }, true -} - -func (b *blockBodyIterator) fin() (proto.Message, bool) { - b.step = terminal - if err := b.stateCloser(); err != nil { - b.log.Errorw("Call to state closer failed", "err", err) - } - return &spec.BlockBodiesResponse{ - Id: b.blockID(), - BodyMessage: &spec.BlockBodiesResponse_Fin{}, - }, true -} - -func (b *blockBodyIterator) proof() (proto.Message, bool) { - // proof size is currently 142K - proof := make([]byte, 142*1024) //nolint:gomnd - _, err := rand.Read(proof) - if err != nil { - b.log.Errorw("Failed to generate rand proof", "err", err) - return b.fin() - } - - return &spec.BlockBodiesResponse{ - Id: b.blockID(), - BodyMessage: &spec.BlockBodiesResponse_Proof{ - Proof: &spec.BlockProof{ - Proof: proof, - }, - }, - }, true -} - -func (b *blockBodyIterator) blockID() *spec.BlockID { - return core2p2p.AdaptBlockID(b.header) -} diff --git a/p2p/starknet/client.go b/p2p/starknet/client.go index 6ddffe68d0..e273b84f7c 100644 --- a/p2p/starknet/client.go +++ b/p2p/starknet/client.go @@ -4,6 +4,7 @@ import ( "context" "errors" "io" + "time" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" @@ -14,7 +15,10 @@ import ( "google.golang.org/protobuf/proto" ) -const unmarshalMaxSize = 15 * utils.Megabyte +const ( + unmarshalMaxSize = 15 * utils.Megabyte + readTimeout = 5 * time.Second +) type NewStreamFunc func(ctx context.Context, pids ...protocol.ID) (network.Stream, error) @@ -59,9 +63,14 @@ func requestAndReceiveStream[ReqT proto.Message, ResT proto.Message](ctx context return nil, err } + err = stream.SetReadDeadline(time.Now().Add(readTimeout)) + if err != nil { + return nil, err + } + id := stream.ID() if err := sendAndCloseWrite(stream, req); err != nil { - log.Debugw("sendAndCloseWrite (stream is not closed)", "err", err, "streamID", id) + log.Errorw("sendAndCloseWrite (stream is not closed)", "err", err, "streamID", id) return nil, err } @@ -69,7 +78,7 @@ func requestAndReceiveStream[ReqT proto.Message, ResT proto.Message](ctx context defer func() { closeErr := stream.Close() if closeErr != nil { - log.Debugw("Error while closing stream", "err", closeErr) + log.Errorw("Error while closing stream", "err", closeErr) } }() @@ -91,34 +100,26 @@ func requestAndReceiveStream[ReqT proto.Message, ResT proto.Message](ctx context }, nil } -func (c *Client) RequestCurrentBlockHeader( - ctx context.Context, req *spec.CurrentBlockHeaderRequest, -) (iter.Seq[*spec.BlockHeadersResponse], error) { - return requestAndReceiveStream[*spec.CurrentBlockHeaderRequest, *spec.BlockHeadersResponse](ctx, c.newStream, - CurrentBlockHeaderPID(c.network), req, c.log) -} - func (c *Client) RequestBlockHeaders( ctx context.Context, req *spec.BlockHeadersRequest, ) (iter.Seq[*spec.BlockHeadersResponse], error) { return requestAndReceiveStream[*spec.BlockHeadersRequest, *spec.BlockHeadersResponse]( - ctx, c.newStream, BlockHeadersPID(c.network), req, c.log) + ctx, c.newStream, HeadersPID(), req, c.log) } -func (c *Client) RequestBlockBodies(ctx context.Context, req *spec.BlockBodiesRequest) (iter.Seq[*spec.BlockBodiesResponse], error) { - return requestAndReceiveStream[*spec.BlockBodiesRequest, *spec.BlockBodiesResponse]( - ctx, c.newStream, BlockBodiesPID(c.network), req, c.log) +func (c *Client) RequestEvents(ctx context.Context, req *spec.EventsRequest) (iter.Seq[*spec.EventsResponse], error) { + return requestAndReceiveStream[*spec.EventsRequest, *spec.EventsResponse](ctx, c.newStream, EventsPID(), req, c.log) } -func (c *Client) RequestEvents(ctx context.Context, req *spec.EventsRequest) (iter.Seq[*spec.EventsResponse], error) { - return requestAndReceiveStream[*spec.EventsRequest, *spec.EventsResponse](ctx, c.newStream, EventsPID(c.network), req, c.log) +func (c *Client) RequestClasses(ctx context.Context, req *spec.ClassesRequest) (iter.Seq[*spec.ClassesResponse], error) { + return requestAndReceiveStream[*spec.ClassesRequest, *spec.ClassesResponse](ctx, c.newStream, ClassesPID(), req, c.log) } -func (c *Client) RequestReceipts(ctx context.Context, req *spec.ReceiptsRequest) (iter.Seq[*spec.ReceiptsResponse], error) { - return requestAndReceiveStream[*spec.ReceiptsRequest, *spec.ReceiptsResponse](ctx, c.newStream, ReceiptsPID(c.network), req, c.log) +func (c *Client) RequestStateDiffs(ctx context.Context, req *spec.StateDiffsRequest) (iter.Seq[*spec.StateDiffsResponse], error) { + return requestAndReceiveStream[*spec.StateDiffsRequest, *spec.StateDiffsResponse](ctx, c.newStream, StateDiffPID(), req, c.log) } func (c *Client) RequestTransactions(ctx context.Context, req *spec.TransactionsRequest) (iter.Seq[*spec.TransactionsResponse], error) { return requestAndReceiveStream[*spec.TransactionsRequest, *spec.TransactionsResponse]( - ctx, c.newStream, TransactionsPID(c.network), req, c.log) + ctx, c.newStream, TransactionsPID(), req, c.log) } diff --git a/p2p/starknet/handlers.go b/p2p/starknet/handlers.go index 302831fb02..cf09e6ba86 100644 --- a/p2p/starknet/handlers.go +++ b/p2p/starknet/handlers.go @@ -11,6 +11,7 @@ import ( "github.com/NethermindEth/juno/adapters/p2p2core" "github.com/NethermindEth/juno/blockchain" "github.com/NethermindEth/juno/core" + "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/p2p/starknet/spec" "github.com/NethermindEth/juno/utils" "github.com/NethermindEth/juno/utils/iter" @@ -21,15 +22,21 @@ import ( type Handler struct { bcReader blockchain.Reader - ctx context.Context log utils.SimpleLogger + + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup } func NewHandler(bcReader blockchain.Reader, log utils.SimpleLogger) *Handler { + ctx, cancel := context.WithCancel(context.Background()) return &Handler{ bcReader: bcReader, log: log, - ctx: context.Background(), + ctx: ctx, + cancel: cancel, + wg: sync.WaitGroup{}, } } @@ -46,9 +53,12 @@ func getBuffer() *bytes.Buffer { return buffer } -func streamHandler[ReqT proto.Message](ctx context.Context, stream network.Stream, - reqHandler func(req ReqT) (iter.Seq[proto.Message], error), log utils.SimpleLogger, +func streamHandler[ReqT proto.Message](ctx context.Context, wg *sync.WaitGroup, + stream network.Stream, reqHandler func(req ReqT) (iter.Seq[proto.Message], error), log utils.SimpleLogger, ) { + wg.Add(1) + defer wg.Done() + defer func() { if err := stream.Close(); err != nil { log.Debugw("Error closing stream", "peer", stream.ID(), "protocol", stream.Protocol(), "err", err) @@ -95,55 +105,29 @@ func streamHandler[ReqT proto.Message](ctx context.Context, stream network.Strea }) } -func (h *Handler) BlockHeadersHandler(stream network.Stream) { - streamHandler[*spec.BlockHeadersRequest](h.ctx, stream, h.onBlockHeadersRequest, h.log) -} - -func (h *Handler) BlockBodiesHandler(stream network.Stream) { - streamHandler[*spec.BlockBodiesRequest](h.ctx, stream, h.onBlockBodiesRequest, h.log) +func (h *Handler) HeadersHandler(stream network.Stream) { + streamHandler[*spec.BlockHeadersRequest](h.ctx, &h.wg, stream, h.onHeadersRequest, h.log) } func (h *Handler) EventsHandler(stream network.Stream) { - streamHandler[*spec.EventsRequest](h.ctx, stream, h.onEventsRequest, h.log) -} - -func (h *Handler) ReceiptsHandler(stream network.Stream) { - streamHandler[*spec.ReceiptsRequest](h.ctx, stream, h.onReceiptsRequest, h.log) + streamHandler[*spec.EventsRequest](h.ctx, &h.wg, stream, h.onEventsRequest, h.log) } func (h *Handler) TransactionsHandler(stream network.Stream) { - streamHandler[*spec.TransactionsRequest](h.ctx, stream, h.onTransactionsRequest, h.log) + streamHandler[*spec.TransactionsRequest](h.ctx, &h.wg, stream, h.onTransactionsRequest, h.log) } -func (h *Handler) CurrentBlockHeaderHandler(stream network.Stream) { - streamHandler[*spec.CurrentBlockHeaderRequest](h.ctx, stream, h.onCurrentBlockHeaderRequest, h.log) +func (h *Handler) ClassesHandler(stream network.Stream) { + streamHandler[*spec.ClassesRequest](h.ctx, &h.wg, stream, h.onClassesRequest, h.log) } -func (h *Handler) onCurrentBlockHeaderRequest(*spec.CurrentBlockHeaderRequest) (iter.Seq[proto.Message], error) { - curHeight, err := h.bcReader.Height() - if err != nil { - return nil, err - } - - return h.onBlockHeadersRequest(&spec.BlockHeadersRequest{ - Iteration: &spec.Iteration{ - Start: &spec.Iteration_BlockNumber{ - BlockNumber: curHeight, - }, - Direction: spec.Iteration_Forward, - Limit: 1, - Step: 1, - }, - }) +func (h *Handler) StateDiffHandler(stream network.Stream) { + streamHandler[*spec.StateDiffsRequest](h.ctx, &h.wg, stream, h.onStateDiffRequest, h.log) } -func (h *Handler) onBlockHeadersRequest(req *spec.BlockHeadersRequest) (iter.Seq[proto.Message], error) { +func (h *Handler) onHeadersRequest(req *spec.BlockHeadersRequest) (iter.Seq[proto.Message], error) { finMsg := &spec.BlockHeadersResponse{ - Part: []*spec.BlockHeadersResponsePart{ - { - HeaderMessage: &spec.BlockHeadersResponsePart_Fin{}, - }, - }, + HeaderMessage: &spec.BlockHeadersResponse_Fin{}, } return h.processIterationRequest(req.Iteration, finMsg, func(it blockDataAccessor) (proto.Message, error) { @@ -159,137 +143,243 @@ func (h *Handler) onBlockHeadersRequest(req *spec.BlockHeadersRequest) (iter.Seq return nil, err } + stateUpdate, err := h.bcReader.StateUpdateByNumber(header.Number) + if err != nil { + return nil, err + } + return &spec.BlockHeadersResponse{ - Part: []*spec.BlockHeadersResponsePart{ - { - HeaderMessage: &spec.BlockHeadersResponsePart_Header{ - Header: core2p2p.AdaptHeader(header, commitments), - }, - }, - { - HeaderMessage: &spec.BlockHeadersResponsePart_Signatures{ - Signatures: &spec.Signatures{ - Block: core2p2p.AdaptBlockID(header), - Signatures: utils.Map(header.Signatures, core2p2p.AdaptSignature), - }, - }, - }, + HeaderMessage: &spec.BlockHeadersResponse_Header{ + Header: core2p2p.AdaptHeader(header, commitments, stateUpdate.StateDiff.Commitment(), + stateUpdate.StateDiff.Length()), }, }, nil }) } -func (h *Handler) onBlockBodiesRequest(req *spec.BlockBodiesRequest) (iter.Seq[proto.Message], error) { - it, err := h.newIterator(req.Iteration) - if err != nil { - return nil, err +func (h *Handler) onEventsRequest(req *spec.EventsRequest) (iter.Seq[proto.Message], error) { + finMsg := &spec.EventsResponse{ + EventMessage: &spec.EventsResponse_Fin{}, } + return h.processIterationRequestMulti(req.Iteration, finMsg, func(it blockDataAccessor) ([]proto.Message, error) { + block, err := it.Block() + if err != nil { + return nil, err + } - return func(yield func(proto.Message) bool) { - outerLoop: - for it.Valid() { - header, err := it.Header() - if err != nil { - h.log.Debugw("Failed to fetch header", "blockNumber", it.BlockNumber(), "err", err) - break - } - - h.log.Debugw("Creating Block Body Iterator", "blockNumber", header.Number) - bodyIterator, err := newBlockBodyIterator(h.bcReader, header, h.log) - if err != nil { - h.log.Debugw("Failed to create block body iterator", "blockNumber", it.BlockNumber(), "err", err) - break - } - - for bodyIterator.hasNext() { - msg, ok := bodyIterator.next() - if !ok { - break - } - - if !yield(msg) { - break outerLoop - } + responses := make([]proto.Message, 0, len(block.Receipts)) + for _, receipt := range block.Receipts { + for _, event := range receipt.Events { + responses = append(responses, &spec.EventsResponse{ + EventMessage: &spec.EventsResponse_Event{ + Event: core2p2p.AdaptEvent(event, receipt.TransactionHash), + }, + }) } - - it.Next() } - finMsg := &spec.BlockBodiesResponse{ - BodyMessage: &spec.BlockBodiesResponse_Fin{}, - } - yield(finMsg) - }, nil + return responses, nil + }) } -func (h *Handler) onEventsRequest(req *spec.EventsRequest) (iter.Seq[proto.Message], error) { - finMsg := &spec.EventsResponse{ - Responses: &spec.EventsResponse_Fin{}, +func (h *Handler) onTransactionsRequest(req *spec.TransactionsRequest) (iter.Seq[proto.Message], error) { + finMsg := &spec.TransactionsResponse{ + TransactionMessage: &spec.TransactionsResponse_Fin{}, } - return h.processIterationRequest(req.Iteration, finMsg, func(it blockDataAccessor) (proto.Message, error) { + return h.processIterationRequestMulti(req.Iteration, finMsg, func(it blockDataAccessor) ([]proto.Message, error) { block, err := it.Block() if err != nil { return nil, err } - events := make([]*spec.Event, 0, len(block.Receipts)) - for _, receipt := range block.Receipts { - for _, event := range receipt.Events { - events = append(events, core2p2p.AdaptEvent(event, receipt.TransactionHash)) + responses := make([]proto.Message, len(block.Transactions)) + for i, tx := range block.Transactions { + receipt := block.Receipts[i] + + responses[i] = &spec.TransactionsResponse{ + TransactionMessage: &spec.TransactionsResponse_TransactionWithReceipt{ + TransactionWithReceipt: &spec.TransactionWithReceipt{ + Transaction: core2p2p.AdaptTransaction(tx), + Receipt: core2p2p.AdaptReceipt(receipt, tx), + }, + }, } } - return &spec.EventsResponse{ - Id: core2p2p.AdaptBlockID(block.Header), - Responses: &spec.EventsResponse_Events{ - Events: &spec.Events{ - Items: events, - }, - }, - }, nil + return responses, nil }) } -func (h *Handler) onReceiptsRequest(req *spec.ReceiptsRequest) (iter.Seq[proto.Message], error) { - finMsg := &spec.ReceiptsResponse{Responses: &spec.ReceiptsResponse_Fin{}} - return h.processIterationRequest(req.Iteration, finMsg, func(it blockDataAccessor) (proto.Message, error) { +//nolint:gocyclo +func (h *Handler) onStateDiffRequest(req *spec.StateDiffsRequest) (iter.Seq[proto.Message], error) { + finMsg := &spec.StateDiffsResponse{ + StateDiffMessage: &spec.StateDiffsResponse_Fin{}, + } + return h.processIterationRequestMulti(req.Iteration, finMsg, func(it blockDataAccessor) ([]proto.Message, error) { block, err := it.Block() if err != nil { return nil, err } + blockNumber := block.Number - receipts := make([]*spec.Receipt, len(block.Receipts)) - for i := 0; i < len(block.Receipts); i++ { - receipts[i] = core2p2p.AdaptReceipt(block.Receipts[i], block.Transactions[i]) + stateUpdate, err := h.bcReader.StateUpdateByNumber(blockNumber) + if err != nil { + return nil, err } + diff := stateUpdate.StateDiff - return &spec.ReceiptsResponse{ - Id: core2p2p.AdaptBlockID(block.Header), - Responses: &spec.ReceiptsResponse_Receipts{ - Receipts: &spec.Receipts{Items: receipts}, - }, - }, nil + type contractDiff struct { + address *felt.Felt + storageDiffs map[felt.Felt]*felt.Felt + nonce *felt.Felt + classHash *felt.Felt // set only if contract deployed or replaced + } + modifiedContracts := make(map[felt.Felt]*contractDiff) + + initContractDiff := func(addr *felt.Felt) *contractDiff { + return &contractDiff{address: addr} + } + updateModifiedContracts := func(addr felt.Felt, f func(*contractDiff)) error { + cDiff, ok := modifiedContracts[addr] + if !ok { + cDiff = initContractDiff(&addr) + if err != nil { + return err + } + modifiedContracts[addr] = cDiff + } + + f(cDiff) + return nil + } + + for addr, n := range diff.Nonces { + err = updateModifiedContracts(addr, func(diff *contractDiff) { + diff.nonce = n + }) + if err != nil { + return nil, err + } + } + + for addr, sDiff := range diff.StorageDiffs { + err = updateModifiedContracts(addr, func(diff *contractDiff) { + diff.storageDiffs = sDiff + }) + if err != nil { + return nil, err + } + } + + for addr, classHash := range diff.DeployedContracts { + classHashCopy := classHash + err = updateModifiedContracts(addr, func(diff *contractDiff) { + diff.classHash = classHashCopy + }) + if err != nil { + return nil, err + } + } + + for addr, classHash := range diff.ReplacedClasses { + classHashCopy := classHash + err = updateModifiedContracts(addr, func(diff *contractDiff) { + diff.classHash = classHashCopy + }) + if err != nil { + return nil, err + } + } + + var responses []proto.Message + for _, c := range modifiedContracts { + responses = append(responses, &spec.StateDiffsResponse{ + StateDiffMessage: &spec.StateDiffsResponse_ContractDiff{ + ContractDiff: core2p2p.AdaptContractDiff(c.address, c.nonce, c.classHash, c.storageDiffs), + }, + }) + } + + for _, classHash := range diff.DeclaredV0Classes { + responses = append(responses, &spec.StateDiffsResponse{ + StateDiffMessage: &spec.StateDiffsResponse_DeclaredClass{ + DeclaredClass: &spec.DeclaredClass{ + ClassHash: core2p2p.AdaptHash(classHash), + CompiledClassHash: nil, // for cairo0 it's nil + }, + }, + }) + } + for classHash, compiledHash := range diff.DeclaredV1Classes { + responses = append(responses, &spec.StateDiffsResponse{ + StateDiffMessage: &spec.StateDiffsResponse_DeclaredClass{ + DeclaredClass: &spec.DeclaredClass{ + ClassHash: core2p2p.AdaptHash(&classHash), + CompiledClassHash: core2p2p.AdaptHash(compiledHash), + }, + }, + }) + } + + return responses, nil }) } -func (h *Handler) onTransactionsRequest(req *spec.TransactionsRequest) (iter.Seq[proto.Message], error) { - finMsg := &spec.TransactionsResponse{ - Responses: &spec.TransactionsResponse_Fin{}, +func (h *Handler) onClassesRequest(req *spec.ClassesRequest) (iter.Seq[proto.Message], error) { + finMsg := &spec.ClassesResponse{ + ClassMessage: &spec.ClassesResponse_Fin{}, } - return h.processIterationRequest(req.Iteration, finMsg, func(it blockDataAccessor) (proto.Message, error) { + return h.processIterationRequestMulti(req.Iteration, finMsg, func(it blockDataAccessor) ([]proto.Message, error) { block, err := it.Block() if err != nil { return nil, err } + blockNumber := block.Number + + stateUpdate, err := h.bcReader.StateUpdateByNumber(blockNumber) + if err != nil { + return nil, err + } - return &spec.TransactionsResponse{ - Id: core2p2p.AdaptBlockID(block.Header), - Responses: &spec.TransactionsResponse_Transactions{ - Transactions: &spec.Transactions{ - Items: utils.Map(block.Transactions, core2p2p.AdaptTransaction), + stateReader, closer, err := h.bcReader.StateAtBlockNumber(blockNumber) + if err != nil { + return nil, err + } + defer func() { + if closeErr := closer(); closeErr != nil { + h.log.Errorw("Failed to close state reader", "err", closeErr) + } + }() + + stateDiff := stateUpdate.StateDiff + + var responses []proto.Message + for _, hash := range stateDiff.DeclaredV0Classes { + cls, err := stateReader.Class(hash) + if err != nil { + return nil, err + } + + responses = append(responses, &spec.ClassesResponse{ + ClassMessage: &spec.ClassesResponse_Class{ + Class: core2p2p.AdaptClass(cls.Class), }, - }, - }, nil + }) + } + for classHash := range stateDiff.DeclaredV1Classes { + cls, err := stateReader.Class(&classHash) + if err != nil { + return nil, err + } + + responses = append(responses, &spec.ClassesResponse{ + ClassMessage: &spec.ClassesResponse_Class{ + Class: core2p2p.AdaptClass(cls.Class), + }, + }) + } + + return responses, nil }) } @@ -342,6 +432,45 @@ func (h *Handler) processIterationRequest(iteration *spec.Iteration, finMsg prot }, nil } +type iterationProcessorMulti = func(it blockDataAccessor) ([]proto.Message, error) + +func (h *Handler) processIterationRequestMulti(iteration *spec.Iteration, finMsg proto.Message, + getMsg iterationProcessorMulti, +) (iter.Seq[proto.Message], error) { + it, err := h.newIterator(iteration) + if err != nil { + return nil, err + } + + type yieldFunc = func(proto.Message) bool + return func(yield yieldFunc) { + // while iterator is valid + for it.Valid() { + // pass it to handler function (some might be interested in header, others in entire block) + messages, err := getMsg(it) + if err != nil { + h.log.Errorw("Failed to generate data", "blockNumber", it.BlockNumber(), "err", err) + break + } + + for _, msg := range messages { + // push generated msg to caller + if !yield(msg) { + // if caller is not interested in remaining data (example: connection to a peer is closed) exit + // note that in this case we won't send finMsg + return + } + } + + it.Next() + } + + // either we iterated over whole sequence or reached break statement in loop above + // note that return value of yield is not checked because this is the last message anyway + yield(finMsg) + }, nil +} + func (h *Handler) newIterator(it *spec.Iteration) (*iterator, error) { forward := it.Direction == spec.Iteration_Forward // todo restrict limit max value ? @@ -354,3 +483,11 @@ func (h *Handler) newIterator(it *spec.Iteration) (*iterator, error) { return nil, fmt.Errorf("unsupported iteration start type %T", v) } } + +func (h *Handler) Close() { + fmt.Println("Canceling") + h.cancel() + fmt.Println("Waiting") + h.wg.Wait() + fmt.Println("Done") +} diff --git a/p2p/starknet/ids.go b/p2p/starknet/ids.go index 93f0e24ca5..67b695c3dc 100644 --- a/p2p/starknet/ids.go +++ b/p2p/starknet/ids.go @@ -1,31 +1,31 @@ package starknet import ( - "github.com/NethermindEth/juno/utils" "github.com/libp2p/go-libp2p/core/protocol" ) -// Todo: consider merging this with BlockHeadersPID -func CurrentBlockHeaderPID(n *utils.Network) protocol.ID { - return n.ProtocolID() + "/current_header/0" +const Prefix = "/starknet" + +func KadPrefix() protocol.ID { + return Prefix + "/kad" } -func BlockHeadersPID(n *utils.Network) protocol.ID { - return n.ProtocolID() + "/block_headers/0" +func HeadersPID() protocol.ID { + return Prefix + "/headers/0.1.0-rc.0" } -func BlockBodiesPID(n *utils.Network) protocol.ID { - return n.ProtocolID() + "/block_bodies/0" +func EventsPID() protocol.ID { + return Prefix + "/events/0.1.0-rc.0" } -func EventsPID(n *utils.Network) protocol.ID { - return n.ProtocolID() + "/events/0" +func TransactionsPID() protocol.ID { + return Prefix + "/transactions/0.1.0-rc.0" } -func ReceiptsPID(n *utils.Network) protocol.ID { - return n.ProtocolID() + "/receipts/0" +func ClassesPID() protocol.ID { + return Prefix + "/classes/0.1.0-rc.0" } -func TransactionsPID(n *utils.Network) protocol.ID { - return n.ProtocolID() + "/transactions/0" +func StateDiffPID() protocol.ID { + return Prefix + "/state_diffs/0.1.0-rc.0" } diff --git a/p2p/starknet/p2p/proto/block.proto b/p2p/starknet/p2p/proto/block.proto deleted file mode 100644 index 46c19fb7ce..0000000000 --- a/p2p/starknet/p2p/proto/block.proto +++ /dev/null @@ -1,86 +0,0 @@ -syntax = "proto3"; -import "p2p/proto/common.proto"; -import "p2p/proto/state.proto"; -import "google/protobuf/timestamp.proto"; - -// for now, we assume a small consensus, so this fits in 1M. Else, these will be repeated -message Signatures { - BlockID block = 1; - - repeated ConsensusSignature signatures = 2; // - // can be more explicit here about the signature structure as this is not part of account abstraction -} - -// Note: commitments may change to be for the previous blocks like comet/tendermint -// hash of block header sent to L1 -message BlockHeader { - Hash parent_hash = 1; - uint64 number = 2; - google.protobuf.Timestamp time = 3; // TODO: see if this needs to be Felt252 or can be converted - Address sequencer_address = 4; - Merkle state_diffs = 5; // By order of (contract, key), taking last in case of duplicates. - // This means the proposer needs to sort after finishing the block (TBD: patricia? ) - // State is optional and appears every X blocks for the last block. This is to support - // snapshot sync and also so that light nodes can sync on state without state diffs. - Patricia state = 6; // hash of contract and class patricia tries. Same as in L1. Later more trees will be included - Hash proof_fact = 7; // for Kth block behind. A hash of the output of the proof - - // The following merkles can be built on the fly while sequencing/validating txs. - Merkle transactions = 8; // By order of execution. TBD: required? the client can execute (powerful machine) and match state diff - Merkle events = 9; // By order of issuance. TBD: in receipts? - Merkle receipts = 10; // By order of issuance. - string protocol_version = 11; // Starknet version - Felt252 gas_price = 12; -} - -message BlockProof { - bytes proof = 1; // proof size is currently 142K -} - -// sent to all peers (except the ones this was received from, if any). -// for a fraction of peers, also send the GetBlockHeaders and GetBlockBodies response (as if they asked for it for this block) -message NewBlock { - oneof maybe_full { - BlockID id = 1; - BlockHeadersResponse header = 2; - BlockBodiesResponse body = 3; - } -} - -// Requests a peer's CurrentBlockHeader -message CurrentBlockHeaderRequest {} - -// result is (BlockHeader, Signature?)* in order of creation (incr/dec) -message BlockHeadersRequest { - Iteration iteration = 1; -} - -message BlockHeadersResponsePart { - oneof header_message { - BlockHeader header = 1; - Signatures signatures = 2; - Fin fin = 3; // no support for interleaving for now - } -} - -message BlockHeadersResponse { - repeated BlockHeadersResponsePart part = 1; -} - -// result is (StateDiff*, Classes*, BlockProof?)* currently in creation order (incr/dec), but may change in the future -message BlockBodiesRequest { - Iteration iteration = 1; -} - -message BlockBodiesResponse { - optional BlockID id = 1; // may not appear if Fin is sent to end the whole response - - oneof body_message { - StateDiff diff = 2; - Classes classes = 3; - BlockProof proof = 4; - Fin fin = 5; - } -} - - diff --git a/p2p/starknet/p2p/proto/class.proto b/p2p/starknet/p2p/proto/class.proto new file mode 100644 index 0000000000..d3cb20d163 --- /dev/null +++ b/p2p/starknet/p2p/proto/class.proto @@ -0,0 +1,57 @@ +syntax = "proto3"; +import "p2p/proto/common.proto"; + +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; + + +message EntryPoint { + Felt252 selector = 1; + uint64 offset = 2; +} + +message Cairo0Class { + string abi = 1; + repeated EntryPoint externals = 2; + repeated EntryPoint l1_handlers = 3; + repeated EntryPoint constructors = 4; + // Compressed in base64 representation. + string program = 5; +} + +message SierraEntryPoint { + uint64 index = 1; + Felt252 selector = 2; +} + +message Cairo1EntryPoints { + repeated SierraEntryPoint externals = 1; + repeated SierraEntryPoint l1_handlers = 2; + repeated SierraEntryPoint constructors = 3; +} + +message Cairo1Class { + string abi = 1; + Cairo1EntryPoints entry_points = 2; + repeated Felt252 program = 3; + string contract_class_version = 4; +} + +message Class { + oneof class { + Cairo0Class cairo0 = 1; + Cairo1Class cairo1 = 2; + } + uint32 domain = 3; +} + +message ClassesRequest { + Iteration iteration = 1; +} + +// Responses are sent ordered by the order given in the request. +message ClassesResponse { + oneof class_message { + Class class = 1; + Fin fin = 2; // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its classes. + } +} \ No newline at end of file diff --git a/p2p/starknet/p2p/proto/common.proto b/p2p/starknet/p2p/proto/common.proto index 88b5744519..6e83439716 100644 --- a/p2p/starknet/p2p/proto/common.proto +++ b/p2p/starknet/p2p/proto/common.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; + message Felt252 { bytes elements = 1; } @@ -20,25 +22,40 @@ message PeerID { bytes id = 1; } +message Uint128 { + uint64 low = 1; + uint64 high = 2; +} + message ConsensusSignature { Felt252 r = 1; Felt252 s = 2; } -message Merkle { - uint32 n_leaves = 1; // needed to know the height, so as to how many nodes to expect in a proof. - // and also when receiving all leaves, how many to expect - Hash root = 2; +message Patricia { + uint64 n_leaves = 1; // needed to know the height, so as to how many nodes to expect in a proof. + // and also when receiving all leaves, how many to expect + Hash root = 2; } -message Patricia { - uint32 height = 1; - Hash root = 2; +message StateDiffCommitment { + uint64 state_diff_length = 1; + Hash root = 2; } message BlockID { uint64 number = 1; - Hash header = 2; + Hash header = 2; +} + +enum L1DataAvailabilityMode { + Calldata = 0; + Blob = 1; +} + +enum VolitionDomain { + L1 = 0; + L2 = 1; } message Iteration { @@ -48,27 +65,14 @@ message Iteration { } oneof start { uint64 block_number = 1; - Hash header = 2; + Hash header = 2; } Direction direction = 3; - uint64 limit = 4; - uint64 step = 5; // to allow interleaving from several nodes + uint64 limit = 4; + uint64 step = 5; // to allow interleaving from several nodes // bool interleave = 6; // return results in any order of blocks, per block the messages should still be in the order specified } // mark the end of a stream of messages // TBD: may not be required if we open a stream per request. -message Fin { - enum Error { - busy = 0; - too_much = 1; - unknown = 2; - pruned = 3; - } - optional Error error = 1; -} - - - - - +message Fin {} \ No newline at end of file diff --git a/p2p/starknet/p2p/proto/discovery.proto b/p2p/starknet/p2p/proto/discovery.proto deleted file mode 100644 index 50ef44887e..0000000000 --- a/p2p/starknet/p2p/proto/discovery.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -import "p2p/proto/common.proto"; - -// do we need this? capabilities are protocols (but need arguments, e.g. history length) -/* -message NewNode -{ - PeerID id = 1; - - repeated string capabilities = 2; -} - -message KnownNodes -{ - PeerID id = 1; //id of publishing node - repeated PeerID nodes = 2; //nodes known to the publishing node -} -*/ diff --git a/p2p/starknet/p2p/proto/event.proto b/p2p/starknet/p2p/proto/event.proto index 00cb57dea0..832008064a 100644 --- a/p2p/starknet/p2p/proto/event.proto +++ b/p2p/starknet/p2p/proto/event.proto @@ -1,27 +1,23 @@ syntax = "proto3"; import "p2p/proto/common.proto"; +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; + message Event { Hash transaction_hash = 1; - Felt252 from_address = 2; - repeated Felt252 keys = 3; - repeated Felt252 data = 4; + Felt252 from_address = 3; // looks like mistake? + repeated Felt252 keys = 4; + repeated Felt252 data = 5; } message EventsRequest { Iteration iteration = 1; } -message Events { - repeated Event items = 1; -} - -// can be several in a single reply +// Responses are sent ordered by the order given in the request. message EventsResponse { - optional BlockID id = 1; // may not appear if Fin is sent to end the whole response - - oneof responses { - Events events = 2; - Fin fin = 3; + oneof event_message { + Event event = 1; + Fin fin = 2; // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its events. } -} +} \ No newline at end of file diff --git a/p2p/starknet/p2p/proto/header.proto b/p2p/starknet/p2p/proto/header.proto new file mode 100644 index 0000000000..12d765ad9f --- /dev/null +++ b/p2p/starknet/p2p/proto/header.proto @@ -0,0 +1,56 @@ +syntax = "proto3"; +import "p2p/proto/common.proto"; + +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; + +// Note: commitments may change to be for the previous blocks like comet/tendermint +// hash of block header sent to L1 +message SignedBlockHeader { + Hash block_hash = 1; // For the structure of the block hash, see https://docs.starknet.io/documentation/architecture_and_concepts/Network_Architecture/header/#block_hash + Hash parent_hash = 2; + uint64 number = 3; // This can be deduced from context. We can consider removing this field. + uint64 time = 4; // Encoded in Unix time. + Address sequencer_address = 5; + Hash state_root = 6; // Patricia root of contract and class patricia tries. Each of those tries are of height 251. Same as in L1. Later more trees will be included + StateDiffCommitment state_diff_commitment = 7; // The state diff commitment returned by the Starknet Feeder Gateway + // For more info, see https://community.starknet.io/t/introducing-p2p-authentication-and-mismatch-resolution-in-v0-12-2/97993 + // The leaves contain a hash of the transaction hash and transaction signature. + Patricia transactions = 8; // By order of execution. TBD: required? the client can execute (powerful machine) and match state diff + Patricia events = 9; // By order of issuance. TBD: in receipts? + Hash receipts = 10; // By order of issuance. This is a patricia root. No need for length because it's the same length as transactions. + string protocol_version = 11; // Starknet version + Uint128 gas_price_fri = 12; + Uint128 gas_price_wei = 13; + Uint128 data_gas_price_fri = 14; + Uint128 data_gas_price_wei = 15; + L1DataAvailabilityMode l1_data_availability_mode = 16; + // for now, we assume a small consensus, so this fits in 1M. Else, these will be repeated and extracted from this message. + repeated ConsensusSignature signatures = 17; + // can be more explicit here about the signature structure as this is not part of account abstraction +} + +// sent to all peers (except the ones this was received from, if any). +// for a fraction of peers, also send the GetBlockHeaders response (as if they asked for it for this block) +message NewBlock { + oneof maybe_full { + BlockID id = 1; + BlockHeadersResponse header = 2; + } +} + + +message BlockHeadersRequest { + Iteration iteration = 1; +} + +// Responses are sent ordered by the order given in the request. +message BlockHeadersResponse { + oneof header_message { + SignedBlockHeader header = 1; + Fin fin = 2; // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its header. + } +} + +message BlockProof { + repeated bytes proof = 1; +} \ No newline at end of file diff --git a/p2p/starknet/p2p/proto/mempool.proto b/p2p/starknet/p2p/proto/mempool.proto deleted file mode 100644 index fc8b4dd4cb..0000000000 --- a/p2p/starknet/p2p/proto/mempool.proto +++ /dev/null @@ -1,30 +0,0 @@ -syntax = "proto3"; - -import "p2p/proto/common.proto"; -import "p2p/proto/transaction.proto"; - -// Support also non-validating node that wants to know of the mempool (e.g. to estimate fee in case of first price) -// Result is PooledTransactions+ -message PooledTransactionsRequest -{ - message Known { - oneof known { - Hashes txs = 1; // for mempool of 2000 txs, this will be 64K. Can use Hash32 instead (8K)... - uint64 marker = 2; // since last returned marker. - } - } - optional Known known = 1; -} - -// Can be also a push, similar to NewBlock. So a full node that accepts a new transaction from a wallet -// can propagate it without being pulled -// nodes should track state diffs to know when txs have been included (the contract nonce increases) -message PolledTransactionsResponse { - optional uint64 marker = 1; // optional, if the peer supports that. - bool baseline = 2; // means treat all data as baseline, not diff (may be if 'known' was sent but the mempool was reset/reorged - - oneof responses { - Transactions pending = 3; // if 'known' is given, they will be only txs added after the known - Fin fin = 4; - } -} diff --git a/p2p/starknet/p2p/proto/receipt.proto b/p2p/starknet/p2p/proto/receipt.proto index 74e36d876d..ffadabedc2 100644 --- a/p2p/starknet/p2p/proto/receipt.proto +++ b/p2p/starknet/p2p/proto/receipt.proto @@ -1,49 +1,49 @@ syntax = "proto3"; import "p2p/proto/common.proto"; +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; + message MessageToL1 { - Felt252 from_address = 1; - repeated Felt252 payload = 2; - EthereumAddress to_address = 3; + Felt252 from_address = 2; + repeated Felt252 payload = 3; + EthereumAddress to_address = 4; } -message EthereumAddress { - bytes elements = 1; +enum PriceUnit { + Wei = 0; + Fri = 1; } -message MessageToL2 { - EthereumAddress from_address = 1; - repeated Felt252 payload = 2; - Felt252 to_address = 3; - Felt252 entry_point_selector = 4; - Felt252 nonce = 5; +message EthereumAddress { + bytes elements = 1; } message Receipt { message ExecutionResources { message BuiltinCounter { - uint32 bitwise = 1; - uint32 ecdsa = 2; - uint32 ec_op = 3; - uint32 pedersen = 4; + uint32 bitwise = 1; + uint32 ecdsa = 2; + uint32 ec_op = 3; + uint32 pedersen = 4; uint32 range_check = 5; - uint32 poseidon = 6; - uint32 keccak = 7; - uint32 output = 8; + uint32 poseidon = 6; + uint32 keccak = 7; + uint32 output = 8; } - BuiltinCounter builtins = 1; - uint32 steps = 2; - uint32 memory_holes = 3; + BuiltinCounter builtins = 1; + uint32 steps = 2; + uint32 memory_holes = 3; + Felt252 l1_gas = 4; + Felt252 l1_data_gas = 5; } message Common { - Hash transaction_hash = 1; - Felt252 actual_fee = 2; - repeated MessageToL1 messages_sent = 3; - ExecutionResources execution_resources = 4; - string revert_reason = 5; - optional MessageToL2 consumed_message = 6; + Felt252 actual_fee = 2; + PriceUnit price_unit = 3; + repeated MessageToL1 messages_sent = 4; + ExecutionResources execution_resources = 5; + optional string revert_reason = 6; } @@ -52,8 +52,8 @@ message Receipt { } message L1Handler { - Common common = 1; - Hash msg_hash = 2; + Common common = 1; + Hash msg_hash = 2; } message Declare { @@ -66,32 +66,15 @@ message Receipt { } message DeployAccount { - Common common = 1; + Common common = 1; Felt252 contract_address = 2; } oneof type { - Invoke invoke = 1; - L1Handler l1_handler = 2; - Declare declare = 3; - Deploy deprecated_deploy = 4; - DeployAccount deploy_account = 5; - } -} - -message ReceiptsRequest { - Iteration iteration = 1; -} - -message Receipts { - repeated Receipt items = 2; -} - -message ReceiptsResponse { - optional BlockID id = 1; // may not appear if Fin is sent to end the whole response - - oneof responses { - Receipts receipts = 2; - Fin fin = 3; + Invoke invoke = 1; + L1Handler l1_handler = 2; + Declare declare = 3; + Deploy deprecated_deploy = 4; + DeployAccount deploy_account = 5; } -} +} \ No newline at end of file diff --git a/p2p/starknet/p2p/proto/snapshot.proto b/p2p/starknet/p2p/proto/snapshot.proto deleted file mode 100644 index 3f866747f9..0000000000 --- a/p2p/starknet/p2p/proto/snapshot.proto +++ /dev/null @@ -1,109 +0,0 @@ -syntax = "proto3"; - -import "p2p/proto/common.proto"; -import "p2p/proto/state.proto"; - -message PatriciaNode { - message Edge { - uint32 length = 1; - Felt252 path = 2; // as bits of left/right - Felt252 value = 3; - } - message Binary { - Felt252 left = 1; - Felt252 right = 2; - } - - oneof node { - Edge edge = 1; - Binary binary = 2; - } -} - -// non leaf nodes required to build the trie given the range (leaves) -message PatriciaRangeProof { - repeated PatriciaNode nodes = 1; -} - -// leafs of the contract state tree -message ContractState { - Address address = 1; // the key - Hash class = 2; - Hash storage = 3; // patricia - uint64 nonce = 4; -} - -// request a range from the contract state tree that matches the given root (block) -// starts at 'start' and ends no more than 'end'. -// the result is (ContractRange+, PatriciaRangeProof)* -message ContractRangeRequest { - uint32 domain = 1; // volition - Hash state_root = 2; - Address start = 3; - Address end = 4; - uint32 chunks_per_proof = 5; // how many ContractRange items to send before sending a proof -} - -// stream of leaves in the contracts tree -message ContractRange { - repeated ContractState state = 1; -} - -message ContractRangeResponse { - optional Hash root = 1; // may not appear if Fin is sent to end the whole response - optional Hash contracts_root = 2;// may not appear if Fin is sent to end the whole response - optional Hash classes_root = 3;// may not appear if Fin is sent to end the whole response - oneof responses { - ContractRange range = 4; - Fin fin = 5; - } -} - -// duplicate of GetContractRange. Can introduce a 'type' instead. -// result is (Classes+, PatriciaRangeProof)* -message ClassRangeRequest { - Hash root = 1; - Hash start = 2; - Hash end = 3; - uint32 chunks_per_proof = 4; -} - -message ClassRangeResponse { - optional Hash root = 1; // may not appear if Fin is sent to end the whole response - optional Hash contracts_root = 2;// may not appear if Fin is sent to end the whole response - optional Hash classes_root = 3;// may not appear if Fin is sent to end the whole response - oneof responses { - Classes classes = 4; - Fin fin = 5; - } -} - -// A position in some contract's state tree is identified by the state tree's root and the key in it -message StorageLeafQuery { - Hash contract_storage_root = 1; - Felt252 key = 2; -} - -message StorageRangeQuery { - StorageLeafQuery start = 1; - StorageLeafQuery end = 2; -} - -// result is (ContractStorageRange+, PatriciaRangeProof)* -message ContractStorageRequest { - uint32 domain = 1; // volition - Hash state_root = 2; - repeated StorageRangeQuery query = 3; -} - -message ContractStorage { - repeated ContractStoredValue keyValue = 2; -} - -message ContractStorageResponse { - optional Hash state_root = 1; // may not appear if Fin is sent to end the whole response - oneof responses { - ContractStorage storage = 2; - Fin fin = 3; - } -} diff --git a/p2p/starknet/p2p/proto/state.proto b/p2p/starknet/p2p/proto/state.proto index 9415db619e..79f33fcafe 100644 --- a/p2p/starknet/p2p/proto/state.proto +++ b/p2p/starknet/p2p/proto/state.proto @@ -1,6 +1,7 @@ syntax = "proto3"; import "p2p/proto/common.proto"; +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; // optimized for flat storage, not through a trie (not sharing key prefixes) message ContractStoredValue { @@ -8,71 +9,29 @@ message ContractStoredValue { Felt252 value = 2; } -message StateDiff -{ - // a bit more efficient than the state sync separation - message ContractDiff { - Address address = 1; - optional Felt252 nonce = 2; - optional Felt252 class_hash = 3; // can change for replace_class or new contract - repeated ContractStoredValue values = 4; - } - - message ContractAddrToClassHash { - Address contract_addr = 1; - Hash class_hash = 2; - } - - uint32 domain = 1; // volition state domain - repeated ContractDiff contract_diffs = 2; - repeated ContractAddrToClassHash replaced_classes = 3; - repeated ContractAddrToClassHash deployed_contracts = 4; -} - -message EntryPoint { - Felt252 selector = 1; - Felt252 offset = 2; +message ContractDiff { + Address address = 1; + optional Felt252 nonce = 2; // Present only if the nonce was updated + optional Hash class_hash = 3; // Present only if the contract was deployed or replaced in this block. + repeated ContractStoredValue values = 4; + VolitionDomain domain = 5; } -message Cairo0Class { - bytes abi = 1; - repeated EntryPoint externals = 2; - repeated EntryPoint l1_handlers = 3; - repeated EntryPoint constructors = 4; - bytes program = 5; +message DeclaredClass { + Hash class_hash = 1; + optional Hash compiled_class_hash = 2; // Present only if the class is Cairo1 } -message SierraEntryPoint { - uint64 index = 1; - Felt252 selector = 2; +message StateDiffsRequest { + Iteration iteration = 1; } -message Cairo1EntryPoints { - repeated SierraEntryPoint externals = 1; - repeated SierraEntryPoint l1_handlers = 2; - repeated SierraEntryPoint constructors = 3; -} - -message Cairo1Class { - bytes abi = 1; - Cairo1EntryPoints entry_points = 2; - repeated Felt252 program = 3; - string contract_class_version = 4; - bytes compiled = 5; -} - -// is it better to separate the definition from the hashes? (will need to repeate the hashes -// for the definitions stream) -// or, make the definitions optional? maybe it is enough to know only that a class exists, not its definition -// which may be fetched lazily later. -message Class { - oneof class { - Cairo0Class cairo0 = 1; - Cairo1Class cairo1 = 2; +// Responses are sent ordered by the order given in the request. +message StateDiffsResponse { + // All of the messages related to a block need to be sent before a message from the next block is sent. + oneof state_diff_message { + ContractDiff contract_diff = 1; // Multiple contract diffs for the same contract may appear continuously if the diff is too large or if it's more convenient. + DeclaredClass declared_class = 2; + Fin fin = 3; // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its state diff. } -} - -message Classes { - uint32 domain = 1; - repeated Class classes = 2; } \ No newline at end of file diff --git a/p2p/starknet/p2p/proto/transaction.proto b/p2p/starknet/p2p/proto/transaction.proto index 5877b12517..4736d78f6f 100644 --- a/p2p/starknet/p2p/proto/transaction.proto +++ b/p2p/starknet/p2p/proto/transaction.proto @@ -1,154 +1,168 @@ syntax = "proto3"; import "p2p/proto/common.proto"; +import "p2p/proto/receipt.proto"; + +option go_package = "github.com/NethermindEth/juno/p2p/starknet/spec"; message ResourceLimits { - Felt252 max_amount = 1; + Felt252 max_amount = 1; Felt252 max_price_per_unit = 2; } +message ResourceBounds { + ResourceLimits l1_gas = 1; + ResourceLimits l2_gas = 2; +} + message AccountSignature { repeated Felt252 parts = 1; } +// This is a transaction that is already accepted in a block. Once we have a mempool, we will define +// a separate message for BroadcastedTransaction. message Transaction { message DeclareV0 { - Address sender = 1; - Felt252 max_fee = 2; - AccountSignature signature = 3; - Hash class_hash = 4; + Address sender = 1; + Felt252 max_fee = 2; + AccountSignature signature = 3; + Hash class_hash = 4; } message DeclareV1 { - Address sender = 1; - Felt252 max_fee = 2; - AccountSignature signature = 3; - Hash class_hash = 4; - Felt252 nonce = 5; + Address sender = 1; + Felt252 max_fee = 2; + AccountSignature signature = 3; + Hash class_hash = 4; + Felt252 nonce = 5; } message DeclareV2 { - Address sender = 1; - Felt252 max_fee = 2; - AccountSignature signature = 3; - Hash class_hash = 4; - Felt252 nonce = 5; - Felt252 compiled_class_hash = 6; + Address sender = 1; + Felt252 max_fee = 2; + AccountSignature signature = 3; + Hash class_hash = 4; + Felt252 nonce = 5; + Hash compiled_class_hash = 6; } + // see https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3 message DeclareV3 { - Address sender = 1; - Felt252 max_fee = 2; - AccountSignature signature = 3; - Hash class_hash = 4; - Felt252 nonce = 5; - Felt252 compiled_class_hash = 6; - ResourceLimits l1_gas = 7; - ResourceLimits l2_gas = 8; - Felt252 tip = 9; - Address paymaster = 10; - string nonce_domain = 11; - string fee_domain = 12; + Address sender = 1; + AccountSignature signature = 2; + Hash class_hash = 3; + Felt252 nonce = 4; + Hash compiled_class_hash = 5; + ResourceBounds resource_bounds = 6; + uint64 tip = 7; + repeated Felt252 paymaster_data = 8; + repeated Felt252 account_deployment_data = 9; + VolitionDomain nonce_data_availability_mode = 10; + VolitionDomain fee_data_availability_mode = 11; } message Deploy { - Hash class_hash = 1; - Felt252 address_salt = 2; + Hash class_hash = 1; + Felt252 address_salt = 2; repeated Felt252 calldata = 3; + uint32 version = 4; } message DeployAccountV1 { - Felt252 max_fee = 1; - AccountSignature signature = 2; - Hash class_hash = 3; - Felt252 nonce = 4; - Felt252 address_salt = 5; - repeated Felt252 calldata = 6; + Felt252 max_fee = 1; + AccountSignature signature = 2; + Hash class_hash = 3; + Felt252 nonce = 4; + Felt252 address_salt = 5; + repeated Felt252 calldata = 6; } + // see https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0 message DeployAccountV3 { - Felt252 max_fee = 1; - AccountSignature signature = 2; - Hash class_hash = 3; - Felt252 nonce = 4; - Felt252 address_salt = 5; - repeated Felt252 calldata = 6; - ResourceLimits l1_gas = 7; - ResourceLimits l2_gas = 8; - Felt252 tip = 9; - Address paymaster = 10; - string nonce_domain = 11; - string fee_domain = 12; + AccountSignature signature = 1; + Hash class_hash = 2; + Felt252 nonce = 3; + Felt252 address_salt = 4; + repeated Felt252 calldata = 5; + ResourceBounds resource_bounds = 6; + uint64 tip = 7; + repeated Felt252 paymaster_data = 8; + VolitionDomain nonce_data_availability_mode = 9; + VolitionDomain fee_data_availability_mode = 10; } message InvokeV0 { - Felt252 max_fee = 1; - AccountSignature signature = 2; - Address address = 3; - Felt252 entry_point_selector = 4; - repeated Felt252 calldata = 5; + Felt252 max_fee = 1; + AccountSignature signature = 2; + Address address = 3; + Felt252 entry_point_selector = 4; + repeated Felt252 calldata = 5; } message InvokeV1 { - Address sender = 1; - Felt252 max_fee = 2; - AccountSignature signature = 3; - repeated Felt252 calldata = 4; - Felt252 nonce = 5; + Address sender = 1; + Felt252 max_fee = 2; + AccountSignature signature = 3; + repeated Felt252 calldata = 4; + Felt252 nonce = 5; } + // see https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c message InvokeV3 { - Address sender = 1; - Felt252 max_fee = 2; - AccountSignature signature = 3; - repeated Felt252 calldata = 4; - ResourceLimits l1_gas = 5; - ResourceLimits l2_gas = 6; - Felt252 tip = 7; - Address paymaster = 8; - string nonce_domain = 9; - string fee_domain = 10; - Felt252 nonce = 11; + Address sender = 1; + AccountSignature signature = 2; + repeated Felt252 calldata = 3; + ResourceBounds resource_bounds = 4; + uint64 tip = 5; + repeated Felt252 paymaster_data = 6; + repeated Felt252 account_deployment_data = 7; + VolitionDomain nonce_data_availability_mode = 8; + VolitionDomain fee_data_availability_mode = 9; + Felt252 nonce = 10; } - message L1HandlerV1 { - Felt252 nonce = 1; - Address address = 2; - Felt252 entry_point_selector = 3; - repeated Felt252 calldata = 4; + message L1HandlerV0 { + Felt252 nonce = 1; + Address address = 2; + Felt252 entry_point_selector = 3; + repeated Felt252 calldata = 4; } oneof txn { - DeclareV0 declare_v0 = 1; - DeclareV1 declare_v1 = 2; - DeclareV2 declare_v2 = 3; - DeclareV3 declare_v3 = 4; - Deploy deploy = 5; + DeclareV0 declare_v0 = 1; + DeclareV1 declare_v1 = 2; + DeclareV2 declare_v2 = 3; + DeclareV3 declare_v3 = 4; + Deploy deploy = 5; DeployAccountV1 deploy_account_v1 = 6; DeployAccountV3 deploy_account_v3 = 7; - InvokeV0 invoke_v0 = 8; - InvokeV1 invoke_v1 = 9; - InvokeV3 invoke_v3 = 10; - L1HandlerV1 l1_handler = 11; + InvokeV0 invoke_v0 = 8; + InvokeV1 invoke_v1 = 9; + InvokeV3 invoke_v3 = 10; + L1HandlerV0 l1_handler = 11; } } +message TransactionWithReceipt { + Transaction transaction = 1; + Receipt receipt = 2; +} + // TBD: can support a flag to return tx hashes only, good for standalone mempool to remove them, // or any node that keeps track of transaction streaming in the consensus. message TransactionsRequest { Iteration iteration = 1; } -// can be several in a single reply -message Transactions { - repeated Transaction items = 1; -} - +// Responses are sent ordered by the order given in the request. The order inside each block is +// according to the execution order. message TransactionsResponse { - optional BlockID id = 1; // may not appear if Fin is sent to end the whole response - - oneof responses { - Transactions transactions = 2; - Fin fin = 3; + oneof transaction_message { + TransactionWithReceipt transaction_with_receipt = 1; + Fin fin = 2; // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its transactions. } +} + +message Transactions { + repeated Transaction transactions = 1; } \ No newline at end of file diff --git a/p2p/starknet/spec/block.pb.go b/p2p/starknet/spec/block.pb.go deleted file mode 100644 index 055ab743ea..0000000000 --- a/p2p/starknet/spec/block.pb.go +++ /dev/null @@ -1,1096 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 -// source: p2p/proto/block.proto - -package spec - -import ( - reflect "reflect" - sync "sync" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// for now, we assume a small consensus, so this fits in 1M. Else, these will be repeated -type Signatures struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Block *BlockID `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` - Signatures []*ConsensusSignature `protobuf:"bytes,2,rep,name=signatures,proto3" json:"signatures,omitempty"` // -} - -func (x *Signatures) Reset() { - *x = Signatures{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Signatures) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Signatures) ProtoMessage() {} - -func (x *Signatures) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Signatures.ProtoReflect.Descriptor instead. -func (*Signatures) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{0} -} - -func (x *Signatures) GetBlock() *BlockID { - if x != nil { - return x.Block - } - return nil -} - -func (x *Signatures) GetSignatures() []*ConsensusSignature { - if x != nil { - return x.Signatures - } - return nil -} - -// Note: commitments may change to be for the previous blocks like comet/tendermint -// hash of block header sent to L1 -type BlockHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ParentHash *Hash `protobuf:"bytes,1,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"` - Number uint64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` - Time *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"` // TODO: see if this needs to be Felt252 or can be converted - SequencerAddress *Address `protobuf:"bytes,4,opt,name=sequencer_address,json=sequencerAddress,proto3" json:"sequencer_address,omitempty"` - StateDiffs *Merkle `protobuf:"bytes,5,opt,name=state_diffs,json=stateDiffs,proto3" json:"state_diffs,omitempty"` // By order of (contract, key), taking last in case of duplicates. - // This means the proposer needs to sort after finishing the block (TBD: patricia? ) - // State is optional and appears every X blocks for the last block. This is to support - // snapshot sync and also so that light nodes can sync on state without state diffs. - State *Patricia `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"` // hash of contract and class patricia tries. Same as in L1. Later more trees will be included - ProofFact *Hash `protobuf:"bytes,7,opt,name=proof_fact,json=proofFact,proto3" json:"proof_fact,omitempty"` // for Kth block behind. A hash of the output of the proof - // The following merkles can be built on the fly while sequencing/validating txs. - Transactions *Merkle `protobuf:"bytes,8,opt,name=transactions,proto3" json:"transactions,omitempty"` // By order of execution. TBD: required? the client can execute (powerful machine) and match state diff - Events *Merkle `protobuf:"bytes,9,opt,name=events,proto3" json:"events,omitempty"` // By order of issuance. TBD: in receipts? - Receipts *Merkle `protobuf:"bytes,10,opt,name=receipts,proto3" json:"receipts,omitempty"` // By order of issuance. - ProtocolVersion string `protobuf:"bytes,11,opt,name=protocol_version,json=protocolVersion,proto3" json:"protocol_version,omitempty"` // Starknet version - GasPrice *Felt252 `protobuf:"bytes,12,opt,name=gas_price,json=gasPrice,proto3" json:"gas_price,omitempty"` -} - -func (x *BlockHeader) Reset() { - *x = BlockHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockHeader) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockHeader) ProtoMessage() {} - -func (x *BlockHeader) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockHeader.ProtoReflect.Descriptor instead. -func (*BlockHeader) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{1} -} - -func (x *BlockHeader) GetParentHash() *Hash { - if x != nil { - return x.ParentHash - } - return nil -} - -func (x *BlockHeader) GetNumber() uint64 { - if x != nil { - return x.Number - } - return 0 -} - -func (x *BlockHeader) GetTime() *timestamppb.Timestamp { - if x != nil { - return x.Time - } - return nil -} - -func (x *BlockHeader) GetSequencerAddress() *Address { - if x != nil { - return x.SequencerAddress - } - return nil -} - -func (x *BlockHeader) GetStateDiffs() *Merkle { - if x != nil { - return x.StateDiffs - } - return nil -} - -func (x *BlockHeader) GetState() *Patricia { - if x != nil { - return x.State - } - return nil -} - -func (x *BlockHeader) GetProofFact() *Hash { - if x != nil { - return x.ProofFact - } - return nil -} - -func (x *BlockHeader) GetTransactions() *Merkle { - if x != nil { - return x.Transactions - } - return nil -} - -func (x *BlockHeader) GetEvents() *Merkle { - if x != nil { - return x.Events - } - return nil -} - -func (x *BlockHeader) GetReceipts() *Merkle { - if x != nil { - return x.Receipts - } - return nil -} - -func (x *BlockHeader) GetProtocolVersion() string { - if x != nil { - return x.ProtocolVersion - } - return "" -} - -func (x *BlockHeader) GetGasPrice() *Felt252 { - if x != nil { - return x.GasPrice - } - return nil -} - -type BlockProof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Proof []byte `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` // proof size is currently 142K -} - -func (x *BlockProof) Reset() { - *x = BlockProof{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockProof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockProof) ProtoMessage() {} - -func (x *BlockProof) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockProof.ProtoReflect.Descriptor instead. -func (*BlockProof) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{2} -} - -func (x *BlockProof) GetProof() []byte { - if x != nil { - return x.Proof - } - return nil -} - -// sent to all peers (except the ones this was received from, if any). -// for a fraction of peers, also send the GetBlockHeaders and GetBlockBodies response (as if they asked for it for this block) -type NewBlock struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to MaybeFull: - // - // *NewBlock_Id - // *NewBlock_Header - // *NewBlock_Body - MaybeFull isNewBlock_MaybeFull `protobuf_oneof:"maybe_full"` -} - -func (x *NewBlock) Reset() { - *x = NewBlock{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NewBlock) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NewBlock) ProtoMessage() {} - -func (x *NewBlock) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NewBlock.ProtoReflect.Descriptor instead. -func (*NewBlock) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{3} -} - -func (m *NewBlock) GetMaybeFull() isNewBlock_MaybeFull { - if m != nil { - return m.MaybeFull - } - return nil -} - -func (x *NewBlock) GetId() *BlockID { - if x, ok := x.GetMaybeFull().(*NewBlock_Id); ok { - return x.Id - } - return nil -} - -func (x *NewBlock) GetHeader() *BlockHeadersResponse { - if x, ok := x.GetMaybeFull().(*NewBlock_Header); ok { - return x.Header - } - return nil -} - -func (x *NewBlock) GetBody() *BlockBodiesResponse { - if x, ok := x.GetMaybeFull().(*NewBlock_Body); ok { - return x.Body - } - return nil -} - -type isNewBlock_MaybeFull interface { - isNewBlock_MaybeFull() -} - -type NewBlock_Id struct { - Id *BlockID `protobuf:"bytes,1,opt,name=id,proto3,oneof"` -} - -type NewBlock_Header struct { - Header *BlockHeadersResponse `protobuf:"bytes,2,opt,name=header,proto3,oneof"` -} - -type NewBlock_Body struct { - Body *BlockBodiesResponse `protobuf:"bytes,3,opt,name=body,proto3,oneof"` -} - -func (*NewBlock_Id) isNewBlock_MaybeFull() {} - -func (*NewBlock_Header) isNewBlock_MaybeFull() {} - -func (*NewBlock_Body) isNewBlock_MaybeFull() {} - -// Requests a peer's CurrentBlockHeader -type CurrentBlockHeaderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *CurrentBlockHeaderRequest) Reset() { - *x = CurrentBlockHeaderRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CurrentBlockHeaderRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CurrentBlockHeaderRequest) ProtoMessage() {} - -func (x *CurrentBlockHeaderRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CurrentBlockHeaderRequest.ProtoReflect.Descriptor instead. -func (*CurrentBlockHeaderRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{4} -} - -// result is (BlockHeader, Signature?)* in order of creation (incr/dec) -type BlockHeadersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` -} - -func (x *BlockHeadersRequest) Reset() { - *x = BlockHeadersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockHeadersRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockHeadersRequest) ProtoMessage() {} - -func (x *BlockHeadersRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockHeadersRequest.ProtoReflect.Descriptor instead. -func (*BlockHeadersRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{5} -} - -func (x *BlockHeadersRequest) GetIteration() *Iteration { - if x != nil { - return x.Iteration - } - return nil -} - -type BlockHeadersResponsePart struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to HeaderMessage: - // - // *BlockHeadersResponsePart_Header - // *BlockHeadersResponsePart_Signatures - // *BlockHeadersResponsePart_Fin - HeaderMessage isBlockHeadersResponsePart_HeaderMessage `protobuf_oneof:"header_message"` -} - -func (x *BlockHeadersResponsePart) Reset() { - *x = BlockHeadersResponsePart{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockHeadersResponsePart) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockHeadersResponsePart) ProtoMessage() {} - -func (x *BlockHeadersResponsePart) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockHeadersResponsePart.ProtoReflect.Descriptor instead. -func (*BlockHeadersResponsePart) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{6} -} - -func (m *BlockHeadersResponsePart) GetHeaderMessage() isBlockHeadersResponsePart_HeaderMessage { - if m != nil { - return m.HeaderMessage - } - return nil -} - -func (x *BlockHeadersResponsePart) GetHeader() *BlockHeader { - if x, ok := x.GetHeaderMessage().(*BlockHeadersResponsePart_Header); ok { - return x.Header - } - return nil -} - -func (x *BlockHeadersResponsePart) GetSignatures() *Signatures { - if x, ok := x.GetHeaderMessage().(*BlockHeadersResponsePart_Signatures); ok { - return x.Signatures - } - return nil -} - -func (x *BlockHeadersResponsePart) GetFin() *Fin { - if x, ok := x.GetHeaderMessage().(*BlockHeadersResponsePart_Fin); ok { - return x.Fin - } - return nil -} - -type isBlockHeadersResponsePart_HeaderMessage interface { - isBlockHeadersResponsePart_HeaderMessage() -} - -type BlockHeadersResponsePart_Header struct { - Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3,oneof"` -} - -type BlockHeadersResponsePart_Signatures struct { - Signatures *Signatures `protobuf:"bytes,2,opt,name=signatures,proto3,oneof"` -} - -type BlockHeadersResponsePart_Fin struct { - Fin *Fin `protobuf:"bytes,3,opt,name=fin,proto3,oneof"` // no support for interleaving for now -} - -func (*BlockHeadersResponsePart_Header) isBlockHeadersResponsePart_HeaderMessage() {} - -func (*BlockHeadersResponsePart_Signatures) isBlockHeadersResponsePart_HeaderMessage() {} - -func (*BlockHeadersResponsePart_Fin) isBlockHeadersResponsePart_HeaderMessage() {} - -type BlockHeadersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Part []*BlockHeadersResponsePart `protobuf:"bytes,1,rep,name=part,proto3" json:"part,omitempty"` -} - -func (x *BlockHeadersResponse) Reset() { - *x = BlockHeadersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockHeadersResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockHeadersResponse) ProtoMessage() {} - -func (x *BlockHeadersResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockHeadersResponse.ProtoReflect.Descriptor instead. -func (*BlockHeadersResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{7} -} - -func (x *BlockHeadersResponse) GetPart() []*BlockHeadersResponsePart { - if x != nil { - return x.Part - } - return nil -} - -// result is (StateDiff*, Classes*, BlockProof?)* currently in creation order (incr/dec), but may change in the future -type BlockBodiesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` -} - -func (x *BlockBodiesRequest) Reset() { - *x = BlockBodiesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockBodiesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockBodiesRequest) ProtoMessage() {} - -func (x *BlockBodiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockBodiesRequest.ProtoReflect.Descriptor instead. -func (*BlockBodiesRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{8} -} - -func (x *BlockBodiesRequest) GetIteration() *Iteration { - if x != nil { - return x.Iteration - } - return nil -} - -type BlockBodiesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id *BlockID `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to BodyMessage: - // - // *BlockBodiesResponse_Diff - // *BlockBodiesResponse_Classes - // *BlockBodiesResponse_Proof - // *BlockBodiesResponse_Fin - BodyMessage isBlockBodiesResponse_BodyMessage `protobuf_oneof:"body_message"` -} - -func (x *BlockBodiesResponse) Reset() { - *x = BlockBodiesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_block_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BlockBodiesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BlockBodiesResponse) ProtoMessage() {} - -func (x *BlockBodiesResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_block_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BlockBodiesResponse.ProtoReflect.Descriptor instead. -func (*BlockBodiesResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_block_proto_rawDescGZIP(), []int{9} -} - -func (x *BlockBodiesResponse) GetId() *BlockID { - if x != nil { - return x.Id - } - return nil -} - -func (m *BlockBodiesResponse) GetBodyMessage() isBlockBodiesResponse_BodyMessage { - if m != nil { - return m.BodyMessage - } - return nil -} - -func (x *BlockBodiesResponse) GetDiff() *StateDiff { - if x, ok := x.GetBodyMessage().(*BlockBodiesResponse_Diff); ok { - return x.Diff - } - return nil -} - -func (x *BlockBodiesResponse) GetClasses() *Classes { - if x, ok := x.GetBodyMessage().(*BlockBodiesResponse_Classes); ok { - return x.Classes - } - return nil -} - -func (x *BlockBodiesResponse) GetProof() *BlockProof { - if x, ok := x.GetBodyMessage().(*BlockBodiesResponse_Proof); ok { - return x.Proof - } - return nil -} - -func (x *BlockBodiesResponse) GetFin() *Fin { - if x, ok := x.GetBodyMessage().(*BlockBodiesResponse_Fin); ok { - return x.Fin - } - return nil -} - -type isBlockBodiesResponse_BodyMessage interface { - isBlockBodiesResponse_BodyMessage() -} - -type BlockBodiesResponse_Diff struct { - Diff *StateDiff `protobuf:"bytes,2,opt,name=diff,proto3,oneof"` -} - -type BlockBodiesResponse_Classes struct { - Classes *Classes `protobuf:"bytes,3,opt,name=classes,proto3,oneof"` -} - -type BlockBodiesResponse_Proof struct { - Proof *BlockProof `protobuf:"bytes,4,opt,name=proof,proto3,oneof"` -} - -type BlockBodiesResponse_Fin struct { - Fin *Fin `protobuf:"bytes,5,opt,name=fin,proto3,oneof"` -} - -func (*BlockBodiesResponse_Diff) isBlockBodiesResponse_BodyMessage() {} - -func (*BlockBodiesResponse_Classes) isBlockBodiesResponse_BodyMessage() {} - -func (*BlockBodiesResponse_Proof) isBlockBodiesResponse_BodyMessage() {} - -func (*BlockBodiesResponse_Fin) isBlockBodiesResponse_BodyMessage() {} - -var File_p2p_proto_block_proto protoreflect.FileDescriptor - -var file_p2p_proto_block_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x15, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x61, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x52, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x33, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x43, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xea, 0x03, 0x0a, 0x0b, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0b, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x11, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x10, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, - 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, 0x73, 0x12, 0x1f, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x50, 0x61, 0x74, - 0x72, 0x69, 0x63, 0x69, 0x61, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x61, - 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, - 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x1f, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x07, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x23, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x08, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x25, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x67, - 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x22, 0x0a, 0x0a, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x91, 0x01, 0x0a, 0x08, - 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x48, 0x00, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x06, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x22, - 0x1b, 0x0a, 0x19, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x13, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9d, 0x01, - 0x0a, 0x18, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x61, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, - 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x45, 0x0a, - 0x14, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x70, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, - 0x70, 0x61, 0x72, 0x74, 0x22, 0x3e, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, 0x64, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x6f, - 0x64, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x49, 0x44, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x04, 0x64, - 0x69, 0x66, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x44, 0x69, 0x66, 0x66, 0x48, 0x00, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x12, 0x24, 0x0a, - 0x07, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x48, - 0x00, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, - 0x69, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, -} - -var ( - file_p2p_proto_block_proto_rawDescOnce sync.Once - file_p2p_proto_block_proto_rawDescData = file_p2p_proto_block_proto_rawDesc -) - -func file_p2p_proto_block_proto_rawDescGZIP() []byte { - file_p2p_proto_block_proto_rawDescOnce.Do(func() { - file_p2p_proto_block_proto_rawDescData = protoimpl.X.CompressGZIP(file_p2p_proto_block_proto_rawDescData) - }) - return file_p2p_proto_block_proto_rawDescData -} - -var ( - file_p2p_proto_block_proto_msgTypes = make([]protoimpl.MessageInfo, 10) - file_p2p_proto_block_proto_goTypes = []interface{}{ - (*Signatures)(nil), // 0: Signatures - (*BlockHeader)(nil), // 1: BlockHeader - (*BlockProof)(nil), // 2: BlockProof - (*NewBlock)(nil), // 3: NewBlock - (*CurrentBlockHeaderRequest)(nil), // 4: CurrentBlockHeaderRequest - (*BlockHeadersRequest)(nil), // 5: BlockHeadersRequest - (*BlockHeadersResponsePart)(nil), // 6: BlockHeadersResponsePart - (*BlockHeadersResponse)(nil), // 7: BlockHeadersResponse - (*BlockBodiesRequest)(nil), // 8: BlockBodiesRequest - (*BlockBodiesResponse)(nil), // 9: BlockBodiesResponse - (*BlockID)(nil), // 10: BlockID - (*ConsensusSignature)(nil), // 11: ConsensusSignature - (*Hash)(nil), // 12: Hash - (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp - (*Address)(nil), // 14: Address - (*Merkle)(nil), // 15: Merkle - (*Patricia)(nil), // 16: Patricia - (*Felt252)(nil), // 17: Felt252 - (*Iteration)(nil), // 18: Iteration - (*Fin)(nil), // 19: Fin - (*StateDiff)(nil), // 20: StateDiff - (*Classes)(nil), // 21: Classes - } -) - -var file_p2p_proto_block_proto_depIdxs = []int32{ - 10, // 0: Signatures.block:type_name -> BlockID - 11, // 1: Signatures.signatures:type_name -> ConsensusSignature - 12, // 2: BlockHeader.parent_hash:type_name -> Hash - 13, // 3: BlockHeader.time:type_name -> google.protobuf.Timestamp - 14, // 4: BlockHeader.sequencer_address:type_name -> Address - 15, // 5: BlockHeader.state_diffs:type_name -> Merkle - 16, // 6: BlockHeader.state:type_name -> Patricia - 12, // 7: BlockHeader.proof_fact:type_name -> Hash - 15, // 8: BlockHeader.transactions:type_name -> Merkle - 15, // 9: BlockHeader.events:type_name -> Merkle - 15, // 10: BlockHeader.receipts:type_name -> Merkle - 17, // 11: BlockHeader.gas_price:type_name -> Felt252 - 10, // 12: NewBlock.id:type_name -> BlockID - 7, // 13: NewBlock.header:type_name -> BlockHeadersResponse - 9, // 14: NewBlock.body:type_name -> BlockBodiesResponse - 18, // 15: BlockHeadersRequest.iteration:type_name -> Iteration - 1, // 16: BlockHeadersResponsePart.header:type_name -> BlockHeader - 0, // 17: BlockHeadersResponsePart.signatures:type_name -> Signatures - 19, // 18: BlockHeadersResponsePart.fin:type_name -> Fin - 6, // 19: BlockHeadersResponse.part:type_name -> BlockHeadersResponsePart - 18, // 20: BlockBodiesRequest.iteration:type_name -> Iteration - 10, // 21: BlockBodiesResponse.id:type_name -> BlockID - 20, // 22: BlockBodiesResponse.diff:type_name -> StateDiff - 21, // 23: BlockBodiesResponse.classes:type_name -> Classes - 2, // 24: BlockBodiesResponse.proof:type_name -> BlockProof - 19, // 25: BlockBodiesResponse.fin:type_name -> Fin - 26, // [26:26] is the sub-list for method output_type - 26, // [26:26] is the sub-list for method input_type - 26, // [26:26] is the sub-list for extension type_name - 26, // [26:26] is the sub-list for extension extendee - 0, // [0:26] is the sub-list for field type_name -} - -func init() { file_p2p_proto_block_proto_init() } -func file_p2p_proto_block_proto_init() { - if File_p2p_proto_block_proto != nil { - return - } - file_p2p_proto_common_proto_init() - file_p2p_proto_state_proto_init() - if !protoimpl.UnsafeEnabled { - file_p2p_proto_block_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Signatures); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockProof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewBlock); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CurrentBlockHeaderRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockHeadersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockHeadersResponsePart); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockHeadersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockBodiesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_block_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockBodiesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_p2p_proto_block_proto_msgTypes[3].OneofWrappers = []interface{}{ - (*NewBlock_Id)(nil), - (*NewBlock_Header)(nil), - (*NewBlock_Body)(nil), - } - file_p2p_proto_block_proto_msgTypes[6].OneofWrappers = []interface{}{ - (*BlockHeadersResponsePart_Header)(nil), - (*BlockHeadersResponsePart_Signatures)(nil), - (*BlockHeadersResponsePart_Fin)(nil), - } - file_p2p_proto_block_proto_msgTypes[9].OneofWrappers = []interface{}{ - (*BlockBodiesResponse_Diff)(nil), - (*BlockBodiesResponse_Classes)(nil), - (*BlockBodiesResponse_Proof)(nil), - (*BlockBodiesResponse_Fin)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_p2p_proto_block_proto_rawDesc, - NumEnums: 0, - NumMessages: 10, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_p2p_proto_block_proto_goTypes, - DependencyIndexes: file_p2p_proto_block_proto_depIdxs, - MessageInfos: file_p2p_proto_block_proto_msgTypes, - }.Build() - File_p2p_proto_block_proto = out.File - file_p2p_proto_block_proto_rawDesc = nil - file_p2p_proto_block_proto_goTypes = nil - file_p2p_proto_block_proto_depIdxs = nil -} diff --git a/p2p/starknet/spec/class.pb.go b/p2p/starknet/spec/class.pb.go new file mode 100644 index 0000000000..a9aaf29c00 --- /dev/null +++ b/p2p/starknet/spec/class.pb.go @@ -0,0 +1,821 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v4.25.1 +// source: p2p/proto/class.proto + +package spec + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type EntryPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Selector *Felt252 `protobuf:"bytes,1,opt,name=selector,proto3" json:"selector,omitempty"` + Offset uint64 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *EntryPoint) Reset() { + *x = EntryPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EntryPoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntryPoint) ProtoMessage() {} + +func (x *EntryPoint) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntryPoint.ProtoReflect.Descriptor instead. +func (*EntryPoint) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{0} +} + +func (x *EntryPoint) GetSelector() *Felt252 { + if x != nil { + return x.Selector + } + return nil +} + +func (x *EntryPoint) GetOffset() uint64 { + if x != nil { + return x.Offset + } + return 0 +} + +type Cairo0Class struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Abi string `protobuf:"bytes,1,opt,name=abi,proto3" json:"abi,omitempty"` + Externals []*EntryPoint `protobuf:"bytes,2,rep,name=externals,proto3" json:"externals,omitempty"` + L1Handlers []*EntryPoint `protobuf:"bytes,3,rep,name=l1_handlers,json=l1Handlers,proto3" json:"l1_handlers,omitempty"` + Constructors []*EntryPoint `protobuf:"bytes,4,rep,name=constructors,proto3" json:"constructors,omitempty"` + // Compressed in base64 representation. + Program string `protobuf:"bytes,5,opt,name=program,proto3" json:"program,omitempty"` +} + +func (x *Cairo0Class) Reset() { + *x = Cairo0Class{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Cairo0Class) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Cairo0Class) ProtoMessage() {} + +func (x *Cairo0Class) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Cairo0Class.ProtoReflect.Descriptor instead. +func (*Cairo0Class) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{1} +} + +func (x *Cairo0Class) GetAbi() string { + if x != nil { + return x.Abi + } + return "" +} + +func (x *Cairo0Class) GetExternals() []*EntryPoint { + if x != nil { + return x.Externals + } + return nil +} + +func (x *Cairo0Class) GetL1Handlers() []*EntryPoint { + if x != nil { + return x.L1Handlers + } + return nil +} + +func (x *Cairo0Class) GetConstructors() []*EntryPoint { + if x != nil { + return x.Constructors + } + return nil +} + +func (x *Cairo0Class) GetProgram() string { + if x != nil { + return x.Program + } + return "" +} + +type SierraEntryPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index uint64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Selector *Felt252 `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` +} + +func (x *SierraEntryPoint) Reset() { + *x = SierraEntryPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SierraEntryPoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SierraEntryPoint) ProtoMessage() {} + +func (x *SierraEntryPoint) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SierraEntryPoint.ProtoReflect.Descriptor instead. +func (*SierraEntryPoint) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{2} +} + +func (x *SierraEntryPoint) GetIndex() uint64 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *SierraEntryPoint) GetSelector() *Felt252 { + if x != nil { + return x.Selector + } + return nil +} + +type Cairo1EntryPoints struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Externals []*SierraEntryPoint `protobuf:"bytes,1,rep,name=externals,proto3" json:"externals,omitempty"` + L1Handlers []*SierraEntryPoint `protobuf:"bytes,2,rep,name=l1_handlers,json=l1Handlers,proto3" json:"l1_handlers,omitempty"` + Constructors []*SierraEntryPoint `protobuf:"bytes,3,rep,name=constructors,proto3" json:"constructors,omitempty"` +} + +func (x *Cairo1EntryPoints) Reset() { + *x = Cairo1EntryPoints{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Cairo1EntryPoints) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Cairo1EntryPoints) ProtoMessage() {} + +func (x *Cairo1EntryPoints) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Cairo1EntryPoints.ProtoReflect.Descriptor instead. +func (*Cairo1EntryPoints) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{3} +} + +func (x *Cairo1EntryPoints) GetExternals() []*SierraEntryPoint { + if x != nil { + return x.Externals + } + return nil +} + +func (x *Cairo1EntryPoints) GetL1Handlers() []*SierraEntryPoint { + if x != nil { + return x.L1Handlers + } + return nil +} + +func (x *Cairo1EntryPoints) GetConstructors() []*SierraEntryPoint { + if x != nil { + return x.Constructors + } + return nil +} + +type Cairo1Class struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Abi string `protobuf:"bytes,1,opt,name=abi,proto3" json:"abi,omitempty"` + EntryPoints *Cairo1EntryPoints `protobuf:"bytes,2,opt,name=entry_points,json=entryPoints,proto3" json:"entry_points,omitempty"` + Program []*Felt252 `protobuf:"bytes,3,rep,name=program,proto3" json:"program,omitempty"` + ContractClassVersion string `protobuf:"bytes,4,opt,name=contract_class_version,json=contractClassVersion,proto3" json:"contract_class_version,omitempty"` +} + +func (x *Cairo1Class) Reset() { + *x = Cairo1Class{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Cairo1Class) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Cairo1Class) ProtoMessage() {} + +func (x *Cairo1Class) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Cairo1Class.ProtoReflect.Descriptor instead. +func (*Cairo1Class) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{4} +} + +func (x *Cairo1Class) GetAbi() string { + if x != nil { + return x.Abi + } + return "" +} + +func (x *Cairo1Class) GetEntryPoints() *Cairo1EntryPoints { + if x != nil { + return x.EntryPoints + } + return nil +} + +func (x *Cairo1Class) GetProgram() []*Felt252 { + if x != nil { + return x.Program + } + return nil +} + +func (x *Cairo1Class) GetContractClassVersion() string { + if x != nil { + return x.ContractClassVersion + } + return "" +} + +type Class struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Class: + // + // *Class_Cairo0 + // *Class_Cairo1 + Class isClass_Class `protobuf_oneof:"class"` + Domain uint32 `protobuf:"varint,3,opt,name=domain,proto3" json:"domain,omitempty"` +} + +func (x *Class) Reset() { + *x = Class{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Class) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Class) ProtoMessage() {} + +func (x *Class) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Class.ProtoReflect.Descriptor instead. +func (*Class) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{5} +} + +func (m *Class) GetClass() isClass_Class { + if m != nil { + return m.Class + } + return nil +} + +func (x *Class) GetCairo0() *Cairo0Class { + if x, ok := x.GetClass().(*Class_Cairo0); ok { + return x.Cairo0 + } + return nil +} + +func (x *Class) GetCairo1() *Cairo1Class { + if x, ok := x.GetClass().(*Class_Cairo1); ok { + return x.Cairo1 + } + return nil +} + +func (x *Class) GetDomain() uint32 { + if x != nil { + return x.Domain + } + return 0 +} + +type isClass_Class interface { + isClass_Class() +} + +type Class_Cairo0 struct { + Cairo0 *Cairo0Class `protobuf:"bytes,1,opt,name=cairo0,proto3,oneof"` +} + +type Class_Cairo1 struct { + Cairo1 *Cairo1Class `protobuf:"bytes,2,opt,name=cairo1,proto3,oneof"` +} + +func (*Class_Cairo0) isClass_Class() {} + +func (*Class_Cairo1) isClass_Class() {} + +type ClassesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` +} + +func (x *ClassesRequest) Reset() { + *x = ClassesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClassesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClassesRequest) ProtoMessage() {} + +func (x *ClassesRequest) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClassesRequest.ProtoReflect.Descriptor instead. +func (*ClassesRequest) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{6} +} + +func (x *ClassesRequest) GetIteration() *Iteration { + if x != nil { + return x.Iteration + } + return nil +} + +// Responses are sent ordered by the order given in the request. +type ClassesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to ClassMessage: + // + // *ClassesResponse_Class + // *ClassesResponse_Fin + ClassMessage isClassesResponse_ClassMessage `protobuf_oneof:"class_message"` +} + +func (x *ClassesResponse) Reset() { + *x = ClassesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_class_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClassesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClassesResponse) ProtoMessage() {} + +func (x *ClassesResponse) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_class_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClassesResponse.ProtoReflect.Descriptor instead. +func (*ClassesResponse) Descriptor() ([]byte, []int) { + return file_p2p_proto_class_proto_rawDescGZIP(), []int{7} +} + +func (m *ClassesResponse) GetClassMessage() isClassesResponse_ClassMessage { + if m != nil { + return m.ClassMessage + } + return nil +} + +func (x *ClassesResponse) GetClass() *Class { + if x, ok := x.GetClassMessage().(*ClassesResponse_Class); ok { + return x.Class + } + return nil +} + +func (x *ClassesResponse) GetFin() *Fin { + if x, ok := x.GetClassMessage().(*ClassesResponse_Fin); ok { + return x.Fin + } + return nil +} + +type isClassesResponse_ClassMessage interface { + isClassesResponse_ClassMessage() +} + +type ClassesResponse_Class struct { + Class *Class `protobuf:"bytes,1,opt,name=class,proto3,oneof"` +} + +type ClassesResponse_Fin struct { + Fin *Fin `protobuf:"bytes,2,opt,name=fin,proto3,oneof"` // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its classes. +} + +func (*ClassesResponse_Class) isClassesResponse_ClassMessage() {} + +func (*ClassesResponse_Fin) isClassesResponse_ClassMessage() {} + +var File_p2p_proto_class_proto protoreflect.FileDescriptor + +var file_p2p_proto_class_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x4a, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x24, 0x0a, + 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x0b, + 0x43, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x62, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x62, 0x69, 0x12, 0x29, 0x0a, + 0x09, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x09, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x0b, 0x6c, 0x31, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x6c, 0x31, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x22, 0x4e, 0x0a, 0x10, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x08, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x31, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x69, 0x65, + 0x72, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x09, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x6c, 0x31, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x52, 0x0a, 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x0c, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0xb0, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x31, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x62, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x61, 0x62, 0x69, 0x12, 0x35, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x43, 0x61, + 0x69, 0x72, 0x6f, 0x31, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, + 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x78, 0x0a, 0x05, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, + 0x26, 0x0a, 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, + 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, + 0x31, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x31, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, 0x31, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x22, 0x3a, 0x0a, 0x0e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x0f, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1e, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x06, + 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, + 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, + 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, 0x70, 0x2f, + 0x73, 0x74, 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_p2p_proto_class_proto_rawDescOnce sync.Once + file_p2p_proto_class_proto_rawDescData = file_p2p_proto_class_proto_rawDesc +) + +func file_p2p_proto_class_proto_rawDescGZIP() []byte { + file_p2p_proto_class_proto_rawDescOnce.Do(func() { + file_p2p_proto_class_proto_rawDescData = protoimpl.X.CompressGZIP(file_p2p_proto_class_proto_rawDescData) + }) + return file_p2p_proto_class_proto_rawDescData +} + +var ( + file_p2p_proto_class_proto_msgTypes = make([]protoimpl.MessageInfo, 8) + file_p2p_proto_class_proto_goTypes = []interface{}{ + (*EntryPoint)(nil), // 0: EntryPoint + (*Cairo0Class)(nil), // 1: Cairo0Class + (*SierraEntryPoint)(nil), // 2: SierraEntryPoint + (*Cairo1EntryPoints)(nil), // 3: Cairo1EntryPoints + (*Cairo1Class)(nil), // 4: Cairo1Class + (*Class)(nil), // 5: Class + (*ClassesRequest)(nil), // 6: ClassesRequest + (*ClassesResponse)(nil), // 7: ClassesResponse + (*Felt252)(nil), // 8: Felt252 + (*Iteration)(nil), // 9: Iteration + (*Fin)(nil), // 10: Fin + } +) +var file_p2p_proto_class_proto_depIdxs = []int32{ + 8, // 0: EntryPoint.selector:type_name -> Felt252 + 0, // 1: Cairo0Class.externals:type_name -> EntryPoint + 0, // 2: Cairo0Class.l1_handlers:type_name -> EntryPoint + 0, // 3: Cairo0Class.constructors:type_name -> EntryPoint + 8, // 4: SierraEntryPoint.selector:type_name -> Felt252 + 2, // 5: Cairo1EntryPoints.externals:type_name -> SierraEntryPoint + 2, // 6: Cairo1EntryPoints.l1_handlers:type_name -> SierraEntryPoint + 2, // 7: Cairo1EntryPoints.constructors:type_name -> SierraEntryPoint + 3, // 8: Cairo1Class.entry_points:type_name -> Cairo1EntryPoints + 8, // 9: Cairo1Class.program:type_name -> Felt252 + 1, // 10: Class.cairo0:type_name -> Cairo0Class + 4, // 11: Class.cairo1:type_name -> Cairo1Class + 9, // 12: ClassesRequest.iteration:type_name -> Iteration + 5, // 13: ClassesResponse.class:type_name -> Class + 10, // 14: ClassesResponse.fin:type_name -> Fin + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name +} + +func init() { file_p2p_proto_class_proto_init() } +func file_p2p_proto_class_proto_init() { + if File_p2p_proto_class_proto != nil { + return + } + file_p2p_proto_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_p2p_proto_class_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EntryPoint); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Cairo0Class); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SierraEntryPoint); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Cairo1EntryPoints); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Cairo1Class); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Class); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClassesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_class_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClassesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_p2p_proto_class_proto_msgTypes[5].OneofWrappers = []interface{}{ + (*Class_Cairo0)(nil), + (*Class_Cairo1)(nil), + } + file_p2p_proto_class_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*ClassesResponse_Class)(nil), + (*ClassesResponse_Fin)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_p2p_proto_class_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_p2p_proto_class_proto_goTypes, + DependencyIndexes: file_p2p_proto_class_proto_depIdxs, + MessageInfos: file_p2p_proto_class_proto_msgTypes, + }.Build() + File_p2p_proto_class_proto = out.File + file_p2p_proto_class_proto_rawDesc = nil + file_p2p_proto_class_proto_goTypes = nil + file_p2p_proto_class_proto_depIdxs = nil +} diff --git a/p2p/starknet/spec/common.pb.go b/p2p/starknet/spec/common.pb.go index b7270b5420..78be23ee1f 100644 --- a/p2p/starknet/spec/common.pb.go +++ b/p2p/starknet/spec/common.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.26.0 +// protoc v4.25.1 // source: p2p/proto/common.proto package spec @@ -21,101 +21,141 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type Iteration_Direction int32 +type L1DataAvailabilityMode int32 const ( - Iteration_Forward Iteration_Direction = 0 - Iteration_Backward Iteration_Direction = 1 + L1DataAvailabilityMode_Calldata L1DataAvailabilityMode = 0 + L1DataAvailabilityMode_Blob L1DataAvailabilityMode = 1 ) -// Enum value maps for Iteration_Direction. +// Enum value maps for L1DataAvailabilityMode. var ( - Iteration_Direction_name = map[int32]string{ - 0: "Forward", - 1: "Backward", + L1DataAvailabilityMode_name = map[int32]string{ + 0: "Calldata", + 1: "Blob", } - Iteration_Direction_value = map[string]int32{ - "Forward": 0, - "Backward": 1, + L1DataAvailabilityMode_value = map[string]int32{ + "Calldata": 0, + "Blob": 1, } ) -func (x Iteration_Direction) Enum() *Iteration_Direction { - p := new(Iteration_Direction) +func (x L1DataAvailabilityMode) Enum() *L1DataAvailabilityMode { + p := new(L1DataAvailabilityMode) *p = x return p } -func (x Iteration_Direction) String() string { +func (x L1DataAvailabilityMode) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (Iteration_Direction) Descriptor() protoreflect.EnumDescriptor { +func (L1DataAvailabilityMode) Descriptor() protoreflect.EnumDescriptor { return file_p2p_proto_common_proto_enumTypes[0].Descriptor() } -func (Iteration_Direction) Type() protoreflect.EnumType { +func (L1DataAvailabilityMode) Type() protoreflect.EnumType { return &file_p2p_proto_common_proto_enumTypes[0] } -func (x Iteration_Direction) Number() protoreflect.EnumNumber { +func (x L1DataAvailabilityMode) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use Iteration_Direction.Descriptor instead. -func (Iteration_Direction) EnumDescriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{9, 0} +// Deprecated: Use L1DataAvailabilityMode.Descriptor instead. +func (L1DataAvailabilityMode) EnumDescriptor() ([]byte, []int) { + return file_p2p_proto_common_proto_rawDescGZIP(), []int{0} } -type Fin_Error int32 +type VolitionDomain int32 const ( - Fin_busy Fin_Error = 0 - Fin_too_much Fin_Error = 1 - Fin_unknown Fin_Error = 2 - Fin_pruned Fin_Error = 3 + VolitionDomain_L1 VolitionDomain = 0 + VolitionDomain_L2 VolitionDomain = 1 ) -// Enum value maps for Fin_Error. +// Enum value maps for VolitionDomain. var ( - Fin_Error_name = map[int32]string{ - 0: "busy", - 1: "too_much", - 2: "unknown", - 3: "pruned", - } - Fin_Error_value = map[string]int32{ - "busy": 0, - "too_much": 1, - "unknown": 2, - "pruned": 3, + VolitionDomain_name = map[int32]string{ + 0: "L1", + 1: "L2", + } + VolitionDomain_value = map[string]int32{ + "L1": 0, + "L2": 1, } ) -func (x Fin_Error) Enum() *Fin_Error { - p := new(Fin_Error) +func (x VolitionDomain) Enum() *VolitionDomain { + p := new(VolitionDomain) *p = x return p } -func (x Fin_Error) String() string { +func (x VolitionDomain) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (Fin_Error) Descriptor() protoreflect.EnumDescriptor { +func (VolitionDomain) Descriptor() protoreflect.EnumDescriptor { return file_p2p_proto_common_proto_enumTypes[1].Descriptor() } -func (Fin_Error) Type() protoreflect.EnumType { +func (VolitionDomain) Type() protoreflect.EnumType { return &file_p2p_proto_common_proto_enumTypes[1] } -func (x Fin_Error) Number() protoreflect.EnumNumber { +func (x VolitionDomain) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use Fin_Error.Descriptor instead. -func (Fin_Error) EnumDescriptor() ([]byte, []int) { +// Deprecated: Use VolitionDomain.Descriptor instead. +func (VolitionDomain) EnumDescriptor() ([]byte, []int) { + return file_p2p_proto_common_proto_rawDescGZIP(), []int{1} +} + +type Iteration_Direction int32 + +const ( + Iteration_Forward Iteration_Direction = 0 + Iteration_Backward Iteration_Direction = 1 +) + +// Enum value maps for Iteration_Direction. +var ( + Iteration_Direction_name = map[int32]string{ + 0: "Forward", + 1: "Backward", + } + Iteration_Direction_value = map[string]int32{ + "Forward": 0, + "Backward": 1, + } +) + +func (x Iteration_Direction) Enum() *Iteration_Direction { + p := new(Iteration_Direction) + *p = x + return p +} + +func (x Iteration_Direction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Iteration_Direction) Descriptor() protoreflect.EnumDescriptor { + return file_p2p_proto_common_proto_enumTypes[2].Descriptor() +} + +func (Iteration_Direction) Type() protoreflect.EnumType { + return &file_p2p_proto_common_proto_enumTypes[2] +} + +func (x Iteration_Direction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Iteration_Direction.Descriptor instead. +func (Iteration_Direction) EnumDescriptor() ([]byte, []int) { return file_p2p_proto_common_proto_rawDescGZIP(), []int{10, 0} } @@ -354,6 +394,61 @@ func (x *PeerID) GetId() []byte { return nil } +type Uint128 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Low uint64 `protobuf:"varint,1,opt,name=low,proto3" json:"low,omitempty"` + High uint64 `protobuf:"varint,2,opt,name=high,proto3" json:"high,omitempty"` +} + +func (x *Uint128) Reset() { + *x = Uint128{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_common_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Uint128) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Uint128) ProtoMessage() {} + +func (x *Uint128) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_common_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Uint128.ProtoReflect.Descriptor instead. +func (*Uint128) Descriptor() ([]byte, []int) { + return file_p2p_proto_common_proto_rawDescGZIP(), []int{5} +} + +func (x *Uint128) GetLow() uint64 { + if x != nil { + return x.Low + } + return 0 +} + +func (x *Uint128) GetHigh() uint64 { + if x != nil { + return x.High + } + return 0 +} + type ConsensusSignature struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -366,7 +461,7 @@ type ConsensusSignature struct { func (x *ConsensusSignature) Reset() { *x = ConsensusSignature{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_common_proto_msgTypes[5] + mi := &file_p2p_proto_common_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -379,7 +474,7 @@ func (x *ConsensusSignature) String() string { func (*ConsensusSignature) ProtoMessage() {} func (x *ConsensusSignature) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_common_proto_msgTypes[5] + mi := &file_p2p_proto_common_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -392,7 +487,7 @@ func (x *ConsensusSignature) ProtoReflect() protoreflect.Message { // Deprecated: Use ConsensusSignature.ProtoReflect.Descriptor instead. func (*ConsensusSignature) Descriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{5} + return file_p2p_proto_common_proto_rawDescGZIP(), []int{6} } func (x *ConsensusSignature) GetR() *Felt252 { @@ -409,33 +504,33 @@ func (x *ConsensusSignature) GetS() *Felt252 { return nil } -type Merkle struct { +type Patricia struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NLeaves uint32 `protobuf:"varint,1,opt,name=n_leaves,json=nLeaves,proto3" json:"n_leaves,omitempty"` // needed to know the height, so as to how many nodes to expect in a proof. + NLeaves uint64 `protobuf:"varint,1,opt,name=n_leaves,json=nLeaves,proto3" json:"n_leaves,omitempty"` // needed to know the height, so as to how many nodes to expect in a proof. // and also when receiving all leaves, how many to expect Root *Hash `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` } -func (x *Merkle) Reset() { - *x = Merkle{} +func (x *Patricia) Reset() { + *x = Patricia{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_common_proto_msgTypes[6] + mi := &file_p2p_proto_common_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Merkle) String() string { +func (x *Patricia) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Merkle) ProtoMessage() {} +func (*Patricia) ProtoMessage() {} -func (x *Merkle) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_common_proto_msgTypes[6] +func (x *Patricia) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_common_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -446,51 +541,51 @@ func (x *Merkle) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Merkle.ProtoReflect.Descriptor instead. -func (*Merkle) Descriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{6} +// Deprecated: Use Patricia.ProtoReflect.Descriptor instead. +func (*Patricia) Descriptor() ([]byte, []int) { + return file_p2p_proto_common_proto_rawDescGZIP(), []int{7} } -func (x *Merkle) GetNLeaves() uint32 { +func (x *Patricia) GetNLeaves() uint64 { if x != nil { return x.NLeaves } return 0 } -func (x *Merkle) GetRoot() *Hash { +func (x *Patricia) GetRoot() *Hash { if x != nil { return x.Root } return nil } -type Patricia struct { +type StateDiffCommitment struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Height uint32 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` - Root *Hash `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` + StateDiffLength uint64 `protobuf:"varint,1,opt,name=state_diff_length,json=stateDiffLength,proto3" json:"state_diff_length,omitempty"` + Root *Hash `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` } -func (x *Patricia) Reset() { - *x = Patricia{} +func (x *StateDiffCommitment) Reset() { + *x = StateDiffCommitment{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_common_proto_msgTypes[7] + mi := &file_p2p_proto_common_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Patricia) String() string { +func (x *StateDiffCommitment) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Patricia) ProtoMessage() {} +func (*StateDiffCommitment) ProtoMessage() {} -func (x *Patricia) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_common_proto_msgTypes[7] +func (x *StateDiffCommitment) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_common_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -501,19 +596,19 @@ func (x *Patricia) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Patricia.ProtoReflect.Descriptor instead. -func (*Patricia) Descriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{7} +// Deprecated: Use StateDiffCommitment.ProtoReflect.Descriptor instead. +func (*StateDiffCommitment) Descriptor() ([]byte, []int) { + return file_p2p_proto_common_proto_rawDescGZIP(), []int{8} } -func (x *Patricia) GetHeight() uint32 { +func (x *StateDiffCommitment) GetStateDiffLength() uint64 { if x != nil { - return x.Height + return x.StateDiffLength } return 0 } -func (x *Patricia) GetRoot() *Hash { +func (x *StateDiffCommitment) GetRoot() *Hash { if x != nil { return x.Root } @@ -532,7 +627,7 @@ type BlockID struct { func (x *BlockID) Reset() { *x = BlockID{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_common_proto_msgTypes[8] + mi := &file_p2p_proto_common_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -545,7 +640,7 @@ func (x *BlockID) String() string { func (*BlockID) ProtoMessage() {} func (x *BlockID) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_common_proto_msgTypes[8] + mi := &file_p2p_proto_common_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -558,7 +653,7 @@ func (x *BlockID) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockID.ProtoReflect.Descriptor instead. func (*BlockID) Descriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{8} + return file_p2p_proto_common_proto_rawDescGZIP(), []int{9} } func (x *BlockID) GetNumber() uint64 { @@ -593,7 +688,7 @@ type Iteration struct { func (x *Iteration) Reset() { *x = Iteration{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_common_proto_msgTypes[9] + mi := &file_p2p_proto_common_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -606,7 +701,7 @@ func (x *Iteration) String() string { func (*Iteration) ProtoMessage() {} func (x *Iteration) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_common_proto_msgTypes[9] + mi := &file_p2p_proto_common_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -619,7 +714,7 @@ func (x *Iteration) ProtoReflect() protoreflect.Message { // Deprecated: Use Iteration.ProtoReflect.Descriptor instead. func (*Iteration) Descriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{9} + return file_p2p_proto_common_proto_rawDescGZIP(), []int{10} } func (m *Iteration) GetStart() isIteration_Start { @@ -686,14 +781,12 @@ type Fin struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Error *Fin_Error `protobuf:"varint,1,opt,name=error,proto3,enum=Fin_Error,oneof" json:"error,omitempty"` } func (x *Fin) Reset() { *x = Fin{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_common_proto_msgTypes[10] + mi := &file_p2p_proto_common_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -706,7 +799,7 @@ func (x *Fin) String() string { func (*Fin) ProtoMessage() {} func (x *Fin) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_common_proto_msgTypes[10] + mi := &file_p2p_proto_common_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -719,14 +812,7 @@ func (x *Fin) ProtoReflect() protoreflect.Message { // Deprecated: Use Fin.ProtoReflect.Descriptor instead. func (*Fin) Descriptor() ([]byte, []int) { - return file_p2p_proto_common_proto_rawDescGZIP(), []int{10} -} - -func (x *Fin) GetError() Fin_Error { - if x != nil && x.Error != nil { - return *x.Error - } - return Fin_busy + return file_p2p_proto_common_proto_rawDescGZIP(), []int{11} } var File_p2p_proto_common_proto protoreflect.FileDescriptor @@ -744,45 +830,52 @@ var file_p2p_proto_common_proto_rawDesc = []byte{ 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x18, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x22, 0x44, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x16, 0x0a, 0x01, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, - 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x01, 0x72, 0x12, 0x16, 0x0a, 0x01, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x01, - 0x73, 0x22, 0x3e, 0x0a, 0x06, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6e, - 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, 0x72, 0x6f, 0x6f, - 0x74, 0x22, 0x3d, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, 0x69, 0x61, 0x12, 0x16, 0x0a, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, - 0x22, 0x40, 0x0a, 0x07, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0xe0, 0x01, 0x0a, 0x09, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x23, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x00, 0x52, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x49, 0x74, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x73, 0x74, 0x65, 0x70, 0x22, 0x26, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x10, 0x00, 0x12, 0x0c, - 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x10, 0x01, 0x42, 0x07, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x70, 0x0a, 0x03, 0x46, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x46, 0x69, - 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x22, 0x38, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x08, 0x0a, 0x04, - 0x62, 0x75, 0x73, 0x79, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x6f, 0x6f, 0x5f, 0x6d, 0x75, - 0x63, 0x68, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x70, 0x72, 0x75, 0x6e, 0x65, 0x64, 0x10, 0x03, 0x42, 0x08, 0x0a, - 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x07, 0x55, + 0x69, 0x6e, 0x74, 0x31, 0x32, 0x38, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x22, 0x44, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x16, 0x0a, 0x01, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x01, 0x72, 0x12, 0x16, 0x0a, 0x01, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, + 0x01, 0x73, 0x22, 0x40, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, 0x69, 0x61, 0x12, 0x19, + 0x0a, 0x08, 0x6e, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x6e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6f, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, + 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x5c, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, + 0x66, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, + 0x66, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, 0x72, 0x6f, + 0x6f, 0x74, 0x22, 0x40, 0x0a, 0x07, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x12, 0x16, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0xe0, 0x01, 0x0a, 0x09, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x00, + 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x22, 0x26, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x10, 0x01, 0x42, 0x07, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x05, 0x0a, 0x03, 0x46, 0x69, 0x6e, 0x2a, 0x30, + 0x0a, 0x16, 0x4c, 0x31, 0x44, 0x61, 0x74, 0x61, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x6c, 0x6f, 0x62, 0x10, 0x01, + 0x2a, 0x20, 0x0a, 0x0e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x31, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4c, 0x32, + 0x10, 0x01, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, + 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, + 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -798,40 +891,40 @@ func file_p2p_proto_common_proto_rawDescGZIP() []byte { } var ( - file_p2p_proto_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2) - file_p2p_proto_common_proto_msgTypes = make([]protoimpl.MessageInfo, 11) + file_p2p_proto_common_proto_enumTypes = make([]protoimpl.EnumInfo, 3) + file_p2p_proto_common_proto_msgTypes = make([]protoimpl.MessageInfo, 12) file_p2p_proto_common_proto_goTypes = []interface{}{ - (Iteration_Direction)(0), // 0: Iteration.Direction - (Fin_Error)(0), // 1: Fin.Error - (*Felt252)(nil), // 2: Felt252 - (*Hash)(nil), // 3: Hash - (*Hashes)(nil), // 4: Hashes - (*Address)(nil), // 5: Address - (*PeerID)(nil), // 6: PeerID - (*ConsensusSignature)(nil), // 7: ConsensusSignature - (*Merkle)(nil), // 8: Merkle - (*Patricia)(nil), // 9: Patricia - (*BlockID)(nil), // 10: BlockID - (*Iteration)(nil), // 11: Iteration - (*Fin)(nil), // 12: Fin + (L1DataAvailabilityMode)(0), // 0: L1DataAvailabilityMode + (VolitionDomain)(0), // 1: VolitionDomain + (Iteration_Direction)(0), // 2: Iteration.Direction + (*Felt252)(nil), // 3: Felt252 + (*Hash)(nil), // 4: Hash + (*Hashes)(nil), // 5: Hashes + (*Address)(nil), // 6: Address + (*PeerID)(nil), // 7: PeerID + (*Uint128)(nil), // 8: Uint128 + (*ConsensusSignature)(nil), // 9: ConsensusSignature + (*Patricia)(nil), // 10: Patricia + (*StateDiffCommitment)(nil), // 11: StateDiffCommitment + (*BlockID)(nil), // 12: BlockID + (*Iteration)(nil), // 13: Iteration + (*Fin)(nil), // 14: Fin } ) - var file_p2p_proto_common_proto_depIdxs = []int32{ - 3, // 0: Hashes.items:type_name -> Hash - 2, // 1: ConsensusSignature.r:type_name -> Felt252 - 2, // 2: ConsensusSignature.s:type_name -> Felt252 - 3, // 3: Merkle.root:type_name -> Hash - 3, // 4: Patricia.root:type_name -> Hash - 3, // 5: BlockID.header:type_name -> Hash - 3, // 6: Iteration.header:type_name -> Hash - 0, // 7: Iteration.direction:type_name -> Iteration.Direction - 1, // 8: Fin.error:type_name -> Fin.Error - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 4, // 0: Hashes.items:type_name -> Hash + 3, // 1: ConsensusSignature.r:type_name -> Felt252 + 3, // 2: ConsensusSignature.s:type_name -> Felt252 + 4, // 3: Patricia.root:type_name -> Hash + 4, // 4: StateDiffCommitment.root:type_name -> Hash + 4, // 5: BlockID.header:type_name -> Hash + 4, // 6: Iteration.header:type_name -> Hash + 2, // 7: Iteration.direction:type_name -> Iteration.Direction + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_p2p_proto_common_proto_init() } @@ -901,7 +994,7 @@ func file_p2p_proto_common_proto_init() { } } file_p2p_proto_common_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConsensusSignature); i { + switch v := v.(*Uint128); i { case 0: return &v.state case 1: @@ -913,7 +1006,7 @@ func file_p2p_proto_common_proto_init() { } } file_p2p_proto_common_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Merkle); i { + switch v := v.(*ConsensusSignature); i { case 0: return &v.state case 1: @@ -937,7 +1030,7 @@ func file_p2p_proto_common_proto_init() { } } file_p2p_proto_common_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockID); i { + switch v := v.(*StateDiffCommitment); i { case 0: return &v.state case 1: @@ -949,7 +1042,7 @@ func file_p2p_proto_common_proto_init() { } } file_p2p_proto_common_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Iteration); i { + switch v := v.(*BlockID); i { case 0: return &v.state case 1: @@ -961,6 +1054,18 @@ func file_p2p_proto_common_proto_init() { } } file_p2p_proto_common_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Iteration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_common_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Fin); i { case 0: return &v.state @@ -973,18 +1078,17 @@ func file_p2p_proto_common_proto_init() { } } } - file_p2p_proto_common_proto_msgTypes[9].OneofWrappers = []interface{}{ + file_p2p_proto_common_proto_msgTypes[10].OneofWrappers = []interface{}{ (*Iteration_BlockNumber)(nil), (*Iteration_Header)(nil), } - file_p2p_proto_common_proto_msgTypes[10].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_p2p_proto_common_proto_rawDesc, - NumEnums: 2, - NumMessages: 11, + NumEnums: 3, + NumMessages: 12, NumExtensions: 0, NumServices: 0, }, diff --git a/p2p/starknet/spec/event.pb.go b/p2p/starknet/spec/event.pb.go index c3d21f897f..0475603f66 100644 --- a/p2p/starknet/spec/event.pb.go +++ b/p2p/starknet/spec/event.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.26.0 +// protoc v4.25.1 // source: p2p/proto/event.proto package spec @@ -27,9 +27,9 @@ type Event struct { unknownFields protoimpl.UnknownFields TransactionHash *Hash `protobuf:"bytes,1,opt,name=transaction_hash,json=transactionHash,proto3" json:"transaction_hash,omitempty"` - FromAddress *Felt252 `protobuf:"bytes,2,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` - Keys []*Felt252 `protobuf:"bytes,3,rep,name=keys,proto3" json:"keys,omitempty"` - Data []*Felt252 `protobuf:"bytes,4,rep,name=data,proto3" json:"data,omitempty"` + FromAddress *Felt252 `protobuf:"bytes,3,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` // looks like mistake? + Keys []*Felt252 `protobuf:"bytes,4,rep,name=keys,proto3" json:"keys,omitempty"` + Data []*Felt252 `protobuf:"bytes,5,rep,name=data,proto3" json:"data,omitempty"` } func (x *Event) Reset() { @@ -139,71 +139,23 @@ func (x *EventsRequest) GetIteration() *Iteration { return nil } -type Events struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Items []*Event `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` -} - -func (x *Events) Reset() { - *x = Events{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_event_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Events) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Events) ProtoMessage() {} - -func (x *Events) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_event_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Events.ProtoReflect.Descriptor instead. -func (*Events) Descriptor() ([]byte, []int) { - return file_p2p_proto_event_proto_rawDescGZIP(), []int{2} -} - -func (x *Events) GetItems() []*Event { - if x != nil { - return x.Items - } - return nil -} - -// can be several in a single reply +// Responses are sent ordered by the order given in the request. type EventsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id *BlockID `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to Responses: + // Types that are assignable to EventMessage: // - // *EventsResponse_Events + // *EventsResponse_Event // *EventsResponse_Fin - Responses isEventsResponse_Responses `protobuf_oneof:"responses"` + EventMessage isEventsResponse_EventMessage `protobuf_oneof:"event_message"` } func (x *EventsResponse) Reset() { *x = EventsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_event_proto_msgTypes[3] + mi := &file_p2p_proto_event_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -216,7 +168,7 @@ func (x *EventsResponse) String() string { func (*EventsResponse) ProtoMessage() {} func (x *EventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_event_proto_msgTypes[3] + mi := &file_p2p_proto_event_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -229,52 +181,45 @@ func (x *EventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsResponse.ProtoReflect.Descriptor instead. func (*EventsResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_event_proto_rawDescGZIP(), []int{3} -} - -func (x *EventsResponse) GetId() *BlockID { - if x != nil { - return x.Id - } - return nil + return file_p2p_proto_event_proto_rawDescGZIP(), []int{2} } -func (m *EventsResponse) GetResponses() isEventsResponse_Responses { +func (m *EventsResponse) GetEventMessage() isEventsResponse_EventMessage { if m != nil { - return m.Responses + return m.EventMessage } return nil } -func (x *EventsResponse) GetEvents() *Events { - if x, ok := x.GetResponses().(*EventsResponse_Events); ok { - return x.Events +func (x *EventsResponse) GetEvent() *Event { + if x, ok := x.GetEventMessage().(*EventsResponse_Event); ok { + return x.Event } return nil } func (x *EventsResponse) GetFin() *Fin { - if x, ok := x.GetResponses().(*EventsResponse_Fin); ok { + if x, ok := x.GetEventMessage().(*EventsResponse_Fin); ok { return x.Fin } return nil } -type isEventsResponse_Responses interface { - isEventsResponse_Responses() +type isEventsResponse_EventMessage interface { + isEventsResponse_EventMessage() } -type EventsResponse_Events struct { - Events *Events `protobuf:"bytes,2,opt,name=events,proto3,oneof"` +type EventsResponse_Event struct { + Event *Event `protobuf:"bytes,1,opt,name=event,proto3,oneof"` } type EventsResponse_Fin struct { - Fin *Fin `protobuf:"bytes,3,opt,name=fin,proto3,oneof"` + Fin *Fin `protobuf:"bytes,2,opt,name=fin,proto3,oneof"` // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its events. } -func (*EventsResponse_Events) isEventsResponse_Responses() {} +func (*EventsResponse_Event) isEventsResponse_EventMessage() {} -func (*EventsResponse_Fin) isEventsResponse_Responses() {} +func (*EventsResponse_Fin) isEventsResponse_EventMessage() {} var File_p2p_proto_event_proto protoreflect.FileDescriptor @@ -286,28 +231,26 @@ var file_p2p_proto_event_proto_rawDesc = []byte{ 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x0c, 0x66, - 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, - 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x1c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, + 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x1c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x39, 0x0a, 0x0d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x26, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x06, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, - 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x48, 0x00, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x03, - 0x66, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, - 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x73, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x5b, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1e, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x06, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, + 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x31, 0x5a, 0x2f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, + 0x70, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -323,35 +266,30 @@ func file_p2p_proto_event_proto_rawDescGZIP() []byte { } var ( - file_p2p_proto_event_proto_msgTypes = make([]protoimpl.MessageInfo, 4) + file_p2p_proto_event_proto_msgTypes = make([]protoimpl.MessageInfo, 3) file_p2p_proto_event_proto_goTypes = []interface{}{ (*Event)(nil), // 0: Event (*EventsRequest)(nil), // 1: EventsRequest - (*Events)(nil), // 2: Events - (*EventsResponse)(nil), // 3: EventsResponse - (*Hash)(nil), // 4: Hash - (*Felt252)(nil), // 5: Felt252 - (*Iteration)(nil), // 6: Iteration - (*BlockID)(nil), // 7: BlockID - (*Fin)(nil), // 8: Fin + (*EventsResponse)(nil), // 2: EventsResponse + (*Hash)(nil), // 3: Hash + (*Felt252)(nil), // 4: Felt252 + (*Iteration)(nil), // 5: Iteration + (*Fin)(nil), // 6: Fin } ) - var file_p2p_proto_event_proto_depIdxs = []int32{ - 4, // 0: Event.transaction_hash:type_name -> Hash - 5, // 1: Event.from_address:type_name -> Felt252 - 5, // 2: Event.keys:type_name -> Felt252 - 5, // 3: Event.data:type_name -> Felt252 - 6, // 4: EventsRequest.iteration:type_name -> Iteration - 0, // 5: Events.items:type_name -> Event - 7, // 6: EventsResponse.id:type_name -> BlockID - 2, // 7: EventsResponse.events:type_name -> Events - 8, // 8: EventsResponse.fin:type_name -> Fin - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 3, // 0: Event.transaction_hash:type_name -> Hash + 4, // 1: Event.from_address:type_name -> Felt252 + 4, // 2: Event.keys:type_name -> Felt252 + 4, // 3: Event.data:type_name -> Felt252 + 5, // 4: EventsRequest.iteration:type_name -> Iteration + 0, // 5: EventsResponse.event:type_name -> Event + 6, // 6: EventsResponse.fin:type_name -> Fin + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_p2p_proto_event_proto_init() } @@ -386,18 +324,6 @@ func file_p2p_proto_event_proto_init() { } } file_p2p_proto_event_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Events); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_event_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventsResponse); i { case 0: return &v.state @@ -410,8 +336,8 @@ func file_p2p_proto_event_proto_init() { } } } - file_p2p_proto_event_proto_msgTypes[3].OneofWrappers = []interface{}{ - (*EventsResponse_Events)(nil), + file_p2p_proto_event_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*EventsResponse_Event)(nil), (*EventsResponse_Fin)(nil), } type x struct{} @@ -420,7 +346,7 @@ func file_p2p_proto_event_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_p2p_proto_event_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 3, NumExtensions: 0, NumServices: 0, }, diff --git a/p2p/starknet/spec/header.pb.go b/p2p/starknet/spec/header.pb.go new file mode 100644 index 0000000000..36ad83289e --- /dev/null +++ b/p2p/starknet/spec/header.pb.go @@ -0,0 +1,699 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v4.25.1 +// source: p2p/proto/header.proto + +package spec + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Note: commitments may change to be for the previous blocks like comet/tendermint +// hash of block header sent to L1 +type SignedBlockHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BlockHash *Hash `protobuf:"bytes,1,opt,name=block_hash,json=blockHash,proto3" json:"block_hash,omitempty"` // For the structure of the block hash, see https://docs.starknet.io/documentation/architecture_and_concepts/Network_Architecture/header/#block_hash + ParentHash *Hash `protobuf:"bytes,2,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"` + Number uint64 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` // This can be deduced from context. We can consider removing this field. + Time uint64 `protobuf:"varint,4,opt,name=time,proto3" json:"time,omitempty"` // Encoded in Unix time. + SequencerAddress *Address `protobuf:"bytes,5,opt,name=sequencer_address,json=sequencerAddress,proto3" json:"sequencer_address,omitempty"` + StateRoot *Hash `protobuf:"bytes,6,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` // Patricia root of contract and class patricia tries. Each of those tries are of height 251. Same as in L1. Later more trees will be included + StateDiffCommitment *StateDiffCommitment `protobuf:"bytes,7,opt,name=state_diff_commitment,json=stateDiffCommitment,proto3" json:"state_diff_commitment,omitempty"` // The state diff commitment returned by the Starknet Feeder Gateway + // For more info, see https://community.starknet.io/t/introducing-p2p-authentication-and-mismatch-resolution-in-v0-12-2/97993 + // The leaves contain a hash of the transaction hash and transaction signature. + Transactions *Patricia `protobuf:"bytes,8,opt,name=transactions,proto3" json:"transactions,omitempty"` // By order of execution. TBD: required? the client can execute (powerful machine) and match state diff + Events *Patricia `protobuf:"bytes,9,opt,name=events,proto3" json:"events,omitempty"` // By order of issuance. TBD: in receipts? + Receipts *Hash `protobuf:"bytes,10,opt,name=receipts,proto3" json:"receipts,omitempty"` // By order of issuance. This is a patricia root. No need for length because it's the same length as transactions. + ProtocolVersion string `protobuf:"bytes,11,opt,name=protocol_version,json=protocolVersion,proto3" json:"protocol_version,omitempty"` // Starknet version + GasPriceFri *Uint128 `protobuf:"bytes,12,opt,name=gas_price_fri,json=gasPriceFri,proto3" json:"gas_price_fri,omitempty"` + GasPriceWei *Uint128 `protobuf:"bytes,13,opt,name=gas_price_wei,json=gasPriceWei,proto3" json:"gas_price_wei,omitempty"` + DataGasPriceFri *Uint128 `protobuf:"bytes,14,opt,name=data_gas_price_fri,json=dataGasPriceFri,proto3" json:"data_gas_price_fri,omitempty"` + DataGasPriceWei *Uint128 `protobuf:"bytes,15,opt,name=data_gas_price_wei,json=dataGasPriceWei,proto3" json:"data_gas_price_wei,omitempty"` + L1DataAvailabilityMode L1DataAvailabilityMode `protobuf:"varint,16,opt,name=l1_data_availability_mode,json=l1DataAvailabilityMode,proto3,enum=L1DataAvailabilityMode" json:"l1_data_availability_mode,omitempty"` + // for now, we assume a small consensus, so this fits in 1M. Else, these will be repeated and extracted from this message. + Signatures []*ConsensusSignature `protobuf:"bytes,17,rep,name=signatures,proto3" json:"signatures,omitempty"` // can be more explicit here about the signature structure as this is not part of account abstraction +} + +func (x *SignedBlockHeader) Reset() { + *x = SignedBlockHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_header_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedBlockHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedBlockHeader) ProtoMessage() {} + +func (x *SignedBlockHeader) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_header_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedBlockHeader.ProtoReflect.Descriptor instead. +func (*SignedBlockHeader) Descriptor() ([]byte, []int) { + return file_p2p_proto_header_proto_rawDescGZIP(), []int{0} +} + +func (x *SignedBlockHeader) GetBlockHash() *Hash { + if x != nil { + return x.BlockHash + } + return nil +} + +func (x *SignedBlockHeader) GetParentHash() *Hash { + if x != nil { + return x.ParentHash + } + return nil +} + +func (x *SignedBlockHeader) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *SignedBlockHeader) GetTime() uint64 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *SignedBlockHeader) GetSequencerAddress() *Address { + if x != nil { + return x.SequencerAddress + } + return nil +} + +func (x *SignedBlockHeader) GetStateRoot() *Hash { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *SignedBlockHeader) GetStateDiffCommitment() *StateDiffCommitment { + if x != nil { + return x.StateDiffCommitment + } + return nil +} + +func (x *SignedBlockHeader) GetTransactions() *Patricia { + if x != nil { + return x.Transactions + } + return nil +} + +func (x *SignedBlockHeader) GetEvents() *Patricia { + if x != nil { + return x.Events + } + return nil +} + +func (x *SignedBlockHeader) GetReceipts() *Hash { + if x != nil { + return x.Receipts + } + return nil +} + +func (x *SignedBlockHeader) GetProtocolVersion() string { + if x != nil { + return x.ProtocolVersion + } + return "" +} + +func (x *SignedBlockHeader) GetGasPriceFri() *Uint128 { + if x != nil { + return x.GasPriceFri + } + return nil +} + +func (x *SignedBlockHeader) GetGasPriceWei() *Uint128 { + if x != nil { + return x.GasPriceWei + } + return nil +} + +func (x *SignedBlockHeader) GetDataGasPriceFri() *Uint128 { + if x != nil { + return x.DataGasPriceFri + } + return nil +} + +func (x *SignedBlockHeader) GetDataGasPriceWei() *Uint128 { + if x != nil { + return x.DataGasPriceWei + } + return nil +} + +func (x *SignedBlockHeader) GetL1DataAvailabilityMode() L1DataAvailabilityMode { + if x != nil { + return x.L1DataAvailabilityMode + } + return L1DataAvailabilityMode_Calldata +} + +func (x *SignedBlockHeader) GetSignatures() []*ConsensusSignature { + if x != nil { + return x.Signatures + } + return nil +} + +// sent to all peers (except the ones this was received from, if any). +// for a fraction of peers, also send the GetBlockHeaders response (as if they asked for it for this block) +type NewBlock struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to MaybeFull: + // + // *NewBlock_Id + // *NewBlock_Header + MaybeFull isNewBlock_MaybeFull `protobuf_oneof:"maybe_full"` +} + +func (x *NewBlock) Reset() { + *x = NewBlock{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_header_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewBlock) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewBlock) ProtoMessage() {} + +func (x *NewBlock) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_header_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewBlock.ProtoReflect.Descriptor instead. +func (*NewBlock) Descriptor() ([]byte, []int) { + return file_p2p_proto_header_proto_rawDescGZIP(), []int{1} +} + +func (m *NewBlock) GetMaybeFull() isNewBlock_MaybeFull { + if m != nil { + return m.MaybeFull + } + return nil +} + +func (x *NewBlock) GetId() *BlockID { + if x, ok := x.GetMaybeFull().(*NewBlock_Id); ok { + return x.Id + } + return nil +} + +func (x *NewBlock) GetHeader() *BlockHeadersResponse { + if x, ok := x.GetMaybeFull().(*NewBlock_Header); ok { + return x.Header + } + return nil +} + +type isNewBlock_MaybeFull interface { + isNewBlock_MaybeFull() +} + +type NewBlock_Id struct { + Id *BlockID `protobuf:"bytes,1,opt,name=id,proto3,oneof"` +} + +type NewBlock_Header struct { + Header *BlockHeadersResponse `protobuf:"bytes,2,opt,name=header,proto3,oneof"` +} + +func (*NewBlock_Id) isNewBlock_MaybeFull() {} + +func (*NewBlock_Header) isNewBlock_MaybeFull() {} + +type BlockHeadersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` +} + +func (x *BlockHeadersRequest) Reset() { + *x = BlockHeadersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_header_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockHeadersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockHeadersRequest) ProtoMessage() {} + +func (x *BlockHeadersRequest) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_header_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockHeadersRequest.ProtoReflect.Descriptor instead. +func (*BlockHeadersRequest) Descriptor() ([]byte, []int) { + return file_p2p_proto_header_proto_rawDescGZIP(), []int{2} +} + +func (x *BlockHeadersRequest) GetIteration() *Iteration { + if x != nil { + return x.Iteration + } + return nil +} + +// Responses are sent ordered by the order given in the request. +type BlockHeadersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to HeaderMessage: + // + // *BlockHeadersResponse_Header + // *BlockHeadersResponse_Fin + HeaderMessage isBlockHeadersResponse_HeaderMessage `protobuf_oneof:"header_message"` +} + +func (x *BlockHeadersResponse) Reset() { + *x = BlockHeadersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_header_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockHeadersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockHeadersResponse) ProtoMessage() {} + +func (x *BlockHeadersResponse) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_header_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockHeadersResponse.ProtoReflect.Descriptor instead. +func (*BlockHeadersResponse) Descriptor() ([]byte, []int) { + return file_p2p_proto_header_proto_rawDescGZIP(), []int{3} +} + +func (m *BlockHeadersResponse) GetHeaderMessage() isBlockHeadersResponse_HeaderMessage { + if m != nil { + return m.HeaderMessage + } + return nil +} + +func (x *BlockHeadersResponse) GetHeader() *SignedBlockHeader { + if x, ok := x.GetHeaderMessage().(*BlockHeadersResponse_Header); ok { + return x.Header + } + return nil +} + +func (x *BlockHeadersResponse) GetFin() *Fin { + if x, ok := x.GetHeaderMessage().(*BlockHeadersResponse_Fin); ok { + return x.Fin + } + return nil +} + +type isBlockHeadersResponse_HeaderMessage interface { + isBlockHeadersResponse_HeaderMessage() +} + +type BlockHeadersResponse_Header struct { + Header *SignedBlockHeader `protobuf:"bytes,1,opt,name=header,proto3,oneof"` +} + +type BlockHeadersResponse_Fin struct { + Fin *Fin `protobuf:"bytes,2,opt,name=fin,proto3,oneof"` // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its header. +} + +func (*BlockHeadersResponse_Header) isBlockHeadersResponse_HeaderMessage() {} + +func (*BlockHeadersResponse_Fin) isBlockHeadersResponse_HeaderMessage() {} + +type BlockProof struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Proof [][]byte `protobuf:"bytes,1,rep,name=proof,proto3" json:"proof,omitempty"` +} + +func (x *BlockProof) Reset() { + *x = BlockProof{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_header_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockProof) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockProof) ProtoMessage() {} + +func (x *BlockProof) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_header_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockProof.ProtoReflect.Descriptor instead. +func (*BlockProof) Descriptor() ([]byte, []int) { + return file_p2p_proto_header_proto_rawDescGZIP(), []int{4} +} + +func (x *BlockProof) GetProof() [][]byte { + if x != nil { + return x.Proof + } + return nil +} + +var File_p2p_proto_header_proto protoreflect.FileDescriptor + +var file_p2p_proto_header_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xa7, 0x06, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x35, 0x0a, 0x11, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x10, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, + 0x73, 0x68, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x48, 0x0a, + 0x15, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x13, 0x73, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, 0x69, 0x61, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, 0x69, + 0x61, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x08, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x70, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, + 0x73, 0x68, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x0d, 0x67, 0x61, 0x73, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x72, 0x69, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, + 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x32, 0x38, 0x52, 0x0b, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x46, 0x72, 0x69, 0x12, 0x2c, 0x0a, 0x0d, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x55, + 0x69, 0x6e, 0x74, 0x31, 0x32, 0x38, 0x52, 0x0b, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x57, 0x65, 0x69, 0x12, 0x35, 0x0a, 0x12, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x67, 0x61, 0x73, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x72, 0x69, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x32, 0x38, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x47, + 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x46, 0x72, 0x69, 0x12, 0x35, 0x0a, 0x12, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x77, 0x65, 0x69, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x32, 0x38, + 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x57, 0x65, + 0x69, 0x12, 0x52, 0x0a, 0x19, 0x6c, 0x31, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x4c, 0x31, 0x44, 0x61, 0x74, 0x61, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x16, 0x6c, + 0x31, 0x44, 0x61, 0x74, 0x61, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x65, 0x6e, 0x73, 0x75, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x65, 0x0a, 0x08, 0x4e, 0x65, + 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x48, 0x00, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x22, 0x3f, 0x0a, 0x13, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x14, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, + 0x69, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x22, 0x0a, 0x0a, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x73, 0x74, + 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_p2p_proto_header_proto_rawDescOnce sync.Once + file_p2p_proto_header_proto_rawDescData = file_p2p_proto_header_proto_rawDesc +) + +func file_p2p_proto_header_proto_rawDescGZIP() []byte { + file_p2p_proto_header_proto_rawDescOnce.Do(func() { + file_p2p_proto_header_proto_rawDescData = protoimpl.X.CompressGZIP(file_p2p_proto_header_proto_rawDescData) + }) + return file_p2p_proto_header_proto_rawDescData +} + +var ( + file_p2p_proto_header_proto_msgTypes = make([]protoimpl.MessageInfo, 5) + file_p2p_proto_header_proto_goTypes = []interface{}{ + (*SignedBlockHeader)(nil), // 0: SignedBlockHeader + (*NewBlock)(nil), // 1: NewBlock + (*BlockHeadersRequest)(nil), // 2: BlockHeadersRequest + (*BlockHeadersResponse)(nil), // 3: BlockHeadersResponse + (*BlockProof)(nil), // 4: BlockProof + (*Hash)(nil), // 5: Hash + (*Address)(nil), // 6: Address + (*StateDiffCommitment)(nil), // 7: StateDiffCommitment + (*Patricia)(nil), // 8: Patricia + (*Uint128)(nil), // 9: Uint128 + (L1DataAvailabilityMode)(0), // 10: L1DataAvailabilityMode + (*ConsensusSignature)(nil), // 11: ConsensusSignature + (*BlockID)(nil), // 12: BlockID + (*Iteration)(nil), // 13: Iteration + (*Fin)(nil), // 14: Fin + } +) +var file_p2p_proto_header_proto_depIdxs = []int32{ + 5, // 0: SignedBlockHeader.block_hash:type_name -> Hash + 5, // 1: SignedBlockHeader.parent_hash:type_name -> Hash + 6, // 2: SignedBlockHeader.sequencer_address:type_name -> Address + 5, // 3: SignedBlockHeader.state_root:type_name -> Hash + 7, // 4: SignedBlockHeader.state_diff_commitment:type_name -> StateDiffCommitment + 8, // 5: SignedBlockHeader.transactions:type_name -> Patricia + 8, // 6: SignedBlockHeader.events:type_name -> Patricia + 5, // 7: SignedBlockHeader.receipts:type_name -> Hash + 9, // 8: SignedBlockHeader.gas_price_fri:type_name -> Uint128 + 9, // 9: SignedBlockHeader.gas_price_wei:type_name -> Uint128 + 9, // 10: SignedBlockHeader.data_gas_price_fri:type_name -> Uint128 + 9, // 11: SignedBlockHeader.data_gas_price_wei:type_name -> Uint128 + 10, // 12: SignedBlockHeader.l1_data_availability_mode:type_name -> L1DataAvailabilityMode + 11, // 13: SignedBlockHeader.signatures:type_name -> ConsensusSignature + 12, // 14: NewBlock.id:type_name -> BlockID + 3, // 15: NewBlock.header:type_name -> BlockHeadersResponse + 13, // 16: BlockHeadersRequest.iteration:type_name -> Iteration + 0, // 17: BlockHeadersResponse.header:type_name -> SignedBlockHeader + 14, // 18: BlockHeadersResponse.fin:type_name -> Fin + 19, // [19:19] is the sub-list for method output_type + 19, // [19:19] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name +} + +func init() { file_p2p_proto_header_proto_init() } +func file_p2p_proto_header_proto_init() { + if File_p2p_proto_header_proto != nil { + return + } + file_p2p_proto_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_p2p_proto_header_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedBlockHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_header_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewBlock); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_header_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockHeadersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_header_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockHeadersResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_header_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockProof); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_p2p_proto_header_proto_msgTypes[1].OneofWrappers = []interface{}{ + (*NewBlock_Id)(nil), + (*NewBlock_Header)(nil), + } + file_p2p_proto_header_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*BlockHeadersResponse_Header)(nil), + (*BlockHeadersResponse_Fin)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_p2p_proto_header_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_p2p_proto_header_proto_goTypes, + DependencyIndexes: file_p2p_proto_header_proto_depIdxs, + MessageInfos: file_p2p_proto_header_proto_msgTypes, + }.Build() + File_p2p_proto_header_proto = out.File + file_p2p_proto_header_proto_rawDesc = nil + file_p2p_proto_header_proto_goTypes = nil + file_p2p_proto_header_proto_depIdxs = nil +} diff --git a/p2p/starknet/spec/receipt.pb.go b/p2p/starknet/spec/receipt.pb.go index d760772b2b..680e7dceb1 100644 --- a/p2p/starknet/spec/receipt.pb.go +++ b/p2p/starknet/spec/receipt.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.26.0 +// protoc v4.25.1 // source: p2p/proto/receipt.proto package spec @@ -21,14 +21,60 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type PriceUnit int32 + +const ( + PriceUnit_Wei PriceUnit = 0 + PriceUnit_Fri PriceUnit = 1 +) + +// Enum value maps for PriceUnit. +var ( + PriceUnit_name = map[int32]string{ + 0: "Wei", + 1: "Fri", + } + PriceUnit_value = map[string]int32{ + "Wei": 0, + "Fri": 1, + } +) + +func (x PriceUnit) Enum() *PriceUnit { + p := new(PriceUnit) + *p = x + return p +} + +func (x PriceUnit) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PriceUnit) Descriptor() protoreflect.EnumDescriptor { + return file_p2p_proto_receipt_proto_enumTypes[0].Descriptor() +} + +func (PriceUnit) Type() protoreflect.EnumType { + return &file_p2p_proto_receipt_proto_enumTypes[0] +} + +func (x PriceUnit) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PriceUnit.Descriptor instead. +func (PriceUnit) EnumDescriptor() ([]byte, []int) { + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{0} +} + type MessageToL1 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FromAddress *Felt252 `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` - Payload []*Felt252 `protobuf:"bytes,2,rep,name=payload,proto3" json:"payload,omitempty"` - ToAddress *EthereumAddress `protobuf:"bytes,3,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"` + FromAddress *Felt252 `protobuf:"bytes,2,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` + Payload []*Felt252 `protobuf:"bytes,3,rep,name=payload,proto3" json:"payload,omitempty"` + ToAddress *EthereumAddress `protobuf:"bytes,4,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"` } func (x *MessageToL1) Reset() { @@ -131,85 +177,6 @@ func (x *EthereumAddress) GetElements() []byte { return nil } -type MessageToL2 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FromAddress *EthereumAddress `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` - Payload []*Felt252 `protobuf:"bytes,2,rep,name=payload,proto3" json:"payload,omitempty"` - ToAddress *Felt252 `protobuf:"bytes,3,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"` - EntryPointSelector *Felt252 `protobuf:"bytes,4,opt,name=entry_point_selector,json=entryPointSelector,proto3" json:"entry_point_selector,omitempty"` - Nonce *Felt252 `protobuf:"bytes,5,opt,name=nonce,proto3" json:"nonce,omitempty"` -} - -func (x *MessageToL2) Reset() { - *x = MessageToL2{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MessageToL2) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MessageToL2) ProtoMessage() {} - -func (x *MessageToL2) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MessageToL2.ProtoReflect.Descriptor instead. -func (*MessageToL2) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2} -} - -func (x *MessageToL2) GetFromAddress() *EthereumAddress { - if x != nil { - return x.FromAddress - } - return nil -} - -func (x *MessageToL2) GetPayload() []*Felt252 { - if x != nil { - return x.Payload - } - return nil -} - -func (x *MessageToL2) GetToAddress() *Felt252 { - if x != nil { - return x.ToAddress - } - return nil -} - -func (x *MessageToL2) GetEntryPointSelector() *Felt252 { - if x != nil { - return x.EntryPointSelector - } - return nil -} - -func (x *MessageToL2) GetNonce() *Felt252 { - if x != nil { - return x.Nonce - } - return nil -} - type Receipt struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -228,7 +195,7 @@ type Receipt struct { func (x *Receipt) Reset() { *x = Receipt{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[3] + mi := &file_p2p_proto_receipt_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -241,7 +208,7 @@ func (x *Receipt) String() string { func (*Receipt) ProtoMessage() {} func (x *Receipt) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[3] + mi := &file_p2p_proto_receipt_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -254,7 +221,7 @@ func (x *Receipt) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt.ProtoReflect.Descriptor instead. func (*Receipt) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2} } func (m *Receipt) GetType() isReceipt_Type { @@ -333,189 +300,6 @@ func (*Receipt_DeprecatedDeploy) isReceipt_Type() {} func (*Receipt_DeployAccount_) isReceipt_Type() {} -type ReceiptsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` -} - -func (x *ReceiptsRequest) Reset() { - *x = ReceiptsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReceiptsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReceiptsRequest) ProtoMessage() {} - -func (x *ReceiptsRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReceiptsRequest.ProtoReflect.Descriptor instead. -func (*ReceiptsRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{4} -} - -func (x *ReceiptsRequest) GetIteration() *Iteration { - if x != nil { - return x.Iteration - } - return nil -} - -type Receipts struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Items []*Receipt `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"` -} - -func (x *Receipts) Reset() { - *x = Receipts{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Receipts) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Receipts) ProtoMessage() {} - -func (x *Receipts) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Receipts.ProtoReflect.Descriptor instead. -func (*Receipts) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{5} -} - -func (x *Receipts) GetItems() []*Receipt { - if x != nil { - return x.Items - } - return nil -} - -type ReceiptsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id *BlockID `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to Responses: - // - // *ReceiptsResponse_Receipts - // *ReceiptsResponse_Fin - Responses isReceiptsResponse_Responses `protobuf_oneof:"responses"` -} - -func (x *ReceiptsResponse) Reset() { - *x = ReceiptsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReceiptsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReceiptsResponse) ProtoMessage() {} - -func (x *ReceiptsResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReceiptsResponse.ProtoReflect.Descriptor instead. -func (*ReceiptsResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{6} -} - -func (x *ReceiptsResponse) GetId() *BlockID { - if x != nil { - return x.Id - } - return nil -} - -func (m *ReceiptsResponse) GetResponses() isReceiptsResponse_Responses { - if m != nil { - return m.Responses - } - return nil -} - -func (x *ReceiptsResponse) GetReceipts() *Receipts { - if x, ok := x.GetResponses().(*ReceiptsResponse_Receipts); ok { - return x.Receipts - } - return nil -} - -func (x *ReceiptsResponse) GetFin() *Fin { - if x, ok := x.GetResponses().(*ReceiptsResponse_Fin); ok { - return x.Fin - } - return nil -} - -type isReceiptsResponse_Responses interface { - isReceiptsResponse_Responses() -} - -type ReceiptsResponse_Receipts struct { - Receipts *Receipts `protobuf:"bytes,2,opt,name=receipts,proto3,oneof"` -} - -type ReceiptsResponse_Fin struct { - Fin *Fin `protobuf:"bytes,3,opt,name=fin,proto3,oneof"` -} - -func (*ReceiptsResponse_Receipts) isReceiptsResponse_Responses() {} - -func (*ReceiptsResponse_Fin) isReceiptsResponse_Responses() {} - type Receipt_ExecutionResources struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -524,12 +308,14 @@ type Receipt_ExecutionResources struct { Builtins *Receipt_ExecutionResources_BuiltinCounter `protobuf:"bytes,1,opt,name=builtins,proto3" json:"builtins,omitempty"` Steps uint32 `protobuf:"varint,2,opt,name=steps,proto3" json:"steps,omitempty"` MemoryHoles uint32 `protobuf:"varint,3,opt,name=memory_holes,json=memoryHoles,proto3" json:"memory_holes,omitempty"` + L1Gas *Felt252 `protobuf:"bytes,4,opt,name=l1_gas,json=l1Gas,proto3" json:"l1_gas,omitempty"` + L1DataGas *Felt252 `protobuf:"bytes,5,opt,name=l1_data_gas,json=l1DataGas,proto3" json:"l1_data_gas,omitempty"` } func (x *Receipt_ExecutionResources) Reset() { *x = Receipt_ExecutionResources{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[7] + mi := &file_p2p_proto_receipt_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -542,7 +328,7 @@ func (x *Receipt_ExecutionResources) String() string { func (*Receipt_ExecutionResources) ProtoMessage() {} func (x *Receipt_ExecutionResources) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[7] + mi := &file_p2p_proto_receipt_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -555,7 +341,7 @@ func (x *Receipt_ExecutionResources) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_ExecutionResources.ProtoReflect.Descriptor instead. func (*Receipt_ExecutionResources) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 0} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 0} } func (x *Receipt_ExecutionResources) GetBuiltins() *Receipt_ExecutionResources_BuiltinCounter { @@ -579,23 +365,36 @@ func (x *Receipt_ExecutionResources) GetMemoryHoles() uint32 { return 0 } +func (x *Receipt_ExecutionResources) GetL1Gas() *Felt252 { + if x != nil { + return x.L1Gas + } + return nil +} + +func (x *Receipt_ExecutionResources) GetL1DataGas() *Felt252 { + if x != nil { + return x.L1DataGas + } + return nil +} + type Receipt_Common struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TransactionHash *Hash `protobuf:"bytes,1,opt,name=transaction_hash,json=transactionHash,proto3" json:"transaction_hash,omitempty"` ActualFee *Felt252 `protobuf:"bytes,2,opt,name=actual_fee,json=actualFee,proto3" json:"actual_fee,omitempty"` - MessagesSent []*MessageToL1 `protobuf:"bytes,3,rep,name=messages_sent,json=messagesSent,proto3" json:"messages_sent,omitempty"` - ExecutionResources *Receipt_ExecutionResources `protobuf:"bytes,4,opt,name=execution_resources,json=executionResources,proto3" json:"execution_resources,omitempty"` - RevertReason string `protobuf:"bytes,5,opt,name=revert_reason,json=revertReason,proto3" json:"revert_reason,omitempty"` - ConsumedMessage *MessageToL2 `protobuf:"bytes,6,opt,name=consumed_message,json=consumedMessage,proto3,oneof" json:"consumed_message,omitempty"` + PriceUnit PriceUnit `protobuf:"varint,3,opt,name=price_unit,json=priceUnit,proto3,enum=PriceUnit" json:"price_unit,omitempty"` + MessagesSent []*MessageToL1 `protobuf:"bytes,4,rep,name=messages_sent,json=messagesSent,proto3" json:"messages_sent,omitempty"` + ExecutionResources *Receipt_ExecutionResources `protobuf:"bytes,5,opt,name=execution_resources,json=executionResources,proto3" json:"execution_resources,omitempty"` + RevertReason *string `protobuf:"bytes,6,opt,name=revert_reason,json=revertReason,proto3,oneof" json:"revert_reason,omitempty"` } func (x *Receipt_Common) Reset() { *x = Receipt_Common{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[8] + mi := &file_p2p_proto_receipt_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -608,7 +407,7 @@ func (x *Receipt_Common) String() string { func (*Receipt_Common) ProtoMessage() {} func (x *Receipt_Common) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[8] + mi := &file_p2p_proto_receipt_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -621,21 +420,21 @@ func (x *Receipt_Common) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_Common.ProtoReflect.Descriptor instead. func (*Receipt_Common) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 1} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 1} } -func (x *Receipt_Common) GetTransactionHash() *Hash { +func (x *Receipt_Common) GetActualFee() *Felt252 { if x != nil { - return x.TransactionHash + return x.ActualFee } return nil } -func (x *Receipt_Common) GetActualFee() *Felt252 { +func (x *Receipt_Common) GetPriceUnit() PriceUnit { if x != nil { - return x.ActualFee + return x.PriceUnit } - return nil + return PriceUnit_Wei } func (x *Receipt_Common) GetMessagesSent() []*MessageToL1 { @@ -653,19 +452,12 @@ func (x *Receipt_Common) GetExecutionResources() *Receipt_ExecutionResources { } func (x *Receipt_Common) GetRevertReason() string { - if x != nil { - return x.RevertReason + if x != nil && x.RevertReason != nil { + return *x.RevertReason } return "" } -func (x *Receipt_Common) GetConsumedMessage() *MessageToL2 { - if x != nil { - return x.ConsumedMessage - } - return nil -} - type Receipt_Invoke struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -677,7 +469,7 @@ type Receipt_Invoke struct { func (x *Receipt_Invoke) Reset() { *x = Receipt_Invoke{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[9] + mi := &file_p2p_proto_receipt_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -690,7 +482,7 @@ func (x *Receipt_Invoke) String() string { func (*Receipt_Invoke) ProtoMessage() {} func (x *Receipt_Invoke) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[9] + mi := &file_p2p_proto_receipt_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -703,7 +495,7 @@ func (x *Receipt_Invoke) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_Invoke.ProtoReflect.Descriptor instead. func (*Receipt_Invoke) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 2} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 2} } func (x *Receipt_Invoke) GetCommon() *Receipt_Common { @@ -725,7 +517,7 @@ type Receipt_L1Handler struct { func (x *Receipt_L1Handler) Reset() { *x = Receipt_L1Handler{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[10] + mi := &file_p2p_proto_receipt_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -738,7 +530,7 @@ func (x *Receipt_L1Handler) String() string { func (*Receipt_L1Handler) ProtoMessage() {} func (x *Receipt_L1Handler) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[10] + mi := &file_p2p_proto_receipt_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -751,7 +543,7 @@ func (x *Receipt_L1Handler) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_L1Handler.ProtoReflect.Descriptor instead. func (*Receipt_L1Handler) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 3} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 3} } func (x *Receipt_L1Handler) GetCommon() *Receipt_Common { @@ -779,7 +571,7 @@ type Receipt_Declare struct { func (x *Receipt_Declare) Reset() { *x = Receipt_Declare{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[11] + mi := &file_p2p_proto_receipt_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -792,7 +584,7 @@ func (x *Receipt_Declare) String() string { func (*Receipt_Declare) ProtoMessage() {} func (x *Receipt_Declare) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[11] + mi := &file_p2p_proto_receipt_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -805,7 +597,7 @@ func (x *Receipt_Declare) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_Declare.ProtoReflect.Descriptor instead. func (*Receipt_Declare) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 4} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 4} } func (x *Receipt_Declare) GetCommon() *Receipt_Common { @@ -827,7 +619,7 @@ type Receipt_Deploy struct { func (x *Receipt_Deploy) Reset() { *x = Receipt_Deploy{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[12] + mi := &file_p2p_proto_receipt_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -840,7 +632,7 @@ func (x *Receipt_Deploy) String() string { func (*Receipt_Deploy) ProtoMessage() {} func (x *Receipt_Deploy) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[12] + mi := &file_p2p_proto_receipt_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -853,7 +645,7 @@ func (x *Receipt_Deploy) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_Deploy.ProtoReflect.Descriptor instead. func (*Receipt_Deploy) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 5} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 5} } func (x *Receipt_Deploy) GetCommon() *Receipt_Common { @@ -882,7 +674,7 @@ type Receipt_DeployAccount struct { func (x *Receipt_DeployAccount) Reset() { *x = Receipt_DeployAccount{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[13] + mi := &file_p2p_proto_receipt_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -895,7 +687,7 @@ func (x *Receipt_DeployAccount) String() string { func (*Receipt_DeployAccount) ProtoMessage() {} func (x *Receipt_DeployAccount) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[13] + mi := &file_p2p_proto_receipt_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -908,7 +700,7 @@ func (x *Receipt_DeployAccount) ProtoReflect() protoreflect.Message { // Deprecated: Use Receipt_DeployAccount.ProtoReflect.Descriptor instead. func (*Receipt_DeployAccount) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 6} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 6} } func (x *Receipt_DeployAccount) GetCommon() *Receipt_Common { @@ -943,7 +735,7 @@ type Receipt_ExecutionResources_BuiltinCounter struct { func (x *Receipt_ExecutionResources_BuiltinCounter) Reset() { *x = Receipt_ExecutionResources_BuiltinCounter{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_receipt_proto_msgTypes[14] + mi := &file_p2p_proto_receipt_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -956,7 +748,7 @@ func (x *Receipt_ExecutionResources_BuiltinCounter) String() string { func (*Receipt_ExecutionResources_BuiltinCounter) ProtoMessage() {} func (x *Receipt_ExecutionResources_BuiltinCounter) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_receipt_proto_msgTypes[14] + mi := &file_p2p_proto_receipt_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -969,7 +761,7 @@ func (x *Receipt_ExecutionResources_BuiltinCounter) ProtoReflect() protoreflect. // Deprecated: Use Receipt_ExecutionResources_BuiltinCounter.ProtoReflect.Descriptor instead. func (*Receipt_ExecutionResources_BuiltinCounter) Descriptor() ([]byte, []int) { - return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{3, 0, 0} + return file_p2p_proto_receipt_proto_rawDescGZIP(), []int{2, 0, 0} } func (x *Receipt_ExecutionResources_BuiltinCounter) GetBitwise() uint32 { @@ -1036,136 +828,112 @@ var file_p2p_proto_receipt_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x4c, 0x31, 0x12, 0x2b, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, - 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2d, 0x0a, 0x0f, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, - 0x4c, 0x32, 0x12, 0x33, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, - 0x35, 0x32, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x74, - 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x3a, 0x0a, 0x14, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x12, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x22, 0x8e, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x29, 0x0a, 0x06, - 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x48, 0x00, 0x52, - 0x06, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x33, 0x0a, 0x0a, 0x6c, 0x31, 0x5f, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x09, 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x07, - 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x48, - 0x00, 0x52, 0x07, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x12, 0x3e, 0x0a, 0x11, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x48, 0x00, 0x52, 0x10, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x3f, 0x0a, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xf6, 0x02, 0x0a, 0x12, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x12, 0x46, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x45, + 0x74, 0x73, 0x22, 0x96, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x29, + 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x48, + 0x00, 0x52, 0x06, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x33, 0x0a, 0x0a, 0x6c, 0x31, 0x5f, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x2c, + 0x0a, 0x07, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x12, 0x3e, 0x0a, 0x11, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, + 0x74, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x48, 0x00, 0x52, 0x10, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x3f, 0x0a, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xc1, 0x03, + 0x0a, 0x12, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, + 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x52, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x65, + 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x68, 0x6f, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x48, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x06, 0x6c, 0x31, 0x5f, 0x67, 0x61, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, + 0x05, 0x6c, 0x31, 0x47, 0x61, 0x73, 0x12, 0x28, 0x0a, 0x0b, 0x6c, 0x31, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, + 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x09, 0x6c, 0x31, 0x44, 0x61, 0x74, 0x61, 0x47, 0x61, 0x73, + 0x1a, 0xde, 0x01, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x63, 0x64, 0x73, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x63, + 0x64, 0x73, 0x61, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x63, 0x5f, 0x6f, 0x70, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x65, 0x63, 0x4f, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x65, 0x64, 0x65, + 0x72, 0x73, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x65, 0x64, 0x65, + 0x72, 0x73, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x65, 0x69, 0x64, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x65, 0x69, 0x64, 0x6f, + 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6b, 0x65, 0x63, 0x63, 0x61, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x6b, 0x65, 0x63, 0x63, 0x61, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x1a, 0x99, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0a, + 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x09, 0x61, 0x63, 0x74, 0x75, + 0x61, 0x6c, 0x46, 0x65, 0x65, 0x12, 0x29, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x75, + 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x09, 0x70, 0x72, 0x69, 0x63, 0x65, 0x55, 0x6e, 0x69, 0x74, + 0x12, 0x31, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x4c, 0x31, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x53, + 0x65, 0x6e, 0x74, 0x12, 0x4c, 0x0a, 0x13, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, - 0x52, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x68, 0x6f, 0x6c, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x48, 0x6f, - 0x6c, 0x65, 0x73, 0x1a, 0xde, 0x01, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x63, 0x64, 0x73, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x65, 0x63, 0x64, 0x73, 0x61, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x63, 0x5f, 0x6f, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x65, 0x63, 0x4f, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x65, 0x64, 0x65, 0x72, 0x73, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, - 0x65, 0x64, 0x65, 0x72, 0x73, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x65, - 0x69, 0x64, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x65, - 0x69, 0x64, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6b, 0x65, 0x63, 0x63, 0x61, 0x6b, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6b, 0x65, 0x63, 0x63, 0x61, 0x6b, 0x12, 0x16, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x1a, 0xdc, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, - 0x30, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, - 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, - 0x09, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x65, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x4c, 0x31, 0x52, - 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x4c, 0x0a, - 0x13, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x12, 0x3c, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x4c, 0x32, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x73, - 0x75, 0x6d, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, - 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x1a, 0x31, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x27, 0x0a, + 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x31, 0x0a, + 0x06, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x1a, 0x56, 0x0a, 0x09, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x56, 0x0a, 0x09, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x07, 0x6d, 0x73, 0x67, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x32, 0x0a, 0x07, 0x44, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x08, - 0x6d, 0x73, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, - 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x32, - 0x0a, 0x07, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x1a, 0x66, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x27, 0x0a, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x6d, 0x0a, 0x0d, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x06, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x3b, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, - 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x05, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x70, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x10, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1d, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x49, 0x44, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, - 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x09, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x48, 0x00, 0x52, 0x08, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, - 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x42, 0x05, - 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x66, 0x0a, 0x06, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, + 0x33, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, + 0x32, 0x35, 0x32, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x1a, 0x6d, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x33, + 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, + 0x35, 0x32, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x1d, 0x0a, 0x09, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x07, 0x0a, 0x03, 0x57, 0x65, 0x69, 0x10, + 0x00, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x72, 0x69, 0x10, 0x01, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, 0x70, 0x2f, + 0x73, 0x74, 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1181,69 +949,54 @@ func file_p2p_proto_receipt_proto_rawDescGZIP() []byte { } var ( - file_p2p_proto_receipt_proto_msgTypes = make([]protoimpl.MessageInfo, 15) - file_p2p_proto_receipt_proto_goTypes = []interface{}{ - (*MessageToL1)(nil), // 0: MessageToL1 - (*EthereumAddress)(nil), // 1: EthereumAddress - (*MessageToL2)(nil), // 2: MessageToL2 + file_p2p_proto_receipt_proto_enumTypes = make([]protoimpl.EnumInfo, 1) + file_p2p_proto_receipt_proto_msgTypes = make([]protoimpl.MessageInfo, 11) + file_p2p_proto_receipt_proto_goTypes = []interface{}{ + (PriceUnit)(0), // 0: PriceUnit + (*MessageToL1)(nil), // 1: MessageToL1 + (*EthereumAddress)(nil), // 2: EthereumAddress (*Receipt)(nil), // 3: Receipt - (*ReceiptsRequest)(nil), // 4: ReceiptsRequest - (*Receipts)(nil), // 5: Receipts - (*ReceiptsResponse)(nil), // 6: ReceiptsResponse - (*Receipt_ExecutionResources)(nil), // 7: Receipt.ExecutionResources - (*Receipt_Common)(nil), // 8: Receipt.Common - (*Receipt_Invoke)(nil), // 9: Receipt.Invoke - (*Receipt_L1Handler)(nil), // 10: Receipt.L1Handler - (*Receipt_Declare)(nil), // 11: Receipt.Declare - (*Receipt_Deploy)(nil), // 12: Receipt.Deploy - (*Receipt_DeployAccount)(nil), // 13: Receipt.DeployAccount - (*Receipt_ExecutionResources_BuiltinCounter)(nil), // 14: Receipt.ExecutionResources.BuiltinCounter - (*Felt252)(nil), // 15: Felt252 - (*Iteration)(nil), // 16: Iteration - (*BlockID)(nil), // 17: BlockID - (*Fin)(nil), // 18: Fin - (*Hash)(nil), // 19: Hash + (*Receipt_ExecutionResources)(nil), // 4: Receipt.ExecutionResources + (*Receipt_Common)(nil), // 5: Receipt.Common + (*Receipt_Invoke)(nil), // 6: Receipt.Invoke + (*Receipt_L1Handler)(nil), // 7: Receipt.L1Handler + (*Receipt_Declare)(nil), // 8: Receipt.Declare + (*Receipt_Deploy)(nil), // 9: Receipt.Deploy + (*Receipt_DeployAccount)(nil), // 10: Receipt.DeployAccount + (*Receipt_ExecutionResources_BuiltinCounter)(nil), // 11: Receipt.ExecutionResources.BuiltinCounter + (*Felt252)(nil), // 12: Felt252 + (*Hash)(nil), // 13: Hash } ) - var file_p2p_proto_receipt_proto_depIdxs = []int32{ - 15, // 0: MessageToL1.from_address:type_name -> Felt252 - 15, // 1: MessageToL1.payload:type_name -> Felt252 - 1, // 2: MessageToL1.to_address:type_name -> EthereumAddress - 1, // 3: MessageToL2.from_address:type_name -> EthereumAddress - 15, // 4: MessageToL2.payload:type_name -> Felt252 - 15, // 5: MessageToL2.to_address:type_name -> Felt252 - 15, // 6: MessageToL2.entry_point_selector:type_name -> Felt252 - 15, // 7: MessageToL2.nonce:type_name -> Felt252 - 9, // 8: Receipt.invoke:type_name -> Receipt.Invoke - 10, // 9: Receipt.l1_handler:type_name -> Receipt.L1Handler - 11, // 10: Receipt.declare:type_name -> Receipt.Declare - 12, // 11: Receipt.deprecated_deploy:type_name -> Receipt.Deploy - 13, // 12: Receipt.deploy_account:type_name -> Receipt.DeployAccount - 16, // 13: ReceiptsRequest.iteration:type_name -> Iteration - 3, // 14: Receipts.items:type_name -> Receipt - 17, // 15: ReceiptsResponse.id:type_name -> BlockID - 5, // 16: ReceiptsResponse.receipts:type_name -> Receipts - 18, // 17: ReceiptsResponse.fin:type_name -> Fin - 14, // 18: Receipt.ExecutionResources.builtins:type_name -> Receipt.ExecutionResources.BuiltinCounter - 19, // 19: Receipt.Common.transaction_hash:type_name -> Hash - 15, // 20: Receipt.Common.actual_fee:type_name -> Felt252 - 0, // 21: Receipt.Common.messages_sent:type_name -> MessageToL1 - 7, // 22: Receipt.Common.execution_resources:type_name -> Receipt.ExecutionResources - 2, // 23: Receipt.Common.consumed_message:type_name -> MessageToL2 - 8, // 24: Receipt.Invoke.common:type_name -> Receipt.Common - 8, // 25: Receipt.L1Handler.common:type_name -> Receipt.Common - 19, // 26: Receipt.L1Handler.msg_hash:type_name -> Hash - 8, // 27: Receipt.Declare.common:type_name -> Receipt.Common - 8, // 28: Receipt.Deploy.common:type_name -> Receipt.Common - 15, // 29: Receipt.Deploy.contract_address:type_name -> Felt252 - 8, // 30: Receipt.DeployAccount.common:type_name -> Receipt.Common - 15, // 31: Receipt.DeployAccount.contract_address:type_name -> Felt252 - 32, // [32:32] is the sub-list for method output_type - 32, // [32:32] is the sub-list for method input_type - 32, // [32:32] is the sub-list for extension type_name - 32, // [32:32] is the sub-list for extension extendee - 0, // [0:32] is the sub-list for field type_name + 12, // 0: MessageToL1.from_address:type_name -> Felt252 + 12, // 1: MessageToL1.payload:type_name -> Felt252 + 2, // 2: MessageToL1.to_address:type_name -> EthereumAddress + 6, // 3: Receipt.invoke:type_name -> Receipt.Invoke + 7, // 4: Receipt.l1_handler:type_name -> Receipt.L1Handler + 8, // 5: Receipt.declare:type_name -> Receipt.Declare + 9, // 6: Receipt.deprecated_deploy:type_name -> Receipt.Deploy + 10, // 7: Receipt.deploy_account:type_name -> Receipt.DeployAccount + 11, // 8: Receipt.ExecutionResources.builtins:type_name -> Receipt.ExecutionResources.BuiltinCounter + 12, // 9: Receipt.ExecutionResources.l1_gas:type_name -> Felt252 + 12, // 10: Receipt.ExecutionResources.l1_data_gas:type_name -> Felt252 + 12, // 11: Receipt.Common.actual_fee:type_name -> Felt252 + 0, // 12: Receipt.Common.price_unit:type_name -> PriceUnit + 1, // 13: Receipt.Common.messages_sent:type_name -> MessageToL1 + 4, // 14: Receipt.Common.execution_resources:type_name -> Receipt.ExecutionResources + 5, // 15: Receipt.Invoke.common:type_name -> Receipt.Common + 5, // 16: Receipt.L1Handler.common:type_name -> Receipt.Common + 13, // 17: Receipt.L1Handler.msg_hash:type_name -> Hash + 5, // 18: Receipt.Declare.common:type_name -> Receipt.Common + 5, // 19: Receipt.Deploy.common:type_name -> Receipt.Common + 12, // 20: Receipt.Deploy.contract_address:type_name -> Felt252 + 5, // 21: Receipt.DeployAccount.common:type_name -> Receipt.Common + 12, // 22: Receipt.DeployAccount.contract_address:type_name -> Felt252 + 23, // [23:23] is the sub-list for method output_type + 23, // [23:23] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_p2p_proto_receipt_proto_init() } @@ -1278,18 +1031,6 @@ func file_p2p_proto_receipt_proto_init() { } } file_p2p_proto_receipt_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MessageToL2); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_receipt_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt); i { case 0: return &v.state @@ -1301,43 +1042,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReceiptsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_receipt_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Receipts); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_receipt_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReceiptsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_receipt_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_ExecutionResources); i { case 0: return &v.state @@ -1349,7 +1054,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_Common); i { case 0: return &v.state @@ -1361,7 +1066,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_Invoke); i { case 0: return &v.state @@ -1373,7 +1078,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_L1Handler); i { case 0: return &v.state @@ -1385,7 +1090,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_Declare); i { case 0: return &v.state @@ -1397,7 +1102,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_Deploy); i { case 0: return &v.state @@ -1409,7 +1114,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_DeployAccount); i { case 0: return &v.state @@ -1421,7 +1126,7 @@ func file_p2p_proto_receipt_proto_init() { return nil } } - file_p2p_proto_receipt_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_p2p_proto_receipt_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Receipt_ExecutionResources_BuiltinCounter); i { case 0: return &v.state @@ -1434,30 +1139,27 @@ func file_p2p_proto_receipt_proto_init() { } } } - file_p2p_proto_receipt_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_p2p_proto_receipt_proto_msgTypes[2].OneofWrappers = []interface{}{ (*Receipt_Invoke_)(nil), (*Receipt_L1Handler_)(nil), (*Receipt_Declare_)(nil), (*Receipt_DeprecatedDeploy)(nil), (*Receipt_DeployAccount_)(nil), } - file_p2p_proto_receipt_proto_msgTypes[6].OneofWrappers = []interface{}{ - (*ReceiptsResponse_Receipts)(nil), - (*ReceiptsResponse_Fin)(nil), - } - file_p2p_proto_receipt_proto_msgTypes[8].OneofWrappers = []interface{}{} + file_p2p_proto_receipt_proto_msgTypes[4].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_p2p_proto_receipt_proto_rawDesc, - NumEnums: 0, - NumMessages: 15, + NumEnums: 1, + NumMessages: 11, NumExtensions: 0, NumServices: 0, }, GoTypes: file_p2p_proto_receipt_proto_goTypes, DependencyIndexes: file_p2p_proto_receipt_proto_depIdxs, + EnumInfos: file_p2p_proto_receipt_proto_enumTypes, MessageInfos: file_p2p_proto_receipt_proto_msgTypes, }.Build() File_p2p_proto_receipt_proto = out.File diff --git a/p2p/starknet/spec/snapshot.pb.go b/p2p/starknet/spec/snapshot.pb.go deleted file mode 100644 index c33f7ce135..0000000000 --- a/p2p/starknet/spec/snapshot.pb.go +++ /dev/null @@ -1,1509 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 -// source: p2p/proto/snapshot.proto - -package spec - -import ( - reflect "reflect" - sync "sync" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type PatriciaNode struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Node: - // - // *PatriciaNode_Edge_ - // *PatriciaNode_Binary_ - Node isPatriciaNode_Node `protobuf_oneof:"node"` -} - -func (x *PatriciaNode) Reset() { - *x = PatriciaNode{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PatriciaNode) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PatriciaNode) ProtoMessage() {} - -func (x *PatriciaNode) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PatriciaNode.ProtoReflect.Descriptor instead. -func (*PatriciaNode) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{0} -} - -func (m *PatriciaNode) GetNode() isPatriciaNode_Node { - if m != nil { - return m.Node - } - return nil -} - -func (x *PatriciaNode) GetEdge() *PatriciaNode_Edge { - if x, ok := x.GetNode().(*PatriciaNode_Edge_); ok { - return x.Edge - } - return nil -} - -func (x *PatriciaNode) GetBinary() *PatriciaNode_Binary { - if x, ok := x.GetNode().(*PatriciaNode_Binary_); ok { - return x.Binary - } - return nil -} - -type isPatriciaNode_Node interface { - isPatriciaNode_Node() -} - -type PatriciaNode_Edge_ struct { - Edge *PatriciaNode_Edge `protobuf:"bytes,1,opt,name=edge,proto3,oneof"` -} - -type PatriciaNode_Binary_ struct { - Binary *PatriciaNode_Binary `protobuf:"bytes,2,opt,name=binary,proto3,oneof"` -} - -func (*PatriciaNode_Edge_) isPatriciaNode_Node() {} - -func (*PatriciaNode_Binary_) isPatriciaNode_Node() {} - -// non leaf nodes required to build the trie given the range (leaves) -type PatriciaRangeProof struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Nodes []*PatriciaNode `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` -} - -func (x *PatriciaRangeProof) Reset() { - *x = PatriciaRangeProof{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PatriciaRangeProof) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PatriciaRangeProof) ProtoMessage() {} - -func (x *PatriciaRangeProof) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PatriciaRangeProof.ProtoReflect.Descriptor instead. -func (*PatriciaRangeProof) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{1} -} - -func (x *PatriciaRangeProof) GetNodes() []*PatriciaNode { - if x != nil { - return x.Nodes - } - return nil -} - -// leafs of the contract state tree -type ContractState struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` // the key - Class *Hash `protobuf:"bytes,2,opt,name=class,proto3" json:"class,omitempty"` - Storage *Hash `protobuf:"bytes,3,opt,name=storage,proto3" json:"storage,omitempty"` // patricia - Nonce uint64 `protobuf:"varint,4,opt,name=nonce,proto3" json:"nonce,omitempty"` -} - -func (x *ContractState) Reset() { - *x = ContractState{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractState) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractState) ProtoMessage() {} - -func (x *ContractState) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractState.ProtoReflect.Descriptor instead. -func (*ContractState) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{2} -} - -func (x *ContractState) GetAddress() *Address { - if x != nil { - return x.Address - } - return nil -} - -func (x *ContractState) GetClass() *Hash { - if x != nil { - return x.Class - } - return nil -} - -func (x *ContractState) GetStorage() *Hash { - if x != nil { - return x.Storage - } - return nil -} - -func (x *ContractState) GetNonce() uint64 { - if x != nil { - return x.Nonce - } - return 0 -} - -// request a range from the contract state tree that matches the given root (block) -// starts at 'start' and ends no more than 'end'. -// the result is (ContractRange+, PatriciaRangeProof)* -type ContractRangeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Domain uint32 `protobuf:"varint,1,opt,name=domain,proto3" json:"domain,omitempty"` // volition - StateRoot *Hash `protobuf:"bytes,2,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` - Start *Address `protobuf:"bytes,3,opt,name=start,proto3" json:"start,omitempty"` - End *Address `protobuf:"bytes,4,opt,name=end,proto3" json:"end,omitempty"` - ChunksPerProof uint32 `protobuf:"varint,5,opt,name=chunks_per_proof,json=chunksPerProof,proto3" json:"chunks_per_proof,omitempty"` // how many ContractRange items to send before sending a proof -} - -func (x *ContractRangeRequest) Reset() { - *x = ContractRangeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractRangeRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractRangeRequest) ProtoMessage() {} - -func (x *ContractRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractRangeRequest.ProtoReflect.Descriptor instead. -func (*ContractRangeRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{3} -} - -func (x *ContractRangeRequest) GetDomain() uint32 { - if x != nil { - return x.Domain - } - return 0 -} - -func (x *ContractRangeRequest) GetStateRoot() *Hash { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *ContractRangeRequest) GetStart() *Address { - if x != nil { - return x.Start - } - return nil -} - -func (x *ContractRangeRequest) GetEnd() *Address { - if x != nil { - return x.End - } - return nil -} - -func (x *ContractRangeRequest) GetChunksPerProof() uint32 { - if x != nil { - return x.ChunksPerProof - } - return 0 -} - -// stream of leaves in the contracts tree -type ContractRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - State []*ContractState `protobuf:"bytes,1,rep,name=state,proto3" json:"state,omitempty"` -} - -func (x *ContractRange) Reset() { - *x = ContractRange{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractRange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractRange) ProtoMessage() {} - -func (x *ContractRange) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractRange.ProtoReflect.Descriptor instead. -func (*ContractRange) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{4} -} - -func (x *ContractRange) GetState() []*ContractState { - if x != nil { - return x.State - } - return nil -} - -type ContractRangeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Root *Hash `protobuf:"bytes,1,opt,name=root,proto3,oneof" json:"root,omitempty"` // may not appear if Fin is sent to end the whole response - ContractsRoot *Hash `protobuf:"bytes,2,opt,name=contracts_root,json=contractsRoot,proto3,oneof" json:"contracts_root,omitempty"` // may not appear if Fin is sent to end the whole response - ClassesRoot *Hash `protobuf:"bytes,3,opt,name=classes_root,json=classesRoot,proto3,oneof" json:"classes_root,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to Responses: - // - // *ContractRangeResponse_Range - // *ContractRangeResponse_Fin - Responses isContractRangeResponse_Responses `protobuf_oneof:"responses"` -} - -func (x *ContractRangeResponse) Reset() { - *x = ContractRangeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractRangeResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractRangeResponse) ProtoMessage() {} - -func (x *ContractRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractRangeResponse.ProtoReflect.Descriptor instead. -func (*ContractRangeResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{5} -} - -func (x *ContractRangeResponse) GetRoot() *Hash { - if x != nil { - return x.Root - } - return nil -} - -func (x *ContractRangeResponse) GetContractsRoot() *Hash { - if x != nil { - return x.ContractsRoot - } - return nil -} - -func (x *ContractRangeResponse) GetClassesRoot() *Hash { - if x != nil { - return x.ClassesRoot - } - return nil -} - -func (m *ContractRangeResponse) GetResponses() isContractRangeResponse_Responses { - if m != nil { - return m.Responses - } - return nil -} - -func (x *ContractRangeResponse) GetRange() *ContractRange { - if x, ok := x.GetResponses().(*ContractRangeResponse_Range); ok { - return x.Range - } - return nil -} - -func (x *ContractRangeResponse) GetFin() *Fin { - if x, ok := x.GetResponses().(*ContractRangeResponse_Fin); ok { - return x.Fin - } - return nil -} - -type isContractRangeResponse_Responses interface { - isContractRangeResponse_Responses() -} - -type ContractRangeResponse_Range struct { - Range *ContractRange `protobuf:"bytes,4,opt,name=range,proto3,oneof"` -} - -type ContractRangeResponse_Fin struct { - Fin *Fin `protobuf:"bytes,5,opt,name=fin,proto3,oneof"` -} - -func (*ContractRangeResponse_Range) isContractRangeResponse_Responses() {} - -func (*ContractRangeResponse_Fin) isContractRangeResponse_Responses() {} - -// duplicate of GetContractRange. Can introduce a 'type' instead. -// result is (Classes+, PatriciaRangeProof)* -type ClassRangeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Root *Hash `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"` - Start *Hash `protobuf:"bytes,2,opt,name=start,proto3" json:"start,omitempty"` - End *Hash `protobuf:"bytes,3,opt,name=end,proto3" json:"end,omitempty"` - ChunksPerProof uint32 `protobuf:"varint,4,opt,name=chunks_per_proof,json=chunksPerProof,proto3" json:"chunks_per_proof,omitempty"` -} - -func (x *ClassRangeRequest) Reset() { - *x = ClassRangeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClassRangeRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClassRangeRequest) ProtoMessage() {} - -func (x *ClassRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClassRangeRequest.ProtoReflect.Descriptor instead. -func (*ClassRangeRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{6} -} - -func (x *ClassRangeRequest) GetRoot() *Hash { - if x != nil { - return x.Root - } - return nil -} - -func (x *ClassRangeRequest) GetStart() *Hash { - if x != nil { - return x.Start - } - return nil -} - -func (x *ClassRangeRequest) GetEnd() *Hash { - if x != nil { - return x.End - } - return nil -} - -func (x *ClassRangeRequest) GetChunksPerProof() uint32 { - if x != nil { - return x.ChunksPerProof - } - return 0 -} - -type ClassRangeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Root *Hash `protobuf:"bytes,1,opt,name=root,proto3,oneof" json:"root,omitempty"` // may not appear if Fin is sent to end the whole response - ContractsRoot *Hash `protobuf:"bytes,2,opt,name=contracts_root,json=contractsRoot,proto3,oneof" json:"contracts_root,omitempty"` // may not appear if Fin is sent to end the whole response - ClassesRoot *Hash `protobuf:"bytes,3,opt,name=classes_root,json=classesRoot,proto3,oneof" json:"classes_root,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to Responses: - // - // *ClassRangeResponse_Classes - // *ClassRangeResponse_Fin - Responses isClassRangeResponse_Responses `protobuf_oneof:"responses"` -} - -func (x *ClassRangeResponse) Reset() { - *x = ClassRangeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClassRangeResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClassRangeResponse) ProtoMessage() {} - -func (x *ClassRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClassRangeResponse.ProtoReflect.Descriptor instead. -func (*ClassRangeResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{7} -} - -func (x *ClassRangeResponse) GetRoot() *Hash { - if x != nil { - return x.Root - } - return nil -} - -func (x *ClassRangeResponse) GetContractsRoot() *Hash { - if x != nil { - return x.ContractsRoot - } - return nil -} - -func (x *ClassRangeResponse) GetClassesRoot() *Hash { - if x != nil { - return x.ClassesRoot - } - return nil -} - -func (m *ClassRangeResponse) GetResponses() isClassRangeResponse_Responses { - if m != nil { - return m.Responses - } - return nil -} - -func (x *ClassRangeResponse) GetClasses() *Classes { - if x, ok := x.GetResponses().(*ClassRangeResponse_Classes); ok { - return x.Classes - } - return nil -} - -func (x *ClassRangeResponse) GetFin() *Fin { - if x, ok := x.GetResponses().(*ClassRangeResponse_Fin); ok { - return x.Fin - } - return nil -} - -type isClassRangeResponse_Responses interface { - isClassRangeResponse_Responses() -} - -type ClassRangeResponse_Classes struct { - Classes *Classes `protobuf:"bytes,4,opt,name=classes,proto3,oneof"` -} - -type ClassRangeResponse_Fin struct { - Fin *Fin `protobuf:"bytes,5,opt,name=fin,proto3,oneof"` -} - -func (*ClassRangeResponse_Classes) isClassRangeResponse_Responses() {} - -func (*ClassRangeResponse_Fin) isClassRangeResponse_Responses() {} - -// A position in some contract's state tree is identified by the state tree's root and the key in it -type StorageLeafQuery struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ContractStorageRoot *Hash `protobuf:"bytes,1,opt,name=contract_storage_root,json=contractStorageRoot,proto3" json:"contract_storage_root,omitempty"` - Key *Felt252 `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` -} - -func (x *StorageLeafQuery) Reset() { - *x = StorageLeafQuery{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StorageLeafQuery) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StorageLeafQuery) ProtoMessage() {} - -func (x *StorageLeafQuery) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StorageLeafQuery.ProtoReflect.Descriptor instead. -func (*StorageLeafQuery) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{8} -} - -func (x *StorageLeafQuery) GetContractStorageRoot() *Hash { - if x != nil { - return x.ContractStorageRoot - } - return nil -} - -func (x *StorageLeafQuery) GetKey() *Felt252 { - if x != nil { - return x.Key - } - return nil -} - -type StorageRangeQuery struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Start *StorageLeafQuery `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` - End *StorageLeafQuery `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` -} - -func (x *StorageRangeQuery) Reset() { - *x = StorageRangeQuery{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StorageRangeQuery) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StorageRangeQuery) ProtoMessage() {} - -func (x *StorageRangeQuery) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StorageRangeQuery.ProtoReflect.Descriptor instead. -func (*StorageRangeQuery) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{9} -} - -func (x *StorageRangeQuery) GetStart() *StorageLeafQuery { - if x != nil { - return x.Start - } - return nil -} - -func (x *StorageRangeQuery) GetEnd() *StorageLeafQuery { - if x != nil { - return x.End - } - return nil -} - -// result is (ContractStorageRange+, PatriciaRangeProof)* -type ContractStorageRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Domain uint32 `protobuf:"varint,1,opt,name=domain,proto3" json:"domain,omitempty"` // volition - StateRoot *Hash `protobuf:"bytes,2,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` - Query []*StorageRangeQuery `protobuf:"bytes,3,rep,name=query,proto3" json:"query,omitempty"` -} - -func (x *ContractStorageRequest) Reset() { - *x = ContractStorageRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractStorageRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractStorageRequest) ProtoMessage() {} - -func (x *ContractStorageRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractStorageRequest.ProtoReflect.Descriptor instead. -func (*ContractStorageRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{10} -} - -func (x *ContractStorageRequest) GetDomain() uint32 { - if x != nil { - return x.Domain - } - return 0 -} - -func (x *ContractStorageRequest) GetStateRoot() *Hash { - if x != nil { - return x.StateRoot - } - return nil -} - -func (x *ContractStorageRequest) GetQuery() []*StorageRangeQuery { - if x != nil { - return x.Query - } - return nil -} - -type ContractStorage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - KeyValue []*ContractStoredValue `protobuf:"bytes,2,rep,name=keyValue,proto3" json:"keyValue,omitempty"` -} - -func (x *ContractStorage) Reset() { - *x = ContractStorage{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractStorage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractStorage) ProtoMessage() {} - -func (x *ContractStorage) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractStorage.ProtoReflect.Descriptor instead. -func (*ContractStorage) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{11} -} - -func (x *ContractStorage) GetKeyValue() []*ContractStoredValue { - if x != nil { - return x.KeyValue - } - return nil -} - -type ContractStorageResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - StateRoot *Hash `protobuf:"bytes,1,opt,name=state_root,json=stateRoot,proto3,oneof" json:"state_root,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to Responses: - // - // *ContractStorageResponse_Storage - // *ContractStorageResponse_Fin - Responses isContractStorageResponse_Responses `protobuf_oneof:"responses"` -} - -func (x *ContractStorageResponse) Reset() { - *x = ContractStorageResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContractStorageResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContractStorageResponse) ProtoMessage() {} - -func (x *ContractStorageResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ContractStorageResponse.ProtoReflect.Descriptor instead. -func (*ContractStorageResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{12} -} - -func (x *ContractStorageResponse) GetStateRoot() *Hash { - if x != nil { - return x.StateRoot - } - return nil -} - -func (m *ContractStorageResponse) GetResponses() isContractStorageResponse_Responses { - if m != nil { - return m.Responses - } - return nil -} - -func (x *ContractStorageResponse) GetStorage() *ContractStorage { - if x, ok := x.GetResponses().(*ContractStorageResponse_Storage); ok { - return x.Storage - } - return nil -} - -func (x *ContractStorageResponse) GetFin() *Fin { - if x, ok := x.GetResponses().(*ContractStorageResponse_Fin); ok { - return x.Fin - } - return nil -} - -type isContractStorageResponse_Responses interface { - isContractStorageResponse_Responses() -} - -type ContractStorageResponse_Storage struct { - Storage *ContractStorage `protobuf:"bytes,2,opt,name=storage,proto3,oneof"` -} - -type ContractStorageResponse_Fin struct { - Fin *Fin `protobuf:"bytes,3,opt,name=fin,proto3,oneof"` -} - -func (*ContractStorageResponse_Storage) isContractStorageResponse_Responses() {} - -func (*ContractStorageResponse_Fin) isContractStorageResponse_Responses() {} - -type PatriciaNode_Edge struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Length uint32 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` - Path *Felt252 `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // as bits of left/right - Value *Felt252 `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *PatriciaNode_Edge) Reset() { - *x = PatriciaNode_Edge{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PatriciaNode_Edge) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PatriciaNode_Edge) ProtoMessage() {} - -func (x *PatriciaNode_Edge) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PatriciaNode_Edge.ProtoReflect.Descriptor instead. -func (*PatriciaNode_Edge) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *PatriciaNode_Edge) GetLength() uint32 { - if x != nil { - return x.Length - } - return 0 -} - -func (x *PatriciaNode_Edge) GetPath() *Felt252 { - if x != nil { - return x.Path - } - return nil -} - -func (x *PatriciaNode_Edge) GetValue() *Felt252 { - if x != nil { - return x.Value - } - return nil -} - -type PatriciaNode_Binary struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Left *Felt252 `protobuf:"bytes,1,opt,name=left,proto3" json:"left,omitempty"` - Right *Felt252 `protobuf:"bytes,2,opt,name=right,proto3" json:"right,omitempty"` -} - -func (x *PatriciaNode_Binary) Reset() { - *x = PatriciaNode_Binary{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_snapshot_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PatriciaNode_Binary) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PatriciaNode_Binary) ProtoMessage() {} - -func (x *PatriciaNode_Binary) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_snapshot_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PatriciaNode_Binary.ProtoReflect.Descriptor instead. -func (*PatriciaNode_Binary) Descriptor() ([]byte, []int) { - return file_p2p_proto_snapshot_proto_rawDescGZIP(), []int{0, 1} -} - -func (x *PatriciaNode_Binary) GetLeft() *Felt252 { - if x != nil { - return x.Left - } - return nil -} - -func (x *PatriciaNode_Binary) GetRight() *Felt252 { - if x != nil { - return x.Right - } - return nil -} - -var File_p2p_proto_snapshot_proto protoreflect.FileDescriptor - -var file_p2p_proto_snapshot_proto_rawDesc = []byte{ - 0x0a, 0x18, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x32, 0x70, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x15, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x96, 0x02, 0x0a, 0x0c, 0x50, 0x61, - 0x74, 0x72, 0x69, 0x63, 0x69, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x65, 0x64, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x50, 0x61, 0x74, 0x72, 0x69, - 0x63, 0x69, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x48, 0x00, 0x52, 0x04, - 0x65, 0x64, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, 0x69, 0x61, 0x4e, - 0x6f, 0x64, 0x65, 0x2e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, 0x62, 0x69, - 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x5c, 0x0a, 0x04, 0x45, 0x64, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x1a, 0x46, 0x0a, 0x06, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x04, - 0x6c, 0x65, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, - 0x74, 0x32, 0x35, 0x32, 0x52, 0x04, 0x6c, 0x65, 0x66, 0x74, 0x12, 0x1e, 0x0a, 0x05, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, - 0x32, 0x35, 0x32, 0x52, 0x05, 0x72, 0x69, 0x67, 0x68, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x6e, 0x6f, - 0x64, 0x65, 0x22, 0x39, 0x0a, 0x12, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, 0x69, 0x61, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x23, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x50, 0x61, 0x74, 0x72, 0x69, 0x63, - 0x69, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x87, 0x01, - 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x22, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x12, 0x1f, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x24, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, - 0x61, 0x73, 0x68, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1e, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1a, - 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x50, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x35, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x95, 0x02, 0x0a, 0x15, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x01, 0x52, 0x04, 0x72, 0x6f, - 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, - 0x48, 0x61, 0x73, 0x68, 0x48, 0x02, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0c, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, - 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x03, 0x52, 0x0b, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, - 0x52, 0x6f, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, - 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x04, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x04, - 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x17, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, - 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x50, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x90, 0x02, 0x0a, 0x12, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, - 0x48, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x0e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x02, 0x52, 0x0d, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, - 0x0a, 0x0c, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x03, 0x52, 0x0b, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, - 0x07, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0b, 0x0a, - 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x65, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x69, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x39, 0x0a, 0x15, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, - 0x68, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x22, 0x61, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x4c, 0x65, 0x61, 0x66, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x23, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x24, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, - 0x61, 0x73, 0x68, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x28, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa8, 0x01, - 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, - 0x48, 0x61, 0x73, 0x68, 0x48, 0x01, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0b, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_p2p_proto_snapshot_proto_rawDescOnce sync.Once - file_p2p_proto_snapshot_proto_rawDescData = file_p2p_proto_snapshot_proto_rawDesc -) - -func file_p2p_proto_snapshot_proto_rawDescGZIP() []byte { - file_p2p_proto_snapshot_proto_rawDescOnce.Do(func() { - file_p2p_proto_snapshot_proto_rawDescData = protoimpl.X.CompressGZIP(file_p2p_proto_snapshot_proto_rawDescData) - }) - return file_p2p_proto_snapshot_proto_rawDescData -} - -var ( - file_p2p_proto_snapshot_proto_msgTypes = make([]protoimpl.MessageInfo, 15) - file_p2p_proto_snapshot_proto_goTypes = []interface{}{ - (*PatriciaNode)(nil), // 0: PatriciaNode - (*PatriciaRangeProof)(nil), // 1: PatriciaRangeProof - (*ContractState)(nil), // 2: ContractState - (*ContractRangeRequest)(nil), // 3: ContractRangeRequest - (*ContractRange)(nil), // 4: ContractRange - (*ContractRangeResponse)(nil), // 5: ContractRangeResponse - (*ClassRangeRequest)(nil), // 6: ClassRangeRequest - (*ClassRangeResponse)(nil), // 7: ClassRangeResponse - (*StorageLeafQuery)(nil), // 8: StorageLeafQuery - (*StorageRangeQuery)(nil), // 9: StorageRangeQuery - (*ContractStorageRequest)(nil), // 10: ContractStorageRequest - (*ContractStorage)(nil), // 11: ContractStorage - (*ContractStorageResponse)(nil), // 12: ContractStorageResponse - (*PatriciaNode_Edge)(nil), // 13: PatriciaNode.Edge - (*PatriciaNode_Binary)(nil), // 14: PatriciaNode.Binary - (*Address)(nil), // 15: Address - (*Hash)(nil), // 16: Hash - (*Fin)(nil), // 17: Fin - (*Classes)(nil), // 18: Classes - (*Felt252)(nil), // 19: Felt252 - (*ContractStoredValue)(nil), // 20: ContractStoredValue - } -) - -var file_p2p_proto_snapshot_proto_depIdxs = []int32{ - 13, // 0: PatriciaNode.edge:type_name -> PatriciaNode.Edge - 14, // 1: PatriciaNode.binary:type_name -> PatriciaNode.Binary - 0, // 2: PatriciaRangeProof.nodes:type_name -> PatriciaNode - 15, // 3: ContractState.address:type_name -> Address - 16, // 4: ContractState.class:type_name -> Hash - 16, // 5: ContractState.storage:type_name -> Hash - 16, // 6: ContractRangeRequest.state_root:type_name -> Hash - 15, // 7: ContractRangeRequest.start:type_name -> Address - 15, // 8: ContractRangeRequest.end:type_name -> Address - 2, // 9: ContractRange.state:type_name -> ContractState - 16, // 10: ContractRangeResponse.root:type_name -> Hash - 16, // 11: ContractRangeResponse.contracts_root:type_name -> Hash - 16, // 12: ContractRangeResponse.classes_root:type_name -> Hash - 4, // 13: ContractRangeResponse.range:type_name -> ContractRange - 17, // 14: ContractRangeResponse.fin:type_name -> Fin - 16, // 15: ClassRangeRequest.root:type_name -> Hash - 16, // 16: ClassRangeRequest.start:type_name -> Hash - 16, // 17: ClassRangeRequest.end:type_name -> Hash - 16, // 18: ClassRangeResponse.root:type_name -> Hash - 16, // 19: ClassRangeResponse.contracts_root:type_name -> Hash - 16, // 20: ClassRangeResponse.classes_root:type_name -> Hash - 18, // 21: ClassRangeResponse.classes:type_name -> Classes - 17, // 22: ClassRangeResponse.fin:type_name -> Fin - 16, // 23: StorageLeafQuery.contract_storage_root:type_name -> Hash - 19, // 24: StorageLeafQuery.key:type_name -> Felt252 - 8, // 25: StorageRangeQuery.start:type_name -> StorageLeafQuery - 8, // 26: StorageRangeQuery.end:type_name -> StorageLeafQuery - 16, // 27: ContractStorageRequest.state_root:type_name -> Hash - 9, // 28: ContractStorageRequest.query:type_name -> StorageRangeQuery - 20, // 29: ContractStorage.keyValue:type_name -> ContractStoredValue - 16, // 30: ContractStorageResponse.state_root:type_name -> Hash - 11, // 31: ContractStorageResponse.storage:type_name -> ContractStorage - 17, // 32: ContractStorageResponse.fin:type_name -> Fin - 19, // 33: PatriciaNode.Edge.path:type_name -> Felt252 - 19, // 34: PatriciaNode.Edge.value:type_name -> Felt252 - 19, // 35: PatriciaNode.Binary.left:type_name -> Felt252 - 19, // 36: PatriciaNode.Binary.right:type_name -> Felt252 - 37, // [37:37] is the sub-list for method output_type - 37, // [37:37] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name -} - -func init() { file_p2p_proto_snapshot_proto_init() } -func file_p2p_proto_snapshot_proto_init() { - if File_p2p_proto_snapshot_proto != nil { - return - } - file_p2p_proto_common_proto_init() - file_p2p_proto_state_proto_init() - if !protoimpl.UnsafeEnabled { - file_p2p_proto_snapshot_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PatriciaNode); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PatriciaRangeProof); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractState); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractRangeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractRangeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClassRangeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClassRangeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageLeafQuery); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageRangeQuery); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractStorageRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractStorage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContractStorageResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PatriciaNode_Edge); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_snapshot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PatriciaNode_Binary); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_p2p_proto_snapshot_proto_msgTypes[0].OneofWrappers = []interface{}{ - (*PatriciaNode_Edge_)(nil), - (*PatriciaNode_Binary_)(nil), - } - file_p2p_proto_snapshot_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*ContractRangeResponse_Range)(nil), - (*ContractRangeResponse_Fin)(nil), - } - file_p2p_proto_snapshot_proto_msgTypes[7].OneofWrappers = []interface{}{ - (*ClassRangeResponse_Classes)(nil), - (*ClassRangeResponse_Fin)(nil), - } - file_p2p_proto_snapshot_proto_msgTypes[12].OneofWrappers = []interface{}{ - (*ContractStorageResponse_Storage)(nil), - (*ContractStorageResponse_Fin)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_p2p_proto_snapshot_proto_rawDesc, - NumEnums: 0, - NumMessages: 15, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_p2p_proto_snapshot_proto_goTypes, - DependencyIndexes: file_p2p_proto_snapshot_proto_depIdxs, - MessageInfos: file_p2p_proto_snapshot_proto_msgTypes, - }.Build() - File_p2p_proto_snapshot_proto = out.File - file_p2p_proto_snapshot_proto_rawDesc = nil - file_p2p_proto_snapshot_proto_goTypes = nil - file_p2p_proto_snapshot_proto_depIdxs = nil -} diff --git a/p2p/starknet/spec/state.pb.go b/p2p/starknet/spec/state.pb.go index c4540e1034..ec257fba0e 100644 --- a/p2p/starknet/spec/state.pb.go +++ b/p2p/starknet/spec/state.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.26.0 +// protoc v4.25.1 // source: p2p/proto/state.proto package spec @@ -77,19 +77,20 @@ func (x *ContractStoredValue) GetValue() *Felt252 { return nil } -type StateDiff struct { +type ContractDiff struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Domain uint32 `protobuf:"varint,1,opt,name=domain,proto3" json:"domain,omitempty"` // volition state domain - ContractDiffs []*StateDiff_ContractDiff `protobuf:"bytes,2,rep,name=contract_diffs,json=contractDiffs,proto3" json:"contract_diffs,omitempty"` - ReplacedClasses []*StateDiff_ContractAddrToClassHash `protobuf:"bytes,3,rep,name=replaced_classes,json=replacedClasses,proto3" json:"replaced_classes,omitempty"` - DeployedContracts []*StateDiff_ContractAddrToClassHash `protobuf:"bytes,4,rep,name=deployed_contracts,json=deployedContracts,proto3" json:"deployed_contracts,omitempty"` + Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Nonce *Felt252 `protobuf:"bytes,2,opt,name=nonce,proto3,oneof" json:"nonce,omitempty"` // Present only if the nonce was updated + ClassHash *Hash `protobuf:"bytes,3,opt,name=class_hash,json=classHash,proto3,oneof" json:"class_hash,omitempty"` // Present only if the contract was deployed or replaced in this block. + Values []*ContractStoredValue `protobuf:"bytes,4,rep,name=values,proto3" json:"values,omitempty"` + Domain VolitionDomain `protobuf:"varint,5,opt,name=domain,proto3,enum=VolitionDomain" json:"domain,omitempty"` } -func (x *StateDiff) Reset() { - *x = StateDiff{} +func (x *ContractDiff) Reset() { + *x = ContractDiff{} if protoimpl.UnsafeEnabled { mi := &file_p2p_proto_state_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -97,13 +98,13 @@ func (x *StateDiff) Reset() { } } -func (x *StateDiff) String() string { +func (x *ContractDiff) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StateDiff) ProtoMessage() {} +func (*ContractDiff) ProtoMessage() {} -func (x *StateDiff) ProtoReflect() protoreflect.Message { +func (x *ContractDiff) ProtoReflect() protoreflect.Message { mi := &file_p2p_proto_state_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -115,50 +116,57 @@ func (x *StateDiff) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StateDiff.ProtoReflect.Descriptor instead. -func (*StateDiff) Descriptor() ([]byte, []int) { +// Deprecated: Use ContractDiff.ProtoReflect.Descriptor instead. +func (*ContractDiff) Descriptor() ([]byte, []int) { return file_p2p_proto_state_proto_rawDescGZIP(), []int{1} } -func (x *StateDiff) GetDomain() uint32 { +func (x *ContractDiff) GetAddress() *Address { if x != nil { - return x.Domain + return x.Address } - return 0 + return nil } -func (x *StateDiff) GetContractDiffs() []*StateDiff_ContractDiff { +func (x *ContractDiff) GetNonce() *Felt252 { if x != nil { - return x.ContractDiffs + return x.Nonce } return nil } -func (x *StateDiff) GetReplacedClasses() []*StateDiff_ContractAddrToClassHash { +func (x *ContractDiff) GetClassHash() *Hash { if x != nil { - return x.ReplacedClasses + return x.ClassHash } return nil } -func (x *StateDiff) GetDeployedContracts() []*StateDiff_ContractAddrToClassHash { +func (x *ContractDiff) GetValues() []*ContractStoredValue { if x != nil { - return x.DeployedContracts + return x.Values } return nil } -type EntryPoint struct { +func (x *ContractDiff) GetDomain() VolitionDomain { + if x != nil { + return x.Domain + } + return VolitionDomain_L1 +} + +type DeclaredClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Selector *Felt252 `protobuf:"bytes,1,opt,name=selector,proto3" json:"selector,omitempty"` - Offset *Felt252 `protobuf:"bytes,2,opt,name=offset,proto3" json:"offset,omitempty"` + ClassHash *Hash `protobuf:"bytes,1,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` + CompiledClassHash *Hash `protobuf:"bytes,2,opt,name=compiled_class_hash,json=compiledClassHash,proto3,oneof" json:"compiled_class_hash,omitempty"` // Present only if the class is Cairo1 } -func (x *EntryPoint) Reset() { - *x = EntryPoint{} +func (x *DeclaredClass) Reset() { + *x = DeclaredClass{} if protoimpl.UnsafeEnabled { mi := &file_p2p_proto_state_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -166,13 +174,13 @@ func (x *EntryPoint) Reset() { } } -func (x *EntryPoint) String() string { +func (x *DeclaredClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EntryPoint) ProtoMessage() {} +func (*DeclaredClass) ProtoMessage() {} -func (x *EntryPoint) ProtoReflect() protoreflect.Message { +func (x *DeclaredClass) ProtoReflect() protoreflect.Message { mi := &file_p2p_proto_state_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -184,39 +192,35 @@ func (x *EntryPoint) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EntryPoint.ProtoReflect.Descriptor instead. -func (*EntryPoint) Descriptor() ([]byte, []int) { +// Deprecated: Use DeclaredClass.ProtoReflect.Descriptor instead. +func (*DeclaredClass) Descriptor() ([]byte, []int) { return file_p2p_proto_state_proto_rawDescGZIP(), []int{2} } -func (x *EntryPoint) GetSelector() *Felt252 { +func (x *DeclaredClass) GetClassHash() *Hash { if x != nil { - return x.Selector + return x.ClassHash } return nil } -func (x *EntryPoint) GetOffset() *Felt252 { +func (x *DeclaredClass) GetCompiledClassHash() *Hash { if x != nil { - return x.Offset + return x.CompiledClassHash } return nil } -type Cairo0Class struct { +type StateDiffsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Abi []byte `protobuf:"bytes,1,opt,name=abi,proto3" json:"abi,omitempty"` - Externals []*EntryPoint `protobuf:"bytes,2,rep,name=externals,proto3" json:"externals,omitempty"` - L1Handlers []*EntryPoint `protobuf:"bytes,3,rep,name=l1_handlers,json=l1Handlers,proto3" json:"l1_handlers,omitempty"` - Constructors []*EntryPoint `protobuf:"bytes,4,rep,name=constructors,proto3" json:"constructors,omitempty"` - Program []byte `protobuf:"bytes,5,opt,name=program,proto3" json:"program,omitempty"` + Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` } -func (x *Cairo0Class) Reset() { - *x = Cairo0Class{} +func (x *StateDiffsRequest) Reset() { + *x = StateDiffsRequest{} if protoimpl.UnsafeEnabled { mi := &file_p2p_proto_state_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -224,13 +228,13 @@ func (x *Cairo0Class) Reset() { } } -func (x *Cairo0Class) String() string { +func (x *StateDiffsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Cairo0Class) ProtoMessage() {} +func (*StateDiffsRequest) ProtoMessage() {} -func (x *Cairo0Class) ProtoReflect() protoreflect.Message { +func (x *StateDiffsRequest) ProtoReflect() protoreflect.Message { mi := &file_p2p_proto_state_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -242,57 +246,36 @@ func (x *Cairo0Class) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Cairo0Class.ProtoReflect.Descriptor instead. -func (*Cairo0Class) Descriptor() ([]byte, []int) { +// Deprecated: Use StateDiffsRequest.ProtoReflect.Descriptor instead. +func (*StateDiffsRequest) Descriptor() ([]byte, []int) { return file_p2p_proto_state_proto_rawDescGZIP(), []int{3} } -func (x *Cairo0Class) GetAbi() []byte { +func (x *StateDiffsRequest) GetIteration() *Iteration { if x != nil { - return x.Abi + return x.Iteration } return nil } -func (x *Cairo0Class) GetExternals() []*EntryPoint { - if x != nil { - return x.Externals - } - return nil -} - -func (x *Cairo0Class) GetL1Handlers() []*EntryPoint { - if x != nil { - return x.L1Handlers - } - return nil -} - -func (x *Cairo0Class) GetConstructors() []*EntryPoint { - if x != nil { - return x.Constructors - } - return nil -} - -func (x *Cairo0Class) GetProgram() []byte { - if x != nil { - return x.Program - } - return nil -} - -type SierraEntryPoint struct { +// Responses are sent ordered by the order given in the request. +type StateDiffsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Index uint64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Selector *Felt252 `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` + // All of the messages related to a block need to be sent before a message from the next block is sent. + // + // Types that are assignable to StateDiffMessage: + // + // *StateDiffsResponse_ContractDiff + // *StateDiffsResponse_DeclaredClass + // *StateDiffsResponse_Fin + StateDiffMessage isStateDiffsResponse_StateDiffMessage `protobuf_oneof:"state_diff_message"` } -func (x *SierraEntryPoint) Reset() { - *x = SierraEntryPoint{} +func (x *StateDiffsResponse) Reset() { + *x = StateDiffsResponse{} if protoimpl.UnsafeEnabled { mi := &file_p2p_proto_state_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -300,13 +283,13 @@ func (x *SierraEntryPoint) Reset() { } } -func (x *SierraEntryPoint) String() string { +func (x *StateDiffsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SierraEntryPoint) ProtoMessage() {} +func (*StateDiffsResponse) ProtoMessage() {} -func (x *SierraEntryPoint) ProtoReflect() protoreflect.Message { +func (x *StateDiffsResponse) ProtoReflect() protoreflect.Message { mi := &file_p2p_proto_state_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -318,433 +301,60 @@ func (x *SierraEntryPoint) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SierraEntryPoint.ProtoReflect.Descriptor instead. -func (*SierraEntryPoint) Descriptor() ([]byte, []int) { +// Deprecated: Use StateDiffsResponse.ProtoReflect.Descriptor instead. +func (*StateDiffsResponse) Descriptor() ([]byte, []int) { return file_p2p_proto_state_proto_rawDescGZIP(), []int{4} } -func (x *SierraEntryPoint) GetIndex() uint64 { - if x != nil { - return x.Index - } - return 0 -} - -func (x *SierraEntryPoint) GetSelector() *Felt252 { - if x != nil { - return x.Selector - } - return nil -} - -type Cairo1EntryPoints struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Externals []*SierraEntryPoint `protobuf:"bytes,1,rep,name=externals,proto3" json:"externals,omitempty"` - L1Handlers []*SierraEntryPoint `protobuf:"bytes,2,rep,name=l1_handlers,json=l1Handlers,proto3" json:"l1_handlers,omitempty"` - Constructors []*SierraEntryPoint `protobuf:"bytes,3,rep,name=constructors,proto3" json:"constructors,omitempty"` -} - -func (x *Cairo1EntryPoints) Reset() { - *x = Cairo1EntryPoints{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_state_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Cairo1EntryPoints) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Cairo1EntryPoints) ProtoMessage() {} - -func (x *Cairo1EntryPoints) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_state_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Cairo1EntryPoints.ProtoReflect.Descriptor instead. -func (*Cairo1EntryPoints) Descriptor() ([]byte, []int) { - return file_p2p_proto_state_proto_rawDescGZIP(), []int{5} -} - -func (x *Cairo1EntryPoints) GetExternals() []*SierraEntryPoint { - if x != nil { - return x.Externals - } - return nil -} - -func (x *Cairo1EntryPoints) GetL1Handlers() []*SierraEntryPoint { - if x != nil { - return x.L1Handlers - } - return nil -} - -func (x *Cairo1EntryPoints) GetConstructors() []*SierraEntryPoint { - if x != nil { - return x.Constructors - } - return nil -} - -type Cairo1Class struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Abi []byte `protobuf:"bytes,1,opt,name=abi,proto3" json:"abi,omitempty"` - EntryPoints *Cairo1EntryPoints `protobuf:"bytes,2,opt,name=entry_points,json=entryPoints,proto3" json:"entry_points,omitempty"` - Program []*Felt252 `protobuf:"bytes,3,rep,name=program,proto3" json:"program,omitempty"` - ContractClassVersion string `protobuf:"bytes,4,opt,name=contract_class_version,json=contractClassVersion,proto3" json:"contract_class_version,omitempty"` - Compiled []byte `protobuf:"bytes,5,opt,name=compiled,proto3" json:"compiled,omitempty"` -} - -func (x *Cairo1Class) Reset() { - *x = Cairo1Class{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_state_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Cairo1Class) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Cairo1Class) ProtoMessage() {} - -func (x *Cairo1Class) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_state_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Cairo1Class.ProtoReflect.Descriptor instead. -func (*Cairo1Class) Descriptor() ([]byte, []int) { - return file_p2p_proto_state_proto_rawDescGZIP(), []int{6} -} - -func (x *Cairo1Class) GetAbi() []byte { - if x != nil { - return x.Abi - } - return nil -} - -func (x *Cairo1Class) GetEntryPoints() *Cairo1EntryPoints { - if x != nil { - return x.EntryPoints - } - return nil -} - -func (x *Cairo1Class) GetProgram() []*Felt252 { - if x != nil { - return x.Program - } - return nil -} - -func (x *Cairo1Class) GetContractClassVersion() string { - if x != nil { - return x.ContractClassVersion - } - return "" -} - -func (x *Cairo1Class) GetCompiled() []byte { - if x != nil { - return x.Compiled - } - return nil -} - -// is it better to separate the definition from the hashes? (will need to repeate the hashes -// for the definitions stream) -// or, make the definitions optional? maybe it is enough to know only that a class exists, not its definition -// which may be fetched lazily later. -type Class struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Class: - // - // *Class_Cairo0 - // *Class_Cairo1 - Class isClass_Class `protobuf_oneof:"class"` -} - -func (x *Class) Reset() { - *x = Class{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_state_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Class) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Class) ProtoMessage() {} - -func (x *Class) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_state_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Class.ProtoReflect.Descriptor instead. -func (*Class) Descriptor() ([]byte, []int) { - return file_p2p_proto_state_proto_rawDescGZIP(), []int{7} -} - -func (m *Class) GetClass() isClass_Class { +func (m *StateDiffsResponse) GetStateDiffMessage() isStateDiffsResponse_StateDiffMessage { if m != nil { - return m.Class - } - return nil -} - -func (x *Class) GetCairo0() *Cairo0Class { - if x, ok := x.GetClass().(*Class_Cairo0); ok { - return x.Cairo0 - } - return nil -} - -func (x *Class) GetCairo1() *Cairo1Class { - if x, ok := x.GetClass().(*Class_Cairo1); ok { - return x.Cairo1 + return m.StateDiffMessage } return nil } -type isClass_Class interface { - isClass_Class() -} - -type Class_Cairo0 struct { - Cairo0 *Cairo0Class `protobuf:"bytes,1,opt,name=cairo0,proto3,oneof"` -} - -type Class_Cairo1 struct { - Cairo1 *Cairo1Class `protobuf:"bytes,2,opt,name=cairo1,proto3,oneof"` -} - -func (*Class_Cairo0) isClass_Class() {} - -func (*Class_Cairo1) isClass_Class() {} - -type Classes struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Domain uint32 `protobuf:"varint,1,opt,name=domain,proto3" json:"domain,omitempty"` - Classes []*Class `protobuf:"bytes,2,rep,name=classes,proto3" json:"classes,omitempty"` -} - -func (x *Classes) Reset() { - *x = Classes{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_state_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Classes) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Classes) ProtoMessage() {} - -func (x *Classes) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_state_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Classes.ProtoReflect.Descriptor instead. -func (*Classes) Descriptor() ([]byte, []int) { - return file_p2p_proto_state_proto_rawDescGZIP(), []int{8} -} - -func (x *Classes) GetDomain() uint32 { - if x != nil { - return x.Domain - } - return 0 -} - -func (x *Classes) GetClasses() []*Class { - if x != nil { - return x.Classes +func (x *StateDiffsResponse) GetContractDiff() *ContractDiff { + if x, ok := x.GetStateDiffMessage().(*StateDiffsResponse_ContractDiff); ok { + return x.ContractDiff } return nil } -// a bit more efficient than the state sync separation -type StateDiff_ContractDiff struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Address *Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - Nonce *Felt252 `protobuf:"bytes,2,opt,name=nonce,proto3,oneof" json:"nonce,omitempty"` - ClassHash *Felt252 `protobuf:"bytes,3,opt,name=class_hash,json=classHash,proto3,oneof" json:"class_hash,omitempty"` // can change for replace_class or new contract - Values []*ContractStoredValue `protobuf:"bytes,4,rep,name=values,proto3" json:"values,omitempty"` -} - -func (x *StateDiff_ContractDiff) Reset() { - *x = StateDiff_ContractDiff{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_state_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateDiff_ContractDiff) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateDiff_ContractDiff) ProtoMessage() {} - -func (x *StateDiff_ContractDiff) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_state_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StateDiff_ContractDiff.ProtoReflect.Descriptor instead. -func (*StateDiff_ContractDiff) Descriptor() ([]byte, []int) { - return file_p2p_proto_state_proto_rawDescGZIP(), []int{1, 0} -} - -func (x *StateDiff_ContractDiff) GetAddress() *Address { - if x != nil { - return x.Address +func (x *StateDiffsResponse) GetDeclaredClass() *DeclaredClass { + if x, ok := x.GetStateDiffMessage().(*StateDiffsResponse_DeclaredClass); ok { + return x.DeclaredClass } return nil } -func (x *StateDiff_ContractDiff) GetNonce() *Felt252 { - if x != nil { - return x.Nonce +func (x *StateDiffsResponse) GetFin() *Fin { + if x, ok := x.GetStateDiffMessage().(*StateDiffsResponse_Fin); ok { + return x.Fin } return nil } -func (x *StateDiff_ContractDiff) GetClassHash() *Felt252 { - if x != nil { - return x.ClassHash - } - return nil +type isStateDiffsResponse_StateDiffMessage interface { + isStateDiffsResponse_StateDiffMessage() } -func (x *StateDiff_ContractDiff) GetValues() []*ContractStoredValue { - if x != nil { - return x.Values - } - return nil +type StateDiffsResponse_ContractDiff struct { + ContractDiff *ContractDiff `protobuf:"bytes,1,opt,name=contract_diff,json=contractDiff,proto3,oneof"` // Multiple contract diffs for the same contract may appear continuously if the diff is too large or if it's more convenient. } -type StateDiff_ContractAddrToClassHash struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ContractAddr *Address `protobuf:"bytes,1,opt,name=contract_addr,json=contractAddr,proto3" json:"contract_addr,omitempty"` - ClassHash *Hash `protobuf:"bytes,2,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` +type StateDiffsResponse_DeclaredClass struct { + DeclaredClass *DeclaredClass `protobuf:"bytes,2,opt,name=declared_class,json=declaredClass,proto3,oneof"` } -func (x *StateDiff_ContractAddrToClassHash) Reset() { - *x = StateDiff_ContractAddrToClassHash{} - if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_state_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateDiff_ContractAddrToClassHash) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateDiff_ContractAddrToClassHash) ProtoMessage() {} - -func (x *StateDiff_ContractAddrToClassHash) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_state_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) +type StateDiffsResponse_Fin struct { + Fin *Fin `protobuf:"bytes,3,opt,name=fin,proto3,oneof"` // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its state diff. } -// Deprecated: Use StateDiff_ContractAddrToClassHash.ProtoReflect.Descriptor instead. -func (*StateDiff_ContractAddrToClassHash) Descriptor() ([]byte, []int) { - return file_p2p_proto_state_proto_rawDescGZIP(), []int{1, 1} -} +func (*StateDiffsResponse_ContractDiff) isStateDiffsResponse_StateDiffMessage() {} -func (x *StateDiff_ContractAddrToClassHash) GetContractAddr() *Address { - if x != nil { - return x.ContractAddr - } - return nil -} +func (*StateDiffsResponse_DeclaredClass) isStateDiffsResponse_StateDiffMessage() {} -func (x *StateDiff_ContractAddrToClassHash) GetClassHash() *Hash { - if x != nil { - return x.ClassHash - } - return nil -} +func (*StateDiffsResponse_Fin) isStateDiffsResponse_StateDiffMessage() {} var File_p2p_proto_state_proto protoreflect.FileDescriptor @@ -757,101 +367,50 @@ var file_p2p_proto_state_proto_rawDesc = []byte{ 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0xc4, 0x04, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x3e, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x66, 0x66, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x44, 0x69, 0x66, 0x66, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x54, 0x6f, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x54, 0x6f, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x1a, 0xcc, 0x01, 0x0a, 0x0c, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x66, 0x66, 0x12, 0x22, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x23, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x48, 0x00, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, - 0x35, 0x32, 0x48, 0x01, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x88, - 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x1a, 0x6e, 0x0a, 0x17, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x54, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x22, 0x54, 0x0a, 0x0a, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, - 0x32, 0x35, 0x32, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, - 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, - 0xc3, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x61, 0x62, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x61, 0x62, - 0x69, 0x12, 0x29, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x0b, - 0x6c, 0x31, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0a, - 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x6f, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x4e, 0x0a, 0x10, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x24, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x31, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x0b, - 0x6c, 0x31, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, - 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x0b, 0x43, 0x61, 0x69, 0x72, - 0x6f, 0x31, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x62, 0x69, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x61, 0x62, 0x69, 0x12, 0x35, 0x0a, 0x0c, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x31, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x22, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x60, 0x0a, 0x05, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, - 0x26, 0x0a, 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, - 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, 0x30, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, - 0x31, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x31, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x69, 0x72, 0x6f, 0x31, 0x42, - 0x07, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x43, 0x0a, 0x07, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x07, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x06, 0x2e, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, + 0x69, 0x66, 0x66, 0x12, 0x22, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, + 0x48, 0x00, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0a, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x48, 0x01, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x48, 0x61, 0x73, 0x68, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x22, 0x89, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x3a, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, + 0x61, 0x73, 0x68, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x22, 0x3d, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xb3, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x44, 0x69, 0x66, 0x66, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x66, 0x66, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x66, 0x66, 0x12, + 0x37, 0x0a, 0x0e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, + 0x69, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x66, 0x66, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, 0x70, 0x2f, 0x73, 0x74, + 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -867,56 +426,40 @@ func file_p2p_proto_state_proto_rawDescGZIP() []byte { } var ( - file_p2p_proto_state_proto_msgTypes = make([]protoimpl.MessageInfo, 11) + file_p2p_proto_state_proto_msgTypes = make([]protoimpl.MessageInfo, 5) file_p2p_proto_state_proto_goTypes = []interface{}{ - (*ContractStoredValue)(nil), // 0: ContractStoredValue - (*StateDiff)(nil), // 1: StateDiff - (*EntryPoint)(nil), // 2: EntryPoint - (*Cairo0Class)(nil), // 3: Cairo0Class - (*SierraEntryPoint)(nil), // 4: SierraEntryPoint - (*Cairo1EntryPoints)(nil), // 5: Cairo1EntryPoints - (*Cairo1Class)(nil), // 6: Cairo1Class - (*Class)(nil), // 7: Class - (*Classes)(nil), // 8: Classes - (*StateDiff_ContractDiff)(nil), // 9: StateDiff.ContractDiff - (*StateDiff_ContractAddrToClassHash)(nil), // 10: StateDiff.ContractAddrToClassHash - (*Felt252)(nil), // 11: Felt252 - (*Address)(nil), // 12: Address - (*Hash)(nil), // 13: Hash + (*ContractStoredValue)(nil), // 0: ContractStoredValue + (*ContractDiff)(nil), // 1: ContractDiff + (*DeclaredClass)(nil), // 2: DeclaredClass + (*StateDiffsRequest)(nil), // 3: StateDiffsRequest + (*StateDiffsResponse)(nil), // 4: StateDiffsResponse + (*Felt252)(nil), // 5: Felt252 + (*Address)(nil), // 6: Address + (*Hash)(nil), // 7: Hash + (VolitionDomain)(0), // 8: VolitionDomain + (*Iteration)(nil), // 9: Iteration + (*Fin)(nil), // 10: Fin } ) - var file_p2p_proto_state_proto_depIdxs = []int32{ - 11, // 0: ContractStoredValue.key:type_name -> Felt252 - 11, // 1: ContractStoredValue.value:type_name -> Felt252 - 9, // 2: StateDiff.contract_diffs:type_name -> StateDiff.ContractDiff - 10, // 3: StateDiff.replaced_classes:type_name -> StateDiff.ContractAddrToClassHash - 10, // 4: StateDiff.deployed_contracts:type_name -> StateDiff.ContractAddrToClassHash - 11, // 5: EntryPoint.selector:type_name -> Felt252 - 11, // 6: EntryPoint.offset:type_name -> Felt252 - 2, // 7: Cairo0Class.externals:type_name -> EntryPoint - 2, // 8: Cairo0Class.l1_handlers:type_name -> EntryPoint - 2, // 9: Cairo0Class.constructors:type_name -> EntryPoint - 11, // 10: SierraEntryPoint.selector:type_name -> Felt252 - 4, // 11: Cairo1EntryPoints.externals:type_name -> SierraEntryPoint - 4, // 12: Cairo1EntryPoints.l1_handlers:type_name -> SierraEntryPoint - 4, // 13: Cairo1EntryPoints.constructors:type_name -> SierraEntryPoint - 5, // 14: Cairo1Class.entry_points:type_name -> Cairo1EntryPoints - 11, // 15: Cairo1Class.program:type_name -> Felt252 - 3, // 16: Class.cairo0:type_name -> Cairo0Class - 6, // 17: Class.cairo1:type_name -> Cairo1Class - 7, // 18: Classes.classes:type_name -> Class - 12, // 19: StateDiff.ContractDiff.address:type_name -> Address - 11, // 20: StateDiff.ContractDiff.nonce:type_name -> Felt252 - 11, // 21: StateDiff.ContractDiff.class_hash:type_name -> Felt252 - 0, // 22: StateDiff.ContractDiff.values:type_name -> ContractStoredValue - 12, // 23: StateDiff.ContractAddrToClassHash.contract_addr:type_name -> Address - 13, // 24: StateDiff.ContractAddrToClassHash.class_hash:type_name -> Hash - 25, // [25:25] is the sub-list for method output_type - 25, // [25:25] is the sub-list for method input_type - 25, // [25:25] is the sub-list for extension type_name - 25, // [25:25] is the sub-list for extension extendee - 0, // [0:25] is the sub-list for field type_name + 5, // 0: ContractStoredValue.key:type_name -> Felt252 + 5, // 1: ContractStoredValue.value:type_name -> Felt252 + 6, // 2: ContractDiff.address:type_name -> Address + 5, // 3: ContractDiff.nonce:type_name -> Felt252 + 7, // 4: ContractDiff.class_hash:type_name -> Hash + 0, // 5: ContractDiff.values:type_name -> ContractStoredValue + 8, // 6: ContractDiff.domain:type_name -> VolitionDomain + 7, // 7: DeclaredClass.class_hash:type_name -> Hash + 7, // 8: DeclaredClass.compiled_class_hash:type_name -> Hash + 9, // 9: StateDiffsRequest.iteration:type_name -> Iteration + 1, // 10: StateDiffsResponse.contract_diff:type_name -> ContractDiff + 2, // 11: StateDiffsResponse.declared_class:type_name -> DeclaredClass + 10, // 12: StateDiffsResponse.fin:type_name -> Fin + 13, // [13:13] is the sub-list for method output_type + 13, // [13:13] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_p2p_proto_state_proto_init() } @@ -939,7 +482,7 @@ func file_p2p_proto_state_proto_init() { } } file_p2p_proto_state_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateDiff); i { + switch v := v.(*ContractDiff); i { case 0: return &v.state case 1: @@ -951,7 +494,7 @@ func file_p2p_proto_state_proto_init() { } } file_p2p_proto_state_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EntryPoint); i { + switch v := v.(*DeclaredClass); i { case 0: return &v.state case 1: @@ -963,7 +506,7 @@ func file_p2p_proto_state_proto_init() { } } file_p2p_proto_state_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cairo0Class); i { + switch v := v.(*StateDiffsRequest); i { case 0: return &v.state case 1: @@ -975,79 +518,7 @@ func file_p2p_proto_state_proto_init() { } } file_p2p_proto_state_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SierraEntryPoint); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_state_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cairo1EntryPoints); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_state_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cairo1Class); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_state_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Class); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_state_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Classes); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_state_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateDiff_ContractDiff); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_p2p_proto_state_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateDiff_ContractAddrToClassHash); i { + switch v := v.(*StateDiffsResponse); i { case 0: return &v.state case 1: @@ -1059,18 +530,20 @@ func file_p2p_proto_state_proto_init() { } } } - file_p2p_proto_state_proto_msgTypes[7].OneofWrappers = []interface{}{ - (*Class_Cairo0)(nil), - (*Class_Cairo1)(nil), + file_p2p_proto_state_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_p2p_proto_state_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_p2p_proto_state_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*StateDiffsResponse_ContractDiff)(nil), + (*StateDiffsResponse_DeclaredClass)(nil), + (*StateDiffsResponse_Fin)(nil), } - file_p2p_proto_state_proto_msgTypes[9].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_p2p_proto_state_proto_rawDesc, NumEnums: 0, - NumMessages: 11, + NumMessages: 5, NumExtensions: 0, NumServices: 0, }, diff --git a/p2p/starknet/spec/transaction.pb.go b/p2p/starknet/spec/transaction.pb.go index 6a1a76fc90..b6e1d2d94d 100644 --- a/p2p/starknet/spec/transaction.pb.go +++ b/p2p/starknet/spec/transaction.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.26.0 +// protoc v4.25.1 // source: p2p/proto/transaction.proto package spec @@ -76,6 +76,61 @@ func (x *ResourceLimits) GetMaxPricePerUnit() *Felt252 { return nil } +type ResourceBounds struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + L1Gas *ResourceLimits `protobuf:"bytes,1,opt,name=l1_gas,json=l1Gas,proto3" json:"l1_gas,omitempty"` + L2Gas *ResourceLimits `protobuf:"bytes,2,opt,name=l2_gas,json=l2Gas,proto3" json:"l2_gas,omitempty"` +} + +func (x *ResourceBounds) Reset() { + *x = ResourceBounds{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_transaction_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceBounds) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceBounds) ProtoMessage() {} + +func (x *ResourceBounds) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_transaction_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResourceBounds.ProtoReflect.Descriptor instead. +func (*ResourceBounds) Descriptor() ([]byte, []int) { + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{1} +} + +func (x *ResourceBounds) GetL1Gas() *ResourceLimits { + if x != nil { + return x.L1Gas + } + return nil +} + +func (x *ResourceBounds) GetL2Gas() *ResourceLimits { + if x != nil { + return x.L2Gas + } + return nil +} + type AccountSignature struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -87,7 +142,7 @@ type AccountSignature struct { func (x *AccountSignature) Reset() { *x = AccountSignature{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[1] + mi := &file_p2p_proto_transaction_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -100,7 +155,7 @@ func (x *AccountSignature) String() string { func (*AccountSignature) ProtoMessage() {} func (x *AccountSignature) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[1] + mi := &file_p2p_proto_transaction_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -113,7 +168,7 @@ func (x *AccountSignature) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountSignature.ProtoReflect.Descriptor instead. func (*AccountSignature) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{1} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2} } func (x *AccountSignature) GetParts() []*Felt252 { @@ -123,6 +178,8 @@ func (x *AccountSignature) GetParts() []*Felt252 { return nil } +// This is a transaction that is already accepted in a block. Once we have a mempool, we will define +// a separate message for BroadcastedTransaction. type Transaction struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -147,7 +204,7 @@ type Transaction struct { func (x *Transaction) Reset() { *x = Transaction{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[2] + mi := &file_p2p_proto_transaction_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -160,7 +217,7 @@ func (x *Transaction) String() string { func (*Transaction) ProtoMessage() {} func (x *Transaction) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[2] + mi := &file_p2p_proto_transaction_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -173,7 +230,7 @@ func (x *Transaction) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction.ProtoReflect.Descriptor instead. func (*Transaction) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3} } func (m *Transaction) GetTxn() isTransaction_Txn { @@ -253,7 +310,7 @@ func (x *Transaction) GetInvokeV3() *Transaction_InvokeV3 { return nil } -func (x *Transaction) GetL1Handler() *Transaction_L1HandlerV1 { +func (x *Transaction) GetL1Handler() *Transaction_L1HandlerV0 { if x, ok := x.GetTxn().(*Transaction_L1Handler); ok { return x.L1Handler } @@ -305,7 +362,7 @@ type Transaction_InvokeV3_ struct { } type Transaction_L1Handler struct { - L1Handler *Transaction_L1HandlerV1 `protobuf:"bytes,11,opt,name=l1_handler,json=l1Handler,proto3,oneof"` + L1Handler *Transaction_L1HandlerV0 `protobuf:"bytes,11,opt,name=l1_handler,json=l1Handler,proto3,oneof"` } func (*Transaction_DeclareV0_) isTransaction_Txn() {} @@ -330,33 +387,32 @@ func (*Transaction_InvokeV3_) isTransaction_Txn() {} func (*Transaction_L1Handler) isTransaction_Txn() {} -// TBD: can support a flag to return tx hashes only, good for standalone mempool to remove them, -// or any node that keeps track of transaction streaming in the consensus. -type TransactionsRequest struct { +type TransactionWithReceipt struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` + Transaction *Transaction `protobuf:"bytes,1,opt,name=transaction,proto3" json:"transaction,omitempty"` + Receipt *Receipt `protobuf:"bytes,2,opt,name=receipt,proto3" json:"receipt,omitempty"` } -func (x *TransactionsRequest) Reset() { - *x = TransactionsRequest{} +func (x *TransactionWithReceipt) Reset() { + *x = TransactionWithReceipt{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[3] + mi := &file_p2p_proto_transaction_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TransactionsRequest) String() string { +func (x *TransactionWithReceipt) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TransactionsRequest) ProtoMessage() {} +func (*TransactionWithReceipt) ProtoMessage() {} -func (x *TransactionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[3] +func (x *TransactionWithReceipt) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_transaction_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -367,44 +423,52 @@ func (x *TransactionsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TransactionsRequest.ProtoReflect.Descriptor instead. -func (*TransactionsRequest) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3} +// Deprecated: Use TransactionWithReceipt.ProtoReflect.Descriptor instead. +func (*TransactionWithReceipt) Descriptor() ([]byte, []int) { + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{4} } -func (x *TransactionsRequest) GetIteration() *Iteration { +func (x *TransactionWithReceipt) GetTransaction() *Transaction { if x != nil { - return x.Iteration + return x.Transaction } return nil } -// can be several in a single reply -type Transactions struct { +func (x *TransactionWithReceipt) GetReceipt() *Receipt { + if x != nil { + return x.Receipt + } + return nil +} + +// TBD: can support a flag to return tx hashes only, good for standalone mempool to remove them, +// or any node that keeps track of transaction streaming in the consensus. +type TransactionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Items []*Transaction `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Iteration *Iteration `protobuf:"bytes,1,opt,name=iteration,proto3" json:"iteration,omitempty"` } -func (x *Transactions) Reset() { - *x = Transactions{} +func (x *TransactionsRequest) Reset() { + *x = TransactionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[4] + mi := &file_p2p_proto_transaction_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Transactions) String() string { +func (x *TransactionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Transactions) ProtoMessage() {} +func (*TransactionsRequest) ProtoMessage() {} -func (x *Transactions) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[4] +func (x *TransactionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_transaction_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -415,35 +479,36 @@ func (x *Transactions) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Transactions.ProtoReflect.Descriptor instead. -func (*Transactions) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{4} +// Deprecated: Use TransactionsRequest.ProtoReflect.Descriptor instead. +func (*TransactionsRequest) Descriptor() ([]byte, []int) { + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{5} } -func (x *Transactions) GetItems() []*Transaction { +func (x *TransactionsRequest) GetIteration() *Iteration { if x != nil { - return x.Items + return x.Iteration } return nil } +// Responses are sent ordered by the order given in the request. The order inside each block is +// according to the execution order. type TransactionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id *BlockID `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` // may not appear if Fin is sent to end the whole response - // Types that are assignable to Responses: + // Types that are assignable to TransactionMessage: // - // *TransactionsResponse_Transactions + // *TransactionsResponse_TransactionWithReceipt // *TransactionsResponse_Fin - Responses isTransactionsResponse_Responses `protobuf_oneof:"responses"` + TransactionMessage isTransactionsResponse_TransactionMessage `protobuf_oneof:"transaction_message"` } func (x *TransactionsResponse) Reset() { *x = TransactionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[5] + mi := &file_p2p_proto_transaction_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -456,7 +521,7 @@ func (x *TransactionsResponse) String() string { func (*TransactionsResponse) ProtoMessage() {} func (x *TransactionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[5] + mi := &file_p2p_proto_transaction_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -469,52 +534,92 @@ func (x *TransactionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionsResponse.ProtoReflect.Descriptor instead. func (*TransactionsResponse) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{5} -} - -func (x *TransactionsResponse) GetId() *BlockID { - if x != nil { - return x.Id - } - return nil + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{6} } -func (m *TransactionsResponse) GetResponses() isTransactionsResponse_Responses { +func (m *TransactionsResponse) GetTransactionMessage() isTransactionsResponse_TransactionMessage { if m != nil { - return m.Responses + return m.TransactionMessage } return nil } -func (x *TransactionsResponse) GetTransactions() *Transactions { - if x, ok := x.GetResponses().(*TransactionsResponse_Transactions); ok { - return x.Transactions +func (x *TransactionsResponse) GetTransactionWithReceipt() *TransactionWithReceipt { + if x, ok := x.GetTransactionMessage().(*TransactionsResponse_TransactionWithReceipt); ok { + return x.TransactionWithReceipt } return nil } func (x *TransactionsResponse) GetFin() *Fin { - if x, ok := x.GetResponses().(*TransactionsResponse_Fin); ok { + if x, ok := x.GetTransactionMessage().(*TransactionsResponse_Fin); ok { return x.Fin } return nil } -type isTransactionsResponse_Responses interface { - isTransactionsResponse_Responses() +type isTransactionsResponse_TransactionMessage interface { + isTransactionsResponse_TransactionMessage() } -type TransactionsResponse_Transactions struct { - Transactions *Transactions `protobuf:"bytes,2,opt,name=transactions,proto3,oneof"` +type TransactionsResponse_TransactionWithReceipt struct { + TransactionWithReceipt *TransactionWithReceipt `protobuf:"bytes,1,opt,name=transaction_with_receipt,json=transactionWithReceipt,proto3,oneof"` } type TransactionsResponse_Fin struct { - Fin *Fin `protobuf:"bytes,3,opt,name=fin,proto3,oneof"` + Fin *Fin `protobuf:"bytes,2,opt,name=fin,proto3,oneof"` // Fin is sent after the peer sent all the data or when it encountered a block that it doesn't have its transactions. } -func (*TransactionsResponse_Transactions) isTransactionsResponse_Responses() {} +func (*TransactionsResponse_TransactionWithReceipt) isTransactionsResponse_TransactionMessage() {} -func (*TransactionsResponse_Fin) isTransactionsResponse_Responses() {} +func (*TransactionsResponse_Fin) isTransactionsResponse_TransactionMessage() {} + +type Transactions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Transactions []*Transaction `protobuf:"bytes,1,rep,name=transactions,proto3" json:"transactions,omitempty"` +} + +func (x *Transactions) Reset() { + *x = Transactions{} + if protoimpl.UnsafeEnabled { + mi := &file_p2p_proto_transaction_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Transactions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Transactions) ProtoMessage() {} + +func (x *Transactions) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_transaction_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Transactions.ProtoReflect.Descriptor instead. +func (*Transactions) Descriptor() ([]byte, []int) { + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{7} +} + +func (x *Transactions) GetTransactions() []*Transaction { + if x != nil { + return x.Transactions + } + return nil +} type Transaction_DeclareV0 struct { state protoimpl.MessageState @@ -530,7 +635,7 @@ type Transaction_DeclareV0 struct { func (x *Transaction_DeclareV0) Reset() { *x = Transaction_DeclareV0{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[6] + mi := &file_p2p_proto_transaction_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -543,7 +648,7 @@ func (x *Transaction_DeclareV0) String() string { func (*Transaction_DeclareV0) ProtoMessage() {} func (x *Transaction_DeclareV0) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[6] + mi := &file_p2p_proto_transaction_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -556,7 +661,7 @@ func (x *Transaction_DeclareV0) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_DeclareV0.ProtoReflect.Descriptor instead. func (*Transaction_DeclareV0) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 0} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 0} } func (x *Transaction_DeclareV0) GetSender() *Address { @@ -602,7 +707,7 @@ type Transaction_DeclareV1 struct { func (x *Transaction_DeclareV1) Reset() { *x = Transaction_DeclareV1{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[7] + mi := &file_p2p_proto_transaction_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -615,7 +720,7 @@ func (x *Transaction_DeclareV1) String() string { func (*Transaction_DeclareV1) ProtoMessage() {} func (x *Transaction_DeclareV1) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[7] + mi := &file_p2p_proto_transaction_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -628,7 +733,7 @@ func (x *Transaction_DeclareV1) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_DeclareV1.ProtoReflect.Descriptor instead. func (*Transaction_DeclareV1) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 1} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 1} } func (x *Transaction_DeclareV1) GetSender() *Address { @@ -676,13 +781,13 @@ type Transaction_DeclareV2 struct { Signature *AccountSignature `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` ClassHash *Hash `protobuf:"bytes,4,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` Nonce *Felt252 `protobuf:"bytes,5,opt,name=nonce,proto3" json:"nonce,omitempty"` - CompiledClassHash *Felt252 `protobuf:"bytes,6,opt,name=compiled_class_hash,json=compiledClassHash,proto3" json:"compiled_class_hash,omitempty"` + CompiledClassHash *Hash `protobuf:"bytes,6,opt,name=compiled_class_hash,json=compiledClassHash,proto3" json:"compiled_class_hash,omitempty"` } func (x *Transaction_DeclareV2) Reset() { *x = Transaction_DeclareV2{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[8] + mi := &file_p2p_proto_transaction_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -695,7 +800,7 @@ func (x *Transaction_DeclareV2) String() string { func (*Transaction_DeclareV2) ProtoMessage() {} func (x *Transaction_DeclareV2) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[8] + mi := &file_p2p_proto_transaction_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -708,7 +813,7 @@ func (x *Transaction_DeclareV2) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_DeclareV2.ProtoReflect.Descriptor instead. func (*Transaction_DeclareV2) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 2} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 2} } func (x *Transaction_DeclareV2) GetSender() *Address { @@ -746,36 +851,36 @@ func (x *Transaction_DeclareV2) GetNonce() *Felt252 { return nil } -func (x *Transaction_DeclareV2) GetCompiledClassHash() *Felt252 { +func (x *Transaction_DeclareV2) GetCompiledClassHash() *Hash { if x != nil { return x.CompiledClassHash } return nil } +// see https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3 type Transaction_DeclareV3 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - MaxFee *Felt252 `protobuf:"bytes,2,opt,name=max_fee,json=maxFee,proto3" json:"max_fee,omitempty"` - Signature *AccountSignature `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` - ClassHash *Hash `protobuf:"bytes,4,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` - Nonce *Felt252 `protobuf:"bytes,5,opt,name=nonce,proto3" json:"nonce,omitempty"` - CompiledClassHash *Felt252 `protobuf:"bytes,6,opt,name=compiled_class_hash,json=compiledClassHash,proto3" json:"compiled_class_hash,omitempty"` - L1Gas *ResourceLimits `protobuf:"bytes,7,opt,name=l1_gas,json=l1Gas,proto3" json:"l1_gas,omitempty"` - L2Gas *ResourceLimits `protobuf:"bytes,8,opt,name=l2_gas,json=l2Gas,proto3" json:"l2_gas,omitempty"` - Tip *Felt252 `protobuf:"bytes,9,opt,name=tip,proto3" json:"tip,omitempty"` - Paymaster *Address `protobuf:"bytes,10,opt,name=paymaster,proto3" json:"paymaster,omitempty"` - NonceDomain string `protobuf:"bytes,11,opt,name=nonce_domain,json=nonceDomain,proto3" json:"nonce_domain,omitempty"` - FeeDomain string `protobuf:"bytes,12,opt,name=fee_domain,json=feeDomain,proto3" json:"fee_domain,omitempty"` + Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + Signature *AccountSignature `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + ClassHash *Hash `protobuf:"bytes,3,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` + Nonce *Felt252 `protobuf:"bytes,4,opt,name=nonce,proto3" json:"nonce,omitempty"` + CompiledClassHash *Hash `protobuf:"bytes,5,opt,name=compiled_class_hash,json=compiledClassHash,proto3" json:"compiled_class_hash,omitempty"` + ResourceBounds *ResourceBounds `protobuf:"bytes,6,opt,name=resource_bounds,json=resourceBounds,proto3" json:"resource_bounds,omitempty"` + Tip uint64 `protobuf:"varint,7,opt,name=tip,proto3" json:"tip,omitempty"` + PaymasterData []*Felt252 `protobuf:"bytes,8,rep,name=paymaster_data,json=paymasterData,proto3" json:"paymaster_data,omitempty"` + AccountDeploymentData []*Felt252 `protobuf:"bytes,9,rep,name=account_deployment_data,json=accountDeploymentData,proto3" json:"account_deployment_data,omitempty"` + NonceDataAvailabilityMode VolitionDomain `protobuf:"varint,10,opt,name=nonce_data_availability_mode,json=nonceDataAvailabilityMode,proto3,enum=VolitionDomain" json:"nonce_data_availability_mode,omitempty"` + FeeDataAvailabilityMode VolitionDomain `protobuf:"varint,11,opt,name=fee_data_availability_mode,json=feeDataAvailabilityMode,proto3,enum=VolitionDomain" json:"fee_data_availability_mode,omitempty"` } func (x *Transaction_DeclareV3) Reset() { *x = Transaction_DeclareV3{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[9] + mi := &file_p2p_proto_transaction_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -788,7 +893,7 @@ func (x *Transaction_DeclareV3) String() string { func (*Transaction_DeclareV3) ProtoMessage() {} func (x *Transaction_DeclareV3) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[9] + mi := &file_p2p_proto_transaction_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -801,7 +906,7 @@ func (x *Transaction_DeclareV3) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_DeclareV3.ProtoReflect.Descriptor instead. func (*Transaction_DeclareV3) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 3} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 3} } func (x *Transaction_DeclareV3) GetSender() *Address { @@ -811,13 +916,6 @@ func (x *Transaction_DeclareV3) GetSender() *Address { return nil } -func (x *Transaction_DeclareV3) GetMaxFee() *Felt252 { - if x != nil { - return x.MaxFee - } - return nil -} - func (x *Transaction_DeclareV3) GetSignature() *AccountSignature { if x != nil { return x.Signature @@ -839,53 +937,53 @@ func (x *Transaction_DeclareV3) GetNonce() *Felt252 { return nil } -func (x *Transaction_DeclareV3) GetCompiledClassHash() *Felt252 { +func (x *Transaction_DeclareV3) GetCompiledClassHash() *Hash { if x != nil { return x.CompiledClassHash } return nil } -func (x *Transaction_DeclareV3) GetL1Gas() *ResourceLimits { +func (x *Transaction_DeclareV3) GetResourceBounds() *ResourceBounds { if x != nil { - return x.L1Gas + return x.ResourceBounds } return nil } -func (x *Transaction_DeclareV3) GetL2Gas() *ResourceLimits { +func (x *Transaction_DeclareV3) GetTip() uint64 { if x != nil { - return x.L2Gas + return x.Tip } - return nil + return 0 } -func (x *Transaction_DeclareV3) GetTip() *Felt252 { +func (x *Transaction_DeclareV3) GetPaymasterData() []*Felt252 { if x != nil { - return x.Tip + return x.PaymasterData } return nil } -func (x *Transaction_DeclareV3) GetPaymaster() *Address { +func (x *Transaction_DeclareV3) GetAccountDeploymentData() []*Felt252 { if x != nil { - return x.Paymaster + return x.AccountDeploymentData } return nil } -func (x *Transaction_DeclareV3) GetNonceDomain() string { +func (x *Transaction_DeclareV3) GetNonceDataAvailabilityMode() VolitionDomain { if x != nil { - return x.NonceDomain + return x.NonceDataAvailabilityMode } - return "" + return VolitionDomain_L1 } -func (x *Transaction_DeclareV3) GetFeeDomain() string { +func (x *Transaction_DeclareV3) GetFeeDataAvailabilityMode() VolitionDomain { if x != nil { - return x.FeeDomain + return x.FeeDataAvailabilityMode } - return "" + return VolitionDomain_L1 } type Transaction_Deploy struct { @@ -896,12 +994,13 @@ type Transaction_Deploy struct { ClassHash *Hash `protobuf:"bytes,1,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` AddressSalt *Felt252 `protobuf:"bytes,2,opt,name=address_salt,json=addressSalt,proto3" json:"address_salt,omitempty"` Calldata []*Felt252 `protobuf:"bytes,3,rep,name=calldata,proto3" json:"calldata,omitempty"` + Version uint32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` } func (x *Transaction_Deploy) Reset() { *x = Transaction_Deploy{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[10] + mi := &file_p2p_proto_transaction_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -914,7 +1013,7 @@ func (x *Transaction_Deploy) String() string { func (*Transaction_Deploy) ProtoMessage() {} func (x *Transaction_Deploy) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[10] + mi := &file_p2p_proto_transaction_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -927,7 +1026,7 @@ func (x *Transaction_Deploy) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_Deploy.ProtoReflect.Descriptor instead. func (*Transaction_Deploy) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 4} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 4} } func (x *Transaction_Deploy) GetClassHash() *Hash { @@ -951,6 +1050,13 @@ func (x *Transaction_Deploy) GetCalldata() []*Felt252 { return nil } +func (x *Transaction_Deploy) GetVersion() uint32 { + if x != nil { + return x.Version + } + return 0 +} + type Transaction_DeployAccountV1 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -967,7 +1073,7 @@ type Transaction_DeployAccountV1 struct { func (x *Transaction_DeployAccountV1) Reset() { *x = Transaction_DeployAccountV1{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[11] + mi := &file_p2p_proto_transaction_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -980,7 +1086,7 @@ func (x *Transaction_DeployAccountV1) String() string { func (*Transaction_DeployAccountV1) ProtoMessage() {} func (x *Transaction_DeployAccountV1) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[11] + mi := &file_p2p_proto_transaction_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -993,7 +1099,7 @@ func (x *Transaction_DeployAccountV1) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_DeployAccountV1.ProtoReflect.Descriptor instead. func (*Transaction_DeployAccountV1) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 5} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 5} } func (x *Transaction_DeployAccountV1) GetMaxFee() *Felt252 { @@ -1038,29 +1144,28 @@ func (x *Transaction_DeployAccountV1) GetCalldata() []*Felt252 { return nil } +// see https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0 type Transaction_DeployAccountV3 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MaxFee *Felt252 `protobuf:"bytes,1,opt,name=max_fee,json=maxFee,proto3" json:"max_fee,omitempty"` - Signature *AccountSignature `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` - ClassHash *Hash `protobuf:"bytes,3,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` - Nonce *Felt252 `protobuf:"bytes,4,opt,name=nonce,proto3" json:"nonce,omitempty"` - AddressSalt *Felt252 `protobuf:"bytes,5,opt,name=address_salt,json=addressSalt,proto3" json:"address_salt,omitempty"` - Calldata []*Felt252 `protobuf:"bytes,6,rep,name=calldata,proto3" json:"calldata,omitempty"` - L1Gas *ResourceLimits `protobuf:"bytes,7,opt,name=l1_gas,json=l1Gas,proto3" json:"l1_gas,omitempty"` - L2Gas *ResourceLimits `protobuf:"bytes,8,opt,name=l2_gas,json=l2Gas,proto3" json:"l2_gas,omitempty"` - Tip *Felt252 `protobuf:"bytes,9,opt,name=tip,proto3" json:"tip,omitempty"` - Paymaster *Address `protobuf:"bytes,10,opt,name=paymaster,proto3" json:"paymaster,omitempty"` - NonceDomain string `protobuf:"bytes,11,opt,name=nonce_domain,json=nonceDomain,proto3" json:"nonce_domain,omitempty"` - FeeDomain string `protobuf:"bytes,12,opt,name=fee_domain,json=feeDomain,proto3" json:"fee_domain,omitempty"` + Signature *AccountSignature `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + ClassHash *Hash `protobuf:"bytes,2,opt,name=class_hash,json=classHash,proto3" json:"class_hash,omitempty"` + Nonce *Felt252 `protobuf:"bytes,3,opt,name=nonce,proto3" json:"nonce,omitempty"` + AddressSalt *Felt252 `protobuf:"bytes,4,opt,name=address_salt,json=addressSalt,proto3" json:"address_salt,omitempty"` + Calldata []*Felt252 `protobuf:"bytes,5,rep,name=calldata,proto3" json:"calldata,omitempty"` + ResourceBounds *ResourceBounds `protobuf:"bytes,6,opt,name=resource_bounds,json=resourceBounds,proto3" json:"resource_bounds,omitempty"` + Tip uint64 `protobuf:"varint,7,opt,name=tip,proto3" json:"tip,omitempty"` + PaymasterData []*Felt252 `protobuf:"bytes,8,rep,name=paymaster_data,json=paymasterData,proto3" json:"paymaster_data,omitempty"` + NonceDataAvailabilityMode VolitionDomain `protobuf:"varint,9,opt,name=nonce_data_availability_mode,json=nonceDataAvailabilityMode,proto3,enum=VolitionDomain" json:"nonce_data_availability_mode,omitempty"` + FeeDataAvailabilityMode VolitionDomain `protobuf:"varint,10,opt,name=fee_data_availability_mode,json=feeDataAvailabilityMode,proto3,enum=VolitionDomain" json:"fee_data_availability_mode,omitempty"` } func (x *Transaction_DeployAccountV3) Reset() { *x = Transaction_DeployAccountV3{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[12] + mi := &file_p2p_proto_transaction_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1073,7 +1178,7 @@ func (x *Transaction_DeployAccountV3) String() string { func (*Transaction_DeployAccountV3) ProtoMessage() {} func (x *Transaction_DeployAccountV3) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[12] + mi := &file_p2p_proto_transaction_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1086,14 +1191,7 @@ func (x *Transaction_DeployAccountV3) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_DeployAccountV3.ProtoReflect.Descriptor instead. func (*Transaction_DeployAccountV3) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 6} -} - -func (x *Transaction_DeployAccountV3) GetMaxFee() *Felt252 { - if x != nil { - return x.MaxFee - } - return nil + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 6} } func (x *Transaction_DeployAccountV3) GetSignature() *AccountSignature { @@ -1131,46 +1229,39 @@ func (x *Transaction_DeployAccountV3) GetCalldata() []*Felt252 { return nil } -func (x *Transaction_DeployAccountV3) GetL1Gas() *ResourceLimits { - if x != nil { - return x.L1Gas - } - return nil -} - -func (x *Transaction_DeployAccountV3) GetL2Gas() *ResourceLimits { +func (x *Transaction_DeployAccountV3) GetResourceBounds() *ResourceBounds { if x != nil { - return x.L2Gas + return x.ResourceBounds } return nil } -func (x *Transaction_DeployAccountV3) GetTip() *Felt252 { +func (x *Transaction_DeployAccountV3) GetTip() uint64 { if x != nil { return x.Tip } - return nil + return 0 } -func (x *Transaction_DeployAccountV3) GetPaymaster() *Address { +func (x *Transaction_DeployAccountV3) GetPaymasterData() []*Felt252 { if x != nil { - return x.Paymaster + return x.PaymasterData } return nil } -func (x *Transaction_DeployAccountV3) GetNonceDomain() string { +func (x *Transaction_DeployAccountV3) GetNonceDataAvailabilityMode() VolitionDomain { if x != nil { - return x.NonceDomain + return x.NonceDataAvailabilityMode } - return "" + return VolitionDomain_L1 } -func (x *Transaction_DeployAccountV3) GetFeeDomain() string { +func (x *Transaction_DeployAccountV3) GetFeeDataAvailabilityMode() VolitionDomain { if x != nil { - return x.FeeDomain + return x.FeeDataAvailabilityMode } - return "" + return VolitionDomain_L1 } type Transaction_InvokeV0 struct { @@ -1188,7 +1279,7 @@ type Transaction_InvokeV0 struct { func (x *Transaction_InvokeV0) Reset() { *x = Transaction_InvokeV0{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[13] + mi := &file_p2p_proto_transaction_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1201,7 +1292,7 @@ func (x *Transaction_InvokeV0) String() string { func (*Transaction_InvokeV0) ProtoMessage() {} func (x *Transaction_InvokeV0) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[13] + mi := &file_p2p_proto_transaction_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1214,7 +1305,7 @@ func (x *Transaction_InvokeV0) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_InvokeV0.ProtoReflect.Descriptor instead. func (*Transaction_InvokeV0) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 7} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 7} } func (x *Transaction_InvokeV0) GetMaxFee() *Felt252 { @@ -1267,7 +1358,7 @@ type Transaction_InvokeV1 struct { func (x *Transaction_InvokeV1) Reset() { *x = Transaction_InvokeV1{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[14] + mi := &file_p2p_proto_transaction_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1280,7 +1371,7 @@ func (x *Transaction_InvokeV1) String() string { func (*Transaction_InvokeV1) ProtoMessage() {} func (x *Transaction_InvokeV1) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[14] + mi := &file_p2p_proto_transaction_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1293,7 +1384,7 @@ func (x *Transaction_InvokeV1) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_InvokeV1.ProtoReflect.Descriptor instead. func (*Transaction_InvokeV1) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 8} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 8} } func (x *Transaction_InvokeV1) GetSender() *Address { @@ -1331,28 +1422,28 @@ func (x *Transaction_InvokeV1) GetNonce() *Felt252 { return nil } +// see https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c type Transaction_InvokeV3 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - MaxFee *Felt252 `protobuf:"bytes,2,opt,name=max_fee,json=maxFee,proto3" json:"max_fee,omitempty"` - Signature *AccountSignature `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` - Calldata []*Felt252 `protobuf:"bytes,4,rep,name=calldata,proto3" json:"calldata,omitempty"` - L1Gas *ResourceLimits `protobuf:"bytes,5,opt,name=l1_gas,json=l1Gas,proto3" json:"l1_gas,omitempty"` - L2Gas *ResourceLimits `protobuf:"bytes,6,opt,name=l2_gas,json=l2Gas,proto3" json:"l2_gas,omitempty"` - Tip *Felt252 `protobuf:"bytes,7,opt,name=tip,proto3" json:"tip,omitempty"` - Paymaster *Address `protobuf:"bytes,8,opt,name=paymaster,proto3" json:"paymaster,omitempty"` - NonceDomain string `protobuf:"bytes,9,opt,name=nonce_domain,json=nonceDomain,proto3" json:"nonce_domain,omitempty"` - FeeDomain string `protobuf:"bytes,10,opt,name=fee_domain,json=feeDomain,proto3" json:"fee_domain,omitempty"` - Nonce *Felt252 `protobuf:"bytes,11,opt,name=nonce,proto3" json:"nonce,omitempty"` + Sender *Address `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + Signature *AccountSignature `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Calldata []*Felt252 `protobuf:"bytes,3,rep,name=calldata,proto3" json:"calldata,omitempty"` + ResourceBounds *ResourceBounds `protobuf:"bytes,4,opt,name=resource_bounds,json=resourceBounds,proto3" json:"resource_bounds,omitempty"` + Tip uint64 `protobuf:"varint,5,opt,name=tip,proto3" json:"tip,omitempty"` + PaymasterData []*Felt252 `protobuf:"bytes,6,rep,name=paymaster_data,json=paymasterData,proto3" json:"paymaster_data,omitempty"` + AccountDeploymentData []*Felt252 `protobuf:"bytes,7,rep,name=account_deployment_data,json=accountDeploymentData,proto3" json:"account_deployment_data,omitempty"` + NonceDataAvailabilityMode VolitionDomain `protobuf:"varint,8,opt,name=nonce_data_availability_mode,json=nonceDataAvailabilityMode,proto3,enum=VolitionDomain" json:"nonce_data_availability_mode,omitempty"` + FeeDataAvailabilityMode VolitionDomain `protobuf:"varint,9,opt,name=fee_data_availability_mode,json=feeDataAvailabilityMode,proto3,enum=VolitionDomain" json:"fee_data_availability_mode,omitempty"` + Nonce *Felt252 `protobuf:"bytes,10,opt,name=nonce,proto3" json:"nonce,omitempty"` } func (x *Transaction_InvokeV3) Reset() { *x = Transaction_InvokeV3{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[15] + mi := &file_p2p_proto_transaction_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1365,7 +1456,7 @@ func (x *Transaction_InvokeV3) String() string { func (*Transaction_InvokeV3) ProtoMessage() {} func (x *Transaction_InvokeV3) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[15] + mi := &file_p2p_proto_transaction_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1378,7 +1469,7 @@ func (x *Transaction_InvokeV3) ProtoReflect() protoreflect.Message { // Deprecated: Use Transaction_InvokeV3.ProtoReflect.Descriptor instead. func (*Transaction_InvokeV3) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 9} + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 9} } func (x *Transaction_InvokeV3) GetSender() *Address { @@ -1388,13 +1479,6 @@ func (x *Transaction_InvokeV3) GetSender() *Address { return nil } -func (x *Transaction_InvokeV3) GetMaxFee() *Felt252 { - if x != nil { - return x.MaxFee - } - return nil -} - func (x *Transaction_InvokeV3) GetSignature() *AccountSignature { if x != nil { return x.Signature @@ -1409,46 +1493,46 @@ func (x *Transaction_InvokeV3) GetCalldata() []*Felt252 { return nil } -func (x *Transaction_InvokeV3) GetL1Gas() *ResourceLimits { +func (x *Transaction_InvokeV3) GetResourceBounds() *ResourceBounds { if x != nil { - return x.L1Gas + return x.ResourceBounds } return nil } -func (x *Transaction_InvokeV3) GetL2Gas() *ResourceLimits { +func (x *Transaction_InvokeV3) GetTip() uint64 { if x != nil { - return x.L2Gas + return x.Tip } - return nil + return 0 } -func (x *Transaction_InvokeV3) GetTip() *Felt252 { +func (x *Transaction_InvokeV3) GetPaymasterData() []*Felt252 { if x != nil { - return x.Tip + return x.PaymasterData } return nil } -func (x *Transaction_InvokeV3) GetPaymaster() *Address { +func (x *Transaction_InvokeV3) GetAccountDeploymentData() []*Felt252 { if x != nil { - return x.Paymaster + return x.AccountDeploymentData } return nil } -func (x *Transaction_InvokeV3) GetNonceDomain() string { +func (x *Transaction_InvokeV3) GetNonceDataAvailabilityMode() VolitionDomain { if x != nil { - return x.NonceDomain + return x.NonceDataAvailabilityMode } - return "" + return VolitionDomain_L1 } -func (x *Transaction_InvokeV3) GetFeeDomain() string { +func (x *Transaction_InvokeV3) GetFeeDataAvailabilityMode() VolitionDomain { if x != nil { - return x.FeeDomain + return x.FeeDataAvailabilityMode } - return "" + return VolitionDomain_L1 } func (x *Transaction_InvokeV3) GetNonce() *Felt252 { @@ -1458,7 +1542,7 @@ func (x *Transaction_InvokeV3) GetNonce() *Felt252 { return nil } -type Transaction_L1HandlerV1 struct { +type Transaction_L1HandlerV0 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1469,23 +1553,23 @@ type Transaction_L1HandlerV1 struct { Calldata []*Felt252 `protobuf:"bytes,4,rep,name=calldata,proto3" json:"calldata,omitempty"` } -func (x *Transaction_L1HandlerV1) Reset() { - *x = Transaction_L1HandlerV1{} +func (x *Transaction_L1HandlerV0) Reset() { + *x = Transaction_L1HandlerV0{} if protoimpl.UnsafeEnabled { - mi := &file_p2p_proto_transaction_proto_msgTypes[16] + mi := &file_p2p_proto_transaction_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Transaction_L1HandlerV1) String() string { +func (x *Transaction_L1HandlerV0) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Transaction_L1HandlerV1) ProtoMessage() {} +func (*Transaction_L1HandlerV0) ProtoMessage() {} -func (x *Transaction_L1HandlerV1) ProtoReflect() protoreflect.Message { - mi := &file_p2p_proto_transaction_proto_msgTypes[16] +func (x *Transaction_L1HandlerV0) ProtoReflect() protoreflect.Message { + mi := &file_p2p_proto_transaction_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1496,33 +1580,33 @@ func (x *Transaction_L1HandlerV1) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Transaction_L1HandlerV1.ProtoReflect.Descriptor instead. -func (*Transaction_L1HandlerV1) Descriptor() ([]byte, []int) { - return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{2, 10} +// Deprecated: Use Transaction_L1HandlerV0.ProtoReflect.Descriptor instead. +func (*Transaction_L1HandlerV0) Descriptor() ([]byte, []int) { + return file_p2p_proto_transaction_proto_rawDescGZIP(), []int{3, 10} } -func (x *Transaction_L1HandlerV1) GetNonce() *Felt252 { +func (x *Transaction_L1HandlerV0) GetNonce() *Felt252 { if x != nil { return x.Nonce } return nil } -func (x *Transaction_L1HandlerV1) GetAddress() *Address { +func (x *Transaction_L1HandlerV0) GetAddress() *Address { if x != nil { return x.Address } return nil } -func (x *Transaction_L1HandlerV1) GetEntryPointSelector() *Felt252 { +func (x *Transaction_L1HandlerV0) GetEntryPointSelector() *Felt252 { if x != nil { return x.EntryPointSelector } return nil } -func (x *Transaction_L1HandlerV1) GetCalldata() []*Felt252 { +func (x *Transaction_L1HandlerV0) GetCalldata() []*Felt252 { if x != nil { return x.Calldata } @@ -1535,209 +1619,214 @@ var file_p2p_proto_transaction_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x70, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, - 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x35, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, - 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x74, 0x22, 0x32, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, - 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xcf, 0x1c, 0x0a, 0x0b, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0a, 0x64, - 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, - 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x30, 0x48, 0x00, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x61, - 0x72, 0x65, 0x56, 0x30, 0x12, 0x37, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, - 0x76, 0x31, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x31, - 0x48, 0x00, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x31, 0x12, 0x37, 0x0a, - 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x09, 0x64, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x65, 0x56, 0x32, 0x12, 0x37, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, - 0x65, 0x5f, 0x76, 0x33, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x72, 0x61, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x70, 0x32, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x70, + 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x27, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x09, + 0x6d, 0x61, 0x78, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x12, 0x6d, 0x61, 0x78, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, + 0x0f, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x74, + 0x22, 0x60, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x6c, 0x31, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x31, 0x47, 0x61, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x6c, 0x32, + 0x5f, 0x67, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x32, 0x47, + 0x61, 0x73, 0x22, 0x32, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, + 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0xd3, 0x1e, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x5f, 0x76, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, - 0x56, 0x33, 0x48, 0x00, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x33, 0x12, - 0x2d, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x4a, - 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x76, 0x31, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x4a, 0x0a, 0x11, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x76, 0x33, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x33, 0x12, 0x34, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, - 0x5f, 0x76, 0x30, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x30, - 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x30, 0x12, 0x34, 0x0a, 0x09, - 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x76, 0x31, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, - 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, - 0x56, 0x31, 0x12, 0x34, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x76, 0x33, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, - 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x33, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x31, 0x5f, 0x68, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x31, 0x48, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x1a, 0xa7, 0x01, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, - 0x30, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, - 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, - 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x1a, 0xc7, 0x01, - 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x31, 0x12, 0x20, 0x0a, 0x06, 0x73, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, - 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, - 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x1a, 0x81, 0x02, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6c, - 0x61, 0x72, 0x65, 0x56, 0x32, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, - 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, - 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x12, 0x38, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x1a, 0xd7, 0x03, 0x0a, 0x09, - 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x33, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, - 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, - 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x11, 0x63, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x26, 0x0a, 0x06, 0x6c, 0x31, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x52, 0x05, 0x6c, 0x31, 0x47, 0x61, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x6c, 0x32, 0x5f, 0x67, 0x61, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x32, 0x47, 0x61, 0x73, 0x12, - 0x1a, 0x0a, 0x03, 0x74, 0x69, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, - 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x03, 0x74, 0x69, 0x70, 0x12, 0x26, 0x0a, 0x09, 0x70, - 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x65, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x1a, 0x81, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2b, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, - 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, - 0x61, 0x6c, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, - 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xfe, 0x01, 0x0a, 0x0f, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x21, 0x0a, - 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, - 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x5f, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, - 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x53, 0x61, 0x6c, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, - 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xd4, 0x03, 0x0a, 0x0f, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x33, 0x12, 0x21, - 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x56, 0x30, 0x48, 0x00, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x30, 0x12, + 0x37, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x31, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x31, 0x12, 0x37, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x5f, 0x76, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, + 0x32, 0x12, 0x37, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x33, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, + 0x09, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x33, 0x12, 0x2d, 0x0a, 0x06, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x48, + 0x00, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x76, 0x31, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x56, 0x31, 0x48, 0x00, 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x4a, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x76, 0x33, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x33, 0x48, 0x00, + 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x56, + 0x33, 0x12, 0x34, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x76, 0x30, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x30, 0x48, 0x00, 0x52, 0x08, 0x69, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x30, 0x12, 0x34, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, + 0x65, 0x5f, 0x76, 0x31, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, + 0x31, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x31, 0x12, 0x34, 0x0a, + 0x09, 0x69, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x5f, 0x76, 0x33, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x6f, 0x6b, + 0x65, 0x56, 0x33, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x31, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x56, + 0x30, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x1a, 0xa7, + 0x01, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x30, 0x12, 0x20, 0x0a, 0x06, + 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, + 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, - 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, + 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, - 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x5f, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, - 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, - 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x06, 0x6c, - 0x31, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x31, - 0x47, 0x61, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x6c, 0x32, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x32, 0x47, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x74, - 0x69, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, - 0x35, 0x32, 0x52, 0x03, 0x74, 0x69, 0x70, 0x12, 0x26, 0x0a, 0x09, 0x70, 0x61, 0x79, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x12, - 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x1a, 0xe4, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x30, 0x12, 0x21, - 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, - 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3a, 0x0a, 0x14, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x12, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, - 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xc6, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x76, - 0x6f, 0x6b, 0x65, 0x56, 0x31, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, - 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x1a, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x65, 0x56, 0x31, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, + 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, + 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x1a, 0xfe, 0x01, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, 0x32, + 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, + 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, + 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x13, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, + 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, + 0x61, 0x73, 0x68, 0x1a, 0xba, 0x04, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x56, + 0x33, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, + 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x11, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x38, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, + 0x69, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x74, 0x69, 0x70, 0x12, 0x2f, 0x0a, + 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, + 0x0d, 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, + 0x0a, 0x17, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x15, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x50, 0x0a, 0x1c, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x19, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x4c, 0x0a, 0x1a, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x17, 0x66, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x1a, 0x9b, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x24, 0x0a, 0x0a, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x2b, 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x73, 0x61, 0x6c, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, + 0x32, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x24, + 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0xfe, + 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x56, 0x31, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, + 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, + 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x0c, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, + 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x1a, + 0xf8, 0x03, 0x0a, 0x0f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x56, 0x33, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, + 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x0c, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0b, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, + 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, + 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x69, 0x70, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x74, 0x69, 0x70, 0x12, 0x2f, 0x0a, 0x0e, 0x70, 0x61, 0x79, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0d, 0x70, 0x61, 0x79, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x1c, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x52, 0x19, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x4c, 0x0a, 0x1a, + 0x66, 0x65, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x52, 0x17, 0x66, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0xe4, 0x01, 0x0a, 0x08, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x30, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, + 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x63, - 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x3a, 0x0a, 0x14, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x12, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x08, 0x63, + 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x1a, 0x9c, 0x03, 0x0a, 0x08, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x33, 0x12, 0x20, + 0x61, 0x1a, 0xc6, 0x01, 0x0a, 0x08, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x31, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -1747,52 +1836,82 @@ var file_p2p_proto_transaction_proto_rawDesc = []byte{ 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, - 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x06, 0x6c, 0x31, - 0x5f, 0x67, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x31, 0x47, - 0x61, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x6c, 0x32, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x52, 0x05, 0x6c, 0x32, 0x47, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x74, 0x69, - 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, - 0x32, 0x52, 0x03, 0x74, 0x69, 0x70, 0x12, 0x26, 0x0a, 0x09, 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x12, 0x21, - 0x0a, 0x0c, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x65, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x1a, 0xb3, 0x01, 0x0a, 0x0b, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x56, 0x31, - 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x12, 0x22, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x3a, 0x0a, 0x14, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x12, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, - 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x42, 0x05, 0x0a, 0x03, 0x74, 0x78, 0x6e, 0x22, 0x3f, 0x0a, - 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, - 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, - 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, - 0x44, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x0c, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, - 0x00, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, - 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x66, 0x69, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, + 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x1a, 0x82, 0x04, 0x0a, 0x08, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x56, 0x33, 0x12, 0x20, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x63, 0x61, + 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, + 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x38, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x69, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x74, 0x69, 0x70, 0x12, 0x2f, 0x0a, 0x0e, + 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x0d, + 0x70, 0x61, 0x79, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, + 0x17, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, + 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x15, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x50, 0x0a, 0x1c, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x19, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x4c, 0x0a, 0x1a, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x56, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x17, 0x66, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, + 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x1a, + 0xb3, 0x01, 0x0a, 0x0b, 0x4c, 0x31, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x56, 0x30, 0x12, + 0x1e, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, + 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, + 0x22, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x08, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x3a, 0x0a, 0x14, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x12, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x24, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x6c, 0x74, 0x32, 0x35, 0x32, 0x52, 0x08, 0x63, 0x61, 0x6c, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x42, 0x05, 0x0a, 0x03, 0x74, 0x78, 0x6e, 0x22, 0x6c, 0x0a, 0x16, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x2e, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, + 0x74, 0x52, 0x07, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x3f, 0x0a, 0x13, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x28, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9c, 0x01, 0x0a, 0x14, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x48, + 0x00, 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, + 0x74, 0x68, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x18, 0x0a, 0x03, 0x66, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x46, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x03, + 0x66, 0x69, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x40, 0x0a, 0x0c, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0c, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x31, 0x5a, 0x2f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x64, 0x45, 0x74, 0x68, 0x2f, 0x6a, 0x75, 0x6e, 0x6f, 0x2f, 0x70, 0x32, + 0x70, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x6b, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1808,126 +1927,130 @@ func file_p2p_proto_transaction_proto_rawDescGZIP() []byte { } var ( - file_p2p_proto_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 17) + file_p2p_proto_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 19) file_p2p_proto_transaction_proto_goTypes = []interface{}{ (*ResourceLimits)(nil), // 0: ResourceLimits - (*AccountSignature)(nil), // 1: AccountSignature - (*Transaction)(nil), // 2: Transaction - (*TransactionsRequest)(nil), // 3: TransactionsRequest - (*Transactions)(nil), // 4: Transactions - (*TransactionsResponse)(nil), // 5: TransactionsResponse - (*Transaction_DeclareV0)(nil), // 6: Transaction.DeclareV0 - (*Transaction_DeclareV1)(nil), // 7: Transaction.DeclareV1 - (*Transaction_DeclareV2)(nil), // 8: Transaction.DeclareV2 - (*Transaction_DeclareV3)(nil), // 9: Transaction.DeclareV3 - (*Transaction_Deploy)(nil), // 10: Transaction.Deploy - (*Transaction_DeployAccountV1)(nil), // 11: Transaction.DeployAccountV1 - (*Transaction_DeployAccountV3)(nil), // 12: Transaction.DeployAccountV3 - (*Transaction_InvokeV0)(nil), // 13: Transaction.InvokeV0 - (*Transaction_InvokeV1)(nil), // 14: Transaction.InvokeV1 - (*Transaction_InvokeV3)(nil), // 15: Transaction.InvokeV3 - (*Transaction_L1HandlerV1)(nil), // 16: Transaction.L1HandlerV1 - (*Felt252)(nil), // 17: Felt252 - (*Iteration)(nil), // 18: Iteration - (*BlockID)(nil), // 19: BlockID - (*Fin)(nil), // 20: Fin - (*Address)(nil), // 21: Address - (*Hash)(nil), // 22: Hash + (*ResourceBounds)(nil), // 1: ResourceBounds + (*AccountSignature)(nil), // 2: AccountSignature + (*Transaction)(nil), // 3: Transaction + (*TransactionWithReceipt)(nil), // 4: TransactionWithReceipt + (*TransactionsRequest)(nil), // 5: TransactionsRequest + (*TransactionsResponse)(nil), // 6: TransactionsResponse + (*Transactions)(nil), // 7: Transactions + (*Transaction_DeclareV0)(nil), // 8: Transaction.DeclareV0 + (*Transaction_DeclareV1)(nil), // 9: Transaction.DeclareV1 + (*Transaction_DeclareV2)(nil), // 10: Transaction.DeclareV2 + (*Transaction_DeclareV3)(nil), // 11: Transaction.DeclareV3 + (*Transaction_Deploy)(nil), // 12: Transaction.Deploy + (*Transaction_DeployAccountV1)(nil), // 13: Transaction.DeployAccountV1 + (*Transaction_DeployAccountV3)(nil), // 14: Transaction.DeployAccountV3 + (*Transaction_InvokeV0)(nil), // 15: Transaction.InvokeV0 + (*Transaction_InvokeV1)(nil), // 16: Transaction.InvokeV1 + (*Transaction_InvokeV3)(nil), // 17: Transaction.InvokeV3 + (*Transaction_L1HandlerV0)(nil), // 18: Transaction.L1HandlerV0 + (*Felt252)(nil), // 19: Felt252 + (*Receipt)(nil), // 20: Receipt + (*Iteration)(nil), // 21: Iteration + (*Fin)(nil), // 22: Fin + (*Address)(nil), // 23: Address + (*Hash)(nil), // 24: Hash + (VolitionDomain)(0), // 25: VolitionDomain } ) - var file_p2p_proto_transaction_proto_depIdxs = []int32{ - 17, // 0: ResourceLimits.max_amount:type_name -> Felt252 - 17, // 1: ResourceLimits.max_price_per_unit:type_name -> Felt252 - 17, // 2: AccountSignature.parts:type_name -> Felt252 - 6, // 3: Transaction.declare_v0:type_name -> Transaction.DeclareV0 - 7, // 4: Transaction.declare_v1:type_name -> Transaction.DeclareV1 - 8, // 5: Transaction.declare_v2:type_name -> Transaction.DeclareV2 - 9, // 6: Transaction.declare_v3:type_name -> Transaction.DeclareV3 - 10, // 7: Transaction.deploy:type_name -> Transaction.Deploy - 11, // 8: Transaction.deploy_account_v1:type_name -> Transaction.DeployAccountV1 - 12, // 9: Transaction.deploy_account_v3:type_name -> Transaction.DeployAccountV3 - 13, // 10: Transaction.invoke_v0:type_name -> Transaction.InvokeV0 - 14, // 11: Transaction.invoke_v1:type_name -> Transaction.InvokeV1 - 15, // 12: Transaction.invoke_v3:type_name -> Transaction.InvokeV3 - 16, // 13: Transaction.l1_handler:type_name -> Transaction.L1HandlerV1 - 18, // 14: TransactionsRequest.iteration:type_name -> Iteration - 2, // 15: Transactions.items:type_name -> Transaction - 19, // 16: TransactionsResponse.id:type_name -> BlockID - 4, // 17: TransactionsResponse.transactions:type_name -> Transactions - 20, // 18: TransactionsResponse.fin:type_name -> Fin - 21, // 19: Transaction.DeclareV0.sender:type_name -> Address - 17, // 20: Transaction.DeclareV0.max_fee:type_name -> Felt252 - 1, // 21: Transaction.DeclareV0.signature:type_name -> AccountSignature - 22, // 22: Transaction.DeclareV0.class_hash:type_name -> Hash - 21, // 23: Transaction.DeclareV1.sender:type_name -> Address - 17, // 24: Transaction.DeclareV1.max_fee:type_name -> Felt252 - 1, // 25: Transaction.DeclareV1.signature:type_name -> AccountSignature - 22, // 26: Transaction.DeclareV1.class_hash:type_name -> Hash - 17, // 27: Transaction.DeclareV1.nonce:type_name -> Felt252 - 21, // 28: Transaction.DeclareV2.sender:type_name -> Address - 17, // 29: Transaction.DeclareV2.max_fee:type_name -> Felt252 - 1, // 30: Transaction.DeclareV2.signature:type_name -> AccountSignature - 22, // 31: Transaction.DeclareV2.class_hash:type_name -> Hash - 17, // 32: Transaction.DeclareV2.nonce:type_name -> Felt252 - 17, // 33: Transaction.DeclareV2.compiled_class_hash:type_name -> Felt252 - 21, // 34: Transaction.DeclareV3.sender:type_name -> Address - 17, // 35: Transaction.DeclareV3.max_fee:type_name -> Felt252 - 1, // 36: Transaction.DeclareV3.signature:type_name -> AccountSignature - 22, // 37: Transaction.DeclareV3.class_hash:type_name -> Hash - 17, // 38: Transaction.DeclareV3.nonce:type_name -> Felt252 - 17, // 39: Transaction.DeclareV3.compiled_class_hash:type_name -> Felt252 - 0, // 40: Transaction.DeclareV3.l1_gas:type_name -> ResourceLimits - 0, // 41: Transaction.DeclareV3.l2_gas:type_name -> ResourceLimits - 17, // 42: Transaction.DeclareV3.tip:type_name -> Felt252 - 21, // 43: Transaction.DeclareV3.paymaster:type_name -> Address - 22, // 44: Transaction.Deploy.class_hash:type_name -> Hash - 17, // 45: Transaction.Deploy.address_salt:type_name -> Felt252 - 17, // 46: Transaction.Deploy.calldata:type_name -> Felt252 - 17, // 47: Transaction.DeployAccountV1.max_fee:type_name -> Felt252 - 1, // 48: Transaction.DeployAccountV1.signature:type_name -> AccountSignature - 22, // 49: Transaction.DeployAccountV1.class_hash:type_name -> Hash - 17, // 50: Transaction.DeployAccountV1.nonce:type_name -> Felt252 - 17, // 51: Transaction.DeployAccountV1.address_salt:type_name -> Felt252 - 17, // 52: Transaction.DeployAccountV1.calldata:type_name -> Felt252 - 17, // 53: Transaction.DeployAccountV3.max_fee:type_name -> Felt252 - 1, // 54: Transaction.DeployAccountV3.signature:type_name -> AccountSignature - 22, // 55: Transaction.DeployAccountV3.class_hash:type_name -> Hash - 17, // 56: Transaction.DeployAccountV3.nonce:type_name -> Felt252 - 17, // 57: Transaction.DeployAccountV3.address_salt:type_name -> Felt252 - 17, // 58: Transaction.DeployAccountV3.calldata:type_name -> Felt252 - 0, // 59: Transaction.DeployAccountV3.l1_gas:type_name -> ResourceLimits - 0, // 60: Transaction.DeployAccountV3.l2_gas:type_name -> ResourceLimits - 17, // 61: Transaction.DeployAccountV3.tip:type_name -> Felt252 - 21, // 62: Transaction.DeployAccountV3.paymaster:type_name -> Address - 17, // 63: Transaction.InvokeV0.max_fee:type_name -> Felt252 - 1, // 64: Transaction.InvokeV0.signature:type_name -> AccountSignature - 21, // 65: Transaction.InvokeV0.address:type_name -> Address - 17, // 66: Transaction.InvokeV0.entry_point_selector:type_name -> Felt252 - 17, // 67: Transaction.InvokeV0.calldata:type_name -> Felt252 - 21, // 68: Transaction.InvokeV1.sender:type_name -> Address - 17, // 69: Transaction.InvokeV1.max_fee:type_name -> Felt252 - 1, // 70: Transaction.InvokeV1.signature:type_name -> AccountSignature - 17, // 71: Transaction.InvokeV1.calldata:type_name -> Felt252 - 17, // 72: Transaction.InvokeV1.nonce:type_name -> Felt252 - 21, // 73: Transaction.InvokeV3.sender:type_name -> Address - 17, // 74: Transaction.InvokeV3.max_fee:type_name -> Felt252 - 1, // 75: Transaction.InvokeV3.signature:type_name -> AccountSignature - 17, // 76: Transaction.InvokeV3.calldata:type_name -> Felt252 - 0, // 77: Transaction.InvokeV3.l1_gas:type_name -> ResourceLimits - 0, // 78: Transaction.InvokeV3.l2_gas:type_name -> ResourceLimits - 17, // 79: Transaction.InvokeV3.tip:type_name -> Felt252 - 21, // 80: Transaction.InvokeV3.paymaster:type_name -> Address - 17, // 81: Transaction.InvokeV3.nonce:type_name -> Felt252 - 17, // 82: Transaction.L1HandlerV1.nonce:type_name -> Felt252 - 21, // 83: Transaction.L1HandlerV1.address:type_name -> Address - 17, // 84: Transaction.L1HandlerV1.entry_point_selector:type_name -> Felt252 - 17, // 85: Transaction.L1HandlerV1.calldata:type_name -> Felt252 - 86, // [86:86] is the sub-list for method output_type - 86, // [86:86] is the sub-list for method input_type - 86, // [86:86] is the sub-list for extension type_name - 86, // [86:86] is the sub-list for extension extendee - 0, // [0:86] is the sub-list for field type_name + 19, // 0: ResourceLimits.max_amount:type_name -> Felt252 + 19, // 1: ResourceLimits.max_price_per_unit:type_name -> Felt252 + 0, // 2: ResourceBounds.l1_gas:type_name -> ResourceLimits + 0, // 3: ResourceBounds.l2_gas:type_name -> ResourceLimits + 19, // 4: AccountSignature.parts:type_name -> Felt252 + 8, // 5: Transaction.declare_v0:type_name -> Transaction.DeclareV0 + 9, // 6: Transaction.declare_v1:type_name -> Transaction.DeclareV1 + 10, // 7: Transaction.declare_v2:type_name -> Transaction.DeclareV2 + 11, // 8: Transaction.declare_v3:type_name -> Transaction.DeclareV3 + 12, // 9: Transaction.deploy:type_name -> Transaction.Deploy + 13, // 10: Transaction.deploy_account_v1:type_name -> Transaction.DeployAccountV1 + 14, // 11: Transaction.deploy_account_v3:type_name -> Transaction.DeployAccountV3 + 15, // 12: Transaction.invoke_v0:type_name -> Transaction.InvokeV0 + 16, // 13: Transaction.invoke_v1:type_name -> Transaction.InvokeV1 + 17, // 14: Transaction.invoke_v3:type_name -> Transaction.InvokeV3 + 18, // 15: Transaction.l1_handler:type_name -> Transaction.L1HandlerV0 + 3, // 16: TransactionWithReceipt.transaction:type_name -> Transaction + 20, // 17: TransactionWithReceipt.receipt:type_name -> Receipt + 21, // 18: TransactionsRequest.iteration:type_name -> Iteration + 4, // 19: TransactionsResponse.transaction_with_receipt:type_name -> TransactionWithReceipt + 22, // 20: TransactionsResponse.fin:type_name -> Fin + 3, // 21: Transactions.transactions:type_name -> Transaction + 23, // 22: Transaction.DeclareV0.sender:type_name -> Address + 19, // 23: Transaction.DeclareV0.max_fee:type_name -> Felt252 + 2, // 24: Transaction.DeclareV0.signature:type_name -> AccountSignature + 24, // 25: Transaction.DeclareV0.class_hash:type_name -> Hash + 23, // 26: Transaction.DeclareV1.sender:type_name -> Address + 19, // 27: Transaction.DeclareV1.max_fee:type_name -> Felt252 + 2, // 28: Transaction.DeclareV1.signature:type_name -> AccountSignature + 24, // 29: Transaction.DeclareV1.class_hash:type_name -> Hash + 19, // 30: Transaction.DeclareV1.nonce:type_name -> Felt252 + 23, // 31: Transaction.DeclareV2.sender:type_name -> Address + 19, // 32: Transaction.DeclareV2.max_fee:type_name -> Felt252 + 2, // 33: Transaction.DeclareV2.signature:type_name -> AccountSignature + 24, // 34: Transaction.DeclareV2.class_hash:type_name -> Hash + 19, // 35: Transaction.DeclareV2.nonce:type_name -> Felt252 + 24, // 36: Transaction.DeclareV2.compiled_class_hash:type_name -> Hash + 23, // 37: Transaction.DeclareV3.sender:type_name -> Address + 2, // 38: Transaction.DeclareV3.signature:type_name -> AccountSignature + 24, // 39: Transaction.DeclareV3.class_hash:type_name -> Hash + 19, // 40: Transaction.DeclareV3.nonce:type_name -> Felt252 + 24, // 41: Transaction.DeclareV3.compiled_class_hash:type_name -> Hash + 1, // 42: Transaction.DeclareV3.resource_bounds:type_name -> ResourceBounds + 19, // 43: Transaction.DeclareV3.paymaster_data:type_name -> Felt252 + 19, // 44: Transaction.DeclareV3.account_deployment_data:type_name -> Felt252 + 25, // 45: Transaction.DeclareV3.nonce_data_availability_mode:type_name -> VolitionDomain + 25, // 46: Transaction.DeclareV3.fee_data_availability_mode:type_name -> VolitionDomain + 24, // 47: Transaction.Deploy.class_hash:type_name -> Hash + 19, // 48: Transaction.Deploy.address_salt:type_name -> Felt252 + 19, // 49: Transaction.Deploy.calldata:type_name -> Felt252 + 19, // 50: Transaction.DeployAccountV1.max_fee:type_name -> Felt252 + 2, // 51: Transaction.DeployAccountV1.signature:type_name -> AccountSignature + 24, // 52: Transaction.DeployAccountV1.class_hash:type_name -> Hash + 19, // 53: Transaction.DeployAccountV1.nonce:type_name -> Felt252 + 19, // 54: Transaction.DeployAccountV1.address_salt:type_name -> Felt252 + 19, // 55: Transaction.DeployAccountV1.calldata:type_name -> Felt252 + 2, // 56: Transaction.DeployAccountV3.signature:type_name -> AccountSignature + 24, // 57: Transaction.DeployAccountV3.class_hash:type_name -> Hash + 19, // 58: Transaction.DeployAccountV3.nonce:type_name -> Felt252 + 19, // 59: Transaction.DeployAccountV3.address_salt:type_name -> Felt252 + 19, // 60: Transaction.DeployAccountV3.calldata:type_name -> Felt252 + 1, // 61: Transaction.DeployAccountV3.resource_bounds:type_name -> ResourceBounds + 19, // 62: Transaction.DeployAccountV3.paymaster_data:type_name -> Felt252 + 25, // 63: Transaction.DeployAccountV3.nonce_data_availability_mode:type_name -> VolitionDomain + 25, // 64: Transaction.DeployAccountV3.fee_data_availability_mode:type_name -> VolitionDomain + 19, // 65: Transaction.InvokeV0.max_fee:type_name -> Felt252 + 2, // 66: Transaction.InvokeV0.signature:type_name -> AccountSignature + 23, // 67: Transaction.InvokeV0.address:type_name -> Address + 19, // 68: Transaction.InvokeV0.entry_point_selector:type_name -> Felt252 + 19, // 69: Transaction.InvokeV0.calldata:type_name -> Felt252 + 23, // 70: Transaction.InvokeV1.sender:type_name -> Address + 19, // 71: Transaction.InvokeV1.max_fee:type_name -> Felt252 + 2, // 72: Transaction.InvokeV1.signature:type_name -> AccountSignature + 19, // 73: Transaction.InvokeV1.calldata:type_name -> Felt252 + 19, // 74: Transaction.InvokeV1.nonce:type_name -> Felt252 + 23, // 75: Transaction.InvokeV3.sender:type_name -> Address + 2, // 76: Transaction.InvokeV3.signature:type_name -> AccountSignature + 19, // 77: Transaction.InvokeV3.calldata:type_name -> Felt252 + 1, // 78: Transaction.InvokeV3.resource_bounds:type_name -> ResourceBounds + 19, // 79: Transaction.InvokeV3.paymaster_data:type_name -> Felt252 + 19, // 80: Transaction.InvokeV3.account_deployment_data:type_name -> Felt252 + 25, // 81: Transaction.InvokeV3.nonce_data_availability_mode:type_name -> VolitionDomain + 25, // 82: Transaction.InvokeV3.fee_data_availability_mode:type_name -> VolitionDomain + 19, // 83: Transaction.InvokeV3.nonce:type_name -> Felt252 + 19, // 84: Transaction.L1HandlerV0.nonce:type_name -> Felt252 + 23, // 85: Transaction.L1HandlerV0.address:type_name -> Address + 19, // 86: Transaction.L1HandlerV0.entry_point_selector:type_name -> Felt252 + 19, // 87: Transaction.L1HandlerV0.calldata:type_name -> Felt252 + 88, // [88:88] is the sub-list for method output_type + 88, // [88:88] is the sub-list for method input_type + 88, // [88:88] is the sub-list for extension type_name + 88, // [88:88] is the sub-list for extension extendee + 0, // [0:88] is the sub-list for field type_name } func init() { file_p2p_proto_transaction_proto_init() } @@ -1936,6 +2059,7 @@ func file_p2p_proto_transaction_proto_init() { return } file_p2p_proto_common_proto_init() + file_p2p_proto_receipt_proto_init() if !protoimpl.UnsafeEnabled { file_p2p_proto_transaction_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceLimits); i { @@ -1950,7 +2074,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountSignature); i { + switch v := v.(*ResourceBounds); i { case 0: return &v.state case 1: @@ -1962,7 +2086,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction); i { + switch v := v.(*AccountSignature); i { case 0: return &v.state case 1: @@ -1974,7 +2098,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionsRequest); i { + switch v := v.(*Transaction); i { case 0: return &v.state case 1: @@ -1986,7 +2110,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transactions); i { + switch v := v.(*TransactionWithReceipt); i { case 0: return &v.state case 1: @@ -1998,7 +2122,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionsResponse); i { + switch v := v.(*TransactionsRequest); i { case 0: return &v.state case 1: @@ -2010,7 +2134,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_DeclareV0); i { + switch v := v.(*TransactionsResponse); i { case 0: return &v.state case 1: @@ -2022,7 +2146,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_DeclareV1); i { + switch v := v.(*Transactions); i { case 0: return &v.state case 1: @@ -2034,7 +2158,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_DeclareV2); i { + switch v := v.(*Transaction_DeclareV0); i { case 0: return &v.state case 1: @@ -2046,7 +2170,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_DeclareV3); i { + switch v := v.(*Transaction_DeclareV1); i { case 0: return &v.state case 1: @@ -2058,7 +2182,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_Deploy); i { + switch v := v.(*Transaction_DeclareV2); i { case 0: return &v.state case 1: @@ -2070,7 +2194,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_DeployAccountV1); i { + switch v := v.(*Transaction_DeclareV3); i { case 0: return &v.state case 1: @@ -2082,7 +2206,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_DeployAccountV3); i { + switch v := v.(*Transaction_Deploy); i { case 0: return &v.state case 1: @@ -2094,7 +2218,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_InvokeV0); i { + switch v := v.(*Transaction_DeployAccountV1); i { case 0: return &v.state case 1: @@ -2106,7 +2230,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_InvokeV1); i { + switch v := v.(*Transaction_DeployAccountV3); i { case 0: return &v.state case 1: @@ -2118,7 +2242,7 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_InvokeV3); i { + switch v := v.(*Transaction_InvokeV0); i { case 0: return &v.state case 1: @@ -2130,7 +2254,31 @@ func file_p2p_proto_transaction_proto_init() { } } file_p2p_proto_transaction_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transaction_L1HandlerV1); i { + switch v := v.(*Transaction_InvokeV1); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_transaction_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Transaction_InvokeV3); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_p2p_proto_transaction_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Transaction_L1HandlerV0); i { case 0: return &v.state case 1: @@ -2142,7 +2290,7 @@ func file_p2p_proto_transaction_proto_init() { } } } - file_p2p_proto_transaction_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_p2p_proto_transaction_proto_msgTypes[3].OneofWrappers = []interface{}{ (*Transaction_DeclareV0_)(nil), (*Transaction_DeclareV1_)(nil), (*Transaction_DeclareV2_)(nil), @@ -2155,8 +2303,8 @@ func file_p2p_proto_transaction_proto_init() { (*Transaction_InvokeV3_)(nil), (*Transaction_L1Handler)(nil), } - file_p2p_proto_transaction_proto_msgTypes[5].OneofWrappers = []interface{}{ - (*TransactionsResponse_Transactions)(nil), + file_p2p_proto_transaction_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*TransactionsResponse_TransactionWithReceipt)(nil), (*TransactionsResponse_Fin)(nil), } type x struct{} @@ -2165,7 +2313,7 @@ func file_p2p_proto_transaction_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_p2p_proto_transaction_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 19, NumExtensions: 0, NumServices: 0, }, diff --git a/p2p/starknet/starknet_test.go b/p2p/starknet/starknet_test.go index d0f45c1b98..05d3b6dc67 100644 --- a/p2p/starknet/starknet_test.go +++ b/p2p/starknet/starknet_test.go @@ -25,7 +25,7 @@ package starknet_test // // handlerHost := mockNet.Host(handlerID) // handlerHost.SetStreamHandler(starknet.CurrentBlockHeaderPID(testNetwork), handler.CurrentBlockHeaderHandler) -// handlerHost.SetStreamHandler(starknet.BlockHeadersPID(&testNetwork), handler.BlockHeadersHandler) +// handlerHost.SetStreamHandler(starknet.HeadersPID(&testNetwork), handler.HeadersHandler) // handlerHost.SetStreamHandler(starknet.BlockBodiesPID(&testNetwork), handler.BlockBodiesHandler) // handlerHost.SetStreamHandler(starknet.EventsPID(&testNetwork), handler.EventsHandler) // handlerHost.SetStreamHandler(starknet.ReceiptsPID(&testNetwork), handler.ReceiptsHandler) diff --git a/p2p/sync.go b/p2p/sync.go index 53ceaeff55..69be6d2f6f 100644 --- a/p2p/sync.go +++ b/p2p/sync.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "math/rand" + "reflect" "time" "github.com/NethermindEth/juno/adapters/p2p2core" @@ -17,6 +18,7 @@ import ( junoSync "github.com/NethermindEth/juno/sync" "github.com/NethermindEth/juno/utils" "github.com/NethermindEth/juno/utils/pipeline" + "github.com/davecgh/go-spew/spew" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" @@ -24,8 +26,6 @@ import ( "go.uber.org/zap" ) -const maxBlocks = 100 - type syncService struct { host host.Host network *utils.Network @@ -46,120 +46,72 @@ func newSyncService(bc *blockchain.Blockchain, h host.Host, n *utils.Network, lo } } -func (s *syncService) randomNodeHeight(ctx context.Context) (int, error) { - headersIt, err := s.client.RequestCurrentBlockHeader(ctx, &spec.CurrentBlockHeaderRequest{}) - if err != nil { - return 0, err - } - - var header *spec.BlockHeader - headersIt(func(res *spec.BlockHeadersResponse) bool { - for _, part := range res.GetPart() { - if _, ok := part.HeaderMessage.(*spec.BlockHeadersResponsePart_Header); ok { - header = part.GetHeader() - // found header - time to stop iterator - return false - } - } - - return true - }) - - return int(header.Number), nil -} - -const retryDuration = 5 * time.Second - -//nolint:funlen,gocyclo +//nolint:funlen func (s *syncService) start(ctx context.Context) { ctx, cancel := context.WithCancel(ctx) defer cancel() s.client = starknet.NewClient(s.randomPeerStream, s.network, s.log) - var randHeight int for i := 0; ; i++ { if err := ctx.Err(); err != nil { break } - s.log.Debugw("Continuous iteration", "i", i) iterCtx, cancelIteration := context.WithCancel(ctx) - var err error - randHeight, err = s.randomNodeHeight(iterCtx) - if err != nil { - cancelIteration() - if errors.Is(err, errNoPeers) { - s.log.Infow("No peers available", "retrying in", retryDuration.String()) - s.sleep(retryDuration) - } else { - s.logError("Failed to get random node height", err) - } - continue - } - var nextHeight int - if curHeight, err := s.blockchain.Height(); err == nil { //nolint:govet + if curHeight, err := s.blockchain.Height(); err == nil { nextHeight = int(curHeight) + 1 } else if !errors.Is(db.ErrKeyNotFound, err) { s.log.Errorw("Failed to get current height", "err", err) } - blockBehind := randHeight - (nextHeight - 1) - if blockBehind <= 0 { - s.log.Infow("Random node height is the same or less as local height", " retrying in", retryDuration.String(), - "Random node height", randHeight, "Current height", nextHeight-1) - cancelIteration() - s.sleep(retryDuration) - continue - } - - s.log.Infow("Start Pipeline", "Random node height", randHeight, "Current height", nextHeight-1, "Start", nextHeight, "End", - nextHeight+min(blockBehind, maxBlocks)) + s.log.Infow("Start Pipeline", "Current height", nextHeight-1, "Start", nextHeight) - commonIt := s.createIterator(uint64(nextHeight), uint64(min(blockBehind, maxBlocks))) - headersAndSigsCh, err := s.genHeadersAndSigs(iterCtx, commonIt) + // todo change iteration to fetch several objects uint64(min(blockBehind, maxBlocks)) + blockNumber := uint64(nextHeight) + headersAndSigsCh, err := s.genHeadersAndSigs(iterCtx, blockNumber) if err != nil { s.logError("Failed to get block headers parts", err) cancelIteration() continue } - blockBodiesCh, err := s.genBlockBodies(iterCtx, commonIt) + txsCh, err := s.genTransactions(iterCtx, blockNumber) if err != nil { - s.logError("Failed to get block bodies", err) + s.logError("Failed to get transactions", err) cancelIteration() continue } - txsCh, err := s.genTransactions(iterCtx, commonIt) + eventsCh, err := s.genEvents(iterCtx, blockNumber) if err != nil { - s.logError("Failed to get transactions", err) + s.logError("Failed to get classes", err) cancelIteration() continue } - receiptsCh, err := s.genReceipts(iterCtx, commonIt) + classesCh, err := s.genClasses(iterCtx, blockNumber) if err != nil { - s.logError("Failed to get receipts", err) + s.logError("Failed to get classes", err) cancelIteration() continue } - eventsCh, err := s.genEvents(iterCtx, commonIt) + stateDiffsCh, err := s.genStateDiffs(iterCtx, blockNumber) if err != nil { - s.logError("Failed to get events", err) + s.logError("Failed to get state diffs", err) cancelIteration() continue } blocksCh := pipeline.Bridge(iterCtx, s.processSpecBlockParts(iterCtx, uint64(nextHeight), pipeline.FanIn(iterCtx, pipeline.Stage(iterCtx, headersAndSigsCh, specBlockPartsFunc[specBlockHeaderAndSigs]), - pipeline.Stage(iterCtx, blockBodiesCh, specBlockPartsFunc[specBlockBody]), - pipeline.Stage(iterCtx, txsCh, specBlockPartsFunc[specTransactions]), - pipeline.Stage(iterCtx, receiptsCh, specBlockPartsFunc[specReceipts]), + pipeline.Stage(iterCtx, classesCh, specBlockPartsFunc[specClasses]), + pipeline.Stage(iterCtx, stateDiffsCh, specBlockPartsFunc[specContractDiffs]), + pipeline.Stage(iterCtx, txsCh, specBlockPartsFunc[specTxWithReceipts]), pipeline.Stage(iterCtx, eventsCh, specBlockPartsFunc[specEvents]), ))) @@ -179,15 +131,15 @@ func (s *syncService) start(ctx context.Context) { break } - s.log.Infow("Stored Block", "number", b.block.Number, "hash", b.block.Hash.ShortString(), "root", - b.block.GlobalStateRoot.ShortString()) + s.log.Infow("Stored Block", "number", b.block.Number, "hash", b.block.Hash.ShortString(), + "root", b.block.GlobalStateRoot.ShortString()) s.listener.OnSyncStepDone(junoSync.OpStore, b.block.Number, time.Since(storeTimer)) } cancelIteration() } } -func specBlockPartsFunc[T specBlockHeaderAndSigs | specBlockBody | specTransactions | specReceipts | specEvents](i T) specBlockParts { +func specBlockPartsFunc[T specBlockHeaderAndSigs | specTxWithReceipts | specEvents | specClasses | specContractDiffs](i T) specBlockParts { return specBlockParts(i) } @@ -202,6 +154,8 @@ func (s *syncService) logError(msg string, err error) { } log.Errorw(msg, "err", err) + } else { + s.log.Debugw("Sync context canceled") } } @@ -224,10 +178,10 @@ func (s *syncService) processSpecBlockParts( defer close(orderedBlockBodiesCh) specBlockHeadersAndSigsM := make(map[uint64]specBlockHeaderAndSigs) - specBlockBodiesM := make(map[uint64]specBlockBody) - specTransactionsM := make(map[uint64]specTransactions) - specReceiptsM := make(map[uint64]specReceipts) + specClassesM := make(map[uint64]specClasses) + specTransactionsM := make(map[uint64]specTxWithReceipts) specEventsM := make(map[uint64]specEvents) + specContractDiffsM := make(map[uint64]specContractDiffs) curBlockNum := startingBlockNum for part := range specBlockPartsCh { @@ -236,38 +190,40 @@ func (s *syncService) processSpecBlockParts( default: switch p := part.(type) { case specBlockHeaderAndSigs: - s.log.Debugw("Received Block Header and Signatures", "blockNumber", p.header.Number) + s.log.Debugw("Received Block Header with signatures", "blockNumber", p.blockNumber()) if _, ok := specBlockHeadersAndSigsM[part.blockNumber()]; !ok { specBlockHeadersAndSigsM[part.blockNumber()] = p } - case specBlockBody: - s.log.Debugw("Received Block Body parts", "blockNumber", p.id.Number) - if _, ok := specBlockBodiesM[part.blockNumber()]; !ok { - specBlockBodiesM[part.blockNumber()] = p - } - case specTransactions: - s.log.Debugw("Received Transactions", "blockNumber", p.id.Number) + case specTxWithReceipts: + s.log.Debugw("Received Transactions with receipts", "blockNumber", p.blockNumber(), "txLen", len(p.txs)) if _, ok := specTransactionsM[part.blockNumber()]; !ok { specTransactionsM[part.blockNumber()] = p } - case specReceipts: - s.log.Debugw("Received Receipts", "blockNumber", p.id.Number) - if _, ok := specReceiptsM[part.blockNumber()]; !ok { - specReceiptsM[part.blockNumber()] = p - } case specEvents: - s.log.Debugw("Received Events", "blockNumber", p.id.Number) + s.log.Debugw("Received Events", "blockNumber", p.blockNumber(), "len", len(p.events)) if _, ok := specEventsM[part.blockNumber()]; !ok { specEventsM[part.blockNumber()] = p } + case specClasses: + s.log.Debugw("Received Classes", "blockNumber", p.blockNumber()) + if _, ok := specClassesM[part.blockNumber()]; !ok { + specClassesM[part.blockNumber()] = p + } + case specContractDiffs: + s.log.Debugw("Received ContractDiffs", "blockNumber", p.blockNumber()) + if _, ok := specContractDiffsM[part.blockNumber()]; !ok { + specContractDiffsM[part.blockNumber()] = p + } + default: + s.log.Warnw("Unsupported part type", "blockNumber", part.blockNumber(), "type", reflect.TypeOf(p)) } - headerAndSig, ok1 := specBlockHeadersAndSigsM[curBlockNum] - body, ok2 := specBlockBodiesM[curBlockNum] - txs, ok3 := specTransactionsM[curBlockNum] - rs, ok4 := specReceiptsM[curBlockNum] - es, ok5 := specEventsM[curBlockNum] - if ok1 && ok2 && ok3 && ok4 && ok5 { + headerAndSig, okHeader := specBlockHeadersAndSigsM[curBlockNum] + txs, okTxs := specTransactionsM[curBlockNum] + es, okEvents := specEventsM[curBlockNum] + cls, okClasses := specClassesM[curBlockNum] + diffs, okDiffs := specContractDiffsM[curBlockNum] + if okHeader && okTxs && okEvents && okClasses && okDiffs { s.log.Debugw(fmt.Sprintf("----- Received all block parts from peers for block number %d-----", curBlockNum)) select { @@ -277,7 +233,7 @@ func (s *syncService) processSpecBlockParts( if curBlockNum > 0 { // First check cache if the header is not present, then get it from the db. if oldHeader, ok := specBlockHeadersAndSigsM[curBlockNum-1]; ok { - prevBlockRoot = p2p2core.AdaptHash(oldHeader.header.State.Root) + prevBlockRoot = p2p2core.AdaptHash(oldHeader.header.StateRoot) } else { oldHeader, err := s.blockchain.BlockHeaderByNumber(curBlockNum - 1) if err != nil { @@ -288,16 +244,14 @@ func (s *syncService) processSpecBlockParts( } } - orderedBlockBodiesCh <- s.adaptAndSanityCheckBlock(ctx, headerAndSig.header, headerAndSig.sig, body.stateDiff, - body.classes, txs.txs, rs.receipts, es.events, prevBlockRoot) + orderedBlockBodiesCh <- s.adaptAndSanityCheckBlock(ctx, headerAndSig.header, diffs.contractDiffs, + cls.classes, txs.txs, txs.receipts, es.events, prevBlockRoot) } if curBlockNum > 0 { delete(specBlockHeadersAndSigsM, curBlockNum-1) } - delete(specBlockBodiesM, curBlockNum) delete(specTransactionsM, curBlockNum) - delete(specReceiptsM, curBlockNum) delete(specEventsM, curBlockNum) curBlockNum++ } @@ -307,8 +261,9 @@ func (s *syncService) processSpecBlockParts( return orderedBlockBodiesCh } -func (s *syncService) adaptAndSanityCheckBlock(ctx context.Context, header *spec.BlockHeader, sig *spec.Signatures, diff *spec.StateDiff, - classes *spec.Classes, txs *spec.Transactions, receipts *spec.Receipts, events *spec.Events, prevBlockRoot *felt.Felt, +//nolint:gocyclo,funlen +func (s *syncService) adaptAndSanityCheckBlock(ctx context.Context, header *spec.SignedBlockHeader, contractDiffs []*spec.ContractDiff, + classes []*spec.Class, txs []*spec.Transaction, receipts []*spec.Receipt, events []*spec.Event, prevBlockRoot *felt.Felt, ) <-chan blockBody { bodyCh := make(chan blockBody) go func() { @@ -320,30 +275,57 @@ func (s *syncService) adaptAndSanityCheckBlock(ctx context.Context, header *spec coreBlock := new(core.Block) var coreTxs []core.Transaction - for _, i := range txs.GetItems() { - coreTxs = append(coreTxs, p2p2core.AdaptTransaction(i, s.network)) + for _, tx := range txs { + coreTxs = append(coreTxs, p2p2core.AdaptTransaction(tx, s.network)) } coreBlock.Transactions = coreTxs txHashEventsM := make(map[felt.Felt][]*core.Event) - for _, item := range events.GetItems() { - txH := p2p2core.AdaptHash(item.TransactionHash) - txHashEventsM[*txH] = append(txHashEventsM[*txH], p2p2core.AdaptEvent(item)) + for _, event := range events { + txH := p2p2core.AdaptHash(event.TransactionHash) + txHashEventsM[*txH] = append(txHashEventsM[*txH], p2p2core.AdaptEvent(event)) } - coreReceipts := utils.Map(receipts.GetItems(), p2p2core.AdaptReceipt) + var coreReceipts []*core.TransactionReceipt + for i, r := range receipts { + txHash := coreTxs[i].Hash() + if txHash == nil { + spew.Dump(coreTxs[i]) + panic(fmt.Errorf("TX hash %d is nil", i)) + } + coreReceipts = append(coreReceipts, p2p2core.AdaptReceipt(r, txHash)) + } coreReceipts = utils.Map(coreReceipts, func(r *core.TransactionReceipt) *core.TransactionReceipt { r.Events = txHashEventsM[*r.TransactionHash] return r }) coreBlock.Receipts = coreReceipts - coreHeader := p2p2core.AdaptBlockHeader(header) - coreHeader.Signatures = utils.Map(sig.GetSignatures(), p2p2core.AdaptSignature) + eventsBloom := core.EventsBloom(coreBlock.Receipts) + coreBlock.Header = p2p2core.AdaptBlockHeader(header, eventsBloom) + + if int(coreBlock.TransactionCount) != len(coreBlock.Transactions) { + s.log.Errorw( + "Number of transactions != count", + "transactionCount", + coreBlock.TransactionCount, + "len(transactions)", + len(coreBlock.Transactions), + ) + return + } + if int(coreBlock.EventCount) != len(events) { + s.log.Errorw( + "Number of events != count", + "eventCount", + coreBlock.EventCount, + "len(events)", + len(events), + ) + return + } - coreBlock.Header = &coreHeader - coreBlock.EventsBloom = core.EventsBloom(coreBlock.Receipts) h, err := core.BlockHash(coreBlock) if err != nil { bodyCh <- blockBody{err: fmt.Errorf("block hash calculation error: %v", err)} @@ -352,8 +334,8 @@ func (s *syncService) adaptAndSanityCheckBlock(ctx context.Context, header *spec coreBlock.Hash = h newClasses := make(map[felt.Felt]core.Class) - for _, i := range classes.GetClasses() { - coreC := p2p2core.AdaptClass(i) + for _, cls := range classes { + coreC := p2p2core.AdaptClass(cls) h, err = coreC.Hash() if err != nil { bodyCh <- blockBody{err: fmt.Errorf("class hash calculation error: %v", err)} @@ -366,11 +348,26 @@ func (s *syncService) adaptAndSanityCheckBlock(ctx context.Context, header *spec // Note: Parts of the State Update are created from Blockchain object as the Store and SanityCheck functions require a State // Update but there is no such message in P2P. + stateReader, stateCloser, err := s.blockchain.StateAtBlockNumber(coreBlock.Number - 1) + if err != nil && !errors.Is(err, db.ErrKeyNotFound) { + // todo(kirill) change to shutdown + panic(err) + } + defer func() { + if stateCloser == nil { + return + } + + if closeErr := stateCloser(); closeErr != nil { + s.log.Errorw("Failed to close state reader", "err", closeErr) + } + }() + stateUpdate := &core.StateUpdate{ BlockHash: coreBlock.Hash, NewRoot: coreBlock.GlobalStateRoot, OldRoot: prevBlockRoot, - StateDiff: p2p2core.AdaptStateDiff(diff, classes.GetClasses()), + StateDiff: p2p2core.AdaptStateDiff(stateReader, contractDiffs, classes), } commitments, err := s.blockchain.SanityCheckNewHeight(coreBlock, stateUpdate, newClasses) @@ -394,15 +391,15 @@ type specBlockParts interface { } type specBlockHeaderAndSigs struct { - header *spec.BlockHeader - sig *spec.Signatures + header *spec.SignedBlockHeader } func (s specBlockHeaderAndSigs) blockNumber() uint64 { return s.header.Number } -func (s *syncService) genHeadersAndSigs(ctx context.Context, it *spec.Iteration) (<-chan specBlockHeaderAndSigs, error) { +func (s *syncService) genHeadersAndSigs(ctx context.Context, blockNumber uint64) (<-chan specBlockHeaderAndSigs, error) { + it := s.createIteratorForBlock(blockNumber) headersIt, err := s.client.RequestBlockHeaders(ctx, &spec.BlockHeadersRequest{Iteration: it}) if err != nil { return nil, err @@ -414,15 +411,14 @@ func (s *syncService) genHeadersAndSigs(ctx context.Context, it *spec.Iteration) headersIt(func(res *spec.BlockHeadersResponse) bool { headerAndSig := specBlockHeaderAndSigs{} - for _, part := range res.GetPart() { - switch part.HeaderMessage.(type) { - case *spec.BlockHeadersResponsePart_Header: - headerAndSig.header = part.GetHeader() - case *spec.BlockHeadersResponsePart_Signatures: - headerAndSig.sig = part.GetSignatures() - case *spec.BlockHeadersResponsePart_Fin: - return false - } + switch v := res.HeaderMessage.(type) { + case *spec.BlockHeadersResponse_Header: + headerAndSig.header = v.Header + case *spec.BlockHeadersResponse_Fin: + return false + default: + s.log.Warnw("Unexpected HeaderMessage from getBlockHeaders", "v", v) + return false } select { @@ -438,117 +434,111 @@ func (s *syncService) genHeadersAndSigs(ctx context.Context, it *spec.Iteration) return headersAndSigCh, nil } -type specBlockBody struct { - id *spec.BlockID - proof *spec.BlockProof - classes *spec.Classes - stateDiff *spec.StateDiff +type specClasses struct { + number uint64 + classes []*spec.Class } -func (s specBlockBody) blockNumber() uint64 { - return s.id.Number +func (s specClasses) blockNumber() uint64 { + return s.number } -func (s *syncService) genBlockBodies(ctx context.Context, it *spec.Iteration) (<-chan specBlockBody, error) { - blockIt, err := s.client.RequestBlockBodies(ctx, &spec.BlockBodiesRequest{Iteration: it}) +func (s *syncService) genClasses(ctx context.Context, blockNumber uint64) (<-chan specClasses, error) { + it := s.createIteratorForBlock(blockNumber) + classesIt, err := s.client.RequestClasses(ctx, &spec.ClassesRequest{Iteration: it}) if err != nil { return nil, err } - specBodiesCh := make(chan specBlockBody) + classesCh := make(chan specClasses) go func() { - defer close(specBodiesCh) - curBlockBody := new(specBlockBody) - // Assumes that all parts of the same block will arrive before the next block parts - // Todo: the above assumption may not be true. A peer may decide to send different parts of the block in different order - // If the above assumption is not true we should return separate channels for each of the parts. Also, see todo above specBlockBody - // on line 317 in p2p/sync.go - - blockIt(func(res *spec.BlockBodiesResponse) bool { - switch res.BodyMessage.(type) { - case *spec.BlockBodiesResponse_Classes: - if curBlockBody.id == nil { - curBlockBody.id = res.GetId() - } - curBlockBody.classes = res.GetClasses() - case *spec.BlockBodiesResponse_Diff: - if curBlockBody.id == nil { - curBlockBody.id = res.GetId() - } - curBlockBody.stateDiff = res.GetDiff() - case *spec.BlockBodiesResponse_Proof: - if curBlockBody.id == nil { - curBlockBody.id = res.GetId() - } - curBlockBody.proof = res.GetProof() - case *spec.BlockBodiesResponse_Fin: - if curBlockBody.id != nil { - select { - case <-ctx.Done(): - return false - default: - specBodiesCh <- *curBlockBody - curBlockBody = new(specBlockBody) - } - } + defer close(classesCh) + + var classes []*spec.Class + classesIt(func(res *spec.ClassesResponse) bool { + switch v := res.ClassMessage.(type) { + case *spec.ClassesResponse_Class: + classes = append(classes, v.Class) + return true + case *spec.ClassesResponse_Fin: + return false + default: + s.log.Warnw("Unexpected ClassMessage from getClasses", "v", v) + return false } - - return true }) - }() - return specBodiesCh, nil + select { + case <-ctx.Done(): + case classesCh <- specClasses{ + number: blockNumber, + classes: classes, + }: + s.log.Debugw("Received classes for block", "blockNumber", blockNumber, "lenClasses", len(classes)) + } + }() + return classesCh, nil } -type specReceipts struct { - id *spec.BlockID - receipts *spec.Receipts +type specContractDiffs struct { + number uint64 + contractDiffs []*spec.ContractDiff } -func (s specReceipts) blockNumber() uint64 { - return s.id.Number +func (s specContractDiffs) blockNumber() uint64 { + return s.number } -//nolint:dupl -func (s *syncService) genReceipts(ctx context.Context, it *spec.Iteration) (<-chan specReceipts, error) { - receiptsIt, err := s.client.RequestReceipts(ctx, &spec.ReceiptsRequest{Iteration: it}) +func (s *syncService) genStateDiffs(ctx context.Context, blockNumber uint64) (<-chan specContractDiffs, error) { + it := s.createIteratorForBlock(blockNumber) + stateDiffsIt, err := s.client.RequestStateDiffs(ctx, &spec.StateDiffsRequest{Iteration: it}) if err != nil { return nil, err } - receiptsCh := make(chan specReceipts) + stateDiffsCh := make(chan specContractDiffs) go func() { - defer close(receiptsCh) - - receiptsIt(func(res *spec.ReceiptsResponse) bool { - switch res.Responses.(type) { - case *spec.ReceiptsResponse_Receipts: - select { - case <-ctx.Done(): - return false - case receiptsCh <- specReceipts{res.GetId(), res.GetReceipts()}: - } - case *spec.ReceiptsResponse_Fin: + defer close(stateDiffsCh) + + var contractDiffs []*spec.ContractDiff + stateDiffsIt(func(res *spec.StateDiffsResponse) bool { + switch v := res.StateDiffMessage.(type) { + case *spec.StateDiffsResponse_ContractDiff: + contractDiffs = append(contractDiffs, v.ContractDiff) + return true + case *spec.StateDiffsResponse_DeclaredClass: + s.log.Warnw("Unimplemented message StateDiffsResponse_DeclaredClass") + return true + case *spec.StateDiffsResponse_Fin: + return false + default: + s.log.Warnw("Unexpected ClassMessage from getStateDiffs", "v", v) return false } - - return true }) - }() - return receiptsCh, nil + select { + case <-ctx.Done(): + case stateDiffsCh <- specContractDiffs{ + number: blockNumber, + contractDiffs: contractDiffs, + }: + } + }() + return stateDiffsCh, nil } type specEvents struct { - id *spec.BlockID - events *spec.Events + number uint64 + events []*spec.Event } func (s specEvents) blockNumber() uint64 { - return s.id.Number + return s.number } -func (s *syncService) genEvents(ctx context.Context, it *spec.Iteration) (<-chan specEvents, error) { +func (s *syncService) genEvents(ctx context.Context, blockNumber uint64) (<-chan specEvents, error) { + it := s.createIteratorForBlock(blockNumber) eventsIt, err := s.client.RequestEvents(ctx, &spec.EventsRequest{Iteration: it}) if err != nil { return nil, err @@ -558,59 +548,82 @@ func (s *syncService) genEvents(ctx context.Context, it *spec.Iteration) (<-chan go func() { defer close(eventsCh) + var events []*spec.Event eventsIt(func(res *spec.EventsResponse) bool { - switch res.Responses.(type) { - case *spec.EventsResponse_Events: - select { - case <-ctx.Done(): - return false - case eventsCh <- specEvents{res.GetId(), res.GetEvents()}: - return true - } + switch v := res.EventMessage.(type) { + case *spec.EventsResponse_Event: + events = append(events, v.Event) + return true case *spec.EventsResponse_Fin: return false + default: + s.log.Warnw("Unexpected EventMessage from getEvents", "v", v) + return false } - - return true }) + + select { + case <-ctx.Done(): + case eventsCh <- specEvents{ + number: blockNumber, + events: events, + }: + } }() return eventsCh, nil } -type specTransactions struct { - id *spec.BlockID - txs *spec.Transactions +type specTxWithReceipts struct { + number uint64 + txs []*spec.Transaction + receipts []*spec.Receipt } -func (s specTransactions) blockNumber() uint64 { - return s.id.Number +func (s specTxWithReceipts) blockNumber() uint64 { + return s.number } -//nolint:dupl -func (s *syncService) genTransactions(ctx context.Context, it *spec.Iteration) (<-chan specTransactions, error) { +func (s *syncService) genTransactions(ctx context.Context, blockNumber uint64) (<-chan specTxWithReceipts, error) { + it := s.createIteratorForBlock(blockNumber) txsIt, err := s.client.RequestTransactions(ctx, &spec.TransactionsRequest{Iteration: it}) if err != nil { return nil, err } - txsCh := make(chan specTransactions) + txsCh := make(chan specTxWithReceipts) go func() { defer close(txsCh) + var ( + transactions []*spec.Transaction + receipts []*spec.Receipt + ) txsIt(func(res *spec.TransactionsResponse) bool { - switch res.Responses.(type) { - case *spec.TransactionsResponse_Transactions: - select { - case <-ctx.Done(): - return false - case txsCh <- specTransactions{res.GetId(), res.GetTransactions()}: - } + switch v := res.TransactionMessage.(type) { + case *spec.TransactionsResponse_TransactionWithReceipt: + txWithReceipt := v.TransactionWithReceipt + transactions = append(transactions, txWithReceipt.Transaction) + receipts = append(receipts, txWithReceipt.Receipt) + return true case *spec.TransactionsResponse_Fin: return false + default: + s.log.Warnw("Unexpected TransactionMessage from getTransactions", "v", v) + return false } - - return true }) + + s.log.Debugw("Transactions length", "len", len(transactions)) + spexTxs := specTxWithReceipts{ + number: blockNumber, + txs: transactions, + receipts: receipts, + } + select { + case <-ctx.Done(): + return + case txsCh <- spexTxs: + } }() return txsCh, nil } @@ -643,6 +656,7 @@ func (s *syncService) randomPeerStream(ctx context.Context, pids ...protocol.ID) } stream, err := s.host.NewStream(ctx, randPeer, pids...) if err != nil { + s.log.Debugw("Error creating stream", "peer", randPeer, "err", err) s.removePeer(randPeer) return nil, err } @@ -655,14 +669,11 @@ func (s *syncService) removePeer(id peer.ID) { s.host.Peerstore().ClearAddrs(id) } -func (s *syncService) createIterator(start, limit uint64) *spec.Iteration { - if limit == 0 { - limit = 1 - } +func (s *syncService) createIteratorForBlock(blockNumber uint64) *spec.Iteration { return &spec.Iteration{ - Start: &spec.Iteration_BlockNumber{BlockNumber: start}, + Start: &spec.Iteration_BlockNumber{BlockNumber: blockNumber}, Direction: spec.Iteration_Forward, - Limit: limit, + Limit: 1, Step: 1, } } @@ -671,6 +682,7 @@ func (s *syncService) WithListener(l junoSync.EventListener) { s.listener = l } +//nolint:unused func (s *syncService) sleep(d time.Duration) { s.log.Debugw("Sleeping...", "for", d) time.Sleep(d) diff --git a/rpc/block_test.go b/rpc/block_test.go index 76af9079c6..f778ac7350 100644 --- a/rpc/block_test.go +++ b/rpc/block_test.go @@ -95,7 +95,7 @@ func TestBlockNumber(t *testing.T) { t.Cleanup(mockCtrl.Finish) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", utils.Ptr(utils.Mainnet), nil) + handler := rpc.New(mockReader, nil, nil, "", nil) t.Run("empty blockchain", func(t *testing.T) { expectedHeight := uint64(0) @@ -122,7 +122,7 @@ func TestBlockHashAndNumber(t *testing.T) { n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) t.Run("empty blockchain", func(t *testing.T) { mockReader.EXPECT().Head().Return(nil, errors.New("empty blockchain")) @@ -155,7 +155,7 @@ func TestBlockTransactionCount(t *testing.T) { n := utils.Ptr(utils.Sepolia) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) client := feeder.NewTestClient(t, n) gw := adaptfeeder.New(client) @@ -240,7 +240,7 @@ func TestBlockWithTxHashes(t *testing.T) { log := utils.NewNopZapLogger() n := utils.Ptr(utils.Mainnet) chain := blockchain.New(pebble.NewMemTest(t), n) - handler := rpc.New(chain, nil, nil, "", n, log) + handler := rpc.New(chain, nil, nil, "", log) block, rpcErr := handler.BlockWithTxHashes(id) assert.Nil(t, block) @@ -253,7 +253,7 @@ func TestBlockWithTxHashes(t *testing.T) { n := utils.Ptr(utils.Sepolia) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) client := feeder.NewTestClient(t, n) gw := adaptfeeder.New(client) @@ -359,7 +359,7 @@ func TestBlockWithTxs(t *testing.T) { log := utils.NewNopZapLogger() n := utils.Ptr(utils.Mainnet) chain := blockchain.New(pebble.NewMemTest(t), n) - handler := rpc.New(chain, nil, nil, "", n, log) + handler := rpc.New(chain, nil, nil, "", log) block, rpcErr := handler.BlockWithTxs(id) assert.Nil(t, block) @@ -372,7 +372,7 @@ func TestBlockWithTxs(t *testing.T) { n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) client := feeder.NewTestClient(t, n) gw := adaptfeeder.New(client) @@ -492,7 +492,7 @@ func TestBlockWithTxHashesV013(t *testing.T) { mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) blockNumber := uint64(16350) gw := adaptfeeder.New(feeder.NewTestClient(t, n)) @@ -560,7 +560,7 @@ func TestBlockWithReceipts(t *testing.T) { n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) t.Run("transaction not found", func(t *testing.T) { blockID := rpc.BlockID{Number: 777} @@ -680,7 +680,7 @@ func TestRpcBlockAdaptation(t *testing.T) { n := utils.Ptr(utils.Sepolia) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) client := feeder.NewTestClient(t, n) gw := adaptfeeder.New(client) diff --git a/rpc/chain_test.go b/rpc/chain_test.go index 412b3159e6..d2506d28ba 100644 --- a/rpc/chain_test.go +++ b/rpc/chain_test.go @@ -21,7 +21,7 @@ func TestChainId(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockReader.EXPECT().Network().Return(n) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) cID, err := handler.ChainID() require.Nil(t, err) diff --git a/rpc/class_test.go b/rpc/class_test.go index fc7191110c..44d48c81d1 100644 --- a/rpc/class_test.go +++ b/rpc/class_test.go @@ -37,7 +37,7 @@ func TestClass(t *testing.T) { return nil }, nil).AnyTimes() mockReader.EXPECT().HeadsHeader().Return(new(core.Header), nil).AnyTimes() - handler := rpc.New(mockReader, nil, nil, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, nil, "", utils.NewNopZapLogger()) latest := rpc.BlockID{Latest: true} @@ -68,7 +68,7 @@ func TestClass(t *testing.T) { t.Run("state by id error", func(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, nil, "", utils.NewNopZapLogger()) mockReader.EXPECT().HeadState().Return(nil, nil, db.ErrKeyNotFound) @@ -80,7 +80,7 @@ func TestClass(t *testing.T) { t.Run("class hash not found error", func(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockState := mocks.NewMockStateHistoryReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, nil, "", utils.NewNopZapLogger()) mockReader.EXPECT().HeadState().Return(mockState, func() error { return nil @@ -120,7 +120,7 @@ func TestClassAt(t *testing.T) { return nil }, nil).AnyTimes() mockReader.EXPECT().HeadsHeader().Return(new(core.Header), nil).AnyTimes() - handler := rpc.New(mockReader, nil, nil, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, nil, "", utils.NewNopZapLogger()) latest := rpc.BlockID{Latest: true} @@ -150,10 +150,9 @@ func TestClassHashAt(t *testing.T) { mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) - n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) log := utils.NewNopZapLogger() - handler := rpc.New(mockReader, nil, nil, "", n, log) + handler := rpc.New(mockReader, nil, nil, "", log) t.Run("empty blockchain", func(t *testing.T) { mockReader.EXPECT().HeadState().Return(nil, nil, db.ErrKeyNotFound) diff --git a/rpc/contract_test.go b/rpc/contract_test.go index b1b12d974b..8f9e100aa3 100644 --- a/rpc/contract_test.go +++ b/rpc/contract_test.go @@ -18,10 +18,9 @@ func TestNonce(t *testing.T) { mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) - n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) log := utils.NewNopZapLogger() - handler := rpc.New(mockReader, nil, nil, "", n, log) + handler := rpc.New(mockReader, nil, nil, "", log) t.Run("empty blockchain", func(t *testing.T) { mockReader.EXPECT().HeadState().Return(nil, nil, db.ErrKeyNotFound) @@ -92,10 +91,9 @@ func TestStorageAt(t *testing.T) { mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) - n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) log := utils.NewNopZapLogger() - handler := rpc.New(mockReader, nil, nil, "", n, log) + handler := rpc.New(mockReader, nil, nil, "", log) t.Run("empty blockchain", func(t *testing.T) { mockReader.EXPECT().HeadState().Return(nil, nil, db.ErrKeyNotFound) diff --git a/rpc/estimate_fee_test.go b/rpc/estimate_fee_test.go index d3f98eb063..da3703e977 100644 --- a/rpc/estimate_fee_test.go +++ b/rpc/estimate_fee_test.go @@ -28,7 +28,7 @@ func TestEstimateMessageFee(t *testing.T) { mockReader.EXPECT().Network().Return(n).AnyTimes() mockVM := mocks.NewMockVM(mockCtrl) - handler := rpc.New(mockReader, nil, mockVM, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, mockVM, "", utils.NewNopZapLogger()) msg := rpc.MsgFromL1{ From: common.HexToAddress("0xDEADBEEF"), To: *new(felt.Felt).SetUint64(1337), @@ -102,7 +102,7 @@ func TestEstimateFee(t *testing.T) { mockReader.EXPECT().Network().Return(n).AnyTimes() mockVM := mocks.NewMockVM(mockCtrl) log := utils.NewNopZapLogger() - handler := rpc.New(mockReader, nil, mockVM, "", n, log) + handler := rpc.New(mockReader, nil, mockVM, "", log) mockState := mocks.NewMockStateHistoryReader(mockCtrl) mockReader.EXPECT().HeadState().Return(mockState, nopCloser, nil).AnyTimes() diff --git a/rpc/events_test.go b/rpc/events_test.go index 14abda0d27..3db08d233e 100644 --- a/rpc/events_test.go +++ b/rpc/events_test.go @@ -50,7 +50,7 @@ func TestEvents(t *testing.T) { } } - handler := rpc.New(chain, nil, nil, "", n, utils.NewNopZapLogger()) + handler := rpc.New(chain, nil, nil, "", utils.NewNopZapLogger()) from := utils.HexToFelt(t, "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7") args := rpc.EventsArg{ EventFilter: rpc.EventFilter{ @@ -240,7 +240,7 @@ func TestSubscribeNewHeadsAndUnsubscribe(t *testing.T) { t.Cleanup(cancel) chain := blockchain.New(pebble.NewMemTest(t), n) syncer := sync.New(chain, gw, log, 0, false) - handler := rpc.New(chain, syncer, nil, "", n, log) + handler := rpc.New(chain, syncer, nil, "", log) go func() { require.NoError(t, handler.Run(ctx)) @@ -322,7 +322,7 @@ func TestMultipleSubscribeNewHeadsAndUnsubscribe(t *testing.T) { t.Cleanup(cancel) chain := blockchain.New(pebble.NewMemTest(t), n) syncer := sync.New(chain, gw, log, 0, false) - handler := rpc.New(chain, syncer, nil, "", n, log) + handler := rpc.New(chain, syncer, nil, "", log) go func() { require.NoError(t, handler.Run(ctx)) }() diff --git a/rpc/handlers.go b/rpc/handlers.go index fd300f841b..cfaf1f37a1 100644 --- a/rpc/handlers.go +++ b/rpc/handlers.go @@ -18,7 +18,6 @@ import ( "github.com/NethermindEth/juno/utils" "github.com/NethermindEth/juno/vm" "github.com/ethereum/go-ethereum/common/lru" - "github.com/hashicorp/go-set/v2" "github.com/sourcegraph/conc" ) @@ -81,9 +80,7 @@ type Handler struct { vm vm.VM log utils.Logger - version string - forceFeederTracesForBlocks *set.Set[uint64] - + version string newHeads *feed.Feed[*core.Header] idgen func() uint64 @@ -102,7 +99,7 @@ type subscription struct { conn jsonrpc.Conn } -func New(bcReader blockchain.Reader, syncReader sync.Reader, virtualMachine vm.VM, version string, network *utils.Network, +func New(bcReader blockchain.Reader, syncReader sync.Reader, virtualMachine vm.VM, version string, logger utils.Logger, ) *Handler { return &Handler{ @@ -116,10 +113,9 @@ func New(bcReader blockchain.Reader, syncReader sync.Reader, virtualMachine vm.V } return n }, - version: version, - forceFeederTracesForBlocks: set.From(network.BlockHashMetaInfo.ForceFetchingTracesForBlocks), - newHeads: feed.New[*core.Header](), - subscriptions: make(map[uint64]*subscription), + version: version, + newHeads: feed.New[*core.Header](), + subscriptions: make(map[uint64]*subscription), blockTraceCache: lru.NewCache[traceCacheKey, []TracedBlockTransaction](traceCacheSize), filterLimit: math.MaxUint, diff --git a/rpc/handlers_test.go b/rpc/handlers_test.go index 32248ef974..48374d20d8 100644 --- a/rpc/handlers_test.go +++ b/rpc/handlers_test.go @@ -20,14 +20,14 @@ func nopCloser() error { return nil } func TestVersion(t *testing.T) { const version = "1.2.3-rc1" - handler := rpc.New(nil, nil, nil, version, utils.Ptr(utils.Mainnet), nil) + handler := rpc.New(nil, nil, nil, version, nil) ver, err := handler.Version() require.Nil(t, err) assert.Equal(t, version, ver) } func TestSpecVersion(t *testing.T) { - handler := rpc.New(nil, nil, nil, "", utils.Ptr(utils.Mainnet), nil) + handler := rpc.New(nil, nil, nil, "", nil) version, rpcErr := handler.SpecVersion() require.Nil(t, rpcErr) require.Equal(t, "0.7.1", version) @@ -45,7 +45,7 @@ func TestThrottledVMError(t *testing.T) { mockVM := mocks.NewMockVM(mockCtrl) throttledVM := node.NewThrottledVM(mockVM, 0, 0) - handler := rpc.New(mockReader, nil, throttledVM, "", utils.Ptr(utils.Mainnet), nil) + handler := rpc.New(mockReader, nil, throttledVM, "", nil) mockState := mocks.NewMockStateHistoryReader(mockCtrl) throttledErr := "VM throughput limit reached" diff --git a/rpc/simulation.go b/rpc/simulation.go index e994e13732..4948c062ac 100644 --- a/rpc/simulation.go +++ b/rpc/simulation.go @@ -77,7 +77,7 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra return nil, rpcErr } - var txns []core.Transaction + txns := make([]core.Transaction, 0, len(transactions)) var classes []core.Class paidFeesOnL1 := make([]*felt.Felt, 0) @@ -119,7 +119,7 @@ func (h *Handler) simulateTransactions(id BlockID, transactions []BroadcastedTra return nil, ErrUnexpectedError.CloneWithData(err.Error()) } - var result []SimulatedTransaction + result := make([]SimulatedTransaction, 0, len(overallFees)) for i, overallFee := range overallFees { feeUnit := feeUnit(txns[i]) diff --git a/rpc/simulation_test.go b/rpc/simulation_test.go index 538f271988..135d8c879d 100644 --- a/rpc/simulation_test.go +++ b/rpc/simulation_test.go @@ -24,7 +24,7 @@ func TestSimulateTransactions(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockReader.EXPECT().Network().Return(n).AnyTimes() mockVM := mocks.NewMockVM(mockCtrl) - handler := rpc.New(mockReader, nil, mockVM, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, mockVM, "", utils.NewNopZapLogger()) mockState := mocks.NewMockStateHistoryReader(mockCtrl) mockReader.EXPECT().HeadState().Return(mockState, nopCloser, nil).AnyTimes() diff --git a/rpc/state_update_test.go b/rpc/state_update_test.go index feb9888c06..94ca90e84d 100644 --- a/rpc/state_update_test.go +++ b/rpc/state_update_test.go @@ -30,7 +30,7 @@ func TestStateUpdate(t *testing.T) { for description, id := range errTests { t.Run(description, func(t *testing.T) { chain := blockchain.New(pebble.NewMemTest(t), n) - handler := rpc.New(chain, nil, nil, "", n, nil) + handler := rpc.New(chain, nil, nil, "", nil) update, rpcErr := handler.StateUpdate(id) assert.Nil(t, update) @@ -40,7 +40,7 @@ func TestStateUpdate(t *testing.T) { mockCtrl := gomock.NewController(t) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) client := feeder.NewTestClient(t, n) mainnetGw := adaptfeeder.New(client) diff --git a/rpc/sync_test.go b/rpc/sync_test.go index 493cf47458..555aa07382 100644 --- a/rpc/sync_test.go +++ b/rpc/sync_test.go @@ -8,7 +8,6 @@ import ( "github.com/NethermindEth/juno/core/felt" "github.com/NethermindEth/juno/mocks" "github.com/NethermindEth/juno/rpc" - "github.com/NethermindEth/juno/utils" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" ) @@ -17,10 +16,9 @@ func TestSyncing(t *testing.T) { mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) - n := utils.Ptr(utils.Mainnet) synchronizer := mocks.NewMockSyncReader(mockCtrl) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, synchronizer, nil, "", n, nil) + handler := rpc.New(mockReader, synchronizer, nil, "", nil) defaultSyncState := false startingBlock := uint64(0) diff --git a/rpc/trace.go b/rpc/trace.go index e3dd09617a..809a8481de 100644 --- a/rpc/trace.go +++ b/rpc/trace.go @@ -15,7 +15,9 @@ import ( "github.com/NethermindEth/juno/vm" ) -var traceFallbackVersion = semver.MustParse("0.12.3") +var traceFallbackVersion = semver.MustParse("0.13.1") + +const excludedVersion = "0.13.1.1" func adaptBlockTrace(block *BlockWithTxs, blockTrace *starknet.BlockTrace) ([]TracedBlockTransaction, error) { if blockTrace == nil { @@ -198,8 +200,8 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block, if !isPending { if blockVer, err := core.ParseBlockVersion(block.ProtocolVersion); err != nil { return nil, ErrUnexpectedError.CloneWithData(err.Error()) - } else if blockVer.Compare(traceFallbackVersion) != 1 || h.forceFeederTracesForBlocks.Contains(block.Number) { - // version <= 0.12.3 or forcing fetch some blocks from feeder gateway + } else if blockVer.Compare(traceFallbackVersion) != 1 && block.ProtocolVersion != excludedVersion { + // version <= 0.13.1 and not 0.13.1.1 fetch blocks from feeder gateway return h.fetchTraces(ctx, block.Hash) } @@ -271,7 +273,7 @@ func (h *Handler) traceBlockTransactions(ctx context.Context, block *core.Block, return nil, ErrUnexpectedError.CloneWithData(err.Error()) } - var result []TracedBlockTransaction + result := make([]TracedBlockTransaction, 0, len(traces)) for index, trace := range traces { if !v0_6Response { feeUnit := feeUnit(block.Transactions[index]) diff --git a/rpc/trace_test.go b/rpc/trace_test.go index 289b32d517..b1a4debaf2 100644 --- a/rpc/trace_test.go +++ b/rpc/trace_test.go @@ -58,7 +58,7 @@ func TestTraceFallback(t *testing.T) { mockReader.EXPECT().BlockByHash(utils.HexToFelt(t, test.hash)).DoAndReturn(func(_ *felt.Felt) (block *core.Block, err error) { return mockReader.BlockByNumber(test.blockNumber) }).Times(2) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) _, jErr := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Number: test.blockNumber}) require.Equal(t, rpc.ErrInternal.Code, jErr.Code) @@ -79,7 +79,7 @@ func TestTraceTransaction(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockReader.EXPECT().Network().Return(&utils.Mainnet).AnyTimes() mockVM := mocks.NewMockVM(mockCtrl) - handler := rpc.New(mockReader, nil, mockVM, "", utils.Ptr(utils.Mainnet), utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, mockVM, "", utils.NewNopZapLogger()) t.Run("not found", func(t *testing.T) { hash := utils.HexToFelt(t, "0xBBBB") @@ -245,7 +245,8 @@ func TestTraceTransaction(t *testing.T) { consumedGas := []*felt.Felt{new(felt.Felt).SetUint64(1)} overallFee := []*felt.Felt{new(felt.Felt).SetUint64(1)} mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, - &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, true).Return(overallFee, consumedGas, []vm.TransactionTrace{*vmTrace}, nil) + &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, true). + Return(overallFee, consumedGas, []vm.TransactionTrace{*vmTrace}, nil) trace, err := handler.TraceTransaction(context.Background(), *hash) require.Nil(t, err) @@ -267,7 +268,7 @@ func TestTraceTransactionV0_6(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockReader.EXPECT().Network().Return(&utils.Mainnet).AnyTimes() mockVM := mocks.NewMockVM(mockCtrl) - handler := rpc.New(mockReader, nil, mockVM, "", utils.Ptr(utils.Mainnet), utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, mockVM, "", utils.NewNopZapLogger()) t.Run("not found", func(t *testing.T) { hash := utils.HexToFelt(t, "0xBBBB") @@ -324,7 +325,8 @@ func TestTraceTransactionV0_6(t *testing.T) { vmTrace := new(vm.TransactionTrace) require.NoError(t, json.Unmarshal(vmTraceJSON, vmTrace)) mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, - &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, false).Return(nil, nil, []vm.TransactionTrace{*vmTrace}, nil) + &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, false). + Return(nil, nil, []vm.TransactionTrace{*vmTrace}, nil) trace, err := handler.TraceTransactionV0_6(context.Background(), *hash) require.Nil(t, err) @@ -379,7 +381,8 @@ func TestTraceTransactionV0_6(t *testing.T) { vmTrace := new(vm.TransactionTrace) require.NoError(t, json.Unmarshal(vmTraceJSON, vmTrace)) mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, - &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, false).Return(nil, nil, []vm.TransactionTrace{*vmTrace}, nil) + &vm.BlockInfo{Header: header}, gomock.Any(), &utils.Mainnet, false, false, false, false). + Return(nil, nil, []vm.TransactionTrace{*vmTrace}, nil) trace, err := handler.TraceTransactionV0_6(context.Background(), *hash) require.Nil(t, err) @@ -402,7 +405,7 @@ func TestTraceBlockTransactions(t *testing.T) { log := utils.NewNopZapLogger() n := utils.Ptr(utils.Mainnet) chain := blockchain.New(pebble.NewMemTest(t), n) - handler := rpc.New(chain, nil, nil, "", n, log) + handler := rpc.New(chain, nil, nil, "", log) update, rpcErr := handler.TraceBlockTransactions(context.Background(), id) assert.Nil(t, update) @@ -419,7 +422,7 @@ func TestTraceBlockTransactions(t *testing.T) { mockVM := mocks.NewMockVM(mockCtrl) log := utils.NewNopZapLogger() - handler := rpc.New(mockReader, nil, mockVM, "", n, log) + handler := rpc.New(mockReader, nil, mockVM, "", log) t.Run("pending block", func(t *testing.T) { blockHash := utils.HexToFelt(t, "0x0001") @@ -470,7 +473,8 @@ func TestTraceBlockTransactions(t *testing.T) { vmTrace := vm.TransactionTrace{} require.NoError(t, json.Unmarshal(vmTraceJSON, &vmTrace)) mockVM.EXPECT().Execute(block.Transactions, []core.Class{declaredClass.Class}, paidL1Fees, &vm.BlockInfo{Header: header}, - gomock.Any(), n, false, false, false, false).Return(nil, []vm.TransactionTrace{vmTrace, vmTrace}, nil) + gomock.Any(), n, false, false, false, false). + Return(nil, []vm.TransactionTrace{vmTrace, vmTrace}, nil) result, err := handler.TraceBlockTransactions(context.Background(), rpc.BlockID{Hash: blockHash}) require.Nil(t, err) @@ -536,7 +540,8 @@ func TestTraceBlockTransactions(t *testing.T) { vmTrace := vm.TransactionTrace{} require.NoError(t, json.Unmarshal(vmTraceJSON, &vmTrace)) mockVM.EXPECT().Execute([]core.Transaction{tx}, []core.Class{declaredClass.Class}, []*felt.Felt{}, &vm.BlockInfo{Header: header}, - gomock.Any(), n, false, false, false, false).Return(nil, []vm.TransactionTrace{vmTrace}, nil) + gomock.Any(), n, false, false, false, false). + Return(nil, []vm.TransactionTrace{vmTrace}, nil) expectedResult := []rpc.TracedBlockTransaction{ { @@ -557,7 +562,7 @@ func TestCall(t *testing.T) { n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) mockVM := mocks.NewMockVM(mockCtrl) - handler := rpc.New(mockReader, nil, mockVM, "", n, utils.NewNopZapLogger()) + handler := rpc.New(mockReader, nil, mockVM, "", utils.NewNopZapLogger()) t.Run("empty blockchain", func(t *testing.T) { mockReader.EXPECT().HeadState().Return(nil, nil, db.ErrKeyNotFound) diff --git a/rpc/transaction_test.go b/rpc/transaction_test.go index 4ef9b5a3c9..78bc9c3f6d 100644 --- a/rpc/transaction_test.go +++ b/rpc/transaction_test.go @@ -27,11 +27,10 @@ func TestTransactionByHashNotFound(t *testing.T) { t.Cleanup(mockCtrl.Finish) mockReader := mocks.NewMockReader(mockCtrl) - n := utils.Ptr(utils.Mainnet) txHash := new(felt.Felt).SetBytes([]byte("random hash")) mockReader.EXPECT().TransactionByHash(txHash).Return(nil, errors.New("tx not found")) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) tx, rpcErr := handler.TransactionByHash(*txHash) assert.Nil(t, tx) @@ -323,7 +322,7 @@ func TestTransactionByHash(t *testing.T) { mockReader.EXPECT().TransactionByHash(gomock.Any()).DoAndReturn(func(hash *felt.Felt) (core.Transaction, error) { return gw.Transaction(context.Background(), hash) }).Times(1) - handler := rpc.New(mockReader, nil, nil, "", test.network, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) hash, err := new(felt.Felt).SetString(test.hash) require.NoError(t, err) @@ -357,7 +356,7 @@ func TestTransactionByBlockIdAndIndex(t *testing.T) { require.NoError(t, err) latestBlockHash := latestBlock.Hash - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) t.Run("empty blockchain", func(t *testing.T) { mockReader.EXPECT().HeadsHeader().Return(nil, db.ErrKeyNotFound) @@ -501,7 +500,7 @@ func TestTransactionReceiptByHash(t *testing.T) { n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) t.Run("transaction not found", func(t *testing.T) { txHash := new(felt.Felt).SetBytes([]byte("random hash")) @@ -760,7 +759,7 @@ func TestLegacyTransactionReceiptByHash(t *testing.T) { n := utils.Ptr(utils.Mainnet) mockReader := mocks.NewMockReader(mockCtrl) - handler := rpc.New(mockReader, nil, nil, "", n, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) t.Run("transaction not found", func(t *testing.T) { txHash := new(felt.Felt).SetBytes([]byte("random hash")) @@ -1316,7 +1315,7 @@ func TestAddTransaction(t *testing.T) { }`), nil). Times(1) - handler := rpc.New(nil, nil, nil, "", n, utils.NewNopZapLogger()) + handler := rpc.New(nil, nil, nil, "", utils.NewNopZapLogger()) _, rpcErr := handler.AddTransaction(context.Background(), test.txn) require.Equal(t, rpcErr.Code, rpc.ErrInternal.Code) @@ -1379,7 +1378,7 @@ func TestTransactionStatus(t *testing.T) { mockReader.EXPECT().Receipt(tx.Hash()).Return(block.Receipts[0], block.Hash, block.Number, nil) mockReader.EXPECT().L1Head().Return(nil, nil) - handler := rpc.New(mockReader, nil, nil, "", test.network, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) want := &rpc.TransactionStatus{ Finality: rpc.TxnStatusAcceptedOnL2, @@ -1397,7 +1396,7 @@ func TestTransactionStatus(t *testing.T) { BlockNumber: block.Number + 1, }, nil) - handler := rpc.New(mockReader, nil, nil, "", test.network, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) want := &rpc.TransactionStatus{ Finality: rpc.TxnStatusAcceptedOnL1, @@ -1427,7 +1426,7 @@ func TestTransactionStatus(t *testing.T) { t.Run(description, func(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockReader.EXPECT().TransactionByHash(notFoundTest.hash).Return(nil, db.ErrKeyNotFound).Times(2) - handler := rpc.New(mockReader, nil, nil, "", test.network, nil) + handler := rpc.New(mockReader, nil, nil, "", nil) _, err := handler.TransactionStatus(ctx, *notFoundTest.hash) require.Equal(t, rpc.ErrTxnHashNotFound.Code, err.Code) @@ -1444,7 +1443,7 @@ func TestTransactionStatus(t *testing.T) { t.Run("transaction not found in db and feeder ", func(t *testing.T) { mockReader := mocks.NewMockReader(mockCtrl) mockReader.EXPECT().TransactionByHash(test.notFoundTxHash).Return(nil, db.ErrKeyNotFound) - handler := rpc.New(mockReader, nil, nil, "", test.network, nil).WithFeeder(client) + handler := rpc.New(mockReader, nil, nil, "", nil).WithFeeder(client) _, err := handler.TransactionStatus(ctx, *test.notFoundTxHash) require.NotNil(t, err) diff --git a/starknet/block.go b/starknet/block.go index 18a4a5c8ef..c7f65394ce 100644 --- a/starknet/block.go +++ b/starknet/block.go @@ -14,6 +14,9 @@ type Block struct { StateRoot *felt.Felt `json:"state_root"` TransactionCommitment *felt.Felt `json:"transaction_commitment"` EventCommitment *felt.Felt `json:"event_commitment"` + ReceiptCommitment *felt.Felt `json:"receipt_commitment"` + StateDiffCommitment *felt.Felt `json:"state_diff_commitment"` + StateDiffLength uint64 `json:"state_diff_length"` Status string `json:"status"` Transactions []*Transaction `json:"transactions"` Timestamp uint64 `json:"timestamp"` diff --git a/starknet/compiler.go b/starknet/compiler.go index 3e006a66a3..99545ad1f1 100644 --- a/starknet/compiler.go +++ b/starknet/compiler.go @@ -6,8 +6,8 @@ package starknet // extern char* compileSierraToCasm(char* sierra_json); // extern void freeCstr(char* ptr); // -// #cgo vm_debug LDFLAGS: -L./rust/target/debug -ljuno_starknet_compiler_rs -ldl -lm -// #cgo !vm_debug LDFLAGS: -L./rust/target/release -ljuno_starknet_compiler_rs -ldl -lm +// #cgo vm_debug LDFLAGS: -L./rust/target/debug -ljuno_starknet_compiler_rs +// #cgo !vm_debug LDFLAGS: -L./rust/target/release -ljuno_starknet_compiler_rs import "C" import ( diff --git a/starknet/rust/Cargo.toml b/starknet/rust/Cargo.toml index 10fdc905dc..5a84b57548 100644 --- a/starknet/rust/Cargo.toml +++ b/starknet/rust/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] serde = "1.0.171" serde_json = { version = "1.0.96", features = ["raw_value"] } -cairo-lang-starknet-classes = "=2.6.0" +cairo-lang-starknet-classes = "=2.7.0-rc.3" [lib] crate-type = ["staticlib"] diff --git a/starknet/transaction.go b/starknet/transaction.go index e563ba121e..3898e95e5b 100644 --- a/starknet/transaction.go +++ b/starknet/transaction.go @@ -219,6 +219,7 @@ type ExecutionResources struct { BuiltinInstanceCounter BuiltinInstanceCounter `json:"builtin_instance_counter"` MemoryHoles uint64 `json:"n_memory_holes"` DataAvailability *DataAvailability `json:"data_availability"` + TotalGasConsumed *GasConsumed `json:"total_gas_consumed"` } type DataAvailability struct { @@ -236,6 +237,14 @@ type BuiltinInstanceCounter struct { Keccak uint64 `json:"keccak_builtin"` Poseidon uint64 `json:"poseidon_builtin"` SegmentArena uint64 `json:"segment_arena_builtin"` + AddMod uint64 `json:"add_mod_builtin"` + MulMod uint64 `json:"mul_mod_builtin"` + RangeCheck96 uint64 `json:"range_check96_builtin"` +} + +type GasConsumed struct { + L1Gas uint64 `json:"l1_gas"` + L1DataGas uint64 `json:"l1_data_gas"` } type TransactionReceipt struct { diff --git a/sync/sync_test.go b/sync/sync_test.go index 96181d2d89..4f1d8a096a 100644 --- a/sync/sync_test.go +++ b/sync/sync_test.go @@ -24,8 +24,6 @@ import ( const timeout = time.Second func TestSyncBlocks(t *testing.T) { - t.Parallel() - mockCtrl := gomock.NewController(t) t.Cleanup(mockCtrl.Finish) @@ -56,7 +54,6 @@ func TestSyncBlocks(t *testing.T) { } log := utils.NewNopZapLogger() t.Run("sync multiple blocks in an empty db", func(t *testing.T) { - t.Parallel() testDB := pebble.NewMemTest(t) bc := blockchain.New(testDB, &utils.Mainnet) synchronizer := sync.New(bc, gw, log, time.Duration(0), false) @@ -69,7 +66,6 @@ func TestSyncBlocks(t *testing.T) { }) t.Run("sync multiple blocks in a non-empty db", func(t *testing.T) { - t.Parallel() testDB := pebble.NewMemTest(t) bc := blockchain.New(testDB, &utils.Mainnet) b0, err := gw.BlockByNumber(context.Background(), 0) @@ -88,7 +84,6 @@ func TestSyncBlocks(t *testing.T) { }) t.Run("sync multiple blocks, with an unreliable gw", func(t *testing.T) { - t.Parallel() testDB := pebble.NewMemTest(t) bc := blockchain.New(testDB, &utils.Mainnet) @@ -142,7 +137,6 @@ func TestSyncBlocks(t *testing.T) { } func TestReorg(t *testing.T) { - t.Parallel() mainClient := feeder.NewTestClient(t, &utils.Mainnet) mainGw := adaptfeeder.New(mainClient) @@ -153,22 +147,21 @@ func TestReorg(t *testing.T) { // sync to integration for 2 blocks bc := blockchain.New(testDB, &utils.Integration) - synchronizer := sync.New(bc, integGw, utils.NewNopZapLogger(), time.Duration(0), false) + synchronizer := sync.New(bc, integGw, utils.NewNopZapLogger(), 0, false) ctx, cancel := context.WithTimeout(context.Background(), timeout) require.NoError(t, synchronizer.Run(ctx)) cancel() t.Run("resync to mainnet with the same db", func(t *testing.T) { - t.Parallel() - bc = blockchain.New(testDB, &utils.Mainnet) + bc := blockchain.New(testDB, &utils.Mainnet) // Ensure current head is Integration head head, err := bc.HeadsHeader() require.NoError(t, err) require.Equal(t, utils.HexToFelt(t, "0x34e815552e42c5eb5233b99de2d3d7fd396e575df2719bf98e7ed2794494f86"), head.Hash) - synchronizer = sync.New(bc, mainGw, utils.NewNopZapLogger(), time.Duration(0), false) + synchronizer = sync.New(bc, mainGw, utils.NewNopZapLogger(), 0, false) ctx, cancel = context.WithTimeout(context.Background(), timeout) require.NoError(t, synchronizer.Run(ctx)) cancel() diff --git a/utils/log_test.go b/utils/log_test.go index 5f77b2735d..8a5954b872 100644 --- a/utils/log_test.go +++ b/utils/log_test.go @@ -20,7 +20,7 @@ var levelStrings = map[utils.LogLevel]string{ func TestLogLevelString(t *testing.T) { for level, str := range levelStrings { - t.Run("level "+str, func(t *testing.T) { //nolint:goconst + t.Run("level "+str, func(t *testing.T) { assert.Equal(t, str, level.String()) }) } diff --git a/utils/network.go b/utils/network.go index 7491b1af31..c0988c82f6 100644 --- a/utils/network.go +++ b/utils/network.go @@ -8,7 +8,6 @@ import ( "github.com/NethermindEth/juno/core/felt" "github.com/ethereum/go-ethereum/common" - "github.com/libp2p/go-libp2p/core/protocol" "github.com/spf13/pflag" ) @@ -33,8 +32,6 @@ type BlockHashMetaInfo struct { First07Block uint64 `json:"first_07_block" validate:"required"` // Range of blocks that are not verifiable UnverifiableRange []uint64 `json:"unverifiable_range" validate:"required"` - // Block ids for which we fetch traces from feeder gateway instead of getting them from blockifier - ForceFetchingTracesForBlocks []uint64 `json:"force_fetching_traces_for_blocks"` } var ( @@ -44,7 +41,7 @@ var ( _ pflag.Value = (*Network)(nil) _ encoding.TextUnmarshaler = (*Network)(nil) - // The docs states the addresses for each network: https://docs.starknet.io/documentation/useful_info/ + // The docs states the addresses for each network: https://docs.starknet.io/tools/important-addresses/ Mainnet = Network{ Name: "mainnet", FeederURL: "https://alpha-mainnet.starknet.io/feeder_gateway/", @@ -55,35 +52,6 @@ var ( BlockHashMetaInfo: &BlockHashMetaInfo{ First07Block: 833, FallBackSequencerAddress: fallBackSequencerAddressMainnet, - ForceFetchingTracesForBlocks: []uint64{ - 611294, 611505, 612469, 613231, 614631, 614849, 615085, - 615449, 615839, 615978, 616658, 617479, 617507, 617582, - 617593, 617828, 618166, 618260, 618320, 618406, 618423, - 618776, 618884, 618975, 619052, 619128, 619171, 619467, - 619513, 619553, 619596, 619631, 619721, 619951, 619960, - 620018, 620066, 620235, 620423, 620530, 620678, 620749, - 620847, 621350, 621369, 621843, 621897, 621995, 622027, - 622063, 622244, 622768, 622786, 622873, 622930, 623034, - 623156, 623252, 623372, 623428, 623562, 623736, 623792, - 624045, 624082, 624114, 624236, 624378, 624487, 624690, - 624757, 624812, 624875, 624894, 624905, 624929, 625300, - 625403, 625441, 625525, 625741, 625767, 625794, 625802, - 625820, 625849, 625851, 625879, 625935, 625971, 626008, - 626019, 626176, 626193, 626204, 626236, 626285, 626335, - 626370, 626371, 626457, 626683, 626738, 626792, 626820, - 626835, 626962, 627015, 627049, 627100, 627135, 627138, - 627164, 627186, 627243, 627246, 627276, 627291, 627322, - 627351, 627389, 627404, 627428, 627591, 627623, 627624, - 627640, 627645, 627676, 627968, 628183, 628425, 628449, - 628511, 628561, 628682, 628746, 628772, 628778, 628819, - 628915, 628944, 629003, 629122, 629382, 629397, 629432, - 629484, 629500, 629831, 629853, 629893, 629908, 629916, - 630423, 631040, 631041, 631091, 631136, 631142, 631144, - 631149, 631155, 631204, 631269, 631368, 631602, 631685, - 631739, 631741, 631760, 631811, 631861, 631927, 632072, - 632073, 632074, 632075, 632076, 632077, 632078, 632079, - 632081, 632202, 632206, 632237, 632241, 632271, 632845, - }, }, } Goerli = Network{ @@ -91,7 +59,7 @@ var ( FeederURL: "https://alpha4.starknet.io/feeder_gateway/", GatewayURL: "https://alpha4.starknet.io/gateway/", L2ChainID: "SN_GOERLI", - //nolint:gomnd + //nolint:mnd L1ChainID: big.NewInt(5), CoreContractAddress: common.HexToAddress("0xde29d060D45901Fb19ED6C6e959EB22d8626708e"), BlockHashMetaInfo: &BlockHashMetaInfo{ @@ -105,7 +73,7 @@ var ( FeederURL: "https://alpha4-2.starknet.io/feeder_gateway/", GatewayURL: "https://alpha4-2.starknet.io/gateway/", L2ChainID: "SN_GOERLI2", - //nolint:gomnd + //nolint:mnd L1ChainID: big.NewInt(5), CoreContractAddress: common.HexToAddress("0xa4eD3aD27c294565cB0DCc993BDdCC75432D498c"), BlockHashMetaInfo: &BlockHashMetaInfo{ @@ -118,7 +86,7 @@ var ( FeederURL: "https://external.integration.starknet.io/feeder_gateway/", GatewayURL: "https://external.integration.starknet.io/gateway/", L2ChainID: "SN_GOERLI", - //nolint:gomnd + //nolint:mnd L1ChainID: big.NewInt(5), CoreContractAddress: common.HexToAddress("0xd5c325D183C592C94998000C5e0EED9e6655c020"), BlockHashMetaInfo: &BlockHashMetaInfo{ @@ -132,7 +100,7 @@ var ( FeederURL: "https://alpha-sepolia.starknet.io/feeder_gateway/", GatewayURL: "https://alpha-sepolia.starknet.io/gateway/", L2ChainID: "SN_SEPOLIA", - //nolint:gomnd + //nolint:mnd L1ChainID: big.NewInt(11155111), CoreContractAddress: common.HexToAddress("0xE2Bb56ee936fd6433DC0F6e7e3b8365C906AA057"), BlockHashMetaInfo: &BlockHashMetaInfo{ @@ -145,7 +113,7 @@ var ( FeederURL: "https://integration-sepolia.starknet.io/feeder_gateway/", GatewayURL: "https://integration-sepolia.starknet.io/gateway/", L2ChainID: "SN_INTEGRATION_SEPOLIA", - //nolint:gomnd + //nolint:mnd L1ChainID: big.NewInt(11155111), CoreContractAddress: common.HexToAddress("0x4737c0c1B4D5b1A687B42610DdabEE781152359c"), BlockHashMetaInfo: &BlockHashMetaInfo{ @@ -193,10 +161,6 @@ func (n *Network) L2ChainIDFelt() *felt.Felt { return new(felt.Felt).SetBytes([]byte(n.L2ChainID)) } -func (n *Network) ProtocolID() protocol.ID { - return protocol.ID(fmt.Sprintf("/starknet/%s", n.String())) -} - func knownNetworkNames() []string { networks := []Network{Mainnet, Sepolia, SepoliaIntegration} diff --git a/utils/network_test.go b/utils/network_test.go index 6922969858..778f66545b 100644 --- a/utils/network_test.go +++ b/utils/network_test.go @@ -86,7 +86,7 @@ func TestNetwork(t *testing.T) { //nolint:dupl // see comment in utils/log_test.go func TestNetworkSet(t *testing.T) { for network, str := range networkStrings { - t.Run("network "+str, func(t *testing.T) { //nolint:goconst + t.Run("network "+str, func(t *testing.T) { n := new(utils.Network) require.NoError(t, n.Set(str)) assert.Equal(t, network, *n) diff --git a/utils/slices.go b/utils/slices.go index c4ed49ee41..789c06ba31 100644 --- a/utils/slices.go +++ b/utils/slices.go @@ -30,3 +30,12 @@ func Filter[T any](slice []T, f func(T) bool) []T { func All[T any](slice []T, f func(T) bool) bool { return slices.IndexFunc(slice, func(e T) bool { return !f(e) }) == -1 } + +func AnyOf[T comparable](e T, values ...T) bool { + for _, v := range values { + if e == v { + return true + } + } + return false +} diff --git a/utils/slices_test.go b/utils/slices_test.go index 4f73958960..9ef6fcff66 100644 --- a/utils/slices_test.go +++ b/utils/slices_test.go @@ -58,3 +58,18 @@ func TestAll(t *testing.T) { assert.True(t, allOdd) }) } + +func TestAnyOf(t *testing.T) { + t.Run("nil args", func(t *testing.T) { + var input []int + assert.False(t, AnyOf(0, input...)) + }) + + t.Run("element is in args", func(t *testing.T) { + assert.True(t, AnyOf("2", "1", "2", "3", "4", "5", "6")) + }) + + t.Run("element is not in args", func(t *testing.T) { + assert.False(t, AnyOf("9", "1", "2", "3", "4", "5", "6")) + }) +} diff --git a/utils/throttler_test.go b/utils/throttler_test.go index e8d2148684..efeb9c52a2 100644 --- a/utils/throttler_test.go +++ b/utils/throttler_test.go @@ -2,6 +2,8 @@ package utils_test import ( "errors" + "sync" + "sync/atomic" "testing" "time" @@ -13,18 +15,22 @@ import ( func TestThrottler(t *testing.T) { throttledRes := utils.NewThrottler(2, new(int)).WithMaxQueueLen(2) waitOn := make(chan struct{}) - ranCount := 0 + var runCount int64 doer := func(ptr *int) error { if ptr == nil { return errors.New("nilptr") } <-waitOn - ranCount++ + atomic.AddInt64(&runCount, 1) return nil } + + var wg sync.WaitGroup do := func() { + wg.Add(1) go func() { + defer wg.Done() require.NoError(t, throttledRes.Do(doer)) }() time.Sleep(time.Millisecond) @@ -52,6 +58,6 @@ func TestThrottler(t *testing.T) { // release the jobs waiting waitOn <- struct{}{} waitOn <- struct{}{} - time.Sleep(time.Millisecond) - assert.Equal(t, 4, ranCount) + wg.Wait() + assert.Equal(t, int64(4), runCount) } diff --git a/vm/rust/Cargo.toml b/vm/rust/Cargo.toml index fe134dc3cb..fc79bc297f 100644 --- a/vm/rust/Cargo.toml +++ b/vm/rust/Cargo.toml @@ -8,9 +8,10 @@ edition = "2021" [dependencies] serde = "1.0.171" serde_json = { version = "1.0.96", features = ["raw_value"] } -blockifier = "=0.6.0-rc.2" -starknet_api = "=0.10.0" -cairo-vm = "=0.9.2" +blockifier = "=0.8.0-rc.1" +starknet_api = "=0.13.0-rc.0" +cairo-vm = "=1.0.0-rc5" +starknet-types-core = { version = "0.1.5", features = ["hash", "prime-bigint"] } indexmap = "2.1.0" cached = "0.46.1" once_cell = "1.18.0" diff --git a/vm/rust/src/jsonrpc.rs b/vm/rust/src/jsonrpc.rs index 04984300f0..aa84f58a80 100644 --- a/vm/rust/src/jsonrpc.rs +++ b/vm/rust/src/jsonrpc.rs @@ -1,20 +1,19 @@ use blockifier; -use blockifier::execution::entry_point::CallType; use blockifier::execution::call_info::OrderedL2ToL1Message; -use cairo_vm::vm::runners::builtin_runner::{ - BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, HASH_BUILTIN_NAME, - POSEIDON_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, KECCAK_BUILTIN_NAME, - SEGMENT_ARENA_BUILTIN_NAME, -}; -use blockifier::state::cached_state::TransactionalState; +use blockifier::execution::entry_point::CallType; +use blockifier::state::cached_state::CachedState; +use blockifier::state::cached_state::{CommitmentStateDiff, TransactionalState}; use blockifier::state::errors::StateError; -use blockifier::state::state_api::{State, StateReader}; +use blockifier::state::state_api::StateReader; +use cairo_vm::types::builtin_name::BuiltinName; use serde::Serialize; -use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector, PatriciaKey, EthAddress}; +use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector, EthAddress, PatriciaKey}; use starknet_api::deprecated_contract_class::EntryPointType; -use starknet_api::hash::StarkFelt; use starknet_api::transaction::{Calldata, EventContent, L2ToL1Payload}; use starknet_api::transaction::{DeclareTransaction, Transaction as StarknetApiTransaction}; +use starknet_types_core::felt::Felt; + +type StarkFelt = Felt; use crate::juno_state_reader::JunoStateReader; @@ -22,7 +21,8 @@ use crate::juno_state_reader::JunoStateReader; #[serde(rename_all = "UPPERCASE")] pub enum TransactionType { // dummy type for implementing Default trait - #[default] Unknown, + #[default] + Unknown, Invoke, Declare, #[serde(rename = "DEPLOY_ACCOUNT")] @@ -104,10 +104,10 @@ type BlockifierTxInfo = blockifier::transaction::objects::TransactionExecutionIn pub fn new_transaction_trace( tx: &StarknetApiTransaction, info: BlockifierTxInfo, - state: &mut TransactionalState, + state: &mut TransactionalState>, ) -> Result { let mut trace = TransactionTrace::default(); - let mut deprecated_declared_class: Option = None; + let mut deprecated_declared_class_hash: Option = None; match tx { StarknetApiTransaction::L1Handler(_) => { trace.function_invocation = info.execute_call_info.map(|v| v.into()); @@ -134,7 +134,7 @@ pub fn new_transaction_trace( trace.validate_invocation = info.validate_call_info.map(|v| v.into()); trace.fee_transfer_invocation = info.fee_transfer_call_info.map(|v| v.into()); trace.r#type = TransactionType::Declare; - deprecated_declared_class = if info.revert_error.is_none() { + deprecated_declared_class_hash = if info.revert_error.is_none() { match declare_txn { DeclareTransaction::V0(_) => Some(declare_txn.class_hash()), DeclareTransaction::V1(_) => Some(declare_txn.class_hash()), @@ -150,7 +150,7 @@ pub fn new_transaction_trace( } }; - trace.state_diff = make_state_diff(state, deprecated_declared_class)?; + trace.state_diff = make_state_diff(state, deprecated_declared_class_hash)?; Ok(trace) } @@ -205,14 +205,38 @@ impl From for ExecutionResources { } else { None }, - range_check_builtin_applications: val.builtin_instance_counter.get(RANGE_CHECK_BUILTIN_NAME).cloned(), - pedersen_builtin_applications: val.builtin_instance_counter.get(HASH_BUILTIN_NAME).cloned(), - poseidon_builtin_applications: val.builtin_instance_counter.get(POSEIDON_BUILTIN_NAME).cloned(), - ec_op_builtin_applications: val.builtin_instance_counter.get(EC_OP_BUILTIN_NAME).cloned(), - ecdsa_builtin_applications: val.builtin_instance_counter.get(SIGNATURE_BUILTIN_NAME).cloned(), - bitwise_builtin_applications: val.builtin_instance_counter.get(BITWISE_BUILTIN_NAME).cloned(), - keccak_builtin_applications: val.builtin_instance_counter.get(KECCAK_BUILTIN_NAME).cloned(), - segment_arena_builtin: val.builtin_instance_counter.get(SEGMENT_ARENA_BUILTIN_NAME).cloned(), + range_check_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::range_check) + .cloned(), + pedersen_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::pedersen) + .cloned(), + poseidon_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::poseidon) + .cloned(), + ec_op_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::ec_op) + .cloned(), + ecdsa_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::ecdsa) + .cloned(), + bitwise_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::bitwise) + .cloned(), + keccak_builtin_applications: val + .builtin_instance_counter + .get(&BuiltinName::keccak) + .cloned(), + segment_arena_builtin: val + .builtin_instance_counter + .get(&BuiltinName::segment_arena) + .cloned(), } } } @@ -298,33 +322,35 @@ impl From for OrderedMessage { pub struct Retdata(pub Vec); fn make_state_diff( - state: &mut TransactionalState, - deprecated_declared_class: Option, + state: &mut TransactionalState>, + deprecated_declared_class_hash: Option, ) -> Result { - let diff = state.to_state_diff(); + let diff: CommitmentStateDiff = state.to_state_diff()?.into(); let mut deployed_contracts = Vec::new(); let mut replaced_classes = Vec::new(); - for pair in diff.address_to_class_hash { - let existing_class_hash = state.state.get_class_hash_at(pair.0)?; + for (addr, class_hash) in diff.address_to_class_hash { + let existing_class_hash = state.state.get_class_hash_at(addr)?; + let addr: StarkFelt = addr.into(); + if existing_class_hash == ClassHash::default() { #[rustfmt::skip] deployed_contracts.push(DeployedContract { - address: *pair.0.0.key(), - class_hash: pair.1.0, + address: addr, + class_hash: class_hash.0, }); } else { #[rustfmt::skip] replaced_classes.push(ReplacedClass { - contract_address: *pair.0.0.key(), - class_hash: pair.1.0, + contract_address: addr, + class_hash: class_hash.0, }); } } - let mut deprecated_declared_classes = Vec::default(); - if let Some(v) = deprecated_declared_class { - deprecated_declared_classes.push(v.0) + let mut deprecated_declared_class_hashes = Vec::default(); + if let Some(v) = deprecated_declared_class_hash { + deprecated_declared_class_hashes.push(v.0) } Ok(StateDiff { deployed_contracts, @@ -341,7 +367,7 @@ fn make_state_diff( class_hash: v.0.0, compiled_class_hash: v.1.0, }).collect(), - deprecated_declared_classes, + deprecated_declared_classes: deprecated_declared_class_hashes, #[rustfmt::skip] nonces: diff.address_to_nonce.into_iter().map(| v | Nonce { contract_address: *v.0.0.key(), diff --git a/vm/rust/src/juno_state_reader.rs b/vm/rust/src/juno_state_reader.rs index af662ea008..231fcfc36f 100644 --- a/vm/rust/src/juno_state_reader.rs +++ b/vm/rust/src/juno_state_reader.rs @@ -6,16 +6,23 @@ use std::{ use blockifier::execution::contract_class::ContractClass; use blockifier::state::errors::StateError; +use blockifier::state::state_api::UpdatableState; use blockifier::{ - execution::contract_class::{ClassInfo as BlockifierClassInfo, ContractClassV0, ContractClassV1}, + execution::contract_class::{ + ClassInfo as BlockifierClassInfo, ContractClassV0, ContractClassV1, + }, + state::cached_state::{ContractClassMapping, StateMaps}, state::state_api::{StateReader, StateResult}, }; use cached::{Cached, SizedCache}; use once_cell::sync::Lazy; use serde::Deserialize; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; -use starknet_api::hash::StarkFelt; use starknet_api::state::StorageKey; +use starknet_types_core::felt::Felt; +use std::collections::{HashMap, HashSet}; + +type StarkFelt = Felt; extern "C" { fn JunoFree(ptr: *const c_void); @@ -58,7 +65,7 @@ impl JunoStateReader { impl StateReader for JunoStateReader { fn get_storage_at( - &mut self, + &self, contract_address: ContractAddress, key: StorageKey, ) -> StateResult { @@ -82,7 +89,7 @@ impl StateReader for JunoStateReader { /// Returns the nonce of the given contract instance. /// Default: 0 for an uninitialized contract address. - fn get_nonce_at(&mut self, contract_address: ContractAddress) -> StateResult { + fn get_nonce_at(&self, contract_address: ContractAddress) -> StateResult { let addr = felt_to_byte_array(contract_address.0.key()); let ptr = unsafe { JunoStateGetNonceAt(self.handle, addr.as_ptr()) }; if ptr.is_null() { @@ -99,7 +106,7 @@ impl StateReader for JunoStateReader { /// Returns the class hash of the contract class at the given contract instance. /// Default: 0 (uninitialized class hash) for an uninitialized contract address. - fn get_class_hash_at(&mut self, contract_address: ContractAddress) -> StateResult { + fn get_class_hash_at(&self, contract_address: ContractAddress) -> StateResult { let addr = felt_to_byte_array(contract_address.0.key()); let ptr = unsafe { JunoStateGetClassHashAt(self.handle, addr.as_ptr()) }; if ptr.is_null() { @@ -116,10 +123,7 @@ impl StateReader for JunoStateReader { } /// Returns the contract class of the given class hash. - fn get_compiled_contract_class( - &mut self, - class_hash: ClassHash, - ) -> StateResult { + fn get_compiled_contract_class(&self, class_hash: ClassHash) -> StateResult { if let Some(cached_class) = CLASS_CACHE.lock().unwrap().cache_get(&class_hash) { // skip the cache if it comes from a height higher than ours. Class might be undefined on the height // that we are reading from right now. @@ -157,7 +161,7 @@ impl StateReader for JunoStateReader { unsafe { JunoFree(ptr as *const c_void) }; - class_info_res.map(| ci | ci.contract_class()).map_err(| err | { + class_info_res.map(|ci| ci.contract_class()).map_err(|err| { StateError::StateReadError(format!( "parsing JSON string for class hash {}: {}", class_hash.0, err @@ -167,22 +171,31 @@ impl StateReader for JunoStateReader { } /// Returns the compiled class hash of the given class hash. - fn get_compiled_class_hash( + fn get_compiled_class_hash(&self, _class_hash: ClassHash) -> StateResult { + unimplemented!() + } +} + +impl UpdatableState for JunoStateReader { + fn apply_writes( &mut self, - _class_hash: ClassHash, - ) -> StateResult { + _writes: &StateMaps, + _class_hash_to_class: &ContractClassMapping, + _visited_pcs: &HashMap>, + ) { unimplemented!() } } pub fn felt_to_byte_array(felt: &StarkFelt) -> [u8; 32] { - felt.bytes().try_into().expect("StarkFelt not [u8; 32]") + felt.to_bytes_be() + .try_into() + .expect("StarkFelt not [u8; 32]") } pub fn ptr_to_felt(bytes: *const c_uchar) -> StarkFelt { let slice = unsafe { slice::from_raw_parts(bytes, 32) }; - StarkFelt::new(slice.try_into().expect("Juno felt not [u8; 32]")) - .expect("cannot new Starkfelt from Juno bytes") + StarkFelt::from_bytes_be_slice(slice) } #[derive(Deserialize)] @@ -193,15 +206,22 @@ pub struct ClassInfo { } pub fn class_info_from_json_str(raw_json: &str) -> Result { - let class_info: ClassInfo = serde_json::from_str(raw_json).map_err(|err| format!("failed parsing class info: {:?}", err))?; - let class_def = class_info.contract_class.to_string(); - - let class: ContractClass = if let Ok(class) = ContractClassV0::try_from_json_string(class_def.as_str()) { - class.into() - } else if let Ok(class) = ContractClassV1::try_from_json_string(class_def.as_str()) { - class.into() - } else { - return Err("not a valid contract class".to_string()) - }; - return Ok(BlockifierClassInfo::new(&class.into(), class_info.sierra_program_length, class_info.abi_length).unwrap()); + let class_info: ClassInfo = serde_json::from_str(raw_json) + .map_err(|err| format!("failed parsing class info: {:?}", err))?; + let class_def = class_info.contract_class.to_string(); + + let class: ContractClass = + if let Ok(class) = ContractClassV0::try_from_json_string(class_def.as_str()) { + class.into() + } else if let Ok(class) = ContractClassV1::try_from_json_string(class_def.as_str()) { + class.into() + } else { + return Err("not a valid contract class".to_string()); + }; + return Ok(BlockifierClassInfo::new( + &class.into(), + class_info.sierra_program_length, + class_info.abi_length, + ) + .unwrap()); } diff --git a/vm/rust/src/lib.rs b/vm/rust/src/lib.rs index 54a9c9ab3a..440de3e3b8 100644 --- a/vm/rust/src/lib.rs +++ b/vm/rust/src/lib.rs @@ -6,36 +6,55 @@ extern crate lazy_static; use crate::juno_state_reader::{ptr_to_felt, JunoStateReader}; use std::{ - collections::HashMap, ffi::{c_char, c_longlong, c_uchar, c_ulonglong, c_void, CStr, CString}, num::NonZeroU128, slice, sync::Arc + collections::HashMap, + ffi::{c_char, c_longlong, c_uchar, c_ulonglong, c_void, CStr, CString}, + num::NonZeroU128, + slice, + sync::Arc, }; +use blockifier::abi::constants::STORED_BLOCK_HASH_BUFFER; +use blockifier::blockifier::block::{ + pre_process_block, BlockInfo as BlockifierBlockInfo, BlockNumberHashPair, GasPrices, +}; +use blockifier::bouncer::BouncerConfig; +use blockifier::fee::{fee_utils, gas_usage}; +use blockifier::transaction::objects::GasVector; use blockifier::{ - block::{pre_process_block, BlockInfo as BlockifierBlockInfo, BlockNumberHashPair, GasPrices}, context::{BlockContext, ChainInfo, FeeTokenAddresses, TransactionContext}, execution::{ + context::{BlockContext, ChainInfo, FeeTokenAddresses, TransactionContext}, + execution::{ contract_class::ClassInfo, entry_point::{CallEntryPoint, CallType, EntryPointExecutionContext}, - }, fee::fee_utils::calculate_tx_fee, state::{cached_state::{CachedState, GlobalContractCache}, state_api::State}, transaction::{ + }, + state::{cached_state::CachedState, state_api::State}, + transaction::{ errors::TransactionExecutionError::{ - ContractConstructorExecutionFailed, - ExecutionError, - ValidateTransactionError, - }, objects::{DeprecatedTransactionInfo, HasRelatedFeeType, TransactionInfo}, transaction_execution::Transaction, transactions::ExecutableTransaction - }, versioned_constants::VersionedConstants + ContractConstructorExecutionFailed, ExecutionError, ValidateTransactionError, + }, + objects::{DeprecatedTransactionInfo, HasRelatedFeeType, TransactionInfo}, + transaction_execution::Transaction, + transactions::ExecutableTransaction, + }, + versioned_constants::VersionedConstants, }; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use juno_state_reader::{class_info_from_json_str, felt_to_byte_array}; use serde::Deserialize; -use starknet_api::{block::BlockHash, core::PatriciaKey, transaction::{Calldata, Transaction as StarknetApiTransaction, TransactionHash}}; use starknet_api::{ + block::BlockHash, + core::PatriciaKey, deprecated_contract_class::EntryPointType, - hash::StarkFelt, - transaction::Fee, + transaction::{Calldata, Fee, Transaction as StarknetApiTransaction, TransactionHash}, }; use starknet_api::{ core::{ChainId, ClassHash, ContractAddress, EntryPointSelector}, hash::StarkHash, }; +use starknet_types_core::felt::Felt; use std::str::FromStr; +type StarkFelt = Felt; + extern "C" { fn JunoReportError(reader_handle: usize, txnIndex: c_longlong, err: *const c_char); fn JunoAppendTrace(reader_handle: usize, json_trace: *const c_void, len: usize); @@ -51,7 +70,7 @@ pub struct CallInfo { pub class_hash: [c_uchar; 32], pub entry_point_selector: [c_uchar; 32], pub calldata: *const *const c_uchar, - pub len_calldata: usize + pub len_calldata: usize, } #[repr(C)] @@ -76,23 +95,25 @@ pub extern "C" fn cairoVMCall( reader_handle: usize, chain_id: *const c_char, max_steps: c_ulonglong, + concurrency_mode: c_uchar, ) { let block_info = unsafe { *block_info_ptr }; let call_info = unsafe { *call_info_ptr }; let reader = JunoStateReader::new(reader_handle, block_info.block_number); - let contract_addr_felt = StarkFelt::new(call_info.contract_address).unwrap(); + let contract_addr_felt = StarkFelt::from_bytes_be(&call_info.contract_address); let class_hash = if call_info.class_hash == [0; 32] { None } else { - Some(ClassHash(StarkFelt::new(call_info.class_hash).unwrap())) + Some(ClassHash(StarkFelt::from_bytes_be(&call_info.class_hash))) }; - let entry_point_selector_felt = StarkFelt::new(call_info.entry_point_selector).unwrap(); + let entry_point_selector_felt = StarkFelt::from_bytes_be(&call_info.entry_point_selector); let chain_id_str = unsafe { CStr::from_ptr(chain_id) }.to_str().unwrap(); let mut calldata_vec: Vec = Vec::with_capacity(call_info.len_calldata); if call_info.len_calldata > 0 { - let calldata_slice = unsafe { slice::from_raw_parts(call_info.calldata, call_info.len_calldata) }; + let calldata_slice = + unsafe { slice::from_raw_parts(call_info.calldata, call_info.len_calldata) }; for ptr in calldata_slice { let data = ptr_to_felt(ptr.cast()); calldata_vec.push(data); @@ -108,14 +129,21 @@ pub extern "C" fn cairoVMCall( class_hash: class_hash, code_address: None, caller_address: ContractAddress::default(), - initial_gas: get_versioned_constants(block_info.version).gas_cost("initial_gas_cost"), + initial_gas: get_versioned_constants(block_info.version).tx_initial_gas(), }; - let mut state = CachedState::new(reader, GlobalContractCache::new(1)); + let concurrency_mode = concurrency_mode == 1; + let mut state = CachedState::new(reader); let mut resources = ExecutionResources::default(); let context = EntryPointExecutionContext::new_invoke( Arc::new(TransactionContext { - block_context: build_block_context(&mut state, &block_info, chain_id_str, Some(max_steps)), + block_context: build_block_context( + &mut state, + &block_info, + chain_id_str, + Some(max_steps), + concurrency_mode, + ), tx_info: TransactionInfo::Deprecated(DeprecatedTransactionInfo::default()), }), false, @@ -153,7 +181,8 @@ pub extern "C" fn cairoVMExecute( chain_id: *const c_char, skip_charge_fee: c_uchar, skip_validate: c_uchar, - err_on_revert: c_uchar + err_on_revert: c_uchar, + concurrency_mode: c_uchar, ) { let block_info = unsafe { *block_info_ptr }; let reader = JunoStateReader::new(reader_handle, block_info.block_number); @@ -187,10 +216,17 @@ pub extern "C" fn cairoVMExecute( } }; - let mut state = CachedState::new(reader, GlobalContractCache::new(1)); + let mut state = CachedState::new(reader); let txns_and_query_bits = txns_and_query_bits.unwrap(); let mut classes = classes.unwrap(); - let block_context: BlockContext = build_block_context(&mut state, &block_info, chain_id_str, None); + let concurrency_mode = concurrency_mode == 1; + let block_context: BlockContext = build_block_context( + &mut state, + &block_info, + chain_id_str, + None, + concurrency_mode, + ); let charge_fee = skip_charge_fee == 0; let validate = skip_validate == 0; @@ -240,13 +276,17 @@ pub extern "C" fn cairoVMExecute( let mut txn_state = CachedState::create_transactional(&mut state); let fee_type; + let minimal_l1_gas_amount_vector: Option; let res = match txn.unwrap() { Transaction::AccountTransaction(t) => { fee_type = t.fee_type(); + minimal_l1_gas_amount_vector = + Some(gas_usage::estimate_minimal_gas_vector(&block_context, &t).unwrap()); t.execute(&mut txn_state, &block_context, charge_fee, validate) } Transaction::L1HandlerTransaction(t) => { fee_type = t.fee_type(); + minimal_l1_gas_amount_vector = None; t.execute(&mut txn_state, &block_context, charge_fee, validate) } }; @@ -254,20 +294,20 @@ pub extern "C" fn cairoVMExecute( match res { Err(error) => { let err_string = match &error { - ContractConstructorExecutionFailed(e) - | ExecutionError(e) - | ValidateTransactionError(e) => format!("{error} {e}"), - other => other.to_string() + ContractConstructorExecutionFailed(e) => format!("{error} {e}"), + ExecutionError { error: e, .. } | ValidateTransactionError { error: e, .. } => { + format!("{error} {e}") + } + other => other.to_string(), }; report_error( reader_handle, format!( "failed txn {} reason: {}", - txn_and_query_bit.txn_hash, - err_string, + txn_and_query_bit.txn_hash, err_string, ) .as_str(), - txn_index as i64 + txn_index as i64, ); return; } @@ -275,20 +315,39 @@ pub extern "C" fn cairoVMExecute( if t.is_reverted() && err_on_revert != 0 { report_error( reader_handle, - format!("reverted: {}", t.revert_error.unwrap()) - .as_str(), - txn_index as i64 + format!("reverted: {}", t.revert_error.unwrap()).as_str(), + txn_index as i64, ); return; } // we are estimating fee, override actual fee calculation - if t.actual_fee.0 == 0 { - t.actual_fee = calculate_tx_fee(&t.actual_resources, &block_context, &fee_type).unwrap(); + if t.transaction_receipt.fee.0 == 0 { + let minimal_l1_gas_amount_vector = + minimal_l1_gas_amount_vector.unwrap_or_default(); + let gas_consumed = t + .transaction_receipt + .gas + .l1_gas + .max(minimal_l1_gas_amount_vector.l1_gas); + let data_gas_consumed = t + .transaction_receipt + .gas + .l1_data_gas + .max(minimal_l1_gas_amount_vector.l1_data_gas); + + t.transaction_receipt.fee = fee_utils::get_fee_by_gas_vector( + block_context.block_info(), + GasVector { + l1_data_gas: data_gas_consumed, + l1_gas: gas_consumed, + }, + &fee_type, + ) } - let actual_fee = t.actual_fee.0.into(); - let data_gas_consumed = t.da_gas.l1_data_gas.into(); + let actual_fee = t.transaction_receipt.fee.0.into(); + let data_gas_consumed = t.transaction_receipt.da_gas.l1_data_gas.into(); let trace = jsonrpc::new_transaction_trace(&txn_and_query_bit.txn, t, &mut txn_state); @@ -300,14 +359,17 @@ pub extern "C" fn cairoVMExecute( trace.err().unwrap() ) .as_str(), - txn_index as i64 + txn_index as i64, ); return; } unsafe { JunoAppendActualFee(reader_handle, felt_to_byte_array(&actual_fee).as_ptr()); - JunoAppendDataGasConsumed(reader_handle, felt_to_byte_array(&data_gas_consumed).as_ptr()); + JunoAppendDataGasConsumed( + reader_handle, + felt_to_byte_array(&data_gas_consumed).as_ptr(), + ); } append_trace(reader_handle, trace.as_ref().unwrap(), &mut trace_buffer); } @@ -317,7 +379,8 @@ pub extern "C" fn cairoVMExecute( } fn felt_to_u128(felt: StarkFelt) -> u128 { - let bytes = felt.bytes(); + // todo find Into trait or similar + let bytes = felt.to_bytes_be(); let mut arr = [0u8; 16]; arr.copy_from_slice(&bytes[16..32]); @@ -380,19 +443,25 @@ fn build_block_context( block_info: &BlockInfo, chain_id_str: &str, max_steps: Option, + _concurrency_mode: bool, ) -> BlockContext { - let sequencer_addr = StarkFelt::new(block_info.sequencer_address).unwrap(); - let gas_price_wei_felt = StarkFelt::new(block_info.gas_price_wei).unwrap(); - let gas_price_fri_felt = StarkFelt::new(block_info.gas_price_fri).unwrap(); - let data_gas_price_wei_felt = StarkFelt::new(block_info.data_gas_price_wei).unwrap(); - let data_gas_price_fri_felt = StarkFelt::new(block_info.data_gas_price_fri).unwrap(); + let sequencer_addr = StarkFelt::from_bytes_be(&block_info.sequencer_address); + let gas_price_wei_felt = StarkFelt::from_bytes_be(&block_info.gas_price_wei); + let gas_price_fri_felt = StarkFelt::from_bytes_be(&block_info.gas_price_fri); + let data_gas_price_wei_felt = StarkFelt::from_bytes_be(&block_info.data_gas_price_wei); + let data_gas_price_fri_felt = StarkFelt::from_bytes_be(&block_info.data_gas_price_fri); let default_gas_price = NonZeroU128::new(1).unwrap(); let mut old_block_number_and_hash: Option = None; - if block_info.block_number >= 10 { - old_block_number_and_hash = Some(BlockNumberHashPair{ - number: starknet_api::block::BlockNumber(block_info.block_number - 10), - hash: BlockHash(StarkFelt::new(block_info.block_hash_to_be_revealed).unwrap()), + // STORED_BLOCK_HASH_BUFFER const is 10 for now + if block_info.block_number >= STORED_BLOCK_HASH_BUFFER { + old_block_number_and_hash = Some(BlockNumberHashPair { + number: starknet_api::block::BlockNumber( + block_info.block_number - STORED_BLOCK_HASH_BUFFER, + ), + hash: BlockHash(StarkFelt::from_bytes_be( + &block_info.block_hash_to_be_revealed, + )), }) } let mut constants = get_versioned_constants(block_info.version); @@ -400,53 +469,85 @@ fn build_block_context( constants.invoke_tx_max_n_steps = max_steps as u32; } - pre_process_block(state, old_block_number_and_hash, BlockifierBlockInfo{ + let block_info = BlockifierBlockInfo { block_number: starknet_api::block::BlockNumber(block_info.block_number), block_timestamp: starknet_api::block::BlockTimestamp(block_info.block_timestamp), sequencer_address: ContractAddress(PatriciaKey::try_from(sequencer_addr).unwrap()), gas_prices: GasPrices { - eth_l1_gas_price: NonZeroU128::new(felt_to_u128(gas_price_wei_felt)).unwrap_or(default_gas_price), - strk_l1_gas_price: NonZeroU128::new(felt_to_u128(gas_price_fri_felt)).unwrap_or(default_gas_price), - eth_l1_data_gas_price: NonZeroU128::new(felt_to_u128(data_gas_price_wei_felt)).unwrap_or(default_gas_price), - strk_l1_data_gas_price: NonZeroU128::new(felt_to_u128(data_gas_price_fri_felt)).unwrap_or(default_gas_price), + eth_l1_gas_price: NonZeroU128::new(felt_to_u128(gas_price_wei_felt)) + .unwrap_or(default_gas_price), + strk_l1_gas_price: NonZeroU128::new(felt_to_u128(gas_price_fri_felt)) + .unwrap_or(default_gas_price), + eth_l1_data_gas_price: NonZeroU128::new(felt_to_u128(data_gas_price_wei_felt)) + .unwrap_or(default_gas_price), + strk_l1_data_gas_price: NonZeroU128::new(felt_to_u128(data_gas_price_fri_felt)) + .unwrap_or(default_gas_price), }, use_kzg_da: block_info.use_blob_data == 1, - }, ChainInfo{ - chain_id: ChainId(chain_id_str.to_string()), + }; + let chain_info = ChainInfo { + chain_id: ChainId::from(chain_id_str.to_string()), fee_token_addresses: FeeTokenAddresses { // both addresses are the same for all networks - eth_fee_token_address: ContractAddress::try_from(StarkHash::try_from("0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7").unwrap()).unwrap(), - strk_fee_token_address: ContractAddress::try_from(StarkHash::try_from("0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d").unwrap()).unwrap(), + eth_fee_token_address: ContractAddress::try_from( + StarkHash::from_hex( + "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + ) + .unwrap(), + ) + .unwrap(), + strk_fee_token_address: ContractAddress::try_from( + StarkHash::from_hex( + "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + ) + .unwrap(), + ) + .unwrap(), }, - }, constants).unwrap() -} - - + }; + pre_process_block(state, old_block_number_and_hash, block_info.block_number).unwrap(); + BlockContext::new(block_info, chain_info, constants, BouncerConfig::max()) +} lazy_static! { static ref CONSTANTS: HashMap = { let mut m = HashMap::new(); - m.insert("0.13.0".to_string(), serde_json::from_slice(include_bytes!("../versioned_constants_13_0.json")).unwrap()); - m.insert("0.13.1".to_string(), serde_json::from_slice(include_bytes!("../versioned_constants_13_1.json")).unwrap()); + m.insert( + "0.13.0".to_string(), + serde_json::from_slice(include_bytes!("../versioned_constants_13_0.json")).unwrap(), + ); + m.insert( + "0.13.1".to_string(), + serde_json::from_slice(include_bytes!("../versioned_constants_13_1.json")).unwrap(), + ); + m.insert( + "0.13.1.1".to_string(), + serde_json::from_slice(include_bytes!("../versioned_constants_13_1_1.json")).unwrap(), + ); m }; } +#[allow(static_mut_refs)] fn get_versioned_constants(version: *const c_char) -> VersionedConstants { let version_str = unsafe { CStr::from_ptr(version) }.to_str().unwrap(); - let version = StarknetVersion::from_str(&version_str).unwrap_or(StarknetVersion::from_str(&"0.0.0").unwrap()); + let version = StarknetVersion::from_str(&version_str) + .unwrap_or(StarknetVersion::from_str(&"0.0.0").unwrap()); - if version < StarknetVersion::from_str(&"0.13.1").unwrap() { + if let Some(constants) = unsafe { &CUSTOM_VERSIONED_CONSTANTS } { + constants.clone() + } else if version < StarknetVersion::from_str(&"0.13.1").unwrap() { CONSTANTS.get(&"0.13.0".to_string()).unwrap().to_owned() } else if version < StarknetVersion::from_str(&"0.13.1.1").unwrap() { CONSTANTS.get(&"0.13.1".to_string()).unwrap().to_owned() + } else if version < StarknetVersion::from_str(&"0.13.2").unwrap() { + CONSTANTS.get(&"0.13.1.1".to_string()).unwrap().to_owned() } else { VersionedConstants::latest_constants().to_owned() } } - #[derive(Default, PartialEq, Eq, PartialOrd, Ord)] pub struct StarknetVersion(u8, u8, u8, u8); @@ -478,4 +579,40 @@ impl FromStr for StarknetVersion { Ok(StarknetVersion(a, b, c, d)) } -} \ No newline at end of file +} + +static mut CUSTOM_VERSIONED_CONSTANTS: Option = None; + +#[no_mangle] +pub extern "C" fn setVersionedConstants(json_bytes: *const c_char) -> *const c_char { + let json_str = unsafe { + match CStr::from_ptr(json_bytes).to_str() { + Ok(s) => s, + Err(_) => { + return CString::new("Failed to convert JSON bytes to string") + .unwrap() + .into_raw() + } + } + }; + + match serde_json::from_str(json_str) { + Ok(parsed) => unsafe { + CUSTOM_VERSIONED_CONSTANTS = Some(parsed); + CString::new("").unwrap().into_raw() // No error, return an empty string + }, + Err(_) => CString::new("Failed to parse JSON").unwrap().into_raw(), + } +} + +#[no_mangle] +pub extern "C" fn freeString(s: *mut c_char) { + if !s.is_null() { + unsafe { + // Convert the raw C string pointer back to a CString. This operation + // takes ownership of the memory again and ensures it gets deallocated + // when drop function returns. + drop(CString::from_raw(s)); + } + } +} diff --git a/vm/rust/src/versioned_constants.rs b/vm/rust/src/versioned_constants.rs new file mode 100644 index 0000000000..1b1f197af8 --- /dev/null +++ b/vm/rust/src/versioned_constants.rs @@ -0,0 +1,5 @@ +use blockifier::versioned_constants::VersionedConstants; +use std::{ + ffi::{c_char, c_uchar, c_void, CStr} +} + diff --git a/vm/rust/versioned_constants_13_0.json b/vm/rust/versioned_constants_13_0.json index 28bec8d829..1531f6fc13 100644 --- a/vm/rust/versioned_constants_13_0.json +++ b/vm/rust/versioned_constants_13_0.json @@ -137,6 +137,11 @@ "syscall_base_gas_cost": 1 }, "keccak_round_cost_gas_cost": 180000, + "sha256_process_block_gas_cost": { + "step_gas_cost": 0, + "range_check_gas_cost": 0, + "syscall_base_gas_cost": 0 + }, "error_block_number_out_of_range": "Block number out of range", "error_out_of_gas": "Out of gas", "error_invalid_input_len": "Invalid input length", @@ -333,6 +338,11 @@ "n_memory_holes": 0, "n_steps": 84 }, + "Sha256ProcessBlock": { + "builtin_instance_counter": {}, + "n_memory_holes": 0, + "n_steps": 0 + }, "StorageRead": { "builtin_instance_counter": {}, "n_memory_holes": 0, @@ -346,49 +356,189 @@ }, "execute_txs_inner": { "Declare": { - "builtin_instance_counter": { - "pedersen_builtin": 15, - "range_check_builtin": 63 + "resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 15, + "range_check_builtin": 63 + }, + "n_memory_holes": 0, + "n_steps": 2711 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } }, - "n_memory_holes": 0, - "n_steps": 2711 + "deprecated_resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 15, + "range_check_builtin": 63 + }, + "n_memory_holes": 0, + "n_steps": 2711 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + } }, "DeployAccount": { - "builtin_instance_counter": { - "pedersen_builtin": 23, - "range_check_builtin": 83 + "resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 23, + "range_check_builtin": 83 + }, + "n_memory_holes": 0, + "n_steps": 3628 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } }, - "n_memory_holes": 0, - "n_steps": 3628 + "deprecated_resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 23, + "range_check_builtin": 83 + }, + "n_memory_holes": 0, + "n_steps": 3628 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + } }, "InvokeFunction": { - "builtin_instance_counter": { - "pedersen_builtin": 16, - "range_check_builtin": 80 + "resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 80 + }, + "n_memory_holes": 0, + "n_steps": 3382 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } }, - "n_memory_holes": 0, - "n_steps": 3382 + "deprecated_resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 80 + }, + "n_memory_holes": 0, + "n_steps": 3382 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + } }, "L1Handler": { - "builtin_instance_counter": { - "pedersen_builtin": 11, - "range_check_builtin": 17 + "resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 11, + "range_check_builtin": 17 + }, + "n_memory_holes": 0, + "n_steps": 1069 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } }, - "n_memory_holes": 0, - "n_steps": 1069 + "deprecated_resources": { + "constant": { + "builtin_instance_counter": { + "pedersen_builtin": 11, + "range_check_builtin": 17 + }, + "n_memory_holes": 0, + "n_steps": 1069 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + } } + }, + "compute_os_kzg_commitment_info": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 } }, "validate_max_n_steps": 1000000, "vm_resource_fee_cost": { - "bitwise_builtin": 0.32, - "ec_op_builtin": 5.12, - "ecdsa_builtin": 10.24, - "keccak_builtin": 10.24, - "n_steps": 0.005, - "output_builtin": 0, - "pedersen_builtin": 0.16, - "poseidon_builtin": 0.16, - "range_check_builtin": 0.08 + "add_mod_builtin": [ + 0, + 1 + ], + "bitwise_builtin": [ + 32, + 100 + ], + "ec_op_builtin": [ + 512, + 100 + ], + "ecdsa_builtin": [ + 1024, + 100 + ], + "keccak_builtin": [ + 1024, + 100 + ], + "mul_mod_builtin": [ + 0, + 1 + ], + "n_steps": [ + 5, + 1000 + ], + "output_builtin": [ + 0, + 1 + ], + "pedersen_builtin": [ + 16, + 100 + ], + "poseidon_builtin": [ + 16, + 100 + ], + "range_check_builtin": [ + 8, + 100 + ], + "range_check96_builtin": [ + 0, + 1 + ] } } diff --git a/vm/rust/versioned_constants_13_1.json b/vm/rust/versioned_constants_13_1.json index e66c7fb8d5..4e28f7b711 100644 --- a/vm/rust/versioned_constants_13_1.json +++ b/vm/rust/versioned_constants_13_1.json @@ -10,9 +10,18 @@ }, "invoke_tx_max_n_steps": 4000000, "l2_resource_gas_costs": { - "milligas_per_data_felt": 128, - "event_key_factor": 2, - "milligas_per_code_byte": 875 + "gas_per_data_felt": [ + 128, + 1000 + ], + "event_key_factor": [ + 2, + 1 + ], + "gas_per_code_byte": [ + 875, + 1000 + ] }, "max_recursion_depth": 50, "os_constants": { @@ -149,6 +158,11 @@ "syscall_base_gas_cost": 1 }, "keccak_round_cost_gas_cost": 180000, + "sha256_process_block_gas_cost": { + "step_gas_cost": 0, + "range_check_gas_cost": 0, + "syscall_base_gas_cost": 0 + }, "error_block_number_out_of_range": "Block number out of range", "error_out_of_gas": "Out of gas", "error_invalid_input_len": "Invalid input length", @@ -363,6 +377,11 @@ }, "n_memory_holes": 0 }, + "Sha256ProcessBlock": { + "builtin_instance_counter": {}, + "n_memory_holes": 0, + "n_steps": 0 + }, "StorageRead": { "n_steps": 87, "builtin_instance_counter": { @@ -380,83 +399,201 @@ }, "execute_txs_inner": { "Declare": { - "constant": { - "n_steps": 2839, - "builtin_instance_counter": { - "pedersen_builtin": 16, - "range_check_builtin": 63 + "resources": { + "constant": { + "n_steps": 2839, + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 63 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } }, - "calldata_factor": { - "n_steps": 0, - "builtin_instance_counter": {}, - "n_memory_holes": 0 + "deprecated_resources": { + "constant": { + "n_steps": 2839, + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 63 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } } }, "DeployAccount": { - "constant": { - "n_steps": 3792, - "builtin_instance_counter": { - "pedersen_builtin": 23, - "range_check_builtin": 83 + "resources": { + "constant": { + "n_steps": 3792, + "builtin_instance_counter": { + "pedersen_builtin": 23, + "range_check_builtin": 83 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 21, + "builtin_instance_counter": { + "pedersen_builtin": 2 + }, + "n_memory_holes": 0 + } }, - "calldata_factor": { - "n_steps": 21, - "builtin_instance_counter": { - "pedersen_builtin": 2 + "deprecated_resources": { + "constant": { + "n_steps": 3792, + "builtin_instance_counter": { + "pedersen_builtin": 23, + "range_check_builtin": 83 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 21, + "builtin_instance_counter": { + "pedersen_builtin": 2 + }, + "n_memory_holes": 0 + } } }, "InvokeFunction": { - "constant": { - "n_steps": 3546, - "builtin_instance_counter": { - "pedersen_builtin": 14, - "range_check_builtin": 80 + "resources": { + "constant": { + "n_steps": 3546, + "builtin_instance_counter": { + "pedersen_builtin": 14, + "range_check_builtin": 80 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 8, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } }, - "calldata_factor": { - "n_steps": 8, - "builtin_instance_counter": { - "pedersen_builtin": 1 + "deprecated_resources": { + "constant": { + "n_steps": 3546, + "builtin_instance_counter": { + "pedersen_builtin": 14, + "range_check_builtin": 80 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 8, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } } }, "L1Handler": { - "constant": { - "n_steps": 1146, - "builtin_instance_counter": { - "pedersen_builtin": 11, - "range_check_builtin": 17 + "resources": { + "constant": { + "n_steps": 1146, + "builtin_instance_counter": { + "pedersen_builtin": 11, + "range_check_builtin": 17 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 13, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } }, - "calldata_factor": { - "n_steps": 13, - "builtin_instance_counter": { - "pedersen_builtin": 1 + "deprecated_resources": { + "constant": { + "n_steps": 1146, + "builtin_instance_counter": { + "pedersen_builtin": 11, + "range_check_builtin": 17 + }, + "n_memory_holes": 0 }, - "n_memory_holes": 0 + "calldata_factor": { + "n_steps": 13, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } } } + }, + "compute_os_kzg_commitment_info": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 } }, "validate_max_n_steps": 1000000, "vm_resource_fee_cost": { - "bitwise_builtin": 0.16, - "ec_op_builtin": 2.56, - "ecdsa_builtin": 5.12, - "keccak_builtin": 5.12, - "n_steps": 0.0025, - "output_builtin": 0, - "pedersen_builtin": 0.08, - "poseidon_builtin": 0.08, - "range_check_builtin": 0.04 + "add_mod_builtin": [ + 0, + 1 + ], + "bitwise_builtin": [ + 16, + 100 + ], + "ec_op_builtin": [ + 256, + 100 + ], + "ecdsa_builtin": [ + 512, + 100 + ], + "keccak_builtin": [ + 512, + 100 + ], + "mul_mod_builtin": [ + 0, + 1 + ], + "n_steps": [ + 25, + 10000 + ], + "output_builtin": [ + 0, + 1 + ], + "pedersen_builtin": [ + 8, + 100 + ], + "poseidon_builtin": [ + 8, + 100 + ], + "range_check_builtin": [ + 4, + 100 + ], + "range_check96_builtin": [ + 0, + 1 + ] } -} \ No newline at end of file +} diff --git a/vm/rust/versioned_constants_13_1_1.json b/vm/rust/versioned_constants_13_1_1.json new file mode 100644 index 0000000000..791dac8b9b --- /dev/null +++ b/vm/rust/versioned_constants_13_1_1.json @@ -0,0 +1,599 @@ +{ + "tx_event_limits": { + "max_data_length": 300, + "max_keys_length": 50, + "max_n_emitted_events": 1000 + }, + "gateway": { + "max_calldata_length": 5000, + "max_contract_bytecode_size": 81920 + }, + "invoke_tx_max_n_steps": 4000000, + "l2_resource_gas_costs": { + "gas_per_data_felt": [ + 128, + 1000 + ], + "event_key_factor": [ + 2, + 1 + ], + "gas_per_code_byte": [ + 32, + 1000 + ] + }, + "max_recursion_depth": 50, + "os_constants": { + "nop_entry_point_offset": -1, + "entry_point_type_external": 0, + "entry_point_type_l1_handler": 1, + "entry_point_type_constructor": 2, + "l1_handler_version": 0, + "sierra_array_len_bound": 4294967296, + "constructor_entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", + "execute_entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", + "validate_entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", + "validate_declare_entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", + "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", + "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "default_entry_point_selector": 0, + "block_hash_contract_address": 1, + "stored_block_hash_buffer": 10, + "step_gas_cost": 100, + "range_check_gas_cost": 70, + "memory_hole_gas_cost": 10, + "initial_gas_cost": { + "step_gas_cost": 100000000 + }, + "entry_point_initial_budget": { + "step_gas_cost": 100 + }, + "syscall_base_gas_cost": { + "step_gas_cost": 100 + }, + "entry_point_gas_cost": { + "entry_point_initial_budget": 1, + "step_gas_cost": 500 + }, + "fee_transfer_gas_cost": { + "entry_point_gas_cost": 1, + "step_gas_cost": 100 + }, + "transaction_gas_cost": { + "entry_point_gas_cost": 2, + "fee_transfer_gas_cost": 1, + "step_gas_cost": 100 + }, + "call_contract_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 10, + "entry_point_gas_cost": 1 + }, + "deploy_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 200, + "entry_point_gas_cost": 1 + }, + "get_block_hash_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 50 + }, + "get_execution_info_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 10 + }, + "library_call_gas_cost": { + "call_contract_gas_cost": 1 + }, + "replace_class_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 50 + }, + "storage_read_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 50 + }, + "storage_write_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 50 + }, + "emit_event_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 10 + }, + "send_message_to_l1_gas_cost": { + "syscall_base_gas_cost": 1, + "step_gas_cost": 50 + }, + "secp256k1_add_gas_cost": { + "step_gas_cost": 406, + "range_check_gas_cost": 29 + }, + "secp256k1_get_point_from_x_gas_cost": { + "step_gas_cost": 391, + "range_check_gas_cost": 30, + "memory_hole_gas_cost": 20 + }, + "secp256k1_get_xy_gas_cost": { + "step_gas_cost": 239, + "range_check_gas_cost": 11, + "memory_hole_gas_cost": 40 + }, + "secp256k1_mul_gas_cost": { + "step_gas_cost": 76501, + "range_check_gas_cost": 7045, + "memory_hole_gas_cost": 2 + }, + "secp256k1_new_gas_cost": { + "step_gas_cost": 475, + "range_check_gas_cost": 35, + "memory_hole_gas_cost": 40 + }, + "secp256r1_add_gas_cost": { + "step_gas_cost": 589, + "range_check_gas_cost": 57 + }, + "secp256r1_get_point_from_x_gas_cost": { + "step_gas_cost": 510, + "range_check_gas_cost": 44, + "memory_hole_gas_cost": 20 + }, + "secp256r1_get_xy_gas_cost": { + "step_gas_cost": 241, + "range_check_gas_cost": 11, + "memory_hole_gas_cost": 40 + }, + "secp256r1_mul_gas_cost": { + "step_gas_cost": 125340, + "range_check_gas_cost": 13961, + "memory_hole_gas_cost": 2 + }, + "secp256r1_new_gas_cost": { + "step_gas_cost": 594, + "range_check_gas_cost": 49, + "memory_hole_gas_cost": 40 + }, + "keccak_gas_cost": { + "syscall_base_gas_cost": 1 + }, + "keccak_round_cost_gas_cost": 180000, + "sha256_process_block_gas_cost": { + "step_gas_cost": 0, + "range_check_gas_cost": 0, + "syscall_base_gas_cost": 0 + }, + "error_block_number_out_of_range": "Block number out of range", + "error_out_of_gas": "Out of gas", + "error_invalid_input_len": "Invalid input length", + "error_invalid_argument": "Invalid argument", + "validated": "VALID", + "l1_gas": "L1_GAS", + "l2_gas": "L2_GAS", + "l1_gas_index": 0, + "l2_gas_index": 1, + "validate_rounding_consts": { + "validate_block_number_rounding": 100, + "validate_timestamp_rounding": 3600 + } + }, + "os_resources": { + "execute_syscalls": { + "CallContract": { + "n_steps": 760, + "builtin_instance_counter": { + "range_check_builtin": 20 + }, + "n_memory_holes": 0 + }, + "DelegateCall": { + "n_steps": 713, + "builtin_instance_counter": { + "range_check_builtin": 19 + }, + "n_memory_holes": 0 + }, + "DelegateL1Handler": { + "n_steps": 692, + "builtin_instance_counter": { + "range_check_builtin": 15 + }, + "n_memory_holes": 0 + }, + "Deploy": { + "n_steps": 1012, + "builtin_instance_counter": { + "pedersen_builtin": 7, + "range_check_builtin": 19 + }, + "n_memory_holes": 0 + }, + "EmitEvent": { + "n_steps": 61, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "GetBlockHash": { + "n_steps": 104, + "builtin_instance_counter": { + "range_check_builtin": 2 + }, + "n_memory_holes": 0 + }, + "GetBlockNumber": { + "n_steps": 40, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, + "GetBlockTimestamp": { + "n_steps": 38, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, + "GetCallerAddress": { + "n_steps": 64, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "GetContractAddress": { + "n_steps": 64, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "GetExecutionInfo": { + "n_steps": 64, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "GetSequencerAddress": { + "n_steps": 34, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, + "GetTxInfo": { + "n_steps": 64, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "GetTxSignature": { + "n_steps": 44, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, + "Keccak": { + "n_steps": 381, + "builtin_instance_counter": { + "bitwise_builtin": 6, + "keccak_builtin": 1, + "range_check_builtin": 56 + }, + "n_memory_holes": 0 + }, + "LibraryCall": { + "n_steps": 751, + "builtin_instance_counter": { + "range_check_builtin": 20 + }, + "n_memory_holes": 0 + }, + "LibraryCallL1Handler": { + "n_steps": 659, + "builtin_instance_counter": { + "range_check_builtin": 15 + }, + "n_memory_holes": 0 + }, + "ReplaceClass": { + "n_steps": 98, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "Secp256k1Add": { + "n_steps": 408, + "builtin_instance_counter": { + "range_check_builtin": 29 + }, + "n_memory_holes": 0 + }, + "Secp256k1GetPointFromX": { + "n_steps": 393, + "builtin_instance_counter": { + "range_check_builtin": 30 + }, + "n_memory_holes": 0 + }, + "Secp256k1GetXy": { + "n_steps": 205, + "builtin_instance_counter": { + "range_check_builtin": 11 + }, + "n_memory_holes": 0 + }, + "Secp256k1Mul": { + "n_steps": 76503, + "builtin_instance_counter": { + "range_check_builtin": 7045 + }, + "n_memory_holes": 0 + }, + "Secp256k1New": { + "n_steps": 459, + "builtin_instance_counter": { + "range_check_builtin": 35 + }, + "n_memory_holes": 0 + }, + "Secp256r1Add": { + "n_steps": 591, + "builtin_instance_counter": { + "range_check_builtin": 57 + }, + "n_memory_holes": 0 + }, + "Secp256r1GetPointFromX": { + "n_steps": 512, + "builtin_instance_counter": { + "range_check_builtin": 44 + }, + "n_memory_holes": 0 + }, + "Secp256r1GetXy": { + "n_steps": 207, + "builtin_instance_counter": { + "range_check_builtin": 11 + }, + "n_memory_holes": 0 + }, + "Secp256r1Mul": { + "n_steps": 125342, + "builtin_instance_counter": { + "range_check_builtin": 13961 + }, + "n_memory_holes": 0 + }, + "Secp256r1New": { + "n_steps": 578, + "builtin_instance_counter": { + "range_check_builtin": 49 + }, + "n_memory_holes": 0 + }, + "SendMessageToL1": { + "n_steps": 139, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "Sha256ProcessBlock": { + "builtin_instance_counter": {}, + "n_memory_holes": 0, + "n_steps": 0 + }, + "StorageRead": { + "n_steps": 87, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + }, + "StorageWrite": { + "n_steps": 89, + "builtin_instance_counter": { + "range_check_builtin": 1 + }, + "n_memory_holes": 0 + } + }, + "execute_txs_inner": { + "Declare": { + "resources": { + "constant": { + "n_steps": 2839, + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 63 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + }, + "deprecated_resources": { + "constant": { + "n_steps": 2839, + "builtin_instance_counter": { + "pedersen_builtin": 16, + "range_check_builtin": 63 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + } + }, + "DeployAccount": { + "resources": { + "constant": { + "n_steps": 3792, + "builtin_instance_counter": { + "pedersen_builtin": 23, + "range_check_builtin": 83 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 21, + "builtin_instance_counter": { + "pedersen_builtin": 2 + }, + "n_memory_holes": 0 + } + }, + "deprecated_resources": { + "constant": { + "n_steps": 3792, + "builtin_instance_counter": { + "pedersen_builtin": 23, + "range_check_builtin": 83 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 21, + "builtin_instance_counter": { + "pedersen_builtin": 2 + }, + "n_memory_holes": 0 + } + } + }, + "InvokeFunction": { + "resources": { + "constant": { + "n_steps": 3546, + "builtin_instance_counter": { + "pedersen_builtin": 14, + "range_check_builtin": 80 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 8, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } + }, + "deprecated_resources": { + "constant": { + "n_steps": 3546, + "builtin_instance_counter": { + "pedersen_builtin": 14, + "range_check_builtin": 80 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 8, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } + } + }, + "L1Handler": { + "resources": { + "constant": { + "n_steps": 1146, + "builtin_instance_counter": { + "pedersen_builtin": 11, + "range_check_builtin": 17 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 13, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } + }, + "deprecated_resources": { + "constant": { + "n_steps": 1146, + "builtin_instance_counter": { + "pedersen_builtin": 11, + "range_check_builtin": 17 + }, + "n_memory_holes": 0 + }, + "calldata_factor": { + "n_steps": 13, + "builtin_instance_counter": { + "pedersen_builtin": 1 + }, + "n_memory_holes": 0 + } + } + } + }, + "compute_os_kzg_commitment_info": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + } + }, + "validate_max_n_steps": 1000000, + "vm_resource_fee_cost": { + "add_mod_builtin": [ + 0, + 1 + ], + "bitwise_builtin": [ + 16, + 100 + ], + "ec_op_builtin": [ + 256, + 100 + ], + "ecdsa_builtin": [ + 512, + 100 + ], + "keccak_builtin": [ + 512, + 100 + ], + "mul_mod_builtin": [ + 0, + 1 + ], + "n_steps": [ + 25, + 10000 + ], + "output_builtin": [ + 0, + 1 + ], + "pedersen_builtin": [ + 8, + 100 + ], + "poseidon_builtin": [ + 8, + 100 + ], + "range_check_builtin": [ + 4, + 100 + ], + "range_check96_builtin": [ + 0, + 1 + ] + } +} diff --git a/vm/trace.go b/vm/trace.go index bd284767b3..f17257ff41 100644 --- a/vm/trace.go +++ b/vm/trace.go @@ -232,6 +232,9 @@ type ComputationResources struct { Keccak uint64 `json:"keccak_builtin_applications,omitempty"` Poseidon uint64 `json:"poseidon_builtin_applications,omitempty"` SegmentArena uint64 `json:"segment_arena_builtin,omitempty"` + AddMod uint64 `json:"add_mod_builtin,omitempty"` + MulMod uint64 `json:"mul_mod_builtin,omitempty"` + RangeCheck96 uint64 `json:"range_check_96_builtin,omitempty"` } type DataAvailability struct { diff --git a/vm/vm.go b/vm/vm.go index bc3c3f0645..ba952ee1f7 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -29,14 +29,18 @@ typedef struct BlockInfo { } BlockInfo; extern void cairoVMCall(CallInfo* call_info_ptr, BlockInfo* block_info_ptr, uintptr_t readerHandle, char* chain_id, - unsigned long long max_steps); + unsigned long long max_steps, unsigned char concurrency_mode); extern void cairoVMExecute(char* txns_json, char* classes_json, char* paid_fees_on_l1_json, BlockInfo* block_info_ptr, uintptr_t readerHandle, char* chain_id, - unsigned char skip_charge_fee, unsigned char skip_validate, unsigned char err_on_revert); + unsigned char skip_charge_fee, unsigned char skip_validate, unsigned char err_on_revert, + unsigned char concurrency_mode); -#cgo vm_debug LDFLAGS: -L./rust/target/debug -ljuno_starknet_rs -ldl -lm -#cgo !vm_debug LDFLAGS: -L./rust/target/release -ljuno_starknet_rs -ldl -lm +extern char* setVersionedConstants(char* json); +extern void freeString(char* str); + +#cgo vm_debug LDFLAGS: -L./rust/target/debug -ljuno_starknet_rs +#cgo !vm_debug LDFLAGS: -L./rust/target/release -ljuno_starknet_rs */ import "C" @@ -44,6 +48,8 @@ import ( "encoding/json" "errors" "fmt" + "io" + "os" "runtime" "runtime/cgo" "unsafe" @@ -55,19 +61,22 @@ import ( //go:generate mockgen -destination=../mocks/mock_vm.go -package=mocks github.com/NethermindEth/juno/vm VM type VM interface { - Call(callInfo *CallInfo, blockInfo *BlockInfo, state core.StateReader, network *utils.Network, maxSteps uint64, useBlobData bool) ([]*felt.Felt, error) //nolint:lll + Call(callInfo *CallInfo, blockInfo *BlockInfo, state core.StateReader, network *utils.Network, + maxSteps uint64, useBlobData bool) ([]*felt.Felt, error) Execute(txns []core.Transaction, declaredClasses []core.Class, paidFeesOnL1 []*felt.Felt, blockInfo *BlockInfo, state core.StateReader, network *utils.Network, skipChargeFee, skipValidate, errOnRevert, useBlobData bool, ) ([]*felt.Felt, []*felt.Felt, []TransactionTrace, error) } type vm struct { - log utils.SimpleLogger + log utils.SimpleLogger + concurrencyMode bool } -func New(log utils.SimpleLogger) VM { +func New(concurrencyMode bool, log utils.SimpleLogger) VM { return &vm{ - log: log, + log: log, + concurrencyMode: concurrencyMode, } } @@ -220,6 +229,12 @@ func (v *vm) Call(callInfo *CallInfo, blockInfo *BlockInfo, state core.StateRead handle := cgo.NewHandle(context) defer handle.Delete() + var concurrencyModeByte byte + if v.concurrencyMode { + concurrencyModeByte = 1 + } + C.setVersionedConstants(C.CString("my_json")) + cCallInfo, callInfoPinner := makeCCallInfo(callInfo) cBlockInfo := makeCBlockInfo(blockInfo, useBlobData) chainID := C.CString(network.L2ChainID) @@ -228,7 +243,8 @@ func (v *vm) Call(callInfo *CallInfo, blockInfo *BlockInfo, state core.StateRead &cBlockInfo, C.uintptr_t(handle), chainID, - C.ulonglong(maxSteps), //nolint:gocritic + C.ulonglong(maxSteps), //nolint:gocritic + C.uchar(concurrencyModeByte), //nolint:gocritic ) callInfoPinner.Unpin() C.free(unsafe.Pointer(chainID)) @@ -281,6 +297,11 @@ func (v *vm) Execute(txns []core.Transaction, declaredClasses []core.Class, paid errOnRevertByte = 1 } + var concurrencyModeByte byte + if v.concurrencyMode { + concurrencyModeByte = 1 + } + cBlockInfo := makeCBlockInfo(blockInfo, useBlobData) chainID := C.CString(network.L2ChainID) C.cairoVMExecute(txnsJSONCstr, @@ -291,7 +312,8 @@ func (v *vm) Execute(txns []core.Transaction, declaredClasses []core.Class, paid chainID, C.uchar(skipChargeFeeByte), C.uchar(skipValidateByte), - C.uchar(errOnRevertByte), //nolint:gocritic + C.uchar(errOnRevertByte), //nolint:gocritic + C.uchar(concurrencyModeByte), //nolint:gocritic ) C.free(unsafe.Pointer(classesJSONCStr)) @@ -351,3 +373,30 @@ func marshalTxnsAndDeclaredClasses(txns []core.Transaction, declaredClasses []co return txnsJSON, classesJSON, nil } + +func SetVersionedConstants(filename string) error { + fd, err := os.Open(filename) + if err != nil { + return err + } + defer fd.Close() + + buff, err := io.ReadAll(fd) + if err != nil { + return err + } + + jsonStr := C.CString(string(buff)) + if errCStr := C.setVersionedConstants(jsonStr); errCStr != nil { + var errStr string = C.GoString(errCStr) + // empty string is not an error + if errStr != "" { + err = errors.New(errStr) + } + // here we rely on free call on Rust side, because on Go side we can have different allocator + C.freeString((*C.char)(unsafe.Pointer(errCStr))) + } + C.free(unsafe.Pointer(jsonStr)) + + return err +} diff --git a/vm/vm_test.go b/vm/vm_test.go index 4194e8a96b..63c830debb 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -2,6 +2,7 @@ package vm import ( "context" + "os" "reflect" "testing" @@ -49,7 +50,7 @@ func TestV0Call(t *testing.T) { entryPoint := utils.HexToFelt(t, "0x39e11d48192e4333233c7eb19d10ad67c362bb28580c604d67884c85da39695") - ret, err := New(nil).Call(&CallInfo{ + ret, err := New(false, nil).Call(&CallInfo{ ContractAddress: contractAddr, ClassHash: classHash, Selector: entryPoint, @@ -69,7 +70,7 @@ func TestV0Call(t *testing.T) { }, }, nil)) - ret, err = New(nil).Call(&CallInfo{ + ret, err = New(false, nil).Call(&CallInfo{ ContractAddress: contractAddr, ClassHash: classHash, Selector: entryPoint, @@ -115,7 +116,7 @@ func TestV1Call(t *testing.T) { // test_storage_read entryPoint := utils.HexToFelt(t, "0x5df99ae77df976b4f0e5cf28c7dcfe09bd6e81aab787b19ac0c08e03d928cf") storageLocation := utils.HexToFelt(t, "0x44") - ret, err := New(log).Call(&CallInfo{ + ret, err := New(false, log).Call(&CallInfo{ ContractAddress: contractAddr, Selector: entryPoint, Calldata: []felt.Felt{ @@ -137,7 +138,7 @@ func TestV1Call(t *testing.T) { }, }, nil)) - ret, err = New(log).Call(&CallInfo{ + ret, err = New(false, log).Call(&CallInfo{ ContractAddress: contractAddr, Selector: entryPoint, Calldata: []felt.Felt{ @@ -181,7 +182,7 @@ func TestCall_MaxSteps(t *testing.T) { entryPoint := utils.HexToFelt(t, "0x39e11d48192e4333233c7eb19d10ad67c362bb28580c604d67884c85da39695") - _, err = New(nil).Call(&CallInfo{ + _, err = New(false, nil).Call(&CallInfo{ ContractAddress: contractAddr, ClassHash: classHash, Selector: entryPoint, @@ -202,7 +203,7 @@ func TestExecute(t *testing.T) { state := core.NewState(txn) t.Run("empty transaction list", func(t *testing.T) { - _, _, _, err := New(nil).Execute([]core.Transaction{}, []core.Class{}, []*felt.Felt{}, &BlockInfo{ + _, _, _, err := New(false, nil).Execute([]core.Transaction{}, []core.Class{}, []*felt.Felt{}, &BlockInfo{ Header: &core.Header{ Timestamp: 1666877926, SequencerAddress: utils.HexToFelt(t, "0x46a89ae102987331d369645031b49c27738ed096f2789c24449966da4c6de6b"), @@ -214,7 +215,7 @@ func TestExecute(t *testing.T) { require.NoError(t, err) }) t.Run("zero data", func(t *testing.T) { - _, _, _, err := New(nil).Execute(nil, nil, []*felt.Felt{}, &BlockInfo{ + _, _, _, err := New(false, nil).Execute(nil, nil, []*felt.Felt{}, &BlockInfo{ Header: &core.Header{ SequencerAddress: &felt.Zero, GasPrice: &felt.Zero, @@ -224,3 +225,18 @@ func TestExecute(t *testing.T) { require.NoError(t, err) }) } + +func TestSetVersionedConstants(t *testing.T) { + t.Run("ok", func(t *testing.T) { + err := SetVersionedConstants("./rust/versioned_constants_13_1.json") + assert.NoError(t, err) + }) + t.Run("not valid json", func(t *testing.T) { + fd, err := os.CreateTemp("", "versioned_constants_test*") + require.NoError(t, err) + defer os.Remove(fd.Name()) + + err = SetVersionedConstants(fd.Name()) + assert.ErrorContains(t, err, "Failed to parse JSON") + }) +}