diff --git a/.github/release-please-v4.json b/.github/release-please-v4.json new file mode 100644 index 000000000000..af042c8872a5 --- /dev/null +++ b/.github/release-please-v4.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "simple", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": true, + "group-pull-request-title-pattern": "chore(v4): Release ${version}", + "pull-request-header": "Pending Aztec Packages v4 release", + "versioning": "always-bump-patch", + "include-component-in-tag": false, + "release-search-depth": 50, + "commit-search-depth": 150, + "bootstrap-sha": "60d353cded21d7ebeed9bc64b5ae87ebba5f9a38", + "sequential-calls": true, + "changelog-sections": [ + { "type": "feat", "section": "Features", "hidden": false }, + { "type": "fix", "section": "Bug Fixes", "hidden": false }, + { "type": "chore", "section": "Miscellaneous", "hidden": true }, + { "type": "test", "section": "Miscellaneous", "hidden": true }, + { "type": "refactor", "section": "Miscellaneous", "hidden": true }, + { "type": "docs", "section": "Documentation", "hidden": false } + ], + "packages": { + ".": { + "release-type": "simple" + } + } +} diff --git a/.github/workflows/ci3.yml b/.github/workflows/ci3.yml index ec0a4c81b234..4ed627b37bd9 100644 --- a/.github/workflows/ci3.yml +++ b/.github/workflows/ci3.yml @@ -111,6 +111,24 @@ jobs: PR_BASE_SHA: ${{ github.event.pull_request.base.sha }} run: ./.github/ci3_success.sh + - name: Notify Slack on backport CI failure + if: failure() && startsWith(github.event.pull_request.head.ref, 'backport-to-') && endsWith(github.event.pull_request.head.ref, '-staging') + env: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + run: | + if [ -n "${SLACK_BOT_TOKEN}" ]; then + read -r -d '' data <\n" + } + EOF + curl -X POST https://slack.com/api/chat.postMessage \ + -H "Authorization: Bearer $SLACK_BOT_TOKEN" \ + -H "Content-type: application/json" \ + --data "$data" + fi + - name: Upload benchmarks if: env.SHOULD_UPLOAD_BENCHMARKS == '1' uses: benchmark-action/github-action-benchmark@4de1bed97a47495fc4c5404952da0499e31f5c29 diff --git a/.github/workflows/deploy-network.yml b/.github/workflows/deploy-network.yml index 7e8eb675081e..08d27c77f551 100644 --- a/.github/workflows/deploy-network.yml +++ b/.github/workflows/deploy-network.yml @@ -30,6 +30,10 @@ on: required: false type: boolean default: false + source_tag: + description: "Source tag that triggered this deploy" + required: false + type: string workflow_dispatch: inputs: network: @@ -59,6 +63,10 @@ on: required: false type: boolean default: false + source_tag: + description: "Source tag that triggered this deploy" + required: false + type: string concurrency: group: deploy-network-${{ inputs.network }}-${{ inputs.namespace || inputs.network }}-${{ inputs.semver }}-${{ github.ref || github.ref_name }} @@ -170,6 +178,22 @@ jobs: echo "cluster=" >> $GITHUB_OUTPUT fi + - name: Step summary + if: always() + run: | + { + echo "## Deploy Network" + echo "" + echo "| Item | Value |" + echo "|------|-------|" + echo "| Network | \`${{ inputs.network }}\` |" + echo "| Semver | \`${{ inputs.semver }}\` |" + echo "| Ref | \`${{ steps.checkout-ref.outputs.ref }}\` |" + if [[ -n "${{ inputs.source_tag }}" ]]; then + echo "| Source Tag | [\`${{ inputs.source_tag }}\`](https://github.com/${{ github.repository }}/releases/tag/${{ inputs.source_tag }}) |" + fi + } >> "$GITHUB_STEP_SUMMARY" + - name: Notify Slack on failure if: failure() env: diff --git a/.github/workflows/deploy-staging-public.yml b/.github/workflows/deploy-staging-public.yml new file mode 100644 index 000000000000..5c521e6c0e7e --- /dev/null +++ b/.github/workflows/deploy-staging-public.yml @@ -0,0 +1,94 @@ +name: Deploy to staging-public + +on: + push: + branches: + - v4 + workflow_dispatch: {} + +concurrency: + group: deploy-staging-public + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + +jobs: + determine-tag: + runs-on: ubuntu-latest + outputs: + tag: ${{ steps.poll-tag.outputs.tag }} + semver: ${{ steps.poll-tag.outputs.semver }} + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + with: + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + fetch-depth: 0 + + - name: Read version from manifest + id: manifest + run: | + VERSION=$(jq -r '."."' .release-please-manifest.json) + echo "version=$VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Poll for tag at HEAD + id: poll-tag + run: | + # wait for tag to be pushed (either RC or stable release) + VERSION="${{ steps.manifest.outputs.version }}" + HEAD_SHA=$(git rev-parse HEAD) + MAX_ATTEMPTS=60 + echo "Looking for tag matching v${VERSION} or v${VERSION}-rc.* at HEAD ($HEAD_SHA)" + + for i in $(seq 1 $MAX_ATTEMPTS); do + git fetch --tags --force + + TAG=$(git tag --points-at HEAD | grep -E "^v${VERSION}(-rc\.[0-9]+)?$" | sort -V | tail -n 1 || true) + + if [ -n "$TAG" ]; then + echo "Found tag: $TAG" + SEMVER="${TAG#v}" + echo "tag=$TAG" >> $GITHUB_OUTPUT + echo "semver=$SEMVER" >> $GITHUB_OUTPUT + exit 0 + fi + + echo "Attempt $i/$MAX_ATTEMPTS: No matching tag yet, waiting 10s..." + sleep 10 + done + + echo "Error: No tag found for v${VERSION} at HEAD after 10 minutes" + exit 1 + + wait-for-ci3: + needs: determine-tag + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + with: + fetch-depth: 1 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Wait for CI3 + run: spartan/scripts/wait_for_ci3.ts "${{ needs.determine-tag.outputs.tag }}" + + deploy: + needs: [determine-tag, wait-for-ci3] + runs-on: ubuntu-latest + steps: + - name: Trigger deploy-network on next branch + run: | + echo "Triggering deploy-network for staging-public with semver=${{ needs.determine-tag.outputs.semver }}" + gh workflow run deploy-network.yml \ + --repo "${{ github.repository }}" \ + --ref next \ + -f network=staging-public \ + -f semver="${{ needs.determine-tag.outputs.semver }}" \ + -f source_tag="${{ needs.determine-tag.outputs.tag }}" diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 8d26264b0834..904364e64244 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -134,6 +134,74 @@ jobs: echo "✅ Created tag: $TAG_NAME" + dedupe-release-notes: + name: Deduplicate release notes + needs: [release-please] + if: ${{ needs.release-please.outputs.release-pr }} + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Check if release notes branch exists + id: check-branch + env: + GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + run: | + NOTES_BRANCH="${{ fromJSON(needs.release-please.outputs.release-pr).headBranchName }}--release-notes" + if git ls-remote --exit-code "https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git" "refs/heads/$NOTES_BRANCH" >/dev/null 2>&1; then + echo "exists=true" >> $GITHUB_OUTPUT + echo "branch=$NOTES_BRANCH" >> $GITHUB_OUTPUT + else + echo "exists=false" >> $GITHUB_OUTPUT + echo "Release notes branch $NOTES_BRANCH does not exist, skipping deduplication" + fi + + - name: Checkout release notes branch + if: steps.check-branch.outputs.exists == 'true' + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + with: + ref: ${{ steps.check-branch.outputs.branch }} + fetch-depth: 1 + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + + - name: Fetch dedupe script from target branch + if: steps.check-branch.outputs.exists == 'true' + run: | + git fetch origin ${{ github.ref_name }} --depth=1 + git show origin/${{ github.ref_name }}:scripts/dedupe_release_notes.py > /tmp/dedupe_release_notes.py + + - name: Configure Git + if: steps.check-branch.outputs.exists == 'true' + run: | + git config --global user.name AztecBot + git config --global user.email tech@aztecprotocol.com + + - name: Deduplicate release notes + if: steps.check-branch.outputs.exists == 'true' + run: | + if [ -f release-notes.md ]; then + python3 /tmp/dedupe_release_notes.py release-notes.md + git add release-notes.md + if ! git diff --cached --quiet; then + git commit -m "chore: deduplicate release notes" + git push + fi + fi + + - name: Update PR body with deduped notes + if: steps.check-branch.outputs.exists == 'true' + env: + GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + run: | + if [ -f release-notes.md ]; then + PR_NUMBER=${{ fromJSON(needs.release-please.outputs.release-pr).number }} + NOTES_SIZE=$(wc -c < release-notes.md) + if [ "$NOTES_SIZE" -lt 60000 ]; then + gh pr edit "$PR_NUMBER" --body "$(cat release-notes.md)" + fi + fi + update-docs: name: Update docs env: diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e6f877563b6e..b3c3305fc6cc 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "4.0.0" + ".": "4.0.4" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 47082dc49d8f..d0f0db9a4afe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,412 @@ # Changelog +## [4.0.4](https://github.com/AztecProtocol/aztec-packages/compare/v4.0.3...v4.0.4) (2026-02-27) + + +### Features + +* **slasher:** make slash grace period relative to rollup upgrade time ([#20942](https://github.com/AztecProtocol/aztec-packages/issues/20942)) ([3cdca29](https://github.com/AztecProtocol/aztec-packages/commit/3cdca29ca48b68d1202166295bb749f35bec5902)) + + +### Bug Fixes + +* logging of class instances ([#20807](https://github.com/AztecProtocol/aztec-packages/issues/20807)) ([3cdca29](https://github.com/AztecProtocol/aztec-packages/commit/3cdca29ca48b68d1202166295bb749f35bec5902)) + + +### Documentation + +* add docs on state vars docs re packing in structs ([#20747](https://github.com/AztecProtocol/aztec-packages/issues/20747)) ([3cdca29](https://github.com/AztecProtocol/aztec-packages/commit/3cdca29ca48b68d1202166295bb749f35bec5902)) + +## [4.0.3](https://github.com/AztecProtocol/aztec-packages/compare/v4.0.2...v4.0.3) (2026-02-27) + + +### Features + +* **aztec:** node enters standby mode on genesis root mismatch ([#20937](https://github.com/AztecProtocol/aztec-packages/issues/20937)) ([ed3f61d](https://github.com/AztecProtocol/aztec-packages/commit/ed3f61d61745bcd895056ee49e4c6a849928d19e)) + +## [4.0.2](https://github.com/AztecProtocol/aztec-packages/compare/v4.0.1...v4.0.2) (2026-02-27) + + +### Bug Fixes + +* handle scientific notation in bigintConfigHelper ([#20929](https://github.com/AztecProtocol/aztec-packages/issues/20929)) ([0ed0a06](https://github.com/AztecProtocol/aztec-packages/commit/0ed0a0680c42ca88e650bffd0f2eee3ac93c3f5a)) +* handle scientific notation in bigintConfigHelper ([#20929](https://github.com/AztecProtocol/aztec-packages/issues/20929)) ([1fa71ae](https://github.com/AztecProtocol/aztec-packages/commit/1fa71ae18d94c4dbfee74b07c23b932e9236dbc7)) + +## [4.0.1](https://github.com/AztecProtocol/aztec-packages/compare/v4.0.0...v4.0.1) (2026-02-26) + + +### ⚠ BREAKING CHANGES + +* Bump l2 gas per note hash ([#20862](https://github.com/AztecProtocol/aztec-packages/issues/20862)) +* update vks +* Bump l2 gas per note hash ([#20862](https://github.com/AztecProtocol/aztec-packages/issues/20862)) +* update da gas ([#20611](https://github.com/AztecProtocol/aztec-packages/issues/20611)) +* update da gas +* change max private log size to 16 fields ([#20515](https://github.com/AztecProtocol/aztec-packages/issues/20515)) +* change max private log size to 16 fields +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) +* include_by_timestamp -> expiration_timestamp ([#20536](https://github.com/AztecProtocol/aztec-packages/issues/20536)) + +### Features + +* (A-302) add reloadKeystore admin RPC endpoint ([a001805](https://github.com/AztecProtocol/aztec-packages/commit/a0018057bd585b0e4a52796e4347913c09e6f63b)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([1d43be9](https://github.com/AztecProtocol/aztec-packages/commit/1d43be9223c00f9f7251a3904e873be1e1cc17f0)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* (A-302) add reloadKeystore admin RPC endpoint ([#20325](https://github.com/AztecProtocol/aztec-packages/issues/20325)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([a39635b](https://github.com/AztecProtocol/aztec-packages/commit/a39635b852b1982bc77aff5642fde64926901276)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* (A-451) error codes for RPC calls ([#20560](https://github.com/AztecProtocol/aztec-packages/issues/20560)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([60b4fc7](https://github.com/AztecProtocol/aztec-packages/commit/60b4fc7ec7cdd1f77723509ae332efea404efbf7)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* (A-514) add API key authentication for admin RPC endpoint ([#20411](https://github.com/AztecProtocol/aztec-packages/issues/20411)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* add `aztec profile` command with gate count profiling ([#20695](https://github.com/AztecProtocol/aztec-packages/issues/20695)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* add API key authentication for admin RPC endpoint ([ff4cf99](https://github.com/AztecProtocol/aztec-packages/commit/ff4cf991874da41a26e755ffa45126adbc3ca2d4)) +* add aztec profile flamegraph command ([#20741](https://github.com/AztecProtocol/aztec-packages/issues/20741)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* add support for signed integers on contract functions ([#20784](https://github.com/AztecProtocol/aztec-packages/issues/20784)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* adding mempool transactions ([#20679](https://github.com/AztecProtocol/aztec-packages/issues/20679)) ([43caf7c](https://github.com/AztecProtocol/aztec-packages/commit/43caf7c71f19e1f16151b81ed1f93a09b8de3666)) +* alpha payload ([6702e6c](https://github.com/AztecProtocol/aztec-packages/commit/6702e6c1db23d8aa707616faedbbd27bf40136f4)) +* alpha payload ([#20865](https://github.com/AztecProtocol/aztec-packages/issues/20865)) ([7a09c3c](https://github.com/AztecProtocol/aztec-packages/commit/7a09c3ccffe7433ccece6fa4bf3d4a4c320a0720)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **archiver:** add l2 tips cache ([#20510](https://github.com/AztecProtocol/aztec-packages/issues/20510)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **archiver:** return L2 block data to avoid fetching full block ([#20503](https://github.com/AztecProtocol/aztec-packages/issues/20503)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* automatically stop node from signalling ([#20416](https://github.com/AztecProtocol/aztec-packages/issues/20416)) ([ba40940](https://github.com/AztecProtocol/aztec-packages/commit/ba40940937c3450fa77ee02332933427cbc2ecc1)) +* avoid redundant serial zeroing in polynomial allocation ([#20670](https://github.com/AztecProtocol/aztec-packages/issues/20670)) ([bb844d4](https://github.com/AztecProtocol/aztec-packages/commit/bb844d4242e3823169b0ec9b2f9ad4f59dd5ce02)) +* call syncImmediate without block number during chain prune ([#20717](https://github.com/AztecProtocol/aztec-packages/issues/20717)) ([43caf7c](https://github.com/AztecProtocol/aztec-packages/commit/43caf7c71f19e1f16151b81ed1f93a09b8de3666)) +* check calldata against emitted hashes ([#20486](https://github.com/AztecProtocol/aztec-packages/issues/20486)) ([43caf7c](https://github.com/AztecProtocol/aztec-packages/commit/43caf7c71f19e1f16151b81ed1f93a09b8de3666)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **ci.aztec-labs.com:** CI cost and metrics tracking ([#20100](https://github.com/AztecProtocol/aztec-packages/issues/20100)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* disabling peer scoring for block proposals topic ([#20577](https://github.com/AztecProtocol/aztec-packages/issues/20577)) ([6414d9b](https://github.com/AztecProtocol/aztec-packages/commit/6414d9ba2e2e622a5cb6541612dfdc119388522b)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([dedf440](https://github.com/AztecProtocol/aztec-packages/commit/dedf44097cc8dcfc7969e46baa05303005b092e9)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([84d400c](https://github.com/AztecProtocol/aztec-packages/commit/84d400c7c419cf4db2f2031cb1db674548cc7a39)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([e73e0de](https://github.com/AztecProtocol/aztec-packages/commit/e73e0de8642fbe69fa042608dcc0a9077aa02fe3)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([3c5f51d](https://github.com/AztecProtocol/aztec-packages/commit/3c5f51d2e7fda3ca6aefe9e3707841c0010e2a35)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([637df1c](https://github.com/AztecProtocol/aztec-packages/commit/637df1c30f9a17bb3a497745076fca82a8aad55e)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([07ffd46](https://github.com/AztecProtocol/aztec-packages/commit/07ffd46fba6f433c27cb1e1d9fc5542595084c35)) +* dynamically adjust missing txs set ([#20300](https://github.com/AztecProtocol/aztec-packages/issues/20300)) ([00e18c5](https://github.com/AztecProtocol/aztec-packages/commit/00e18c5a7a5c59a172b5d922131853bf3f28a846)) +* Error codes for RPC calls ([43ed6a9](https://github.com/AztecProtocol/aztec-packages/commit/43ed6a90bdaf8772f479735f90fdc4fb1e4ba8b8)) +* expose blockheader getters ([#20790](https://github.com/AztecProtocol/aztec-packages/issues/20790)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* Metrics added to the transaction pool ([#20477](https://github.com/AztecProtocol/aztec-packages/issues/20477)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* notify slack on merge train PR merge ([98eda62](https://github.com/AztecProtocol/aztec-packages/commit/98eda62b9d11fe4bd4ea3c7f5f3b568cf49cfa93)) +* notify slack on merge train PR merge ([#20614](https://github.com/AztecProtocol/aztec-packages/issues/20614)) ([dbbeddc](https://github.com/AztecProtocol/aztec-packages/commit/dbbeddcf7978f81521ef50ff8dc4ff70a8a8db8d)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([76923c1](https://github.com/AztecProtocol/aztec-packages/commit/76923c1ca5c66337e51501f2d4124e469088b805)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **p2p:** add download metrics to file store tx source ([#20601](https://github.com/AztecProtocol/aztec-packages/issues/20601)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* printing out public contract function debug logs in a tx ([#20749](https://github.com/AztecProtocol/aztec-packages/issues/20749)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([dedf440](https://github.com/AztecProtocol/aztec-packages/commit/dedf44097cc8dcfc7969e46baa05303005b092e9)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([84d400c](https://github.com/AztecProtocol/aztec-packages/commit/84d400c7c419cf4db2f2031cb1db674548cc7a39)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([e73e0de](https://github.com/AztecProtocol/aztec-packages/commit/e73e0de8642fbe69fa042608dcc0a9077aa02fe3)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([3c5f51d](https://github.com/AztecProtocol/aztec-packages/commit/3c5f51d2e7fda3ca6aefe9e3707841c0010e2a35)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([637df1c](https://github.com/AztecProtocol/aztec-packages/commit/637df1c30f9a17bb3a497745076fca82a8aad55e)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([07ffd46](https://github.com/AztecProtocol/aztec-packages/commit/07ffd46fba6f433c27cb1e1d9fc5542595084c35)) +* Re-instate the function optionally to delete all transactions in an epoch prune ([#20602](https://github.com/AztecProtocol/aztec-packages/issues/20602)) ([41cb45a](https://github.com/AztecProtocol/aztec-packages/commit/41cb45a789e14f47e6f444cb9bacfbdaf99c11af)) +* reduced hashing ([#20676](https://github.com/AztecProtocol/aztec-packages/issues/20676)) ([bf3191c](https://github.com/AztecProtocol/aztec-packages/commit/bf3191c985a5f887b84fad5cf540674249b2452a)) +* run low priority eviction rule on chain_pruned ([#20687](https://github.com/AztecProtocol/aztec-packages/issues/20687)) ([43caf7c](https://github.com/AztecProtocol/aztec-packages/commit/43caf7c71f19e1f16151b81ed1f93a09b8de3666)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([1207cfa](https://github.com/AztecProtocol/aztec-packages/commit/1207cfa7726117bc8382adf5beb2cf739c5e6ce0)) +* suspend sentinel during escape hatch ([#20471](https://github.com/AztecProtocol/aztec-packages/issues/20471)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* tcmalloc enabled in docker images ([#20644](https://github.com/AztecProtocol/aztec-packages/issues/20644)) ([b87c8ae](https://github.com/AztecProtocol/aztec-packages/commit/b87c8ae0aed61474dbcbca5acabc5a833404b817)) +* trim attestations to the minimum required length ([#20591](https://github.com/AztecProtocol/aztec-packages/issues/20591)) ([43caf7c](https://github.com/AztecProtocol/aztec-packages/commit/43caf7c71f19e1f16151b81ed1f93a09b8de3666)) +* use native crypto to compute p2p message ID ([#20846](https://github.com/AztecProtocol/aztec-packages/issues/20846)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* Validate num txs in block proposals ([#20850](https://github.com/AztecProtocol/aztec-packages/issues/20850)) ([f3f5438](https://github.com/AztecProtocol/aztec-packages/commit/f3f543878af6f9e428618f0d751675585638ff0c)) +* worker thread wallet ([dac73ca](https://github.com/AztecProtocol/aztec-packages/commit/dac73ca3ab4b8d0f338d2d2796f212295d170060)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* worker thread wallet ([#20557](https://github.com/AztecProtocol/aztec-packages/issues/20557)) ([c866633](https://github.com/AztecProtocol/aztec-packages/commit/c866633d313a246e5b4679dc6a9b87e3c22b5e1c)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([4601ffa](https://github.com/AztecProtocol/aztec-packages/commit/4601ffa87101b83ad524437ed4aad2e8bb8dffb0)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* World state history length is now defined in checkpoints ([#20566](https://github.com/AztecProtocol/aztec-packages/issues/20566)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) + + +### Bug Fixes + +* (A-575) prevent checkpoint event spam in L2BlockStream on restart ([#20791](https://github.com/AztecProtocol/aztec-packages/issues/20791)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* `DelayedPublicMutable` not relying on the guarantee of increasing timestamps ([693b104](https://github.com/AztecProtocol/aztec-packages/commit/693b1042c6e29050ed45b2a815aa94dc1b06da1c)) +* `DelayedPublicMutable` not relying on the guarantee of increasing timestamps ([#20244](https://github.com/AztecProtocol/aztec-packages/issues/20244)) ([a178034](https://github.com/AztecProtocol/aztec-packages/commit/a178034dbadb351b7ab302ccdc66ab90ce7e4920)) +* allow compiling mixed (contract + noir script) aztec project ([#20428](https://github.com/AztecProtocol/aztec-packages/issues/20428)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* **archiver:** enforce checkpoint boundary on rollbackTo ([#20908](https://github.com/AztecProtocol/aztec-packages/issues/20908)) ([f3f5438](https://github.com/AztecProtocol/aztec-packages/commit/f3f543878af6f9e428618f0d751675585638ff0c)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([ab30ee4](https://github.com/AztecProtocol/aztec-packages/commit/ab30ee487503bc3aed072229a9cd9dfa275c8585)) +* async blob ([#20559](https://github.com/AztecProtocol/aztec-packages/issues/20559)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([101ef01](https://github.com/AztecProtocol/aztec-packages/commit/101ef01fd918e1fb73efbb732ede48eba9437dbe)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* async dispose() lint rule ([#20587](https://github.com/AztecProtocol/aztec-packages/issues/20587)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([e8d3a69](https://github.com/AztecProtocol/aztec-packages/commit/e8d3a6957a5180088e4b2e8b6b3855609f4e6116)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* async world state cleanups ([#20578](https://github.com/AztecProtocol/aztec-packages/issues/20578)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* attribute for L1 fee analysis for full blocks ([1f36ef9](https://github.com/AztecProtocol/aztec-packages/commit/1f36ef99e3abfc754c6655ecbbe2135ae54d393c)) +* attribute for L1 fee analysis for full blocks ([#20548](https://github.com/AztecProtocol/aztec-packages/issues/20548)) ([63131de](https://github.com/AztecProtocol/aztec-packages/commit/63131dee7be4bb41389103b3b0f73fbe29bb5bf4)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([50e778a](https://github.com/AztecProtocol/aztec-packages/commit/50e778ade1f6dc60abbc4d693a356b6abe81c38a)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([6fcc86e](https://github.com/AztecProtocol/aztec-packages/commit/6fcc86e33e9020de5ba60f22adb88ea56ee7a24c)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([f039b7e](https://github.com/AztecProtocol/aztec-packages/commit/f039b7e0165d9399a872c4205108b5feb30fc3d3)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([2cc6846](https://github.com/AztecProtocol/aztec-packages/commit/2cc68466bc60fc2cf9a514341167c6657f899dc8)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([71dc368](https://github.com/AztecProtocol/aztec-packages/commit/71dc36802cb2c4b4df5a8254e08ed67d085ffc9c)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([4774f44](https://github.com/AztecProtocol/aztec-packages/commit/4774f44739af57cf1b8b263c5b89e42a40287996)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([13d7316](https://github.com/AztecProtocol/aztec-packages/commit/13d73162358609af5decf339a97d17093aea6e66)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([a0262f0](https://github.com/AztecProtocol/aztec-packages/commit/a0262f06660c4768191c3d5987e5a64324f26030)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([c8e0b00](https://github.com/AztecProtocol/aztec-packages/commit/c8e0b008241be4ce1b81ef8376697f92b3eba029)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([7eef2cf](https://github.com/AztecProtocol/aztec-packages/commit/7eef2cfea9d78c0753f50c9df29f28e93a0c5566)) +* **avm:** alu gadget fuzzer serialisation ([#19115](https://github.com/AztecProtocol/aztec-packages/issues/19115)) ([3c3d0fc](https://github.com/AztecProtocol/aztec-packages/commit/3c3d0fcc573405b4c33f72b4d4c1d15e792f8d22)) +* **aztec-up:** install noir-profiler alongside nargo ([#20896](https://github.com/AztecProtocol/aztec-packages/issues/20896)) ([f3f5438](https://github.com/AztecProtocol/aztec-packages/commit/f3f543878af6f9e428618f0d751675585638ff0c)) +* Bump l2 gas per note hash ([#20862](https://github.com/AztecProtocol/aztec-packages/issues/20862)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* Bump l2 gas per note hash ([#20862](https://github.com/AztecProtocol/aztec-packages/issues/20862)) ([d3638f7](https://github.com/AztecProtocol/aztec-packages/commit/d3638f72bacea7c2b700b83f1077d3fa400d87ae)) +* charge 3.6M for epoch verification ([#20765](https://github.com/AztecProtocol/aztec-packages/issues/20765)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* **ci:** insufficient parallelism in merge-queue-heavy ([130f488](https://github.com/AztecProtocol/aztec-packages/commit/130f4885a0bac489b32a57594b06b08b0e599ec0)) +* **ci:** insufficient parallelism in merge-queue-heavy ([#20613](https://github.com/AztecProtocol/aztec-packages/issues/20613)) ([5bfbd67](https://github.com/AztecProtocol/aztec-packages/commit/5bfbd6742d12e493fa5590bb159cff9ee8c6520e)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* **ci:** preserve both attempt logs when retrying flaky tests ([#20439](https://github.com/AztecProtocol/aztec-packages/issues/20439)) ([2aea1d3](https://github.com/AztecProtocol/aztec-packages/commit/2aea1d33972dd9c17dae86b8e5c26bab8b147806)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([f9431cd](https://github.com/AztecProtocol/aztec-packages/commit/f9431cdade270f3046c474d7f07e96f74d9d9747)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([4750714](https://github.com/AztecProtocol/aztec-packages/commit/475071440bf944ec6877413c0deda824ffc7d325)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([39eb786](https://github.com/AztecProtocol/aztec-packages/commit/39eb786279ffcb0acdb3c3e393ca805831c9dca3)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([5e1a60f](https://github.com/AztecProtocol/aztec-packages/commit/5e1a60fc08d86ae6e0d28cf9a55caaf053e3159f)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([370b552](https://github.com/AztecProtocol/aztec-packages/commit/370b552ec9b94e7fcb04ca9fafc3ef345f4acece)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([212c8da](https://github.com/AztecProtocol/aztec-packages/commit/212c8dab2dd803b5b28ecccb39654937fb6f261f)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([d21f018](https://github.com/AztecProtocol/aztec-packages/commit/d21f0189c9cc34fd7171034ea40ec31eae73dde6)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([83340dc](https://github.com/AztecProtocol/aztec-packages/commit/83340dcc341da284582d2bab7b312be0a7c898eb)) +* default pp handling ([#20516](https://github.com/AztecProtocol/aztec-packages/issues/20516)) ([37bfad4](https://github.com/AztecProtocol/aztec-packages/commit/37bfad4fc6596f6a55a40f982c96d18a964963ff)) +* do not ignore test artifacts ([9e08cef](https://github.com/AztecProtocol/aztec-packages/commit/9e08cefa4375c36e7efca57fe6bd178c796ee552)) +* do not ignore test artifacts ([#20574](https://github.com/AztecProtocol/aztec-packages/issues/20574)) ([402f438](https://github.com/AztecProtocol/aztec-packages/commit/402f4388d28977b77f02bba61bca6ed1565482e9)) +* docs examples lockfile ([ef20d2d](https://github.com/AztecProtocol/aztec-packages/commit/ef20d2d5ad5fb11ccd23e5762322663e4599191a)) +* docs examples lockfile ([#20453](https://github.com/AztecProtocol/aztec-packages/issues/20453)) ([4bf9ddd](https://github.com/AztecProtocol/aztec-packages/commit/4bf9ddd84c1812532dca7d4dbac0568b660423de)) +* escape hatch snapshots ([e3b9467](https://github.com/AztecProtocol/aztec-packages/commit/e3b9467385bbb1eaa4eb096e6e1a18b06d45bba9)) +* escape hatch snapshots ([#20363](https://github.com/AztecProtocol/aztec-packages/issues/20363)) ([e4712cd](https://github.com/AztecProtocol/aztec-packages/commit/e4712cda8def49d75fbba2d361625fc5e21945f5)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **ethereum:** check timeout before consuming nonce in L1TxUtils ([#20501](https://github.com/AztecProtocol/aztec-packages/issues/20501)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* **ethereum:** remove viem NonceManager to fix nonce gap after failed sends ([#20819](https://github.com/AztecProtocol/aztec-packages/issues/20819)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* evicted transactions could reappear after a node restart ([#20773](https://github.com/AztecProtocol/aztec-packages/issues/20773)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([625a7c5](https://github.com/AztecProtocol/aztec-packages/commit/625a7c5afa709718d03f3837bc0ce9bdb26e05fd)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* Fix checkpoint invalidation test ([#20579](https://github.com/AztecProtocol/aztec-packages/issues/20579)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* Fix the epoch long proving test ([#20617](https://github.com/AztecProtocol/aztec-packages/issues/20617)) ([6414d9b](https://github.com/AztecProtocol/aztec-packages/commit/6414d9ba2e2e622a5cb6541612dfdc119388522b)) +* flag stripping error ([#20655](https://github.com/AztecProtocol/aztec-packages/issues/20655)) ([b87c8ae](https://github.com/AztecProtocol/aztec-packages/commit/b87c8ae0aed61474dbcbca5acabc5a833404b817)) +* getVotes return empty instead of stale data ([#20756](https://github.com/AztecProtocol/aztec-packages/issues/20756)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* hodgepodge of small things ([#20720](https://github.com/AztecProtocol/aztec-packages/issues/20720)) ([43caf7c](https://github.com/AztecProtocol/aztec-packages/commit/43caf7c71f19e1f16151b81ed1f93a09b8de3666)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([6b2cade](https://github.com/AztecProtocol/aztec-packages/commit/6b2cade3d6862926d0e22537363750a3d5915b70)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* increase waitForTx timeout in epochs_invalidate_block test ([#20603](https://github.com/AztecProtocol/aztec-packages/issues/20603)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* limit number of threads when verifying server-side proofs ([#20818](https://github.com/AztecProtocol/aztec-packages/issues/20818)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* min expiration timestamp instead of assert ([9852c84](https://github.com/AztecProtocol/aztec-packages/commit/9852c8465b437d1859c9d8754b2353baf0324fe7)) +* min expiration timestamp instead of assert ([#20554](https://github.com/AztecProtocol/aztec-packages/issues/20554)) ([fa29717](https://github.com/AztecProtocol/aztec-packages/commit/fa29717547a9ba32ce21ff46dae5f0750a84ec4d)) +* misc minor contract fixes ([#20423](https://github.com/AztecProtocol/aztec-packages/issues/20423)) ([3a13674](https://github.com/AztecProtocol/aztec-packages/commit/3a1367402d058e9d738344bef0ffccce0dad7b55)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **node:** sync ws before simulating public calls ([#20499](https://github.com/AztecProtocol/aztec-packages/issues/20499)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([7ea6a37](https://github.com/AztecProtocol/aztec-packages/commit/7ea6a37bad49db41bdde2e6f9d68298c43c08a70)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* **p2p:** fix compress option in file store and enable for tx uploads ([#20605](https://github.com/AztecProtocol/aztec-packages/issues/20605)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* **p2p:** wait for GossipSub mesh formation before sending txs in e2e tests ([#20626](https://github.com/AztecProtocol/aztec-packages/issues/20626)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* pass log level to AVM simulator ([#20762](https://github.com/AztecProtocol/aztec-packages/issues/20762)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* pxe native prover log level ([#20724](https://github.com/AztecProtocol/aztec-packages/issues/20724)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* Reduce tx hash conversions inside tx pool ([#20829](https://github.com/AztecProtocol/aztec-packages/issues/20829)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* respecting MAX_RPC_LEN limit in getAllLogsByTags ([010a959](https://github.com/AztecProtocol/aztec-packages/commit/010a95985ebd9133f2c031f1b2a855cc4d54c878)) +* respecting MAX_RPC_LEN limit in getAllLogsByTags ([#20543](https://github.com/AztecProtocol/aztec-packages/issues/20543)) ([c2475bd](https://github.com/AztecProtocol/aztec-packages/commit/c2475bd69692985d42b3d095d0fb40fc3e07383c)) +* separate rejected and aborted proving jobs ([#20777](https://github.com/AztecProtocol/aztec-packages/issues/20777)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([dedf440](https://github.com/AztecProtocol/aztec-packages/commit/dedf44097cc8dcfc7969e46baa05303005b092e9)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([84d400c](https://github.com/AztecProtocol/aztec-packages/commit/84d400c7c419cf4db2f2031cb1db674548cc7a39)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([e73e0de](https://github.com/AztecProtocol/aztec-packages/commit/e73e0de8642fbe69fa042608dcc0a9077aa02fe3)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([3c5f51d](https://github.com/AztecProtocol/aztec-packages/commit/3c5f51d2e7fda3ca6aefe9e3707841c0010e2a35)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([637df1c](https://github.com/AztecProtocol/aztec-packages/commit/637df1c30f9a17bb3a497745076fca82a8aad55e)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([07ffd46](https://github.com/AztecProtocol/aztec-packages/commit/07ffd46fba6f433c27cb1e1d9fc5542595084c35)) +* Set Aztec slot duration as a multiple of the Ethereum slot duration ([#20608](https://github.com/AztecProtocol/aztec-packages/issues/20608)) ([afd4cbe](https://github.com/AztecProtocol/aztec-packages/commit/afd4cbe3023e1de4cd4e1f7bf8c946e4c5f0b29a)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* set PXE sync chain tip to proposed for scenario bot ([#20530](https://github.com/AztecProtocol/aztec-packages/issues/20530)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([f9431cd](https://github.com/AztecProtocol/aztec-packages/commit/f9431cdade270f3046c474d7f07e96f74d9d9747)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([4750714](https://github.com/AztecProtocol/aztec-packages/commit/475071440bf944ec6877413c0deda824ffc7d325)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([39eb786](https://github.com/AztecProtocol/aztec-packages/commit/39eb786279ffcb0acdb3c3e393ca805831c9dca3)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([5e1a60f](https://github.com/AztecProtocol/aztec-packages/commit/5e1a60fc08d86ae6e0d28cf9a55caaf053e3159f)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([370b552](https://github.com/AztecProtocol/aztec-packages/commit/370b552ec9b94e7fcb04ca9fafc3ef345f4acece)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([212c8da](https://github.com/AztecProtocol/aztec-packages/commit/212c8dab2dd803b5b28ecccb39654937fb6f261f)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([d21f018](https://github.com/AztecProtocol/aztec-packages/commit/d21f0189c9cc34fd7171034ea40ec31eae73dde6)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([83340dc](https://github.com/AztecProtocol/aztec-packages/commit/83340dcc341da284582d2bab7b312be0a7c898eb)) +* skip default pp in sol aggregation ([#20521](https://github.com/AztecProtocol/aztec-packages/issues/20521)) ([37bfad4](https://github.com/AztecProtocol/aztec-packages/commit/37bfad4fc6596f6a55a40f982c96d18a964963ff)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([639368d](https://github.com/AztecProtocol/aztec-packages/commit/639368da6989c0a1e7d5723561ed7d9ca2b5d2db)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([3bd5145](https://github.com/AztecProtocol/aztec-packages/commit/3bd51454d99241b3fe643e958017bb30fa4d516d)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([a2b87e2](https://github.com/AztecProtocol/aztec-packages/commit/a2b87e22059c48fd5fd39d08e13ee7a6b4aa4959)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([326744c](https://github.com/AztecProtocol/aztec-packages/commit/326744c3b5e9e242db2d51dc9ef0d6f19b3c08ef)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([0aef088](https://github.com/AztecProtocol/aztec-packages/commit/0aef0889eefa868d9013421ad2f243727de839a7)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([7a3bbcc](https://github.com/AztecProtocol/aztec-packages/commit/7a3bbcc9b0921e7dc8eb4720f417cd90d4283e91)) +* stringify all bigints in pino-logger ([#20303](https://github.com/AztecProtocol/aztec-packages/issues/20303)) ([9519ab3](https://github.com/AztecProtocol/aztec-packages/commit/9519ab355b26d7486df2fbca95791449c69a8241)) +* sync world state before forking in simulatePublicCalls ([#20544](https://github.com/AztecProtocol/aztec-packages/issues/20544)) ([f3420e0](https://github.com/AztecProtocol/aztec-packages/commit/f3420e07b519abb848b09a5ea12339b64f0321d5)) +* track last seen nonce in case of stale fallback L1 RPC node ([#20855](https://github.com/AztecProtocol/aztec-packages/issues/20855)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* **txe:** committing after txs ([#20714](https://github.com/AztecProtocol/aztec-packages/issues/20714)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* underflow in snapshot synch ([#20780](https://github.com/AztecProtocol/aztec-packages/issues/20780)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* Use async poseidon ([#20826](https://github.com/AztecProtocol/aztec-packages/issues/20826)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* use ci3_labels_to_env.sh for ci-external label ([4d48205](https://github.com/AztecProtocol/aztec-packages/commit/4d48205f0f3a09bbeab496348d1b82f3f3334a48)) +* use ci3_labels_to_env.sh for ci-external label ([#20597](https://github.com/AztecProtocol/aztec-packages/issues/20597)) ([3efb1d9](https://github.com/AztecProtocol/aztec-packages/commit/3efb1d9298daf9f4c266c7f1626f862ec35bdfd4)) +* write pointers for environ_get and environ_sizes_get functions ([#20902](https://github.com/AztecProtocol/aztec-packages/issues/20902)) ([f3f5438](https://github.com/AztecProtocol/aztec-packages/commit/f3f543878af6f9e428618f0d751675585638ff0c)) +* yolo debugging tweaks ([0a9d6e0](https://github.com/AztecProtocol/aztec-packages/commit/0a9d6e007ee247164aabf4e39f3f381fa5642870)) +* yolo some fd cleanup, maybe stop hangs ([43d292c](https://github.com/AztecProtocol/aztec-packages/commit/43d292c4844af2c891a8504e2e49b47f482ad556)) + + +### Miscellaneous + +* change max private log size to 16 fields ([b9378ca](https://github.com/AztecProtocol/aztec-packages/commit/b9378ca777df2deac7b0e8431ae615f48c420e1d)) +* change max private log size to 16 fields ([#20515](https://github.com/AztecProtocol/aztec-packages/issues/20515)) ([736a202](https://github.com/AztecProtocol/aztec-packages/commit/736a202e7c59901948e767c7575decd4aa9add17)) +* include_by_timestamp -> expiration_timestamp ([#20536](https://github.com/AztecProtocol/aztec-packages/issues/20536)) ([44a33a1](https://github.com/AztecProtocol/aztec-packages/commit/44a33a1cd75be74ef5379d4c7079b31291bba9cf)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([f9431cd](https://github.com/AztecProtocol/aztec-packages/commit/f9431cdade270f3046c474d7f07e96f74d9d9747)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([4750714](https://github.com/AztecProtocol/aztec-packages/commit/475071440bf944ec6877413c0deda824ffc7d325)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([39eb786](https://github.com/AztecProtocol/aztec-packages/commit/39eb786279ffcb0acdb3c3e393ca805831c9dca3)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([5e1a60f](https://github.com/AztecProtocol/aztec-packages/commit/5e1a60fc08d86ae6e0d28cf9a55caaf053e3159f)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([370b552](https://github.com/AztecProtocol/aztec-packages/commit/370b552ec9b94e7fcb04ca9fafc3ef345f4acece)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([212c8da](https://github.com/AztecProtocol/aztec-packages/commit/212c8dab2dd803b5b28ecccb39654937fb6f261f)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([d21f018](https://github.com/AztecProtocol/aztec-packages/commit/d21f0189c9cc34fd7171034ea40ec31eae73dde6)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([83340dc](https://github.com/AztecProtocol/aztec-packages/commit/83340dcc341da284582d2bab7b312be0a7c898eb)) +* pairing points audit ([#20456](https://github.com/AztecProtocol/aztec-packages/issues/20456)) ([37bfad4](https://github.com/AztecProtocol/aztec-packages/commit/37bfad4fc6596f6a55a40f982c96d18a964963ff)) +* update da gas ([94c5a4c](https://github.com/AztecProtocol/aztec-packages/commit/94c5a4cab7e72311036bd5ddd3386f9a64029f52)) +* update da gas ([#20611](https://github.com/AztecProtocol/aztec-packages/issues/20611)) ([6ec7568](https://github.com/AztecProtocol/aztec-packages/commit/6ec75680acf2f4c2022b58d39f17b2eb1adb20d1)) +* update vks ([4d653dd](https://github.com/AztecProtocol/aztec-packages/commit/4d653dde22ed1955cc4396a43174a1e13974c581)) + + +### Documentation + +* document RevertCodeEnum phases and add 120-char line width rule ([#20751](https://github.com/AztecProtocol/aztec-packages/issues/20751)) ([83ea202](https://github.com/AztecProtocol/aztec-packages/commit/83ea2023bb6d1a928943e9af7a9e17bb6a6e8d11)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([50e778a](https://github.com/AztecProtocol/aztec-packages/commit/50e778ade1f6dc60abbc4d693a356b6abe81c38a)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([6fcc86e](https://github.com/AztecProtocol/aztec-packages/commit/6fcc86e33e9020de5ba60f22adb88ea56ee7a24c)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([f039b7e](https://github.com/AztecProtocol/aztec-packages/commit/f039b7e0165d9399a872c4205108b5feb30fc3d3)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([2cc6846](https://github.com/AztecProtocol/aztec-packages/commit/2cc68466bc60fc2cf9a514341167c6657f899dc8)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([71dc368](https://github.com/AztecProtocol/aztec-packages/commit/71dc36802cb2c4b4df5a8254e08ed67d085ffc9c)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([13d7316](https://github.com/AztecProtocol/aztec-packages/commit/13d73162358609af5decf339a97d17093aea6e66)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([a0262f0](https://github.com/AztecProtocol/aztec-packages/commit/a0262f06660c4768191c3d5987e5a64324f26030)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([c8e0b00](https://github.com/AztecProtocol/aztec-packages/commit/c8e0b008241be4ce1b81ef8376697f92b3eba029)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([7eef2cf](https://github.com/AztecProtocol/aztec-packages/commit/7eef2cfea9d78c0753f50c9df29f28e93a0c5566)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([3c3d0fc](https://github.com/AztecProtocol/aztec-packages/commit/3c3d0fcc573405b4c33f72b4d4c1d15e792f8d22)) +* fix avm docs - l2 gas is not the same as mana ([#20565](https://github.com/AztecProtocol/aztec-packages/issues/20565)) ([27aa830](https://github.com/AztecProtocol/aztec-packages/commit/27aa830acbbd1af1d99cb93ee28c7e2334640a1a)) +* minor clarification ([#20788](https://github.com/AztecProtocol/aztec-packages/issues/20788)) ([fdd0d0d](https://github.com/AztecProtocol/aztec-packages/commit/fdd0d0d6b37751ddb419475fc6634a9ae13f8235)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([50e778a](https://github.com/AztecProtocol/aztec-packages/commit/50e778ade1f6dc60abbc4d693a356b6abe81c38a)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([6fcc86e](https://github.com/AztecProtocol/aztec-packages/commit/6fcc86e33e9020de5ba60f22adb88ea56ee7a24c)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([f039b7e](https://github.com/AztecProtocol/aztec-packages/commit/f039b7e0165d9399a872c4205108b5feb30fc3d3)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([2cc6846](https://github.com/AztecProtocol/aztec-packages/commit/2cc68466bc60fc2cf9a514341167c6657f899dc8)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([71dc368](https://github.com/AztecProtocol/aztec-packages/commit/71dc36802cb2c4b4df5a8254e08ed67d085ffc9c)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([13d7316](https://github.com/AztecProtocol/aztec-packages/commit/13d73162358609af5decf339a97d17093aea6e66)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([a0262f0](https://github.com/AztecProtocol/aztec-packages/commit/a0262f06660c4768191c3d5987e5a64324f26030)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([c8e0b00](https://github.com/AztecProtocol/aztec-packages/commit/c8e0b008241be4ce1b81ef8376697f92b3eba029)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([7eef2cf](https://github.com/AztecProtocol/aztec-packages/commit/7eef2cfea9d78c0753f50c9df29f28e93a0c5566)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([3c3d0fc](https://github.com/AztecProtocol/aztec-packages/commit/3c3d0fcc573405b4c33f72b4d4c1d15e792f8d22)) +* simulator readme typos ([#19701](https://github.com/AztecProtocol/aztec-packages/issues/19701)) ([a1e4b61](https://github.com/AztecProtocol/aztec-packages/commit/a1e4b6193c93f24808d1445049b4c9339e96bbb1)) +* some tail circuit doc comments ([521d581](https://github.com/AztecProtocol/aztec-packages/commit/521d581fa5fbad111642efb71969da7bb60d9419)) +* some tail circuit doc comments ([#20449](https://github.com/AztecProtocol/aztec-packages/issues/20449)) ([fd509a3](https://github.com/AztecProtocol/aztec-packages/commit/fd509a367b9c323328067fef38dea26bb3d24fd6)) + ## [0.87.6](https://github.com/AztecProtocol/aztec-packages/compare/v0.87.5...v0.87.6) (2025-06-02) diff --git a/aztec-up/bin/0.0.1/aztec-install b/aztec-up/bin/0.0.1/aztec-install index 119ea10d1410..a217e7b134d4 100755 --- a/aztec-up/bin/0.0.1/aztec-install +++ b/aztec-up/bin/0.0.1/aztec-install @@ -51,11 +51,12 @@ function title { echo -e "Installing version: ${bold}${g}$VERSION${r}" echo echo -e "This install script will install the following and update your PATH if necessary:" - echo -e " ${bold}${g}nargo${r} - the version of the noir programming language compatible with this version of aztec." - echo -e " ${bold}${g}bb${r} - the version of the barretenberg proving backend compatible with this version of aztec." - echo -e " ${bold}${g}aztec${r} - a collection of tools to compile and test contracts, to launch subsystems and interact with the aztec network." - echo -e " ${bold}${g}aztec-up${r} - a tool to install and manage aztec toolchain versions." - echo -e " ${bold}${g}aztec-wallet${r} - our minimalistic CLI wallet" + echo -e " ${bold}${g}nargo${r} - the version of the noir programming language compatible with this version of aztec." + echo -e " ${bold}${g}noir-profiler${r} - a sampling profiler for analyzing and visualizing Noir programs." + echo -e " ${bold}${g}bb${r} - the version of the barretenberg proving backend compatible with this version of aztec." + echo -e " ${bold}${g}aztec${r} - a collection of tools to compile and test contracts, to launch subsystems and interact with the aztec network." + echo -e " ${bold}${g}aztec-up${r} - a tool to install and manage aztec toolchain versions." + echo -e " ${bold}${g}aztec-wallet${r} - our minimalistic CLI wallet" echo read -p "Do you wish to continue? (y/n) " -n 1 -r echo diff --git a/aztec-up/bin/0.0.1/install b/aztec-up/bin/0.0.1/install index 97c619ec0805..51cbcae671d7 100755 --- a/aztec-up/bin/0.0.1/install +++ b/aztec-up/bin/0.0.1/install @@ -174,6 +174,8 @@ function install_noir { # Move the nargo binary to our version bin directory mv "$temp_nargo_home/bin/nargo" "$version_bin_path/nargo" + # Also move noir-profiler, needed by `aztec profile flamegraph` + mv "$temp_nargo_home/bin/noir-profiler" "$version_bin_path/noir-profiler" # Cleanup temp directory rm -rf "$temp_nargo_home" diff --git a/barretenberg/cpp/scripts/run_bench.sh b/barretenberg/cpp/scripts/run_bench.sh index 64df1e05eadd..205f26109569 100755 --- a/barretenberg/cpp/scripts/run_bench.sh +++ b/barretenberg/cpp/scripts/run_bench.sh @@ -14,13 +14,20 @@ filter=$4 export GTEST_COLOR=1 export HARDWARE_CONCURRENCY=${CPUS:-8} +# Set ALLOCATOR=tcmalloc to use tcmalloc via LD_PRELOAD. +BENCH_PRELOAD="" +if [ "${ALLOCATOR:-}" = "tcmalloc" ]; then + sudo apt-get update -qq && sudo apt-get install -y -qq libtcmalloc-minimal4t64 + BENCH_PRELOAD="/usr/lib/$(uname -m)-linux-gnu/libtcmalloc_minimal.so.4" +fi + mkdir -p bench-out/$(dirname $name) export MEMUSAGE_OUT="bench-out/$name-peak-memory-mb.txt" case $arch in native) - memusage $bin --benchmark_out=./bench-out/$name.json --benchmark_filter=$filter + LD_PRELOAD="${BENCH_PRELOAD}" memusage $bin --benchmark_out=./bench-out/$name.json --benchmark_filter=$filter ;; wasm) memusage ./scripts/wasmtime.sh $bin --benchmark_out=./bench-out/$name.json --benchmark_filter=$filter diff --git a/barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/constants.hpp b/barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/constants.hpp index 8988b8aaede0..d5587f417097 100644 --- a/barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/constants.hpp +++ b/barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/constants.hpp @@ -32,7 +32,7 @@ const std::vector REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MESS const std::vector SETUP_ENQUEUED_CALLS = {}; const FF MSG_SENDER = 100; const std::optional TEARDOWN_ENQUEUED_CALLS = std::nullopt; -const Gas GAS_USED_BY_PRIVATE = Gas{ .l2_gas = 0, .da_gas = 0 }; +const Gas GAS_USED_BY_PRIVATE = Gas{ .l2_gas = PUBLIC_TX_L2_GAS_OVERHEAD, .da_gas = TX_DA_GAS_OVERHEAD }; const AztecAddress FEE_PAYER = AztecAddress{ 0 }; const FF CONTRACT_ADDRESS = 42; const FF TRANSACTION_FEE = 0; diff --git a/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_data.cpp b/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_data.cpp index a78fe06b9f34..64f41ef467ca 100644 --- a/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_data.cpp +++ b/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_data.cpp @@ -112,7 +112,7 @@ void mutate_tx(Tx& tx, std::vector& contract_addresses, std::mt199 case TxMutationOptions::GasUsedByPrivate: // Mutate gas_used_by_private fuzz_info("Mutating gas used by private"); - mutate_gas(tx.gas_used_by_private, rng, tx.gas_settings.gas_limits); + mutate_gas(tx.gas_used_by_private, rng, GAS_USED_BY_PRIVATE, tx.gas_settings.gas_limits); break; case TxMutationOptions::FeePayer: // Mutate fee_payer diff --git a/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.cpp b/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.cpp index 4d12a4f3fd29..a5a61f3d2e79 100644 --- a/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.cpp +++ b/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.cpp @@ -28,26 +28,26 @@ uint128_t generate_u128(std::mt19937_64& rng, uint128_t min = 0, uint128_t max = namespace bb::avm2::fuzzer { -Gas generate_gas(std::mt19937_64& rng) +Gas generate_gas(std::mt19937_64& rng, const Gas& min, const Gas& max) { - uint32_t l2_gas = std::uniform_int_distribution(MIN_GAS, AVM_MAX_PROCESSABLE_L2_GAS)(rng); - uint32_t da_gas = std::uniform_int_distribution(MIN_GAS, AVM_MAX_PROCESSABLE_DA_GAS)(rng); + uint32_t l2_gas = std::uniform_int_distribution(min.l2_gas, max.l2_gas)(rng); + uint32_t da_gas = std::uniform_int_distribution(min.da_gas, max.da_gas)(rng); return Gas{ l2_gas, da_gas }; } -void mutate_gas(Gas& gas, std::mt19937_64& rng, const Gas& max) +void mutate_gas(Gas& gas, std::mt19937_64& rng, const Gas& min, const Gas& max) { auto choice = std::uniform_int_distribution(0, 1)(rng); switch (choice) { case 0: // Mutate l2_gas - gas.l2_gas = std::uniform_int_distribution(MIN_GAS, max.l2_gas)(rng); + gas.l2_gas = std::uniform_int_distribution(min.l2_gas, max.l2_gas)(rng); break; case 1: // Mutate da_gas - gas.da_gas = std::uniform_int_distribution(MIN_GAS, max.da_gas)(rng); + gas.da_gas = std::uniform_int_distribution(min.da_gas, max.da_gas)(rng); break; } } diff --git a/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.hpp b/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.hpp index f8715e30d1ee..e2f013637f32 100644 --- a/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.hpp +++ b/barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/tx_types/gas.hpp @@ -15,12 +15,13 @@ constexpr uint128_t MIN_FEE = 1; constexpr uint128_t MAX_FEE = 1000; // // Gas bounds for mutation -constexpr uint32_t MIN_GAS = 0; -constexpr uint32_t AVM_MAX_PROCESSABLE_DA_GAS = (MAX_NOTE_HASHES_PER_TX * AVM_EMITNOTEHASH_BASE_DA_GAS) + - (MAX_NULLIFIERS_PER_TX * AVM_EMITNULLIFIER_BASE_DA_GAS) + - (MAX_L2_TO_L1_MSGS_PER_TX * AVM_SENDL2TOL1MSG_BASE_DA_GAS) + - (MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * AVM_SSTORE_DYN_DA_GAS) + - (PUBLIC_LOGS_LENGTH * AVM_EMITPUBLICLOG_BASE_DA_GAS); +constexpr uint32_t MAX_PROCESSABLE_DA_GAS = TX_DA_GAS_OVERHEAD + + (MAX_NOTE_HASHES_PER_TX * AVM_EMITNOTEHASH_BASE_DA_GAS) + + (MAX_NULLIFIERS_PER_TX * AVM_EMITNULLIFIER_BASE_DA_GAS) + + (MAX_L2_TO_L1_MSGS_PER_TX * AVM_SENDL2TOL1MSG_BASE_DA_GAS) + + (MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * AVM_SSTORE_DYN_DA_GAS) + + (PUBLIC_LOGS_LENGTH * AVM_EMITPUBLICLOG_BASE_DA_GAS); +constexpr Gas MAX_GAS_LIMIT = Gas{ .l2_gas = MAX_PROCESSABLE_L2_GAS, .da_gas = MAX_PROCESSABLE_DA_GAS }; enum class GasSettingsMutationOptions : uint8_t { GasLimits, @@ -38,10 +39,8 @@ constexpr GasSettingsMutationConfig GAS_SETTINGS_MUTATION_CONFIGURATION = GasSet { GasSettingsMutationOptions::MaxPriorityFeesPerGas, 5 }, }); -Gas generate_gas(std::mt19937_64& rng); -void mutate_gas(Gas& gas, - std::mt19937_64& rng, - const Gas& max = Gas{ AVM_MAX_PROCESSABLE_L2_GAS, AVM_MAX_PROCESSABLE_DA_GAS }); +Gas generate_gas(std::mt19937_64& rng, const Gas& min = {}, const Gas& max = MAX_GAS_LIMIT); +void mutate_gas(Gas& gas, std::mt19937_64& rng, const Gas& min = {}, const Gas& max = MAX_GAS_LIMIT); GasSettings generate_gas_settings(std::mt19937_64& rng); void mutate_gas_settings(GasSettings& data, std::mt19937_64& rng); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp b/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp index 3c17a240b091..893946fcf632 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp @@ -88,7 +88,8 @@ template struct BackingMemory { return *this; } - // Allocate memory, preferring file-backed if in low memory mode + // Allocate memory, preferring file-backed if in low memory mode. + // Memory is NOT zeroed — callers that need zeroed memory must do so themselves. static BackingMemory allocate(size_t size) { BackingMemory memory; @@ -106,11 +107,19 @@ template struct BackingMemory { ~BackingMemory() = default; private: + // Use new Fr[] instead of std::make_shared(n) to avoid serial + // value-initialization (zeroing). Polynomial's constructor handles + // zeroing in parallel where needed. static void allocate_aligned(BackingMemory& memory, size_t size) { - // Fr has alignas on it so this is fine post c++20. - memory.aligned_memory = std::make_shared(size); - memory.raw_data = memory.aligned_memory.get(); + if (size == 0) { + memory.aligned_memory = nullptr; + memory.raw_data = nullptr; + return; + } + Fr* ptr = new Fr[size]; + memory.aligned_memory = std::shared_ptr(ptr, [](Fr* p) { delete[] p; }); + memory.raw_data = ptr; } #ifndef __wasm__ diff --git a/barretenberg/cpp/src/barretenberg/vm2/common/aztec_constants.hpp b/barretenberg/cpp/src/barretenberg/vm2/common/aztec_constants.hpp index 3890636f80b3..1939294f3582 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/common/aztec_constants.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/common/aztec_constants.hpp @@ -179,7 +179,10 @@ #define AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH 18740 #define AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED 16400 #define AVM_V2_VERIFICATION_KEY_LENGTH_IN_FIELDS_PADDED 1000 +#define TX_DA_GAS_OVERHEAD 96 +#define PUBLIC_TX_L2_GAS_OVERHEAD 540000 #define AVM_MAX_PROCESSABLE_L2_GAS 6000000 +#define MAX_PROCESSABLE_L2_GAS 6540000 #define AVM_PC_SIZE_IN_BITS 32 #define AVM_MAX_OPERANDS 7 #define AVM_MAX_REGISTERS 6 @@ -221,7 +224,7 @@ #define AVM_L1TOL2MSGEXISTS_BASE_L2_GAS 540 #define AVM_GETCONTRACTINSTANCE_BASE_L2_GAS 6108 #define AVM_EMITPUBLICLOG_BASE_L2_GAS 15 -#define AVM_SENDL2TOL1MSG_BASE_L2_GAS 478 +#define AVM_SENDL2TOL1MSG_BASE_L2_GAS 5239 #define AVM_CALL_BASE_L2_GAS 9936 #define AVM_STATICCALL_BASE_L2_GAS 9936 #define AVM_RETURN_BASE_L2_GAS 9 diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/avm_fixed_vk.hpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/avm_fixed_vk.hpp index 93e925fff4c8..3e725f93b8c7 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/avm_fixed_vk.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/avm_fixed_vk.hpp @@ -17,7 +17,7 @@ class AvmHardCodedVKAndHash { using FF = bb::curve::BN254::ScalarField; // Precomputed VK hash (hash of all commitments below). - static FF vk_hash() { return FF(uint256_t("0x02296b934ced1a5cdacae120d2032d88a119bdb0738d4c4f3ada4f5a831a5153")); } + static FF vk_hash() { return FF(uint256_t("0x18952f5711d5f7a6e29c980f1077eecd2ec45e80ba0ae78d5a4ae08e50428cab")); } static constexpr std::array get_all() { @@ -71,9 +71,9 @@ class AvmHardCodedVKAndHash { uint256_t( "0x090dda25e7d64ab5cabe09fd80fbb731af2a98de7a608157dc10394b4fc022a4")), // precomputed_exec_opcode_dynamic_l2_gas Commitment( - uint256_t("0x2216a1693dcb1cc83f57ea8058f681d71bdf0e6cfc839502cf16fb0a88a5f673"), + uint256_t("0x26086b5fb31a24f236f0441d5b922b94ca141e861b9cc640184681c518cd68d3"), uint256_t( - "0x255e6760ed9adda61aca7d0b7d4bb28bb62e3cca6e860009461a9a1708184be2")), // precomputed_exec_opcode_opcode_gas + "0x0bab134bb4e25ff33584c1094847e762ce6573054bae27715d0e4eb2b7278d80")), // precomputed_exec_opcode_opcode_gas Commitment( uint256_t("0x296def9415d1c96b4d8ab91df5f59ad8522a726f98461b1ab5c4d4c5b22471a4"), uint256_t( diff --git a/barretenberg/cpp/src/barretenberg/vm2/testing/avm_inputs.testdata.bin b/barretenberg/cpp/src/barretenberg/vm2/testing/avm_inputs.testdata.bin index 44bfd7a9a088..13cf29d653c4 100644 Binary files a/barretenberg/cpp/src/barretenberg/vm2/testing/avm_inputs.testdata.bin and b/barretenberg/cpp/src/barretenberg/vm2/testing/avm_inputs.testdata.bin differ diff --git a/barretenberg/cpp/src/barretenberg/vm2/testing/minimal_tx.testdata.bin b/barretenberg/cpp/src/barretenberg/vm2/testing/minimal_tx.testdata.bin index 57ac06aafc7d..10e8459aa257 100644 Binary files a/barretenberg/cpp/src/barretenberg/vm2/testing/minimal_tx.testdata.bin and b/barretenberg/cpp/src/barretenberg/vm2/testing/minimal_tx.testdata.bin differ diff --git a/barretenberg/cpp/src/barretenberg/wasi/wasi_stubs.cpp b/barretenberg/cpp/src/barretenberg/wasi/wasi_stubs.cpp index af2520e76c42..31258e97195e 100644 --- a/barretenberg/cpp/src/barretenberg/wasi/wasi_stubs.cpp +++ b/barretenberg/cpp/src/barretenberg/wasi/wasi_stubs.cpp @@ -59,17 +59,22 @@ int32_t __imported_wasi_snapshot_preview1_fd_close(int32_t) return 0; } -int32_t __imported_wasi_snapshot_preview1_environ_get(int32_t, int32_t) +int32_t __imported_wasi_snapshot_preview1_environ_get(int32_t environ_ptr, int32_t environ_buf_ptr) { - // info("environ_get not implemented."); - // abort(); + // No environment variables, so nothing to write. The pointers point to + // arrays that would hold the environ entries and the concatenated + // key=value strings respectively, but with count == 0 they are empty. + (void)environ_ptr; + (void)environ_buf_ptr; return 0; } -int32_t __imported_wasi_snapshot_preview1_environ_sizes_get(int32_t, int32_t) +int32_t __imported_wasi_snapshot_preview1_environ_sizes_get(int32_t count_ptr, int32_t buf_size_ptr) { - // info("environ_sizes_get not implemented."); - // abort(); + // WASI requires writing the number of environment variables and the total + // buffer size needed to hold them. We have none of either. + *(int32_t*)(uintptr_t)count_ptr = 0; + *(int32_t*)(uintptr_t)buf_size_ptr = 0; return 0; } diff --git a/bootstrap.sh b/bootstrap.sh index edc7bb5775fa..86c64db5f0ac 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -11,7 +11,7 @@ source $(git rev-parse --show-toplevel)/ci3/source_bootstrap export DENOISE=${DENOISE:-1} # Number of TXE servers to run when testing. -export NUM_TXES=8 +export NUM_TXES=1 export MAKEFLAGS="-j${MAKE_JOBS:-$(get_num_cpus)}" diff --git a/docs/docs-developers/docs/aztec-js/aztec_js_reference.md b/docs/docs-developers/docs/aztec-js/aztec_js_reference.md index 9ae2605af87f..3010573e9e88 100644 --- a/docs/docs-developers/docs/aztec-js/aztec_js_reference.md +++ b/docs/docs-developers/docs/aztec-js/aztec_js_reference.md @@ -4830,7 +4830,7 @@ Helper type that represents all methods that can be batched. ```typescript export type BatchableMethods = Pick< Wallet, - 'registerContract' | 'sendTx' | 'registerSender' | 'simulateUtility' | 'simulateTx' + 'registerContract' | 'sendTx' | 'registerSender' | 'executeUtility' | 'simulateTx' >; ``` @@ -5040,7 +5040,7 @@ export type Wallet = { secretKey?: Fr, ): Promise; simulateTx(exec: ExecutionPayload, opts: SimulateOptions): Promise; - simulateUtility(call: FunctionCall, authwits?: AuthWitness[]): Promise; + executeUtility(call: FunctionCall, authwits?: AuthWitness[]): Promise; profileTx(exec: ExecutionPayload, opts: ProfileOptions): Promise; sendTx(exec: ExecutionPayload, opts: SendOptions): Promise; createAuthWit(from: AztecAddress, messageHashOrIntent: Fr | IntentInnerHash | CallIntent): Promise; @@ -5210,15 +5210,15 @@ simulateTx( **Returns:** `Promise` -##### simulateUtility +##### executeUtility **Signature:** ```typescript -simulateUtility( +executeUtility( call: FunctionCall, authwits?: AuthWitness[] -): Promise +): Promise ``` **Parameters:** @@ -5228,7 +5228,7 @@ simulateUtility( **Returns:** -`Promise` +`Promise` ##### profileTx **Signature:** diff --git a/docs/docs-developers/docs/resources/migration_notes.md b/docs/docs-developers/docs/resources/migration_notes.md index f7ab60e20c53..01862c1ddfaa 100644 --- a/docs/docs-developers/docs/resources/migration_notes.md +++ b/docs/docs-developers/docs/resources/migration_notes.md @@ -9,6 +9,27 @@ Aztec is in active development. Each version may introduce breaking changes that ## TBD +### `simulateUtility` renamed to `executeUtility` + +The `simulateUtility` method and related types have been renamed to `executeUtility` across the entire stack to better reflect that utility functions are executed, not simulated. + +**TypeScript:** + +```diff +- import { SimulateUtilityOptions, UtilitySimulationResult } from '@aztec/aztec.js'; ++ import { ExecuteUtilityOptions, UtilityExecutionResult } from '@aztec/aztec.js'; + +- const result: UtilitySimulationResult = await wallet.simulateUtility(functionCall, opts); ++ const result: UtilityExecutionResult = await wallet.executeUtility(functionCall, opts); +``` + +**Noir (test environment):** + +```diff +- let result = env.simulate_utility(my_contract_address, selector); ++ let result = env.execute_utility(my_contract_address, selector); +``` + ### [Protocol] `include_by_timestamp` renamed to `expiration_timestamp` The `include_by_timestamp` field has been renamed to `expiration_timestamp` across the protocol to better convey its meaning. diff --git a/docs/docs-operate/operators/reference/changelog/v4.md b/docs/docs-operate/operators/reference/changelog/v4.md index 369e3fec643a..de6d28118215 100644 --- a/docs/docs-operate/operators/reference/changelog/v4.md +++ b/docs/docs-operate/operators/reference/changelog/v4.md @@ -119,13 +119,13 @@ The admin JSON-RPC endpoint now supports auto-generated API key authentication. ```bash --admin-api-key-hash ($AZTEC_ADMIN_API_KEY_HASH) # Use a pre-generated SHA-256 key hash ---no-admin-api-key ($AZTEC_NO_ADMIN_API_KEY) # Disable auth entirely +--disable-admin-api-key ($AZTEC_DISABLE_ADMIN_API_KEY) # Disable auth entirely --reset-admin-api-key ($AZTEC_RESET_ADMIN_API_KEY) # Force key regeneration ``` -**Helm charts**: Admin API key auth is disabled by default (`noAdminApiKey: true`). Set to `false` in production values to enable. +**Helm charts**: Admin API key auth is disabled by default (`disableAdminApiKey: true`). Set to `false` in production values to enable. -**Migration**: No action required — auth is opt-out. To enable, ensure `--no-admin-api-key` is not set and note the key printed at startup. +**Migration**: No action required — auth is opt-out. To enable, ensure `--disable-admin-api-key` is not set and note the key printed at startup. ### Transaction pool error codes for RPC callers diff --git a/l1-contracts/script/deploy/DeployAlpha.s.sol b/l1-contracts/script/deploy/DeployAlpha.s.sol new file mode 100644 index 000000000000..39ac7b4dd502 --- /dev/null +++ b/l1-contracts/script/deploy/DeployAlpha.s.sol @@ -0,0 +1,910 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2026 Aztec Labs. +pragma solidity >=0.8.27; + +/** + * @title DeployAlpha + * @notice Mainnet-only deployment and validation script for the alpha upgrade. + * @dev This script is intentionally self-contained: + * - All deployment inputs are hardcoded constants in this file. + * - `run()` deploys verifier, rollup, escape hatch, and payload, then calls `validate(payload)`. + * - `validate(payload)` performs strict config checks and governance execution simulation. + * + * Runtime requirements: + * - `block.chainid == 1`. + * - `DEPLOYER` must be set and correspond to the broadcast key. + * + * Expected usage: + * - Preferred deployment entrypoint: `l1-contracts/scripts/run_alpha_upgrade.sh` + * (ensures `--verify` is always included for Etherscan verification). + * - Deployment path (direct): `run()`. + * - Post-deploy revalidation path: `validate(address payload)`. + */ +import {Script} from "forge-std/Script.sol"; +import {StdAssertions} from "forge-std/StdAssertions.sol"; +import {console} from "forge-std/console.sol"; + +import {Ownable} from "@oz/access/Ownable.sol"; +import {IERC20} from "@oz/token/ERC20/IERC20.sol"; + +import {Inbox} from "@aztec/core/messagebridge/Inbox.sol"; +import {Outbox} from "@aztec/core/messagebridge/Outbox.sol"; +import {EscapeHatch} from "@aztec/core/EscapeHatch.sol"; +import {Rollup} from "@aztec/core/Rollup.sol"; +import {IEscapeHatch} from "@aztec/core/interfaces/IEscapeHatch.sol"; +import {IInstance} from "@aztec/core/interfaces/IInstance.sol"; +import {IRollup, IRollupCore, GenesisState, RollupConfigInput} from "@aztec/core/interfaces/IRollup.sol"; +import {SlasherFlavor} from "@aztec/core/interfaces/ISlasher.sol"; +import {IStaking} from "@aztec/core/interfaces/IStaking.sol"; +import {IValidatorSelectionCore} from "@aztec/core/interfaces/IValidatorSelection.sol"; +import {IVerifier} from "@aztec/core/interfaces/IVerifier.sol"; +import {StakingQueueConfig} from "@aztec/core/libraries/compressed-data/StakingQueueConfig.sol"; +import {EthPerFeeAssetE12, EthValue} from "@aztec/core/libraries/rollup/FeeLib.sol"; +import {Bps, RewardConfig} from "@aztec/core/libraries/rollup/RewardLib.sol"; +import {IBooster, IBoosterCore, RewardBoostConfig} from "@aztec/core/reward-boost/RewardBooster.sol"; +import {Slasher} from "@aztec/core/slashing/Slasher.sol"; +import {TallySlashingProposer} from "@aztec/core/slashing/TallySlashingProposer.sol"; + +import {GSE, IGSE, IGSECore} from "@aztec/governance/GSE.sol"; +import {Governance} from "@aztec/governance/Governance.sol"; +import {GSEPayload} from "@aztec/governance/GSEPayload.sol"; +import {Configuration, IGovernance, Proposal, ProposalState} from "@aztec/governance/interfaces/IGovernance.sol"; +import {IPayload} from "@aztec/governance/interfaces/IPayload.sol"; +import {IRewardDistributor} from "@aztec/governance/interfaces/IRewardDistributor.sol"; +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; + +import {FlushRewarder} from "@aztec/periphery/FlushRewarder.sol"; + +import {Epoch, Timestamp} from "@aztec/shared/libraries/TimeMath.sol"; + +import {AlphaPayload} from "@aztec/alpha/AlphaPayload.sol"; +import {HonkVerifier as RollupVerifier} from "@aztec/alpha/AlphaVerifier.sol"; + +contract DeployAlpha is Script, StdAssertions { + error DeployAlpha__NotMainnet(uint256 chainId); + error DeployAlpha__SnapshotRevertFailed(uint256 snapshotId); + + uint256 internal constant MAINNET_CHAIN_ID = 1; + + address internal constant MAINNET_REGISTRY = 0x35b22e09Ee0390539439E24f06Da43D83f90e298; + address internal constant MAINNET_GOVERNANCE = 0x1102471Eb3378FEE427121c9EfcEa452E4B6B75e; + address internal constant MAINNET_CANONICAL_ROLLUP = 0x603bb2c05D474794ea97805e8De69bCcFb3bCA12; + address internal constant MAINNET_GSE = 0xa92ecFD0E70c9cd5E5cd76c50Af0F7Da93567a4f; + address internal constant MAINNET_FEE_ASSET = 0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2; + address internal constant MAINNET_STAKING_ASSET = 0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2; + address internal constant MAINNET_REWARD_DISTRIBUTOR = 0x3D6A1B00C830C5f278FC5dFb3f6Ff0b74Db6dfe0; + address internal constant MAINNET_OLD_FLUSH_REWARDER = 0x7C9a7130379F1B5dd6e7A53AF84fC0fE32267B65; + address internal constant MAINNET_REWARD_TOKEN = 0xA27EC0006e59f245217Ff08CD52A7E8b169E62D2; + + bytes32 internal constant MAINNET_VK_TREE_ROOT = 0x2d0b15497929f5150c4c383993555456e60d27121f4ac2cb9ef880319f5f9a6f; + bytes32 internal constant MAINNET_PROTOCOL_CONTRACTS_HASH = + 0x2672340d9a0107a7b81e6d10d25b854debe613f3272e8738e8df0ca2ff297141; + bytes32 internal constant MAINNET_GENESIS_ARCHIVE_ROOT = + 0x15684c8c3d2106918d3860f777e50555b7166adff47df13cc652e2e5a50bf5c7; + + uint256 internal constant AZTEC_SLOT_DURATION = 72; + uint256 internal constant AZTEC_EPOCH_DURATION = 32; + uint256 internal constant AZTEC_TARGET_COMMITTEE_SIZE = 48; + uint256 internal constant AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET = 2; + uint256 internal constant AZTEC_LAG_IN_EPOCHS_FOR_RANDAO = 1; + uint256 internal constant AZTEC_INBOX_LAG = 1; + uint256 internal constant AZTEC_PROOF_SUBMISSION_EPOCHS = 1; + uint256 internal constant AZTEC_ACTIVATION_THRESHOLD = 200_000e18; + uint256 internal constant AZTEC_EJECTION_THRESHOLD = 100_000e18; + uint256 internal constant AZTEC_LOCAL_EJECTION_THRESHOLD = 190_000e18; + uint256 internal constant AZTEC_MANA_TARGET = 75_000_000; + uint256 internal constant AZTEC_EXIT_DELAY_SECONDS = 345_600; + // 10 * 30$ /(150e6 * 32) / 2500$ * 1e18 = 25_000_000 wei per mana + uint256 internal constant AZTEC_PROVING_COST_PER_MANA = 25_000_000; + uint256 internal constant AZTEC_INITIAL_ETH_PER_FEE_ASSET = 11_729_988; // 0.000011729988 eth per aztec token + + uint256 internal constant AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS = 4; + uint256 internal constant AZTEC_SLASHING_QUORUM = 65; + uint256 internal constant AZTEC_SLASHING_LIFETIME_IN_ROUNDS = 34; + uint256 internal constant AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS = 28; + uint256 internal constant AZTEC_SLASHING_OFFSET_IN_ROUNDS = 2; + address internal constant AZTEC_SLASHING_VETOER = 0xBbB4aF368d02827945748b28CD4b2D42e4A37480; + uint256 internal constant AZTEC_SLASHING_DISABLE_DURATION = 259_200; + uint256 internal constant AZTEC_SLASH_AMOUNT_SMALL = 2000e18; + uint256 internal constant AZTEC_SLASH_AMOUNT_MEDIUM = 2000e18; + uint256 internal constant AZTEC_SLASH_AMOUNT_LARGE = 2000e18; + + uint256 internal constant AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE = 500; + uint256 internal constant AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE = 500; + uint256 internal constant AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN = 1; + uint256 internal constant AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT = 400; + uint256 internal constant AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE = 4; + + uint16 internal constant REWARD_SEQUENCER_BPS = 7000; + uint96 internal constant REWARD_CHECKPOINT_REWARD = 500e18; + uint256 internal constant REWARDS_CLAIMABLE_TIMESTAMP = 0; + + // https://forum.aztec.network/t/last-resort-liveness-pricing-aztecs-escape-hatch/8427 + address internal constant ESCAPE_HATCH_BOND_TOKEN = MAINNET_STAKING_ASSET; + uint96 internal constant ESCAPE_HATCH_BOND_SIZE = 332_000_000e18; + uint96 internal constant ESCAPE_HATCH_WITHDRAWAL_TAX = 1_660_000e18; + uint96 internal constant ESCAPE_HATCH_FAILED_HATCH_PUNISHMENT = 9_600_000e18; + uint256 internal constant ESCAPE_HATCH_LAG_IN_EPOCHS_FOR_SET_SIZE = 2; + uint256 internal constant ESCAPE_HATCH_LAG_IN_EPOCHS_FOR_RANDAO = 1; + uint256 internal constant ESCAPE_HATCH_LAG_IN_HATCHES = 1; + uint256 internal constant ESCAPE_HATCH_FREQUENCY = 112; + uint256 internal constant ESCAPE_HATCH_ACTIVE_DURATION = 2; + uint256 internal constant ESCAPE_HATCH_PROPOSING_EXIT_DELAY = 2_592_000; // 30 days + + bytes32 internal constant EXPECTED_HONK_VERIFIER_CREATION_HASH = + 0x5bec8ab8249c56abdb5558db3a06d01fbd598d28872da479d4ec8a924428a7ee; + bytes32 internal constant EXPECTED_HONK_VERIFIER_RUNTIME_HASH = + 0x9a0aed515ad9e25d127fc25746b81a92701c2113f894f1122d87d32d98569e28; + + bytes32 internal constant STF_STORAGE_POSITION = keccak256("aztec.stf.storage"); + bytes32 internal constant STAKING_SLOT = keccak256("aztec.core.staking.storage"); + bytes32 internal constant VALIDATOR_SELECTION_STORAGE_POSITION = keccak256("aztec.validator_selection.storage"); + uint256 internal constant STF_VK_TREE_ROOT_SLOT_OFFSET = 3; + uint256 internal constant STF_PROTOCOL_CONTRACTS_HASH_SLOT_OFFSET = 4; + uint256 internal constant STF_EPOCH_PROOF_VERIFIER_SLOT_OFFSET = 7; + uint256 internal constant STAKING_QUEUE_CONFIG_SLOT_OFFSET = 4; + uint256 internal constant ESCAPE_HATCH_CHECKPOINTS_SLOT_OFFSET = 3; + uint256 internal constant MASK_32BIT = 0xFFFFFFFF; + + struct SimulationSnapshot { + address oldCanonicalRollup; + uint256 versions; + uint256 bonusCount; + uint256 oldEffectiveCount; + uint256 totalSupply; + uint256 bonusSupply; + uint256 oldEffectiveSupply; + Configuration governanceConfig; + uint256 fundsToMove; + uint256 oldRewarderBalance; + uint256 newRewarderBalance; + } + + function getExpectedRuntimeHash() external returns (bytes32) { + bytes32 val = _computeExpectedRuntimeHash(); + emit log_named_bytes32("Verifier code hash", val); + return val; + } + + function run() external { + _assertMainnet(); + _assertHardcodedAddresses(); + + GenesisState memory genesisState = _getGenesisState(); + RollupConfigInput memory config = _buildRollupConfiguration(IRewardDistributor(MAINNET_REWARD_DISTRIBUTOR)); + address deployer = vm.envAddress("DEPLOYER"); + + vm.startBroadcast(deployer); + + IVerifier verifier = IVerifier(address(new RollupVerifier())); + Rollup rollup = new Rollup( + IERC20(MAINNET_FEE_ASSET), + IERC20(MAINNET_STAKING_ASSET), + GSE(MAINNET_GSE), + verifier, + address(MAINNET_GOVERNANCE), + genesisState, + config + ); + IEscapeHatch escapeHatch = IEscapeHatch( + address( + new EscapeHatch( + address(rollup), + ESCAPE_HATCH_BOND_TOKEN, + ESCAPE_HATCH_BOND_SIZE, + ESCAPE_HATCH_WITHDRAWAL_TAX, + ESCAPE_HATCH_FAILED_HATCH_PUNISHMENT, + ESCAPE_HATCH_FREQUENCY, + ESCAPE_HATCH_ACTIVE_DURATION, + ESCAPE_HATCH_LAG_IN_HATCHES, + ESCAPE_HATCH_PROPOSING_EXIT_DELAY + ) + ) + ); + AlphaPayload payload = new AlphaPayload( + IRegistry(MAINNET_REGISTRY), IInstance(address(rollup)), FlushRewarder(MAINNET_OLD_FLUSH_REWARDER), escapeHatch + ); + + vm.stopBroadcast(); + + validate(payload); + _writeOutputJson(rollup, verifier, payload, escapeHatch); + + console.log("Payload address", address(payload)); + } + + function validate(AlphaPayload _payloadToValidate) public { + _assertMainnet(); + assertRollupConfiguration(_payloadToValidate); + simulateExecution(_payloadToValidate); + } + + function assertRollupConfiguration(AlphaPayload _payloadToValidate) public { + _assertMainnet(); + console.log("[assert] rollup configuration start"); + assertNotEq(address(_payloadToValidate), address(0), "payload is zero"); + + IInstance rollup = _payloadToValidate.ROLLUP(); + IRollup rollupCore = IRollup(address(rollup)); + _validateVerifierPinning(); + _validatePayloadImmutables(_payloadToValidate, rollup); + _validatePayloadActions(_payloadToValidate); + _validateEscapeHatchConfig(_payloadToValidate, rollup); + _validateRollupGetterConfig(rollup); + _validateRollupStorageConfig(rollupCore); + _validateStakingQueueConfig(rollupCore); + _validateSlasherStack(rollup); + console.log(unicode"[assert] rollup configuration ✓"); + } + + function simulateExecution(AlphaPayload _payloadToValidate) public { + _assertMainnet(); + console.log("[assert] simulate execution start"); + assertNotEq(address(_payloadToValidate), address(0), "payload is zero"); + + IRegistry registry = _payloadToValidate.REGISTRY(); + Governance governance = Governance(address(_payloadToValidate.GOVERNANCE())); + IInstance newRollup = _payloadToValidate.ROLLUP(); + FlushRewarder oldRewarder = _payloadToValidate.OLD_FLUSH_REWARDER(); + FlushRewarder newRewarder = _payloadToValidate.NEW_FLUSH_REWARDER(); + IERC20 rewardAsset = _payloadToValidate.REWARD_ASSET(); + IGSE gse = IGSE(address(newRollup.getGSE())); + Epoch currentEpoch = newRollup.getCurrentEpoch(); + + assertEq(address(newRollup.getEscapeHatch()), address(0), "sim pre escape hatch mismatch"); + assertEq(address(newRollup.getEscapeHatchForEpoch(currentEpoch)), address(0), "sim pre epoch escape hatch mismatch"); + assertEq(_getEscapeHatchCheckpointsLength(newRollup), 0, "sim pre escape hatch checkpoints mismatch"); + + SimulationSnapshot memory before = + _captureSimulationSnapshot(registry, governance, gse, oldRewarder, newRewarder, rewardAsset); + assertEq(before.oldCanonicalRollup, MAINNET_CANONICAL_ROLLUP, "sim pre canonical mismatch"); + assertEq(address(registry.getCanonicalRollup()), before.oldCanonicalRollup, "sim pre canonical drift"); + assertEq(gse.getLatestRollup(), before.oldCanonicalRollup, "sim pre latest mismatch"); + assertFalse(gse.isRollupRegistered(address(newRollup)), "sim pre rollup already in gse"); + + uint256 version = newRollup.getVersion(); + vm.expectRevert(); + registry.getRollup(version); + + uint256 snapshotId = vm.snapshotState(); + + _executePayloadThroughGovernance(_payloadToValidate, registry, governance, gse, before.oldCanonicalRollup); + + _assertSimulationPostState( + _payloadToValidate, registry, governance, gse, oldRewarder, newRewarder, rewardAsset, before + ); + + bool reverted = vm.revertToState(snapshotId); + if (!reverted) { + revert DeployAlpha__SnapshotRevertFailed(snapshotId); + } + console.log(unicode"[assert] simulate execution ✓"); + } + + function _assertMainnet() private view { + if (block.chainid != MAINNET_CHAIN_ID) { + revert DeployAlpha__NotMainnet(block.chainid); + } + } + + function _assertHardcodedAddresses() private view { + console.log("[assert] hardcoded addresses match start"); + IRegistry registry = IRegistry(MAINNET_REGISTRY); + IStaking canonicalRollup = IStaking(MAINNET_CANONICAL_ROLLUP); + IRollup canonicalRollupWithFees = IRollup(MAINNET_CANONICAL_ROLLUP); + + assertEq(registry.getGovernance(), MAINNET_GOVERNANCE, "governance mismatch"); + assertEq(address(registry.getCanonicalRollup()), MAINNET_CANONICAL_ROLLUP, "canonical rollup mismatch"); + assertEq(address(registry.getRewardDistributor()), MAINNET_REWARD_DISTRIBUTOR, "reward distributor mismatch"); + assertEq(address(canonicalRollup.getGSE()), MAINNET_GSE, "gse mismatch"); + assertEq(address(canonicalRollupWithFees.getFeeAsset()), MAINNET_FEE_ASSET, "fee asset mismatch"); + assertEq(address(canonicalRollup.getStakingAsset()), MAINNET_STAKING_ASSET, "staking asset mismatch"); + assertEq(address(FlushRewarder(MAINNET_OLD_FLUSH_REWARDER).REWARD_ASSET()), MAINNET_REWARD_TOKEN, "token mismatch"); + console.log(unicode"[assert] hardcoded addresses match ✓"); + } + + function _buildRollupConfiguration(IRewardDistributor rewardDistributor) + private + pure + returns (RollupConfigInput memory) + { + uint256 slashingRoundSize = AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS * AZTEC_EPOCH_DURATION; + + RollupConfigInput memory config = RollupConfigInput({ + aztecSlotDuration: AZTEC_SLOT_DURATION, + aztecEpochDuration: AZTEC_EPOCH_DURATION, + targetCommitteeSize: AZTEC_TARGET_COMMITTEE_SIZE, + lagInEpochsForValidatorSet: AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET, + lagInEpochsForRandao: AZTEC_LAG_IN_EPOCHS_FOR_RANDAO, + aztecProofSubmissionEpochs: AZTEC_PROOF_SUBMISSION_EPOCHS, + slashingQuorum: AZTEC_SLASHING_QUORUM, + slashingRoundSize: slashingRoundSize, + slashingLifetimeInRounds: AZTEC_SLASHING_LIFETIME_IN_ROUNDS, + slashingExecutionDelayInRounds: AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS, + slashAmounts: [AZTEC_SLASH_AMOUNT_SMALL, AZTEC_SLASH_AMOUNT_MEDIUM, AZTEC_SLASH_AMOUNT_LARGE], + slashingOffsetInRounds: AZTEC_SLASHING_OFFSET_IN_ROUNDS, + slasherFlavor: SlasherFlavor.TALLY, + slashingVetoer: AZTEC_SLASHING_VETOER, + slashingDisableDuration: AZTEC_SLASHING_DISABLE_DURATION, + manaTarget: AZTEC_MANA_TARGET, + exitDelaySeconds: AZTEC_EXIT_DELAY_SECONDS, + version: 0, + provingCostPerMana: EthValue.wrap(AZTEC_PROVING_COST_PER_MANA), + initialEthPerFeeAsset: EthPerFeeAssetE12.wrap(AZTEC_INITIAL_ETH_PER_FEE_ASSET), + rewardConfig: _getRewardConfiguration(rewardDistributor), + rewardBoostConfig: _getRewardBoostConfiguration(), + stakingQueueConfig: _getStakingQueueConfiguration(), + localEjectionThreshold: AZTEC_LOCAL_EJECTION_THRESHOLD, + earliestRewardsClaimableTimestamp: Timestamp.wrap(REWARDS_CLAIMABLE_TIMESTAMP), + inboxLag: AZTEC_INBOX_LAG + }); + + config.version = _computeConfigVersion(config, _getGenesisState()); + return config; + } + + function _getRewardConfiguration(IRewardDistributor rewardDistributor) private pure returns (RewardConfig memory) { + return RewardConfig({ + rewardDistributor: rewardDistributor, + sequencerBps: Bps.wrap(REWARD_SEQUENCER_BPS), + booster: IBoosterCore(address(0)), + checkpointReward: REWARD_CHECKPOINT_REWARD + }); + } + + function _getRewardBoostConfiguration() private pure returns (RewardBoostConfig memory) { + return RewardBoostConfig({increment: 125_000, maxScore: 15_000_000, a: 1000, minimum: 100_000, k: 1_000_000}); + } + + function _getStakingQueueConfiguration() private pure returns (StakingQueueConfig memory) { + return StakingQueueConfig({ + bootstrapValidatorSetSize: AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE, + bootstrapFlushSize: AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE, + normalFlushSizeMin: AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN, + normalFlushSizeQuotient: AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT, + maxQueueFlushSize: AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE + }); + } + + function _getGenesisState() private pure returns (GenesisState memory) { + return GenesisState({ + vkTreeRoot: MAINNET_VK_TREE_ROOT, + protocolContractsHash: MAINNET_PROTOCOL_CONTRACTS_HASH, + genesisArchiveRoot: MAINNET_GENESIS_ARCHIVE_ROOT + }); + } + + function _computeConfigVersion(RollupConfigInput memory config, GenesisState memory genesisState) + private + pure + returns (uint32) + { + bytes32 hash = keccak256(abi.encode(config, genesisState)); + return uint32(bytes4(hash)); + } + + function _computeExpectedRuntimeHash() private returns (bytes32) { + return address(new RollupVerifier()).codehash; + } + + function _validateVerifierPinning() private returns (bytes32 expectedRuntimeHash) { + console.log("[assert] verifier pinning start"); + assertEq( + keccak256(type(RollupVerifier).creationCode), + EXPECTED_HONK_VERIFIER_CREATION_HASH, + "bad verifier creation code hash" + ); + expectedRuntimeHash = _computeExpectedRuntimeHash(); + assertEq(expectedRuntimeHash, EXPECTED_HONK_VERIFIER_RUNTIME_HASH, "bad runtime hash constant"); + console.log(unicode"[assert] verifier pinning ✓"); + } + + function _validatePayloadImmutables(AlphaPayload _payloadToValidate, IInstance instance) private view { + console.log("[assert] payload immutables start"); + FlushRewarder oldRewarder = _payloadToValidate.OLD_FLUSH_REWARDER(); + FlushRewarder newRewarder = _payloadToValidate.NEW_FLUSH_REWARDER(); + IERC20 rewardAsset = _payloadToValidate.REWARD_ASSET(); + + assertEq(address(_payloadToValidate.REGISTRY()), MAINNET_REGISTRY, "payload registry mismatch"); + assertEq(address(_payloadToValidate.GOVERNANCE()), MAINNET_GOVERNANCE, "payload governance mismatch"); + assertEq(address(_payloadToValidate.ROLLUP()), address(instance), "payload rollup mismatch"); + assertNotEq(address(instance), MAINNET_CANONICAL_ROLLUP, "payload rollup already canonical"); + assertNotEq(address(_payloadToValidate.ESCAPE_HATCH()), address(0), "payload escape hatch missing"); + assertEq(address(oldRewarder), MAINNET_OLD_FLUSH_REWARDER, "payload old rewarder mismatch"); + assertEq(address(rewardAsset), MAINNET_REWARD_TOKEN, "payload reward asset mismatch"); + assertEq(address(oldRewarder.REWARD_ASSET()), MAINNET_REWARD_TOKEN, "old rewarder asset mismatch"); + assertEq(Ownable(address(oldRewarder)).owner(), MAINNET_GOVERNANCE, "old rewarder owner mismatch"); + assertEq(address(oldRewarder.ROLLUP()), MAINNET_CANONICAL_ROLLUP, "old rewarder rollup mismatch"); + + assertNotEq(address(newRewarder), address(oldRewarder), "rewarder alias mismatch"); + assertEq(Ownable(address(newRewarder)).owner(), MAINNET_GOVERNANCE, "new rewarder owner mismatch"); + assertEq(address(newRewarder.ROLLUP()), address(instance), "new rewarder rollup mismatch"); + assertEq(address(newRewarder.REWARD_ASSET()), address(oldRewarder.REWARD_ASSET()), "new rewarder asset mismatch"); + assertEq(newRewarder.rewardPerInsertion(), oldRewarder.rewardPerInsertion(), "new rewarder rate mismatch"); + assertEq(rewardAsset.balanceOf(address(newRewarder)), 0, "new rewarder unexpectedly funded"); + assertGt(bytes(_payloadToValidate.getURI()).length, 0, "payload uri empty"); + console.log(unicode"[assert] payload immutables ✓"); + } + + function _validatePayloadActions(AlphaPayload _payloadToValidate) private view { + console.log("[assert] payload actions start"); + IPayload.Action[] memory actions = _payloadToValidate.getActions(); + assertEq(actions.length, 6, "payload action count mismatch"); + + bytes memory expectedAddRegistry = + abi.encodeWithSelector(IRegistry.addRollup.selector, address(_payloadToValidate.ROLLUP())); + assertEq(actions[0].target, address(_payloadToValidate.REGISTRY()), "action0 target mismatch"); + assertEq(keccak256(actions[0].data), keccak256(expectedAddRegistry), "action0 data mismatch"); + + bytes memory expectedAddGse = + abi.encodeWithSelector(IGSECore.addRollup.selector, address(_payloadToValidate.ROLLUP())); + assertEq(actions[1].target, address(_payloadToValidate.ROLLUP().getGSE()), "action1 target mismatch"); + assertEq(keccak256(actions[1].data), keccak256(expectedAddGse), "action1 data mismatch"); + + Configuration memory config = _payloadToValidate.GOVERNANCE().getConfiguration(); + config.executionDelay = Timestamp.wrap(30 days); + bytes memory expectedConfig = abi.encodeWithSelector(IGovernance.updateConfiguration.selector, config); + bytes memory expectedSetRewardsClaimable = abi.encodeWithSelector(IRollupCore.setRewardsClaimable.selector, true); + assertEq(actions[2].target, address(_payloadToValidate.ROLLUP()), "action2 target mismatch"); + assertEq(keccak256(actions[2].data), keccak256(expectedSetRewardsClaimable), "action2 data mismatch"); + + bytes memory expectedUpdateEscapeHatch = abi.encodeWithSelector( + IValidatorSelectionCore.updateEscapeHatch.selector, address(_payloadToValidate.ESCAPE_HATCH()) + ); + assertEq(actions[3].target, address(_payloadToValidate.ROLLUP()), "action3 target mismatch"); + assertEq(keccak256(actions[3].data), keccak256(expectedUpdateEscapeHatch), "action3 data mismatch"); + + bytes memory expectedRecover = abi.encodeWithSelector( + FlushRewarder.recover.selector, + address(_payloadToValidate.REWARD_ASSET()), + address(_payloadToValidate.NEW_FLUSH_REWARDER()), + _payloadToValidate.OLD_FLUSH_REWARDER().rewardsAvailable() + ); + assertEq(actions[4].target, address(_payloadToValidate.OLD_FLUSH_REWARDER()), "action4 target mismatch"); + assertEq(keccak256(actions[4].data), keccak256(expectedRecover), "action4 data mismatch"); + + assertEq(actions[5].target, address(_payloadToValidate.GOVERNANCE()), "action5 target mismatch"); + assertEq(keccak256(actions[5].data), keccak256(expectedConfig), "action5 data mismatch"); + console.log(unicode"[assert] payload actions ✓"); + } + + function _validateEscapeHatchConfig(AlphaPayload _payloadToValidate, IInstance instance) private view { + console.log("[assert] escape hatch config start"); + EscapeHatch escapeHatch = EscapeHatch(address(_payloadToValidate.ESCAPE_HATCH())); + + assertEq(escapeHatch.getRollup(), address(instance), "escape hatch rollup mismatch"); + assertEq(escapeHatch.getBondToken(), ESCAPE_HATCH_BOND_TOKEN, "escape hatch bond token mismatch"); + assertEq(escapeHatch.getBondSize(), ESCAPE_HATCH_BOND_SIZE, "escape hatch bond size mismatch"); + assertEq(escapeHatch.getWithdrawalTax(), ESCAPE_HATCH_WITHDRAWAL_TAX, "escape hatch withdrawal tax mismatch"); + assertEq( + escapeHatch.getFailedHatchPunishment(), + ESCAPE_HATCH_FAILED_HATCH_PUNISHMENT, + "escape hatch failed punishment mismatch" + ); + assertEq(escapeHatch.getFrequency(), ESCAPE_HATCH_FREQUENCY, "escape hatch frequency mismatch"); + assertEq(escapeHatch.getActiveDuration(), ESCAPE_HATCH_ACTIVE_DURATION, "escape hatch active duration mismatch"); + assertEq(escapeHatch.getLagInHatches(), ESCAPE_HATCH_LAG_IN_HATCHES, "escape hatch lag in hatches mismatch"); + assertEq( + escapeHatch.getProposingExitDelay(), + ESCAPE_HATCH_PROPOSING_EXIT_DELAY, + "escape hatch proposing exit delay mismatch" + ); + assertEq( + escapeHatch.LAG_IN_EPOCHS_FOR_SET_SIZE(), + ESCAPE_HATCH_LAG_IN_EPOCHS_FOR_SET_SIZE, + "escape hatch lag in epochs for set size mismatch" + ); + assertEq( + escapeHatch.LAG_IN_EPOCHS_FOR_RANDAO(), + ESCAPE_HATCH_LAG_IN_EPOCHS_FOR_RANDAO, + "escape hatch lag in epochs for randao mismatch" + ); + assertEq(escapeHatch.getCandidateCount(), 0, "escape hatch candidate count mismatch"); + console.log(unicode"[assert] escape hatch config ✓"); + } + + function _validateRollupGetterConfig(IInstance rollup) private view { + console.log("[assert] rollup getter config start"); + IRollup rollupCore = IRollup(address(rollup)); + RollupConfigInput memory expectedConfig = _buildRollupConfiguration(IRewardDistributor(MAINNET_REWARD_DISTRIBUTOR)); + RewardConfig memory rewardConfig = rollupCore.getRewardConfig(); + assertNotEq(address(rewardConfig.booster), address(0), "booster missing"); + IBooster booster = IBooster(address(rewardConfig.booster)); + RewardBoostConfig memory boostConfig = booster.getConfig(); + + assertEq(Ownable(address(rollup)).owner(), MAINNET_GOVERNANCE, "rollup owner mismatch"); + assertEq(address(rollupCore.getFeeAsset()), MAINNET_FEE_ASSET, "rollup fee asset mismatch"); + assertEq(address(rollup.getStakingAsset()), MAINNET_STAKING_ASSET, "rollup staking asset mismatch"); + assertEq(rollup.getActivationThreshold(), AZTEC_ACTIVATION_THRESHOLD, "activation threshold mismatch"); + assertEq(rollup.getEjectionThreshold(), AZTEC_EJECTION_THRESHOLD, "ejection threshold mismatch"); + assertEq(address(rollup.getGSE()), MAINNET_GSE, "rollup gse mismatch"); + assertEq(address(rollupCore.getRewardDistributor()), MAINNET_REWARD_DISTRIBUTOR, "rollup distributor mismatch"); + assertEq(rollup.getSlotDuration(), AZTEC_SLOT_DURATION, "slot duration mismatch"); + assertEq(rollup.getEpochDuration(), AZTEC_EPOCH_DURATION, "epoch duration mismatch"); + assertEq(rollupCore.getProofSubmissionEpochs(), AZTEC_PROOF_SUBMISSION_EPOCHS, "proof epochs mismatch"); + assertEq(rollup.getTargetCommitteeSize(), AZTEC_TARGET_COMMITTEE_SIZE, "committee size mismatch"); + assertEq(rollup.getLagInEpochsForValidatorSet(), AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET, "validator lag mismatch"); + assertEq(rollup.getLagInEpochsForRandao(), AZTEC_LAG_IN_EPOCHS_FOR_RANDAO, "randao lag mismatch"); + assertEq(rollupCore.getManaTarget(), AZTEC_MANA_TARGET, "mana target mismatch"); + assertEq( + EthValue.unwrap(rollupCore.getProvingCostPerManaInEth()), AZTEC_PROVING_COST_PER_MANA, "proving cost mismatch" + ); + assertEq( + EthPerFeeAssetE12.unwrap(rollupCore.getEthPerFeeAsset()), AZTEC_INITIAL_ETH_PER_FEE_ASSET, "eth per fee mismatch" + ); + assertEq(Timestamp.unwrap(rollup.getExitDelay()), AZTEC_EXIT_DELAY_SECONDS, "exit delay mismatch"); + assertEq(rollup.getLocalEjectionThreshold(), AZTEC_LOCAL_EJECTION_THRESHOLD, "ejection threshold mismatch"); + assertEq(address(rewardConfig.rewardDistributor), MAINNET_REWARD_DISTRIBUTOR, "reward distributor config mismatch"); + assertEq(Bps.unwrap(rewardConfig.sequencerBps), REWARD_SEQUENCER_BPS, "sequencer bps mismatch"); + assertEq(rewardConfig.checkpointReward, REWARD_CHECKPOINT_REWARD, "checkpoint reward mismatch"); + assertEq(boostConfig.increment, 125_000, "boost increment mismatch"); + assertEq(boostConfig.maxScore, 15_000_000, "boost max score mismatch"); + assertEq(boostConfig.a, 1000, "boost a mismatch"); + assertEq(boostConfig.minimum, 100_000, "boost minimum mismatch"); + assertEq(boostConfig.k, 1_000_000, "boost k mismatch"); + assertEq( + Timestamp.unwrap(rollupCore.getEarliestRewardsClaimableTimestamp()), + REWARDS_CLAIMABLE_TIMESTAMP, + "earliest reward mismatch" + ); + assertFalse(rollupCore.isRewardsClaimable(), "rewards unexpectedly claimable before payload execution"); + assertEq(Inbox(address(rollupCore.getInbox())).LAG(), AZTEC_INBOX_LAG, "inbox lag mismatch"); + assertNotEq(address(rollupCore.getInbox()), address(0), "inbox missing"); + assertNotEq(address(rollupCore.getOutbox()), address(0), "outbox missing"); + assertEq(Inbox(address(rollupCore.getInbox())).ROLLUP(), address(rollup), "inbox rollup mismatch"); + assertEq(Inbox(address(rollupCore.getInbox())).VERSION(), expectedConfig.version, "inbox version mismatch"); + assertEq( + Inbox(address(rollupCore.getInbox())).FEE_ASSET_PORTAL(), + address(rollupCore.getFeeAssetPortal()), + "portal mismatch" + ); + assertEq(address(Outbox(address(rollupCore.getOutbox())).ROLLUP()), address(rollup), "outbox rollup mismatch"); + assertEq(Outbox(address(rollupCore.getOutbox())).VERSION(), expectedConfig.version, "outbox version mismatch"); + assertEq(rollupCore.getVersion(), expectedConfig.version, "rollup version mismatch"); + assertEq(rollupCore.archiveAt(0), MAINNET_GENESIS_ARCHIVE_ROOT, "genesis archive mismatch"); + assertEq(rollupCore.getBurnAddress(), address(bytes20("CUAUHXICALLI")), "burn address mismatch"); + assertFalse(rollup.getIsBootstrapped(), "rollup bootstrapped unexpectedly"); + console.log(unicode"[assert] rollup getter config ✓"); + } + + function _validateRollupStorageConfig(IRollup rollup) private view { + console.log("[assert] rollup storage config start"); + uint256 stfBase = uint256(STF_STORAGE_POSITION); + bytes32 vkTreeRootSlot = vm.load(address(rollup), bytes32(stfBase + STF_VK_TREE_ROOT_SLOT_OFFSET)); + bytes32 protocolContractsHashSlot = + vm.load(address(rollup), bytes32(stfBase + STF_PROTOCOL_CONTRACTS_HASH_SLOT_OFFSET)); + bytes32 verifierSlot = vm.load(address(rollup), bytes32(stfBase + STF_EPOCH_PROOF_VERIFIER_SLOT_OFFSET)); + address verifierAddress = address(uint160(uint256(verifierSlot))); + + assertEq(vkTreeRootSlot, MAINNET_VK_TREE_ROOT, "vk tree root mismatch"); + assertEq(protocolContractsHashSlot, MAINNET_PROTOCOL_CONTRACTS_HASH, "protocol contracts hash mismatch"); + assertNotEq(verifierAddress, address(0), "verifier address missing"); + assertEq(verifierAddress.codehash, EXPECTED_HONK_VERIFIER_RUNTIME_HASH, "verifier runtime mismatch"); + console.log(unicode"[assert] rollup storage config ✓"); + } + + function _validateStakingQueueConfig(IRollup rollup) private view { + console.log("[assert] staking queue config start"); + uint256 stakingBase = uint256(STAKING_SLOT); + uint256 packed = uint256(vm.load(address(rollup), bytes32(stakingBase + STAKING_QUEUE_CONFIG_SLOT_OFFSET))); + uint256 bootstrapValidatorSetSize = (packed >> 128) & MASK_32BIT; + uint256 bootstrapFlushSize = (packed >> 96) & MASK_32BIT; + uint256 normalFlushSizeMin = (packed >> 64) & MASK_32BIT; + uint256 normalFlushSizeQuotient = (packed >> 32) & MASK_32BIT; + uint256 maxQueueFlushSize = packed & MASK_32BIT; + + assertEq( + bootstrapValidatorSetSize, AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE, "queue bootstrap validator mismatch" + ); + assertEq(bootstrapFlushSize, AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE, "queue bootstrap flush mismatch"); + assertEq(normalFlushSizeMin, AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN, "queue normal min mismatch"); + assertEq(normalFlushSizeQuotient, AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT, "queue normal quotient mismatch"); + assertEq(maxQueueFlushSize, AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE, "queue max flush mismatch"); + console.log(unicode"[assert] staking queue config ✓"); + } + + function _getEscapeHatchCheckpointsLength(IInstance instance) private view returns (uint256) { + uint256 validatorSelectionBase = uint256(VALIDATOR_SELECTION_STORAGE_POSITION); + bytes32 len = vm.load(address(instance), bytes32(validatorSelectionBase + ESCAPE_HATCH_CHECKPOINTS_SLOT_OFFSET)); + return uint256(len); + } + + function _validateSlasherStack(IInstance instance) private view { + console.log("[assert] slasher stack start"); + address slasherAddress = instance.getSlasher(); + Slasher slasher = Slasher(slasherAddress); + address proposerAddress = slasher.PROPOSER(); + TallySlashingProposer proposer = TallySlashingProposer(proposerAddress); + + assertNotEq(slasherAddress, address(0), "slasher missing"); + assertEq(slasher.GOVERNANCE(), MAINNET_GOVERNANCE, "slasher governance mismatch"); + assertEq(slasher.VETOER(), AZTEC_SLASHING_VETOER, "slasher vetoer mismatch"); + assertEq(slasher.SLASHING_DISABLE_DURATION(), AZTEC_SLASHING_DISABLE_DURATION, "slasher disable mismatch"); + assertNotEq(proposerAddress, address(0), "slasher proposer missing"); + assertEq(uint256(proposer.SLASHING_PROPOSER_TYPE()), uint256(SlasherFlavor.TALLY), "slasher flavor mismatch"); + assertEq(proposer.INSTANCE(), address(instance), "proposer instance mismatch"); + assertEq(address(proposer.SLASHER()), slasherAddress, "proposer slasher mismatch"); + assertEq(proposer.QUORUM(), AZTEC_SLASHING_QUORUM, "proposer quorum mismatch"); + assertEq( + proposer.ROUND_SIZE(), AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS * AZTEC_EPOCH_DURATION, "proposer round mismatch" + ); + assertEq(proposer.ROUND_SIZE_IN_EPOCHS(), AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS, "proposer epoch round mismatch"); + assertEq(proposer.LIFETIME_IN_ROUNDS(), AZTEC_SLASHING_LIFETIME_IN_ROUNDS, "proposer lifetime mismatch"); + assertEq( + proposer.EXECUTION_DELAY_IN_ROUNDS(), + AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS, + "proposer execution delay mismatch" + ); + assertEq(proposer.SLASH_OFFSET_IN_ROUNDS(), AZTEC_SLASHING_OFFSET_IN_ROUNDS, "proposer slash offset mismatch"); + assertEq(proposer.SLASH_AMOUNT_SMALL(), AZTEC_SLASH_AMOUNT_SMALL, "proposer slash small mismatch"); + assertEq(proposer.SLASH_AMOUNT_MEDIUM(), AZTEC_SLASH_AMOUNT_MEDIUM, "proposer slash medium mismatch"); + assertEq(proposer.SLASH_AMOUNT_LARGE(), AZTEC_SLASH_AMOUNT_LARGE, "proposer slash large mismatch"); + assertEq(proposer.COMMITTEE_SIZE(), AZTEC_TARGET_COMMITTEE_SIZE, "proposer committee size mismatch"); + console.log(unicode"[assert] slasher stack ✓"); + } + + function _captureSimulationSnapshot( + IRegistry registry, + IGovernance governance, + IGSE gse, + FlushRewarder oldRewarder, + FlushRewarder newRewarder, + IERC20 rewardAsset + ) private view returns (SimulationSnapshot memory snap) { + Timestamp ts = Timestamp.wrap(block.timestamp); + address oldCanonicalRollup = address(registry.getCanonicalRollup()); + address bonusInstance = gse.getBonusInstanceAddress(); + + snap.oldCanonicalRollup = oldCanonicalRollup; + snap.versions = registry.numberOfVersions(); + snap.bonusCount = gse.getAttesterCountAtTime(bonusInstance, ts); + snap.oldEffectiveCount = gse.getAttesterCountAtTime(oldCanonicalRollup, ts); + snap.totalSupply = gse.totalSupply(); + snap.bonusSupply = gse.supplyOf(bonusInstance); + snap.oldEffectiveSupply = gse.supplyOf(oldCanonicalRollup) + snap.bonusSupply; + snap.governanceConfig = governance.getConfiguration(); + snap.fundsToMove = oldRewarder.rewardsAvailable(); + snap.oldRewarderBalance = rewardAsset.balanceOf(address(oldRewarder)); + snap.newRewarderBalance = rewardAsset.balanceOf(address(newRewarder)); + } + + function _validateGsePayloadWrapper(AlphaPayload payload, GSEPayload gsePayload) private view { + IPayload.Action[] memory payloadActions = payload.getActions(); + IPayload.Action[] memory wrappedActions = gsePayload.getActions(); + assertEq(wrappedActions.length, payloadActions.length + 1, "sim wrapped action count mismatch"); + + for (uint256 i = 0; i < payloadActions.length; i++) { + assertEq(wrappedActions[i].target, payloadActions[i].target, "sim wrapped target mismatch"); + assertEq(keccak256(wrappedActions[i].data), keccak256(payloadActions[i].data), "sim wrapped data mismatch"); + } + + uint256 terminalIndex = wrappedActions.length - 1; + assertEq(wrappedActions[terminalIndex].target, address(gsePayload), "sim wrapped terminal target mismatch"); + assertEq( + keccak256(wrappedActions[terminalIndex].data), + keccak256(abi.encodeWithSelector(GSEPayload.amIValid.selector)), + "sim wrapped terminal data mismatch" + ); + } + + function _executePayloadThroughGovernance( + AlphaPayload payload, + IRegistry registry, + Governance governance, + IGSE gse, + address oldCanonicalRollup + ) private { + GSEPayload gsePayload = new GSEPayload(IPayload(address(payload)), gse, registry); + _validateGsePayloadWrapper(payload, gsePayload); + + vm.prank(governance.governanceProposer()); + uint256 proposalId = governance.propose(IPayload(address(gsePayload))); + + Proposal memory proposal = governance.getProposal(proposalId); + assertEq( + uint256(governance.getProposalState(proposalId)), uint256(ProposalState.Pending), "sim proposal not pending" + ); + assertEq(proposal.proposer, governance.governanceProposer(), "sim proposal proposer mismatch"); + assertEq(address(proposal.payload), address(gsePayload), "sim proposal payload mismatch"); + assertEq( + address(GSEPayload(address(proposal.payload)).getOriginalPayload()), + address(payload), + "sim proposal original mismatch" + ); + + Timestamp pendingThrough = _pendingThrough(proposal); + Timestamp activeThrough = _activeThrough(proposal); + Timestamp queuedThrough = _queuedThrough(proposal); + + vm.warp(Timestamp.unwrap(pendingThrough) + 1); + assertEq(uint256(governance.getProposalState(proposalId)), uint256(ProposalState.Active), "sim proposal not active"); + + uint256 oldRollupVoteAmount = gse.getVotingPowerAt(oldCanonicalRollup, pendingThrough); + if (oldRollupVoteAmount > 0) { + vm.prank(oldCanonicalRollup); + gse.vote(proposalId, oldRollupVoteAmount, true); + } + + uint256 bonusVoteAmount = gse.getVotingPowerAt(gse.getBonusInstanceAddress(), pendingThrough); + if (bonusVoteAmount > 0) { + vm.prank(oldCanonicalRollup); + gse.voteWithBonus(proposalId, bonusVoteAmount, true); + } + + vm.warp(Timestamp.unwrap(activeThrough) + 1); + assertEq(uint256(governance.getProposalState(proposalId)), uint256(ProposalState.Queued), "sim proposal not queued"); + + vm.warp(Timestamp.unwrap(queuedThrough) + 1); + assertEq( + uint256(governance.getProposalState(proposalId)), uint256(ProposalState.Executable), "sim proposal not executable" + ); + + governance.execute(proposalId); + assertEq( + uint256(governance.getProposalState(proposalId)), uint256(ProposalState.Executed), "sim proposal not executed" + ); + } + + function _assertSimulationPostState( + AlphaPayload payload, + IRegistry registry, + IGovernance governance, + IGSE gse, + FlushRewarder oldRewarder, + FlushRewarder newRewarder, + IERC20 rewardAsset, + SimulationSnapshot memory before + ) private view { + console.log("[assert] post execution state start"); + assertNotEq(before.oldCanonicalRollup, address(payload.ROLLUP()), "sim old/new rollup alias"); + assertEq(address(registry.getCanonicalRollup()), address(payload.ROLLUP()), "sim canonical mismatch"); + assertNotEq(address(registry.getCanonicalRollup()), before.oldCanonicalRollup, "sim canonical unchanged"); + assertEq(gse.getLatestRollup(), address(registry.getCanonicalRollup()), "sim canonical/latest mismatch"); + + { + uint256 versionsAfter = registry.numberOfVersions(); + assertEq(versionsAfter, before.versions + 1, "sim versions mismatch"); + + uint256 newVersion = payload.ROLLUP().getVersion(); + assertEq(registry.getVersion(before.versions), newVersion, "sim latest version mismatch"); + assertEq(address(registry.getRollup(newVersion)), address(payload.ROLLUP()), "sim version mapping mismatch"); + } + + assertEq(gse.getLatestRollup(), address(payload.ROLLUP()), "sim gse latest mismatch"); + assertTrue(gse.isRollupRegistered(before.oldCanonicalRollup), "sim old gse rollup missing"); + assertTrue(gse.isRollupRegistered(address(payload.ROLLUP())), "sim new gse rollup missing"); + assertTrue(IRollup(address(payload.ROLLUP())).isRewardsClaimable(), "sim rewards not claimable"); + _assertEscapeHatchPostState(payload); + + _assertGseFollowerStateAfterSimulation(payload, gse, before); + + _assertGovernanceConfigurationAfterSimulation(before.governanceConfig, governance.getConfiguration()); + _assertRewardMigrationAfterSimulation(oldRewarder, newRewarder, rewardAsset, before); + console.log(unicode"[assert] post execution state ✓"); + } + + function _assertEscapeHatchPostState(AlphaPayload payload) private view { + assertEq(address(payload.ROLLUP().getEscapeHatch()), address(payload.ESCAPE_HATCH()), "sim escape hatch mismatch"); + + Epoch executionEpoch = payload.ROLLUP().getCurrentEpoch(); + assertEq( + address(payload.ROLLUP().getEscapeHatchForEpoch(executionEpoch)), + address(0), + "sim current epoch escape hatch mismatch" + ); + + Epoch nextEpoch = Epoch.wrap(Epoch.unwrap(executionEpoch) + 1); + assertEq( + address(payload.ROLLUP().getEscapeHatchForEpoch(nextEpoch)), + address(payload.ESCAPE_HATCH()), + "sim next epoch escape hatch mismatch" + ); + assertEq(_getEscapeHatchCheckpointsLength(payload.ROLLUP()), 1, "sim escape hatch checkpoints mismatch"); + } + + function _assertGseFollowerStateAfterSimulation(AlphaPayload payload, IGSE gse, SimulationSnapshot memory before) + private + view + { + address bonusInstance = gse.getBonusInstanceAddress(); + Timestamp postTs = Timestamp.wrap(block.timestamp); + uint256 bonusAfter = gse.getAttesterCountAtTime(bonusInstance, postTs); + uint256 oldEffectiveAfter = gse.getAttesterCountAtTime(before.oldCanonicalRollup, postTs); + uint256 newEffectiveAfter = gse.getAttesterCountAtTime(address(payload.ROLLUP()), postTs); + uint256 totalSupplyAfter = gse.totalSupply(); + uint256 bonusSupplyAfter = gse.supplyOf(bonusInstance); + uint256 oldSupplyAfter = gse.supplyOf(before.oldCanonicalRollup); + uint256 newSupplyAfter = gse.supplyOf(address(payload.ROLLUP())); + uint256 newEffectiveSupplyAfter = newSupplyAfter + bonusSupplyAfter; + + assertEq(newEffectiveAfter, bonusAfter, "sim new effective mismatch"); + assertEq(bonusAfter, before.bonusCount, "sim bonus count mismatch"); + assertEq(before.oldEffectiveCount, oldEffectiveAfter + before.bonusCount, "sim old effective mismatch"); + assertEq(totalSupplyAfter, before.totalSupply, "sim total supply mismatch"); + assertEq(bonusSupplyAfter, before.bonusSupply, "sim bonus supply mismatch"); + assertEq(before.oldEffectiveSupply, oldSupplyAfter + before.bonusSupply, "sim old effective supply mismatch"); + assertEq(newSupplyAfter, 0, "sim new direct supply mismatch"); + assertEq(newEffectiveSupplyAfter, before.bonusSupply, "sim new effective supply mismatch"); + assertGt(newEffectiveSupplyAfter, totalSupplyAfter * 2 / 3, "sim effective supply <= 2/3"); + } + + function _pendingThrough(Proposal memory proposal) private pure returns (Timestamp) { + return Timestamp.wrap(Timestamp.unwrap(proposal.creation) + Timestamp.unwrap(proposal.config.votingDelay)); + } + + function _activeThrough(Proposal memory proposal) private pure returns (Timestamp) { + return + Timestamp.wrap(Timestamp.unwrap(_pendingThrough(proposal)) + Timestamp.unwrap(proposal.config.votingDuration)); + } + + function _queuedThrough(Proposal memory proposal) private pure returns (Timestamp) { + return Timestamp.wrap(Timestamp.unwrap(_activeThrough(proposal)) + Timestamp.unwrap(proposal.config.executionDelay)); + } + + function _assertGovernanceConfigurationAfterSimulation( + Configuration memory beforeConfig, + Configuration memory afterConfig + ) private pure { + console.log("[assert] governance config after simulation start"); + assertEq(Timestamp.unwrap(afterConfig.executionDelay), 30 days, "sim execution delay mismatch"); + assertEq( + Timestamp.unwrap(beforeConfig.votingDelay), Timestamp.unwrap(afterConfig.votingDelay), "sim voting delay mismatch" + ); + assertEq( + Timestamp.unwrap(beforeConfig.votingDuration), + Timestamp.unwrap(afterConfig.votingDuration), + "sim voting duration mismatch" + ); + assertEq( + Timestamp.unwrap(beforeConfig.gracePeriod), Timestamp.unwrap(afterConfig.gracePeriod), "sim grace mismatch" + ); + assertEq(beforeConfig.quorum, afterConfig.quorum, "sim quorum mismatch"); + assertEq(beforeConfig.requiredYeaMargin, afterConfig.requiredYeaMargin, "sim yea margin mismatch"); + assertEq(beforeConfig.minimumVotes, afterConfig.minimumVotes, "sim minimum votes mismatch"); + assertEq( + Timestamp.unwrap(beforeConfig.proposeConfig.lockDelay), + Timestamp.unwrap(afterConfig.proposeConfig.lockDelay), + "sim lock delay mismatch" + ); + assertEq(beforeConfig.proposeConfig.lockAmount, afterConfig.proposeConfig.lockAmount, "sim lock amount mismatch"); + console.log(unicode"[assert] governance config after simulation ✓"); + } + + function _assertRewardMigrationAfterSimulation( + FlushRewarder oldRewarder, + FlushRewarder newRewarder, + IERC20 rewardAsset, + SimulationSnapshot memory before + ) private view { + console.log("[assert] reward migration after simulation start"); + uint256 oldRewarderBalanceAfter = rewardAsset.balanceOf(address(oldRewarder)); + uint256 newRewarderBalanceAfter = rewardAsset.balanceOf(address(newRewarder)); + + assertNotEq(address(oldRewarder), address(newRewarder), "sim rewarder alias mismatch"); + assertEq(Ownable(address(oldRewarder)).owner(), MAINNET_GOVERNANCE, "sim old rewarder owner mismatch"); + assertEq(Ownable(address(newRewarder)).owner(), MAINNET_GOVERNANCE, "sim new rewarder owner mismatch"); + assertEq( + oldRewarderBalanceAfter, before.oldRewarderBalance - before.fundsToMove, "sim old rewarder balance mismatch" + ); + assertEq( + newRewarderBalanceAfter, before.newRewarderBalance + before.fundsToMove, "sim new rewarder balance mismatch" + ); + assertEq(oldRewarder.rewardsAvailable(), 0, "sim old rewardsAvailable mismatch"); + assertEq(newRewarder.rewardsAvailable(), before.fundsToMove, "sim new rewardsAvailable mismatch"); + assertEq(newRewarder.rewardPerInsertion(), oldRewarder.rewardPerInsertion(), "sim reward rate mismatch"); + console.log(unicode"[assert] reward migration after simulation ✓"); + } + + function _writeOutputJson(Rollup rollup, IVerifier verifier, AlphaPayload payload, IEscapeHatch escapeHatch) private { + string memory key = "alpha"; + vm.serializeAddress(key, "rollupAddress", address(rollup)); + vm.serializeAddress(key, "verifierAddress", address(verifier)); + vm.serializeAddress(key, "payloadAddress", address(payload)); + vm.serializeAddress(key, "newFlushRewarderAddress", address(payload.NEW_FLUSH_REWARDER())); + vm.serializeAddress(key, "escapeHatchAddress", address(escapeHatch)); + vm.serializeAddress(key, "oldFlushRewarderAddress", MAINNET_OLD_FLUSH_REWARDER); + vm.serializeAddress(key, "registryAddress", MAINNET_REGISTRY); + string memory finalJson = vm.serializeAddress(key, "governanceAddress", MAINNET_GOVERNANCE); + console.log("JSON DEPLOY RESULT:", finalJson); + } +} diff --git a/l1-contracts/script/deploy/DeploymentConfiguration.sol b/l1-contracts/script/deploy/DeploymentConfiguration.sol index 1d27ac7aa72f..1a40c72aac4e 100644 --- a/l1-contracts/script/deploy/DeploymentConfiguration.sol +++ b/l1-contracts/script/deploy/DeploymentConfiguration.sol @@ -143,7 +143,7 @@ contract DeploymentConfiguration is IDeploymentConfiguration, Test { }), votingDelay: Timestamp.wrap(3 * 24 * 60 * 60), votingDuration: Timestamp.wrap(7 * 24 * 60 * 60), - executionDelay: Timestamp.wrap(7 * 24 * 60 * 60), + executionDelay: Timestamp.wrap(30 * 24 * 60 * 60), gracePeriod: Timestamp.wrap(7 * 24 * 60 * 60), quorum: 0.2e18, requiredYeaMargin: 0.33e18, diff --git a/l1-contracts/script/deploy/RollupConfiguration.sol b/l1-contracts/script/deploy/RollupConfiguration.sol index ed58853bef49..1ea7bdb1e452 100644 --- a/l1-contracts/script/deploy/RollupConfiguration.sol +++ b/l1-contracts/script/deploy/RollupConfiguration.sol @@ -71,7 +71,7 @@ contract RollupConfiguration is IRollupConfiguration, Test { uint16 sequencerBps; uint96 checkpointReward; sequencerBps = 7000; - checkpointReward = 400e18; + checkpointReward = 500e18; return RewardConfig({ rewardDistributor: _rewardDistributor, diff --git a/l1-contracts/scripts/run_alpha_upgrade.sh b/l1-contracts/scripts/run_alpha_upgrade.sh new file mode 100755 index 000000000000..2a6f4947db28 --- /dev/null +++ b/l1-contracts/scripts/run_alpha_upgrade.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Deploy the static mainnet alpha rollup + AlphaPayload bundle. +# +# Required environment variables: +# L1_RPC_URL +# ROLLUP_DEPLOYMENT_PRIVATE_KEY +# DEPLOYER +# ETHERSCAN_API_KEY + +cd "$(dirname "$0")/.." + +: "${L1_RPC_URL:?L1_RPC_URL is required}" +: "${ROLLUP_DEPLOYMENT_PRIVATE_KEY:?ROLLUP_DEPLOYMENT_PRIVATE_KEY is required}" +: "${DEPLOYER:?DEPLOYER is required}" +: "${ETHERSCAN_API_KEY:?ETHERSCAN_API_KEY is required for source verification}" + +echo "=== Deploying static mainnet alpha rollup + payload ===" + +forge script DeployAlpha \ + --rpc-url "$L1_RPC_URL" \ + --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ + --etherscan-api-key "$ETHERSCAN_API_KEY" \ + --verify \ + --broadcast \ + --slow \ + -vvv diff --git a/l1-contracts/src/alpha/AlphaPayload.sol b/l1-contracts/src/alpha/AlphaPayload.sol new file mode 100644 index 000000000000..edb1c4651f05 --- /dev/null +++ b/l1-contracts/src/alpha/AlphaPayload.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.8.27; + +import {IEscapeHatch} from "@aztec/core/interfaces/IEscapeHatch.sol"; +import {IInstance} from "@aztec/core/interfaces/IInstance.sol"; +import {IRollupCore} from "@aztec/core/interfaces/IRollup.sol"; +import {IValidatorSelectionCore} from "@aztec/core/interfaces/IValidatorSelection.sol"; +import {IGovernance, Configuration} from "@aztec/governance/Governance.sol"; +import {IGSECore} from "@aztec/governance/GSE.sol"; +import {IPayload} from "@aztec/governance/interfaces/IPayload.sol"; +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; +import {FlushRewarder} from "@aztec/periphery/FlushRewarder.sol"; +import {Timestamp} from "@aztec/shared/libraries/TimeMath.sol"; +import {IERC20} from "@oz/token/ERC20/IERC20.sol"; + +/** + * @title AlphaPayload + * @notice Governance payload for the alpha rollup cutover. + * @dev The payload performs six actions in order: + * 1. Register the new rollup in the Registry (making it canonical). + * 2. Register the new rollup in the GSE so following stakers are moved. + * 3. Enable rewards claiming on the new rollup. + * 4. Update the rollup escape hatch to the newly deployed escape hatch contract. + * 5. Move currently claimable rewards from the old flush rewarder to the new flush rewarder. + * 6. Update Governance configuration so `executionDelay` is set to 30 days. + * + * The new flush rewarder is deployed in the constructor and mirrors the old rewarder's + * reward asset and reward-per-insertion settings. + */ +contract AlphaPayload is IPayload { + /// @notice Registry where the new rollup version is added. + IRegistry public immutable REGISTRY; + + /// @notice Governance contract controlling execution of this payload. + IGovernance public immutable GOVERNANCE; + + /// @notice New rollup instance to register and promote. + IInstance public immutable ROLLUP; + + /// @notice Reward token used by both old and new flush rewarders. + IERC20 public immutable REWARD_ASSET; + + /// @notice Existing flush rewarder holding rewards to migrate. + FlushRewarder public immutable OLD_FLUSH_REWARDER; + + /// @notice Newly deployed flush rewarder for the new rollup. + FlushRewarder public immutable NEW_FLUSH_REWARDER; + + /// @notice Newly deployed escape hatch contract for the new rollup. + IEscapeHatch public immutable ESCAPE_HATCH; + + /** + * @notice Constructs the alpha governance payload. + * @param _registry Registry containing canonical rollup and governance addresses. + * @param _rollup New rollup instance to register. + * @param _oldFlushRewarder Existing rewarder from which rewards are recovered. + * @param _escapeHatch Escape hatch contract to be activated on the new rollup. + */ + constructor(IRegistry _registry, IInstance _rollup, FlushRewarder _oldFlushRewarder, IEscapeHatch _escapeHatch) { + REGISTRY = _registry; + GOVERNANCE = IGovernance(REGISTRY.getGovernance()); + + ROLLUP = _rollup; + OLD_FLUSH_REWARDER = _oldFlushRewarder; + ESCAPE_HATCH = _escapeHatch; + + REWARD_ASSET = OLD_FLUSH_REWARDER.REWARD_ASSET(); + + NEW_FLUSH_REWARDER = + new FlushRewarder(address(GOVERNANCE), ROLLUP, REWARD_ASSET, OLD_FLUSH_REWARDER.rewardPerInsertion()); + } + + /** + * @notice Returns the exact action list executed by governance. + * @return - The array of actions to execute, in order: + * 0. Registry.addRollup(new rollup) + * 1. GSE.addRollup(new rollup) + * 2. Rollup.setRewardsClaimable(true) + * 3. Rollup.updateEscapeHatch(new escape hatch) + * 4. oldRewarder.recover(reward asset, new rewarder, rewardsAvailable) + * 5. Governance.updateConfiguration(executionDelay = 30 days) + */ + function getActions() external view override(IPayload) returns (IPayload.Action[] memory) { + IPayload.Action[] memory res = new IPayload.Action[](6); + + res[0] = + Action({target: address(REGISTRY), data: abi.encodeWithSelector(IRegistry.addRollup.selector, address(ROLLUP))}); + + res[1] = Action({ + target: address(ROLLUP.getGSE()), data: abi.encodeWithSelector(IGSECore.addRollup.selector, address(ROLLUP)) + }); + + res[2] = + Action({target: address(ROLLUP), data: abi.encodeWithSelector(IRollupCore.setRewardsClaimable.selector, true)}); + + // Note: Adding the escape hatch here ensures that only when the payload is executed will it be possible + // to produce blocks this way. + res[3] = Action({ + target: address(ROLLUP), + data: abi.encodeWithSelector(IValidatorSelectionCore.updateEscapeHatch.selector, address(ESCAPE_HATCH)) + }); + + // Note: rewardsAvailable() is called at execution time to recover all assets that are not owed to anyone at that + // time. This ensures that rewards that can be claimed by users won't be swept. + uint256 fundsToMove = OLD_FLUSH_REWARDER.rewardsAvailable(); + res[4] = Action({ + target: address(OLD_FLUSH_REWARDER), + data: abi.encodeWithSelector( + FlushRewarder.recover.selector, address(REWARD_ASSET), address(NEW_FLUSH_REWARDER), fundsToMove + ) + }); + + Configuration memory config = GOVERNANCE.getConfiguration(); + config.executionDelay = Timestamp.wrap(30 days); + + res[5] = Action({ + target: address(GOVERNANCE), data: abi.encodeWithSelector(IGovernance.updateConfiguration.selector, config) + }); + + return res; + } + + /** + * @notice Returns the URI describing this payload + * @return The payload URI string + */ + function getURI() external pure override(IPayload) returns (string memory) { + return "https://github.com/AztecProtocol/aztec-packages/pull/20865"; + } +} diff --git a/l1-contracts/src/alpha/AlphaVerifier.sol b/l1-contracts/src/alpha/AlphaVerifier.sol new file mode 100644 index 000000000000..77ba49548c82 --- /dev/null +++ b/l1-contracts/src/alpha/AlphaVerifier.sol @@ -0,0 +1,2307 @@ +// SPDX-License-Identifier: Apache-2.0 +// solhint-disable +// Copyright 2022 Aztec +pragma solidity >=0.8.21; + +uint256 constant N = 16_777_216; +uint256 constant LOG_N = 24; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 119; +uint256 constant VK_HASH = 0x059ad02b037fcfd4df2b9db771777d067a400f06fc55cf45fa601511e58e2c3e; + +library HonkVerificationKey { + function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(16_777_216), + logCircuitSize: uint256(24), + publicInputsSize: uint256(119), + ql: Honk.G1Point({ + x: uint256(0x2434fb9ddfc507802b24762127ff216d762d75365624026d4fa799159ce7a451), + y: uint256(0x15f92f36ebb7c499597920729689d9c4b1d99de2529dbfa3885ace5654f5e245) + }), + qr: Honk.G1Point({ + x: uint256(0x29b527a6cd8fb6d1f9d5245dd87dcd315d7334cdfed7b9d88a017070cac9e699), + y: uint256(0x01a17712f6b6d482a5c36185a891ae85471d347dc7f4913f72ee0b86f391926c) + }), + qo: Honk.G1Point({ + x: uint256(0x2109dd5ae2b1d7383557078ce7c0c9421c15c51f0c7576d65acb841d20907b19), + y: uint256(0x1a2178a37615af5a9b4b2e1523e0c2de77236d611d0abb79283b73eb70d3b6de) + }), + q4: Honk.G1Point({ + x: uint256(0x02c916f7340368e71b370bb4b8fbd2e59377424883b5998b8bf9a17486833976), + y: uint256(0x2d33a88dd1f868f17acdc30673537070e78eba49d697c5c3f1c62c2a0d6a6031) + }), + qm: Honk.G1Point({ + x: uint256(0x286bec198b5c5503100cf44a9c1e4328a5fd6a06aecea37cf262f7564416e6e6), + y: uint256(0x0dc2055a9ff323fd8450d1fcefdd0f41d1c00063008223030e133ae0877b01b2) + }), + qc: Honk.G1Point({ + x: uint256(0x216f34176b502999458e8e04e4cade7d009f7af15990eb284401914f6d4b7132), + y: uint256(0x1a037a0ccdc42aae26a0ec288c25f91753e8ce24a20e56933f6c5afb882b2a05) + }), + qLookup: Honk.G1Point({ + x: uint256(0x2cb419ef3eccb0db6e471fd8fda94ff432adc91fa3d7b996e2620738b68f36b7), + y: uint256(0x02a10bfbecf3601c6c06b65fe96abc9fb42f812f9794cbded65e33942a411fef) + }), + qArith: Honk.G1Point({ + x: uint256(0x022bb2dd22a67b401123016dc8adc11c8227ba4c8e2f554d561259efde91dfa4), + y: uint256(0x03ca1832300271f320ebfc4d72f7df5b719a1c25f59305a5e0d4925e28b9a268) + }), + qDeltaRange: Honk.G1Point({ + x: uint256(0x2269af63c0c0d2b2d364c299c7534224b6fcb459ee84e3508a4e9b69f9e33228), + y: uint256(0x059cf6b2600ef9b44559428c39f52494e048aeeda07c6f111a5e0989b0d941ed) + }), + qElliptic: Honk.G1Point({ + x: uint256(0x193c47fe445a07262f68a277c80b8df67fe4b4b681f9985414a7f23a69bf943c), + y: uint256(0x224426a26aa66e59df94e961c098fe23a7c458e6534186b35c42b86371cdf777) + }), + qMemory: Honk.G1Point({ + x: uint256(0x19b76df422b7e7a363f8bf4e8d5d4b73a3fe4198fe0e385eb0ba6206863c42c3), + y: uint256(0x296198173ae9364f6caf7c9dde7237dc85e6591ff461d8ec359f3666cce03820) + }), + qNnf: Honk.G1Point({ + x: uint256(0x2868b7d782bd6e023e533ccfaa401de564782c932c6d86f5865544e0cb218d04), + y: uint256(0x26ea37ae38dabed56620648f40bb8f39526e063e7f6d4ecc0832b39a44bea896) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256(0x0e58c45d7f5a0eba7e01b9c1a7eede2c68bf9ea76708772ba1093a0aa9661443), + y: uint256(0x16ecbf12fdc184848eb941cafcfe05117279e96361a89e2be833cd9c1ecc38ac) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256(0x128b54b1d80a394e574135474bcbd826cecb86ba1205c1f1cdadfd0d2b463764), + y: uint256(0x0ab2441ff86203b13bf0a43e447c4c101f07be4d6bece5830fc5981a76d1794e) + }), + s1: Honk.G1Point({ + x: uint256(0x303e74bf724d33466d419ccb451f25dc95fb926ad73123fcf00663f46ed9faf9), + y: uint256(0x08169adca9493a2fa3b538b885774615b37c55fa881840e0b911d0a36fd13b00) + }), + s2: Honk.G1Point({ + x: uint256(0x0b411cbf36239d6cd8b940902b16130017a327ffaf4700db0795b7b9e455c6d8), + y: uint256(0x1e5a3410cc4d0f3144653e9dd82c8e5d65bbc687ae569a4c5cc837073d4e4fc8) + }), + s3: Honk.G1Point({ + x: uint256(0x2f583858f1a6f79ee312c16c6faf93773222d49c2b8d450eede399ffaf7d282c), + y: uint256(0x24d8d98f4ee6cb63e021ba305dfa21df0b7de16bfca963ffc3388f9c7b0d313e) + }), + s4: Honk.G1Point({ + x: uint256(0x16fb668a78d043d655ae4a5f3c6dcd8a9407cc3d1bee341eba937c7766f6383d), + y: uint256(0x20b38809380f481a534593daf0c47125e43f71c434df9bc9183fcfc949501882) + }), + t1: Honk.G1Point({ + x: uint256(0x2194d92617bbb3ba3d9e53f4f13c5c7c6fc5ae0c56f06e0a35747f24625e5763), + y: uint256(0x11ca88979a66ada092bb26e2b64b8602eb63f6e2fc21862f6fefead2978de7e0) + }), + t2: Honk.G1Point({ + x: uint256(0x1d346dd159688f85b77717f8197777c6ced8daf349335d74908736241f5f3328), + y: uint256(0x10e952d77959f4aa6fe9cb7222d9901d06ddfeea51240c79980d4daac8144443) + }), + t3: Honk.G1Point({ + x: uint256(0x20b8784b739f9968d269d3db4e7e7e7e666acd5804af5ff4a54f8dfbea8d2572), + y: uint256(0x21ad5edf078583d5e29052c50b4e8d46067ddaae2aa2345c15a755074d932f95) + }), + t4: Honk.G1Point({ + x: uint256(0x062b31b3719d79c253d59707efcc41556e43d9f4f122ba79d3484e023fb4da7d), + y: uint256(0x283eb52c07506637e09fb73d7875ada840d8e4c75295a90dc312b4d2571c52c3) + }), + id1: Honk.G1Point({ + x: uint256(0x049ad82cc9cfaba4521f90698a524e78a6c9954b903b8c7d7004ae43349884a7), + y: uint256(0x2d796f1ab1c2e178417438d57777fadfbe7cb6af8073524c191ae24baddfe936) + }), + id2: Honk.G1Point({ + x: uint256(0x16ca809b0a3768356f9532961298c949e2054937e1d7f50327cb65e438d9f2fc), + y: uint256(0x2c58fc68082149eba328505adf986d16db9fe6409a2b98136ddabe3f2a735e10) + }), + id3: Honk.G1Point({ + x: uint256(0x2756277322f08f84ceb6b5b28c1100c3ed689d77dc12b84111fce304b15415ee), + y: uint256(0x132c3b83f496eec2de70a8788db38c919ef8aaa4118389ff09685974e9ee5666) + }), + id4: Honk.G1Point({ + x: uint256(0x0243a8379b837880b584baf54d8ec29e8c22c4e212e58cad60d08195541fa004), + y: uint256(0x1a77e361a1251451d6057c74f33d868cd19e8a29a3a6b147750487d44318033b) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), + y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) + }), + lagrangeLast: Honk.G1Point({ + x: uint256(0x28cac1bd2ae82a5589bac7a9df74e05a04692523aa860cf07ea57da5f20d7b29), + y: uint256(0x118c7af1ffc7f352a52f7cf4789efca13d54ab12407f1fcd2f4739c3a5de83b0) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN(uint256 logN, uint256 actualLength, uint256 expectedLength); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using {add as +} for Fr global; +using {sub as -} for Fr global; +using {mul as *} for Fr global; + +using {notEqual as !=} for Fr global; +using {equal as ==} for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = + 21_888_242_871_839_275_222_246_405_745_257_275_088_548_364_400_416_034_343_698_204_186_575_808_495_617; // Prime field + // order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap(0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap(0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0xf8d61709; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 28; + +uint256 constant NUMBER_OF_SUBRELATIONS = 28; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// ENUM FOR WIRES +enum WIRE { + Q_M, + Q_C, + Q_L, + Q_R, + Q_O, + Q_4, + Q_LOOKUP, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// Transcript library to generate fiat shamir challenges +struct Transcript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Gemini + Fr rho; + Fr geminiR; + // Shplonk + Fr shplonkNu; + Fr shplonkZ; +} + +library TranscriptLib { + function generateTranscript( + Honk.Proof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) internal pure returns (Transcript memory t) { + Fr previousChallenge; + (t.relationParameters, previousChallenge) = + generateRelationParametersChallenges(proof, publicInputs, vkHash, publicInputsSize, previousChallenge); + + (t.alphas, previousChallenge) = generateAlphaChallenges(previousChallenge, proof); + + (t.gateChallenges, previousChallenge) = generateGateChallenges(previousChallenge, logN); + + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges(proof, previousChallenge, logN); + + (t.rho, previousChallenge) = generateRhoChallenge(proof, previousChallenge); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge(proof, previousChallenge, logN); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge(proof, previousChallenge, logN); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge(proof, previousChallenge); + + return t; + } + + function splitChallenge(Fr challenge) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.Proof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) internal pure returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) { + (rp.eta, previousChallenge) = generateEtaChallenge(proof, publicInputs, vkHash, publicInputsSize); + + (rp.beta, rp.gamma, nextPreviousChallenge) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.Proof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 6); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib.toBytes32(proof.pairingPointObject[i]); + } + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 2] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(round0))) % P); + (eta,) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges(Fr previousChallenge, Honk.Proof memory proof) + internal + pure + returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) + { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(round1))) % P); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges(Fr previousChallenge, Honk.Proof memory proof) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(alpha0))) % P); + Fr alpha; + (alpha,) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges(Fr previousChallenge, uint256 logN) + internal + pure + returns (Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, Fr nextPreviousChallenge) + { + previousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % P); + (gateChallenges[0],) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateSumcheckChallenges(Honk.Proof memory proof, Fr prevChallenge, uint256 logN) + internal + pure + returns (Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, Fr nextPreviousChallenge) + { + for (uint256 i = 0; i < logN; i++) { + Fr[BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(univariateChal))) % P); + Fr unused; + (sumcheckChallenges[i], unused) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + function generateRhoChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr rho, Fr nextPreviousChallenge) + { + Fr[NUMBER_OF_ENTITIES + 1] memory rhoChallengeElements; + rhoChallengeElements[0] = prevChallenge; + + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + rhoChallengeElements[i + 1] = proof.sumcheckEvaluations[i]; + } + + nextPreviousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P); + Fr unused; + (rho, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge(Honk.Proof memory proof, Fr prevChallenge, uint256 logN) + internal + pure + returns (Fr geminiR, Fr nextPreviousChallenge) + { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(gR))) % P); + Fr unused; + (geminiR, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge(Honk.Proof memory proof, Fr prevChallenge, uint256 logN) + internal + pure + returns (Fr shplonkNu, Fr nextPreviousChallenge) + { + uint256[] memory shplonkNuChallengeElements = new uint256[](logN + 1); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN; i++) { + shplonkNuChallengeElements[i + 1] = Fr.unwrap(proof.geminiAEvaluations[i]); + } + + nextPreviousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P); + Fr unused; + (shplonkNu, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr shplonkZ, Fr nextPreviousChallenge) + { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from(uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P); + Fr unused; + (shplonkZ, unused) = splitChallenge(nextPreviousChallenge); + } + + function loadProof(bytes calldata proof, uint256 logN) internal pure returns (Honk.Proof memory p) { + uint256 boundary = 0x00; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256(bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE])); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require(limb < 2 ** (i % 2 == 0 ? 136 : 120), Errors.ValueGeLimbMax()); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + } + } + // Sumcheck evaluations + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + p.sumcheckEvaluations[i] = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) internal pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation(purportedEvaluations, evaluations, powPartialEval); + accumulatePermutationRelation(purportedEvaluations, rp, evaluations, powPartialEval); + accumulateLogDerivativeLookupRelation(purportedEvaluations, rp, evaluations, powPartialEval); + accumulateDeltaRangeRelation(purportedEvaluations, evaluations, powPartialEval); + accumulateEllipticRelation(purportedEvaluations, evaluations, powPartialEval); + accumulateMemoryRelation(purportedEvaluations, rp, evaluations, powPartialEval); + accumulateNnfRelation(purportedEvaluations, evaluations, powPartialEval); + accumulatePoseidonExternalRelation(purportedEvaluations, evaluations, powPartialEval); + accumulatePoseidonInternalRelation(purportedEvaluations, evaluations, powPartialEval); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations(evaluations, subrelationChallenges); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire(Fr[NUMBER_OF_ENTITIES] memory p, WIRE _wire) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * neg_half; + accum = accum + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[0] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + wire(p, WIRE.W_4) - wire(p, WIRE.W_L_SHIFT) + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[1] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + wire(p, WIRE.ID_1) * rp.beta + rp.gamma; + num = num * (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = num * (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = num * (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + wire(p, WIRE.SIGMA_1) * rp.beta + rp.gamma; + den = den * (wire(p, WIRE.W_R) + wire(p, WIRE.SIGMA_2) * rp.beta + rp.gamma); + den = den * (wire(p, WIRE.W_O) + wire(p, WIRE.SIGMA_3) * rp.beta + rp.gamma); + den = den * (wire(p, WIRE.W_4) + wire(p, WIRE.SIGMA_4) * rp.beta + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * grand_product_numerator; + + acc = acc + - ((wire(p, WIRE.Z_PERM_SHIFT) + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) + * grand_product_denominator); + acc = acc * domainSep; + evals[2] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[3] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = wire(p, WIRE.TABLE_1) + rp.gamma + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + rp.gamma + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_M) * wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_C) * wire(p, WIRE.W_O_SHIFT); + + lookup_term = derived_entry_1 + (derived_entry_2 * rp.beta) + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = + wire(p, WIRE.LOOKUP_READ_TAGS) + wire(p, WIRE.Q_LOOKUP) - (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * table_term * wire(p, WIRE.LOOKUP_INVERSES) - inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * lookup_inverse - wire(p, WIRE.LOOKUP_READ_COUNTS) * table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[4] = accumulatorNone; + evals[5] = accumulatorOne; + evals[6] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[7] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[11] = x_add_identity * partialEval * wire(p, WIRE.Q_ELLIPTIC) * (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * x_diff + (ep.x_3 - ep.x_1) * y_diff; + evals[12] = y_add_identity * domainSep * wire(p, WIRE.Q_ELLIPTIC) * (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = (ep.x_3 + ep.x_1 + ep.x_1) * y1_sqr_mul_4 - x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * domainSep * wire(p, WIRE.Q_ELLIPTIC) * q_is_double; + evals[11] = evals[11] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * (ep.x_1 - ep.x_3) - (ep.y_1 + ep.y_1) * (ep.y_1 + ep.y_3); + evals[12] = evals[12] + y_double_identity * domainSep * wire(p, WIRE.Q_ELLIPTIC) * q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = ap.memory_record_check + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = ap.memory_record_check + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = ap.index_delta * (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = (ap.index_delta * MINUS_ONE + ONE) * ap.record_delta; // deg 2 + + evals[14] = ap.adjacent_values_match_if_adjacent_indices_match * (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) + * (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[15] = ap.index_is_monotonically_increasing * (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) + * (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = ap.memory_record_check * (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = ap.next_gate_access_type + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = ap.next_gate_access_type + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = wire(p, WIRE.W_4_SHIFT) - ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap.adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * value_delta * (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = ap.next_gate_access_type * ap.next_gate_access_type - ap.next_gate_access_type; + + // Putting it all together... + evals[16] = ap.adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation + * (wire(p, WIRE.Q_O)) * (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[17] = ap.index_is_monotonically_increasing * (wire(p, WIRE.Q_O)) * (wire(p, WIRE.Q_MEMORY) * domainSep); // deg + // 4 + evals[18] = ap.next_gate_access_type_is_boolean * (wire(p, WIRE.Q_O)) * (wire(p, WIRE.Q_MEMORY) * domainSep); // deg + // 4 or 6 + + ap.RAM_consistency_check_identity = ap.access_check * (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = (ap.index_delta * MINUS_ONE + ONE) * ap.timestamp_delta - wire(p, WIRE.W_O); // deg + // 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = ap.memory_identity + ap.RAM_timestamp_check_identity * (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg + // 4 + ap.memory_identity = ap.memory_identity + ap.memory_record_check * (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 + // or 6 + ap.memory_identity = ap.memory_identity + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = ap.memory_identity * (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[13] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = wire(p, WIRE.W_L) * wire(p, WIRE.W_R_SHIFT) + wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = + (wire(p, WIRE.W_L) * wire(p, WIRE.W_4) + wire(p, WIRE.W_R) * wire(p, WIRE.W_O) - wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 - wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 + ap.limb_subproduct; + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = ap.limb_subproduct + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = ap.non_native_field_gate_1 - (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = ap.non_native_field_gate_1 * wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = ap.non_native_field_gate_3 + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = ap.non_native_field_gate_3 - (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = ap.non_native_field_gate_3 * wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + ap.non_native_field_gate_2 + ap.non_native_field_gate_3; + non_native_field_identity = non_native_field_identity * wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + ap.limb_accumulator_2; + limb_accumulator_identity = limb_accumulator_identity * wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[19] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[20] = evals[20] + ep.q_pos_by_scaling * (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[21] = evals[21] + ep.q_pos_by_scaling * (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[22] = evals[22] + ep.q_pos_by_scaling * (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[23] = evals[23] + ep.q_pos_by_scaling * (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from(0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7), + FrLib.from(0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b), + FrLib.from(0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15), + FrLib.from(0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[24] = evals[24] + ip.q_pos_by_scaling * (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[25] = evals[25] + ip.q_pos_by_scaling * (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[26] = evals[26] + ip.q_pos_by_scaling * (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[27] = evals[27] + ip.q_pos_by_scaling * (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = accumulator + evaluations[i] * subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[4] denominators; + Fr[4] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * batchedEvalAccumulator * Fr.wrap(2)) - geminiEvaluations[i - 1] + * (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = batchedEvalRoundAcc * (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares(Fr r, uint256 logN) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = + 21_888_242_871_839_275_222_246_405_745_257_275_088_696_311_157_297_823_662_689_037_894_645_226_208_583; // EC group + // order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point(bytes calldata proofSection) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // Reject the point at infinity (0,0). EVM precompiles silently treat (0,0) + // as the identity element, which could zero out commitments. + // On-curve validation (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles + // per EIP-196, so we only need to catch this special case here. + require((x | y) != 0, Errors.PointAtInfinity()); + + point = Honk.G1Point({x: x, y: y}); +} + +function negateInplace(Honk.G1Point memory point) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1(Fr[PAIRING_POINTS_SIZE] memory pairingPoints) + pure + returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) +{ + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require(lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, Errors.ValueGeGroupOrder()); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + (Honk.G1Point memory proofLhs, Honk.G1Point memory proofRhs) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from(uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator(Honk.G1Point memory basePoint, Honk.G1Point memory other, Fr recursionSeperator) + view + returns (Honk.G1Point memory) +{ + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul(Fr value, Honk.G1Point memory point) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd(Honk.G1Point memory lhs, Honk.G1Point memory rhs) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { revert(0, 0) } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault(Fr[PAIRING_POINTS_SIZE] memory pairingPoints) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing(Honk.G1Point memory rhs, Honk.G1Point memory lhs) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256(0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2), + uint256(0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed), + uint256(0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b), + uint256(0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa), + lhs.x, + lhs.y, + // G2 point from VK + uint256(0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1), + uint256(0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0), + uint256(0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4), + uint256(0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseHonkVerifier is IVerifier { + using FrLib for Fr; + + // Constants for proof length calculation (matching UltraKeccakFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = 8; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + + // Number of field elements in a ultra keccak honk proof for log_n = 25, including pairing point object. + uint256 internal constant PROOF_SIZE = 350; // Legacy constant - will be replaced by calculateProofSize($LOG_N) + uint256 internal constant SHIFTED_COMMITMENTS_START = 29; + + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + + constructor(uint256 _N, uint256 _logN, uint256 _vkHash, uint256 _numPublicInputs) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + } + + function verify(bytes calldata proof, bytes32[] calldata publicInputs) public view override returns (bool) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + if (proof.length != expectedProofSize * 32) { + revert Errors.ProofLengthWrongWithLogN($LOG_N, proof.length, expectedProofSize * 32); + } + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.Proof memory p = TranscriptLib.loadProof(proof, $LOG_N); + if (publicInputs.length != vk.publicInputsSize - PAIRING_POINTS_SIZE) { + revert Errors.PublicInputsLengthWrong(); + } + + // Generate the fiat shamir challenges for the whole protocol + Transcript memory t = TranscriptLib.generateTranscript(p, publicInputs, $VK_HASH, $NUM_PUBLIC_INPUTS, $LOG_N); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, /*pubInputsOffset=*/ + 1 + ); + + // Sumcheck + bool sumcheckVerified = verifySumcheck(p, t); + if (!sumcheckVerified) revert Errors.SumcheckFailed(); + + bool shpleminiVerified = verifyShplemini(p, vk, t); + if (!shpleminiVerified) revert Errors.ShpleminiFailed(); + + return sumcheckVerified && shpleminiVerified; // Boolean condition not required - nice for vanity :) + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = ONE; + Fr denominator = ONE; + + Fr numeratorAcc = gamma + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for (uint256 i = 0; i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; i++) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck(Honk.Proof memory proof, Transcript memory tp) internal view returns (bool verified) { + Fr roundTarget; + Fr powPartialEvaluation = ONE; + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round = 0; round < $LOG_N; ++round) { + Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate = proof.sumcheckUnivariates[round]; + bool valid = checkSum(roundUnivariate, roundTarget); + if (!valid) revert Errors.SumcheckFailed(); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTarget = computeNextTargetSum(roundUnivariate, roundChallenge); + powPartialEvaluation = partiallyEvaluatePOW(tp.gateChallenges[round], powPartialEvaluation, roundChallenge); + } + + // Last round + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + proof.sumcheckEvaluations, tp.relationParameters, tp.alphas, powPartialEvaluation + ); + verified = (grandHonkRelationSum == roundTarget); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, Fr roundChallenge) + internal + view + returns (Fr targetSum) + { + Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51), + Fr.wrap(0x00000000000000000000000000000000000000000000000000000000000002d0), + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffff11), + Fr.wrap(0x0000000000000000000000000000000000000000000000000000000000000090), + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffff71), + Fr.wrap(0x00000000000000000000000000000000000000000000000000000000000000f0), + Fr.wrap(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31), + Fr.wrap(0x00000000000000000000000000000000000000000000000000000000000013b0) + ]; + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = ONE; + for (uint256 i = 0; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + Fr inv = BARYCENTRIC_LAGRANGE_DENOMINATORS[i]; + inv = inv * (roundChallenge - Fr.wrap(i)); + inv = FrLib.invert(inv); + denominatorInverses[i] = inv; + } + + for (uint256 i = 0; i < BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + Fr term = roundUnivariates[i]; + term = term * denominatorInverses[i]; + targetSum = targetSum + term; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini(Honk.Proof memory proof, Honk.VerificationKey memory vk, Transcript memory tp) + internal + view + returns (bool verified) + { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib.computeSquares(tp.geminiR, $LOG_N); + + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[](NUMBER_UNSHIFTED + $LOG_N + 2); + Honk.G1Point[] memory commitments = new Honk.G1Point[](NUMBER_UNSHIFTED + $LOG_N + 2); + + mem.posInvertedDenominator = (tp.shplonkZ - powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = mem.posInvertedDenominator + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = tp.geminiR.invert() * (mem.posInvertedDenominator - (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = ONE; + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + mem.batchingChallenge = ONE; + mem.batchedEvaluation = ZERO; + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + for (uint256 i = 1; i <= NUMBER_UNSHIFTED; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED; + + scalars[scalarOff] = scalars[scalarOff] + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[evaluationOff] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = vk.qm; + commitments[2] = vk.qc; + commitments[3] = vk.ql; + commitments[4] = vk.qr; + commitments[5] = vk.qo; + commitments[6] = vk.q4; + commitments[7] = vk.qLookup; + commitments[8] = vk.qArith; + commitments[9] = vk.qDeltaRange; + commitments[10] = vk.qElliptic; + commitments[11] = vk.qMemory; + commitments[12] = vk.qNnf; + commitments[13] = vk.qPoseidon2External; + commitments[14] = vk.qPoseidon2Internal; + commitments[15] = vk.s1; + commitments[16] = vk.s2; + commitments[17] = vk.s3; + commitments[18] = vk.s4; + commitments[19] = vk.id1; + commitments[20] = vk.id2; + commitments[21] = vk.id3; + commitments[22] = vk.id4; + commitments[23] = vk.t1; + commitments[24] = vk.t2; + commitments[25] = vk.t3; + commitments[26] = vk.t4; + commitments[27] = vk.lagrangeFirst; + commitments[28] = vk.lagrangeLast; + + // Accumulate proof points + commitments[29] = proof.w1; + commitments[30] = proof.w2; + commitments[31] = proof.w3; + commitments[32] = proof.w4; + commitments[33] = proof.zPerm; + commitments[34] = proof.lookupInverses; + commitments[35] = proof.lookupReadCounts; + commitments[36] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib.computeFoldPosEvaluations( + tp.sumCheckUChallenges, mem.batchedEvaluation, proof.geminiAEvaluations, powers_of_evaluation_challenge, $LOG_N + ); + + // Compute the Shplonk constant term contributions from A₀(±r) + mem.constantTermAccumulator = foldPosEvaluations[0] * mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + (proof.geminiAEvaluations[0] * tp.shplonkNu * mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = mem.batchingChallenge * mem.posInvertedDenominator; + mem.scalingFactorNeg = mem.batchingChallenge * tp.shplonkNu * mem.negInvertedDenominator; + // [Aₗ] is multiplied by -v^{2l}/(z-r^{2^l}) - v^{2l+1} /(z+ r^{2^l}) + scalars[NUMBER_UNSHIFTED + 1 + i] = mem.scalingFactorNeg.neg() + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * proof.geminiAEvaluations[i + 1]; + + accumContribution = accumContribution + mem.scalingFactorPos * foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = mem.constantTermAccumulator + accumContribution; + // Update the running power of v + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu * tp.shplonkNu; + + commitments[NUMBER_UNSHIFTED + 1 + i] = proof.geminiFoldComms[i]; + } + + // Finalize the batch opening claim + commitments[NUMBER_UNSHIFTED + $LOG_N] = Honk.G1Point({x: 1, y: 2}); + scalars[NUMBER_UNSHIFTED + $LOG_N] = mem.constantTermAccumulator; + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[NUMBER_UNSHIFTED + $LOG_N + 1] = quotient_commitment; + scalars[NUMBER_UNSHIFTED + $LOG_N + 1] = tp.shplonkZ; // evaluation challenge + + Honk.G1Point memory P_0_agg = batchMul(commitments, scalars); + Honk.G1Point memory P_1_agg = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator(proof.pairingPointObject, P_0_agg, P_1_agg); + (Honk.G1Point memory P_0_other, Honk.G1Point memory P_1_other) = + convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + P_0_agg = mulWithSeperator(P_0_agg, P_0_other, recursionSeparator); + P_1_agg = mulWithSeperator(P_1_agg, P_1_other, recursionSeparator); + } + + return pairing(P_0_agg, P_1_agg); + } + + function batchMul(Honk.G1Point[] memory base, Fr[] memory scalars) + internal + view + returns (Honk.G1Point memory result) + { + uint256 limit = NUMBER_UNSHIFTED + $LOG_N + 2; + + // Validate all points are on the curve + for (uint256 i = 0; i < limit; ++i) { + rejectPointAtInfinity(base[i]); + } + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { count := add(count, 1) } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, add(free, 0x40), 0x40)) + // accumulator = accumulator + accumulator_2 + success := and(success, staticcall(gas(), 6, free, 0x80, free, 0x40)) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + + // Sumcheck + proofLength += logN * BATCHED_RELATION_PARTIAL_LENGTH * NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Gemini + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += logN * NUM_ELEMENTS_FR; // Gemini evaluations + + // Shplonk and KZG commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength; + } + + function checkSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate, Fr roundTarget) + internal + pure + returns (bool checked) + { + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + checked = totalSum == roundTarget; + } + + // Univariate evaluation of the monomial ((1-X_l) + X_l.B_l) at the challenge point X_l=u_l + function partiallyEvaluatePOW(Fr gateChallenge, Fr currentEvaluation, Fr roundChallenge) + internal + pure + returns (Fr newEvaluation) + { + Fr univariateEval = ONE + (roundChallenge * (gateChallenge - ONE)); + newEvaluation = currentEvaluation * univariateEval; + } + + function loadVerificationKey() internal pure virtual returns (Honk.VerificationKey memory); +} + +contract HonkVerifier is BaseHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) { + function loadVerificationKey() internal pure override returns (Honk.VerificationKey memory) { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/l1-contracts/src/core/libraries/rollup/FeeLib.sol b/l1-contracts/src/core/libraries/rollup/FeeLib.sol index 8fd5b0c645fc..2c7e3ee48185 100644 --- a/l1-contracts/src/core/libraries/rollup/FeeLib.sol +++ b/l1-contracts/src/core/libraries/rollup/FeeLib.sol @@ -58,7 +58,7 @@ uint256 constant MAX_ETH_PER_FEE_ASSET = 1e14; uint256 constant MAX_FEE_ASSET_PRICE_MODIFIER_BPS = 100; uint256 constant L1_GAS_PER_CHECKPOINT_PROPOSED = 300_000; -uint256 constant L1_GAS_PER_EPOCH_VERIFIED = 1_000_000; +uint256 constant L1_GAS_PER_EPOCH_VERIFIED = 3_600_000; uint256 constant MINIMUM_CONGESTION_MULTIPLIER = 1e9; diff --git a/l1-contracts/src/core/slashing/TallySlashingProposer.sol b/l1-contracts/src/core/slashing/TallySlashingProposer.sol index ec9b7e91e5e2..2b944d0ed78c 100644 --- a/l1-contracts/src/core/slashing/TallySlashingProposer.sol +++ b/l1-contracts/src/core/slashing/TallySlashingProposer.sol @@ -594,13 +594,16 @@ contract TallySlashingProposer is EIP712 { function getVotes(SlashRound _round, uint256 _index) external view returns (bytes memory) { uint256 expectedLength = COMMITTEE_SIZE * ROUND_SIZE_IN_EPOCHS / 4; - // _getRoundVotes reverts if _round is out of the roundabout range. - // But within-range the storage slot may still hold stale data from a - // previous round that mapped to the same circular index. Guard against - // that by checking the authoritative round metadata first. + // _getRoundData reverts if _round is out of the roundabout range and + // returns empty metadata if this circular slot still contains round data + // from an older round number. SlashRound currentRound = getCurrentRound(); RoundData memory roundData = _getRoundData(_round, currentRound); - if (roundData.voteCount == 0) { + + // Vote storage is not cleared when a circular slot is reused. If this + // round has fewer votes than a previous one that shared the same slot, + // indices >= voteCount would otherwise return stale vote bytes. + if (_index >= roundData.voteCount) { return new bytes(expectedLength); } diff --git a/l1-contracts/test/fees/FeeRollup.t.sol b/l1-contracts/test/fees/FeeRollup.t.sol index d80b7f78c938..006adb4f019b 100644 --- a/l1-contracts/test/fees/FeeRollup.t.sol +++ b/l1-contracts/test/fees/FeeRollup.t.sol @@ -59,10 +59,11 @@ import {MinimalFeeModel} from "./MinimalFeeModel.sol"; import {RollupBuilder} from "../builder/RollupBuilder.sol"; import {AttestationLibHelper} from "@test/helper_libraries/AttestationLibHelper.sol"; import {Signature} from "@aztec/shared/libraries/SignatureLib.sol"; +import {TestConstants} from "../harnesses/TestConstants.sol"; // solhint-disable comprehensive-interface -uint256 constant MANA_TARGET = 100_000_000; +uint256 constant MANA_TARGET = TestConstants.AZTEC_MANA_TARGET; contract FeeRollupTest is FeeModelTestPoints, DecoderBase { using stdStorage for StdStorage; diff --git a/l1-contracts/test/fees/MinimalFeeModel.sol b/l1-contracts/test/fees/MinimalFeeModel.sol index 1a32d4cc1dd9..d4295de5ab59 100644 --- a/l1-contracts/test/fees/MinimalFeeModel.sol +++ b/l1-contracts/test/fees/MinimalFeeModel.sol @@ -2,6 +2,7 @@ // Copyright 2024 Aztec Labs. pragma solidity >=0.8.27; +import {TestConstants} from "../harnesses/TestConstants.sol"; import { FeeLib, FeeHeaderLib, @@ -55,7 +56,7 @@ contract MinimalFeeModel { uint256 internal constant BLOB_GAS_PER_BLOB = 2 ** 17; uint256 internal constant GAS_PER_BLOB_POINT_EVALUATION = 50_000; - uint256 internal constant MANA_TARGET = 100_000_000; + uint256 internal constant MANA_TARGET = TestConstants.AZTEC_MANA_TARGET; Slot public constant LIFETIME = Slot.wrap(5); Slot public constant LAG = Slot.wrap(2); diff --git a/l1-contracts/test/fixtures/fee_data_points.json b/l1-contracts/test/fixtures/fee_data_points.json index 2e9c70648af5..525af1148a0e 100644 --- a/l1-contracts/test/fixtures/fee_data_points.json +++ b/l1-contracts/test/fixtures/fee_data_points.json @@ -12013,18 +12013,18 @@ "blobs_needed": 2, "block_number": 1, "l1_block_number": 20973164, - "mana_spent": 199998340, - "size_in_fields": 7035, + "mana_spent": 149999706, + "size_in_fields": 5220, "slot_number": 1, "timestamp": 1729021859 }, "fee_header": { - "eth_per_fee_asset": 10037000, + "eth_per_fee_asset": 9933000, "excess_mana": 0, - "mana_used": 199998340 + "mana_used": 149999706 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": -67 }, "outputs": { "eth_per_fee_asset_at_execution": 10000000, @@ -12046,14 +12046,14 @@ "mana_base_fee_components_in_fee_asset": { "congestion_cost": 0, "congestion_multiplier": 1000000000, - "prover_cost": 18082443100000, - "sequencer_cost": 300000100000 + "prover_cost": 18201193100000, + "sequencer_cost": 400000100000 }, "mana_base_fee_components_in_wei": { "congestion_cost": 0, "congestion_multiplier": 1000000000, - "prover_cost": 180824431, - "sequencer_cost": 3000001 + "prover_cost": 182011931, + "sequencer_cost": 4000001 } }, "parent_fee_header": { @@ -12067,21 +12067,21 @@ "blobs_needed": 2, "block_number": 2, "l1_block_number": 20973167, - "mana_spent": 199983130, - "size_in_fields": 7080, + "mana_spent": 149994629, + "size_in_fields": 5055, "slot_number": 2, "timestamp": 1729021895 }, "fee_header": { - "eth_per_fee_asset": 10116292, - "excess_mana": 99998340, - "mana_used": 199983130 + "eth_per_fee_asset": 9863469, + "excess_mana": 74999706, + "mana_used": 149994629 }, "oracle_input": { - "fee_asset_price_modifier": 79 + "fee_asset_price_modifier": -70 }, "outputs": { - "eth_per_fee_asset_at_execution": 10037000, + "eth_per_fee_asset_at_execution": 9933000, "l1_fee_oracle_output": { "base_fee": 1000000000, "blob_fee": 1 @@ -12098,22 +12098,22 @@ "slot_of_change": 5 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 2273167480323, - "congestion_multiplier": 1124117246, - "prover_cost": 18015784696623, - "sequencer_cost": 298894191492 + "congestion_cost": 2324332829961, + "congestion_multiplier": 1124118914, + "prover_cost": 18323963656499, + "sequencer_cost": 402698177792 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 22815782, - "congestion_multiplier": 1124117246, - "prover_cost": 180824431, - "sequencer_cost": 3000001 + "congestion_cost": 23087598, + "congestion_multiplier": 1124118914, + "prover_cost": 182011931, + "sequencer_cost": 4000001 } }, "parent_fee_header": { - "eth_per_fee_asset": 10037000, + "eth_per_fee_asset": 9933000, "excess_mana": 0, - "mana_used": 199998340 + "mana_used": 149999706 } }, { @@ -12121,21 +12121,21 @@ "blobs_needed": 2, "block_number": 3, "l1_block_number": 20973170, - "mana_spent": 199991033, - "size_in_fields": 6615, + "mana_spent": 149990944, + "size_in_fields": 5220, "slot_number": 3, "timestamp": 1729021931 }, "fee_header": { - "eth_per_fee_asset": 10176989, - "excess_mana": 199981470, - "mana_used": 199991033 + "eth_per_fee_asset": 9897004, + "excess_mana": 149994335, + "mana_used": 149990944 }, "oracle_input": { - "fee_asset_price_modifier": 60 + "fee_asset_price_modifier": 34 }, "outputs": { - "eth_per_fee_asset_at_execution": 10116292, + "eth_per_fee_asset_at_execution": 9863469, "l1_fee_oracle_output": { "base_fee": 1000000000, "blob_fee": 1 @@ -12152,22 +12152,22 @@ "slot_of_change": 5 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 4790219776179, - "congestion_multiplier": 1263617096, - "prover_cost": 17874576079853, - "sequencer_cost": 296551443949 + "congestion_cost": 4971774534903, + "congestion_multiplier": 1263633325, + "prover_cost": 18453135605739, + "sequencer_cost": 405536936346 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 48459262, - "congestion_multiplier": 1263617096, - "prover_cost": 180824431, - "sequencer_cost": 3000001 + "congestion_cost": 49038944, + "congestion_multiplier": 1263633325, + "prover_cost": 182011931, + "sequencer_cost": 4000001 } }, "parent_fee_header": { - "eth_per_fee_asset": 10116292, - "excess_mana": 99998340, - "mana_used": 199983130 + "eth_per_fee_asset": 9863469, + "excess_mana": 74999706, + "mana_used": 149994629 } }, { @@ -12175,21 +12175,21 @@ "blobs_needed": 2, "block_number": 4, "l1_block_number": 20973173, - "mana_spent": 155136873, - "size_in_fields": 5400, + "mana_spent": 149994447, + "size_in_fields": 5355, "slot_number": 4, "timestamp": 1729021967 }, "fee_header": { - "eth_per_fee_asset": 10134245, - "excess_mana": 299972503, - "mana_used": 155136873 + "eth_per_fee_asset": 9941540, + "excess_mana": 224985279, + "mana_used": 149994447 }, "oracle_input": { - "fee_asset_price_modifier": -42 + "fee_asset_price_modifier": 45 }, "outputs": { - "eth_per_fee_asset_at_execution": 10176989, + "eth_per_fee_asset_at_execution": 9897004, "l1_fee_oracle_output": { "base_fee": 1000000000, "blob_fee": 1 @@ -12206,22 +12206,22 @@ "slot_of_change": 5 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 7594332960368, - "congestion_multiplier": 1420441627, - "prover_cost": 17767969583145, - "sequencer_cost": 294782769246 + "congestion_cost": 7902350145560, + "congestion_multiplier": 1420454705, + "prover_cost": 18390609016628, + "sequencer_cost": 404162815333 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 77287443, - "congestion_multiplier": 1420441627, - "prover_cost": 180824431, - "sequencer_cost": 3000001 + "congestion_cost": 78209591, + "congestion_multiplier": 1420454705, + "prover_cost": 182011931, + "sequencer_cost": 4000001 } }, "parent_fee_header": { - "eth_per_fee_asset": 10176989, - "excess_mana": 199981470, - "mana_used": 199991033 + "eth_per_fee_asset": 9897004, + "excess_mana": 149994335, + "mana_used": 149990944 } }, { @@ -12229,21 +12229,21 @@ "blobs_needed": 2, "block_number": 5, "l1_block_number": 20973176, - "mana_spent": 199999989, - "size_in_fields": 6795, + "mana_spent": 149985144, + "size_in_fields": 5415, "slot_number": 5, "timestamp": 1729022003 }, "fee_header": { - "eth_per_fee_asset": 10120057, - "excess_mana": 355109376, - "mana_used": 199999989 + "eth_per_fee_asset": 9992241, + "excess_mana": 299979726, + "mana_used": 149985144 }, "oracle_input": { - "fee_asset_price_modifier": -14 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 10134245, + "eth_per_fee_asset_at_execution": 9941540, "l1_fee_oracle_output": { "base_fee": 14402849460, "blob_fee": 23 @@ -12260,22 +12260,22 @@ "slot_of_change": 5 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 11599840639338, - "congestion_multiplier": 1515094737, - "prover_cost": 18256201818686, - "sequencer_cost": 4263617960687 + "congestion_cost": 15590305224342, + "congestion_multiplier": 1596746902, + "prover_cost": 20330472542484, + "sequencer_cost": 5795017472143 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 117555627, - "congestion_multiplier": 1515094737, - "prover_cost": 185012822, - "sequencer_cost": 43208549 + "congestion_cost": 154991643, + "congestion_multiplier": 1596746902, + "prover_cost": 202116206, + "sequencer_cost": 57611398 } }, "parent_fee_header": { - "eth_per_fee_asset": 10134245, - "excess_mana": 299972503, - "mana_used": 155136873 + "eth_per_fee_asset": 9941540, + "excess_mana": 224985279, + "mana_used": 149994447 } }, { @@ -12283,21 +12283,21 @@ "blobs_needed": 2, "block_number": 6, "l1_block_number": 20973179, - "mana_spent": 199999720, - "size_in_fields": 6930, + "mana_spent": 149985048, + "size_in_fields": 5055, "slot_number": 6, "timestamp": 1729022039 }, "fee_header": { - "eth_per_fee_asset": 10046180, - "excess_mana": 455109365, - "mana_used": 199999720 + "eth_per_fee_asset": 9989243, + "excess_mana": 374964870, + "mana_used": 149985048 }, "oracle_input": { - "fee_asset_price_modifier": -73 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 10120057, + "eth_per_fee_asset_at_execution": 9992241, "l1_fee_oracle_output": { "base_fee": 14402849460, "blob_fee": 23 @@ -12314,22 +12314,22 @@ "slot_of_change": 5 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 15856952683172, - "congestion_multiplier": 1703147410, - "prover_cost": 18281796436523, - "sequencer_cost": 4269595418287 + "congestion_cost": 20661586825218, + "congestion_multiplier": 1794892619, + "prover_cost": 20227314973689, + "sequencer_cost": 5765613339391 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 160473265, - "congestion_multiplier": 1703147410, - "prover_cost": 185012822, - "sequencer_cost": 43208549 + "congestion_cost": 206455555, + "congestion_multiplier": 1794892619, + "prover_cost": 202116206, + "sequencer_cost": 57611398 } }, "parent_fee_header": { - "eth_per_fee_asset": 10120057, - "excess_mana": 355109376, - "mana_used": 199999989 + "eth_per_fee_asset": 9992241, + "excess_mana": 299979726, + "mana_used": 149985144 } }, { @@ -12337,21 +12337,21 @@ "blobs_needed": 2, "block_number": 7, "l1_block_number": 20973182, - "mana_spent": 199994400, - "size_in_fields": 7110, + "mana_spent": 149993990, + "size_in_fields": 5040, "slot_number": 7, "timestamp": 1729022075 }, "fee_header": { - "eth_per_fee_asset": 10037138, - "excess_mana": 555109085, - "mana_used": 199994400 + "eth_per_fee_asset": 9997234, + "excess_mana": 449949918, + "mana_used": 149993990 }, "oracle_input": { - "fee_asset_price_modifier": -9 + "fee_asset_price_modifier": 8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10046180, + "eth_per_fee_asset_at_execution": 9989243, "l1_fee_oracle_output": { "base_fee": 14402849460, "blob_fee": 23 @@ -12368,22 +12368,22 @@ "slot_of_change": 5 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 20775825139506, - "congestion_multiplier": 1914540469, - "prover_cost": 18416236022051, - "sequencer_cost": 4300992914720 + "congestion_cost": 26459033982856, + "congestion_multiplier": 2017626606, + "prover_cost": 20233385652947, + "sequencer_cost": 5767343731653 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 208717679, - "congestion_multiplier": 1914540469, - "prover_cost": 185012822, - "sequencer_cost": 43208549 + "congestion_cost": 264305720, + "congestion_multiplier": 2017626606, + "prover_cost": 202116206, + "sequencer_cost": 57611398 } }, "parent_fee_header": { - "eth_per_fee_asset": 10046180, - "excess_mana": 455109365, - "mana_used": 199999720 + "eth_per_fee_asset": 9989243, + "excess_mana": 374964870, + "mana_used": 149985048 } }, { @@ -12391,21 +12391,21 @@ "blobs_needed": 2, "block_number": 8, "l1_block_number": 20973185, - "mana_spent": 199997101, - "size_in_fields": 7110, + "mana_spent": 149999695, + "size_in_fields": 5490, "slot_number": 8, "timestamp": 1729022111 }, "fee_header": { - "eth_per_fee_asset": 10033123, - "excess_mana": 655103485, - "mana_used": 199997101 + "eth_per_fee_asset": 10010230, + "excess_mana": 524943908, + "mana_used": 149999695 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 10037138, + "eth_per_fee_asset_at_execution": 9997234, "l1_fee_oracle_output": { "base_fee": 14402849460, "blob_fee": 23 @@ -12422,22 +12422,22 @@ "slot_of_change": 10 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 26197416733735, - "congestion_multiplier": 2152158039, - "prover_cost": 18432826369430, - "sequencer_cost": 4304867483142 + "congestion_cost": 32943403545421, + "congestion_multiplier": 2268032006, + "prover_cost": 20217212681028, + "sequencer_cost": 5762733772162 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 262947087, - "congestion_multiplier": 2152158039, - "prover_cost": 185012822, - "sequencer_cost": 43208549 + "congestion_cost": 329342914, + "congestion_multiplier": 2268032006, + "prover_cost": 202116206, + "sequencer_cost": 57611398 } }, "parent_fee_header": { - "eth_per_fee_asset": 10037138, - "excess_mana": 555109085, - "mana_used": 199994400 + "eth_per_fee_asset": 9997234, + "excess_mana": 449949918, + "mana_used": 149993990 } }, { @@ -12445,21 +12445,21 @@ "blobs_needed": 2, "block_number": 9, "l1_block_number": 20973188, - "mana_spent": 194235274, - "size_in_fields": 6645, + "mana_spent": 129450235, + "size_in_fields": 4680, "slot_number": 9, "timestamp": 1729022147 }, "fee_header": { - "eth_per_fee_asset": 10000013, - "excess_mana": 755100586, - "mana_used": 194235274 + "eth_per_fee_asset": 10030250, + "excess_mana": 599943603, + "mana_used": 129450235 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": 20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10033123, + "eth_per_fee_asset_at_execution": 10010230, "l1_fee_oracle_output": { "base_fee": 14402849460, "blob_fee": 23 @@ -12476,22 +12476,22 @@ "slot_of_change": 10 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 32283942198257, - "congestion_multiplier": 2419274462, - "prover_cost": 18440202716542, - "sequencer_cost": 4306590181343 + "congestion_cost": 40204640253022, + "congestion_multiplier": 2549537632, + "prover_cost": 20190965242557, + "sequencer_cost": 5755252177023 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 323908763, - "congestion_multiplier": 2419274462, - "prover_cost": 185012822, - "sequencer_cost": 43208549 + "congestion_cost": 402457696, + "congestion_multiplier": 2549537632, + "prover_cost": 202116206, + "sequencer_cost": 57611398 } }, "parent_fee_header": { - "eth_per_fee_asset": 10033123, - "excess_mana": 655103485, - "mana_used": 199997101 + "eth_per_fee_asset": 10010230, + "excess_mana": 524943908, + "mana_used": 149999695 } }, { @@ -12499,21 +12499,21 @@ "blobs_needed": 2, "block_number": 10, "l1_block_number": 20973191, - "mana_spent": 199999803, - "size_in_fields": 6915, + "mana_spent": 149996998, + "size_in_fields": 5370, "slot_number": 10, "timestamp": 1729022183 }, "fee_header": { - "eth_per_fee_asset": 9993012, - "excess_mana": 849335860, - "mana_used": 199999803 + "eth_per_fee_asset": 9975083, + "excess_mana": 654393838, + "mana_used": 149996998 }, "oracle_input": { - "fee_asset_price_modifier": -7 + "fee_asset_price_modifier": -55 }, "outputs": { - "eth_per_fee_asset_at_execution": 10000013, + "eth_per_fee_asset_at_execution": 10030250, "l1_fee_oracle_output": { "base_fee": 14232502274, "blob_fee": 72 @@ -12530,44 +12530,44 @@ "slot_of_change": 10 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 38730625150188, - "congestion_multiplier": 2701272496, - "prover_cost": 18495934755285, - "sequencer_cost": 4269745249332 + "congestion_cost": 45811394730939, + "congestion_multiplier": 2775565163, + "prover_cost": 20125189800853, + "sequencer_cost": 5675831609382 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 387306755, - "congestion_multiplier": 2701272496, - "prover_cost": 184959588, - "sequencer_cost": 42697508 + "congestion_cost": 459499742, + "congestion_multiplier": 2775565163, + "prover_cost": 201860685, + "sequencer_cost": 56930010 } }, "parent_fee_header": { - "eth_per_fee_asset": 10000013, - "excess_mana": 755100586, - "mana_used": 194235274 + "eth_per_fee_asset": 10030250, + "excess_mana": 599943603, + "mana_used": 129450235 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 11, "l1_block_number": 20973194, - "mana_spent": 199980154, - "size_in_fields": 7275, + "mana_spent": 49434089, + "size_in_fields": 1800, "slot_number": 11, "timestamp": 1729022219 }, "fee_header": { - "eth_per_fee_asset": 9894081, - "excess_mana": 949335663, - "mana_used": 199980154 + "eth_per_fee_asset": 9972090, + "excess_mana": 729390836, + "mana_used": 49434089 }, "oracle_input": { - "fee_asset_price_modifier": -99 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 9993012, + "eth_per_fee_asset_at_execution": 9975083, "l1_fee_oracle_output": { "base_fee": 14232502274, "blob_fee": 72 @@ -12584,22 +12584,22 @@ "slot_of_change": 10 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 46395977409014, - "congestion_multiplier": 3036552198, - "prover_cost": 18508892814299, - "sequencer_cost": 4272736588328 + "congestion_cost": 55002024544558, + "congestion_multiplier": 3120052117, + "prover_cost": 20236491766535, + "sequencer_cost": 5707221684271 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 463635559, - "congestion_multiplier": 3036552198, - "prover_cost": 184959588, - "sequencer_cost": 42697508 + "congestion_cost": 548649760, + "congestion_multiplier": 3120052117, + "prover_cost": 201860685, + "sequencer_cost": 56930010 } }, "parent_fee_header": { - "eth_per_fee_asset": 9993012, - "excess_mana": 849335860, - "mana_used": 199999803 + "eth_per_fee_asset": 9975083, + "excess_mana": 654393838, + "mana_used": 149996998 } }, { @@ -12607,21 +12607,21 @@ "blobs_needed": 2, "block_number": 12, "l1_block_number": 20973197, - "mana_spent": 199994806, - "size_in_fields": 7365, + "mana_spent": 149986419, + "size_in_fields": 5190, "slot_number": 12, "timestamp": 1729022255 }, "fee_header": { - "eth_per_fee_asset": 9898038, - "excess_mana": 1049315817, - "mana_used": 199994806 + "eth_per_fee_asset": 10051866, + "excess_mana": 703824925, + "mana_used": 149986419 }, "oracle_input": { - "fee_asset_price_modifier": 4 + "fee_asset_price_modifier": 80 }, "outputs": { - "eth_per_fee_asset_at_execution": 9894081, + "eth_per_fee_asset_at_execution": 9972090, "l1_fee_oracle_output": { "base_fee": 14232502274, "blob_fee": 72 @@ -12638,22 +12638,22 @@ "slot_of_change": 10 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 55530206898448, - "congestion_multiplier": 3413368067, - "prover_cost": 18693963390840, - "sequencer_cost": 4315459717785 + "congestion_cost": 51852768777659, + "congestion_multiplier": 2998064412, + "prover_cost": 20242565500312, + "sequencer_cost": 5708934636571 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 549420365, - "congestion_multiplier": 3413368067, - "prover_cost": 184959588, - "sequencer_cost": 42697508 + "congestion_cost": 517080477, + "congestion_multiplier": 2998064412, + "prover_cost": 201860685, + "sequencer_cost": 56930010 } }, "parent_fee_header": { - "eth_per_fee_asset": 9894081, - "excess_mana": 949335663, - "mana_used": 199980154 + "eth_per_fee_asset": 9972090, + "excess_mana": 729390836, + "mana_used": 49434089 } }, { @@ -12661,21 +12661,21 @@ "blobs_needed": 2, "block_number": 13, "l1_block_number": 20973200, - "mana_spent": 199997366, - "size_in_fields": 7065, + "mana_spent": 149991702, + "size_in_fields": 5235, "slot_number": 13, "timestamp": 1729022291 }, "fee_header": { - "eth_per_fee_asset": 9997018, - "excess_mana": 1149310623, - "mana_used": 199997366 + "eth_per_fee_asset": 10102125, + "excess_mana": 778811344, + "mana_used": 149991702 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 50 }, "outputs": { - "eth_per_fee_asset_at_execution": 9898038, + "eth_per_fee_asset_at_execution": 10051866, "l1_fee_oracle_output": { "base_fee": 14232502274, "blob_fee": 72 @@ -12692,22 +12692,22 @@ "slot_of_change": 15 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65251867895436, - "congestion_multiplier": 3837010048, - "prover_cost": 18686489989229, - "sequencer_cost": 4313734499706 + "congestion_cost": 61019783490946, + "congestion_multiplier": 3370111057, + "prover_cost": 20081911657000, + "sequencer_cost": 5663626037196 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 645865468, - "congestion_multiplier": 3837010048, - "prover_cost": 184959588, - "sequencer_cost": 42697508 + "congestion_cost": 613362687, + "congestion_multiplier": 3370111057, + "prover_cost": 201860685, + "sequencer_cost": 56930010 } }, "parent_fee_header": { - "eth_per_fee_asset": 9898038, - "excess_mana": 1049315817, - "mana_used": 199994806 + "eth_per_fee_asset": 10051866, + "excess_mana": 703824925, + "mana_used": 149986419 } }, { @@ -12715,21 +12715,21 @@ "blobs_needed": 2, "block_number": 14, "l1_block_number": 20973203, - "mana_spent": 139638254, - "size_in_fields": 4830, + "mana_spent": 149997150, + "size_in_fields": 5340, "slot_number": 14, "timestamp": 1729022327 }, "fee_header": { - "eth_per_fee_asset": 10012013, - "excess_mana": 1249307989, - "mana_used": 139638254 + "eth_per_fee_asset": 10054645, + "excess_mana": 853803046, + "mana_used": 149997150 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -47 }, "outputs": { - "eth_per_fee_asset_at_execution": 9997018, + "eth_per_fee_asset_at_execution": 10102125, "l1_fee_oracle_output": { "base_fee": 14232502274, "blob_fee": 72 @@ -12746,22 +12746,22 @@ "slot_of_change": 15 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75450855945243, - "congestion_multiplier": 4313244254, - "prover_cost": 18501475940126, - "sequencer_cost": 4271024419482 + "congestion_cost": 71430632366953, + "congestion_multiplier": 3788358280, + "prover_cost": 19982002301496, + "sequencer_cost": 5635448977320 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 754283565, - "congestion_multiplier": 4313244254, - "prover_cost": 184959588, - "sequencer_cost": 42697508 + "congestion_cost": 721601177, + "congestion_multiplier": 3788358280, + "prover_cost": 201860685, + "sequencer_cost": 56930010 } }, "parent_fee_header": { - "eth_per_fee_asset": 9997018, - "excess_mana": 1149310623, - "mana_used": 199997366 + "eth_per_fee_asset": 10102125, + "excess_mana": 778811344, + "mana_used": 149991702 } }, { @@ -12769,21 +12769,21 @@ "blobs_needed": 2, "block_number": 15, "l1_block_number": 20973206, - "mana_spent": 130983339, - "size_in_fields": 4455, + "mana_spent": 149977643, + "size_in_fields": 5205, "slot_number": 15, "timestamp": 1729022363 }, "fee_header": { - "eth_per_fee_asset": 9998997, - "excess_mana": 1288946243, - "mana_used": 130983339 + "eth_per_fee_asset": 10058666, + "excess_mana": 928800196, + "mana_used": 149977643 }, "oracle_input": { - "fee_asset_price_modifier": -13 + "fee_asset_price_modifier": 4 }, "outputs": { - "eth_per_fee_asset_at_execution": 10012013, + "eth_per_fee_asset_at_execution": 10054645, "l1_fee_oracle_output": { "base_fee": 15618137990, "blob_fee": 87 @@ -12800,22 +12800,22 @@ "slot_of_change": 15 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81606223643538, - "congestion_multiplier": 4517989552, - "prover_cost": 18517015509269, - "sequencer_cost": 4679819632676 + "congestion_cost": 86339730542451, + "congestion_multiplier": 4258548217, + "prover_cost": 20283076926138, + "sequencer_cost": 6213302707356 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 817042572, - "congestion_multiplier": 4517989552, - "prover_cost": 185392600, - "sequencer_cost": 46854415 + "congestion_cost": 868115340, + "congestion_multiplier": 4258548217, + "prover_cost": 203939138, + "sequencer_cost": 62472553 } }, "parent_fee_header": { - "eth_per_fee_asset": 10012013, - "excess_mana": 1249307989, - "mana_used": 139638254 + "eth_per_fee_asset": 10054645, + "excess_mana": 853803046, + "mana_used": 149997150 } }, { @@ -12823,21 +12823,21 @@ "blobs_needed": 1, "block_number": 16, "l1_block_number": 20973209, - "mana_spent": 101109540, - "size_in_fields": 3690, + "mana_spent": 96048244, + "size_in_fields": 3360, "slot_number": 16, "timestamp": 1729022399 }, "fee_header": { - "eth_per_fee_asset": 9944002, - "excess_mana": 1319929582, - "mana_used": 101109540 + "eth_per_fee_asset": 10065707, + "excess_mana": 1003777839, + "mana_used": 96048244 }, "oracle_input": { - "fee_asset_price_modifier": -55 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 9998997, + "eth_per_fee_asset_at_execution": 10058666, "l1_fee_oracle_output": { "base_fee": 15618137990, "blob_fee": 87 @@ -12854,22 +12854,22 @@ "slot_of_change": 15 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85586353611268, - "congestion_multiplier": 4684773703, - "prover_cost": 18541119674304, - "sequencer_cost": 4685911496924 + "congestion_cost": 100300348873300, + "congestion_multiplier": 4786949836, + "prover_cost": 20274968668808, + "sequencer_cost": 6210818909784 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 855777693, - "congestion_multiplier": 4684773703, - "prover_cost": 185392600, - "sequencer_cost": 46854415 + "congestion_cost": 1008887709, + "congestion_multiplier": 4786949836, + "prover_cost": 203939138, + "sequencer_cost": 62472553 } }, "parent_fee_header": { - "eth_per_fee_asset": 9998997, - "excess_mana": 1288946243, - "mana_used": 130983339 + "eth_per_fee_asset": 10058666, + "excess_mana": 928800196, + "mana_used": 149977643 } }, { @@ -12877,21 +12877,21 @@ "blobs_needed": 1, "block_number": 17, "l1_block_number": 20973212, - "mana_spent": 90861771, - "size_in_fields": 3165, + "mana_spent": 78003156, + "size_in_fields": 2745, "slot_number": 17, "timestamp": 1729022435 }, "fee_header": { - "eth_per_fee_asset": 9905220, - "excess_mana": 1321039122, - "mana_used": 90861771 + "eth_per_fee_asset": 10007325, + "excess_mana": 1024826083, + "mana_used": 78003156 }, "oracle_input": { - "fee_asset_price_modifier": -39 + "fee_asset_price_modifier": -58 }, "outputs": { - "eth_per_fee_asset_at_execution": 9944002, + "eth_per_fee_asset_at_execution": 10065707, "l1_fee_oracle_output": { "base_fee": 15618137990, "blob_fee": 87 @@ -12908,22 +12908,22 @@ "slot_of_change": 15 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86201817135596, - "congestion_multiplier": 4690859247, - "prover_cost": 18643660771589, - "sequencer_cost": 4711826787646 + "congestion_cost": 104459385614940, + "congestion_multiplier": 4946739595, + "prover_cost": 20260786251776, + "sequencer_cost": 6206474418539 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 857191042, - "congestion_multiplier": 4690859247, - "prover_cost": 185392600, - "sequencer_cost": 46854415 + "congestion_cost": 1051457569, + "congestion_multiplier": 4946739595, + "prover_cost": 203939138, + "sequencer_cost": 62472553 } }, "parent_fee_header": { - "eth_per_fee_asset": 9944002, - "excess_mana": 1319929582, - "mana_used": 101109540 + "eth_per_fee_asset": 10065707, + "excess_mana": 1003777839, + "mana_used": 96048244 } }, { @@ -12931,21 +12931,21 @@ "blobs_needed": 1, "block_number": 18, "l1_block_number": 20973215, - "mana_spent": 113552519, - "size_in_fields": 3960, + "mana_spent": 66398614, + "size_in_fields": 2460, "slot_number": 18, "timestamp": 1729022471 }, "fee_header": { - "eth_per_fee_asset": 9907201, - "excess_mana": 1311900893, - "mana_used": 113552519 + "eth_per_fee_asset": 10049355, + "excess_mana": 1027829239, + "mana_used": 66398614 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 9905220, + "eth_per_fee_asset_at_execution": 10007325, "l1_fee_oracle_output": { "base_fee": 15618137990, "blob_fee": 87 @@ -12962,22 +12962,22 @@ "slot_of_change": 20 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85369644894309, - "congestion_multiplier": 4640973016, - "prover_cost": 18716656470023, - "sequencer_cost": 4730275046895 + "congestion_cost": 105687201225103, + "congestion_multiplier": 4969969063, + "prover_cost": 20378986192614, + "sequencer_cost": 6242682535044 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 845605114, - "congestion_multiplier": 4640973016, - "prover_cost": 185392600, - "sequencer_cost": 46854415 + "congestion_cost": 1057646171, + "congestion_multiplier": 4969969063, + "prover_cost": 203939138, + "sequencer_cost": 62472553 } }, "parent_fee_header": { - "eth_per_fee_asset": 9905220, - "excess_mana": 1321039122, - "mana_used": 90861771 + "eth_per_fee_asset": 10007325, + "excess_mana": 1024826083, + "mana_used": 78003156 } }, { @@ -12985,21 +12985,21 @@ "blobs_needed": 1, "block_number": 19, "l1_block_number": 20973218, - "mana_spent": 3811169, - "size_in_fields": 120, + "mana_spent": 71247989, + "size_in_fields": 2520, "slot_number": 19, "timestamp": 1729022507 }, "fee_header": { - "eth_per_fee_asset": 9851720, - "excess_mana": 1325453412, - "mana_used": 3811169 + "eth_per_fee_asset": 10027246, + "excess_mana": 1019227853, + "mana_used": 71247989 }, "oracle_input": { - "fee_asset_price_modifier": -56 + "fee_asset_price_modifier": -22 }, "outputs": { - "eth_per_fee_asset_at_execution": 9907201, + "eth_per_fee_asset_at_execution": 10049355, "l1_fee_oracle_output": { "base_fee": 15618137990, "blob_fee": 87 @@ -13016,44 +13016,44 @@ "slot_of_change": 20 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87091423601884, - "congestion_multiplier": 4715148888, - "prover_cost": 18712913970354, - "sequencer_cost": 4729329202063 + "congestion_cost": 103489070990129, + "congestion_multiplier": 4903726632, + "prover_cost": 20293753977246, + "sequencer_cost": 6216573401975 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 862832239, - "congestion_multiplier": 4715148888, - "prover_cost": 185392600, - "sequencer_cost": 46854415 + "congestion_cost": 1039998413, + "congestion_multiplier": 4903726632, + "prover_cost": 203939138, + "sequencer_cost": 62472553 } }, "parent_fee_header": { - "eth_per_fee_asset": 9907201, - "excess_mana": 1311900893, - "mana_used": 113552519 + "eth_per_fee_asset": 10049355, + "excess_mana": 1027829239, + "mana_used": 66398614 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 20, "l1_block_number": 20973221, - "mana_spent": 169171976, - "size_in_fields": 6045, + "mana_spent": 86675107, + "size_in_fields": 2805, "slot_number": 20, "timestamp": 1729022543 }, "fee_header": { - "eth_per_fee_asset": 9862556, - "excess_mana": 1229264581, - "mana_used": 169171976 + "eth_per_fee_asset": 10005186, + "excess_mana": 1015475842, + "mana_used": 86675107 }, "oracle_input": { - "fee_asset_price_modifier": 11 + "fee_asset_price_modifier": -22 }, "outputs": { - "eth_per_fee_asset_at_execution": 9851720, + "eth_per_fee_asset_at_execution": 10027246, "l1_fee_oracle_output": { "base_fee": 18840462804, "blob_fee": 200 @@ -13070,44 +13070,44 @@ "slot_of_change": 20 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 79231967209787, - "congestion_multiplier": 4213272075, - "prover_cost": 18920510936162, - "sequencer_cost": 5737210355147 + "congestion_cost": 109806009745847, + "congestion_multiplier": 4875108282, + "prover_cost": 20820534970420, + "sequencer_cost": 7515708001978 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780571156, - "congestion_multiplier": 4213272075, - "prover_cost": 186399576, - "sequencer_cost": 56521390 + "congestion_cost": 1101051872, + "congestion_multiplier": 4875108282, + "prover_cost": 208772626, + "sequencer_cost": 75361853 } }, "parent_fee_header": { - "eth_per_fee_asset": 9851720, - "excess_mana": 1325453412, - "mana_used": 3811169 + "eth_per_fee_asset": 10027246, + "excess_mana": 1019227853, + "mana_used": 71247989 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 21, "l1_block_number": 20973224, - "mana_spent": 116699575, - "size_in_fields": 4455, + "mana_spent": 74992814, + "size_in_fields": 2580, "slot_number": 21, "timestamp": 1729022579 }, "fee_header": { - "eth_per_fee_asset": 9945401, - "excess_mana": 1298436557, - "mana_used": 116699575 + "eth_per_fee_asset": 9974169, + "excess_mana": 1027150949, + "mana_used": 74992814 }, "oracle_input": { - "fee_asset_price_modifier": 84 + "fee_asset_price_modifier": -31 }, "outputs": { - "eth_per_fee_asset_at_execution": 9862556, + "eth_per_fee_asset_at_execution": 10005186, "l1_fee_oracle_output": { "base_fee": 18840462804, "blob_fee": 200 @@ -13124,22 +13124,22 @@ "slot_of_change": 20 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87892810241078, - "congestion_multiplier": 4568435353, - "prover_cost": 18899722952144, - "sequencer_cost": 5730906876473 + "congestion_cost": 112592774387203, + "congestion_multiplier": 4964712959, + "prover_cost": 20866441263561, + "sequencer_cost": 7532279060080 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 866847763, - "congestion_multiplier": 4568435353, - "prover_cost": 186399576, - "sequencer_cost": 56521390 + "congestion_cost": 1126511650, + "congestion_multiplier": 4964712959, + "prover_cost": 208772626, + "sequencer_cost": 75361853 } }, "parent_fee_header": { - "eth_per_fee_asset": 9862556, - "excess_mana": 1229264581, - "mana_used": 169171976 + "eth_per_fee_asset": 10005186, + "excess_mana": 1015475842, + "mana_used": 86675107 } }, { @@ -13147,21 +13147,21 @@ "blobs_needed": 1, "block_number": 22, "l1_block_number": 20973227, - "mana_spent": 108288843, - "size_in_fields": 3885, + "mana_spent": 70592029, + "size_in_fields": 2595, "slot_number": 22, "timestamp": 1729022615 }, "fee_header": { - "eth_per_fee_asset": 9922526, - "excess_mana": 1315136132, - "mana_used": 108288843 + "eth_per_fee_asset": 10030024, + "excess_mana": 1027143763, + "mana_used": 70592029 }, "oracle_input": { - "fee_asset_price_modifier": -23 + "fee_asset_price_modifier": 56 }, "outputs": { - "eth_per_fee_asset_at_execution": 9945401, + "eth_per_fee_asset_at_execution": 9974169, "l1_fee_oracle_output": { "base_fee": 18840462804, "blob_fee": 200 @@ -13178,22 +13178,22 @@ "slot_of_change": 20 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89362329080547, - "congestion_multiplier": 4658573454, - "prover_cost": 18742288621646, - "sequencer_cost": 5683168531868 + "congestion_cost": 112941322429969, + "congestion_multiplier": 4964657304, + "prover_cost": 20931330319348, + "sequencer_cost": 7555702434960 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 888744197, - "congestion_multiplier": 4658573454, - "prover_cost": 186399576, - "sequencer_cost": 56521390 + "congestion_cost": 1126495837, + "congestion_multiplier": 4964657304, + "prover_cost": 208772626, + "sequencer_cost": 75361853 } }, "parent_fee_header": { - "eth_per_fee_asset": 9945401, - "excess_mana": 1298436557, - "mana_used": 116699575 + "eth_per_fee_asset": 9974169, + "excess_mana": 1027150949, + "mana_used": 74992814 } }, { @@ -13201,21 +13201,21 @@ "blobs_needed": 1, "block_number": 23, "l1_block_number": 20973230, - "mana_spent": 88856056, - "size_in_fields": 3210, + "mana_spent": 66309082, + "size_in_fields": 2475, "slot_number": 23, "timestamp": 1729022651 }, "fee_header": { - "eth_per_fee_asset": 9932448, - "excess_mana": 1323424975, - "mana_used": 88856056 + "eth_per_fee_asset": 10046072, + "excess_mana": 1022735792, + "mana_used": 66309082 }, "oracle_input": { - "fee_asset_price_modifier": 10 + "fee_asset_price_modifier": 16 }, "outputs": { - "eth_per_fee_asset_at_execution": 9922526, + "eth_per_fee_asset_at_execution": 10030024, "l1_fee_oracle_output": { "base_fee": 18840462804, "blob_fee": 200 @@ -13232,22 +13232,22 @@ "slot_of_change": 25 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90679773880160, - "congestion_multiplier": 4703971829, - "prover_cost": 18785496354457, - "sequencer_cost": 5696270284402 + "congestion_cost": 111348587401187, + "congestion_multiplier": 4930635271, + "prover_cost": 20814768339538, + "sequencer_cost": 7513626388133 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 899772414, - "congestion_multiplier": 4703971829, - "prover_cost": 186399576, - "sequencer_cost": 56521390 + "congestion_cost": 1116829004, + "congestion_multiplier": 4930635271, + "prover_cost": 208772626, + "sequencer_cost": 75361853 } }, "parent_fee_header": { - "eth_per_fee_asset": 9922526, - "excess_mana": 1315136132, - "mana_used": 108288843 + "eth_per_fee_asset": 10030024, + "excess_mana": 1027143763, + "mana_used": 70592029 } }, { @@ -13255,21 +13255,21 @@ "blobs_needed": 1, "block_number": 24, "l1_block_number": 20973233, - "mana_spent": 109097532, - "size_in_fields": 3885, + "mana_spent": 79319888, + "size_in_fields": 2925, "slot_number": 24, "timestamp": 1729022687 }, "fee_header": { - "eth_per_fee_asset": 9911589, - "excess_mana": 1312281031, - "mana_used": 109097532 + "eth_per_fee_asset": 9980772, + "excess_mana": 1014044874, + "mana_used": 79319888 }, "oracle_input": { - "fee_asset_price_modifier": -21 + "fee_asset_price_modifier": -65 }, "outputs": { - "eth_per_fee_asset_at_execution": 9932448, + "eth_per_fee_asset_at_execution": 10046072, "l1_fee_oracle_output": { "base_fee": 18840462804, "blob_fee": 200 @@ -13286,22 +13286,22 @@ "slot_of_change": 25 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89098902204170, - "congestion_multiplier": 4643037601, - "prover_cost": 18766730618676, - "sequencer_cost": 5690580006057 + "congestion_cost": 109292781895253, + "congestion_multiplier": 4864237667, + "prover_cost": 20781517990316, + "sequencer_cost": 7501623818743 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 884970213, - "congestion_multiplier": 4643037601, - "prover_cost": 186399576, - "sequencer_cost": 56521390 + "congestion_cost": 1097963156, + "congestion_multiplier": 4864237667, + "prover_cost": 208772626, + "sequencer_cost": 75361853 } }, "parent_fee_header": { - "eth_per_fee_asset": 9932448, - "excess_mana": 1323424975, - "mana_used": 88856056 + "eth_per_fee_asset": 10046072, + "excess_mana": 1022735792, + "mana_used": 66309082 } }, { @@ -13309,21 +13309,21 @@ "blobs_needed": 1, "block_number": 25, "l1_block_number": 20973236, - "mana_spent": 99173529, - "size_in_fields": 3555, + "mana_spent": 75094437, + "size_in_fields": 2640, "slot_number": 25, "timestamp": 1729022723 }, "fee_header": { - "eth_per_fee_asset": 9862031, - "excess_mana": 1321378563, - "mana_used": 99173529 + "eth_per_fee_asset": 9967796, + "excess_mana": 1018364762, + "mana_used": 75094437 }, "oracle_input": { - "fee_asset_price_modifier": -50 + "fee_asset_price_modifier": -13 }, "outputs": { - "eth_per_fee_asset_at_execution": 9911589, + "eth_per_fee_asset_at_execution": 9980772, "l1_fee_oracle_output": { "base_fee": 19428171353, "blob_fee": 216 @@ -13340,22 +13340,22 @@ "slot_of_change": 25 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 91229435260078, - "congestion_multiplier": 4692722572, - "prover_cost": 18824755041801, - "sequencer_cost": 5880441067523 + "congestion_cost": 112206317006340, + "congestion_multiplier": 4897128589, + "prover_cost": 21005808869294, + "sequencer_cost": 7786240082431 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 904228667, - "congestion_multiplier": 4692722572, - "prover_cost": 186583235, - "sequencer_cost": 58284515 + "congestion_cost": 1119905667, + "congestion_multiplier": 4897128589, + "prover_cost": 209654189, + "sequencer_cost": 77712687 } }, "parent_fee_header": { - "eth_per_fee_asset": 9911589, - "excess_mana": 1312281031, - "mana_used": 109097532 + "eth_per_fee_asset": 9980772, + "excess_mana": 1014044874, + "mana_used": 79319888 } }, { @@ -13363,21 +13363,21 @@ "blobs_needed": 1, "block_number": 26, "l1_block_number": 20973239, - "mana_spent": 96238827, - "size_in_fields": 3360, + "mana_spent": 76561267, + "size_in_fields": 2535, "slot_number": 26, "timestamp": 1729022759 }, "fee_header": { - "eth_per_fee_asset": 9912327, - "excess_mana": 1320552092, - "mana_used": 96238827 + "eth_per_fee_asset": 10037570, + "excess_mana": 1018459199, + "mana_used": 76561267 }, "oracle_input": { - "fee_asset_price_modifier": 51 + "fee_asset_price_modifier": 70 }, "outputs": { - "eth_per_fee_asset_at_execution": 9862031, + "eth_per_fee_asset_at_execution": 9967796, "l1_fee_oracle_output": { "base_fee": 19428171353, "blob_fee": 216 @@ -13394,22 +13394,22 @@ "slot_of_change": 25 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 91575260815952, - "congestion_multiplier": 4688187039, - "prover_cost": 18919351906317, - "sequencer_cost": 5909991055595 + "congestion_cost": 112373187111775, + "congestion_multiplier": 4897850096, + "prover_cost": 21033154069365, + "sequencer_cost": 7796376149753 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 903118061, - "congestion_multiplier": 4688187039, - "prover_cost": 186583235, - "sequencer_cost": 58284515 + "congestion_cost": 1120113005, + "congestion_multiplier": 4897850096, + "prover_cost": 209654189, + "sequencer_cost": 77712687 } }, "parent_fee_header": { - "eth_per_fee_asset": 9862031, - "excess_mana": 1321378563, - "mana_used": 99173529 + "eth_per_fee_asset": 9967796, + "excess_mana": 1018364762, + "mana_used": 75094437 } }, { @@ -13417,21 +13417,21 @@ "blobs_needed": 1, "block_number": 27, "l1_block_number": 20973242, - "mana_spent": 101241973, - "size_in_fields": 3450, + "mana_spent": 78931126, + "size_in_fields": 2820, "slot_number": 27, "timestamp": 1729022795 }, "fee_header": { - "eth_per_fee_asset": 9942063, - "excess_mana": 1316790919, - "mana_used": 101241973 + "eth_per_fee_asset": 10109840, + "excess_mana": 1020020466, + "mana_used": 78931126 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": 72 }, "outputs": { - "eth_per_fee_asset_at_execution": 9912327, + "eth_per_fee_asset_at_execution": 10037570, "l1_fee_oracle_output": { "base_fee": 19428171353, "blob_fee": 216 @@ -13448,22 +13448,22 @@ "slot_of_change": 25 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90602072147136, - "congestion_multiplier": 4667601659, - "prover_cost": 18823353487027, - "sequencer_cost": 5880003252516 + "congestion_cost": 111933984719410, + "congestion_multiplier": 4909793723, + "prover_cost": 20886946641469, + "sequencer_cost": 7742181324763 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 898077366, - "congestion_multiplier": 4667601659, - "prover_cost": 186583235, - "sequencer_cost": 58284515 + "congestion_cost": 1123545207, + "congestion_multiplier": 4909793723, + "prover_cost": 209654189, + "sequencer_cost": 77712687 } }, "parent_fee_header": { - "eth_per_fee_asset": 9912327, - "excess_mana": 1320552092, - "mana_used": 96238827 + "eth_per_fee_asset": 10037570, + "excess_mana": 1018459199, + "mana_used": 76561267 } }, { @@ -13471,21 +13471,21 @@ "blobs_needed": 1, "block_number": 28, "l1_block_number": 20973245, - "mana_spent": 84069586, - "size_in_fields": 3075, + "mana_spent": 74990948, + "size_in_fields": 2610, "slot_number": 28, "timestamp": 1729022831 }, "fee_header": { - "eth_per_fee_asset": 9998732, - "excess_mana": 1318032892, - "mana_used": 84069586 + "eth_per_fee_asset": 10050191, + "excess_mana": 1023951592, + "mana_used": 74990948 }, "oracle_input": { - "fee_asset_price_modifier": 57 + "fee_asset_price_modifier": -59 }, "outputs": { - "eth_per_fee_asset_at_execution": 9942063, + "eth_per_fee_asset_at_execution": 10109840, "l1_fee_oracle_output": { "base_fee": 19428171353, "blob_fee": 216 @@ -13502,22 +13502,22 @@ "slot_of_change": 30 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90498259365285, - "congestion_multiplier": 4674389121, - "prover_cost": 18767054181814, - "sequencer_cost": 5862416582957 + "congestion_cost": 111992305615124, + "congestion_multiplier": 4939995825, + "prover_cost": 20737636698504, + "sequencer_cost": 7686836488016 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 899739396, - "congestion_multiplier": 4674389121, - "prover_cost": 186583235, - "sequencer_cost": 58284515 + "congestion_cost": 1132224291, + "congestion_multiplier": 4939995825, + "prover_cost": 209654189, + "sequencer_cost": 77712687 } }, "parent_fee_header": { - "eth_per_fee_asset": 9942063, - "excess_mana": 1316790919, - "mana_used": 101241973 + "eth_per_fee_asset": 10109840, + "excess_mana": 1020020466, + "mana_used": 78931126 } }, { @@ -13525,21 +13525,21 @@ "blobs_needed": 1, "block_number": 29, "l1_block_number": 20973248, - "mana_spent": 101851439, - "size_in_fields": 3615, + "mana_spent": 63067441, + "size_in_fields": 2370, "slot_number": 29, "timestamp": 1729022867 }, "fee_header": { - "eth_per_fee_asset": 10045726, - "excess_mana": 1302102478, - "mana_used": 101851439 + "eth_per_fee_asset": 10078331, + "excess_mana": 1023942540, + "mana_used": 63067441 }, "oracle_input": { - "fee_asset_price_modifier": 47 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 9998732, + "eth_per_fee_asset_at_execution": 10050191, "l1_fee_oracle_output": { "base_fee": 19428171353, "blob_fee": 216 @@ -13556,22 +13556,22 @@ "slot_of_change": 30 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87871454700457, - "congestion_multiplier": 4588072037, - "prover_cost": 18660689675451, - "sequencer_cost": 5829190641374 + "congestion_cost": 112654997800540, + "congestion_multiplier": 4939926067, + "prover_cost": 20860716875929, + "sequencer_cost": 7732458716457 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 878603126, - "congestion_multiplier": 4588072037, - "prover_cost": 186583235, - "sequencer_cost": 58284515 + "congestion_cost": 1132204245, + "congestion_multiplier": 4939926067, + "prover_cost": 209654189, + "sequencer_cost": 77712687 } }, "parent_fee_header": { - "eth_per_fee_asset": 9998732, - "excess_mana": 1318032892, - "mana_used": 84069586 + "eth_per_fee_asset": 10050191, + "excess_mana": 1023951592, + "mana_used": 74990948 } }, { @@ -13579,21 +13579,21 @@ "blobs_needed": 1, "block_number": 30, "l1_block_number": 20973251, - "mana_spent": 116198090, - "size_in_fields": 4065, + "mana_spent": 86036616, + "size_in_fields": 2925, "slot_number": 30, "timestamp": 1729022903 }, "fee_header": { - "eth_per_fee_asset": 9978419, - "excess_mana": 1303953917, - "mana_used": 116198090 + "eth_per_fee_asset": 10145855, + "excess_mana": 1012009981, + "mana_used": 86036616 }, "oracle_input": { - "fee_asset_price_modifier": -67 + "fee_asset_price_modifier": 67 }, "outputs": { - "eth_per_fee_asset_at_execution": 10045726, + "eth_per_fee_asset_at_execution": 10078331, "l1_fee_oracle_output": { "base_fee": 18976916853, "blob_fee": 333 @@ -13610,22 +13610,22 @@ "slot_of_change": 30 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87167533536153, - "congestion_multiplier": 4598021416, - "prover_cost": 18559357282889, - "sequencer_cost": 5667161537156 + "congestion_cost": 108794925270861, + "congestion_multiplier": 4848820952, + "prover_cost": 20735308951453, + "sequencer_cost": 7531769893250 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 875661158, - "congestion_multiplier": 4598021416, - "prover_cost": 186442218, - "sequencer_cost": 56930752 + "congestion_cost": 1096471268, + "congestion_multiplier": 4848820952, + "prover_cost": 208977307, + "sequencer_cost": 75907670 } }, "parent_fee_header": { - "eth_per_fee_asset": 10045726, - "excess_mana": 1302102478, - "mana_used": 101851439 + "eth_per_fee_asset": 10078331, + "excess_mana": 1023942540, + "mana_used": 63067441 } }, { @@ -13633,21 +13633,21 @@ "blobs_needed": 1, "block_number": 31, "l1_block_number": 20973254, - "mana_spent": 89038424, - "size_in_fields": 3270, + "mana_spent": 78213375, + "size_in_fields": 2625, "slot_number": 31, "timestamp": 1729022939 }, "fee_header": { - "eth_per_fee_asset": 9993386, - "excess_mana": 1320152007, - "mana_used": 89038424 + "eth_per_fee_asset": 10157015, + "excess_mana": 1023046597, + "mana_used": 78213375 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 9978419, + "eth_per_fee_asset_at_execution": 10145855, "l1_fee_oracle_output": { "base_fee": 18976916853, "blob_fee": 333 @@ -13664,22 +13664,22 @@ "slot_of_change": 30 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89901122312062, - "congestion_multiplier": 4685993014, - "prover_cost": 18684544916385, - "sequencer_cost": 5705387997839 + "congestion_cost": 110435262774799, + "congestion_multiplier": 4933026498, + "prover_cost": 20597308654619, + "sequencer_cost": 7481643488893 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 897071067, - "congestion_multiplier": 4685993014, - "prover_cost": 186442218, - "sequencer_cost": 56930752 + "congestion_cost": 1120460163, + "congestion_multiplier": 4933026498, + "prover_cost": 208977307, + "sequencer_cost": 75907670 } }, "parent_fee_header": { - "eth_per_fee_asset": 9978419, - "excess_mana": 1303953917, - "mana_used": 116198090 + "eth_per_fee_asset": 10145855, + "excess_mana": 1012009981, + "mana_used": 86036616 } }, { @@ -13687,21 +13687,21 @@ "blobs_needed": 1, "block_number": 32, "l1_block_number": 20973257, - "mana_spent": 90584655, - "size_in_fields": 3285, + "mana_spent": 81709051, + "size_in_fields": 2715, "slot_number": 32, "timestamp": 1729022975 }, "fee_header": { - "eth_per_fee_asset": 10093319, - "excess_mana": 1309190431, - "mana_used": 90584655 + "eth_per_fee_asset": 10168187, + "excess_mana": 1026259972, + "mana_used": 81709051 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 9993386, + "eth_per_fee_asset_at_execution": 10157015, "l1_fee_oracle_output": { "base_fee": 18976916853, "blob_fee": 333 @@ -13718,22 +13718,22 @@ "slot_of_change": 30 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88312231009590, - "congestion_multiplier": 4626278686, - "prover_cost": 18656561249611, - "sequencer_cost": 5696843092022 + "congestion_cost": 111009253702983, + "congestion_multiplier": 4957817178, + "prover_cost": 20574677402761, + "sequencer_cost": 7473423048012 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 882538213, - "congestion_multiplier": 4626278686, - "prover_cost": 186442218, - "sequencer_cost": 56930752 + "congestion_cost": 1127522655, + "congestion_multiplier": 4957817178, + "prover_cost": 208977307, + "sequencer_cost": 75907670 } }, "parent_fee_header": { - "eth_per_fee_asset": 9993386, - "excess_mana": 1320152007, - "mana_used": 89038424 + "eth_per_fee_asset": 10157015, + "excess_mana": 1023046597, + "mana_used": 78213375 } }, { @@ -13741,21 +13741,21 @@ "blobs_needed": 1, "block_number": 33, "l1_block_number": 20973260, - "mana_spent": 117347997, - "size_in_fields": 3930, + "mana_spent": 75072460, + "size_in_fields": 2415, "slot_number": 33, "timestamp": 1729023011 }, "fee_header": { - "eth_per_fee_asset": 10072123, - "excess_mana": 1299775086, - "mana_used": 117347997 + "eth_per_fee_asset": 10232246, + "excess_mana": 1032969023, + "mana_used": 75072460 }, "oracle_input": { - "fee_asset_price_modifier": -21 + "fee_asset_price_modifier": 63 }, "outputs": { - "eth_per_fee_asset_at_execution": 10093319, + "eth_per_fee_asset_at_execution": 10168187, "l1_fee_oracle_output": { "base_fee": 18976916853, "blob_fee": 333 @@ -13772,22 +13772,22 @@ "slot_of_change": 35 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86215772334155, - "congestion_multiplier": 4575595489, - "prover_cost": 18471844395288, - "sequencer_cost": 5640439185565 + "congestion_cost": 112348711722159, + "congestion_multiplier": 5009978774, + "prover_cost": 20552071573822, + "sequencer_cost": 7465211841600 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 870203293, - "congestion_multiplier": 4575595489, - "prover_cost": 186442218, - "sequencer_cost": 56930752 + "congestion_cost": 1142382710, + "congestion_multiplier": 5009978774, + "prover_cost": 208977307, + "sequencer_cost": 75907670 } }, "parent_fee_header": { - "eth_per_fee_asset": 10093319, - "excess_mana": 1309190431, - "mana_used": 90584655 + "eth_per_fee_asset": 10168187, + "excess_mana": 1026259972, + "mana_used": 81709051 } }, { @@ -13795,21 +13795,21 @@ "blobs_needed": 1, "block_number": 34, "l1_block_number": 20973263, - "mana_spent": 106582629, - "size_in_fields": 3555, + "mana_spent": 69715797, + "size_in_fields": 2535, "slot_number": 34, "timestamp": 1729023047 }, "fee_header": { - "eth_per_fee_asset": 10066079, - "excess_mana": 1317123083, - "mana_used": 106582629 + "eth_per_fee_asset": 10291593, + "excess_mana": 1033041483, + "mana_used": 69715797 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 58 }, "outputs": { - "eth_per_fee_asset_at_execution": 10072123, + "eth_per_fee_asset_at_execution": 10232246, "l1_fee_oracle_output": { "base_fee": 18976916853, "blob_fee": 333 @@ -13826,22 +13826,22 @@ "slot_of_change": 35 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88664193934090, - "congestion_multiplier": 4669415990, - "prover_cost": 18510716956098, - "sequencer_cost": 5652309051429 + "congestion_cost": 111661120539909, + "congestion_multiplier": 5010545122, + "prover_cost": 20423405281695, + "sequencer_cost": 7418475865417 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 893036667, - "congestion_multiplier": 4669415990, - "prover_cost": 186442218, - "sequencer_cost": 56930752 + "congestion_cost": 1142544054, + "congestion_multiplier": 5010545122, + "prover_cost": 208977307, + "sequencer_cost": 75907670 } }, "parent_fee_header": { - "eth_per_fee_asset": 10072123, - "excess_mana": 1299775086, - "mana_used": 117347997 + "eth_per_fee_asset": 10232246, + "excess_mana": 1032969023, + "mana_used": 75072460 } }, { @@ -13849,21 +13849,21 @@ "blobs_needed": 1, "block_number": 35, "l1_block_number": 20973266, - "mana_spent": 101256189, - "size_in_fields": 3435, + "mana_spent": 80963126, + "size_in_fields": 2760, "slot_number": 35, "timestamp": 1729023083 }, "fee_header": { - "eth_per_fee_asset": 10021788, - "excess_mana": 1323705712, - "mana_used": 101256189 + "eth_per_fee_asset": 10228814, + "excess_mana": 1027757280, + "mana_used": 80963126 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": -61 }, "outputs": { - "eth_per_fee_asset_at_execution": 10066079, + "eth_per_fee_asset_at_execution": 10291593, "l1_fee_oracle_output": { "base_fee": 20847107469, "blob_fee": 320 @@ -13880,22 +13880,22 @@ "slot_of_change": 35 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 91870769243914, - "congestion_multiplier": 4705517160, - "prover_cost": 18579891236698, - "sequencer_cost": 6213077008436 + "congestion_cost": 113845851463423, + "congestion_multiplier": 4969411185, + "prover_cost": 20578213013282, + "sequencer_cost": 8102577705901 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 924778421, - "congestion_multiplier": 4705517160, - "prover_cost": 187026653, - "sequencer_cost": 62541324 + "congestion_cost": 1171655168, + "congestion_multiplier": 4969411185, + "prover_cost": 211782593, + "sequencer_cost": 83388432 } }, "parent_fee_header": { - "eth_per_fee_asset": 10066079, - "excess_mana": 1317123083, - "mana_used": 106582629 + "eth_per_fee_asset": 10291593, + "excess_mana": 1033041483, + "mana_used": 69715797 } }, { @@ -13903,21 +13903,21 @@ "blobs_needed": 1, "block_number": 36, "l1_block_number": 20973269, - "mana_spent": 91549596, - "size_in_fields": 3270, + "mana_spent": 75863625, + "size_in_fields": 2715, "slot_number": 36, "timestamp": 1729023119 }, "fee_header": { - "eth_per_fee_asset": 10079914, - "excess_mana": 1324961901, - "mana_used": 91549596 + "eth_per_fee_asset": 10235974, + "excess_mana": 1033720406, + "mana_used": 75863625 }, "oracle_input": { - "fee_asset_price_modifier": 58 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 10021788, + "eth_per_fee_asset_at_execution": 10228814, "l1_fee_oracle_output": { "base_fee": 20847107469, "blob_fee": 320 @@ -13934,22 +13934,22 @@ "slot_of_change": 35 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92449139315260, - "congestion_multiplier": 4712438137, - "prover_cost": 18662004524542, - "sequencer_cost": 6240535521207 + "congestion_cost": 115884788598170, + "congestion_multiplier": 5015854701, + "prover_cost": 20704511099723, + "sequencer_cost": 8152307002552 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 926505675, - "congestion_multiplier": 4712438137, - "prover_cost": 187026653, - "sequencer_cost": 62541324 + "congestion_cost": 1185363948, + "congestion_multiplier": 5015854701, + "prover_cost": 211782593, + "sequencer_cost": 83388432 } }, "parent_fee_header": { - "eth_per_fee_asset": 10021788, - "excess_mana": 1323705712, - "mana_used": 101256189 + "eth_per_fee_asset": 10228814, + "excess_mana": 1027757280, + "mana_used": 80963126 } }, { @@ -13957,21 +13957,21 @@ "blobs_needed": 1, "block_number": 37, "l1_block_number": 20973272, - "mana_spent": 100384382, - "size_in_fields": 3435, + "mana_spent": 69511185, + "size_in_fields": 2445, "slot_number": 37, "timestamp": 1729023155 }, "fee_header": { - "eth_per_fee_asset": 10104105, - "excess_mana": 1316511497, - "mana_used": 100384382 + "eth_per_fee_asset": 10293295, + "excess_mana": 1034584031, + "mana_used": 69511185 }, "oracle_input": { - "fee_asset_price_modifier": 24 + "fee_asset_price_modifier": 56 }, "outputs": { - "eth_per_fee_asset_at_execution": 10079914, + "eth_per_fee_asset_at_execution": 10235974, "l1_fee_oracle_output": { "base_fee": 20847107469, "blob_fee": 320 @@ -13988,22 +13988,22 @@ "slot_of_change": 35 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90768151394943, - "congestion_multiplier": 4666075959, - "prover_cost": 18554389749754, - "sequencer_cost": 6204549364211 + "congestion_cost": 115998726647802, + "congestion_multiplier": 5022616891, + "prover_cost": 20690028423285, + "sequencer_cost": 8146604514627 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 914935160, - "congestion_multiplier": 4666075959, - "prover_cost": 187026653, - "sequencer_cost": 62541324 + "congestion_cost": 1187359950, + "congestion_multiplier": 5022616891, + "prover_cost": 211782593, + "sequencer_cost": 83388432 } }, "parent_fee_header": { - "eth_per_fee_asset": 10079914, - "excess_mana": 1324961901, - "mana_used": 91549596 + "eth_per_fee_asset": 10235974, + "excess_mana": 1033720406, + "mana_used": 75863625 } }, { @@ -14011,21 +14011,21 @@ "blobs_needed": 1, "block_number": 38, "l1_block_number": 20973275, - "mana_spent": 114006172, - "size_in_fields": 3870, + "mana_spent": 46308366, + "size_in_fields": 1605, "slot_number": 38, "timestamp": 1729023191 }, "fee_header": { - "eth_per_fee_asset": 10099052, - "excess_mana": 1316895879, - "mana_used": 114006172 + "eth_per_fee_asset": 10293295, + "excess_mana": 1029095216, + "mana_used": 46308366 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 10104105, + "eth_per_fee_asset_at_execution": 10293295, "l1_fee_oracle_output": { "base_fee": 20847107469, "blob_fee": 320 @@ -14042,22 +14042,22 @@ "slot_of_change": 40 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90602679406044, - "congestion_multiplier": 4668174891, - "prover_cost": 18509967285574, - "sequencer_cost": 6189694584528 + "congestion_cost": 114124767142106, + "congestion_multiplier": 4979794073, + "prover_cost": 20574810398420, + "sequencer_cost": 8101237941787 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 915458986, - "congestion_multiplier": 4668174891, - "prover_cost": 187026653, - "sequencer_cost": 62541324 + "congestion_cost": 1174719895, + "congestion_multiplier": 4979794073, + "prover_cost": 211782593, + "sequencer_cost": 83388432 } }, "parent_fee_header": { - "eth_per_fee_asset": 10104105, - "excess_mana": 1316511497, - "mana_used": 100384382 + "eth_per_fee_asset": 10293295, + "excess_mana": 1034584031, + "mana_used": 69511185 } }, { @@ -14065,21 +14065,21 @@ "blobs_needed": 1, "block_number": 39, "l1_block_number": 20973278, - "mana_spent": 93147313, - "size_in_fields": 3315, + "mana_spent": 93681008, + "size_in_fields": 3360, "slot_number": 39, "timestamp": 1729023227 }, "fee_header": { - "eth_per_fee_asset": 10184893, - "excess_mana": 1330902051, - "mana_used": 93147313 + "eth_per_fee_asset": 10354025, + "excess_mana": 1000403582, + "mana_used": 93681008 }, "oracle_input": { - "fee_asset_price_modifier": 85 + "fee_asset_price_modifier": 59 }, "outputs": { - "eth_per_fee_asset_at_execution": 10099052, + "eth_per_fee_asset_at_execution": 10293295, "l1_fee_oracle_output": { "base_fee": 20847107469, "blob_fee": 320 @@ -14096,22 +14096,22 @@ "slot_of_change": 40 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92554016753256, - "congestion_multiplier": 4745303542, - "prover_cost": 18519228636510, - "sequencer_cost": 6192791561030 + "congestion_cost": 107874083274598, + "congestion_multiplier": 4761818296, + "prover_cost": 20574810398420, + "sequencer_cost": 8101237941787 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 934707828, - "congestion_multiplier": 4745303542, - "prover_cost": 187026653, - "sequencer_cost": 62541324 + "congestion_cost": 1110379762, + "congestion_multiplier": 4761818296, + "prover_cost": 211782593, + "sequencer_cost": 83388432 } }, "parent_fee_header": { - "eth_per_fee_asset": 10099052, - "excess_mana": 1316895879, - "mana_used": 114006172 + "eth_per_fee_asset": 10293295, + "excess_mana": 1029095216, + "mana_used": 46308366 } }, { @@ -14119,21 +14119,21 @@ "blobs_needed": 1, "block_number": 40, "l1_block_number": 20973281, - "mana_spent": 86098422, - "size_in_fields": 3300, + "mana_spent": 76931014, + "size_in_fields": 2835, "slot_number": 40, "timestamp": 1729023263 }, "fee_header": { - "eth_per_fee_asset": 10244983, - "excess_mana": 1324049364, - "mana_used": 86098422 + "eth_per_fee_asset": 10360237, + "excess_mana": 1019084590, + "mana_used": 76931014 }, "oracle_input": { - "fee_asset_price_modifier": 59 + "fee_asset_price_modifier": 6 }, "outputs": { - "eth_per_fee_asset_at_execution": 10184893, + "eth_per_fee_asset_at_execution": 10354025, "l1_fee_oracle_output": { "base_fee": 18168683930, "blob_fee": 422 @@ -14150,22 +14150,22 @@ "slot_of_change": 40 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87615797338274, - "congestion_multiplier": 4707409502, - "prover_cost": 18280962303679, - "sequencer_cost": 5351657008081 + "congestion_cost": 105703105410698, + "congestion_multiplier": 4902630819, + "prover_cost": 20066105403455, + "sequencer_cost": 7018984211454 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 892357521, - "congestion_multiplier": 4707409502, - "prover_cost": 186189645, - "sequencer_cost": 54506054 + "congestion_cost": 1094452596, + "congestion_multiplier": 4902630819, + "prover_cost": 207764957, + "sequencer_cost": 72674738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10184893, - "excess_mana": 1330902051, - "mana_used": 93147313 + "eth_per_fee_asset": 10354025, + "excess_mana": 1000403582, + "mana_used": 93681008 } }, { @@ -14173,21 +14173,21 @@ "blobs_needed": 1, "block_number": 41, "l1_block_number": 20973284, - "mana_spent": 103446806, - "size_in_fields": 3915, + "mana_spent": 81242316, + "size_in_fields": 2700, "slot_number": 41, "timestamp": 1729023299 }, "fee_header": { - "eth_per_fee_asset": 10301330, - "excess_mana": 1310147786, - "mana_used": 103446806 + "eth_per_fee_asset": 10320868, + "excess_mana": 1021015604, + "mana_used": 81242316 }, "oracle_input": { - "fee_asset_price_modifier": 55 + "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 10244983, + "eth_per_fee_asset_at_execution": 10360237, "l1_fee_oracle_output": { "base_fee": 18168683930, "blob_fee": 422 @@ -14204,22 +14204,22 @@ "slot_of_change": 40 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85317627857460, - "congestion_multiplier": 4631463509, - "prover_cost": 18173738794882, - "sequencer_cost": 5320267881363 + "congestion_cost": 106040097441787, + "congestion_multiplier": 4917421682, + "prover_cost": 20054073762985, + "sequencer_cost": 7014775627238 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 874077647, - "congestion_multiplier": 4631463509, - "prover_cost": 186189645, - "sequencer_cost": 54506054 + "congestion_cost": 1098600541, + "congestion_multiplier": 4917421682, + "prover_cost": 207764957, + "sequencer_cost": 72674738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10244983, - "excess_mana": 1324049364, - "mana_used": 86098422 + "eth_per_fee_asset": 10360237, + "excess_mana": 1019084590, + "mana_used": 76931014 } }, { @@ -14227,21 +14227,21 @@ "blobs_needed": 1, "block_number": 42, "l1_block_number": 20973287, - "mana_spent": 104101121, - "size_in_fields": 3735, + "mana_spent": 70073295, + "size_in_fields": 2355, "slot_number": 42, "timestamp": 1729023335 }, "fee_header": { - "eth_per_fee_asset": 10308540, - "excess_mana": 1313594592, - "mana_used": 104101121 + "eth_per_fee_asset": 10315707, + "excess_mana": 1027257920, + "mana_used": 70073295 }, "oracle_input": { - "fee_asset_price_modifier": 7 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 10301330, + "eth_per_fee_asset_at_execution": 10320868, "l1_fee_oracle_output": { "base_fee": 18168683930, "blob_fee": 422 @@ -14258,22 +14258,22 @@ "slot_of_change": 40 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85288243459826, - "congestion_multiplier": 4650178815, - "prover_cost": 18074330693222, - "sequencer_cost": 5291166674595 + "congestion_cost": 107752104958614, + "congestion_multiplier": 4965541513, + "prover_cost": 20130570122591, + "sequencer_cost": 7041533522181 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 878582341, - "congestion_multiplier": 4650178815, - "prover_cost": 186189645, - "sequencer_cost": 54506054 + "congestion_cost": 1112095252, + "congestion_multiplier": 4965541513, + "prover_cost": 207764957, + "sequencer_cost": 72674738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10301330, - "excess_mana": 1310147786, - "mana_used": 103446806 + "eth_per_fee_asset": 10320868, + "excess_mana": 1021015604, + "mana_used": 81242316 } }, { @@ -14281,21 +14281,21 @@ "blobs_needed": 1, "block_number": 43, "l1_block_number": 20973290, - "mana_spent": 105694545, - "size_in_fields": 3570, + "mana_spent": 75360814, + "size_in_fields": 2640, "slot_number": 43, "timestamp": 1729023371 }, "fee_header": { - "eth_per_fee_asset": 10246688, - "excess_mana": 1317695713, - "mana_used": 105694545 + "eth_per_fee_asset": 10383790, + "excess_mana": 1022331215, + "mana_used": 75360814 }, "oracle_input": { - "fee_asset_price_modifier": -60 + "fee_asset_price_modifier": 66 }, "outputs": { - "eth_per_fee_asset_at_execution": 10308540, + "eth_per_fee_asset_at_execution": 10315707, "l1_fee_oracle_output": { "base_fee": 18168683930, "blob_fee": 422 @@ -14312,22 +14312,22 @@ "slot_of_change": 45 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85750832901653, - "congestion_multiplier": 4672545440, - "prover_cost": 18061689143177, - "sequencer_cost": 5287465926310 + "congestion_cost": 106772490242308, + "congestion_multiplier": 4927524331, + "prover_cost": 20140641547885, + "sequencer_cost": 7045056436753 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 883965891, - "congestion_multiplier": 4672545440, - "prover_cost": 186189645, - "sequencer_cost": 54506054 + "congestion_cost": 1101433725, + "congestion_multiplier": 4927524331, + "prover_cost": 207764957, + "sequencer_cost": 72674738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10308540, - "excess_mana": 1313594592, - "mana_used": 104101121 + "eth_per_fee_asset": 10315707, + "excess_mana": 1027257920, + "mana_used": 70073295 } }, { @@ -14335,21 +14335,21 @@ "blobs_needed": 1, "block_number": 44, "l1_block_number": 20973293, - "mana_spent": 93444059, - "size_in_fields": 3270, + "mana_spent": 75987601, + "size_in_fields": 2745, "slot_number": 44, "timestamp": 1729023407 }, "fee_header": { - "eth_per_fee_asset": 10277428, - "excess_mana": 1323390258, - "mana_used": 93444059 + "eth_per_fee_asset": 10422210, + "excess_mana": 1022692029, + "mana_used": 75987601 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": 37 }, "outputs": { - "eth_per_fee_asset_at_execution": 10246688, + "eth_per_fee_asset_at_execution": 10383790, "l1_fee_oracle_output": { "base_fee": 18168683930, "blob_fee": 422 @@ -14366,22 +14366,22 @@ "slot_of_change": 45 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87002170750198, - "congestion_multiplier": 4703780763, - "prover_cost": 18170714771447, - "sequencer_cost": 5319382614168 + "congestion_cost": 106147346874311, + "congestion_multiplier": 4930298667, + "prover_cost": 20008586171331, + "sequencer_cost": 6998864383814 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 891484099, - "congestion_multiplier": 4703780763, - "prover_cost": 186189645, - "sequencer_cost": 54506054 + "congestion_cost": 1102211759, + "congestion_multiplier": 4930298667, + "prover_cost": 207764957, + "sequencer_cost": 72674738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10246688, - "excess_mana": 1317695713, - "mana_used": 105694545 + "eth_per_fee_asset": 10383790, + "excess_mana": 1022331215, + "mana_used": 75360814 } }, { @@ -14389,21 +14389,21 @@ "blobs_needed": 1, "block_number": 45, "l1_block_number": 20973296, - "mana_spent": 121927766, - "size_in_fields": 4020, + "mana_spent": 72920942, + "size_in_fields": 2745, "slot_number": 45, "timestamp": 1729023443 }, "fee_header": { - "eth_per_fee_asset": 10308260, - "excess_mana": 1316834317, - "mana_used": 121927766 + "eth_per_fee_asset": 10381563, + "excess_mana": 1023679630, + "mana_used": 72920942 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": -39 }, "outputs": { - "eth_per_fee_asset_at_execution": 10277428, + "eth_per_fee_asset_at_execution": 10422210, "l1_fee_oracle_output": { "base_fee": 18698500008, "blob_fee": 390 @@ -14420,22 +14420,22 @@ "slot_of_change": 45 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86526522686416, - "congestion_multiplier": 4667838666, - "prover_cost": 18132475654415, - "sequencer_cost": 5458126488457 + "congestion_cost": 107061611308926, + "congestion_multiplier": 4937900423, + "prover_cost": 20011080375468, + "sequencer_cost": 7176405292160 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 889270107, - "congestion_multiplier": 4667838666, - "prover_cost": 186355213, - "sequencer_cost": 56095502 + "congestion_cost": 1115818596, + "congestion_multiplier": 4937900423, + "prover_cost": 208559682, + "sequencer_cost": 74794003 } }, "parent_fee_header": { - "eth_per_fee_asset": 10277428, - "excess_mana": 1323390258, - "mana_used": 93444059 + "eth_per_fee_asset": 10422210, + "excess_mana": 1022692029, + "mana_used": 75987601 } }, { @@ -14443,21 +14443,21 @@ "blobs_needed": 1, "block_number": 46, "l1_block_number": 20973299, - "mana_spent": 102526324, - "size_in_fields": 3405, + "mana_spent": 67851611, + "size_in_fields": 2625, "slot_number": 46, "timestamp": 1729023479 }, "fee_header": { - "eth_per_fee_asset": 10312383, - "excess_mana": 1338762083, - "mana_used": 102526324 + "eth_per_fee_asset": 10398173, + "excess_mana": 1021600572, + "mana_used": 67851611 }, "oracle_input": { - "fee_asset_price_modifier": 4 + "fee_asset_price_modifier": 16 }, "outputs": { - "eth_per_fee_asset_at_execution": 10308260, + "eth_per_fee_asset_at_execution": 10381563, "l1_fee_oracle_output": { "base_fee": 18698500008, "blob_fee": 390 @@ -14474,22 +14474,22 @@ "slot_of_change": 45 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89120822718869, - "congestion_multiplier": 4789143753, - "prover_cost": 18078241429689, - "sequencer_cost": 5441801235127 + "congestion_cost": 107044379348274, + "congestion_multiplier": 4921911123, + "prover_cost": 20089429886425, + "sequencer_cost": 7204503117691 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 918680612, - "congestion_multiplier": 4789143753, - "prover_cost": 186355213, - "sequencer_cost": 56095502 + "congestion_cost": 1111287968, + "congestion_multiplier": 4921911123, + "prover_cost": 208559682, + "sequencer_cost": 74794003 } }, "parent_fee_header": { - "eth_per_fee_asset": 10308260, - "excess_mana": 1316834317, - "mana_used": 121927766 + "eth_per_fee_asset": 10381563, + "excess_mana": 1023679630, + "mana_used": 72920942 } }, { @@ -14497,21 +14497,21 @@ "blobs_needed": 1, "block_number": 47, "l1_block_number": 20973302, - "mana_spent": 95838807, - "size_in_fields": 3285, + "mana_spent": 86723996, + "size_in_fields": 3135, "slot_number": 47, "timestamp": 1729023515 }, "fee_header": { - "eth_per_fee_asset": 10273195, - "excess_mana": 1341288407, - "mana_used": 95838807 + "eth_per_fee_asset": 10388814, + "excess_mana": 1014452183, + "mana_used": 86723996 }, "oracle_input": { - "fee_asset_price_modifier": -38 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10312383, + "eth_per_fee_asset_at_execution": 10398173, "l1_fee_oracle_output": { "base_fee": 18698500008, "blob_fee": 390 @@ -14528,22 +14528,22 @@ "slot_of_change": 45 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89418494251038, - "congestion_multiplier": 4803320441, - "prover_cost": 18071013557197, - "sequencer_cost": 5439625545328 + "congestion_cost": 105386016851230, + "congestion_multiplier": 4867329395, + "prover_cost": 20057339111400, + "sequencer_cost": 7192994673199 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 922117760, - "congestion_multiplier": 4803320441, - "prover_cost": 186355213, - "sequencer_cost": 56095502 + "congestion_cost": 1095822035, + "congestion_multiplier": 4867329395, + "prover_cost": 208559682, + "sequencer_cost": 74794003 } }, "parent_fee_header": { - "eth_per_fee_asset": 10312383, - "excess_mana": 1338762083, - "mana_used": 102526324 + "eth_per_fee_asset": 10398173, + "excess_mana": 1021600572, + "mana_used": 67851611 } }, { @@ -14551,21 +14551,21 @@ "blobs_needed": 1, "block_number": 48, "l1_block_number": 20973305, - "mana_spent": 88148267, - "size_in_fields": 3150, + "mana_spent": 73287336, + "size_in_fields": 2685, "slot_number": 48, "timestamp": 1729023551 }, "fee_header": { - "eth_per_fee_asset": 10226965, - "excess_mana": 1337127214, - "mana_used": 88148267 + "eth_per_fee_asset": 10350375, + "excess_mana": 1026176179, + "mana_used": 73287336 }, "oracle_input": { - "fee_asset_price_modifier": -45 + "fee_asset_price_modifier": -37 }, "outputs": { - "eth_per_fee_asset_at_execution": 10273195, + "eth_per_fee_asset_at_execution": 10388814, "l1_fee_oracle_output": { "base_fee": 18698500008, "blob_fee": 390 @@ -14582,22 +14582,22 @@ "slot_of_change": 50 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89209026597860, - "congestion_multiplier": 4779991850, - "prover_cost": 18139947017457, - "sequencer_cost": 5460375472285 + "congestion_cost": 107931324980889, + "congestion_multiplier": 4957169149, + "prover_cost": 20075408222729, + "sequencer_cost": 7199474646481 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 916461726, - "congestion_multiplier": 4779991850, - "prover_cost": 186355213, - "sequencer_cost": 56095502 + "congestion_cost": 1121278460, + "congestion_multiplier": 4957169149, + "prover_cost": 208559682, + "sequencer_cost": 74794003 } }, "parent_fee_header": { - "eth_per_fee_asset": 10273195, - "excess_mana": 1341288407, - "mana_used": 95838807 + "eth_per_fee_asset": 10388814, + "excess_mana": 1014452183, + "mana_used": 86723996 } }, { @@ -14605,21 +14605,21 @@ "blobs_needed": 1, "block_number": 49, "l1_block_number": 20973308, - "mana_spent": 103460169, - "size_in_fields": 3480, + "mana_spent": 74157771, + "size_in_fields": 2685, "slot_number": 49, "timestamp": 1729023587 }, "fee_header": { - "eth_per_fee_asset": 10215715, - "excess_mana": 1325275481, - "mana_used": 103460169 + "eth_per_fee_asset": 10405231, + "excess_mana": 1024463515, + "mana_used": 74157771 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": 53 }, "outputs": { - "eth_per_fee_asset_at_execution": 10226965, + "eth_per_fee_asset_at_execution": 10350375, "l1_fee_oracle_output": { "base_fee": 18698500008, "blob_fee": 390 @@ -14636,22 +14636,22 @@ "slot_of_change": 50 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88051786624869, - "congestion_multiplier": 4714167394, - "prover_cost": 18221946882580, - "sequencer_cost": 5485058568207 + "congestion_cost": 107970062437352, + "congestion_multiplier": 4943942480, + "prover_cost": 20149963841890, + "sequencer_cost": 7226211900536 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 900502540, - "congestion_multiplier": 4714167394, - "prover_cost": 186355213, - "sequencer_cost": 56095502 + "congestion_cost": 1117530635, + "congestion_multiplier": 4943942480, + "prover_cost": 208559682, + "sequencer_cost": 74794003 } }, "parent_fee_header": { - "eth_per_fee_asset": 10226965, - "excess_mana": 1337127214, - "mana_used": 88148267 + "eth_per_fee_asset": 10350375, + "excess_mana": 1026176179, + "mana_used": 73287336 } }, { @@ -14659,21 +14659,21 @@ "blobs_needed": 1, "block_number": 50, "l1_block_number": 20973311, - "mana_spent": 109699403, - "size_in_fields": 3840, + "mana_spent": 62057770, + "size_in_fields": 2280, "slot_number": 50, "timestamp": 1729023623 }, "fee_header": { - "eth_per_fee_asset": 10240232, - "excess_mana": 1328735650, - "mana_used": 109699403 + "eth_per_fee_asset": 10448932, + "excess_mana": 1023621286, + "mana_used": 62057770 }, "oracle_input": { - "fee_asset_price_modifier": 24 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 10215715, + "eth_per_fee_asset_at_execution": 10405231, "l1_fee_oracle_output": { "base_fee": 18935369029, "blob_fee": 556 @@ -14690,22 +14690,22 @@ "slot_of_change": 50 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88889353021302, - "congestion_multiplier": 4733290903, - "prover_cost": 18249259498724, - "sequencer_cost": 5560659239222 + "congestion_cost": 107717059429051, + "congestion_multiplier": 4937451012, + "prover_cost": 20077880539125, + "sequencer_cost": 7279173331184 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 908068297, - "congestion_multiplier": 4733290903, - "prover_cost": 186429234, - "sequencer_cost": 56806110 + "congestion_cost": 1120820886, + "congestion_multiplier": 4937451012, + "prover_cost": 208914985, + "sequencer_cost": 75741480 } }, "parent_fee_header": { - "eth_per_fee_asset": 10215715, - "excess_mana": 1325275481, - "mana_used": 103460169 + "eth_per_fee_asset": 10405231, + "excess_mana": 1024463515, + "mana_used": 74157771 } }, { @@ -14713,21 +14713,21 @@ "blobs_needed": 1, "block_number": 51, "l1_block_number": 20973314, - "mana_spent": 101099590, - "size_in_fields": 3480, + "mana_spent": 83181688, + "size_in_fields": 2955, "slot_number": 51, "timestamp": 1729023659 }, "fee_header": { - "eth_per_fee_asset": 10175718, - "excess_mana": 1338435053, - "mana_used": 101099590 + "eth_per_fee_asset": 10485503, + "excess_mana": 1010679056, + "mana_used": 83181688 }, "oracle_input": { - "fee_asset_price_modifier": -63 + "fee_asset_price_modifier": 35 }, "outputs": { - "eth_per_fee_asset_at_execution": 10240232, + "eth_per_fee_asset_at_execution": 10448932, "l1_fee_oracle_output": { "base_fee": 18935369029, "blob_fee": 556 @@ -14744,22 +14744,22 @@ "slot_of_change": 50 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89959685776651, - "congestion_multiplier": 4787311657, - "prover_cost": 18205567412926, - "sequencer_cost": 5547345997630 + "congestion_cost": 104578057164120, + "congestion_multiplier": 4838764066, + "prover_cost": 19993907989831, + "sequencer_cost": 7248729343822 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 921208053, - "congestion_multiplier": 4787311657, - "prover_cost": 186429234, - "sequencer_cost": 56806110 + "congestion_cost": 1092729008, + "congestion_multiplier": 4838764066, + "prover_cost": 208914985, + "sequencer_cost": 75741480 } }, "parent_fee_header": { - "eth_per_fee_asset": 10240232, - "excess_mana": 1328735650, - "mana_used": 109699403 + "eth_per_fee_asset": 10448932, + "excess_mana": 1023621286, + "mana_used": 62057770 } }, { @@ -14767,21 +14767,21 @@ "blobs_needed": 1, "block_number": 52, "l1_block_number": 20973317, - "mana_spent": 90432852, - "size_in_fields": 3195, + "mana_spent": 79093691, + "size_in_fields": 2730, "slot_number": 52, "timestamp": 1729023695 }, "fee_header": { - "eth_per_fee_asset": 10169612, - "excess_mana": 1339534643, - "mana_used": 90432852 + "eth_per_fee_asset": 10451949, + "excess_mana": 1018860744, + "mana_used": 79093691 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": -32 }, "outputs": { - "eth_per_fee_asset_at_execution": 10175718, + "eth_per_fee_asset_at_execution": 10485503, "l1_fee_oracle_output": { "base_fee": 18935369029, "blob_fee": 556 @@ -14798,22 +14798,22 @@ "slot_of_change": 50 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90677345519992, - "congestion_multiplier": 4793474594, - "prover_cost": 18320990617075, - "sequencer_cost": 5582516142842 + "congestion_cost": 105900675055837, + "congestion_multiplier": 4900919120, + "prover_cost": 19924173880834, + "sequencer_cost": 7223447458840 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 922707097, - "congestion_multiplier": 4793474594, - "prover_cost": 186429234, - "sequencer_cost": 56806110 + "congestion_cost": 1110421846, + "congestion_multiplier": 4900919120, + "prover_cost": 208914985, + "sequencer_cost": 75741480 } }, "parent_fee_header": { - "eth_per_fee_asset": 10175718, - "excess_mana": 1338435053, - "mana_used": 101099590 + "eth_per_fee_asset": 10485503, + "excess_mana": 1010679056, + "mana_used": 83181688 } }, { @@ -14821,21 +14821,21 @@ "blobs_needed": 1, "block_number": 53, "l1_block_number": 20973320, - "mana_spent": 109067446, - "size_in_fields": 3630, + "mana_spent": 85101780, + "size_in_fields": 2775, "slot_number": 53, "timestamp": 1729023731 }, "fee_header": { - "eth_per_fee_asset": 10220460, - "excess_mana": 1329967495, - "mana_used": 109067446 + "eth_per_fee_asset": 10451949, + "excess_mana": 1022954435, + "mana_used": 85101780 }, "oracle_input": { - "fee_asset_price_modifier": 50 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 10169612, + "eth_per_fee_asset_at_execution": 10451949, "l1_fee_oracle_output": { "base_fee": 18935369029, "blob_fee": 556 @@ -14852,22 +14852,22 @@ "slot_of_change": 55 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89455607450904, - "congestion_multiplier": 4740117718, - "prover_cost": 18331990837016, - "sequencer_cost": 5585867976085 + "congestion_cost": 107095771802944, + "congestion_multiplier": 4932317314, + "prover_cost": 19988136662359, + "sequencer_cost": 7246636966943 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 909728819, - "congestion_multiplier": 4740117718, - "prover_cost": 186429234, - "sequencer_cost": 56806110 + "congestion_cost": 1119359545, + "congestion_multiplier": 4932317314, + "prover_cost": 208914985, + "sequencer_cost": 75741480 } }, "parent_fee_header": { - "eth_per_fee_asset": 10169612, - "excess_mana": 1339534643, - "mana_used": 90432852 + "eth_per_fee_asset": 10451949, + "excess_mana": 1018860744, + "mana_used": 79093691 } }, { @@ -14875,21 +14875,21 @@ "blobs_needed": 1, "block_number": 54, "l1_block_number": 20973323, - "mana_spent": 88583233, - "size_in_fields": 2910, + "mana_spent": 70966483, + "size_in_fields": 2280, "slot_number": 54, "timestamp": 1729023767 }, "fee_header": { - "eth_per_fee_asset": 10177534, - "excess_mana": 1339034941, - "mana_used": 88583233 + "eth_per_fee_asset": 10492711, + "excess_mana": 1033056215, + "mana_used": 70966483 }, "oracle_input": { - "fee_asset_price_modifier": -42 + "fee_asset_price_modifier": 39 }, "outputs": { - "eth_per_fee_asset_at_execution": 10220460, + "eth_per_fee_asset_at_execution": 10451949, "l1_fee_oracle_output": { "base_fee": 18935369029, "blob_fee": 556 @@ -14906,22 +14906,22 @@ "slot_of_change": 55 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90213711222392, - "congestion_multiplier": 4790672902, - "prover_cost": 18240787009587, - "sequencer_cost": 5558077620773 + "congestion_cost": 109229424674767, + "congestion_multiplier": 5010660275, + "prover_cost": 19988136662359, + "sequencer_cost": 7246636966943 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 922025627, - "congestion_multiplier": 4790672902, - "prover_cost": 186429234, - "sequencer_cost": 56806110 + "congestion_cost": 1141660376, + "congestion_multiplier": 5010660275, + "prover_cost": 208914985, + "sequencer_cost": 75741480 } }, "parent_fee_header": { - "eth_per_fee_asset": 10220460, - "excess_mana": 1329967495, - "mana_used": 109067446 + "eth_per_fee_asset": 10451949, + "excess_mana": 1022954435, + "mana_used": 85101780 } }, { @@ -14929,21 +14929,21 @@ "blobs_needed": 1, "block_number": 55, "l1_block_number": 20973326, - "mana_spent": 95196779, - "size_in_fields": 3300, + "mana_spent": 70115529, + "size_in_fields": 2430, "slot_number": 55, "timestamp": 1729023803 }, "fee_header": { - "eth_per_fee_asset": 10149036, - "excess_mana": 1327618174, - "mana_used": 95196779 + "eth_per_fee_asset": 10437099, + "excess_mana": 1029022698, + "mana_used": 70115529 }, "oracle_input": { - "fee_asset_price_modifier": -28 + "fee_asset_price_modifier": -53 }, "outputs": { - "eth_per_fee_asset_at_execution": 10177534, + "eth_per_fee_asset_at_execution": 10492711, "l1_fee_oracle_output": { "base_fee": 19995965669, "blob_fee": 791 @@ -14960,22 +14960,22 @@ "slot_of_change": 55 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90361593093180, - "congestion_multiplier": 4727106420, - "prover_cost": 18350287112773, - "sequencer_cost": 5894148916624 + "congestion_cost": 110164640387027, + "congestion_multiplier": 4979230751, + "prover_cost": 20062105970517, + "sequencer_cost": 7622802819977 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 919658186, - "congestion_multiplier": 4727106420, - "prover_cost": 186760671, - "sequencer_cost": 59987901 + "congestion_cost": 1155925734, + "congestion_multiplier": 4979230751, + "prover_cost": 210505880, + "sequencer_cost": 79983867 } }, "parent_fee_header": { - "eth_per_fee_asset": 10177534, - "excess_mana": 1339034941, - "mana_used": 88583233 + "eth_per_fee_asset": 10492711, + "excess_mana": 1033056215, + "mana_used": 70966483 } }, { @@ -14983,21 +14983,21 @@ "blobs_needed": 1, "block_number": 56, "l1_block_number": 20973329, - "mana_spent": 94388332, - "size_in_fields": 3270, + "mana_spent": 52672923, + "size_in_fields": 1860, "slot_number": 56, "timestamp": 1729023839 }, "fee_header": { - "eth_per_fee_asset": 10160199, - "excess_mana": 1322814953, - "mana_used": 94388332 + "eth_per_fee_asset": 10409962, + "excess_mana": 1024138227, + "mana_used": 52672923 }, "oracle_input": { - "fee_asset_price_modifier": 11 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 10149036, + "eth_per_fee_asset_at_execution": 10437099, "l1_fee_oracle_output": { "base_fee": 19995965669, "blob_fee": 791 @@ -15014,22 +15014,22 @@ "slot_of_change": 55 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89971267615959, - "congestion_multiplier": 4700615681, - "prover_cost": 18401813827442, - "sequencer_cost": 5910699400416 + "congestion_cost": 109699664341596, + "congestion_multiplier": 4941434317, + "prover_cost": 20169002900136, + "sequencer_cost": 7663419404186 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 913121634, - "congestion_multiplier": 4700615681, - "prover_cost": 186760671, - "sequencer_cost": 59987901 + "congestion_cost": 1144946257, + "congestion_multiplier": 4941434317, + "prover_cost": 210505880, + "sequencer_cost": 79983867 } }, "parent_fee_header": { - "eth_per_fee_asset": 10149036, - "excess_mana": 1327618174, - "mana_used": 95196779 + "eth_per_fee_asset": 10437099, + "excess_mana": 1029022698, + "mana_used": 70115529 } }, { @@ -15037,21 +15037,21 @@ "blobs_needed": 1, "block_number": 57, "l1_block_number": 20973332, - "mana_spent": 103155216, - "size_in_fields": 3495, + "mana_spent": 103534906, + "size_in_fields": 3585, "slot_number": 57, "timestamp": 1729023875 }, "fee_header": { - "eth_per_fee_asset": 10146990, - "excess_mana": 1317203285, - "mana_used": 103155216 + "eth_per_fee_asset": 10475544, + "excess_mana": 1001811150, + "mana_used": 103534906 }, "oracle_input": { - "fee_asset_price_modifier": -13 + "fee_asset_price_modifier": 63 }, "outputs": { - "eth_per_fee_asset_at_execution": 10160199, + "eth_per_fee_asset_at_execution": 10409962, "l1_fee_oracle_output": { "base_fee": 19995965669, "blob_fee": 791 @@ -15068,22 +15068,22 @@ "slot_of_change": 55 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89125348430676, - "congestion_multiplier": 4669854172, - "prover_cost": 18381595773863, - "sequencer_cost": 5904205321176 + "congestion_cost": 105265547655218, + "congestion_multiplier": 4772285814, + "prover_cost": 20221580059563, + "sequencer_cost": 7683396634878 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 905531276, - "congestion_multiplier": 4669854172, - "prover_cost": 186760671, - "sequencer_cost": 59987901 + "congestion_cost": 1095810351, + "congestion_multiplier": 4772285814, + "prover_cost": 210505880, + "sequencer_cost": 79983867 } }, "parent_fee_header": { - "eth_per_fee_asset": 10160199, - "excess_mana": 1322814953, - "mana_used": 94388332 + "eth_per_fee_asset": 10409962, + "excess_mana": 1024138227, + "mana_used": 52672923 } }, { @@ -15091,21 +15091,21 @@ "blobs_needed": 1, "block_number": 58, "l1_block_number": 20973335, - "mana_spent": 95165211, - "size_in_fields": 3435, + "mana_spent": 76247475, + "size_in_fields": 2640, "slot_number": 58, "timestamp": 1729023911 }, "fee_header": { - "eth_per_fee_asset": 10178445, - "excess_mana": 1320358501, - "mana_used": 95165211 + "eth_per_fee_asset": 10487067, + "excess_mana": 1030346056, + "mana_used": 76247475 }, "oracle_input": { - "fee_asset_price_modifier": 31 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 10146990, + "eth_per_fee_asset_at_execution": 10475544, "l1_fee_oracle_output": { "base_fee": 19995965669, "blob_fee": 791 @@ -15122,22 +15122,22 @@ "slot_of_change": 60 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89661357407468, - "congestion_multiplier": 4687125278, - "prover_cost": 18405524298339, - "sequencer_cost": 5911891211089 + "congestion_cost": 110630517517754, + "congestion_multiplier": 4989520684, + "prover_cost": 20094983134051, + "sequencer_cost": 7635294835285 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 909792897, - "congestion_multiplier": 4687125278, - "prover_cost": 186760671, - "sequencer_cost": 59987901 + "congestion_cost": 1158914854, + "congestion_multiplier": 4989520684, + "prover_cost": 210505880, + "sequencer_cost": 79983867 } }, "parent_fee_header": { - "eth_per_fee_asset": 10146990, - "excess_mana": 1317203285, - "mana_used": 103155216 + "eth_per_fee_asset": 10475544, + "excess_mana": 1001811150, + "mana_used": 103534906 } }, { @@ -15145,21 +15145,21 @@ "blobs_needed": 1, "block_number": 59, "l1_block_number": 20973338, - "mana_spent": 99285407, - "size_in_fields": 3255, + "mana_spent": 78670358, + "size_in_fields": 2550, "slot_number": 59, "timestamp": 1729023947 }, "fee_header": { - "eth_per_fee_asset": 10131624, - "excess_mana": 1315523712, - "mana_used": 99285407 + "eth_per_fee_asset": 10467141, + "excess_mana": 1031593531, + "mana_used": 78670358 }, "oracle_input": { - "fee_asset_price_modifier": -46 + "fee_asset_price_modifier": -19 }, "outputs": { - "eth_per_fee_asset_at_execution": 10178445, + "eth_per_fee_asset_at_execution": 10487067, "l1_fee_oracle_output": { "base_fee": 19995965669, "blob_fee": 791 @@ -15176,22 +15176,22 @@ "slot_of_change": 60 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88743334959319, - "congestion_multiplier": 4660686450, - "prover_cost": 18348644709482, - "sequencer_cost": 5893621373403 + "congestion_cost": 110778183261345, + "congestion_multiplier": 4999240050, + "prover_cost": 20072903129159, + "sequencer_cost": 7626905311085 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 903269154, - "congestion_multiplier": 4660686450, - "prover_cost": 186760671, - "sequencer_cost": 59987901 + "congestion_cost": 1161738230, + "congestion_multiplier": 4999240050, + "prover_cost": 210505880, + "sequencer_cost": 79983867 } }, "parent_fee_header": { - "eth_per_fee_asset": 10178445, - "excess_mana": 1320358501, - "mana_used": 95165211 + "eth_per_fee_asset": 10487067, + "excess_mana": 1030346056, + "mana_used": 76247475 } }, { @@ -15199,21 +15199,21 @@ "blobs_needed": 1, "block_number": 60, "l1_block_number": 20973341, - "mana_spent": 107902274, - "size_in_fields": 3690, + "mana_spent": 69836566, + "size_in_fields": 2520, "slot_number": 60, "timestamp": 1729023983 }, "fee_header": { - "eth_per_fee_asset": 10046518, - "excess_mana": 1314809119, - "mana_used": 107902274 + "eth_per_fee_asset": 10457720, + "excess_mana": 1035263889, + "mana_used": 69836566 }, "oracle_input": { - "fee_asset_price_modifier": -84 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10131624, + "eth_per_fee_asset_at_execution": 10467141, "l1_fee_oracle_output": { "base_fee": 19528446485, "blob_fee": 1268 @@ -15230,22 +15230,22 @@ "slot_of_change": 60 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88499626910750, - "congestion_multiplier": 4656791401, - "prover_cost": 18419018609455, - "sequencer_cost": 5782423923352 + "congestion_cost": 110796244647894, + "congestion_multiplier": 5027946596, + "prover_cost": 20044117204498, + "sequencer_cost": 7462763041026 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 896644944, - "congestion_multiplier": 4656791401, - "prover_cost": 186614571, - "sequencer_cost": 58585345 + "congestion_cost": 1159719915, + "congestion_multiplier": 5027946596, + "prover_cost": 209804601, + "sequencer_cost": 78113793 } }, "parent_fee_header": { - "eth_per_fee_asset": 10131624, - "excess_mana": 1315523712, - "mana_used": 99285407 + "eth_per_fee_asset": 10467141, + "excess_mana": 1031593531, + "mana_used": 78670358 } }, { @@ -15253,21 +15253,21 @@ "blobs_needed": 1, "block_number": 61, "l1_block_number": 20973344, - "mana_spent": 95533765, - "size_in_fields": 3255, + "mana_spent": 70181614, + "size_in_fields": 2580, "slot_number": 61, "timestamp": 1729024019 }, "fee_header": { - "eth_per_fee_asset": 10146983, - "excess_mana": 1322711393, - "mana_used": 95533765 + "eth_per_fee_asset": 10400202, + "excess_mana": 1030100455, + "mana_used": 70181614 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -55 }, "outputs": { - "eth_per_fee_asset_at_execution": 10046518, + "eth_per_fee_asset_at_execution": 10457720, "l1_fee_oracle_output": { "base_fee": 19528446485, "blob_fee": 1268 @@ -15284,22 +15284,22 @@ "slot_of_change": 60 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90305019908391, - "congestion_multiplier": 4700046165, - "prover_cost": 18575049683881, - "sequencer_cost": 5831407956469 + "congestion_cost": 109785506496636, + "congestion_multiplier": 4987609377, + "prover_cost": 20062174259782, + "sequencer_cost": 7469485987386 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 907251008, - "congestion_multiplier": 4700046165, - "prover_cost": 186614571, - "sequencer_cost": 58585345 + "congestion_cost": 1148106087, + "congestion_multiplier": 4987609377, + "prover_cost": 209804601, + "sequencer_cost": 78113793 } }, "parent_fee_header": { - "eth_per_fee_asset": 10046518, - "excess_mana": 1314809119, - "mana_used": 107902274 + "eth_per_fee_asset": 10457720, + "excess_mana": 1035263889, + "mana_used": 69836566 } }, { @@ -15307,21 +15307,21 @@ "blobs_needed": 1, "block_number": 62, "l1_block_number": 20973347, - "mana_spent": 100197481, - "size_in_fields": 3780, + "mana_spent": 71543505, + "size_in_fields": 2670, "slot_number": 62, "timestamp": 1729024055 }, "fee_header": { - "eth_per_fee_asset": 10149012, - "excess_mana": 1318245158, - "mana_used": 100197481 + "eth_per_fee_asset": 10474043, + "excess_mana": 1025282069, + "mana_used": 71543505 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": 71 }, "outputs": { - "eth_per_fee_asset_at_execution": 10146983, + "eth_per_fee_asset_at_execution": 10400202, "l1_fee_oracle_output": { "base_fee": 19528446485, "blob_fee": 1268 @@ -15338,22 +15338,22 @@ "slot_of_change": 60 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88818971018282, - "congestion_multiplier": 4675550155, - "prover_cost": 18391138627118, - "sequencer_cost": 5773671346449 + "congestion_cost": 109358684956312, + "congestion_multiplier": 4950259652, + "prover_cost": 20173127502716, + "sequencer_cost": 7510795751852 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 901244589, - "congestion_multiplier": 4675550155, - "prover_cost": 186614571, - "sequencer_cost": 58585345 + "congestion_cost": 1137352414, + "congestion_multiplier": 4950259652, + "prover_cost": 209804601, + "sequencer_cost": 78113793 } }, "parent_fee_header": { - "eth_per_fee_asset": 10146983, - "excess_mana": 1322711393, - "mana_used": 95533765 + "eth_per_fee_asset": 10400202, + "excess_mana": 1030100455, + "mana_used": 70181614 } }, { @@ -15361,21 +15361,21 @@ "blobs_needed": 1, "block_number": 63, "l1_block_number": 20973350, - "mana_spent": 105314016, - "size_in_fields": 3645, + "mana_spent": 78695462, + "size_in_fields": 2655, "slot_number": 63, "timestamp": 1729024091 }, "fee_header": { - "eth_per_fee_asset": 10125669, - "excess_mana": 1318442639, - "mana_used": 105314016 + "eth_per_fee_asset": 10524318, + "excess_mana": 1021825574, + "mana_used": 78695462 }, "oracle_input": { - "fee_asset_price_modifier": -23 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 10149012, + "eth_per_fee_asset_at_execution": 10474043, "l1_fee_oracle_output": { "base_fee": 19528446485, "blob_fee": 1268 @@ -15392,22 +15392,22 @@ "slot_of_change": 65 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88827317279751, - "congestion_multiplier": 4676630579, - "prover_cost": 18387461853430, - "sequencer_cost": 5772517068657 + "congestion_cost": 107855949130628, + "congestion_multiplier": 4923639033, + "prover_cost": 20030908885901, + "sequencer_cost": 7457845361147 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 901509509, - "congestion_multiplier": 4676630579, - "prover_cost": 186614571, - "sequencer_cost": 58585345 + "congestion_cost": 1129687849, + "congestion_multiplier": 4923639033, + "prover_cost": 209804601, + "sequencer_cost": 78113793 } }, "parent_fee_header": { - "eth_per_fee_asset": 10149012, - "excess_mana": 1318245158, - "mana_used": 100197481 + "eth_per_fee_asset": 10474043, + "excess_mana": 1025282069, + "mana_used": 71543505 } }, { @@ -15415,21 +15415,21 @@ "blobs_needed": 1, "block_number": 64, "l1_block_number": 20973353, - "mana_spent": 100690606, - "size_in_fields": 3825, + "mana_spent": 67265932, + "size_in_fields": 2415, "slot_number": 64, "timestamp": 1729024127 }, "fee_header": { - "eth_per_fee_asset": 10140857, - "excess_mana": 1323756655, - "mana_used": 100690606 + "eth_per_fee_asset": 10474853, + "excess_mana": 1025521036, + "mana_used": 67265932 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -47 }, "outputs": { - "eth_per_fee_asset_at_execution": 10125669, + "eth_per_fee_asset_at_execution": 10524318, "l1_fee_oracle_output": { "base_fee": 19528446485, "blob_fee": 1268 @@ -15446,22 +15446,22 @@ "slot_of_change": 65 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89738393384181, - "congestion_multiplier": 4705797633, - "prover_cost": 18429851005401, - "sequencer_cost": 5785824620576 + "congestion_cost": 108119484606984, + "congestion_multiplier": 4952105396, + "prover_cost": 19935220600518, + "sequencer_cost": 7422218997944 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 908661268, - "congestion_multiplier": 4705797633, - "prover_cost": 186614571, - "sequencer_cost": 58585345 + "congestion_cost": 1137883838, + "congestion_multiplier": 4952105396, + "prover_cost": 209804601, + "sequencer_cost": 78113793 } }, "parent_fee_header": { - "eth_per_fee_asset": 10125669, - "excess_mana": 1318442639, - "mana_used": 105314016 + "eth_per_fee_asset": 10524318, + "excess_mana": 1021825574, + "mana_used": 78695462 } }, { @@ -15469,21 +15469,21 @@ "blobs_needed": 1, "block_number": 65, "l1_block_number": 20973356, - "mana_spent": 86716781, - "size_in_fields": 2955, + "mana_spent": 91748803, + "size_in_fields": 3045, "slot_number": 65, "timestamp": 1729024163 }, "fee_header": { - "eth_per_fee_asset": 10123617, - "excess_mana": 1324447261, - "mana_used": 86716781 + "eth_per_fee_asset": 10467520, + "excess_mana": 1017786968, + "mana_used": 91748803 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 10140857, + "eth_per_fee_asset_at_execution": 10474853, "l1_fee_oracle_output": { "base_fee": 18635391729, "blob_fee": 1484 @@ -15500,22 +15500,22 @@ "slot_of_change": 65 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88613819522354, - "congestion_multiplier": 4709601497, - "prover_cost": 18374728191119, - "sequencer_cost": 5512964239611 + "congestion_cost": 105172305520660, + "congestion_multiplier": 4892716509, + "prover_cost": 19901474416873, + "sequencer_cost": 7116240676600 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 898620072, - "congestion_multiplier": 4709601497, - "prover_cost": 186335491, - "sequencer_cost": 55906182 + "congestion_cost": 1101664440, + "congestion_multiplier": 4892716509, + "prover_cost": 208465019, + "sequencer_cost": 74541575 } }, "parent_fee_header": { - "eth_per_fee_asset": 10140857, - "excess_mana": 1323756655, - "mana_used": 100690606 + "eth_per_fee_asset": 10474853, + "excess_mana": 1025521036, + "mana_used": 67265932 } }, { @@ -15523,21 +15523,21 @@ "blobs_needed": 1, "block_number": 66, "l1_block_number": 20973359, - "mana_spent": 108231389, - "size_in_fields": 3600, + "mana_spent": 66462797, + "size_in_fields": 2460, "slot_number": 66, "timestamp": 1729024199 }, "fee_header": { - "eth_per_fee_asset": 10080085, - "excess_mana": 1311164042, - "mana_used": 108231389 + "eth_per_fee_asset": 10475894, + "excess_mana": 1034535771, + "mana_used": 66462797 }, "oracle_input": { - "fee_asset_price_modifier": -43 + "fee_asset_price_modifier": 8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10123617, + "eth_per_fee_asset_at_execution": 10467520, "l1_fee_oracle_output": { "base_fee": 18635391729, "blob_fee": 1484 @@ -15554,22 +15554,22 @@ "slot_of_change": 65 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87026859076159, - "congestion_multiplier": 4636973685, - "prover_cost": 18406019409862, - "sequencer_cost": 5522352534673 + "congestion_cost": 108747830909328, + "congestion_multiplier": 5022238774, + "prover_cost": 19915416354591, + "sequencer_cost": 7121225944637 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 881026590, - "congestion_multiplier": 4636973685, - "prover_cost": 186335491, - "sequencer_cost": 55906182 + "congestion_cost": 1138320095, + "congestion_multiplier": 5022238774, + "prover_cost": 208465019, + "sequencer_cost": 74541575 } }, "parent_fee_header": { - "eth_per_fee_asset": 10123617, - "excess_mana": 1324447261, - "mana_used": 86716781 + "eth_per_fee_asset": 10467520, + "excess_mana": 1017786968, + "mana_used": 91748803 } }, { @@ -15577,21 +15577,21 @@ "blobs_needed": 1, "block_number": 67, "l1_block_number": 20973362, - "mana_spent": 100787485, - "size_in_fields": 3405, + "mana_spent": 71040479, + "size_in_fields": 2460, "slot_number": 67, "timestamp": 1729024235 }, "fee_header": { - "eth_per_fee_asset": 10096213, - "excess_mana": 1319395431, - "mana_used": 100787485 + "eth_per_fee_asset": 10416181, + "excess_mana": 1025998568, + "mana_used": 71040479 }, "oracle_input": { - "fee_asset_price_modifier": 16 + "fee_asset_price_modifier": -57 }, "outputs": { - "eth_per_fee_asset_at_execution": 10080085, + "eth_per_fee_asset_at_execution": 10475894, "l1_fee_oracle_output": { "base_fee": 18635391729, "blob_fee": 1484 @@ -15608,22 +15608,22 @@ "slot_of_change": 65 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88481073026666, - "congestion_multiplier": 4681846837, - "prover_cost": 18485507909904, - "sequencer_cost": 5546201445722 + "congestion_cost": 106865944519867, + "congestion_multiplier": 4955795841, + "prover_cost": 19899496787578, + "sequencer_cost": 7115533528690 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 891896737, - "congestion_multiplier": 4681846837, - "prover_cost": 186335491, - "sequencer_cost": 55906182 + "congestion_cost": 1119516307, + "congestion_multiplier": 4955795841, + "prover_cost": 208465019, + "sequencer_cost": 74541575 } }, "parent_fee_header": { - "eth_per_fee_asset": 10080085, - "excess_mana": 1311164042, - "mana_used": 108231389 + "eth_per_fee_asset": 10475894, + "excess_mana": 1034535771, + "mana_used": 66462797 } }, { @@ -15631,21 +15631,21 @@ "blobs_needed": 1, "block_number": 68, "l1_block_number": 20973365, - "mana_spent": 97669615, - "size_in_fields": 3450, + "mana_spent": 83057452, + "size_in_fields": 2835, "slot_number": 68, "timestamp": 1729024271 }, "fee_header": { - "eth_per_fee_asset": 10101261, - "excess_mana": 1320182916, - "mana_used": 97669615 + "eth_per_fee_asset": 10401598, + "excess_mana": 1022039047, + "mana_used": 83057452 }, "oracle_input": { - "fee_asset_price_modifier": 5 + "fee_asset_price_modifier": -14 }, "outputs": { - "eth_per_fee_asset_at_execution": 10096213, + "eth_per_fee_asset_at_execution": 10416181, "l1_fee_oracle_output": { "base_fee": 18635391729, "blob_fee": 1484 @@ -15662,22 +15662,22 @@ "slot_of_change": 70 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88443277296151, - "congestion_multiplier": 4686162480, - "prover_cost": 18455978593162, - "sequencer_cost": 5537341773594 + "congestion_cost": 106649436103309, + "congestion_multiplier": 4925278966, + "prover_cost": 20013574936918, + "sequencer_cost": 7156324856491 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 892942166, - "congestion_multiplier": 4686162480, - "prover_cost": 186335491, - "sequencer_cost": 55906182 + "congestion_cost": 1110879830, + "congestion_multiplier": 4925278966, + "prover_cost": 208465019, + "sequencer_cost": 74541575 } }, "parent_fee_header": { - "eth_per_fee_asset": 10096213, - "excess_mana": 1319395431, - "mana_used": 100787485 + "eth_per_fee_asset": 10416181, + "excess_mana": 1025998568, + "mana_used": 71040479 } }, { @@ -15685,21 +15685,21 @@ "blobs_needed": 1, "block_number": 69, "l1_block_number": 20973368, - "mana_spent": 110128825, - "size_in_fields": 3840, + "mana_spent": 69572736, + "size_in_fields": 2550, "slot_number": 69, "timestamp": 1729024307 }, "fee_header": { - "eth_per_fee_asset": 10113382, - "excess_mana": 1317852531, - "mana_used": 110128825 + "eth_per_fee_asset": 10349590, + "excess_mana": 1030096499, + "mana_used": 69572736 }, "oracle_input": { - "fee_asset_price_modifier": 12 + "fee_asset_price_modifier": -50 }, "outputs": { - "eth_per_fee_asset_at_execution": 10101261, + "eth_per_fee_asset_at_execution": 10401598, "l1_fee_oracle_output": { "base_fee": 18635391729, "blob_fee": 1484 @@ -15716,22 +15716,22 @@ "slot_of_change": 70 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88093085110859, - "congestion_multiplier": 4673402824, - "prover_cost": 18446755410043, - "sequencer_cost": 5534574544703 + "congestion_cost": 108494006113292, + "congestion_multiplier": 4987578597, + "prover_cost": 20041633891255, + "sequencer_cost": 7166357996147 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 889851245, - "congestion_multiplier": 4673402824, - "prover_cost": 186335491, - "sequencer_cost": 55906182 + "congestion_cost": 1128511037, + "congestion_multiplier": 4987578597, + "prover_cost": 208465019, + "sequencer_cost": 74541575 } }, "parent_fee_header": { - "eth_per_fee_asset": 10101261, - "excess_mana": 1320182916, - "mana_used": 97669615 + "eth_per_fee_asset": 10401598, + "excess_mana": 1022039047, + "mana_used": 83057452 } }, { @@ -15739,21 +15739,21 @@ "blobs_needed": 1, "block_number": 70, "l1_block_number": 20973371, - "mana_spent": 87668489, - "size_in_fields": 3315, + "mana_spent": 72888079, + "size_in_fields": 2475, "slot_number": 70, "timestamp": 1729024343 }, "fee_header": { - "eth_per_fee_asset": 10068883, - "excess_mana": 1327981356, - "mana_used": 87668489 + "eth_per_fee_asset": 10380638, + "excess_mana": 1024669235, + "mana_used": 72888079 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": 30 }, "outputs": { - "eth_per_fee_asset_at_execution": 10113382, + "eth_per_fee_asset_at_execution": 10349590, "l1_fee_oracle_output": { "base_fee": 19972641950, "blob_fee": 2571 @@ -15770,22 +15770,22 @@ "slot_of_change": 70 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90955314058146, - "congestion_multiplier": 4729115503, - "prover_cost": 18465967368780, - "sequencer_cost": 5924619083903 + "congestion_cost": 110693247558599, + "congestion_multiplier": 4945529361, + "prover_cost": 20336157664217, + "sequencer_cost": 7719202596432 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 919865836, - "congestion_multiplier": 4729115503, - "prover_cost": 186753382, - "sequencer_cost": 59917936 + "congestion_cost": 1145629728, + "congestion_multiplier": 4945529361, + "prover_cost": 210470894, + "sequencer_cost": 79890582 } }, "parent_fee_header": { - "eth_per_fee_asset": 10113382, - "excess_mana": 1317852531, - "mana_used": 110128825 + "eth_per_fee_asset": 10349590, + "excess_mana": 1030096499, + "mana_used": 69572736 } }, { @@ -15793,21 +15793,21 @@ "blobs_needed": 1, "block_number": 71, "l1_block_number": 20973374, - "mana_spent": 115724831, - "size_in_fields": 3855, + "mana_spent": 27630399, + "size_in_fields": 930, "slot_number": 71, "timestamp": 1729024379 }, "fee_header": { - "eth_per_fee_asset": 10048745, - "excess_mana": 1315649845, - "mana_used": 115724831 + "eth_per_fee_asset": 10359876, + "excess_mana": 1022557314, + "mana_used": 27630399 }, "oracle_input": { "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10068883, + "eth_per_fee_asset_at_execution": 10380638, "l1_fee_oracle_output": { "base_fee": 19972641950, "blob_fee": 2571 @@ -15824,44 +15824,44 @@ "slot_of_change": 70 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89697737574268, - "congestion_multiplier": 4661374305, - "prover_cost": 18547576925862, - "sequencer_cost": 5950802685859 + "congestion_cost": 109907165725267, + "congestion_multiplier": 4929262647, + "prover_cost": 20275333173164, + "sequencer_cost": 7696114824542 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 903156025, - "congestion_multiplier": 4661374305, - "prover_cost": 186753382, - "sequencer_cost": 59917936 + "congestion_cost": 1140906501, + "congestion_multiplier": 4929262647, + "prover_cost": 210470894, + "sequencer_cost": 79890582 } }, "parent_fee_header": { - "eth_per_fee_asset": 10068883, - "excess_mana": 1327981356, - "mana_used": 87668489 + "eth_per_fee_asset": 10380638, + "excess_mana": 1024669235, + "mana_used": 72888079 } }, { "block_header": { - "blobs_needed": 1, + "blobs_needed": 2, "block_number": 72, "l1_block_number": 20973377, - "mana_spent": 90832884, - "size_in_fields": 3300, + "mana_spent": 114466590, + "size_in_fields": 4200, "slot_number": 72, "timestamp": 1729024415 }, "fee_header": { - "eth_per_fee_asset": 10067837, - "excess_mana": 1331374676, - "mana_used": 90832884 + "eth_per_fee_asset": 10256277, + "excess_mana": 975187713, + "mana_used": 114466590 }, "oracle_input": { - "fee_asset_price_modifier": 19 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10048745, + "eth_per_fee_asset_at_execution": 10359876, "l1_fee_oracle_output": { "base_fee": 19972641950, "blob_fee": 2571 @@ -15878,22 +15878,22 @@ "slot_of_change": 70 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92002176291667, - "congestion_multiplier": 4747928284, - "prover_cost": 18584746851473, - "sequencer_cost": 5962728280995 + "congestion_cost": 100286340685931, + "congestion_multiplier": 4578140149, + "prover_cost": 20315966523152, + "sequencer_cost": 7711538439264 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 924506409, - "congestion_multiplier": 4747928284, - "prover_cost": 186753382, - "sequencer_cost": 59917936 + "congestion_cost": 1038954054, + "congestion_multiplier": 4578140149, + "prover_cost": 210470894, + "sequencer_cost": 79890582 } }, "parent_fee_header": { - "eth_per_fee_asset": 10048745, - "excess_mana": 1315649845, - "mana_used": 115724831 + "eth_per_fee_asset": 10359876, + "excess_mana": 1022557314, + "mana_used": 27630399 } }, { @@ -15901,21 +15901,21 @@ "blobs_needed": 1, "block_number": 73, "l1_block_number": 20973380, - "mana_spent": 106336467, - "size_in_fields": 3750, + "mana_spent": 86965415, + "size_in_fields": 3030, "slot_number": 73, "timestamp": 1729024451 }, "fee_header": { - "eth_per_fee_asset": 10059782, - "excess_mana": 1322207560, - "mana_used": 106336467 + "eth_per_fee_asset": 10235764, + "excess_mana": 1014654303, + "mana_used": 86965415 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10067837, + "eth_per_fee_asset_at_execution": 10256277, "l1_fee_oracle_output": { "base_fee": 19972641950, "blob_fee": 2571 @@ -15932,22 +15932,22 @@ "slot_of_change": 75 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90586690666526, - "congestion_multiplier": 4697276376, - "prover_cost": 18549503930189, - "sequencer_cost": 5951420945731 + "congestion_cost": 109529916167436, + "congestion_multiplier": 4868864341, + "prover_cost": 20521178786416, + "sequencer_cost": 7789432949208 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 912012036, - "congestion_multiplier": 4697276376, - "prover_cost": 186753382, - "sequencer_cost": 59917936 + "congestion_cost": 1123369160, + "congestion_multiplier": 4868864341, + "prover_cost": 210470894, + "sequencer_cost": 79890582 } }, "parent_fee_header": { - "eth_per_fee_asset": 10067837, - "excess_mana": 1331374676, - "mana_used": 90832884 + "eth_per_fee_asset": 10256277, + "excess_mana": 975187713, + "mana_used": 114466590 } }, { @@ -15955,21 +15955,21 @@ "blobs_needed": 1, "block_number": 74, "l1_block_number": 20973383, - "mana_spent": 88918812, - "size_in_fields": 3120, + "mana_spent": 77973818, + "size_in_fields": 2520, "slot_number": 74, "timestamp": 1729024487 }, "fee_header": { - "eth_per_fee_asset": 10033626, - "excess_mana": 1328544027, - "mana_used": 88918812 + "eth_per_fee_asset": 10279777, + "excess_mana": 1026619718, + "mana_used": 77973818 }, "oracle_input": { - "fee_asset_price_modifier": -26 + "fee_asset_price_modifier": 43 }, "outputs": { - "eth_per_fee_asset_at_execution": 10059782, + "eth_per_fee_asset_at_execution": 10235764, "l1_fee_oracle_output": { "base_fee": 19972641950, "blob_fee": 2571 @@ -15986,22 +15986,22 @@ "slot_of_change": 75 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 91516302142532, - "congestion_multiplier": 4732229823, - "prover_cost": 18564356762404, - "sequencer_cost": 5956186326901 + "congestion_cost": 112351725772498, + "congestion_multiplier": 4960600304, + "prover_cost": 20562304289158, + "sequencer_cost": 7805043375366 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 920634049, - "congestion_multiplier": 4732229823, - "prover_cost": 186753382, - "sequencer_cost": 59917936 + "congestion_cost": 1150005750, + "congestion_multiplier": 4960600304, + "prover_cost": 210470894, + "sequencer_cost": 79890582 } }, "parent_fee_header": { - "eth_per_fee_asset": 10059782, - "excess_mana": 1322207560, - "mana_used": 106336467 + "eth_per_fee_asset": 10235764, + "excess_mana": 1014654303, + "mana_used": 86965415 } }, { @@ -16009,21 +16009,21 @@ "blobs_needed": 1, "block_number": 75, "l1_block_number": 20973386, - "mana_spent": 97346084, - "size_in_fields": 3585, + "mana_spent": 74124258, + "size_in_fields": 2760, "slot_number": 75, "timestamp": 1729024523 }, "fee_header": { - "eth_per_fee_asset": 9972420, - "excess_mana": 1317462839, - "mana_used": 97346084 + "eth_per_fee_asset": 10302392, + "excess_mana": 1029593536, + "mana_used": 74124258 }, "oracle_input": { - "fee_asset_price_modifier": -61 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 10033626, + "eth_per_fee_asset_at_execution": 10279777, "l1_fee_oracle_output": { "base_fee": 18504594480, "blob_fee": 5421 @@ -16040,22 +16040,22 @@ "slot_of_change": 75 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88476948811926, - "congestion_multiplier": 4671272520, - "prover_cost": 18567028210938, - "sequencer_cost": 5532775987465 + "congestion_cost": 109393253958720, + "congestion_multiplier": 4983666767, + "prover_cost": 20260052625656, + "sequencer_cost": 7200390339207 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 887744614, - "congestion_multiplier": 4671272520, - "prover_cost": 186294617, - "sequencer_cost": 55513805 + "congestion_cost": 1124538256, + "congestion_multiplier": 4983666767, + "prover_cost": 208268823, + "sequencer_cost": 74018407 } }, "parent_fee_header": { - "eth_per_fee_asset": 10033626, - "excess_mana": 1328544027, - "mana_used": 88918812 + "eth_per_fee_asset": 10279777, + "excess_mana": 1026619718, + "mana_used": 77973818 } }, { @@ -16063,21 +16063,21 @@ "blobs_needed": 1, "block_number": 76, "l1_block_number": 20973389, - "mana_spent": 101023328, - "size_in_fields": 3660, + "mana_spent": 63524499, + "size_in_fields": 2265, "slot_number": 76, "timestamp": 1729024559 }, "fee_header": { - "eth_per_fee_asset": 10035246, - "excess_mana": 1314808923, - "mana_used": 101023328 + "eth_per_fee_asset": 10281787, + "excess_mana": 1028717794, + "mana_used": 63524499 }, "oracle_input": { - "fee_asset_price_modifier": 63 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 9972420, + "eth_per_fee_asset_at_execution": 10302392, "l1_fee_oracle_output": { "base_fee": 18504594480, "blob_fee": 5421 @@ -16094,22 +16094,22 @@ "slot_of_change": 75 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88668818601704, - "congestion_multiplier": 4656790333, - "prover_cost": 18680983853468, - "sequencer_cost": 5566733551135 + "congestion_cost": 108966696569108, + "congestion_multiplier": 4976862941, + "prover_cost": 20215579352834, + "sequencer_cost": 7184584609089 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 884242700, - "congestion_multiplier": 4656790333, - "prover_cost": 186294617, - "sequencer_cost": 55513805 + "congestion_cost": 1122617623, + "congestion_multiplier": 4976862941, + "prover_cost": 208268823, + "sequencer_cost": 74018407 } }, "parent_fee_header": { - "eth_per_fee_asset": 9972420, - "excess_mana": 1317462839, - "mana_used": 97346084 + "eth_per_fee_asset": 10302392, + "excess_mana": 1029593536, + "mana_used": 74124258 } }, { @@ -16117,21 +16117,21 @@ "blobs_needed": 1, "block_number": 77, "l1_block_number": 20973391, - "mana_spent": 101767904, - "size_in_fields": 3450, + "mana_spent": 84702124, + "size_in_fields": 2880, "slot_number": 77, "timestamp": 1729024595 }, "fee_header": { - "eth_per_fee_asset": 9981055, - "excess_mana": 1315832251, - "mana_used": 101767904 + "eth_per_fee_asset": 10254026, + "excess_mana": 1017242293, + "mana_used": 84702124 }, "oracle_input": { - "fee_asset_price_modifier": -54 + "fee_asset_price_modifier": -27 }, "outputs": { - "eth_per_fee_asset_at_execution": 10035246, + "eth_per_fee_asset_at_execution": 10281787, "l1_fee_oracle_output": { "base_fee": 18504594480, "blob_fee": 5421 @@ -16148,22 +16148,22 @@ "slot_of_change": 75 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88248132731375, - "congestion_multiplier": 4662369218, - "prover_cost": 18564030916632, - "sequencer_cost": 5531882825793 + "congestion_cost": 106760731767737, + "congestion_multiplier": 4888560968, + "prover_cost": 20256091961447, + "sequencer_cost": 7198982725474 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 885591721, - "congestion_multiplier": 4662369218, - "prover_cost": 186294617, - "sequencer_cost": 55513805 + "congestion_cost": 1097691104, + "congestion_multiplier": 4888560968, + "prover_cost": 208268823, + "sequencer_cost": 74018407 } }, "parent_fee_header": { - "eth_per_fee_asset": 10035246, - "excess_mana": 1314808923, - "mana_used": 101023328 + "eth_per_fee_asset": 10281787, + "excess_mana": 1028717794, + "mana_used": 63524499 } }, { @@ -16171,21 +16171,21 @@ "blobs_needed": 1, "block_number": 78, "l1_block_number": 20973394, - "mana_spent": 84317348, - "size_in_fields": 3180, + "mana_spent": 70971411, + "size_in_fields": 2355, "slot_number": 78, "timestamp": 1729024631 }, "fee_header": { - "eth_per_fee_asset": 10014990, - "excess_mana": 1317600155, - "mana_used": 84317348 + "eth_per_fee_asset": 10282737, + "excess_mana": 1026944417, + "mana_used": 70971411 }, "oracle_input": { - "fee_asset_price_modifier": 34 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 9981055, + "eth_per_fee_asset_at_execution": 10254026, "l1_fee_oracle_output": { "base_fee": 18504594480, "blob_fee": 5421 @@ -16202,22 +16202,22 @@ "slot_of_change": 80 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88961147193358, - "congestion_multiplier": 4672023066, - "prover_cost": 18664822205669, - "sequencer_cost": 5561917552804 + "congestion_cost": 109102158508278, + "congestion_multiplier": 4963113636, + "prover_cost": 20310931823267, + "sequencer_cost": 7218472724762 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 887926103, - "congestion_multiplier": 4672023066, - "prover_cost": 186294617, - "sequencer_cost": 55513805 + "congestion_cost": 1118736370, + "congestion_multiplier": 4963113636, + "prover_cost": 208268823, + "sequencer_cost": 74018407 } }, "parent_fee_header": { - "eth_per_fee_asset": 9981055, - "excess_mana": 1315832251, - "mana_used": 101767904 + "eth_per_fee_asset": 10254026, + "excess_mana": 1017242293, + "mana_used": 84702124 } }, { @@ -16225,21 +16225,21 @@ "blobs_needed": 1, "block_number": 79, "l1_block_number": 20973397, - "mana_spent": 113045959, - "size_in_fields": 4020, + "mana_spent": 81916989, + "size_in_fields": 2790, "slot_number": 79, "timestamp": 1729024667 }, "fee_header": { - "eth_per_fee_asset": 9935871, - "excess_mana": 1301917503, - "mana_used": 113045959 + "eth_per_fee_asset": 10385564, + "excess_mana": 1022915828, + "mana_used": 81916989 }, "oracle_input": { - "fee_asset_price_modifier": -79 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10014990, + "eth_per_fee_asset_at_execution": 10282737, "l1_fee_oracle_output": { "base_fee": 18504594480, "blob_fee": 5421 @@ -16256,22 +16256,22 @@ "slot_of_change": 80 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86608769254887, - "congestion_multiplier": 4587079191, - "prover_cost": 18601577934676, - "sequencer_cost": 5543071435918 + "congestion_cost": 107943936327459, + "congestion_multiplier": 4932020265, + "prover_cost": 20254220544589, + "sequencer_cost": 7198317626912 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 867385958, - "congestion_multiplier": 4587079191, - "prover_cost": 186294617, - "sequencer_cost": 55513805 + "congestion_cost": 1109959108, + "congestion_multiplier": 4932020265, + "prover_cost": 208268823, + "sequencer_cost": 74018407 } }, "parent_fee_header": { - "eth_per_fee_asset": 10014990, - "excess_mana": 1317600155, - "mana_used": 84317348 + "eth_per_fee_asset": 10282737, + "excess_mana": 1026944417, + "mana_used": 70971411 } }, { @@ -16279,21 +16279,21 @@ "blobs_needed": 1, "block_number": 80, "l1_block_number": 20973400, - "mana_spent": 116151818, - "size_in_fields": 3945, + "mana_spent": 84192524, + "size_in_fields": 2670, "slot_number": 80, "timestamp": 1729024703 }, "fee_header": { - "eth_per_fee_asset": 9959717, - "excess_mana": 1314963462, - "mana_used": 116151818 + "eth_per_fee_asset": 10334674, + "excess_mana": 1029832817, + "mana_used": 84192524 }, "oracle_input": { - "fee_asset_price_modifier": 24 + "fee_asset_price_modifier": -49 }, "outputs": { - "eth_per_fee_asset_at_execution": 9935871, + "eth_per_fee_asset_at_execution": 10385564, "l1_fee_oracle_output": { "base_fee": 21085545843, "blob_fee": 7136 @@ -16310,22 +16310,22 @@ "slot_of_change": 80 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92162721818752, - "congestion_multiplier": 4657632406, - "prover_cost": 18830877031315, - "sequencer_cost": 6366494291241 + "congestion_cost": 113777067283010, + "congestion_multiplier": 4985527409, + "prover_cost": 20426454451583, + "sequencer_cost": 8121101656107 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 915716915, - "congestion_multiplier": 4657632406, - "prover_cost": 187101165, - "sequencer_cost": 63256666 + "congestion_cost": 1181639014, + "congestion_multiplier": 4985527409, + "prover_cost": 212140250, + "sequencer_cost": 84342221 } }, "parent_fee_header": { - "eth_per_fee_asset": 9935871, - "excess_mana": 1301917503, - "mana_used": 113045959 + "eth_per_fee_asset": 10385564, + "excess_mana": 1022915828, + "mana_used": 81916989 } }, { @@ -16333,21 +16333,21 @@ "blobs_needed": 1, "block_number": 81, "l1_block_number": 20973403, - "mana_spent": 91789445, - "size_in_fields": 3450, + "mana_spent": 66045274, + "size_in_fields": 2235, "slot_number": 81, "timestamp": 1729024739 }, "fee_header": { - "eth_per_fee_asset": 9968680, - "excess_mana": 1331115280, - "mana_used": 91789445 + "eth_per_fee_asset": 10410117, + "excess_mana": 1039025341, + "mana_used": 66045274 }, "oracle_input": { - "fee_asset_price_modifier": 9 + "fee_asset_price_modifier": 73 }, "outputs": { - "eth_per_fee_asset_at_execution": 9959717, + "eth_per_fee_asset_at_execution": 10334674, "l1_fee_oracle_output": { "base_fee": 21085545843, "blob_fee": 7136 @@ -16364,22 +16364,22 @@ "slot_of_change": 80 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 94175616937711, - "congestion_multiplier": 4746487538, - "prover_cost": 18785791303107, - "sequencer_cost": 6351251345797 + "congestion_cost": 116403138405721, + "congestion_multiplier": 5057536639, + "prover_cost": 20527038395213, + "sequencer_cost": 8161091583538 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 937962493, - "congestion_multiplier": 4746487538, - "prover_cost": 187101165, - "sequencer_cost": 63256666 + "congestion_cost": 1202988488, + "congestion_multiplier": 5057536639, + "prover_cost": 212140250, + "sequencer_cost": 84342221 } }, "parent_fee_header": { - "eth_per_fee_asset": 9959717, - "excess_mana": 1314963462, - "mana_used": 116151818 + "eth_per_fee_asset": 10334674, + "excess_mana": 1029832817, + "mana_used": 84192524 } }, { @@ -16387,21 +16387,21 @@ "blobs_needed": 1, "block_number": 82, "l1_block_number": 20973406, - "mana_spent": 109189584, - "size_in_fields": 3825, + "mana_spent": 82748634, + "size_in_fields": 2970, "slot_number": 82, "timestamp": 1729024775 }, "fee_header": { - "eth_per_fee_asset": 9900892, - "excess_mana": 1322904725, - "mana_used": 109189584 + "eth_per_fee_asset": 10373681, + "excess_mana": 1030070615, + "mana_used": 82748634 }, "oracle_input": { - "fee_asset_price_modifier": -68 + "fee_asset_price_modifier": -35 }, "outputs": { - "eth_per_fee_asset_at_execution": 9968680, + "eth_per_fee_asset_at_execution": 10410117, "l1_fee_oracle_output": { "base_fee": 21085545843, "blob_fee": 7136 @@ -16418,22 +16418,22 @@ "slot_of_change": 80 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92951296259886, - "congestion_multiplier": 4701109428, - "prover_cost": 18768900696983, - "sequencer_cost": 6345540833892 + "congestion_cost": 113561398685529, + "congestion_multiplier": 4987377208, + "prover_cost": 20378277208604, + "sequencer_cost": 8101947461302 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 926601728, - "congestion_multiplier": 4701109428, - "prover_cost": 187101165, - "sequencer_cost": 63256666 + "congestion_cost": 1182187447, + "congestion_multiplier": 4987377208, + "prover_cost": 212140250, + "sequencer_cost": 84342221 } }, "parent_fee_header": { - "eth_per_fee_asset": 9968680, - "excess_mana": 1331115280, - "mana_used": 91789445 + "eth_per_fee_asset": 10410117, + "excess_mana": 1039025341, + "mana_used": 66045274 } }, { @@ -16441,21 +16441,21 @@ "blobs_needed": 1, "block_number": 83, "l1_block_number": 20973409, - "mana_spent": 92839078, - "size_in_fields": 3270, + "mana_spent": 58473198, + "size_in_fields": 2265, "slot_number": 83, "timestamp": 1729024811 }, "fee_header": { - "eth_per_fee_asset": 9942475, - "excess_mana": 1332094309, - "mana_used": 92839078 + "eth_per_fee_asset": 10322849, + "excess_mana": 1037819249, + "mana_used": 58473198 }, "oracle_input": { - "fee_asset_price_modifier": 42 + "fee_asset_price_modifier": -49 }, "outputs": { - "eth_per_fee_asset_at_execution": 9900892, + "eth_per_fee_asset_at_execution": 10373681, "l1_fee_oracle_output": { "base_fee": 21085545843, "blob_fee": 7136 @@ -16472,22 +16472,22 @@ "slot_of_change": 85 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 94872709549807, - "congestion_multiplier": 4751927583, - "prover_cost": 18897404900488, - "sequencer_cost": 6388986568079 + "congestion_cost": 115693733111709, + "congestion_multiplier": 5048029812, + "prover_cost": 20449852853583, + "sequencer_cost": 8130404337670 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 939324451, - "congestion_multiplier": 4751927583, - "prover_cost": 187101165, - "sequencer_cost": 63256666 + "congestion_cost": 1200169881, + "congestion_multiplier": 5048029812, + "prover_cost": 212140250, + "sequencer_cost": 84342221 } }, "parent_fee_header": { - "eth_per_fee_asset": 9900892, - "excess_mana": 1322904725, - "mana_used": 109189584 + "eth_per_fee_asset": 10373681, + "excess_mana": 1030070615, + "mana_used": 82748634 } }, { @@ -16495,21 +16495,21 @@ "blobs_needed": 1, "block_number": 84, "l1_block_number": 20973412, - "mana_spent": 93037326, - "size_in_fields": 3390, + "mana_spent": 71168609, + "size_in_fields": 2730, "slot_number": 84, "timestamp": 1729024847 }, "fee_header": { - "eth_per_fee_asset": 9917618, - "excess_mana": 1324933387, - "mana_used": 93037326 + "eth_per_fee_asset": 10257815, + "excess_mana": 1021292447, + "mana_used": 71168609 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": -63 }, "outputs": { - "eth_per_fee_asset_at_execution": 9942475, + "eth_per_fee_asset_at_execution": 10322849, "l1_fee_oracle_output": { "base_fee": 21085545843, "blob_fee": 7136 @@ -16526,22 +16526,22 @@ "slot_of_change": 85 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 93477589835529, - "congestion_multiplier": 4712280927, - "prover_cost": 18818369168643, - "sequencer_cost": 6362265532476 + "congestion_cost": 112573247850473, + "congestion_multiplier": 4919545852, + "prover_cost": 20550552468607, + "sequencer_cost": 8170440253462 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 929398600, - "congestion_multiplier": 4712280927, - "prover_cost": 187101165, - "sequencer_cost": 63256666 + "congestion_cost": 1162076639, + "congestion_multiplier": 4919545852, + "prover_cost": 212140250, + "sequencer_cost": 84342221 } }, "parent_fee_header": { - "eth_per_fee_asset": 9942475, - "excess_mana": 1332094309, - "mana_used": 92839078 + "eth_per_fee_asset": 10322849, + "excess_mana": 1037819249, + "mana_used": 58473198 } }, { @@ -16549,21 +16549,21 @@ "blobs_needed": 1, "block_number": 85, "l1_block_number": 20973415, - "mana_spent": 97677079, - "size_in_fields": 3510, + "mana_spent": 81083199, + "size_in_fields": 2715, "slot_number": 85, "timestamp": 1729024883 }, "fee_header": { - "eth_per_fee_asset": 9868029, - "excess_mana": 1317970713, - "mana_used": 97677079 + "eth_per_fee_asset": 10360393, + "excess_mana": 1017461056, + "mana_used": 81083199 }, "oracle_input": { - "fee_asset_price_modifier": -50 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 9917618, + "eth_per_fee_asset_at_execution": 10257815, "l1_fee_oracle_output": { "base_fee": 18184379273, "blob_fee": 6861 @@ -16580,22 +16580,22 @@ "slot_of_change": 85 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89186629188582, - "congestion_multiplier": 4674049074, - "prover_cost": 18774119955014, - "sequencer_cost": 5500631804936 + "congestion_cost": 106388227024957, + "congestion_multiplier": 4890229573, + "prover_cost": 20256604354827, + "sequencer_cost": 7090940322087 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 884518919, - "congestion_multiplier": 4674049074, - "prover_cost": 186194550, - "sequencer_cost": 54553165 + "congestion_cost": 1091310751, + "congestion_multiplier": 4890229573, + "prover_cost": 207788500, + "sequencer_cost": 72737554 } }, "parent_fee_header": { - "eth_per_fee_asset": 9917618, - "excess_mana": 1324933387, - "mana_used": 93037326 + "eth_per_fee_asset": 10257815, + "excess_mana": 1021292447, + "mana_used": 71168609 } }, { @@ -16603,21 +16603,21 @@ "blobs_needed": 1, "block_number": 86, "l1_block_number": 20973418, - "mana_spent": 101911655, - "size_in_fields": 3555, + "mana_spent": 72555664, + "size_in_fields": 2490, "slot_number": 86, "timestamp": 1729024919 }, "fee_header": { - "eth_per_fee_asset": 9769348, - "excess_mana": 1315647792, - "mana_used": 101911655 + "eth_per_fee_asset": 10399762, + "excess_mana": 1023544255, + "mana_used": 72555664 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 38 }, "outputs": { - "eth_per_fee_asset_at_execution": 9868029, + "eth_per_fee_asset_at_execution": 10360393, "l1_fee_oracle_output": { "base_fee": 18184379273, "blob_fee": 6861 @@ -16634,22 +16634,22 @@ "slot_of_change": 85 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89325315318794, - "congestion_multiplier": 4661363108, - "prover_cost": 18868464006339, - "sequencer_cost": 5528273680591 + "congestion_cost": 106597419808303, + "congestion_multiplier": 4936857723, + "prover_cost": 20056044206046, + "sequencer_cost": 7020733093813 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 881464802, - "congestion_multiplier": 4661363108, - "prover_cost": 186194550, - "sequencer_cost": 54553165 + "congestion_cost": 1104391162, + "congestion_multiplier": 4936857723, + "prover_cost": 207788500, + "sequencer_cost": 72737554 } }, "parent_fee_header": { - "eth_per_fee_asset": 9868029, - "excess_mana": 1317970713, - "mana_used": 97677079 + "eth_per_fee_asset": 10360393, + "excess_mana": 1017461056, + "mana_used": 81083199 } }, { @@ -16657,21 +16657,21 @@ "blobs_needed": 1, "block_number": 87, "l1_block_number": 20973421, - "mana_spent": 102047908, - "size_in_fields": 3780, + "mana_spent": 88010146, + "size_in_fields": 2955, "slot_number": 87, "timestamp": 1729024955 }, "fee_header": { - "eth_per_fee_asset": 9753717, - "excess_mana": 1317559447, - "mana_used": 102047908 + "eth_per_fee_asset": 10496479, + "excess_mana": 1021099919, + "mana_used": 88010146 }, "oracle_input": { - "fee_asset_price_modifier": -16 + "fee_asset_price_modifier": 93 }, "outputs": { - "eth_per_fee_asset_at_execution": 9769348, + "eth_per_fee_asset_at_execution": 10399762, "l1_fee_oracle_output": { "base_fee": 18184379273, "blob_fee": 6861 @@ -16688,22 +16688,22 @@ "slot_of_change": 85 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90484809426382, - "congestion_multiplier": 4671800550, - "prover_cost": 19059055936999, - "sequencer_cost": 5584115234712 + "congestion_cost": 105687062838554, + "congestion_multiplier": 4918068519, + "prover_cost": 19980120698916, + "sequencer_cost": 6994155635485 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 883977592, - "congestion_multiplier": 4671800550, - "prover_cost": 186194550, - "sequencer_cost": 54553165 + "congestion_cost": 1099120300, + "congestion_multiplier": 4918068519, + "prover_cost": 207788500, + "sequencer_cost": 72737554 } }, "parent_fee_header": { - "eth_per_fee_asset": 9769348, - "excess_mana": 1315647792, - "mana_used": 101911655 + "eth_per_fee_asset": 10399762, + "excess_mana": 1023544255, + "mana_used": 72555664 } }, { @@ -16711,21 +16711,21 @@ "blobs_needed": 1, "block_number": 88, "l1_block_number": 20973424, - "mana_spent": 98778284, - "size_in_fields": 3585, + "mana_spent": 69495273, + "size_in_fields": 2445, "slot_number": 88, "timestamp": 1729024991 }, "fee_header": { - "eth_per_fee_asset": 9700071, - "excess_mana": 1319607355, - "mana_used": 98778284 + "eth_per_fee_asset": 10544762, + "excess_mana": 1034110065, + "mana_used": 69495273 }, "oracle_input": { - "fee_asset_price_modifier": -55 + "fee_asset_price_modifier": 46 }, "outputs": { - "eth_per_fee_asset_at_execution": 9753717, + "eth_per_fee_asset_at_execution": 10496479, "l1_fee_oracle_output": { "base_fee": 18184379273, "blob_fee": 6861 @@ -16742,22 +16742,22 @@ "slot_of_change": 90 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90906443564028, - "congestion_multiplier": 4683007850, - "prover_cost": 19089599380421, - "sequencer_cost": 5593064162104 + "congestion_cost": 107408155630093, + "congestion_multiplier": 5018904606, + "prover_cost": 19796019217492, + "sequencer_cost": 6929709857944 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 886675724, - "congestion_multiplier": 4683007850, - "prover_cost": 186194550, - "sequencer_cost": 54553165 + "congestion_cost": 1127407450, + "congestion_multiplier": 5018904606, + "prover_cost": 207788500, + "sequencer_cost": 72737554 } }, "parent_fee_header": { - "eth_per_fee_asset": 9753717, - "excess_mana": 1317559447, - "mana_used": 102047908 + "eth_per_fee_asset": 10496479, + "excess_mana": 1021099919, + "mana_used": 88010146 } }, { @@ -16765,21 +16765,21 @@ "blobs_needed": 1, "block_number": 89, "l1_block_number": 20973427, - "mana_spent": 98042292, - "size_in_fields": 3495, + "mana_spent": 74562485, + "size_in_fields": 2760, "slot_number": 89, "timestamp": 1729025027 }, "fee_header": { - "eth_per_fee_asset": 9702011, - "excess_mana": 1318385639, - "mana_used": 98042292 + "eth_per_fee_asset": 10531053, + "excess_mana": 1028605338, + "mana_used": 74562485 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": -13 }, "outputs": { - "eth_per_fee_asset_at_execution": 9700071, + "eth_per_fee_asset_at_execution": 10544762, "l1_fee_oracle_output": { "base_fee": 18184379273, "blob_fee": 6861 @@ -16796,22 +16796,22 @@ "slot_of_change": 90 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 91243180281877, - "congestion_multiplier": 4676318704, - "prover_cost": 19195173932233, - "sequencer_cost": 5623996463532 + "congestion_cost": 105774674004023, + "congestion_multiplier": 4975989920, + "prover_cost": 19705375996159, + "sequencer_cost": 6897979679390 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 885065327, - "congestion_multiplier": 4676318704, - "prover_cost": 186194550, - "sequencer_cost": 54553165 + "congestion_cost": 1115368763, + "congestion_multiplier": 4975989920, + "prover_cost": 207788500, + "sequencer_cost": 72737554 } }, "parent_fee_header": { - "eth_per_fee_asset": 9700071, - "excess_mana": 1319607355, - "mana_used": 98778284 + "eth_per_fee_asset": 10544762, + "excess_mana": 1034110065, + "mana_used": 69495273 } }, { @@ -16819,21 +16819,21 @@ "blobs_needed": 1, "block_number": 90, "l1_block_number": 20973430, - "mana_spent": 112506759, - "size_in_fields": 3780, + "mana_spent": 67808749, + "size_in_fields": 2205, "slot_number": 90, "timestamp": 1729025063 }, "fee_header": { - "eth_per_fee_asset": 9641858, - "excess_mana": 1316427931, - "mana_used": 112506759 + "eth_per_fee_asset": 10558433, + "excess_mana": 1028167823, + "mana_used": 67808749 }, "oracle_input": { - "fee_asset_price_modifier": -62 + "fee_asset_price_modifier": 26 }, "outputs": { - "eth_per_fee_asset_at_execution": 9702011, + "eth_per_fee_asset_at_execution": 10531053, "l1_fee_oracle_output": { "base_fee": 16001364672, "blob_fee": 6597 @@ -16850,22 +16850,22 @@ "slot_of_change": 90 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88227339362943, - "congestion_multiplier": 4665619768, - "prover_cost": 19121021198595, - "sequencer_cost": 4947852563763 + "congestion_cost": 101292726852671, + "congestion_multiplier": 4972594849, + "prover_cost": 19420088285569, + "sequencer_cost": 6077786713257 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 855982617, - "congestion_multiplier": 4665619768, - "prover_cost": 185512358, - "sequencer_cost": 48004120 + "congestion_cost": 1066719075, + "congestion_multiplier": 4972594849, + "prover_cost": 204513979, + "sequencer_cost": 64005494 } }, "parent_fee_header": { - "eth_per_fee_asset": 9702011, - "excess_mana": 1318385639, - "mana_used": 98042292 + "eth_per_fee_asset": 10531053, + "excess_mana": 1028605338, + "mana_used": 74562485 } }, { @@ -16873,21 +16873,21 @@ "blobs_needed": 1, "block_number": 91, "l1_block_number": 20973433, - "mana_spent": 90252376, - "size_in_fields": 3045, + "mana_spent": 84134690, + "size_in_fields": 3075, "slot_number": 91, "timestamp": 1729025099 }, "fee_header": { - "eth_per_fee_asset": 9610039, - "excess_mana": 1328934690, - "mana_used": 90252376 + "eth_per_fee_asset": 10555265, + "excess_mana": 1020976572, + "mana_used": 84134690 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 9641858, + "eth_per_fee_asset_at_execution": 10558433, "l1_fee_oracle_output": { "base_fee": 16001364672, "blob_fee": 6597 @@ -16904,22 +16904,22 @@ "slot_of_change": 90 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90443395038592, - "congestion_multiplier": 4734393305, - "prover_cost": 19240312188792, - "sequencer_cost": 4978720906282 + "congestion_cost": 99619290760287, + "congestion_multiplier": 4917122269, + "prover_cost": 19369728348895, + "sequencer_cost": 6062025870696 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 872042372, - "congestion_multiplier": 4734393305, - "prover_cost": 185512358, - "sequencer_cost": 48004120 + "congestion_cost": 1051823607, + "congestion_multiplier": 4917122269, + "prover_cost": 204513979, + "sequencer_cost": 64005494 } }, "parent_fee_header": { - "eth_per_fee_asset": 9641858, - "excess_mana": 1316427931, - "mana_used": 112506759 + "eth_per_fee_asset": 10558433, + "excess_mana": 1028167823, + "mana_used": 67808749 } }, { @@ -16927,21 +16927,21 @@ "blobs_needed": 1, "block_number": 92, "l1_block_number": 20973436, - "mana_spent": 116304114, - "size_in_fields": 3930, + "mana_spent": 71004826, + "size_in_fields": 2550, "slot_number": 92, "timestamp": 1729025135 }, "fee_header": { - "eth_per_fee_asset": 9665777, - "excess_mana": 1319187066, - "mana_used": 116304114 + "eth_per_fee_asset": 10581653, + "excess_mana": 1030111262, + "mana_used": 71004826 }, "oracle_input": { - "fee_asset_price_modifier": 58 + "fee_asset_price_modifier": 25 }, "outputs": { - "eth_per_fee_asset_at_execution": 9610039, + "eth_per_fee_asset_at_execution": 10555265, "l1_fee_oracle_output": { "base_fee": 16001364672, "blob_fee": 6597 @@ -16958,22 +16958,22 @@ "slot_of_change": 90 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89438285109978, - "congestion_multiplier": 4680705603, - "prover_cost": 19304017184530, - "sequencer_cost": 4995205534546 + "congestion_cost": 101444477897997, + "congestion_multiplier": 4987693464, + "prover_cost": 19375541874127, + "sequencer_cost": 6063845294268 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 859505408, - "congestion_multiplier": 4680705603, - "prover_cost": 185512358, - "sequencer_cost": 48004120 + "congestion_cost": 1070773347, + "congestion_multiplier": 4987693464, + "prover_cost": 204513979, + "sequencer_cost": 64005494 } }, "parent_fee_header": { - "eth_per_fee_asset": 9610039, - "excess_mana": 1328934690, - "mana_used": 90252376 + "eth_per_fee_asset": 10555265, + "excess_mana": 1020976572, + "mana_used": 84134690 } }, { @@ -16981,21 +16981,21 @@ "blobs_needed": 1, "block_number": 93, "l1_block_number": 20973439, - "mana_spent": 87764887, - "size_in_fields": 3180, + "mana_spent": 69267488, + "size_in_fields": 2400, "slot_number": 93, "timestamp": 1729025171 }, "fee_header": { - "eth_per_fee_asset": 9668676, - "excess_mana": 1335491180, - "mana_used": 87764887 + "eth_per_fee_asset": 10568955, + "excess_mana": 1026116088, + "mana_used": 69267488 }, "oracle_input": { - "fee_asset_price_modifier": 3 + "fee_asset_price_modifier": -12 }, "outputs": { - "eth_per_fee_asset_at_execution": 9665777, + "eth_per_fee_asset_at_execution": 10581653, "l1_fee_oracle_output": { "base_fee": 16001364672, "blob_fee": 6597 @@ -17012,22 +17012,22 @@ "slot_of_change": 95 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 91100366685472, - "congestion_multiplier": 4770850934, - "prover_cost": 19192699976422, - "sequencer_cost": 4966400528380 + "congestion_cost": 100405125739807, + "congestion_multiplier": 4956704476, + "prover_cost": 19327224111394, + "sequencer_cost": 6048723578443 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 880555829, - "congestion_multiplier": 4770850934, - "prover_cost": 185512358, - "sequencer_cost": 48004120 + "congestion_cost": 1062452200, + "congestion_multiplier": 4956704476, + "prover_cost": 204513979, + "sequencer_cost": 64005494 } }, "parent_fee_header": { - "eth_per_fee_asset": 9665777, - "excess_mana": 1319187066, - "mana_used": 116304114 + "eth_per_fee_asset": 10581653, + "excess_mana": 1030111262, + "mana_used": 71004826 } }, { @@ -17035,21 +17035,21 @@ "blobs_needed": 1, "block_number": 94, "l1_block_number": 20973442, - "mana_spent": 89190560, - "size_in_fields": 3240, + "mana_spent": 83845073, + "size_in_fields": 2895, "slot_number": 94, "timestamp": 1729025207 }, "fee_header": { - "eth_per_fee_asset": 9759561, - "excess_mana": 1323256067, - "mana_used": 89190560 + "eth_per_fee_asset": 10594320, + "excess_mana": 1020383576, + "mana_used": 83845073 }, "oracle_input": { - "fee_asset_price_modifier": 94 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 9668676, + "eth_per_fee_asset_at_execution": 10568955, "l1_fee_oracle_output": { "base_fee": 16001364672, "blob_fee": 6597 @@ -17066,22 +17066,22 @@ "slot_of_change": 95 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 89435347507767, - "congestion_multiplier": 4703042311, - "prover_cost": 19186945348050, - "sequencer_cost": 4964911431514 + "congestion_cost": 99404601211757, + "congestion_multiplier": 4912575672, + "prover_cost": 19350444674994, + "sequencer_cost": 6055990776761 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 864721398, - "congestion_multiplier": 4703042311, - "prover_cost": 185512358, - "sequencer_cost": 48004120 + "congestion_cost": 1050602757, + "congestion_multiplier": 4912575672, + "prover_cost": 204513979, + "sequencer_cost": 64005494 } }, "parent_fee_header": { - "eth_per_fee_asset": 9668676, - "excess_mana": 1335491180, - "mana_used": 87764887 + "eth_per_fee_asset": 10568955, + "excess_mana": 1026116088, + "mana_used": 69267488 } }, { @@ -17089,21 +17089,21 @@ "blobs_needed": 1, "block_number": 95, "l1_block_number": 20973445, - "mana_spent": 103238368, - "size_in_fields": 3705, + "mana_spent": 72302312, + "size_in_fields": 2430, "slot_number": 95, "timestamp": 1729025243 }, "fee_header": { - "eth_per_fee_asset": 9799575, - "excess_mana": 1312446627, - "mana_used": 103238368 + "eth_per_fee_asset": 10595379, + "excess_mana": 1029228649, + "mana_used": 72302312 }, "oracle_input": { - "fee_asset_price_modifier": 41 + "fee_asset_price_modifier": 1 }, "outputs": { - "eth_per_fee_asset_at_execution": 9759561, + "eth_per_fee_asset_at_execution": 10594320, "l1_fee_oracle_output": { "base_fee": 14639051101, "blob_fee": 12860 @@ -17120,22 +17120,22 @@ "slot_of_change": 95 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85503397335188, - "congestion_multiplier": 4643937264, - "prover_cost": 18964647590194, - "sequencer_cost": 4499915928596 + "congestion_cost": 98081182463811, + "congestion_multiplier": 4980830753, + "prover_cost": 19111232056423, + "sequencer_cost": 5527138315626 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 834475622, - "congestion_multiplier": 4643937264, - "prover_cost": 185086635, - "sequencer_cost": 43917204 + "congestion_cost": 1039103433, + "congestion_multiplier": 4980830753, + "prover_cost": 202470508, + "sequencer_cost": 58556272 } }, "parent_fee_header": { - "eth_per_fee_asset": 9759561, - "excess_mana": 1323256067, - "mana_used": 89190560 + "eth_per_fee_asset": 10594320, + "excess_mana": 1020383576, + "mana_used": 83845073 } }, { @@ -17143,21 +17143,21 @@ "blobs_needed": 1, "block_number": 96, "l1_block_number": 20973448, - "mana_spent": 105458396, - "size_in_fields": 3540, + "mana_spent": 80179669, + "size_in_fields": 2790, "slot_number": 96, "timestamp": 1729025279 }, "fee_header": { - "eth_per_fee_asset": 9763316, - "excess_mana": 1315684995, - "mana_used": 105458396 + "eth_per_fee_asset": 10587962, + "excess_mana": 1026530961, + "mana_used": 80179669 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 9799575, + "eth_per_fee_asset_at_execution": 10595379, "l1_fee_oracle_output": { "base_fee": 14639051101, "blob_fee": 12860 @@ -17174,22 +17174,22 @@ "slot_of_change": 95 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85566228433376, - "congestion_multiplier": 4661566010, - "prover_cost": 18887210414738, - "sequencer_cost": 4481541699513 + "congestion_cost": 97556063827448, + "congestion_multiplier": 4959913503, + "prover_cost": 19109321903445, + "sequencer_cost": 5526585882393 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 838512673, - "congestion_multiplier": 4661566010, - "prover_cost": 185086635, - "sequencer_cost": 43917204 + "congestion_cost": 1033643470, + "congestion_multiplier": 4959913503, + "prover_cost": 202470508, + "sequencer_cost": 58556272 } }, "parent_fee_header": { - "eth_per_fee_asset": 9799575, - "excess_mana": 1312446627, - "mana_used": 103238368 + "eth_per_fee_asset": 10595379, + "excess_mana": 1029228649, + "mana_used": 72302312 } }, { @@ -17197,21 +17197,21 @@ "blobs_needed": 1, "block_number": 97, "l1_block_number": 20973451, - "mana_spent": 30435890, - "size_in_fields": 1140, + "mana_spent": 79797541, + "size_in_fields": 2580, "slot_number": 97, "timestamp": 1729025315 }, "fee_header": { - "eth_per_fee_asset": 9838493, - "excess_mana": 1321143391, - "mana_used": 30435890 + "eth_per_fee_asset": 10640901, + "excess_mana": 1031710630, + "mana_used": 79797541 }, "oracle_input": { - "fee_asset_price_modifier": 77 + "fee_asset_price_modifier": 50 }, "outputs": { - "eth_per_fee_asset_at_execution": 9763316, + "eth_per_fee_asset_at_execution": 10587962, "l1_fee_oracle_output": { "base_fee": 14639051101, "blob_fee": 12860 @@ -17228,22 +17228,22 @@ "slot_of_change": 95 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86584516367186, - "congestion_multiplier": 4691431542, - "prover_cost": 18957353731048, - "sequencer_cost": 4498185247718 + "congestion_cost": 98616443088859, + "congestion_multiplier": 5000153367, + "prover_cost": 19122708222792, + "sequencer_cost": 5530457325027 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 845351994, - "congestion_multiplier": 4691431542, - "prover_cost": 185086635, - "sequencer_cost": 43917204 + "congestion_cost": 1044147152, + "congestion_multiplier": 5000153367, + "prover_cost": 202470508, + "sequencer_cost": 58556272 } }, "parent_fee_header": { - "eth_per_fee_asset": 9763316, - "excess_mana": 1315684995, - "mana_used": 105458396 + "eth_per_fee_asset": 10587962, + "excess_mana": 1026530961, + "mana_used": 80179669 } }, { @@ -17251,21 +17251,21 @@ "blobs_needed": 1, "block_number": 98, "l1_block_number": 20973454, - "mana_spent": 102847677, - "size_in_fields": 3615, + "mana_spent": 70316689, + "size_in_fields": 2235, "slot_number": 98, "timestamp": 1729025351 }, "fee_header": { - "eth_per_fee_asset": 9834557, - "excess_mana": 1251579281, - "mana_used": 102847677 + "eth_per_fee_asset": 10728156, + "excess_mana": 1036508171, + "mana_used": 70316689 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": 82 }, "outputs": { - "eth_per_fee_asset_at_execution": 9838493, + "eth_per_fee_asset_at_execution": 10640901, "l1_fee_oracle_output": { "base_fee": 14639051101, "blob_fee": 12860 @@ -17282,44 +17282,44 @@ "slot_of_change": 100 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77387258495788, - "congestion_multiplier": 4324721563, - "prover_cost": 18812498519845, - "sequencer_cost": 4463814122753 + "congestion_cost": 99047245341349, + "congestion_multiplier": 5037715720, + "prover_cost": 19027571819342, + "sequencer_cost": 5502943030859 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 761374001, - "congestion_multiplier": 4324721563, - "prover_cost": 185086635, - "sequencer_cost": 43917204 + "congestion_cost": 1053951932, + "congestion_multiplier": 5037715720, + "prover_cost": 202470508, + "sequencer_cost": 58556272 } }, "parent_fee_header": { - "eth_per_fee_asset": 9838493, - "excess_mana": 1321143391, - "mana_used": 30435890 + "eth_per_fee_asset": 10640901, + "excess_mana": 1031710630, + "mana_used": 79797541 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 99, "l1_block_number": 20973457, - "mana_spent": 152431226, - "size_in_fields": 5400, + "mana_spent": 74333367, + "size_in_fields": 2565, "slot_number": 99, "timestamp": 1729025387 }, "fee_header": { - "eth_per_fee_asset": 9826689, - "excess_mana": 1254426958, - "mana_used": 152431226 + "eth_per_fee_asset": 10742102, + "excess_mana": 1031824860, + "mana_used": 74333367 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 9834557, + "eth_per_fee_asset_at_execution": 10728156, "l1_fee_oracle_output": { "base_fee": 14639051101, "blob_fee": 12860 @@ -17336,22 +17336,22 @@ "slot_of_change": 100 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77754313386969, - "congestion_multiplier": 4339154624, - "prover_cost": 18820027684013, - "sequencer_cost": 4465600636613 + "congestion_cost": 97349418949539, + "congestion_multiplier": 5001044467, + "prover_cost": 18872815421402, + "sequencer_cost": 5458186103931 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 764679227, - "congestion_multiplier": 4339154624, - "prover_cost": 185086635, - "sequencer_cost": 43917204 + "congestion_cost": 1044379753, + "congestion_multiplier": 5001044467, + "prover_cost": 202470508, + "sequencer_cost": 58556272 } }, "parent_fee_header": { - "eth_per_fee_asset": 9834557, - "excess_mana": 1251579281, - "mana_used": 102847677 + "eth_per_fee_asset": 10728156, + "excess_mana": 1036508171, + "mana_used": 70316689 } }, { @@ -17359,21 +17359,21 @@ "blobs_needed": 1, "block_number": 100, "l1_block_number": 20973460, - "mana_spent": 104545049, - "size_in_fields": 3585, + "mana_spent": 87454554, + "size_in_fields": 2835, "slot_number": 100, "timestamp": 1729025423 }, "fee_header": { - "eth_per_fee_asset": 9822758, - "excess_mana": 1306858184, - "mana_used": 104545049 + "eth_per_fee_asset": 10736730, + "excess_mana": 1031158227, + "mana_used": 87454554 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 9826689, + "eth_per_fee_asset_at_execution": 10742102, "l1_fee_oracle_output": { "base_fee": 15731296612, "blob_fee": 12365 @@ -17390,22 +17390,22 @@ "slot_of_change": 100 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85544506089488, - "congestion_multiplier": 4613672033, - "prover_cost": 18869831130303, - "sequencer_cost": 4802628738938 + "congestion_cost": 99331336083013, + "congestion_multiplier": 4995846347, + "prover_cost": 19000832053168, + "sequencer_cost": 5857815537406 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 840619257, - "congestion_multiplier": 4613672033, - "prover_cost": 185427962, - "sequencer_cost": 47193939 + "congestion_cost": 1067027344, + "congestion_multiplier": 4995846347, + "prover_cost": 204108876, + "sequencer_cost": 62925252 } }, "parent_fee_header": { - "eth_per_fee_asset": 9826689, - "excess_mana": 1254426958, - "mana_used": 152431226 + "eth_per_fee_asset": 10742102, + "excess_mana": 1031824860, + "mana_used": 74333367 } }, { @@ -17413,21 +17413,21 @@ "blobs_needed": 1, "block_number": 101, "l1_block_number": 20973463, - "mana_spent": 107304909, - "size_in_fields": 3915, + "mana_spent": 68102391, + "size_in_fields": 2310, "slot_number": 101, "timestamp": 1729025459 }, "fee_header": { - "eth_per_fee_asset": 9787396, - "excess_mana": 1311403233, - "mana_used": 107304909 + "eth_per_fee_asset": 10773234, + "excess_mana": 1043612781, + "mana_used": 68102391 }, "oracle_input": { - "fee_asset_price_modifier": -36 + "fee_asset_price_modifier": 34 }, "outputs": { - "eth_per_fee_asset_at_execution": 9822758, + "eth_per_fee_asset_at_execution": 10736730, "l1_fee_oracle_output": { "base_fee": 15731296612, "blob_fee": 12365 @@ -17444,22 +17444,22 @@ "slot_of_change": 100 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86161304289488, - "congestion_multiplier": 4638271539, - "prover_cost": 18877382706568, - "sequencer_cost": 4804550717834 + "congestion_cost": 101818747421236, + "congestion_multiplier": 5093860245, + "prover_cost": 19010338902068, + "sequencer_cost": 5860746428382 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 846341641, - "congestion_multiplier": 4638271539, - "prover_cost": 185427962, - "sequencer_cost": 47193939 + "congestion_cost": 1093200400, + "congestion_multiplier": 5093860245, + "prover_cost": 204108876, + "sequencer_cost": 62925252 } }, "parent_fee_header": { - "eth_per_fee_asset": 9822758, - "excess_mana": 1306858184, - "mana_used": 104545049 + "eth_per_fee_asset": 10736730, + "excess_mana": 1031158227, + "mana_used": 87454554 } }, { @@ -17467,21 +17467,21 @@ "blobs_needed": 1, "block_number": 102, "l1_block_number": 20973466, - "mana_spent": 102118800, - "size_in_fields": 3540, + "mana_spent": 57016703, + "size_in_fields": 2265, "slot_number": 102, "timestamp": 1729025495 }, "fee_header": { - "eth_per_fee_asset": 9840247, - "excess_mana": 1318708142, - "mana_used": 102118800 + "eth_per_fee_asset": 10748455, + "excess_mana": 1036715172, + "mana_used": 57016703 }, "oracle_input": { - "fee_asset_price_modifier": 54 + "fee_asset_price_modifier": -23 }, "outputs": { - "eth_per_fee_asset_at_execution": 9787396, + "eth_per_fee_asset_at_execution": 10773234, "l1_fee_oracle_output": { "base_fee": 15731296612, "blob_fee": 12365 @@ -17498,22 +17498,22 @@ "slot_of_change": 100 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87418838064793, - "congestion_multiplier": 4678083546, - "prover_cost": 18945586956940, - "sequencer_cost": 4821909627444 + "congestion_cost": 100122430646174, + "congestion_multiplier": 5039342770, + "prover_cost": 18945924315763, + "sequencer_cost": 5840887889375 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 855602786, - "congestion_multiplier": 4678083546, - "prover_cost": 185427962, - "sequencer_cost": 47193939 + "congestion_cost": 1078642374, + "congestion_multiplier": 5039342770, + "prover_cost": 204108876, + "sequencer_cost": 62925252 } }, "parent_fee_header": { - "eth_per_fee_asset": 9787396, - "excess_mana": 1311403233, - "mana_used": 107304909 + "eth_per_fee_asset": 10773234, + "excess_mana": 1043612781, + "mana_used": 68102391 } }, { @@ -17521,21 +17521,21 @@ "blobs_needed": 1, "block_number": 103, "l1_block_number": 20973469, - "mana_spent": 102180390, - "size_in_fields": 3690, + "mana_spent": 49222447, + "size_in_fields": 1860, "slot_number": 103, "timestamp": 1729025531 }, "fee_header": { - "eth_per_fee_asset": 9819582, - "excess_mana": 1320826942, - "mana_used": 102180390 + "eth_per_fee_asset": 10773176, + "excess_mana": 1018731875, + "mana_used": 49222447 }, "oracle_input": { - "fee_asset_price_modifier": -21 + "fee_asset_price_modifier": 23 }, "outputs": { - "eth_per_fee_asset_at_execution": 9840247, + "eth_per_fee_asset_at_execution": 10748455, "l1_fee_oracle_output": { "base_fee": 15731296612, "blob_fee": 12365 @@ -17552,22 +17552,22 @@ "slot_of_change": 105 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87223810235658, - "congestion_multiplier": 4689694882, - "prover_cost": 18843832070476, - "sequencer_cost": 4796011624505 + "congestion_cost": 96889782205908, + "congestion_multiplier": 4899933960, + "prover_cost": 18989601389223, + "sequencer_cost": 5854353207043 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 858303837, - "congestion_multiplier": 4689694882, - "prover_cost": 185427962, - "sequencer_cost": 47193939 + "congestion_cost": 1041415464, + "congestion_multiplier": 4899933960, + "prover_cost": 204108876, + "sequencer_cost": 62925252 } }, "parent_fee_header": { - "eth_per_fee_asset": 9840247, - "excess_mana": 1318708142, - "mana_used": 102118800 + "eth_per_fee_asset": 10748455, + "excess_mana": 1036715172, + "mana_used": 57016703 } }, { @@ -17575,21 +17575,21 @@ "blobs_needed": 1, "block_number": 104, "l1_block_number": 20973472, - "mana_spent": 82924209, - "size_in_fields": 3180, + "mana_spent": 104050726, + "size_in_fields": 3495, "slot_number": 104, "timestamp": 1729025567 }, "fee_header": { - "eth_per_fee_asset": 9873589, - "excess_mana": 1323007332, - "mana_used": 82924209 + "eth_per_fee_asset": 10785026, + "excess_mana": 992954322, + "mana_used": 104050726 }, "oracle_input": { - "fee_asset_price_modifier": 55 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 9819582, + "eth_per_fee_asset_at_execution": 10773176, "l1_fee_oracle_output": { "base_fee": 15731296612, "blob_fee": 12365 @@ -17606,22 +17606,22 @@ "slot_of_change": 105 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87691146425582, - "congestion_multiplier": 4701673831, - "prover_cost": 18883488319564, - "sequencer_cost": 4806104679405 + "congestion_cost": 91880305306439, + "congestion_multiplier": 4706802227, + "prover_cost": 18946026315731, + "sequencer_cost": 5840919335209 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 861090403, - "congestion_multiplier": 4701673831, - "prover_cost": 185427962, - "sequencer_cost": 47193939 + "congestion_cost": 989842700, + "congestion_multiplier": 4706802227, + "prover_cost": 204108876, + "sequencer_cost": 62925252 } }, "parent_fee_header": { - "eth_per_fee_asset": 9819582, - "excess_mana": 1320826942, - "mana_used": 102180390 + "eth_per_fee_asset": 10773176, + "excess_mana": 1018731875, + "mana_used": 49222447 } }, { @@ -17629,21 +17629,21 @@ "blobs_needed": 1, "block_number": 105, "l1_block_number": 20973475, - "mana_spent": 108239714, - "size_in_fields": 4050, + "mana_spent": 75202044, + "size_in_fields": 2595, "slot_number": 105, "timestamp": 1729025603 }, "fee_header": { - "eth_per_fee_asset": 9854829, - "excess_mana": 1305931541, - "mana_used": 108239714 + "eth_per_fee_asset": 10779633, + "excess_mana": 1022005048, + "mana_used": 75202044 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 9873589, + "eth_per_fee_asset_at_execution": 10785026, "l1_fee_oracle_output": { "base_fee": 13240913043, "blob_fee": 10568 @@ -17660,22 +17660,22 @@ "slot_of_change": 105 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82005328963967, - "congestion_multiplier": 4608672728, - "prover_cost": 18701377685460, - "sequencer_cost": 4023134951233 + "congestion_cost": 92197483344037, + "congestion_multiplier": 4925017743, + "prover_cost": 18578842647204, + "sequencer_cost": 4910855847729 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 809686914, - "congestion_multiplier": 4608672728, - "prover_cost": 184649717, - "sequencer_cost": 39722781 + "congestion_cost": 994352255, + "congestion_multiplier": 4925017743, + "prover_cost": 200373301, + "sequencer_cost": 52963708 } }, "parent_fee_header": { - "eth_per_fee_asset": 9873589, - "excess_mana": 1323007332, - "mana_used": 82924209 + "eth_per_fee_asset": 10785026, + "excess_mana": 992954322, + "mana_used": 104050726 } }, { @@ -17683,21 +17683,21 @@ "blobs_needed": 1, "block_number": 106, "l1_block_number": 20973478, - "mana_spent": 111185778, - "size_in_fields": 3915, + "mana_spent": 75496512, + "size_in_fields": 2640, "slot_number": 106, "timestamp": 1729025639 }, "fee_header": { - "eth_per_fee_asset": 9854829, - "excess_mana": 1314171255, - "mana_used": 111185778 + "eth_per_fee_asset": 10874493, + "excess_mana": 1022207092, + "mana_used": 75496512 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": 88 }, "outputs": { - "eth_per_fee_asset_at_execution": 9854829, + "eth_per_fee_asset_at_execution": 10779633, "l1_fee_oracle_output": { "base_fee": 13240913043, "blob_fee": 10568 @@ -17714,22 +17714,22 @@ "slot_of_change": 105 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83177895324212, - "congestion_multiplier": 4653317330, - "prover_cost": 18736978287498, - "sequencer_cost": 4030793532795 + "congestion_cost": 92280096548742, + "congestion_multiplier": 4926570298, + "prover_cost": 18588137555333, + "sequencer_cost": 4913312725953 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 819703935, - "congestion_multiplier": 4653317330, - "prover_cost": 184649717, - "sequencer_cost": 39722781 + "congestion_cost": 994745574, + "congestion_multiplier": 4926570298, + "prover_cost": 200373301, + "sequencer_cost": 52963708 } }, "parent_fee_header": { - "eth_per_fee_asset": 9854829, - "excess_mana": 1305931541, - "mana_used": 108239714 + "eth_per_fee_asset": 10779633, + "excess_mana": 1022005048, + "mana_used": 75202044 } }, { @@ -17737,21 +17737,21 @@ "blobs_needed": 1, "block_number": 107, "l1_block_number": 20973481, - "mana_spent": 80654808, - "size_in_fields": 2805, + "mana_spent": 74127566, + "size_in_fields": 2760, "slot_number": 107, "timestamp": 1729025675 }, "fee_header": { - "eth_per_fee_asset": 9831177, - "excess_mana": 1325357033, - "mana_used": 80654808 + "eth_per_fee_asset": 10864705, + "excess_mana": 1022703604, + "mana_used": 74127566 }, "oracle_input": { - "fee_asset_price_modifier": -24 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 9854829, + "eth_per_fee_asset_at_execution": 10874493, "l1_fee_oracle_output": { "base_fee": 13240913043, "blob_fee": 10568 @@ -17768,44 +17768,44 @@ "slot_of_change": 105 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84573557288514, - "congestion_multiplier": 4714617222, - "prover_cost": 18736978287498, - "sequencer_cost": 4030793532795 + "congestion_cost": 91564053790830, + "congestion_multiplier": 4930387694, + "prover_cost": 18425990158806, + "sequencer_cost": 4870453086871 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 833457945, - "congestion_multiplier": 4714617222, - "prover_cost": 184649717, - "sequencer_cost": 39722781 + "congestion_cost": 995712662, + "congestion_multiplier": 4930387694, + "prover_cost": 200373301, + "sequencer_cost": 52963708 } }, "parent_fee_header": { - "eth_per_fee_asset": 9854829, - "excess_mana": 1314171255, - "mana_used": 111185778 + "eth_per_fee_asset": 10874493, + "excess_mana": 1022207092, + "mana_used": 75496512 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 108, "l1_block_number": 20973484, - "mana_spent": 121573764, - "size_in_fields": 4140, + "mana_spent": 63806606, + "size_in_fields": 2310, "slot_number": 108, "timestamp": 1729025723 }, "fee_header": { - "eth_per_fee_asset": 9806599, - "excess_mana": 1306011841, - "mana_used": 121573764 + "eth_per_fee_asset": 10854926, + "excess_mana": 1021831170, + "mana_used": 63806606 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 9831177, + "eth_per_fee_asset_at_execution": 10864705, "l1_fee_oracle_output": { "base_fee": 13240913043, "blob_fee": 10568 @@ -17822,22 +17822,22 @@ "slot_of_change": 110 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82368984812297, - "congestion_multiplier": 4609105738, - "prover_cost": 18782056004078, - "sequencer_cost": 4040490879170 + "congestion_cost": 91490184501098, + "congestion_multiplier": 4923682015, + "prover_cost": 18442590111743, + "sequencer_cost": 4874840872348 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 809784069, - "congestion_multiplier": 4609105738, - "prover_cost": 184649717, - "sequencer_cost": 39722781 + "congestion_cost": 994013865, + "congestion_multiplier": 4923682015, + "prover_cost": 200373301, + "sequencer_cost": 52963708 } }, "parent_fee_header": { - "eth_per_fee_asset": 9831177, - "excess_mana": 1325357033, - "mana_used": 80654808 + "eth_per_fee_asset": 10864705, + "excess_mana": 1022703604, + "mana_used": 74127566 } }, { @@ -17845,21 +17845,21 @@ "blobs_needed": 1, "block_number": 109, "l1_block_number": 20973486, - "mana_spent": 92584796, - "size_in_fields": 3240, + "mana_spent": 75381554, + "size_in_fields": 2730, "slot_number": 109, "timestamp": 1729025747 }, "fee_header": { - "eth_per_fee_asset": 9741875, - "excess_mana": 1327585605, - "mana_used": 92584796 + "eth_per_fee_asset": 10877721, + "excess_mana": 1010637776, + "mana_used": 75381554 }, "oracle_input": { - "fee_asset_price_modifier": -66 + "fee_asset_price_modifier": 21 }, "outputs": { - "eth_per_fee_asset_at_execution": 9806599, + "eth_per_fee_asset_at_execution": 10854926, "l1_fee_oracle_output": { "base_fee": 13240913043, "blob_fee": 10568 @@ -17876,22 +17876,22 @@ "slot_of_change": 110 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85271128349391, - "congestion_multiplier": 4726926293, - "prover_cost": 18829128936546, - "sequencer_cost": 4050617446477 + "congestion_cost": 89583482098358, + "congestion_multiplier": 4838452475, + "prover_cost": 18459204696559, + "sequencer_cost": 4879232525400 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 836219762, - "congestion_multiplier": 4726926293, - "prover_cost": 184649717, - "sequencer_cost": 39722781 + "congestion_cost": 972422069, + "congestion_multiplier": 4838452475, + "prover_cost": 200373301, + "sequencer_cost": 52963708 } }, "parent_fee_header": { - "eth_per_fee_asset": 9806599, - "excess_mana": 1306011841, - "mana_used": 121573764 + "eth_per_fee_asset": 10854926, + "excess_mana": 1021831170, + "mana_used": 63806606 } }, { @@ -17899,21 +17899,21 @@ "blobs_needed": 1, "block_number": 110, "l1_block_number": 20973489, - "mana_spent": 110234829, - "size_in_fields": 3930, + "mana_spent": 93171079, + "size_in_fields": 3135, "slot_number": 110, "timestamp": 1729025795 }, "fee_header": { - "eth_per_fee_asset": 9733107, - "excess_mana": 1320170401, - "mana_used": 110234829 + "eth_per_fee_asset": 10847263, + "excess_mana": 1011019330, + "mana_used": 93171079 }, "oracle_input": { - "fee_asset_price_modifier": -9 + "fee_asset_price_modifier": -28 }, "outputs": { - "eth_per_fee_asset_at_execution": 9741875, + "eth_per_fee_asset_at_execution": 10877721, "l1_fee_oracle_output": { "base_fee": 13464750718, "blob_fee": 10568 @@ -17930,22 +17930,22 @@ "slot_of_change": 110 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85177769782512, - "congestion_multiplier": 4686093863, - "prover_cost": 18961407942517, - "sequencer_cost": 4146459896068 + "congestion_cost": 89897597391954, + "congestion_multiplier": 4841333296, + "prover_cost": 18451388668638, + "sequencer_cost": 4951318295441 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 829791186, - "congestion_multiplier": 4686093863, - "prover_cost": 184719666, - "sequencer_cost": 40394294 + "congestion_cost": 977880983, + "congestion_multiplier": 4841333296, + "prover_cost": 200709058, + "sequencer_cost": 53859059 } }, "parent_fee_header": { - "eth_per_fee_asset": 9741875, - "excess_mana": 1327585605, - "mana_used": 92584796 + "eth_per_fee_asset": 10877721, + "excess_mana": 1010637776, + "mana_used": 75381554 } }, { @@ -17953,21 +17953,21 @@ "blobs_needed": 1, "block_number": 111, "l1_block_number": 20973491, - "mana_spent": 83867923, - "size_in_fields": 2970, + "mana_spent": 67103872, + "size_in_fields": 2430, "slot_number": 111, "timestamp": 1729025819 }, "fee_header": { - "eth_per_fee_asset": 9795398, - "excess_mana": 1330405230, - "mana_used": 83867923 + "eth_per_fee_asset": 10876550, + "excess_mana": 1029190409, + "mana_used": 67103872 }, "oracle_input": { - "fee_asset_price_modifier": 64 + "fee_asset_price_modifier": 27 }, "outputs": { - "eth_per_fee_asset_at_execution": 9733107, + "eth_per_fee_asset_at_execution": 10847263, "l1_fee_oracle_output": { "base_fee": 13464750718, "blob_fee": 10568 @@ -17984,22 +17984,22 @@ "slot_of_change": 110 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86560165012057, - "congestion_multiplier": 4742545990, - "prover_cost": 18978489191581, - "sequencer_cost": 4150195204882 + "congestion_cost": 93416832522638, + "congestion_multiplier": 4980533633, + "prover_cost": 18503198272228, + "sequencer_cost": 4965221088491 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 842499348, - "congestion_multiplier": 4742545990, - "prover_cost": 184719666, - "sequencer_cost": 40394294 + "congestion_cost": 1013316951, + "congestion_multiplier": 4980533633, + "prover_cost": 200709058, + "sequencer_cost": 53859059 } }, "parent_fee_header": { - "eth_per_fee_asset": 9733107, - "excess_mana": 1320170401, - "mana_used": 110234829 + "eth_per_fee_asset": 10847263, + "excess_mana": 1011019330, + "mana_used": 93171079 } }, { @@ -18007,21 +18007,21 @@ "blobs_needed": 1, "block_number": 112, "l1_block_number": 20973494, - "mana_spent": 116564447, - "size_in_fields": 4035, + "mana_spent": 71950464, + "size_in_fields": 2400, "slot_number": 112, "timestamp": 1729025867 }, "fee_header": { - "eth_per_fee_asset": 9779725, - "excess_mana": 1314273153, - "mana_used": 116564447 + "eth_per_fee_asset": 10868936, + "excess_mana": 1021294281, + "mana_used": 71950464 }, "oracle_input": { - "fee_asset_price_modifier": -16 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 9795398, + "eth_per_fee_asset_at_execution": 10876550, "l1_fee_oracle_output": { "base_fee": 13464750718, "blob_fee": 10568 @@ -18038,22 +18038,22 @@ "slot_of_change": 110 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83971843206371, - "congestion_multiplier": 4653872134, - "prover_cost": 18857800979603, - "sequencer_cost": 4123803239032 + "congestion_cost": 91738188120314, + "congestion_multiplier": 4919559927, + "prover_cost": 18453375197099, + "sequencer_cost": 4951851368311 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 822537625, - "congestion_multiplier": 4653872134, - "prover_cost": 184719666, - "sequencer_cost": 40394294 + "congestion_cost": 997794990, + "congestion_multiplier": 4919559927, + "prover_cost": 200709058, + "sequencer_cost": 53859059 } }, "parent_fee_header": { - "eth_per_fee_asset": 9795398, - "excess_mana": 1330405230, - "mana_used": 83867923 + "eth_per_fee_asset": 10876550, + "excess_mana": 1029190409, + "mana_used": 67103872 } }, { @@ -18061,21 +18061,21 @@ "blobs_needed": 1, "block_number": 113, "l1_block_number": 20973496, - "mana_spent": 88393423, - "size_in_fields": 3210, + "mana_spent": 72614300, + "size_in_fields": 2625, "slot_number": 113, "timestamp": 1729025891 }, "fee_header": { - "eth_per_fee_asset": 9758209, - "excess_mana": 1330837600, - "mana_used": 88393423 + "eth_per_fee_asset": 10880891, + "excess_mana": 1018244745, + "mana_used": 72614300 }, "oracle_input": { - "fee_asset_price_modifier": -22 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 9779725, + "eth_per_fee_asset_at_execution": 10868936, "l1_fee_oracle_output": { "base_fee": 13464750718, "blob_fee": 10568 @@ -18092,22 +18092,22 @@ "slot_of_change": 115 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86202788012956, - "congestion_multiplier": 4744945723, - "prover_cost": 18888022515971, - "sequencer_cost": 4130412051464 + "congestion_cost": 91255602388312, + "congestion_multiplier": 4896211803, + "prover_cost": 18466302313309, + "sequencer_cost": 4955320281581 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 843039561, - "congestion_multiplier": 4744945723, - "prover_cost": 184719666, - "sequencer_cost": 40394294 + "congestion_cost": 991851302, + "congestion_multiplier": 4896211803, + "prover_cost": 200709058, + "sequencer_cost": 53859059 } }, "parent_fee_header": { - "eth_per_fee_asset": 9779725, - "excess_mana": 1314273153, - "mana_used": 116564447 + "eth_per_fee_asset": 10868936, + "excess_mana": 1021294281, + "mana_used": 71950464 } }, { @@ -18115,21 +18115,21 @@ "blobs_needed": 1, "block_number": 114, "l1_block_number": 20973499, - "mana_spent": 96898304, - "size_in_fields": 3615, + "mana_spent": 94374775, + "size_in_fields": 3120, "slot_number": 114, "timestamp": 1729025927 }, "fee_header": { - "eth_per_fee_asset": 9819685, - "excess_mana": 1319231023, - "mana_used": 96898304 + "eth_per_fee_asset": 10911357, + "excess_mana": 1015859045, + "mana_used": 94374775 }, "oracle_input": { - "fee_asset_price_modifier": 63 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 9758209, + "eth_per_fee_asset_at_execution": 10880891, "l1_fee_oracle_output": { "base_fee": 13464750718, "blob_fee": 10568 @@ -18146,22 +18146,22 @@ "slot_of_change": 115 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84916443785945, - "congestion_multiplier": 4680946336, - "prover_cost": 18929668958720, - "sequencer_cost": 4139519249896 + "congestion_cost": 90729806410156, + "congestion_multiplier": 4878023477, + "prover_cost": 18446013106832, + "sequencer_cost": 4949875796018 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 828632406, - "congestion_multiplier": 4680946336, - "prover_cost": 184719666, - "sequencer_cost": 40394294 + "congestion_cost": 987221134, + "congestion_multiplier": 4878023477, + "prover_cost": 200709058, + "sequencer_cost": 53859059 } }, "parent_fee_header": { - "eth_per_fee_asset": 9758209, - "excess_mana": 1330837600, - "mana_used": 88393423 + "eth_per_fee_asset": 10880891, + "excess_mana": 1018244745, + "mana_used": 72614300 } }, { @@ -18169,21 +18169,21 @@ "blobs_needed": 1, "block_number": 115, "l1_block_number": 20973502, - "mana_spent": 112184570, - "size_in_fields": 3705, + "mana_spent": 64763498, + "size_in_fields": 2415, "slot_number": 115, "timestamp": 1729025963 }, "fee_header": { - "eth_per_fee_asset": 9816739, - "excess_mana": 1316129327, - "mana_used": 112184570 + "eth_per_fee_asset": 10880805, + "excess_mana": 1035233820, + "mana_used": 64763498 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": -28 }, "outputs": { - "eth_per_fee_asset_at_execution": 9819685, + "eth_per_fee_asset_at_execution": 10911357, "l1_fee_oracle_output": { "base_fee": 15822867626, "blob_fee": 12860 @@ -18200,22 +18200,22 @@ "slot_of_change": 115 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86910703347409, - "congestion_multiplier": 4663990041, - "prover_cost": 18886204394541, - "sequencer_cost": 4834030215837 + "congestion_cost": 98756255156898, + "congestion_multiplier": 5027710752, + "prover_cost": 18718683019904, + "sequencer_cost": 5800519403774 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 853435730, - "congestion_multiplier": 4663990041, - "prover_cost": 185456578, - "sequencer_cost": 47468654 + "congestion_cost": 1077564756, + "congestion_multiplier": 5027710752, + "prover_cost": 204246233, + "sequencer_cost": 63291538 } }, "parent_fee_header": { - "eth_per_fee_asset": 9819685, - "excess_mana": 1319231023, - "mana_used": 96898304 + "eth_per_fee_asset": 10911357, + "excess_mana": 1015859045, + "mana_used": 94374775 } }, { @@ -18223,21 +18223,21 @@ "blobs_needed": 1, "block_number": 116, "l1_block_number": 20973505, - "mana_spent": 106268178, - "size_in_fields": 3585, + "mana_spent": 73468194, + "size_in_fields": 2400, "slot_number": 116, "timestamp": 1729025999 }, "fee_header": { - "eth_per_fee_asset": 9914906, - "excess_mana": 1328313897, - "mana_used": 106268178 + "eth_per_fee_asset": 10867748, + "excess_mana": 1024997318, + "mana_used": 73468194 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -12 }, "outputs": { - "eth_per_fee_asset_at_execution": 9816739, + "eth_per_fee_asset_at_execution": 10880805, "l1_fee_oracle_output": { "base_fee": 15822867626, "blob_fee": 12860 @@ -18254,22 +18254,22 @@ "slot_of_change": 115 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88525706143354, - "congestion_multiplier": 4730955832, - "prover_cost": 18891872137988, - "sequencer_cost": 4835480906644 + "congestion_cost": 97075123301999, + "congestion_multiplier": 4948061177, + "prover_cost": 18771242844625, + "sequencer_cost": 5816806569000 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 869033752, - "congestion_multiplier": 4730955832, - "prover_cost": 185456578, - "sequencer_cost": 47468654 + "congestion_cost": 1056255487, + "congestion_multiplier": 4948061177, + "prover_cost": 204246233, + "sequencer_cost": 63291538 } }, "parent_fee_header": { - "eth_per_fee_asset": 9816739, - "excess_mana": 1316129327, - "mana_used": 112184570 + "eth_per_fee_asset": 10880805, + "excess_mana": 1035233820, + "mana_used": 64763498 } }, { @@ -18277,21 +18277,21 @@ "blobs_needed": 1, "block_number": 117, "l1_block_number": 20973508, - "mana_spent": 102261087, - "size_in_fields": 3285, + "mana_spent": 67181071, + "size_in_fields": 2250, "slot_number": 117, "timestamp": 1729026035 }, "fee_header": { - "eth_per_fee_asset": 9995216, - "excess_mana": 1334582075, - "mana_used": 102261087 + "eth_per_fee_asset": 10889483, + "excess_mana": 1023465512, + "mana_used": 67181071 }, "oracle_input": { - "fee_asset_price_modifier": 81 + "fee_asset_price_modifier": 20 }, "outputs": { - "eth_per_fee_asset_at_execution": 9914906, + "eth_per_fee_asset_at_execution": 10867748, "l1_fee_oracle_output": { "base_fee": 15822867626, "blob_fee": 12860 @@ -18308,22 +18308,22 @@ "slot_of_change": 115 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88467300648136, - "congestion_multiplier": 4765779102, - "prover_cost": 18704824634747, - "sequencer_cost": 4787605046382 + "congestion_cost": 96901023468708, + "congestion_multiplier": 4936251321, + "prover_cost": 18793795457900, + "sequencer_cost": 5823795141367 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 877144970, - "congestion_multiplier": 4765779102, - "prover_cost": 185456578, - "sequencer_cost": 47468654 + "congestion_cost": 1053095904, + "congestion_multiplier": 4936251321, + "prover_cost": 204246233, + "sequencer_cost": 63291538 } }, "parent_fee_header": { - "eth_per_fee_asset": 9914906, - "excess_mana": 1328313897, - "mana_used": 106268178 + "eth_per_fee_asset": 10867748, + "excess_mana": 1024997318, + "mana_used": 73468194 } }, { @@ -18331,21 +18331,21 @@ "blobs_needed": 1, "block_number": 118, "l1_block_number": 20973511, - "mana_spent": 88466079, - "size_in_fields": 2970, + "mana_spent": 84384235, + "size_in_fields": 3000, "slot_number": 118, "timestamp": 1729026071 }, "fee_header": { - "eth_per_fee_asset": 9941241, - "excess_mana": 1336843162, - "mana_used": 88466079 + "eth_per_fee_asset": 10942841, + "excess_mana": 1015646583, + "mana_used": 84384235 }, "oracle_input": { - "fee_asset_price_modifier": -54 + "fee_asset_price_modifier": 49 }, "outputs": { - "eth_per_fee_asset_at_execution": 9995216, + "eth_per_fee_asset_at_execution": 10889483, "l1_fee_oracle_output": { "base_fee": 15822867626, "blob_fee": 12860 @@ -18362,22 +18362,22 @@ "slot_of_change": 120 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88050675243037, - "congestion_multiplier": 4778403528, - "prover_cost": 18554534289204, - "sequencer_cost": 4749137387327 + "congestion_cost": 95237329357143, + "congestion_multiplier": 4876406969, + "prover_cost": 18756283746437, + "sequencer_cost": 5812171064504 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 880085518, - "congestion_multiplier": 4778403528, - "prover_cost": 185456578, - "sequencer_cost": 47468654 + "congestion_cost": 1037085279, + "congestion_multiplier": 4876406969, + "prover_cost": 204246233, + "sequencer_cost": 63291538 } }, "parent_fee_header": { - "eth_per_fee_asset": 9995216, - "excess_mana": 1334582075, - "mana_used": 102261087 + "eth_per_fee_asset": 10889483, + "excess_mana": 1023465512, + "mana_used": 67181071 } }, { @@ -18385,21 +18385,21 @@ "blobs_needed": 1, "block_number": 119, "l1_block_number": 20973514, - "mana_spent": 107556628, - "size_in_fields": 3630, + "mana_spent": 75032397, + "size_in_fields": 2595, "slot_number": 119, "timestamp": 1729026107 }, "fee_header": { - "eth_per_fee_asset": 9898493, - "excess_mana": 1325309241, - "mana_used": 107556628 + "eth_per_fee_asset": 11024912, + "excess_mana": 1025030818, + "mana_used": 75032397 }, "oracle_input": { - "fee_asset_price_modifier": -43 + "fee_asset_price_modifier": 75 }, "outputs": { - "eth_per_fee_asset_at_execution": 9941241, + "eth_per_fee_asset_at_execution": 10942841, "l1_fee_oracle_output": { "base_fee": 15822867626, "blob_fee": 12860 @@ -18416,22 +18416,22 @@ "slot_of_change": 120 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87028035433404, - "congestion_multiplier": 4714353604, - "prover_cost": 18655274326415, - "sequencer_cost": 4774922366333 + "congestion_cost": 96531117467576, + "congestion_multiplier": 4948319770, + "prover_cost": 18664826894588, + "sequencer_cost": 5783830542727 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 865166674, - "congestion_multiplier": 4714353604, - "prover_cost": 185456578, - "sequencer_cost": 47468654 + "congestion_cost": 1056324670, + "congestion_multiplier": 4948319770, + "prover_cost": 204246233, + "sequencer_cost": 63291538 } }, "parent_fee_header": { - "eth_per_fee_asset": 9941241, - "excess_mana": 1336843162, - "mana_used": 88466079 + "eth_per_fee_asset": 10942841, + "excess_mana": 1015646583, + "mana_used": 84384235 } }, { @@ -18439,21 +18439,21 @@ "blobs_needed": 1, "block_number": 120, "l1_block_number": 20973517, - "mana_spent": 88476930, - "size_in_fields": 3345, + "mana_spent": 78833751, + "size_in_fields": 2790, "slot_number": 120, "timestamp": 1729026143 }, "fee_header": { - "eth_per_fee_asset": 9911361, - "excess_mana": 1332865869, - "mana_used": 88476930 + "eth_per_fee_asset": 10930097, + "excess_mana": 1025063215, + "mana_used": 78833751 }, "oracle_input": { - "fee_asset_price_modifier": 13 + "fee_asset_price_modifier": -86 }, "outputs": { - "eth_per_fee_asset_at_execution": 9898493, + "eth_per_fee_asset_at_execution": 11024912, "l1_fee_oracle_output": { "base_fee": 16153233546, "blob_fee": 13375 @@ -18470,22 +18470,22 @@ "slot_of_change": 120 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88804306473723, - "congestion_multiplier": 4756219205, - "prover_cost": 18746269457382, - "sequencer_cost": 4895669876213 + "congestion_cost": 96469358939101, + "congestion_multiplier": 4948569861, + "prover_cost": 18570831404369, + "sequencer_cost": 5860636801455 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 879028806, - "congestion_multiplier": 4756219205, - "prover_cost": 185559817, - "sequencer_cost": 48459754 + "congestion_cost": 1063566193, + "congestion_multiplier": 4948569861, + "prover_cost": 204741782, + "sequencer_cost": 64613005 } }, "parent_fee_header": { - "eth_per_fee_asset": 9898493, - "excess_mana": 1325309241, - "mana_used": 107556628 + "eth_per_fee_asset": 11024912, + "excess_mana": 1025030818, + "mana_used": 75032397 } }, { @@ -18493,21 +18493,21 @@ "blobs_needed": 1, "block_number": 121, "l1_block_number": 20973520, - "mana_spent": 94371004, - "size_in_fields": 3465, + "mana_spent": 63881770, + "size_in_fields": 2145, "slot_number": 121, "timestamp": 1729026179 }, "fee_header": { - "eth_per_fee_asset": 9850901, - "excess_mana": 1321342799, - "mana_used": 94371004 + "eth_per_fee_asset": 10938841, + "excess_mana": 1028896966, + "mana_used": 63881770 }, "oracle_input": { - "fee_asset_price_modifier": -61 + "fee_asset_price_modifier": 8 }, "outputs": { - "eth_per_fee_asset_at_execution": 9911361, + "eth_per_fee_asset_at_execution": 10930097, "l1_fee_oracle_output": { "base_fee": 16153233546, "blob_fee": 13375 @@ -18524,22 +18524,22 @@ "slot_of_change": 120 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87185140365688, - "congestion_multiplier": 4692526215, - "prover_cost": 18721931024408, - "sequencer_cost": 4889313788490 + "congestion_cost": 98037722355072, + "congestion_multiplier": 4978254210, + "prover_cost": 18731927264690, + "sequencer_cost": 5911475899986 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 864123400, - "congestion_multiplier": 4692526215, - "prover_cost": 185559817, - "sequencer_cost": 48459754 + "congestion_cost": 1071561815, + "congestion_multiplier": 4978254210, + "prover_cost": 204741782, + "sequencer_cost": 64613005 } }, "parent_fee_header": { - "eth_per_fee_asset": 9911361, - "excess_mana": 1332865869, - "mana_used": 88476930 + "eth_per_fee_asset": 10930097, + "excess_mana": 1025063215, + "mana_used": 78833751 } }, { @@ -18547,21 +18547,21 @@ "blobs_needed": 1, "block_number": 122, "l1_block_number": 20973523, - "mana_spent": 91535687, - "size_in_fields": 3315, + "mana_spent": 82450553, + "size_in_fields": 2910, "slot_number": 122, "timestamp": 1729026215 }, "fee_header": { - "eth_per_fee_asset": 9887349, - "excess_mana": 1315713803, - "mana_used": 91535687 + "eth_per_fee_asset": 10898367, + "excess_mana": 1017778736, + "mana_used": 82450553 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": -37 }, "outputs": { - "eth_per_fee_asset_at_execution": 9850901, + "eth_per_fee_asset_at_execution": 10938841, "l1_fee_oracle_output": { "base_fee": 16153233546, "blob_fee": 13375 @@ -18578,44 +18578,44 @@ "slot_of_change": 120 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86988477094634, - "congestion_multiplier": 4661723132, - "prover_cost": 18836837056834, - "sequencer_cost": 4919321999074 + "congestion_cost": 95851553377548, + "congestion_multiplier": 4892653677, + "prover_cost": 18716953834506, + "sequencer_cost": 5906750541488 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 856914876, - "congestion_multiplier": 4661723132, - "prover_cost": 185559817, - "sequencer_cost": 48459754 + "congestion_cost": 1048504902, + "congestion_multiplier": 4892653677, + "prover_cost": 204741782, + "sequencer_cost": 64613005 } }, "parent_fee_header": { - "eth_per_fee_asset": 9850901, - "excess_mana": 1321342799, - "mana_used": 94371004 + "eth_per_fee_asset": 10938841, + "excess_mana": 1028896966, + "mana_used": 63881770 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 123, "l1_block_number": 20973526, - "mana_spent": 121622173, - "size_in_fields": 4245, + "mana_spent": 74782041, + "size_in_fields": 2730, "slot_number": 123, "timestamp": 1729026251 }, "fee_header": { - "eth_per_fee_asset": 9845822, - "excess_mana": 1307249490, - "mana_used": 121622173 + "eth_per_fee_asset": 10991003, + "excess_mana": 1025229289, + "mana_used": 74782041 }, "oracle_input": { - "fee_asset_price_modifier": -42 + "fee_asset_price_modifier": 85 }, "outputs": { - "eth_per_fee_asset_at_execution": 9887349, + "eth_per_fee_asset_at_execution": 10898367, "l1_fee_oracle_output": { "base_fee": 16153233546, "blob_fee": 13375 @@ -18632,22 +18632,22 @@ "slot_of_change": 125 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85580513441976, - "congestion_multiplier": 4615784785, - "prover_cost": 18767398318802, - "sequencer_cost": 4901187770352 + "congestion_cost": 97621190862815, + "congestion_multiplier": 4949852080, + "prover_cost": 18786464247351, + "sequencer_cost": 5928686839047 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 846164404, - "congestion_multiplier": 4615784785, - "prover_cost": 185559817, - "sequencer_cost": 48459754 + "congestion_cost": 1063911565, + "congestion_multiplier": 4949852080, + "prover_cost": 204741782, + "sequencer_cost": 64613005 } }, "parent_fee_header": { - "eth_per_fee_asset": 9887349, - "excess_mana": 1315713803, - "mana_used": 91535687 + "eth_per_fee_asset": 10898367, + "excess_mana": 1017778736, + "mana_used": 82450553 } }, { @@ -18655,21 +18655,21 @@ "blobs_needed": 1, "block_number": 124, "l1_block_number": 20973529, - "mana_spent": 88776034, - "size_in_fields": 3105, + "mana_spent": 72699953, + "size_in_fields": 2445, "slot_number": 124, "timestamp": 1729026287 }, "fee_header": { - "eth_per_fee_asset": 9883236, - "excess_mana": 1328871663, - "mana_used": 88776034 + "eth_per_fee_asset": 11008588, + "excess_mana": 1025011330, + "mana_used": 72699953 }, "oracle_input": { - "fee_asset_price_modifier": 38 + "fee_asset_price_modifier": 16 }, "outputs": { - "eth_per_fee_asset_at_execution": 9845822, + "eth_per_fee_asset_at_execution": 10991003, "l1_fee_oracle_output": { "base_fee": 16153233546, "blob_fee": 13375 @@ -18686,22 +18686,22 @@ "slot_of_change": 125 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88752307323858, - "congestion_multiplier": 4734044196, - "prover_cost": 18846554101832, - "sequencer_cost": 4921859647676 + "congestion_cost": 96757166748113, + "congestion_multiplier": 4948169337, + "prover_cost": 18628125385827, + "sequencer_cost": 5878717802188 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 873839420, - "congestion_multiplier": 4734044196, - "prover_cost": 185559817, - "sequencer_cost": 48459754 + "congestion_cost": 1063458310, + "congestion_multiplier": 4948169337, + "prover_cost": 204741782, + "sequencer_cost": 64613005 } }, "parent_fee_header": { - "eth_per_fee_asset": 9845822, - "excess_mana": 1307249490, - "mana_used": 121622173 + "eth_per_fee_asset": 10991003, + "excess_mana": 1025229289, + "mana_used": 74782041 } }, { @@ -18709,21 +18709,21 @@ "blobs_needed": 1, "block_number": 125, "l1_block_number": 20973532, - "mana_spent": 102335358, - "size_in_fields": 3585, + "mana_spent": 75258893, + "size_in_fields": 2475, "slot_number": 125, "timestamp": 1729026323 }, "fee_header": { - "eth_per_fee_asset": 9858527, - "excess_mana": 1317647697, - "mana_used": 102335358 + "eth_per_fee_asset": 10898502, + "excess_mana": 1022711283, + "mana_used": 75258893 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 9883236, + "eth_per_fee_asset_at_execution": 11008588, "l1_fee_oracle_output": { "base_fee": 15411289484, "blob_fee": 9770 @@ -18740,22 +18740,22 @@ "slot_of_change": 125 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86040715004681, - "congestion_multiplier": 4672282950, - "prover_cost": 18751748819921, - "sequencer_cost": 4678013051596 + "congestion_cost": 94712022195763, + "congestion_multiplier": 4930446757, + "prover_cost": 18497273764810, + "sequencer_cost": 5599738131721 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 850360692, - "congestion_multiplier": 4672282950, - "prover_cost": 185327959, - "sequencer_cost": 46233907 + "congestion_cost": 1042645631, + "congestion_multiplier": 4930446757, + "prover_cost": 203628866, + "sequencer_cost": 61645210 } }, "parent_fee_header": { - "eth_per_fee_asset": 9883236, - "excess_mana": 1328871663, - "mana_used": 88776034 + "eth_per_fee_asset": 11008588, + "excess_mana": 1025011330, + "mana_used": 72699953 } }, { @@ -18763,21 +18763,21 @@ "blobs_needed": 1, "block_number": 126, "l1_block_number": 20973535, - "mana_spent": 91764510, - "size_in_fields": 3480, + "mana_spent": 72628197, + "size_in_fields": 2535, "slot_number": 126, "timestamp": 1729026359 }, "fee_header": { - "eth_per_fee_asset": 9954154, - "excess_mana": 1319983055, - "mana_used": 91764510 + "eth_per_fee_asset": 10841829, + "excess_mana": 1022970176, + "mana_used": 72628197 }, "oracle_input": { - "fee_asset_price_modifier": 97 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 9858527, + "eth_per_fee_asset_at_execution": 10898502, "l1_fee_oracle_output": { "base_fee": 15411289484, "blob_fee": 9770 @@ -18794,22 +18794,22 @@ "slot_of_change": 125 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86556637315088, - "congestion_multiplier": 4685066808, - "prover_cost": 18798747419366, - "sequencer_cost": 4689737827974 + "congestion_cost": 95717188564080, + "congestion_multiplier": 4932438433, + "prover_cost": 18684115119675, + "sequencer_cost": 5656301205432 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 853320946, - "congestion_multiplier": 4685066808, - "prover_cost": 185327959, - "sequencer_cost": 46233907 + "congestion_cost": 1043173971, + "congestion_multiplier": 4932438433, + "prover_cost": 203628866, + "sequencer_cost": 61645210 } }, "parent_fee_header": { - "eth_per_fee_asset": 9858527, - "excess_mana": 1317647697, - "mana_used": 102335358 + "eth_per_fee_asset": 10898502, + "excess_mana": 1022711283, + "mana_used": 75258893 } }, { @@ -18817,21 +18817,21 @@ "blobs_needed": 1, "block_number": 127, "l1_block_number": 20973538, - "mana_spent": 95246331, - "size_in_fields": 3390, + "mana_spent": 78117751, + "size_in_fields": 2715, "slot_number": 127, "timestamp": 1729026395 }, "fee_header": { - "eth_per_fee_asset": 9931259, - "excess_mana": 1311747565, - "mana_used": 95246331 + "eth_per_fee_asset": 10839660, + "excess_mana": 1020598373, + "mana_used": 78117751 }, "oracle_input": { - "fee_asset_price_modifier": -23 + "fee_asset_price_modifier": -2 }, "outputs": { - "eth_per_fee_asset_at_execution": 9954154, + "eth_per_fee_asset_at_execution": 10841829, "l1_fee_oracle_output": { "base_fee": 15411289484, "blob_fee": 9770 @@ -18848,22 +18848,22 @@ "slot_of_change": 125 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84679997215233, - "congestion_multiplier": 4640140529, - "prover_cost": 18618152682790, - "sequencer_cost": 4644684721575 + "congestion_cost": 95771815069211, + "congestion_multiplier": 4914222070, + "prover_cost": 18781781745498, + "sequencer_cost": 5685868131660 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 842917733, - "congestion_multiplier": 4640140529, - "prover_cost": 185327959, - "sequencer_cost": 46233907 + "congestion_cost": 1038341642, + "congestion_multiplier": 4914222070, + "prover_cost": 203628866, + "sequencer_cost": 61645210 } }, "parent_fee_header": { - "eth_per_fee_asset": 9954154, - "excess_mana": 1319983055, - "mana_used": 91764510 + "eth_per_fee_asset": 10841829, + "excess_mana": 1022970176, + "mana_used": 72628197 } }, { @@ -18871,21 +18871,21 @@ "blobs_needed": 1, "block_number": 128, "l1_block_number": 20973541, - "mana_spent": 115146036, - "size_in_fields": 3690, + "mana_spent": 76122848, + "size_in_fields": 2775, "slot_number": 128, "timestamp": 1729026431 }, "fee_header": { - "eth_per_fee_asset": 9987867, - "excess_mana": 1306993896, - "mana_used": 115146036 + "eth_per_fee_asset": 10853751, + "excess_mana": 1023716124, + "mana_used": 76122848 }, "oracle_input": { - "fee_asset_price_modifier": 57 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 9931259, + "eth_per_fee_asset_at_execution": 10839660, "l1_fee_oracle_output": { "base_fee": 15411289484, "blob_fee": 9770 @@ -18902,22 +18902,22 @@ "slot_of_change": 130 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84275144571298, - "congestion_multiplier": 4614404664, - "prover_cost": 18661073988706, - "sequencer_cost": 4655392332433 + "congestion_cost": 96377328347938, + "congestion_multiplier": 4938181549, + "prover_cost": 18785539952361, + "sequencer_cost": 5687005865498 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 836958288, - "congestion_multiplier": 4614404664, - "prover_cost": 185327959, - "sequencer_cost": 46233907 + "congestion_cost": 1044697471, + "congestion_multiplier": 4938181549, + "prover_cost": 203628866, + "sequencer_cost": 61645210 } }, "parent_fee_header": { - "eth_per_fee_asset": 9931259, - "excess_mana": 1311747565, - "mana_used": 95246331 + "eth_per_fee_asset": 10839660, + "excess_mana": 1020598373, + "mana_used": 78117751 } }, { @@ -18925,21 +18925,21 @@ "blobs_needed": 1, "block_number": 129, "l1_block_number": 20973544, - "mana_spent": 104692584, - "size_in_fields": 3570, + "mana_spent": 66249540, + "size_in_fields": 2535, "slot_number": 129, "timestamp": 1729026467 }, "fee_header": { - "eth_per_fee_asset": 9966892, - "excess_mana": 1322139932, - "mana_used": 104692584 + "eth_per_fee_asset": 10841811, + "excess_mana": 1024838972, + "mana_used": 66249540 }, "oracle_input": { - "fee_asset_price_modifier": -21 + "fee_asset_price_modifier": -11 }, "outputs": { - "eth_per_fee_asset_at_execution": 9987867, + "eth_per_fee_asset_at_execution": 10853751, "l1_fee_oracle_output": { "base_fee": 15411289484, "blob_fee": 9770 @@ -18956,22 +18956,22 @@ "slot_of_change": 130 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85710207694997, - "congestion_multiplier": 4696904720, - "prover_cost": 18555309056479, - "sequencer_cost": 4629007074284 + "congestion_cost": 96463801684782, + "congestion_multiplier": 4946839060, + "prover_cost": 18761151421293, + "sequencer_cost": 5679622648429 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 856062155, - "congestion_multiplier": 4696904720, - "prover_cost": 185327959, - "sequencer_cost": 46233907 + "congestion_cost": 1046994084, + "congestion_multiplier": 4946839060, + "prover_cost": 203628866, + "sequencer_cost": 61645210 } }, "parent_fee_header": { - "eth_per_fee_asset": 9987867, - "excess_mana": 1306993896, - "mana_used": 115146036 + "eth_per_fee_asset": 10853751, + "excess_mana": 1023716124, + "mana_used": 76122848 } }, { @@ -18979,21 +18979,21 @@ "blobs_needed": 1, "block_number": 130, "l1_block_number": 20973547, - "mana_spent": 101161709, - "size_in_fields": 3495, + "mana_spent": 74663103, + "size_in_fields": 2700, "slot_number": 130, "timestamp": 1729026503 }, "fee_header": { - "eth_per_fee_asset": 10025696, - "excess_mana": 1326832516, - "mana_used": 101161709 + "eth_per_fee_asset": 10829885, + "excess_mana": 1016088512, + "mana_used": 74663103 }, "oracle_input": { - "fee_asset_price_modifier": 59 + "fee_asset_price_modifier": -11 }, "outputs": { - "eth_per_fee_asset_at_execution": 9966892, + "eth_per_fee_asset_at_execution": 10841811, "l1_fee_oracle_output": { "base_fee": 20521882966, "blob_fee": 5212 @@ -19010,22 +19010,22 @@ "slot_of_change": 130 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92814488909883, - "congestion_multiplier": 4722763166, - "prover_cost": 18754594712174, - "sequencer_cost": 6177017870767 + "congestion_cost": 104987616828960, + "congestion_multiplier": 4879769969, + "prover_cost": 19488880224900, + "sequencer_cost": 7571388211804 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 925071987, - "congestion_multiplier": 4722763166, - "prover_cost": 186925020, - "sequencer_cost": 61565670 + "congestion_cost": 1138255899, + "congestion_multiplier": 4879769969, + "prover_cost": 211294756, + "sequencer_cost": 82087560 } }, "parent_fee_header": { - "eth_per_fee_asset": 9966892, - "excess_mana": 1322139932, - "mana_used": 104692584 + "eth_per_fee_asset": 10841811, + "excess_mana": 1024838972, + "mana_used": 66249540 } }, { @@ -19033,21 +19033,21 @@ "blobs_needed": 1, "block_number": 131, "l1_block_number": 20973550, - "mana_spent": 88567870, - "size_in_fields": 3180, + "mana_spent": 100599832, + "size_in_fields": 3165, "slot_number": 131, "timestamp": 1729026539 }, "fee_header": { - "eth_per_fee_asset": 10097881, - "excess_mana": 1327994225, - "mana_used": 88567870 + "eth_per_fee_asset": 10855876, + "excess_mana": 1015751615, + "mana_used": 100599832 }, "oracle_input": { - "fee_asset_price_modifier": 72 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 10025696, + "eth_per_fee_asset_at_execution": 10829885, "l1_fee_oracle_output": { "base_fee": 20521882966, "blob_fee": 5212 @@ -19064,22 +19064,22 @@ "slot_of_change": 130 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 92429311441321, - "congestion_multiplier": 4729186708, - "prover_cost": 18644592854202, - "sequencer_cost": 6140787632101 + "congestion_cost": 105033773211812, + "congestion_multiplier": 4877206034, + "prover_cost": 19510341614893, + "sequencer_cost": 7579725915834 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 926668178, - "congestion_multiplier": 4729186708, - "prover_cost": 186925020, - "sequencer_cost": 61565670 + "congestion_cost": 1137503685, + "congestion_multiplier": 4877206034, + "prover_cost": 211294756, + "sequencer_cost": 82087560 } }, "parent_fee_header": { - "eth_per_fee_asset": 10025696, - "excess_mana": 1326832516, - "mana_used": 101161709 + "eth_per_fee_asset": 10829885, + "excess_mana": 1016088512, + "mana_used": 74663103 } }, { @@ -19087,21 +19087,21 @@ "blobs_needed": 1, "block_number": 132, "l1_block_number": 20973553, - "mana_spent": 88995107, - "size_in_fields": 3360, + "mana_spent": 57599332, + "size_in_fields": 1980, "slot_number": 132, "timestamp": 1729026575 }, "fee_header": { - "eth_per_fee_asset": 10122115, - "excess_mana": 1316562095, - "mana_used": 88995107 + "eth_per_fee_asset": 10875416, + "excess_mana": 1041351447, + "mana_used": 57599332 }, "oracle_input": { - "fee_asset_price_modifier": 24 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 10097881, + "eth_per_fee_asset_at_execution": 10855876, "l1_fee_oracle_output": { "base_fee": 20521882966, "blob_fee": 5212 @@ -19118,22 +19118,22 @@ "slot_of_change": 130 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 90222333477688, - "congestion_multiplier": 4666352197, - "prover_cost": 18511311432567, - "sequencer_cost": 6096890030691 + "congestion_cost": 110152653733333, + "congestion_multiplier": 5075922388, + "prover_cost": 19463630203588, + "sequencer_cost": 7561578632623 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 911054387, - "congestion_multiplier": 4666352197, - "prover_cost": 186925020, - "sequencer_cost": 61565670 + "congestion_cost": 1195803550, + "congestion_multiplier": 5075922388, + "prover_cost": 211294756, + "sequencer_cost": 82087560 } }, "parent_fee_header": { - "eth_per_fee_asset": 10097881, - "excess_mana": 1327994225, - "mana_used": 88567870 + "eth_per_fee_asset": 10855876, + "excess_mana": 1015751615, + "mana_used": 100599832 } }, { @@ -19141,21 +19141,21 @@ "blobs_needed": 1, "block_number": 133, "l1_block_number": 20973556, - "mana_spent": 1170826, - "size_in_fields": 45, + "mana_spent": 72505768, + "size_in_fields": 2505, "slot_number": 133, "timestamp": 1729026611 }, "fee_header": { - "eth_per_fee_asset": 10151469, - "excess_mana": 1305557202, - "mana_used": 1170826 + "eth_per_fee_asset": 10869978, + "excess_mana": 1023950779, + "mana_used": 72505768 }, "oracle_input": { - "fee_asset_price_modifier": 29 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 10122115, + "eth_per_fee_asset_at_execution": 10875416, "l1_fee_oracle_output": { "base_fee": 20521882966, "blob_fee": 5212 @@ -19172,44 +19172,44 @@ "slot_of_change": 135 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 88540794982077, - "congestion_multiplier": 4606654679, - "prover_cost": 18466992323245, - "sequencer_cost": 6082293078078 + "congestion_cost": 106287728303911, + "congestion_multiplier": 4939989559, + "prover_cost": 19428659648514, + "sequencer_cost": 7547992646902 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 896220109, - "congestion_multiplier": 4606654679, - "prover_cost": 186925020, - "sequencer_cost": 61565670 + "congestion_cost": 1155923261, + "congestion_multiplier": 4939989559, + "prover_cost": 211294756, + "sequencer_cost": 82087560 } }, "parent_fee_header": { - "eth_per_fee_asset": 10122115, - "excess_mana": 1316562095, - "mana_used": 88995107 + "eth_per_fee_asset": 10875416, + "excess_mana": 1041351447, + "mana_used": 57599332 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 134, "l1_block_number": 20973559, - "mana_spent": 179585801, - "size_in_fields": 6570, + "mana_spent": 84306805, + "size_in_fields": 2775, "slot_number": 134, "timestamp": 1729026647 }, "fee_header": { - "eth_per_fee_asset": 10106802, - "excess_mana": 1206728028, - "mana_used": 179585801 + "eth_per_fee_asset": 10880847, + "excess_mana": 1021456547, + "mana_used": 84306805 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 10151469, + "eth_per_fee_asset_at_execution": 10869978, "l1_fee_oracle_output": { "base_fee": 20521882966, "blob_fee": 5212 @@ -19226,44 +19226,44 @@ "slot_of_change": 135 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75971566578197, - "congestion_multiplier": 4103629368, - "prover_cost": 18413593145978, - "sequencer_cost": 6064705512080 + "congestion_cost": 105823118225263, + "congestion_multiplier": 4920805397, + "prover_cost": 19438379360106, + "sequencer_cost": 7551768734031 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 771223003, - "congestion_multiplier": 4103629368, - "prover_cost": 186925020, - "sequencer_cost": 61565670 + "congestion_cost": 1150294967, + "congestion_multiplier": 4920805397, + "prover_cost": 211294756, + "sequencer_cost": 82087560 } }, "parent_fee_header": { - "eth_per_fee_asset": 10151469, - "excess_mana": 1305557202, - "mana_used": 1170826 + "eth_per_fee_asset": 10869978, + "excess_mana": 1023950779, + "mana_used": 72505768 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 135, "l1_block_number": 20973562, - "mana_spent": 128064584, - "size_in_fields": 4575, + "mana_spent": 75849077, + "size_in_fields": 2640, "slot_number": 135, "timestamp": 1729026683 }, "fee_header": { - "eth_per_fee_asset": 10066374, - "excess_mana": 1286313829, - "mana_used": 128064584 + "eth_per_fee_asset": 10898256, + "excess_mana": 1030763352, + "mana_used": 75849077 }, "oracle_input": { - "fee_asset_price_modifier": -40 + "fee_asset_price_modifier": 16 }, "outputs": { - "eth_per_fee_asset_at_execution": 10106802, + "eth_per_fee_asset_at_execution": 10880847, "l1_fee_oracle_output": { "base_fee": 17429342995, "blob_fee": 10991 @@ -19280,22 +19280,22 @@ "slot_of_change": 135 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82601716250106, - "congestion_multiplier": 4504095892, - "prover_cost": 18399351347736, - "sequencer_cost": 5173552722217 + "congestion_cost": 101416302977149, + "congestion_multiplier": 4992769828, + "prover_cost": 18992634121223, + "sequencer_cost": 6407353214323 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 834839191, - "congestion_multiplier": 4504095892, - "prover_cost": 185958601, - "sequencer_cost": 52288073 + "congestion_cost": 1103495276, + "congestion_multiplier": 4992769828, + "prover_cost": 206655946, + "sequencer_cost": 69717430 } }, "parent_fee_header": { - "eth_per_fee_asset": 10106802, - "excess_mana": 1206728028, - "mana_used": 179585801 + "eth_per_fee_asset": 10880847, + "excess_mana": 1021456547, + "mana_used": 84306805 } }, { @@ -19303,21 +19303,21 @@ "blobs_needed": 1, "block_number": 136, "l1_block_number": 20973565, - "mana_spent": 111252167, - "size_in_fields": 3825, + "mana_spent": 75284873, + "size_in_fields": 2610, "slot_number": 136, "timestamp": 1729026719 }, "fee_header": { - "eth_per_fee_asset": 10141871, - "excess_mana": 1314378413, - "mana_used": 111252167 + "eth_per_fee_asset": 10837225, + "excess_mana": 1031612429, + "mana_used": 75284873 }, "oracle_input": { - "fee_asset_price_modifier": 75 + "fee_asset_price_modifier": -56 }, "outputs": { - "eth_per_fee_asset_at_execution": 10066374, + "eth_per_fee_asset_at_execution": 10898256, "l1_fee_oracle_output": { "base_fee": 17429342995, "blob_fee": 10991 @@ -19334,22 +19334,22 @@ "slot_of_change": 135 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86491863008468, - "congestion_multiplier": 4654445314, - "prover_cost": 18473245778470, - "sequencer_cost": 5194330451065 + "congestion_cost": 101422118089354, + "congestion_multiplier": 4999387434, + "prover_cost": 18962295068129, + "sequencer_cost": 6397118034299 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 870659441, - "congestion_multiplier": 4654445314, - "prover_cost": 185958601, - "sequencer_cost": 52288073 + "congestion_cost": 1105324207, + "congestion_multiplier": 4999387434, + "prover_cost": 206655946, + "sequencer_cost": 69717430 } }, "parent_fee_header": { - "eth_per_fee_asset": 10066374, - "excess_mana": 1286313829, - "mana_used": 128064584 + "eth_per_fee_asset": 10898256, + "excess_mana": 1030763352, + "mana_used": 75849077 } }, { @@ -19357,21 +19357,21 @@ "blobs_needed": 1, "block_number": 137, "l1_block_number": 20973568, - "mana_spent": 91268390, - "size_in_fields": 3120, + "mana_spent": 72996425, + "size_in_fields": 2580, "slot_number": 137, "timestamp": 1729026755 }, "fee_header": { - "eth_per_fee_asset": 10211849, - "excess_mana": 1325630580, - "mana_used": 91268390 + "eth_per_fee_asset": 10774369, + "excess_mana": 1031897302, + "mana_used": 72996425 }, "oracle_input": { - "fee_asset_price_modifier": 69 + "fee_asset_price_modifier": -58 }, "outputs": { - "eth_per_fee_asset_at_execution": 10141871, + "eth_per_fee_asset_at_execution": 10837225, "l1_fee_oracle_output": { "base_fee": 17429342995, "blob_fee": 10991 @@ -19388,22 +19388,22 @@ "slot_of_change": 135 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 87296983860276, - "congestion_multiplier": 4716126377, - "prover_cost": 18335729275200, - "sequencer_cost": 5155663387949 + "congestion_cost": 102049959468407, + "congestion_multiplier": 5001609665, + "prover_cost": 19069083275470, + "sequencer_cost": 6433144093622 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 885354749, - "congestion_multiplier": 4716126377, - "prover_cost": 185958601, - "sequencer_cost": 52288073 + "congestion_cost": 1105938372, + "congestion_multiplier": 5001609665, + "prover_cost": 206655946, + "sequencer_cost": 69717430 } }, "parent_fee_header": { - "eth_per_fee_asset": 10141871, - "excess_mana": 1314378413, - "mana_used": 111252167 + "eth_per_fee_asset": 10837225, + "excess_mana": 1031612429, + "mana_used": 75284873 } }, { @@ -19411,21 +19411,21 @@ "blobs_needed": 1, "block_number": 138, "l1_block_number": 20973571, - "mana_spent": 92557405, - "size_in_fields": 3495, + "mana_spent": 77774635, + "size_in_fields": 2505, "slot_number": 138, "timestamp": 1729026791 }, "fee_header": { - "eth_per_fee_asset": 10278226, - "excess_mana": 1316898970, - "mana_used": 92557405 + "eth_per_fee_asset": 10753897, + "excess_mana": 1029893727, + "mana_used": 77774635 }, "oracle_input": { - "fee_asset_price_modifier": 65 + "fee_asset_price_modifier": -19 }, "outputs": { - "eth_per_fee_asset_at_execution": 10211849, + "eth_per_fee_asset_at_execution": 10774369, "l1_fee_oracle_output": { "base_fee": 17429342995, "blob_fee": 10991 @@ -19442,22 +19442,22 @@ "slot_of_change": 140 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85580435923015, - "congestion_multiplier": 4668191773, - "prover_cost": 18210081347659, - "sequencer_cost": 5120333545865 + "congestion_cost": 102244929146199, + "congestion_multiplier": 4986001154, + "prover_cost": 19180329353859, + "sequencer_cost": 6470674059892 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 873934489, - "congestion_multiplier": 4668191773, - "prover_cost": 185958601, - "sequencer_cost": 52288073 + "congestion_cost": 1101624595, + "congestion_multiplier": 4986001154, + "prover_cost": 206655946, + "sequencer_cost": 69717430 } }, "parent_fee_header": { - "eth_per_fee_asset": 10211849, - "excess_mana": 1325630580, - "mana_used": 91268390 + "eth_per_fee_asset": 10774369, + "excess_mana": 1031897302, + "mana_used": 72996425 } }, { @@ -19465,21 +19465,21 @@ "blobs_needed": 1, "block_number": 139, "l1_block_number": 20973574, - "mana_spent": 102355490, - "size_in_fields": 3570, + "mana_spent": 75597142, + "size_in_fields": 2670, "slot_number": 139, "timestamp": 1729026827 }, "fee_header": { - "eth_per_fee_asset": 10213473, - "excess_mana": 1309456375, - "mana_used": 102355490 + "eth_per_fee_asset": 10808741, + "excess_mana": 1032668362, + "mana_used": 75597142 }, "oracle_input": { - "fee_asset_price_modifier": -63 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 10278226, + "eth_per_fee_asset_at_execution": 10753897, "l1_fee_oracle_output": { "base_fee": 17429342995, "blob_fee": 10991 @@ -19496,22 +19496,22 @@ "slot_of_change": 140 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84089593087368, - "congestion_multiplier": 4627718397, - "prover_cost": 18092480258753, - "sequencer_cost": 5087266323975 + "congestion_cost": 102995415615382, + "congestion_multiplier": 5007629489, + "prover_cost": 19216842601338, + "sequencer_cost": 6482992165538 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 864291842, - "congestion_multiplier": 4627718397, - "prover_cost": 185958601, - "sequencer_cost": 52288073 + "congestion_cost": 1107602091, + "congestion_multiplier": 5007629489, + "prover_cost": 206655946, + "sequencer_cost": 69717430 } }, "parent_fee_header": { - "eth_per_fee_asset": 10278226, - "excess_mana": 1316898970, - "mana_used": 92557405 + "eth_per_fee_asset": 10753897, + "excess_mana": 1029893727, + "mana_used": 77774635 } }, { @@ -19519,21 +19519,21 @@ "blobs_needed": 1, "block_number": 140, "l1_block_number": 20973577, - "mana_spent": 115992554, - "size_in_fields": 3660, + "mana_spent": 83112886, + "size_in_fields": 2670, "slot_number": 140, "timestamp": 1729026863 }, "fee_header": { - "eth_per_fee_asset": 10201216, - "excess_mana": 1311811865, - "mana_used": 115992554 + "eth_per_fee_asset": 10752535, + "excess_mana": 1033265504, + "mana_used": 83112886 }, "oracle_input": { - "fee_asset_price_modifier": -12 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 10213473, + "eth_per_fee_asset_at_execution": 10808741, "l1_fee_oracle_output": { "base_fee": 16688357772, "blob_fee": 19044 @@ -19550,22 +19550,22 @@ "slot_of_change": 140 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84045752899137, - "congestion_multiplier": 4640489625, - "prover_cost": 18184514023781, - "sequencer_cost": 4901873143445 + "congestion_cost": 101079330330887, + "congestion_multiplier": 5012296477, + "prover_cost": 19016504142342, + "sequencer_cost": 6175884036818 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 858399028, - "congestion_multiplier": 4640489625, - "prover_cost": 185727043, - "sequencer_cost": 50065149 + "congestion_cost": 1092540302, + "congestion_multiplier": 5012296477, + "prover_cost": 205544468, + "sequencer_cost": 66753531 } }, "parent_fee_header": { - "eth_per_fee_asset": 10213473, - "excess_mana": 1309456375, - "mana_used": 102355490 + "eth_per_fee_asset": 10808741, + "excess_mana": 1032668362, + "mana_used": 75597142 } }, { @@ -19573,21 +19573,21 @@ "blobs_needed": 1, "block_number": 141, "l1_block_number": 20973580, - "mana_spent": 88609526, - "size_in_fields": 3255, + "mana_spent": 55915871, + "size_in_fields": 2115, "slot_number": 141, "timestamp": 1729026899 }, "fee_header": { - "eth_per_fee_asset": 10175712, - "excess_mana": 1327804419, - "mana_used": 88609526 + "eth_per_fee_asset": 10752535, + "excess_mana": 1041378390, + "mana_used": 55915871 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 10201216, + "eth_per_fee_asset_at_execution": 10752535, "l1_fee_oracle_output": { "base_fee": 16688357772, "blob_fee": 19044 @@ -19604,22 +19604,22 @@ "slot_of_change": 140 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86172619028948, - "congestion_multiplier": 4728136600, - "prover_cost": 18206363143375, - "sequencer_cost": 4907762858860 + "congestion_cost": 103224365696090, + "congestion_multiplier": 5076135739, + "prover_cost": 19115907830108, + "sequencer_cost": 6208166818337 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 879065500, - "congestion_multiplier": 4728136600, - "prover_cost": 185727043, - "sequencer_cost": 50065149 + "congestion_cost": 1109923605, + "congestion_multiplier": 5076135739, + "prover_cost": 205544468, + "sequencer_cost": 66753531 } }, "parent_fee_header": { - "eth_per_fee_asset": 10201216, - "excess_mana": 1311811865, - "mana_used": 115992554 + "eth_per_fee_asset": 10752535, + "excess_mana": 1033265504, + "mana_used": 83112886 } }, { @@ -19627,21 +19627,21 @@ "blobs_needed": 1, "block_number": 142, "l1_block_number": 20973583, - "mana_spent": 103643999, - "size_in_fields": 3630, + "mana_spent": 66529854, + "size_in_fields": 2550, "slot_number": 142, "timestamp": 1729026935 }, "fee_header": { - "eth_per_fee_asset": 10169606, - "excess_mana": 1316413945, - "mana_used": 103643999 + "eth_per_fee_asset": 10681568, + "excess_mana": 1022294261, + "mana_used": 66529854 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": -66 }, "outputs": { - "eth_per_fee_asset_at_execution": 10175712, + "eth_per_fee_asset_at_execution": 10752535, "l1_fee_oracle_output": { "base_fee": 16688357772, "blob_fee": 19044 @@ -19658,22 +19658,22 @@ "slot_of_change": 140 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84938185947087, - "congestion_multiplier": 4665543423, - "prover_cost": 18251994848125, - "sequencer_cost": 4920063480571 + "congestion_cost": 99453725842325, + "congestion_multiplier": 4927240276, + "prover_cost": 19115907830108, + "sequencer_cost": 6208166818337 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 864306518, - "congestion_multiplier": 4665543423, - "prover_cost": 185727043, - "sequencer_cost": 50065149 + "congestion_cost": 1069379668, + "congestion_multiplier": 4927240276, + "prover_cost": 205544468, + "sequencer_cost": 66753531 } }, "parent_fee_header": { - "eth_per_fee_asset": 10175712, - "excess_mana": 1327804419, - "mana_used": 88609526 + "eth_per_fee_asset": 10752535, + "excess_mana": 1041378390, + "mana_used": 55915871 } }, { @@ -19681,21 +19681,21 @@ "blobs_needed": 1, "block_number": 143, "l1_block_number": 20973586, - "mana_spent": 110175475, - "size_in_fields": 3900, + "mana_spent": 87867246, + "size_in_fields": 3120, "slot_number": 143, "timestamp": 1729026971 }, "fee_header": { - "eth_per_fee_asset": 10211301, - "excess_mana": 1320057944, - "mana_used": 110175475 + "eth_per_fee_asset": 10612137, + "excess_mana": 1013824115, + "mana_used": 87867246 }, "oracle_input": { - "fee_asset_price_modifier": 41 + "fee_asset_price_modifier": -65 }, "outputs": { - "eth_per_fee_asset_at_execution": 10169606, + "eth_per_fee_asset_at_execution": 10681568, "l1_fee_oracle_output": { "base_fee": 16688357772, "blob_fee": 19044 @@ -19712,22 +19712,22 @@ "slot_of_change": 145 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85451371272398, - "congestion_multiplier": 4685477332, - "prover_cost": 18262953648352, - "sequencer_cost": 4923017568233 + "congestion_cost": 98465704473351, + "congestion_multiplier": 4862562789, + "prover_cost": 19242911527596, + "sequencer_cost": 6249413101148 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 869006778, - "congestion_multiplier": 4685477332, - "prover_cost": 185727043, - "sequencer_cost": 50065149 + "congestion_cost": 1051768118, + "congestion_multiplier": 4862562789, + "prover_cost": 205544468, + "sequencer_cost": 66753531 } }, "parent_fee_header": { - "eth_per_fee_asset": 10169606, - "excess_mana": 1316413945, - "mana_used": 103643999 + "eth_per_fee_asset": 10681568, + "excess_mana": 1022294261, + "mana_used": 66529854 } }, { @@ -19735,21 +19735,21 @@ "blobs_needed": 1, "block_number": 144, "l1_block_number": 20973589, - "mana_spent": 91420197, - "size_in_fields": 3420, + "mana_spent": 67286490, + "size_in_fields": 2250, "slot_number": 144, "timestamp": 1729027007 }, "fee_header": { - "eth_per_fee_asset": 10166371, - "excess_mana": 1330233419, - "mana_used": 91420197 + "eth_per_fee_asset": 10612137, + "excess_mana": 1026691361, + "mana_used": 67286490 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 10211301, + "eth_per_fee_asset_at_execution": 10612137, "l1_fee_oracle_output": { "base_fee": 16688357772, "blob_fee": 19044 @@ -19766,22 +19766,22 @@ "slot_of_change": 145 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86398232115575, - "congestion_multiplier": 4741592745, - "prover_cost": 18188381970133, - "sequencer_cost": 4902915798879 + "congestion_cost": 101639708477190, + "congestion_multiplier": 4961154747, + "prover_cost": 19368810259423, + "sequencer_cost": 6290300530421 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 882238354, - "congestion_multiplier": 4741592745, - "prover_cost": 185727043, - "sequencer_cost": 50065149 + "congestion_cost": 1078614511, + "congestion_multiplier": 4961154747, + "prover_cost": 205544468, + "sequencer_cost": 66753531 } }, "parent_fee_header": { - "eth_per_fee_asset": 10211301, - "excess_mana": 1320057944, - "mana_used": 110175475 + "eth_per_fee_asset": 10612137, + "excess_mana": 1013824115, + "mana_used": 87867246 } }, { @@ -19789,21 +19789,21 @@ "blobs_needed": 1, "block_number": 145, "l1_block_number": 20973592, - "mana_spent": 109499778, - "size_in_fields": 3945, + "mana_spent": 63114459, + "size_in_fields": 2265, "slot_number": 145, "timestamp": 1729027043 }, "fee_header": { - "eth_per_fee_asset": 10173487, - "excess_mana": 1321653616, - "mana_used": 109499778 + "eth_per_fee_asset": 10574994, + "excess_mana": 1018977851, + "mana_used": 63114459 }, "oracle_input": { - "fee_asset_price_modifier": 7 + "fee_asset_price_modifier": -35 }, "outputs": { - "eth_per_fee_asset_at_execution": 10166371, + "eth_per_fee_asset_at_execution": 10612137, "l1_fee_oracle_output": { "base_fee": 15223753097, "blob_fee": 20599 @@ -19820,22 +19820,22 @@ "slot_of_change": 145 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83918709439190, - "congestion_multiplier": 4694232990, - "prover_cost": 18223745129900, - "sequencer_cost": 4492393696827 + "congestion_cost": 97155354948773, + "congestion_multiplier": 4901814536, + "prover_cost": 19161791918066, + "sequencer_cost": 5738252436809 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 853148734, - "congestion_multiplier": 4694232990, - "prover_cost": 185269354, - "sequencer_cost": 45671341 + "congestion_cost": 1031025937, + "congestion_multiplier": 4901814536, + "prover_cost": 203347561, + "sequencer_cost": 60895121 } }, "parent_fee_header": { - "eth_per_fee_asset": 10166371, - "excess_mana": 1330233419, - "mana_used": 91420197 + "eth_per_fee_asset": 10612137, + "excess_mana": 1026691361, + "mana_used": 67286490 } }, { @@ -19843,21 +19843,21 @@ "blobs_needed": 1, "block_number": 146, "l1_block_number": 20973595, - "mana_spent": 100169313, - "size_in_fields": 3510, + "mana_spent": 93025553, + "size_in_fields": 3240, "slot_number": 146, "timestamp": 1729027079 }, "fee_header": { - "eth_per_fee_asset": 10138897, - "excess_mana": 1331153394, - "mana_used": 100169313 + "eth_per_fee_asset": 10600373, + "excess_mana": 1007092310, + "mana_used": 93025553 }, "oracle_input": { - "fee_asset_price_modifier": -34 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 10173487, + "eth_per_fee_asset_at_execution": 10574994, "l1_fee_oracle_output": { "base_fee": 15223753097, "blob_fee": 20599 @@ -19874,22 +19874,22 @@ "slot_of_change": 145 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85051007388126, - "congestion_multiplier": 4746699204, - "prover_cost": 18210998254581, - "sequencer_cost": 4489251423824 + "congestion_cost": 95246490352619, + "congestion_multiplier": 4811765218, + "prover_cost": 19229094692631, + "sequencer_cost": 5758407144250 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 865265318, - "congestion_multiplier": 4746699204, - "prover_cost": 185269354, - "sequencer_cost": 45671341 + "congestion_cost": 1007231064, + "congestion_multiplier": 4811765218, + "prover_cost": 203347561, + "sequencer_cost": 60895121 } }, "parent_fee_header": { - "eth_per_fee_asset": 10173487, - "excess_mana": 1321653616, - "mana_used": 109499778 + "eth_per_fee_asset": 10574994, + "excess_mana": 1018977851, + "mana_used": 63114459 } }, { @@ -19897,21 +19897,21 @@ "blobs_needed": 1, "block_number": 147, "l1_block_number": 20973598, - "mana_spent": 93348429, - "size_in_fields": 3315, + "mana_spent": 61509814, + "size_in_fields": 2370, "slot_number": 147, "timestamp": 1729027115 }, "fee_header": { - "eth_per_fee_asset": 10158160, - "excess_mana": 1331322707, - "mana_used": 93348429 + "eth_per_fee_asset": 10582352, + "excess_mana": 1025117863, + "mana_used": 61509814 }, "oracle_input": { - "fee_asset_price_modifier": 19 + "fee_asset_price_modifier": -17 }, "outputs": { - "eth_per_fee_asset_at_execution": 10138897, + "eth_per_fee_asset_at_execution": 10600373, "l1_fee_oracle_output": { "base_fee": 15223753097, "blob_fee": 20599 @@ -19928,22 +19928,22 @@ "slot_of_change": 145 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85362588652395, - "congestion_multiplier": 4747639601, - "prover_cost": 18273127145882, - "sequencer_cost": 4504567015525 + "congestion_cost": 98439193601961, + "congestion_multiplier": 4948991749, + "prover_cost": 19183057143367, + "sequencer_cost": 5744620590238 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 865482494, - "congestion_multiplier": 4747639601, - "prover_cost": 185269354, - "sequencer_cost": 45671341 + "congestion_cost": 1043492170, + "congestion_multiplier": 4948991749, + "prover_cost": 203347561, + "sequencer_cost": 60895121 } }, "parent_fee_header": { - "eth_per_fee_asset": 10138897, - "excess_mana": 1331153394, - "mana_used": 100169313 + "eth_per_fee_asset": 10600373, + "excess_mana": 1007092310, + "mana_used": 93025553 } }, { @@ -19951,21 +19951,21 @@ "blobs_needed": 1, "block_number": 148, "l1_block_number": 20973601, - "mana_spent": 115591152, - "size_in_fields": 3690, + "mana_spent": 79512216, + "size_in_fields": 2880, "slot_number": 148, "timestamp": 1729027151 }, "fee_header": { - "eth_per_fee_asset": 10188634, - "excess_mana": 1324671136, - "mana_used": 115591152 + "eth_per_fee_asset": 10615157, + "excess_mana": 1011627677, + "mana_used": 79512216 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": 31 }, "outputs": { - "eth_per_fee_asset_at_execution": 10158160, + "eth_per_fee_asset_at_execution": 10582352, "l1_fee_oracle_output": { "base_fee": 15223753097, "blob_fee": 20599 @@ -19982,22 +19982,22 @@ "slot_of_change": 150 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84363986588123, - "congestion_multiplier": 4710835262, - "prover_cost": 18238475668822, - "sequencer_cost": 4496024969089 + "congestion_cost": 96033363755052, + "congestion_multiplier": 4845930006, + "prover_cost": 19215724538364, + "sequencer_cost": 5754403274433 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 856982874, - "congestion_multiplier": 4710835262, - "prover_cost": 185269354, - "sequencer_cost": 45671341 + "congestion_cost": 1016258859, + "congestion_multiplier": 4845930006, + "prover_cost": 203347561, + "sequencer_cost": 60895121 } }, "parent_fee_header": { - "eth_per_fee_asset": 10158160, - "excess_mana": 1331322707, - "mana_used": 93348429 + "eth_per_fee_asset": 10582352, + "excess_mana": 1025117863, + "mana_used": 61509814 } }, { @@ -20005,21 +20005,21 @@ "blobs_needed": 1, "block_number": 149, "l1_block_number": 20973604, - "mana_spent": 92214761, - "size_in_fields": 3015, + "mana_spent": 79329761, + "size_in_fields": 2595, "slot_number": 149, "timestamp": 1729027187 }, "fee_header": { - "eth_per_fee_asset": 10250784, - "excess_mana": 1340262288, - "mana_used": 92214761 + "eth_per_fee_asset": 10679909, + "excess_mana": 1016139893, + "mana_used": 79329761 }, "oracle_input": { "fee_asset_price_modifier": 61 }, "outputs": { - "eth_per_fee_asset_at_execution": 10188634, + "eth_per_fee_asset_at_execution": 10615157, "l1_fee_oracle_output": { "base_fee": 15223753097, "blob_fee": 20599 @@ -20036,22 +20036,22 @@ "slot_of_change": 150 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 86077339317518, - "congestion_multiplier": 4797557231, - "prover_cost": 18183924753800, - "sequencer_cost": 4482577448557 + "congestion_cost": 96588696709809, + "congestion_multiplier": 4880161119, + "prover_cost": 19156340410227, + "sequencer_cost": 5736619910568 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 877010506, - "congestion_multiplier": 4797557231, - "prover_cost": 185269354, - "sequencer_cost": 45671341 + "congestion_cost": 1025304180, + "congestion_multiplier": 4880161119, + "prover_cost": 203347561, + "sequencer_cost": 60895121 } }, "parent_fee_header": { - "eth_per_fee_asset": 10188634, - "excess_mana": 1324671136, - "mana_used": 115591152 + "eth_per_fee_asset": 10615157, + "excess_mana": 1011627677, + "mana_used": 79512216 } }, { @@ -20059,21 +20059,21 @@ "blobs_needed": 1, "block_number": 150, "l1_block_number": 20973607, - "mana_spent": 83675757, - "size_in_fields": 3090, + "mana_spent": 77082841, + "size_in_fields": 2655, "slot_number": 150, "timestamp": 1729027223 }, "fee_header": { - "eth_per_fee_asset": 10198505, - "excess_mana": 1332477049, - "mana_used": 83675757 + "eth_per_fee_asset": 10656413, + "excess_mana": 1020469654, + "mana_used": 77082841 }, "oracle_input": { - "fee_asset_price_modifier": -51 + "fee_asset_price_modifier": -22 }, "outputs": { - "eth_per_fee_asset_at_execution": 10250784, + "eth_per_fee_asset_at_execution": 10679909, "l1_fee_oracle_output": { "base_fee": 14247658444, "blob_fee": 19806 @@ -20090,22 +20090,22 @@ "slot_of_change": 150 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83391304704109, - "congestion_multiplier": 4754056000, - "prover_cost": 18043919860179, - "sequencer_cost": 4169735114895 + "congestion_cost": 94854320481570, + "congestion_multiplier": 4913235385, + "prover_cost": 18903102919698, + "sequencer_cost": 5336256891328 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 854826252, - "congestion_multiplier": 4754056000, - "prover_cost": 184964325, - "sequencer_cost": 42743054 + "congestion_cost": 1013035511, + "congestion_multiplier": 4913235385, + "prover_cost": 201883419, + "sequencer_cost": 56990738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10250784, - "excess_mana": 1340262288, - "mana_used": 92214761 + "eth_per_fee_asset": 10679909, + "excess_mana": 1016139893, + "mana_used": 79329761 } }, { @@ -20113,21 +20113,21 @@ "blobs_needed": 1, "block_number": 151, "l1_block_number": 20973610, - "mana_spent": 95150403, - "size_in_fields": 3450, + "mana_spent": 72290410, + "size_in_fields": 2610, "slot_number": 151, "timestamp": 1729027259 }, "fee_header": { - "eth_per_fee_asset": 10144452, - "excess_mana": 1316152806, - "mana_used": 95150403 + "eth_per_fee_asset": 10619115, + "excess_mana": 1022552495, + "mana_used": 72290410 }, "oracle_input": { - "fee_asset_price_modifier": -53 + "fee_asset_price_modifier": -35 }, "outputs": { - "eth_per_fee_asset_at_execution": 10198505, + "eth_per_fee_asset_at_execution": 10656413, "l1_fee_oracle_output": { "base_fee": 14247658444, "blob_fee": 19806 @@ -20144,22 +20144,22 @@ "slot_of_change": 150 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81810691174834, - "congestion_multiplier": 4664118165, - "prover_cost": 18136415582480, - "sequencer_cost": 4191109775404 + "congestion_cost": 95451908817724, + "congestion_multiplier": 4929225590, + "prover_cost": 18944781794775, + "sequencer_cost": 5348022641390 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 834346743, - "congestion_multiplier": 4664118165, - "prover_cost": 184964325, - "sequencer_cost": 42743054 + "congestion_cost": 1017174962, + "congestion_multiplier": 4929225590, + "prover_cost": 201883419, + "sequencer_cost": 56990738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10198505, - "excess_mana": 1332477049, - "mana_used": 83675757 + "eth_per_fee_asset": 10656413, + "excess_mana": 1020469654, + "mana_used": 77082841 } }, { @@ -20167,21 +20167,21 @@ "blobs_needed": 1, "block_number": 152, "l1_block_number": 20973613, - "mana_spent": 89065383, - "size_in_fields": 3120, + "mana_spent": 72727766, + "size_in_fields": 2640, "slot_number": 152, "timestamp": 1729027295 }, "fee_header": { - "eth_per_fee_asset": 10090686, - "excess_mana": 1311303209, - "mana_used": 89065383 + "eth_per_fee_asset": 10669024, + "excess_mana": 1019842905, + "mana_used": 72727766 }, "oracle_input": { - "fee_asset_price_modifier": -53 + "fee_asset_price_modifier": 47 }, "outputs": { - "eth_per_fee_asset_at_execution": 10144452, + "eth_per_fee_asset_at_execution": 10619115, "l1_fee_oracle_output": { "base_fee": 14247658444, "blob_fee": 19806 @@ -20198,22 +20198,22 @@ "slot_of_change": 150 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81654256139218, - "congestion_multiplier": 4637728763, - "prover_cost": 18233052411309, - "sequencer_cost": 4213441396342 + "congestion_cost": 95280306974734, + "congestion_multiplier": 4908433923, + "prover_cost": 19011322412461, + "sequencer_cost": 5366806744254 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 828337682, - "congestion_multiplier": 4637728763, - "prover_cost": 184964325, - "sequencer_cost": 42743054 + "congestion_cost": 1011792537, + "congestion_multiplier": 4908433923, + "prover_cost": 201883419, + "sequencer_cost": 56990738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10144452, - "excess_mana": 1316152806, - "mana_used": 95150403 + "eth_per_fee_asset": 10619115, + "excess_mana": 1022552495, + "mana_used": 72290410 } }, { @@ -20221,21 +20221,21 @@ "blobs_needed": 1, "block_number": 153, "l1_block_number": 20973616, - "mana_spent": 113679838, - "size_in_fields": 3795, + "mana_spent": 77894068, + "size_in_fields": 2880, "slot_number": 153, "timestamp": 1729027331 }, "fee_header": { - "eth_per_fee_asset": 10145175, - "excess_mana": 1300368592, - "mana_used": 113679838 + "eth_per_fee_asset": 10625281, + "excess_mana": 1017570671, + "mana_used": 77894068 }, "oracle_input": { - "fee_asset_price_modifier": 54 + "fee_asset_price_modifier": -41 }, "outputs": { - "eth_per_fee_asset_at_execution": 10090686, + "eth_per_fee_asset_at_execution": 10669024, "l1_fee_oracle_output": { "base_fee": 14247658444, "blob_fee": 19806 @@ -20252,22 +20252,22 @@ "slot_of_change": 155 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 80758951670878, - "congestion_multiplier": 4578773895, - "prover_cost": 18330203219088, - "sequencer_cost": 4235891791698 + "congestion_cost": 94413171907759, + "congestion_multiplier": 4891065871, + "prover_cost": 18922388683351, + "sequencer_cost": 5341701171542 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 814913223, - "congestion_multiplier": 4578773895, - "prover_cost": 184964325, - "sequencer_cost": 42743054 + "congestion_cost": 1007296397, + "congestion_multiplier": 4891065871, + "prover_cost": 201883419, + "sequencer_cost": 56990738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10090686, - "excess_mana": 1311303209, - "mana_used": 89065383 + "eth_per_fee_asset": 10669024, + "excess_mana": 1019842905, + "mana_used": 72727766 } }, { @@ -20275,21 +20275,21 @@ "blobs_needed": 1, "block_number": 154, "l1_block_number": 20973619, - "mana_spent": 109099450, - "size_in_fields": 3600, + "mana_spent": 85891157, + "size_in_fields": 3030, "slot_number": 154, "timestamp": 1729027367 }, "fee_header": { - "eth_per_fee_asset": 10067057, - "excess_mana": 1314048430, - "mana_used": 109099450 + "eth_per_fee_asset": 10576404, + "excess_mana": 1020464739, + "mana_used": 85891157 }, "oracle_input": { - "fee_asset_price_modifier": -77 + "fee_asset_price_modifier": -46 }, "outputs": { - "eth_per_fee_asset_at_execution": 10145175, + "eth_per_fee_asset_at_execution": 10625281, "l1_fee_oracle_output": { "base_fee": 14247658444, "blob_fee": 19806 @@ -20306,22 +20306,22 @@ "slot_of_change": 155 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81983312757050, - "congestion_multiplier": 4652648672, - "prover_cost": 18231753025453, - "sequencer_cost": 4213141123737 + "congestion_cost": 95341079355925, + "congestion_multiplier": 4913197713, + "prover_cost": 19000289874687, + "sequencer_cost": 5363692310820 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 831735055, - "congestion_multiplier": 4652648672, - "prover_cost": 184964325, - "sequencer_cost": 42743054 + "congestion_cost": 1013025759, + "congestion_multiplier": 4913197713, + "prover_cost": 201883419, + "sequencer_cost": 56990738 } }, "parent_fee_header": { - "eth_per_fee_asset": 10145175, - "excess_mana": 1300368592, - "mana_used": 113679838 + "eth_per_fee_asset": 10625281, + "excess_mana": 1017570671, + "mana_used": 77894068 } }, { @@ -20329,21 +20329,21 @@ "blobs_needed": 1, "block_number": 155, "l1_block_number": 20973622, - "mana_spent": 88525422, - "size_in_fields": 3195, + "mana_spent": 75183759, + "size_in_fields": 2625, "slot_number": 155, "timestamp": 1729027403 }, "fee_header": { - "eth_per_fee_asset": 10008668, - "excess_mana": 1323147880, - "mana_used": 88525422 + "eth_per_fee_asset": 10569000, + "excess_mana": 1031355896, + "mana_used": 75183759 }, "oracle_input": { - "fee_asset_price_modifier": -58 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 10067057, + "eth_per_fee_asset_at_execution": 10576404, "l1_fee_oracle_output": { "base_fee": 13122417304, "blob_fee": 26071 @@ -20360,22 +20360,22 @@ "slot_of_change": 155 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82375042080322, - "congestion_multiplier": 4702447043, - "prover_cost": 18338297577932, - "sequencer_cost": 3910512774489 + "congestion_cost": 95503274553431, + "congestion_multiplier": 4997387122, + "prover_cost": 18928508876931, + "sequencer_cost": 4962916129150 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 829274244, - "congestion_multiplier": 4702447043, - "prover_cost": 184612687, - "sequencer_cost": 39367355 + "congestion_cost": 1010081215, + "congestion_multiplier": 4997387122, + "prover_cost": 200195557, + "sequencer_cost": 52489806 } }, "parent_fee_header": { - "eth_per_fee_asset": 10067057, - "excess_mana": 1314048430, - "mana_used": 109099450 + "eth_per_fee_asset": 10576404, + "excess_mana": 1020464739, + "mana_used": 85891157 } }, { @@ -20383,21 +20383,21 @@ "blobs_needed": 1, "block_number": 156, "l1_block_number": 20973625, - "mana_spent": 109354009, - "size_in_fields": 4005, + "mana_spent": 53153398, + "size_in_fields": 2070, "slot_number": 156, "timestamp": 1729027439 }, "fee_header": { - "eth_per_fee_asset": 10088737, - "excess_mana": 1311673302, - "mana_used": 109354009 + "eth_per_fee_asset": 10541520, + "excess_mana": 1031539655, + "mana_used": 53153398 }, "oracle_input": { - "fee_asset_price_modifier": 80 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 10008668, + "eth_per_fee_asset_at_execution": 10569000, "l1_fee_oracle_output": { "base_fee": 13122417304, "blob_fee": 26071 @@ -20414,22 +20414,22 @@ "slot_of_change": 155 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81452250189536, - "congestion_multiplier": 4639737375, - "prover_cost": 18445280331010, - "sequencer_cost": 3933326092943 + "congestion_cost": 95604433437412, + "congestion_multiplier": 4998819898, + "prover_cost": 18941769041537, + "sequencer_cost": 4966392847006 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815228530, - "congestion_multiplier": 4639737375, - "prover_cost": 184612687, - "sequencer_cost": 39367355 + "congestion_cost": 1010443257, + "congestion_multiplier": 4998819898, + "prover_cost": 200195557, + "sequencer_cost": 52489806 } }, "parent_fee_header": { - "eth_per_fee_asset": 10008668, - "excess_mana": 1323147880, - "mana_used": 88525422 + "eth_per_fee_asset": 10569000, + "excess_mana": 1031355896, + "mana_used": 75183759 } }, { @@ -20437,21 +20437,21 @@ "blobs_needed": 1, "block_number": 157, "l1_block_number": 20973628, - "mana_spent": 100641422, - "size_in_fields": 3375, + "mana_spent": 86123839, + "size_in_fields": 3225, "slot_number": 157, "timestamp": 1729027475 }, "fee_header": { - "eth_per_fee_asset": 10075621, - "excess_mana": 1321027311, - "mana_used": 100641422 + "eth_per_fee_asset": 10530978, + "excess_mana": 1009693053, + "mana_used": 86123839 }, "oracle_input": { - "fee_asset_price_modifier": -13 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 10088737, + "eth_per_fee_asset_at_execution": 10541520, "l1_fee_oracle_output": { "base_fee": 13122417304, "blob_fee": 26071 @@ -20468,22 +20468,22 @@ "slot_of_change": 155 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81939324020440, - "congestion_multiplier": 4690794425, - "prover_cost": 18298889841217, - "sequencer_cost": 3902109352242 + "congestion_cost": 91838771448520, + "congestion_multiplier": 4831326971, + "prover_cost": 18991147102126, + "sequencer_cost": 4979339412154 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 826664290, - "congestion_multiplier": 4690794425, - "prover_cost": 184612687, - "sequencer_cost": 39367355 + "congestion_cost": 968120246, + "congestion_multiplier": 4831326971, + "prover_cost": 200195557, + "sequencer_cost": 52489806 } }, "parent_fee_header": { - "eth_per_fee_asset": 10088737, - "excess_mana": 1311673302, - "mana_used": 109354009 + "eth_per_fee_asset": 10541520, + "excess_mana": 1031539655, + "mana_used": 53153398 } }, { @@ -20491,21 +20491,21 @@ "blobs_needed": 1, "block_number": 158, "l1_block_number": 20973631, - "mana_spent": 96541146, - "size_in_fields": 3315, + "mana_spent": 77899703, + "size_in_fields": 2955, "slot_number": 158, "timestamp": 1729027511 }, "fee_header": { - "eth_per_fee_asset": 10102825, - "excess_mana": 1321668733, - "mana_used": 96541146 + "eth_per_fee_asset": 10636287, + "excess_mana": 1020816892, + "mana_used": 77899703 }, "oracle_input": { - "fee_asset_price_modifier": 27 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10075621, + "eth_per_fee_asset_at_execution": 10530978, "l1_fee_oracle_output": { "base_fee": 13122417304, "blob_fee": 26071 @@ -20522,22 +20522,22 @@ "slot_of_change": 160 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82124273630380, - "congestion_multiplier": 4694316017, - "prover_cost": 18322710530696, - "sequencer_cost": 3907188946468 + "congestion_cost": 93959933920668, + "congestion_multiplier": 4915897563, + "prover_cost": 19010158125865, + "sequencer_cost": 4984323963074 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 827453056, - "congestion_multiplier": 4694316017, - "prover_cost": 184612687, - "sequencer_cost": 39367355 + "congestion_cost": 989489997, + "congestion_multiplier": 4915897563, + "prover_cost": 200195557, + "sequencer_cost": 52489806 } }, "parent_fee_header": { - "eth_per_fee_asset": 10075621, - "excess_mana": 1321027311, - "mana_used": 100641422 + "eth_per_fee_asset": 10530978, + "excess_mana": 1009693053, + "mana_used": 86123839 } }, { @@ -20545,21 +20545,21 @@ "blobs_needed": 1, "block_number": 159, "l1_block_number": 20973634, - "mana_spent": 99172403, - "size_in_fields": 3435, + "mana_spent": 74452737, + "size_in_fields": 2745, "slot_number": 159, "timestamp": 1729027547 }, "fee_header": { - "eth_per_fee_asset": 10117979, - "excess_mana": 1318209879, - "mana_used": 99172403 + "eth_per_fee_asset": 10634159, + "excess_mana": 1023716595, + "mana_used": 74452737 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -2 }, "outputs": { - "eth_per_fee_asset_at_execution": 10102825, + "eth_per_fee_asset_at_execution": 10636287, "l1_fee_oracle_output": { "base_fee": 13122417304, "blob_fee": 26071 @@ -20576,22 +20576,22 @@ "slot_of_change": 160 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81482818221637, - "congestion_multiplier": 4675357169, - "prover_cost": 18273372744753, - "sequencer_cost": 3896668011176 + "congestion_cost": 93559129327744, + "congestion_multiplier": 4938185177, + "prover_cost": 18821940118766, + "sequencer_cost": 4934974582766 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 823206653, - "congestion_multiplier": 4675357169, - "prover_cost": 184612687, - "sequencer_cost": 39367355 + "congestion_cost": 995121751, + "congestion_multiplier": 4938185177, + "prover_cost": 200195557, + "sequencer_cost": 52489806 } }, "parent_fee_header": { - "eth_per_fee_asset": 10102825, - "excess_mana": 1321668733, - "mana_used": 96541146 + "eth_per_fee_asset": 10636287, + "excess_mana": 1020816892, + "mana_used": 77899703 } }, { @@ -20599,21 +20599,21 @@ "blobs_needed": 1, "block_number": 160, "l1_block_number": 20973637, - "mana_spent": 84015850, - "size_in_fields": 3150, + "mana_spent": 78061068, + "size_in_fields": 2955, "slot_number": 160, "timestamp": 1729027583 }, "fee_header": { - "eth_per_fee_asset": 10124049, - "excess_mana": 1317382282, - "mana_used": 84015850 + "eth_per_fee_asset": 10616080, + "excess_mana": 1023169332, + "mana_used": 78061068 }, "oracle_input": { - "fee_asset_price_modifier": 6 + "fee_asset_price_modifier": -17 }, "outputs": { - "eth_per_fee_asset_at_execution": 10117979, + "eth_per_fee_asset_at_execution": 10634159, "l1_fee_oracle_output": { "base_fee": 12720221169, "blob_fee": 31726 @@ -20630,22 +20630,22 @@ "slot_of_change": 160 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 80777266981875, - "congestion_multiplier": 4670832265, - "prover_cost": 18233582121489, - "sequencer_cost": 3771582150942 + "congestion_cost": 92659399017826, + "congestion_multiplier": 4933971098, + "prover_cost": 18768974866748, + "sequencer_cost": 4784680387044 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 817302691, - "congestion_multiplier": 4670832265, - "prover_cost": 184487001, - "sequencer_cost": 38160789 + "congestion_cost": 985354782, + "congestion_multiplier": 4933971098, + "prover_cost": 199592263, + "sequencer_cost": 50881052 } }, "parent_fee_header": { - "eth_per_fee_asset": 10117979, - "excess_mana": 1318209879, - "mana_used": 99172403 + "eth_per_fee_asset": 10634159, + "excess_mana": 1023716595, + "mana_used": 74452737 } }, { @@ -20653,21 +20653,21 @@ "blobs_needed": 1, "block_number": 161, "l1_block_number": 20973640, - "mana_spent": 105171641, - "size_in_fields": 3675, + "mana_spent": 76785949, + "size_in_fields": 2565, "slot_number": 161, "timestamp": 1729027619 }, "fee_header": { - "eth_per_fee_asset": 10134173, - "excess_mana": 1301398132, - "mana_used": 105171641 + "eth_per_fee_asset": 10630942, + "excess_mana": 1026230400, + "mana_used": 76785949 }, "oracle_input": { - "fee_asset_price_modifier": 10 + "fee_asset_price_modifier": 14 }, "outputs": { - "eth_per_fee_asset_at_execution": 10124049, + "eth_per_fee_asset_at_execution": 10616080, "l1_fee_oracle_output": { "base_fee": 12720221169, "blob_fee": 31726 @@ -20684,22 +20684,22 @@ "slot_of_change": 160 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 78825658884109, - "congestion_multiplier": 4584292634, - "prover_cost": 18222649949640, - "sequencer_cost": 3769320851766 + "congestion_cost": 93374418994582, + "congestion_multiplier": 4957588468, + "prover_cost": 18800938105214, + "sequencer_cost": 4792828614706 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798034833, - "congestion_multiplier": 4584292634, - "prover_cost": 184487001, - "sequencer_cost": 38160789 + "congestion_cost": 991270302, + "congestion_multiplier": 4957588468, + "prover_cost": 199592263, + "sequencer_cost": 50881052 } }, "parent_fee_header": { - "eth_per_fee_asset": 10124049, - "excess_mana": 1317382282, - "mana_used": 84015850 + "eth_per_fee_asset": 10616080, + "excess_mana": 1023169332, + "mana_used": 78061068 } }, { @@ -20707,21 +20707,21 @@ "blobs_needed": 1, "block_number": 162, "l1_block_number": 20973643, - "mana_spent": 114239236, - "size_in_fields": 3870, + "mana_spent": 63028846, + "size_in_fields": 2415, "slot_number": 162, "timestamp": 1729027655 }, "fee_header": { - "eth_per_fee_asset": 10194978, - "excess_mana": 1306569773, - "mana_used": 114239236 + "eth_per_fee_asset": 10640509, + "excess_mana": 1028016349, + "mana_used": 63028846 }, "oracle_input": { - "fee_asset_price_modifier": 60 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10134173, + "eth_per_fee_asset_at_execution": 10630942, "l1_fee_oracle_output": { "base_fee": 12720221169, "blob_fee": 31726 @@ -20738,22 +20738,22 @@ "slot_of_change": 160 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 79358179794247, - "congestion_multiplier": 4612115454, - "prover_cost": 18204445592157, - "sequencer_cost": 3765555314677 + "congestion_cost": 93569763055805, + "congestion_multiplier": 4971419967, + "prover_cost": 18774654494400, + "sequencer_cost": 4786128265962 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804229523, - "congestion_multiplier": 4612115454, - "prover_cost": 184487001, - "sequencer_cost": 38160789 + "congestion_cost": 994734724, + "congestion_multiplier": 4971419967, + "prover_cost": 199592263, + "sequencer_cost": 50881052 } }, "parent_fee_header": { - "eth_per_fee_asset": 10134173, - "excess_mana": 1301398132, - "mana_used": 105171641 + "eth_per_fee_asset": 10630942, + "excess_mana": 1026230400, + "mana_used": 76785949 } }, { @@ -20761,21 +20761,21 @@ "blobs_needed": 1, "block_number": 163, "l1_block_number": 20973646, - "mana_spent": 103965857, - "size_in_fields": 3525, + "mana_spent": 72211043, + "size_in_fields": 2655, "slot_number": 163, "timestamp": 1729027691 }, "fee_header": { - "eth_per_fee_asset": 10231679, - "excess_mana": 1320809009, - "mana_used": 103965857 + "eth_per_fee_asset": 10555384, + "excess_mana": 1016045195, + "mana_used": 72211043 }, "oracle_input": { - "fee_asset_price_modifier": 36 + "fee_asset_price_modifier": -80 }, "outputs": { - "eth_per_fee_asset_at_execution": 10194978, + "eth_per_fee_asset_at_execution": 10640509, "l1_fee_oracle_output": { "base_fee": 12720221169, "blob_fee": 31726 @@ -20792,22 +20792,22 @@ "slot_of_change": 165 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 80576976527071, - "congestion_multiplier": 4689596486, - "prover_cost": 18095870437386, - "sequencer_cost": 3743096748223 + "congestion_cost": 91320467376138, + "congestion_multiplier": 4879440232, + "prover_cost": 18757773993707, + "sequencer_cost": 4781825004801 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 821480503, - "congestion_multiplier": 4689596486, - "prover_cost": 184487001, - "sequencer_cost": 38160789 + "congestion_cost": 971696255, + "congestion_multiplier": 4879440232, + "prover_cost": 199592263, + "sequencer_cost": 50881052 } }, "parent_fee_header": { - "eth_per_fee_asset": 10194978, - "excess_mana": 1306569773, - "mana_used": 114239236 + "eth_per_fee_asset": 10640509, + "excess_mana": 1028016349, + "mana_used": 63028846 } }, { @@ -20815,21 +20815,21 @@ "blobs_needed": 1, "block_number": 164, "l1_block_number": 20973649, - "mana_spent": 110386412, - "size_in_fields": 3735, + "mana_spent": 91396347, + "size_in_fields": 3060, "slot_number": 164, "timestamp": 1729027727 }, "fee_header": { - "eth_per_fee_asset": 10247026, - "excess_mana": 1324774866, - "mana_used": 110386412 + "eth_per_fee_asset": 10590216, + "excess_mana": 1013256238, + "mana_used": 91396347 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": 33 }, "outputs": { - "eth_per_fee_asset_at_execution": 10231679, + "eth_per_fee_asset_at_execution": 10555384, "l1_fee_oracle_output": { "base_fee": 12720221169, "blob_fee": 31726 @@ -20846,22 +20846,22 @@ "slot_of_change": 165 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 80762558227247, - "congestion_multiplier": 4711407023, - "prover_cost": 18030960607737, - "sequencer_cost": 3729670272103 + "congestion_cost": 91554264913527, + "congestion_multiplier": 4858257010, + "prover_cost": 18909048027055, + "sequencer_cost": 4820388533473 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 826336571, - "congestion_multiplier": 4711407023, - "prover_cost": 184487001, - "sequencer_cost": 38160789 + "congestion_cost": 966390423, + "congestion_multiplier": 4858257010, + "prover_cost": 199592263, + "sequencer_cost": 50881052 } }, "parent_fee_header": { - "eth_per_fee_asset": 10231679, - "excess_mana": 1320809009, - "mana_used": 103965857 + "eth_per_fee_asset": 10555384, + "excess_mana": 1016045195, + "mana_used": 72211043 } }, { @@ -20869,21 +20869,21 @@ "blobs_needed": 1, "block_number": 165, "l1_block_number": 20973652, - "mana_spent": 102280266, - "size_in_fields": 3600, + "mana_spent": 75057594, + "size_in_fields": 2355, "slot_number": 165, "timestamp": 1729027763 }, "fee_header": { - "eth_per_fee_asset": 10255223, - "excess_mana": 1335161278, - "mana_used": 102280266 + "eth_per_fee_asset": 10647403, + "excess_mana": 1029652585, + "mana_used": 75057594 }, "oracle_input": { - "fee_asset_price_modifier": 8 + "fee_asset_price_modifier": 54 }, "outputs": { - "eth_per_fee_asset_at_execution": 10247026, + "eth_per_fee_asset_at_execution": 10590216, "l1_fee_oracle_output": { "base_fee": 13412754406, "blob_fee": 25067 @@ -20900,22 +20900,22 @@ "slot_of_change": 165 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82736959094278, - "congestion_multiplier": 4769009810, - "prover_cost": 18025075470679, - "sequencer_cost": 3926833209948 + "congestion_cost": 95663047949164, + "congestion_multiplier": 4984125865, + "prover_cost": 18944945315563, + "sequencer_cost": 5066105356114 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 847807771, - "congestion_multiplier": 4769009810, - "prover_cost": 184703417, - "sequencer_cost": 40238362 + "congestion_cost": 1013092341, + "congestion_multiplier": 4984125865, + "prover_cost": 200631063, + "sequencer_cost": 53651150 } }, "parent_fee_header": { - "eth_per_fee_asset": 10247026, - "excess_mana": 1324774866, - "mana_used": 110386412 + "eth_per_fee_asset": 10590216, + "excess_mana": 1013256238, + "mana_used": 91396347 } }, { @@ -20923,21 +20923,21 @@ "blobs_needed": 1, "block_number": 166, "l1_block_number": 20973655, - "mana_spent": 70948157, - "size_in_fields": 2505, + "mana_spent": 70073006, + "size_in_fields": 2430, "slot_number": 166, "timestamp": 1729027799 }, "fee_header": { - "eth_per_fee_asset": 10254197, - "excess_mana": 1337441544, - "mana_used": 70948157 + "eth_per_fee_asset": 10652726, + "excess_mana": 1029710179, + "mana_used": 70073006 }, "oracle_input": { - "fee_asset_price_modifier": -1 + "fee_asset_price_modifier": 5 }, "outputs": { - "eth_per_fee_asset_at_execution": 10255223, + "eth_per_fee_asset_at_execution": 10647403, "l1_fee_oracle_output": { "base_fee": 13412754406, "blob_fee": 25067 @@ -20954,22 +20954,22 @@ "slot_of_change": 165 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82950277434241, - "congestion_multiplier": 4781750093, - "prover_cost": 18010668027405, - "sequencer_cost": 3923694492066 + "congestion_cost": 95159938625410, + "congestion_multiplier": 4984573693, + "prover_cost": 18843192372826, + "sequencer_cost": 5038895400128 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 850673593, - "congestion_multiplier": 4781750093, - "prover_cost": 184703417, - "sequencer_cost": 40238362 + "congestion_cost": 1013206216, + "congestion_multiplier": 4984573693, + "prover_cost": 200631063, + "sequencer_cost": 53651150 } }, "parent_fee_header": { - "eth_per_fee_asset": 10255223, - "excess_mana": 1335161278, - "mana_used": 102280266 + "eth_per_fee_asset": 10647403, + "excess_mana": 1029652585, + "mana_used": 75057594 } }, { @@ -20977,21 +20977,21 @@ "blobs_needed": 1, "block_number": 167, "l1_block_number": 20973658, - "mana_spent": 109182990, - "size_in_fields": 3720, + "mana_spent": 67582524, + "size_in_fields": 2460, "slot_number": 167, "timestamp": 1729027835 }, "fee_header": { - "eth_per_fee_asset": 10253171, - "excess_mana": 1308389701, - "mana_used": 109182990 + "eth_per_fee_asset": 10643138, + "excess_mana": 1024783185, + "mana_used": 67582524 }, "oracle_input": { - "fee_asset_price_modifier": -1 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10254197, + "eth_per_fee_asset_at_execution": 10652726, "l1_fee_oracle_output": { "base_fee": 13412754406, "blob_fee": 25067 @@ -21008,22 +21008,22 @@ "slot_of_change": 165 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 79453038009705, - "congestion_multiplier": 4621946568, - "prover_cost": 18012470113457, - "sequencer_cost": 3924087083562 + "congestion_cost": 94201381223924, + "congestion_multiplier": 4946408566, + "prover_cost": 18833776725319, + "sequencer_cost": 5036377543176 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 814727104, - "congestion_multiplier": 4621946568, - "prover_cost": 184703417, - "sequencer_cost": 40238362 + "congestion_cost": 1003501503, + "congestion_multiplier": 4946408566, + "prover_cost": 200631063, + "sequencer_cost": 53651150 } }, "parent_fee_header": { - "eth_per_fee_asset": 10254197, - "excess_mana": 1337441544, - "mana_used": 70948157 + "eth_per_fee_asset": 10652726, + "excess_mana": 1029710179, + "mana_used": 70073006 } }, { @@ -21031,21 +21031,21 @@ "blobs_needed": 1, "block_number": 168, "l1_block_number": 20973661, - "mana_spent": 106656642, - "size_in_fields": 3540, + "mana_spent": 73578485, + "size_in_fields": 2580, "slot_number": 168, "timestamp": 1729027871 }, "fee_header": { - "eth_per_fee_asset": 10251120, - "excess_mana": 1317572691, - "mana_used": 106656642 + "eth_per_fee_asset": 10672938, + "excess_mana": 1017365709, + "mana_used": 73578485 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 10253171, + "eth_per_fee_asset_at_execution": 10643138, "l1_fee_oracle_output": { "base_fee": 13412754406, "blob_fee": 25067 @@ -21062,22 +21062,22 @@ "slot_of_change": 170 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 80556310920788, - "congestion_multiplier": 4671872942, - "prover_cost": 18014272560167, - "sequencer_cost": 3924479753630 + "congestion_cost": 92926657438812, + "congestion_multiplier": 4889502248, + "prover_cost": 18850743361592, + "sequencer_cost": 5040914624992 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 825957631, - "congestion_multiplier": 4671872942, - "prover_cost": 184703417, - "sequencer_cost": 40238362 + "congestion_cost": 989031239, + "congestion_multiplier": 4889502248, + "prover_cost": 200631063, + "sequencer_cost": 53651150 } }, "parent_fee_header": { - "eth_per_fee_asset": 10253171, - "excess_mana": 1308389701, - "mana_used": 109182990 + "eth_per_fee_asset": 10643138, + "excess_mana": 1024783185, + "mana_used": 67582524 } }, { @@ -21085,21 +21085,21 @@ "blobs_needed": 1, "block_number": 169, "l1_block_number": 20973664, - "mana_spent": 97116066, - "size_in_fields": 3390, + "mana_spent": 72075877, + "size_in_fields": 2535, "slot_number": 169, "timestamp": 1729027907 }, "fee_header": { - "eth_per_fee_asset": 10260346, - "excess_mana": 1324229333, - "mana_used": 97116066 + "eth_per_fee_asset": 10637717, + "excess_mana": 1015944194, + "mana_used": 72075877 }, "oracle_input": { - "fee_asset_price_modifier": 9 + "fee_asset_price_modifier": -33 }, "outputs": { - "eth_per_fee_asset_at_execution": 10251120, + "eth_per_fee_asset_at_execution": 10672938, "l1_fee_oracle_output": { "base_fee": 13412754406, "blob_fee": 25067 @@ -21116,22 +21116,22 @@ "slot_of_change": 170 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81373964600942, - "congestion_multiplier": 4708400816, - "prover_cost": 18017876778343, - "sequencer_cost": 3925264946660 + "congestion_cost": 92409153599506, + "congestion_multiplier": 4878671480, + "prover_cost": 18798110042427, + "sequencer_cost": 5026839844849 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 834174276, - "congestion_multiplier": 4708400816, - "prover_cost": 184703417, - "sequencer_cost": 40238362 + "congestion_cost": 986277167, + "congestion_multiplier": 4878671480, + "prover_cost": 200631063, + "sequencer_cost": 53651150 } }, "parent_fee_header": { - "eth_per_fee_asset": 10251120, - "excess_mana": 1317572691, - "mana_used": 106656642 + "eth_per_fee_asset": 10672938, + "excess_mana": 1017365709, + "mana_used": 73578485 } }, { @@ -21139,21 +21139,21 @@ "blobs_needed": 1, "block_number": 170, "l1_block_number": 20973667, - "mana_spent": 104922432, - "size_in_fields": 3705, + "mana_spent": 88707435, + "size_in_fields": 2745, "slot_number": 170, "timestamp": 1729027943 }, "fee_header": { - "eth_per_fee_asset": 10362949, - "excess_mana": 1321345399, - "mana_used": 104922432 + "eth_per_fee_asset": 10629206, + "excess_mana": 1013020071, + "mana_used": 88707435 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10260346, + "eth_per_fee_asset_at_execution": 10637717, "l1_fee_oracle_output": { "base_fee": 13803335637, "blob_fee": 35692 @@ -21170,22 +21170,22 @@ "slot_of_change": 170 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81418715704130, - "congestion_multiplier": 4692540489, - "prover_cost": 18013571277226, - "sequencer_cost": 4035940698297 + "congestion_cost": 92963155816234, + "congestion_multiplier": 4856467458, + "prover_cost": 18915424710021, + "sequencer_cost": 5190355223776 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 835384194, - "congestion_multiplier": 4692540489, - "prover_cost": 184825474, - "sequencer_cost": 41410148 + "congestion_cost": 988915743, + "congestion_multiplier": 4856467458, + "prover_cost": 201216935, + "sequencer_cost": 55213530 } }, "parent_fee_header": { - "eth_per_fee_asset": 10260346, - "excess_mana": 1324229333, - "mana_used": 97116066 + "eth_per_fee_asset": 10637717, + "excess_mana": 1015944194, + "mana_used": 72075877 } }, { @@ -21193,21 +21193,21 @@ "blobs_needed": 1, "block_number": 171, "l1_block_number": 20973670, - "mana_spent": 97025751, - "size_in_fields": 3240, + "mana_spent": 73600412, + "size_in_fields": 2700, "slot_number": 171, "timestamp": 1729027979 }, "fee_header": { - "eth_per_fee_asset": 10327714, - "excess_mana": 1326267831, - "mana_used": 97025751 + "eth_per_fee_asset": 10683414, + "excess_mana": 1026727506, + "mana_used": 73600412 }, "oracle_input": { - "fee_asset_price_modifier": -34 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 10362949, + "eth_per_fee_asset_at_execution": 10629206, "l1_fee_oracle_output": { "base_fee": 13803335637, "blob_fee": 35692 @@ -21224,22 +21224,22 @@ "slot_of_change": 170 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81204294549747, - "congestion_multiplier": 4719643955, - "prover_cost": 17835219878049, - "sequencer_cost": 3995981066780 + "congestion_cost": 95569931469952, + "congestion_multiplier": 4961434496, + "prover_cost": 18930570637168, + "sequencer_cost": 5194511236305 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 841515963, - "congestion_multiplier": 4719643955, - "prover_cost": 184825474, - "sequencer_cost": 41410148 + "congestion_cost": 1015832489, + "congestion_multiplier": 4961434496, + "prover_cost": 201216935, + "sequencer_cost": 55213530 } }, "parent_fee_header": { - "eth_per_fee_asset": 10362949, - "excess_mana": 1321345399, - "mana_used": 104922432 + "eth_per_fee_asset": 10629206, + "excess_mana": 1013020071, + "mana_used": 88707435 } }, { @@ -21247,21 +21247,21 @@ "blobs_needed": 1, "block_number": 172, "l1_block_number": 20973673, - "mana_spent": 106860835, - "size_in_fields": 3630, + "mana_spent": 68324315, + "size_in_fields": 2415, "slot_number": 172, "timestamp": 1729028015 }, "fee_header": { - "eth_per_fee_asset": 10307058, - "excess_mana": 1323293582, - "mana_used": 106860835 + "eth_per_fee_asset": 10644953, + "excess_mana": 1025327918, + "mana_used": 68324315 }, "oracle_input": { - "fee_asset_price_modifier": -20 + "fee_asset_price_modifier": -36 }, "outputs": { - "eth_per_fee_asset_at_execution": 10327714, + "eth_per_fee_asset_at_execution": 10683414, "l1_fee_oracle_output": { "base_fee": 13803335637, "blob_fee": 35692 @@ -21278,22 +21278,22 @@ "slot_of_change": 170 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81122190544781, - "congestion_multiplier": 4703248744, - "prover_cost": 17896068190890, - "sequencer_cost": 4009614131453 + "congestion_cost": 94825279166379, + "congestion_multiplier": 4950613729, + "prover_cost": 18834516288520, + "sequencer_cost": 5168154112534 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 837806783, - "congestion_multiplier": 4703248744, - "prover_cost": 184825474, - "sequencer_cost": 41410148 + "congestion_cost": 1013057715, + "congestion_multiplier": 4950613729, + "prover_cost": 201216935, + "sequencer_cost": 55213530 } }, "parent_fee_header": { - "eth_per_fee_asset": 10327714, - "excess_mana": 1326267831, - "mana_used": 97025751 + "eth_per_fee_asset": 10683414, + "excess_mana": 1026727506, + "mana_used": 73600412 } }, { @@ -21301,21 +21301,21 @@ "blobs_needed": 1, "block_number": 173, "l1_block_number": 20973676, - "mana_spent": 80491623, - "size_in_fields": 2940, + "mana_spent": 84835388, + "size_in_fields": 2835, "slot_number": 173, "timestamp": 1729028051 }, "fee_header": { - "eth_per_fee_asset": 10320457, - "excess_mana": 1330154417, - "mana_used": 80491623 + "eth_per_fee_asset": 10578954, + "excess_mana": 1018652233, + "mana_used": 84835388 }, "oracle_input": { - "fee_asset_price_modifier": 13 + "fee_asset_price_modifier": -62 }, "outputs": { - "eth_per_fee_asset_at_execution": 10307058, + "eth_per_fee_asset_at_execution": 10644953, "l1_fee_oracle_output": { "base_fee": 13803335637, "blob_fee": 35692 @@ -21332,22 +21332,22 @@ "slot_of_change": 175 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 82116779783330, - "congestion_multiplier": 4741154489, - "prover_cost": 17931933050149, - "sequencer_cost": 4017649653277 + "congestion_cost": 93932380819343, + "congestion_multiplier": 4899325222, + "prover_cost": 18902566784466, + "sequencer_cost": 5186827034371 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 846382412, - "congestion_multiplier": 4741154489, - "prover_cost": 184825474, - "sequencer_cost": 41410148 + "congestion_cost": 999905779, + "congestion_multiplier": 4899325222, + "prover_cost": 201216935, + "sequencer_cost": 55213530 } }, "parent_fee_header": { - "eth_per_fee_asset": 10307058, - "excess_mana": 1323293582, - "mana_used": 106860835 + "eth_per_fee_asset": 10644953, + "excess_mana": 1025327918, + "mana_used": 68324315 } }, { @@ -21355,21 +21355,21 @@ "blobs_needed": 1, "block_number": 174, "l1_block_number": 20973679, - "mana_spent": 106235121, - "size_in_fields": 3840, + "mana_spent": 82378734, + "size_in_fields": 2730, "slot_number": 174, "timestamp": 1729028087 }, "fee_header": { - "eth_per_fee_asset": 10352450, - "excess_mana": 1310646040, - "mana_used": 106235121 + "eth_per_fee_asset": 10583185, + "excess_mana": 1028487621, + "mana_used": 82378734 }, "oracle_input": { - "fee_asset_price_modifier": 31 + "fee_asset_price_modifier": 4 }, "outputs": { - "eth_per_fee_asset_at_execution": 10320457, + "eth_per_fee_asset_at_execution": 10578954, "l1_fee_oracle_output": { "base_fee": 13803335637, "blob_fee": 35692 @@ -21386,22 +21386,22 @@ "slot_of_change": 175 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 79664825598324, - "congestion_multiplier": 4634164241, - "prover_cost": 17908652107170, - "sequencer_cost": 4012433557933 + "congestion_cost": 96354577494146, + "congestion_multiplier": 4975076221, + "prover_cost": 19020494370238, + "sequencer_cost": 5219186131257 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 822177407, - "congestion_multiplier": 4634164241, - "prover_cost": 184825474, - "sequencer_cost": 41410148 + "congestion_cost": 1019330643, + "congestion_multiplier": 4975076221, + "prover_cost": 201216935, + "sequencer_cost": 55213530 } }, "parent_fee_header": { - "eth_per_fee_asset": 10320457, - "excess_mana": 1330154417, - "mana_used": 80491623 + "eth_per_fee_asset": 10578954, + "excess_mana": 1018652233, + "mana_used": 84835388 } }, { @@ -21409,21 +21409,21 @@ "blobs_needed": 1, "block_number": 175, "l1_block_number": 20973682, - "mana_spent": 98264631, - "size_in_fields": 3465, + "mana_spent": 65777106, + "size_in_fields": 2295, "slot_number": 175, "timestamp": 1729028123 }, "fee_header": { - "eth_per_fee_asset": 10340027, - "excess_mana": 1316881161, - "mana_used": 98264631 + "eth_per_fee_asset": 10658325, + "excess_mana": 1035866355, + "mana_used": 65777106 }, "oracle_input": { - "fee_asset_price_modifier": -12 + "fee_asset_price_modifier": 71 }, "outputs": { - "eth_per_fee_asset_at_execution": 10352450, + "eth_per_fee_asset_at_execution": 10583185, "l1_fee_oracle_output": { "base_fee": 14597885588, "blob_fee": 38607 @@ -21440,22 +21440,22 @@ "slot_of_change": 175 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81092679703839, - "congestion_multiplier": 4668094505, - "prover_cost": 17877291945385, - "sequencer_cost": 4230284522022 + "congestion_cost": 99376841470692, + "congestion_multiplier": 5032674318, + "prover_cost": 19125505223617, + "sequencer_cost": 5517407566815 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 839507912, - "congestion_multiplier": 4668094505, - "prover_cost": 185073771, - "sequencer_cost": 43793809 + "congestion_cost": 1051723498, + "congestion_multiplier": 5032674318, + "prover_cost": 202408760, + "sequencer_cost": 58391745 } }, "parent_fee_header": { - "eth_per_fee_asset": 10352450, - "excess_mana": 1310646040, - "mana_used": 106235121 + "eth_per_fee_asset": 10583185, + "excess_mana": 1028487621, + "mana_used": 82378734 } }, { @@ -21463,21 +21463,21 @@ "blobs_needed": 1, "block_number": 176, "l1_block_number": 20973685, - "mana_spent": 99766989, - "size_in_fields": 3480, + "mana_spent": 74103428, + "size_in_fields": 2745, "slot_number": 176, "timestamp": 1729028159 }, "fee_header": { - "eth_per_fee_asset": 10319346, - "excess_mana": 1315145792, - "mana_used": 99766989 + "eth_per_fee_asset": 10703089, + "excess_mana": 1026643461, + "mana_used": 74103428 }, "oracle_input": { - "fee_asset_price_modifier": -20 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 10340027, + "eth_per_fee_asset_at_execution": 10658325, "l1_fee_oracle_output": { "base_fee": 14597885588, "blob_fee": 38607 @@ -21494,22 +21494,22 @@ "slot_of_change": 175 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 80980533513114, - "congestion_multiplier": 4658626107, - "prover_cost": 17898770573810, - "sequencer_cost": 4235366986953 + "congestion_cost": 96917149552111, + "congestion_multiplier": 4960784044, + "prover_cost": 18990672549393, + "sequencer_cost": 5478510460134 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 837340903, - "congestion_multiplier": 4658626107, - "prover_cost": 185073771, - "sequencer_cost": 43793809 + "congestion_cost": 1032974478, + "congestion_multiplier": 4960784044, + "prover_cost": 202408760, + "sequencer_cost": 58391745 } }, "parent_fee_header": { - "eth_per_fee_asset": 10340027, - "excess_mana": 1316881161, - "mana_used": 98264631 + "eth_per_fee_asset": 10658325, + "excess_mana": 1035866355, + "mana_used": 65777106 } }, { @@ -21517,21 +21517,21 @@ "blobs_needed": 1, "block_number": 177, "l1_block_number": 20973687, - "mana_spent": 112012723, - "size_in_fields": 3885, + "mana_spent": 80971441, + "size_in_fields": 2730, "slot_number": 177, "timestamp": 1729028195 }, "fee_header": { - "eth_per_fee_asset": 10408092, - "excess_mana": 1314912781, - "mana_used": 112012723 + "eth_per_fee_asset": 10655995, + "excess_mana": 1025746889, + "mana_used": 80971441 }, "oracle_input": { - "fee_asset_price_modifier": 86 + "fee_asset_price_modifier": -44 }, "outputs": { - "eth_per_fee_asset_at_execution": 10319346, + "eth_per_fee_asset_at_execution": 10703089, "l1_fee_oracle_output": { "base_fee": 14597885588, "blob_fee": 38607 @@ -21548,22 +21548,22 @@ "slot_of_change": 175 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81114662692772, - "congestion_multiplier": 4657356232, - "prover_cost": 17934641497630, - "sequencer_cost": 4243855085391 + "congestion_cost": 96342859710875, + "congestion_multiplier": 4953850482, + "prover_cost": 18911247024107, + "sequencer_cost": 5455597444813 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 837050270, - "congestion_multiplier": 4657356232, - "prover_cost": 185073771, - "sequencer_cost": 43793809 + "congestion_cost": 1031166202, + "congestion_multiplier": 4953850482, + "prover_cost": 202408760, + "sequencer_cost": 58391745 } }, "parent_fee_header": { - "eth_per_fee_asset": 10319346, - "excess_mana": 1315145792, - "mana_used": 99766989 + "eth_per_fee_asset": 10703089, + "excess_mana": 1026643461, + "mana_used": 74103428 } }, { @@ -21571,21 +21571,21 @@ "blobs_needed": 1, "block_number": 178, "l1_block_number": 20973690, - "mana_spent": 98606709, - "size_in_fields": 3510, + "mana_spent": 78612907, + "size_in_fields": 2670, "slot_number": 178, "timestamp": 1729028231 }, "fee_header": { - "eth_per_fee_asset": 10370622, - "excess_mana": 1326925504, - "mana_used": 98606709 + "eth_per_fee_asset": 10664519, + "excess_mana": 1031718330, + "mana_used": 78612907 }, "oracle_input": { - "fee_asset_price_modifier": -36 + "fee_asset_price_modifier": 8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10408092, + "eth_per_fee_asset_at_execution": 10655995, "l1_fee_oracle_output": { "base_fee": 14597885588, "blob_fee": 38607 @@ -21602,22 +21602,22 @@ "slot_of_change": 180 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81872585196211, - "congestion_multiplier": 4723277012, - "prover_cost": 17781719358361, - "sequencer_cost": 4207669282709 + "congestion_cost": 97903356936636, + "congestion_multiplier": 5000213429, + "prover_cost": 18994824978804, + "sequencer_cost": 5479708370735 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 852137399, - "congestion_multiplier": 4723277012, - "prover_cost": 185073771, - "sequencer_cost": 43793809 + "congestion_cost": 1043257682, + "congestion_multiplier": 5000213429, + "prover_cost": 202408760, + "sequencer_cost": 58391745 } }, "parent_fee_header": { - "eth_per_fee_asset": 10408092, - "excess_mana": 1314912781, - "mana_used": 112012723 + "eth_per_fee_asset": 10655995, + "excess_mana": 1025746889, + "mana_used": 80971441 } }, { @@ -21625,21 +21625,21 @@ "blobs_needed": 1, "block_number": 179, "l1_block_number": 20973693, - "mana_spent": 96452343, - "size_in_fields": 3600, + "mana_spent": 58801099, + "size_in_fields": 2160, "slot_number": 179, "timestamp": 1729028267 }, "fee_header": { - "eth_per_fee_asset": 10350917, - "excess_mana": 1325532213, - "mana_used": 96452343 + "eth_per_fee_asset": 10557873, + "excess_mana": 1035331237, + "mana_used": 58801099 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10370622, + "eth_per_fee_asset_at_execution": 10664519, "l1_fee_oracle_output": { "base_fee": 14597885588, "blob_fee": 38607 @@ -21656,22 +21656,22 @@ "slot_of_change": 180 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 81998614355051, - "congestion_multiplier": 4715583632, - "prover_cost": 17845966326803, - "sequencer_cost": 4222871974314 + "congestion_cost": 98516236972338, + "congestion_multiplier": 5028474874, + "prover_cost": 18979642682432, + "sequencer_cost": 5475328516927 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 850376634, - "congestion_multiplier": 4715583632, - "prover_cost": 185073771, - "sequencer_cost": 43793809 + "congestion_cost": 1050628281, + "congestion_multiplier": 5028474874, + "prover_cost": 202408760, + "sequencer_cost": 58391745 } }, "parent_fee_header": { - "eth_per_fee_asset": 10370622, - "excess_mana": 1326925504, - "mana_used": 98606709 + "eth_per_fee_asset": 10664519, + "excess_mana": 1031718330, + "mana_used": 78612907 } }, { @@ -21679,21 +21679,21 @@ "blobs_needed": 1, "block_number": 180, "l1_block_number": 20973696, - "mana_spent": 109410402, - "size_in_fields": 3735, + "mana_spent": 87283363, + "size_in_fields": 3045, "slot_number": 180, "timestamp": 1729028303 }, "fee_header": { - "eth_per_fee_asset": 10355057, - "excess_mana": 1321984556, - "mana_used": 109410402 + "eth_per_fee_asset": 10641280, + "excess_mana": 1019132336, + "mana_used": 87283363 }, "oracle_input": { - "fee_asset_price_modifier": 4 + "fee_asset_price_modifier": 79 }, "outputs": { - "eth_per_fee_asset_at_execution": 10350917, + "eth_per_fee_asset_at_execution": 10557873, "l1_fee_oracle_output": { "base_fee": 16561448467, "blob_fee": 40153 @@ -21710,22 +21710,22 @@ "slot_of_change": 180 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 84045354532357, - "congestion_multiplier": 4696050948, - "prover_cost": 17939220650693, - "sequencer_cost": 4800009892844 + "congestion_cost": 100404138030454, + "congestion_multiplier": 4902995999, + "prover_cost": 19450329057757, + "sequencer_cost": 6274559752708 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 869946489, - "congestion_multiplier": 4696050948, - "prover_cost": 185687384, - "sequencer_cost": 49684504 + "congestion_cost": 1060054138, + "congestion_multiplier": 4902995999, + "prover_cost": 205354104, + "sequencer_cost": 66246005 } }, "parent_fee_header": { - "eth_per_fee_asset": 10350917, - "excess_mana": 1325532213, - "mana_used": 96452343 + "eth_per_fee_asset": 10557873, + "excess_mana": 1035331237, + "mana_used": 58801099 } }, { @@ -21733,21 +21733,21 @@ "blobs_needed": 1, "block_number": 181, "l1_block_number": 20973699, - "mana_spent": 82851655, - "size_in_fields": 3060, + "mana_spent": 70577973, + "size_in_fields": 2415, "slot_number": 181, "timestamp": 1729028339 }, "fee_header": { - "eth_per_fee_asset": 10309494, - "excess_mana": 1331394958, - "mana_used": 82851655 + "eth_per_fee_asset": 10699807, + "excess_mana": 1031415699, + "mana_used": 70577973 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": 55 }, "outputs": { - "eth_per_fee_asset_at_execution": 10355057, + "eth_per_fee_asset_at_execution": 10641280, "l1_fee_oracle_output": { "base_fee": 16561448467, "blob_fee": 40153 @@ -21764,22 +21764,22 @@ "slot_of_change": 180 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 85193492899170, - "congestion_multiplier": 4748040953, - "prover_cost": 17932048466754, - "sequencer_cost": 4798090826541 + "congestion_cost": 102038233088501, + "congestion_multiplier": 4997853363, + "prover_cost": 19297876195345, + "sequencer_cost": 6225379371655 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 882183475, - "congestion_multiplier": 4748040953, - "prover_cost": 185687384, - "sequencer_cost": 49684504 + "congestion_cost": 1085817409, + "congestion_multiplier": 4997853363, + "prover_cost": 205354104, + "sequencer_cost": 66246005 } }, "parent_fee_header": { - "eth_per_fee_asset": 10355057, - "excess_mana": 1321984556, - "mana_used": 109410402 + "eth_per_fee_asset": 10641280, + "excess_mana": 1019132336, + "mana_used": 87283363 } }, { @@ -21787,21 +21787,21 @@ "blobs_needed": 1, "block_number": 182, "l1_block_number": 20973702, - "mana_spent": 109199638, - "size_in_fields": 3450, + "mana_spent": 38964678, + "size_in_fields": 1365, "slot_number": 182, "timestamp": 1729028375 }, "fee_header": { - "eth_per_fee_asset": 10412588, - "excess_mana": 1314246613, - "mana_used": 109199638 + "eth_per_fee_asset": 10705156, + "excess_mana": 1026993672, + "mana_used": 38964678 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 5 }, "outputs": { - "eth_per_fee_asset_at_execution": 10309494, + "eth_per_fee_asset_at_execution": 10699807, "l1_fee_oracle_output": { "base_fee": 16561448467, "blob_fee": 40153 @@ -21818,22 +21818,22 @@ "slot_of_change": 180 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83416777680845, - "congestion_multiplier": 4653727626, - "prover_cost": 18011299487638, - "sequencer_cost": 4819296077965 + "congestion_cost": 100607952554659, + "congestion_multiplier": 4963495005, + "prover_cost": 19192318515652, + "sequencer_cost": 6191327095900 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 859984769, - "congestion_multiplier": 4653727626, - "prover_cost": 185687384, - "sequencer_cost": 49684504 + "congestion_cost": 1076485675, + "congestion_multiplier": 4963495005, + "prover_cost": 205354104, + "sequencer_cost": 66246005 } }, "parent_fee_header": { - "eth_per_fee_asset": 10309494, - "excess_mana": 1331394958, - "mana_used": 82851655 + "eth_per_fee_asset": 10699807, + "excess_mana": 1031415699, + "mana_used": 70577973 } }, { @@ -21841,21 +21841,21 @@ "blobs_needed": 1, "block_number": 183, "l1_block_number": 20973705, - "mana_spent": 97231378, - "size_in_fields": 3420, + "mana_spent": 110503744, + "size_in_fields": 3690, "slot_number": 183, "timestamp": 1729028411 }, "fee_header": { - "eth_per_fee_asset": 10364690, - "excess_mana": 1323446251, - "mana_used": 97231378 + "eth_per_fee_asset": 10767245, + "excess_mana": 990958350, + "mana_used": 110503744 }, "oracle_input": { - "fee_asset_price_modifier": -46 + "fee_asset_price_modifier": 58 }, "outputs": { - "eth_per_fee_asset_at_execution": 10412588, + "eth_per_fee_asset_at_execution": 10705156, "l1_fee_oracle_output": { "base_fee": 16561448467, "blob_fee": 40153 @@ -21872,22 +21872,22 @@ "slot_of_change": 185 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83729271051539, - "congestion_multiplier": 4704088926, - "prover_cost": 17832971399618, - "sequencer_cost": 4771580705969 + "congestion_cost": 93673889852703, + "congestion_multiplier": 4692169373, + "prover_cost": 19182728771071, + "sequencer_cost": 6188233501689 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 871838403, - "congestion_multiplier": 4704088926, - "prover_cost": 185687384, - "sequencer_cost": 49684504 + "congestion_cost": 1002793604, + "congestion_multiplier": 4692169373, + "prover_cost": 205354104, + "sequencer_cost": 66246005 } }, "parent_fee_header": { - "eth_per_fee_asset": 10412588, - "excess_mana": 1314246613, - "mana_used": 109199638 + "eth_per_fee_asset": 10705156, + "excess_mana": 1026993672, + "mana_used": 38964678 } }, { @@ -21895,21 +21895,21 @@ "blobs_needed": 1, "block_number": 184, "l1_block_number": 20973708, - "mana_spent": 99252071, - "size_in_fields": 3675, + "mana_spent": 74710212, + "size_in_fields": 2550, "slot_number": 184, "timestamp": 1729028447 }, "fee_header": { - "eth_per_fee_asset": 10406148, - "excess_mana": 1320677629, - "mana_used": 99252071 + "eth_per_fee_asset": 10792009, + "excess_mana": 1026462094, + "mana_used": 74710212 }, "oracle_input": { - "fee_asset_price_modifier": 40 + "fee_asset_price_modifier": 23 }, "outputs": { - "eth_per_fee_asset_at_execution": 10364690, + "eth_per_fee_asset_at_execution": 10767245, "l1_fee_oracle_output": { "base_fee": 16561448467, "blob_fee": 40153 @@ -21926,22 +21926,22 @@ "slot_of_change": 185 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 83770728598733, - "congestion_multiplier": 4688875682, - "prover_cost": 17915382322096, - "sequencer_cost": 4793631454487 + "congestion_cost": 99874036673263, + "congestion_multiplier": 4959380675, + "prover_cost": 19072112132677, + "sequencer_cost": 6152549236133 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 868257633, - "congestion_multiplier": 4688875682, - "prover_cost": 185687384, - "sequencer_cost": 49684504 + "congestion_cost": 1075368222, + "congestion_multiplier": 4959380675, + "prover_cost": 205354104, + "sequencer_cost": 66246005 } }, "parent_fee_header": { - "eth_per_fee_asset": 10364690, - "excess_mana": 1323446251, - "mana_used": 97231378 + "eth_per_fee_asset": 10767245, + "excess_mana": 990958350, + "mana_used": 110503744 } }, { @@ -21949,21 +21949,21 @@ "blobs_needed": 1, "block_number": 185, "l1_block_number": 20973711, - "mana_spent": 93639867, - "size_in_fields": 3345, + "mana_spent": 75230829, + "size_in_fields": 2655, "slot_number": 185, "timestamp": 1729028483 }, "fee_header": { - "eth_per_fee_asset": 10388457, - "excess_mana": 1319929700, - "mana_used": 93639867 + "eth_per_fee_asset": 10799563, + "excess_mana": 1026172306, + "mana_used": 75230829 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 10406148, + "eth_per_fee_asset_at_execution": 10792009, "l1_fee_oracle_output": { "base_fee": 12112045867, "blob_fee": 31726 @@ -21980,22 +21980,22 @@ "slot_of_change": 185 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 78125314861946, - "congestion_multiplier": 4684774350, - "prover_cost": 17710390626772, - "sequencer_cost": 3491807247024 + "congestion_cost": 90615313608431, + "congestion_multiplier": 4957139198, + "prover_cost": 18409917930944, + "sequencer_cost": 4489279984849 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 812983589, - "congestion_multiplier": 4684774350, - "prover_cost": 184296946, - "sequencer_cost": 36336263 + "congestion_cost": 977921280, + "congestion_multiplier": 4957139198, + "prover_cost": 198680000, + "sequencer_cost": 48448350 } }, "parent_fee_header": { - "eth_per_fee_asset": 10406148, - "excess_mana": 1320677629, - "mana_used": 99252071 + "eth_per_fee_asset": 10792009, + "excess_mana": 1026462094, + "mana_used": 74710212 } }, { @@ -22003,21 +22003,21 @@ "blobs_needed": 1, "block_number": 186, "l1_block_number": 20973714, - "mana_spent": 98461095, - "size_in_fields": 3675, + "mana_spent": 74254804, + "size_in_fields": 2415, "slot_number": 186, "timestamp": 1729028519 }, "fee_header": { - "eth_per_fee_asset": 10375990, - "excess_mana": 1313569567, - "mana_used": 98461095 + "eth_per_fee_asset": 10768244, + "excess_mana": 1026403135, + "mana_used": 74254804 }, "oracle_input": { - "fee_asset_price_modifier": -12 + "fee_asset_price_modifier": -29 }, "outputs": { - "eth_per_fee_asset_at_execution": 10388457, + "eth_per_fee_asset_at_execution": 10799563, "l1_fee_oracle_output": { "base_fee": 12112045867, "blob_fee": 31726 @@ -22034,22 +22034,22 @@ "slot_of_change": 185 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77520716021639, - "congestion_multiplier": 4650042664, - "prover_cost": 17740550497538, - "sequencer_cost": 3497753612496 + "congestion_cost": 90592785282146, + "congestion_multiplier": 4958924552, + "prover_cost": 18397040695073, + "sequencer_cost": 4486139855845 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 805320625, - "congestion_multiplier": 4650042664, - "prover_cost": 184296946, - "sequencer_cost": 36336263 + "congestion_cost": 978362492, + "congestion_multiplier": 4958924552, + "prover_cost": 198680000, + "sequencer_cost": 48448350 } }, "parent_fee_header": { - "eth_per_fee_asset": 10388457, - "excess_mana": 1319929700, - "mana_used": 93639867 + "eth_per_fee_asset": 10799563, + "excess_mana": 1026172306, + "mana_used": 75230829 } }, { @@ -22057,21 +22057,21 @@ "blobs_needed": 1, "block_number": 187, "l1_block_number": 20973717, - "mana_spent": 117980035, - "size_in_fields": 4020, + "mana_spent": 81794245, + "size_in_fields": 2655, "slot_number": 187, "timestamp": 1729028555 }, "fee_header": { - "eth_per_fee_asset": 10335523, - "excess_mana": 1312030662, - "mana_used": 117980035 + "eth_per_fee_asset": 10681021, + "excess_mana": 1025657939, + "mana_used": 81794245 }, "oracle_input": { - "fee_asset_price_modifier": -39 + "fee_asset_price_modifier": -81 }, "outputs": { - "eth_per_fee_asset_at_execution": 10375990, + "eth_per_fee_asset_at_execution": 10768244, "l1_fee_oracle_output": { "base_fee": 12112045867, "blob_fee": 31726 @@ -22088,22 +22088,22 @@ "slot_of_change": 185 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77435988084029, - "congestion_multiplier": 4641677707, - "prover_cost": 17761866193010, - "sequencer_cost": 3501956247067 + "congestion_cost": 90724047393429, + "congestion_multiplier": 4953163123, + "prover_cost": 18450547740189, + "sequencer_cost": 4499187611277 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 803475038, - "congestion_multiplier": 4641677707, - "prover_cost": 184296946, - "sequencer_cost": 36336263 + "congestion_cost": 976938679, + "congestion_multiplier": 4953163123, + "prover_cost": 198680000, + "sequencer_cost": 48448350 } }, "parent_fee_header": { - "eth_per_fee_asset": 10375990, - "excess_mana": 1313569567, - "mana_used": 98461095 + "eth_per_fee_asset": 10768244, + "excess_mana": 1026403135, + "mana_used": 74254804 } }, { @@ -22111,21 +22111,21 @@ "blobs_needed": 1, "block_number": 188, "l1_block_number": 20973720, - "mana_spent": 97523911, - "size_in_fields": 3375, + "mana_spent": 74235141, + "size_in_fields": 2490, "slot_number": 188, "timestamp": 1729028591 }, "fee_header": { - "eth_per_fee_asset": 10353093, - "excess_mana": 1330010697, - "mana_used": 97523911 + "eth_per_fee_asset": 10732289, + "excess_mana": 1032452184, + "mana_used": 74235141 }, "oracle_input": { - "fee_asset_price_modifier": 17 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 10335523, + "eth_per_fee_asset_at_execution": 10681021, "l1_fee_oracle_output": { "base_fee": 12112045867, "blob_fee": 31726 @@ -22142,22 +22142,22 @@ "slot_of_change": 190 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 79845697019880, - "congestion_multiplier": 4740357319, - "prover_cost": 17831409789326, - "sequencer_cost": 3515667567089 + "congestion_cost": 92686044901513, + "congestion_multiplier": 5005941012, + "prover_cost": 18601217992176, + "sequencer_cost": 4535928728162 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 825247038, - "congestion_multiplier": 4740357319, - "prover_cost": 184296946, - "sequencer_cost": 36336263 + "congestion_cost": 989981592, + "congestion_multiplier": 5005941012, + "prover_cost": 198680000, + "sequencer_cost": 48448350 } }, "parent_fee_header": { - "eth_per_fee_asset": 10335523, - "excess_mana": 1312030662, - "mana_used": 117980035 + "eth_per_fee_asset": 10681021, + "excess_mana": 1025657939, + "mana_used": 81794245 } }, { @@ -22165,21 +22165,21 @@ "blobs_needed": 1, "block_number": 189, "l1_block_number": 20973723, - "mana_spent": 88004821, - "size_in_fields": 3135, + "mana_spent": 62205565, + "size_in_fields": 2370, "slot_number": 189, "timestamp": 1729028627 }, "fee_header": { - "eth_per_fee_asset": 10345845, - "excess_mana": 1327534608, - "mana_used": 88004821 + "eth_per_fee_asset": 10663602, + "excess_mana": 1031687325, + "mana_used": 62205565 }, "oracle_input": { - "fee_asset_price_modifier": -7 + "fee_asset_price_modifier": -64 }, "outputs": { - "eth_per_fee_asset_at_execution": 10353093, + "eth_per_fee_asset_at_execution": 10732289, "l1_fee_oracle_output": { "base_fee": 12112045867, "blob_fee": 31726 @@ -22196,22 +22196,22 @@ "slot_of_change": 190 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 79417955774183, - "congestion_multiplier": 4726644263, - "prover_cost": 17801148507022, - "sequencer_cost": 3509701207166 + "congestion_cost": 92105829147911, + "congestion_multiplier": 4999971585, + "prover_cost": 18512360224366, + "sequencer_cost": 4514260657722 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 822221482, - "congestion_multiplier": 4726644263, - "prover_cost": 184296946, - "sequencer_cost": 36336263 + "congestion_cost": 988506377, + "congestion_multiplier": 4999971585, + "prover_cost": 198680000, + "sequencer_cost": 48448350 } }, "parent_fee_header": { - "eth_per_fee_asset": 10353093, - "excess_mana": 1330010697, - "mana_used": 97523911 + "eth_per_fee_asset": 10732289, + "excess_mana": 1032452184, + "mana_used": 74235141 } }, { @@ -22219,21 +22219,21 @@ "blobs_needed": 1, "block_number": 190, "l1_block_number": 20973726, - "mana_spent": 107009505, - "size_in_fields": 3915, + "mana_spent": 91874044, + "size_in_fields": 3045, "slot_number": 190, "timestamp": 1729028663 }, "fee_header": { - "eth_per_fee_asset": 10418265, - "excess_mana": 1315539429, - "mana_used": 107009505 + "eth_per_fee_asset": 10714787, + "excess_mana": 1018892890, + "mana_used": 91874044 }, "oracle_input": { - "fee_asset_price_modifier": 70 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 10345845, + "eth_per_fee_asset_at_execution": 10663602, "l1_fee_oracle_output": { "base_fee": 11407648995, "blob_fee": 17605 @@ -22250,22 +22250,22 @@ "slot_of_change": 190 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77243180426539, - "congestion_multiplier": 4660772156, - "prover_cost": 17792342916408, - "sequencer_cost": 3307899644737 + "congestion_cost": 88991912113750, + "congestion_multiplier": 4901164896, + "prover_cost": 18532518843071, + "sequencer_cost": 4279106534547 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799145972, - "congestion_multiplier": 4660772156, - "prover_cost": 184076822, - "sequencer_cost": 34223017 + "congestion_cost": 948974332, + "congestion_multiplier": 4901164896, + "prover_cost": 197623405, + "sequencer_cost": 45630689 } }, "parent_fee_header": { - "eth_per_fee_asset": 10345845, - "excess_mana": 1327534608, - "mana_used": 88004821 + "eth_per_fee_asset": 10663602, + "excess_mana": 1031687325, + "mana_used": 62205565 } }, { @@ -22273,21 +22273,21 @@ "blobs_needed": 1, "block_number": 191, "l1_block_number": 20973729, - "mana_spent": 104578012, - "size_in_fields": 3240, + "mana_spent": 73892896, + "size_in_fields": 2505, "slot_number": 191, "timestamp": 1729028699 }, "fee_header": { - "eth_per_fee_asset": 10444310, - "excess_mana": 1322548934, - "mana_used": 104578012 + "eth_per_fee_asset": 10804791, + "excess_mana": 1035766934, + "mana_used": 73892896 }, "oracle_input": { - "fee_asset_price_modifier": 25 + "fee_asset_price_modifier": 84 }, "outputs": { - "eth_per_fee_asset_at_execution": 10418265, + "eth_per_fee_asset_at_execution": 10714787, "l1_fee_oracle_output": { "base_fee": 11407648995, "blob_fee": 17605 @@ -22304,22 +22304,22 @@ "slot_of_change": 190 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77510456587542, - "congestion_multiplier": 4699152879, - "prover_cost": 17668663832222, - "sequencer_cost": 3284905596086 + "congestion_cost": 91534687437091, + "congestion_multiplier": 5031893827, + "prover_cost": 18443988200606, + "sequencer_cost": 4258665057925 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 807524477, - "congestion_multiplier": 4699152879, - "prover_cost": 184076822, - "sequencer_cost": 34223017 + "congestion_cost": 980774679, + "congestion_multiplier": 5031893827, + "prover_cost": 197623405, + "sequencer_cost": 45630689 } }, "parent_fee_header": { - "eth_per_fee_asset": 10418265, - "excess_mana": 1315539429, - "mana_used": 107009505 + "eth_per_fee_asset": 10714787, + "excess_mana": 1018892890, + "mana_used": 91874044 } }, { @@ -22327,21 +22327,21 @@ "blobs_needed": 1, "block_number": 192, "l1_block_number": 20973732, - "mana_spent": 102071653, - "size_in_fields": 3570, + "mana_spent": 67788644, + "size_in_fields": 2415, "slot_number": 192, "timestamp": 1729028735 }, "fee_header": { - "eth_per_fee_asset": 10491309, - "excess_mana": 1327126946, - "mana_used": 102071653 + "eth_per_fee_asset": 10835044, + "excess_mana": 1034659830, + "mana_used": 67788644 }, "oracle_input": { - "fee_asset_price_modifier": 45 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 10444310, + "eth_per_fee_asset_at_execution": 10804791, "l1_fee_oracle_output": { "base_fee": 11407648995, "blob_fee": 17605 @@ -22358,22 +22358,22 @@ "slot_of_change": 190 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77844665181329, - "congestion_multiplier": 4724390359, - "prover_cost": 17624603444364, - "sequencer_cost": 3276714019404 + "congestion_cost": 90576717772700, + "congestion_multiplier": 5023210832, + "prover_cost": 18290349623607, + "sequencer_cost": 4223190342137 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 813033815, - "congestion_multiplier": 4724390359, - "prover_cost": 184076822, - "sequencer_cost": 34223017 + "congestion_cost": 978662505, + "congestion_multiplier": 5023210832, + "prover_cost": 197623405, + "sequencer_cost": 45630689 } }, "parent_fee_header": { - "eth_per_fee_asset": 10444310, - "excess_mana": 1322548934, - "mana_used": 104578012 + "eth_per_fee_asset": 10804791, + "excess_mana": 1035766934, + "mana_used": 73892896 } }, { @@ -22381,21 +22381,21 @@ "blobs_needed": 1, "block_number": 193, "l1_block_number": 20973735, - "mana_spent": 91044804, - "size_in_fields": 3330, + "mana_spent": 75793284, + "size_in_fields": 2625, "slot_number": 193, "timestamp": 1729028771 }, "fee_header": { - "eth_per_fee_asset": 10491309, - "excess_mana": 1329198599, - "mana_used": 91044804 + "eth_per_fee_asset": 10861048, + "excess_mana": 1027448474, + "mana_used": 75793284 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 10491309, + "eth_per_fee_asset_at_execution": 10835044, "l1_fee_oracle_output": { "base_fee": 11407648995, "blob_fee": 17605 @@ -22412,22 +22412,22 @@ "slot_of_change": 195 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77734497096597, - "congestion_multiplier": 4735855386, - "prover_cost": 17545648688834, - "sequencer_cost": 3262034985339 + "congestion_cost": 89062243125178, + "congestion_multiplier": 4967017811, + "prover_cost": 18239280338871, + "sequencer_cost": 4211398587768 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815536629, - "congestion_multiplier": 4735855386, - "prover_cost": 184076822, - "sequencer_cost": 34223017 + "congestion_cost": 964993323, + "congestion_multiplier": 4967017811, + "prover_cost": 197623405, + "sequencer_cost": 45630689 } }, "parent_fee_header": { - "eth_per_fee_asset": 10491309, - "excess_mana": 1327126946, - "mana_used": 102071653 + "eth_per_fee_asset": 10835044, + "excess_mana": 1034659830, + "mana_used": 67788644 } }, { @@ -22435,21 +22435,21 @@ "blobs_needed": 1, "block_number": 194, "l1_block_number": 20973738, - "mana_spent": 98612788, - "size_in_fields": 3420, + "mana_spent": 80880266, + "size_in_fields": 2685, "slot_number": 194, "timestamp": 1729028807 }, "fee_header": { - "eth_per_fee_asset": 10561600, - "excess_mana": 1320243403, - "mana_used": 98612788 + "eth_per_fee_asset": 10891458, + "excess_mana": 1028241758, + "mana_used": 80880266 }, "oracle_input": { - "fee_asset_price_modifier": 67 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 10491309, + "eth_per_fee_asset_at_execution": 10861048, "l1_fee_oracle_output": { "base_fee": 11407648995, "blob_fee": 17605 @@ -22466,22 +22466,22 @@ "slot_of_change": 195 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76707403718640, - "congestion_multiplier": 4686494130, - "prover_cost": 17545648688834, - "sequencer_cost": 3262034985339 + "congestion_cost": 88986761038162, + "congestion_multiplier": 4973168415, + "prover_cost": 18195611049689, + "sequencer_cost": 4201315471583 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804761075, - "congestion_multiplier": 4686494130, - "prover_cost": 184076822, - "sequencer_cost": 34223017 + "congestion_cost": 966489483, + "congestion_multiplier": 4973168415, + "prover_cost": 197623405, + "sequencer_cost": 45630689 } }, "parent_fee_header": { - "eth_per_fee_asset": 10491309, - "excess_mana": 1329198599, - "mana_used": 91044804 + "eth_per_fee_asset": 10861048, + "excess_mana": 1027448474, + "mana_used": 75793284 } }, { @@ -22489,21 +22489,21 @@ "blobs_needed": 1, "block_number": 195, "l1_block_number": 20973741, - "mana_spent": 96819250, - "size_in_fields": 3420, + "mana_spent": 66423741, + "size_in_fields": 2415, "slot_number": 195, "timestamp": 1729028843 }, "fee_header": { - "eth_per_fee_asset": 10580610, - "excess_mana": 1318856191, - "mana_used": 96819250 + "eth_per_fee_asset": 10833733, + "excess_mana": 1034122024, + "mana_used": 66423741 }, "oracle_input": { - "fee_asset_price_modifier": 18 + "fee_asset_price_modifier": -53 }, "outputs": { - "eth_per_fee_asset_at_execution": 10561600, + "eth_per_fee_asset_at_execution": 10891458, "l1_fee_oracle_output": { "base_fee": 11817845341, "blob_fee": 24102 @@ -22520,22 +22520,22 @@ "slot_of_change": 195 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76513107483715, - "congestion_multiplier": 4678893941, - "prover_cost": 17441013482806, - "sequencer_cost": 3356842807908 + "congestion_cost": 90594399115344, + "congestion_multiplier": 5018998240, + "prover_cost": 18201300505406, + "sequencer_cost": 4340236908594 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 808100836, - "congestion_multiplier": 4678893941, - "prover_cost": 184205008, - "sequencer_cost": 35453631 + "congestion_cost": 986705093, + "congestion_multiplier": 5018998240, + "prover_cost": 198238700, + "sequencer_cost": 47271508 } }, "parent_fee_header": { - "eth_per_fee_asset": 10561600, - "excess_mana": 1320243403, - "mana_used": 98612788 + "eth_per_fee_asset": 10891458, + "excess_mana": 1028241758, + "mana_used": 80880266 } }, { @@ -22543,21 +22543,21 @@ "blobs_needed": 1, "block_number": 196, "l1_block_number": 20973744, - "mana_spent": 84835756, - "size_in_fields": 3135, + "mana_spent": 72827248, + "size_in_fields": 2775, "slot_number": 196, "timestamp": 1729028879 }, "fee_header": { - "eth_per_fee_asset": 10506545, - "excess_mana": 1315675441, - "mana_used": 84835756 + "eth_per_fee_asset": 10789314, + "excess_mana": 1025545765, + "mana_used": 72827248 }, "oracle_input": { - "fee_asset_price_modifier": -70 + "fee_asset_price_modifier": -41 }, "outputs": { - "eth_per_fee_asset_at_execution": 10580610, + "eth_per_fee_asset_at_execution": 10833733, "l1_fee_oracle_output": { "base_fee": 11817845341, "blob_fee": 24102 @@ -22574,22 +22574,22 @@ "slot_of_change": 195 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76014819561444, - "congestion_multiplier": 4661513902, - "prover_cost": 17409677513868, - "sequencer_cost": 3350811626173 + "congestion_cost": 89565537566784, + "congestion_multiplier": 4952296438, + "prover_cost": 18298281857233, + "sequencer_cost": 4363362840861 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804283160, - "congestion_multiplier": 4661513902, - "prover_cost": 184205008, - "sequencer_cost": 35453631 + "congestion_cost": 970329120, + "congestion_multiplier": 4952296438, + "prover_cost": 198238700, + "sequencer_cost": 47271508 } }, "parent_fee_header": { - "eth_per_fee_asset": 10580610, - "excess_mana": 1318856191, - "mana_used": 96819250 + "eth_per_fee_asset": 10833733, + "excess_mana": 1034122024, + "mana_used": 66423741 } }, { @@ -22597,21 +22597,21 @@ "blobs_needed": 1, "block_number": 197, "l1_block_number": 20973747, - "mana_spent": 111017109, - "size_in_fields": 3945, + "mana_spent": 76621443, + "size_in_fields": 2745, "slot_number": 197, "timestamp": 1729028915 }, "fee_header": { - "eth_per_fee_asset": 10459265, - "excess_mana": 1300511197, - "mana_used": 111017109 + "eth_per_fee_asset": 10681420, + "excess_mana": 1023373013, + "mana_used": 76621443 }, "oracle_input": { - "fee_asset_price_modifier": -45 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10506545, + "eth_per_fee_asset_at_execution": 10789314, "l1_fee_oracle_output": { "base_fee": 11817845341, "blob_fee": 24102 @@ -22628,22 +22628,22 @@ "slot_of_change": 195 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74836820953035, - "congestion_multiplier": 4579537917, - "prover_cost": 17532405562438, - "sequencer_cost": 3374432889214 + "congestion_cost": 89552961105776, + "congestion_multiplier": 4935539079, + "prover_cost": 18373614856330, + "sequencer_cost": 4381326560707 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786276427, - "congestion_multiplier": 4579537917, - "prover_cost": 184205008, - "sequencer_cost": 35453631 + "congestion_cost": 966215017, + "congestion_multiplier": 4935539079, + "prover_cost": 198238700, + "sequencer_cost": 47271508 } }, "parent_fee_header": { - "eth_per_fee_asset": 10506545, - "excess_mana": 1315675441, - "mana_used": 84835756 + "eth_per_fee_asset": 10789314, + "excess_mana": 1025545765, + "mana_used": 72827248 } }, { @@ -22651,21 +22651,21 @@ "blobs_needed": 1, "block_number": 198, "l1_block_number": 20973750, - "mana_spent": 118858647, - "size_in_fields": 3870, + "mana_spent": 81818315, + "size_in_fields": 2595, "slot_number": 198, "timestamp": 1729028951 }, "fee_header": { - "eth_per_fee_asset": 10532479, - "excess_mana": 1311528306, - "mana_used": 118858647 + "eth_per_fee_asset": 10740167, + "excess_mana": 1024994456, + "mana_used": 81818315 }, "oracle_input": { - "fee_asset_price_modifier": 70 + "fee_asset_price_modifier": 55 }, "outputs": { - "eth_per_fee_asset_at_execution": 10459265, + "eth_per_fee_asset_at_execution": 10681420, "l1_fee_oracle_output": { "base_fee": 11817845341, "blob_fee": 24102 @@ -22682,22 +22682,22 @@ "slot_of_change": 200 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76422853517910, - "congestion_multiplier": 4638950332, - "prover_cost": 17611658945443, - "sequencer_cost": 3389686655803 + "congestion_cost": 90744853867745, + "congestion_multiplier": 4948039086, + "prover_cost": 18559208419855, + "sequencer_cost": 4425582740872 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799326877, - "congestion_multiplier": 4638950332, - "prover_cost": 184205008, - "sequencer_cost": 35453631 + "congestion_cost": 969283897, + "congestion_multiplier": 4948039086, + "prover_cost": 198238700, + "sequencer_cost": 47271508 } }, "parent_fee_header": { - "eth_per_fee_asset": 10459265, - "excess_mana": 1300511197, - "mana_used": 111017109 + "eth_per_fee_asset": 10681420, + "excess_mana": 1023373013, + "mana_used": 76621443 } }, { @@ -22705,21 +22705,21 @@ "blobs_needed": 1, "block_number": 199, "l1_block_number": 20973753, - "mana_spent": 6855161, - "size_in_fields": 255, + "mana_spent": 73842130, + "size_in_fields": 2550, "slot_number": 199, "timestamp": 1729028987 }, "fee_header": { - "eth_per_fee_asset": 10521946, - "excess_mana": 1330386953, - "mana_used": 6855161 + "eth_per_fee_asset": 10764869, + "excess_mana": 1031812771, + "mana_used": 73842130 }, "oracle_input": { - "fee_asset_price_modifier": -10 + "fee_asset_price_modifier": 23 }, "outputs": { - "eth_per_fee_asset_at_execution": 10532479, + "eth_per_fee_asset_at_execution": 10740167, "l1_fee_oracle_output": { "base_fee": 11817845341, "blob_fee": 24102 @@ -22736,44 +22736,44 @@ "slot_of_change": 200 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 78050028108293, - "congestion_multiplier": 4742444576, - "prover_cost": 17489235725037, - "sequencer_cost": 3366124062531 + "congestion_cost": 91457991668100, + "congestion_multiplier": 5000950154, + "prover_cost": 18457692510741, + "sequencer_cost": 4401375509338 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 822060282, - "congestion_multiplier": 4742444576, - "prover_cost": 184205008, - "sequencer_cost": 35453631 + "congestion_cost": 982274104, + "congestion_multiplier": 5000950154, + "prover_cost": 198238700, + "sequencer_cost": 47271508 } }, "parent_fee_header": { - "eth_per_fee_asset": 10532479, - "excess_mana": 1311528306, - "mana_used": 118858647 + "eth_per_fee_asset": 10740167, + "excess_mana": 1024994456, + "mana_used": 81818315 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 200, "l1_block_number": 20973756, - "mana_spent": 169040987, - "size_in_fields": 5730, + "mana_spent": 74000455, + "size_in_fields": 2550, "slot_number": 200, "timestamp": 1729029023 }, "fee_header": { - "eth_per_fee_asset": 10518789, - "excess_mana": 1237242114, - "mana_used": 169040987 + "eth_per_fee_asset": 10740109, + "excess_mana": 1030654901, + "mana_used": 74000455 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": -23 }, "outputs": { - "eth_per_fee_asset_at_execution": 10521946, + "eth_per_fee_asset_at_execution": 10764869, "l1_fee_oracle_output": { "base_fee": 11117325520, "blob_fee": 32996 @@ -22790,22 +22790,22 @@ "slot_of_change": 200 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67188495170000, - "congestion_multiplier": 4252781649, - "prover_cost": 17485938057466, - "sequencer_cost": 3169766029973 + "congestion_cost": 89613561484121, + "congestion_multiplier": 4991925205, + "prover_cost": 18317725928667, + "sequencer_cost": 4130981621793 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 706953718, - "congestion_multiplier": 4252781649, - "prover_cost": 183986096, - "sequencer_cost": 33352107 + "congestion_cost": 964678250, + "congestion_multiplier": 4991925205, + "prover_cost": 197187920, + "sequencer_cost": 44469476 } }, "parent_fee_header": { - "eth_per_fee_asset": 10521946, - "excess_mana": 1330386953, - "mana_used": 6855161 + "eth_per_fee_asset": 10764869, + "excess_mana": 1031812771, + "mana_used": 73842130 } }, { @@ -22813,21 +22813,21 @@ "blobs_needed": 1, "block_number": 201, "l1_block_number": 20973759, - "mana_spent": 121107584, - "size_in_fields": 4080, + "mana_spent": 62642541, + "size_in_fields": 2010, "slot_number": 201, "timestamp": 1729029059 }, "fee_header": { - "eth_per_fee_asset": 10474610, - "excess_mana": 1306283101, - "mana_used": 121107584 + "eth_per_fee_asset": 10749775, + "excess_mana": 1029655356, + "mana_used": 62642541 }, "oracle_input": { - "fee_asset_price_modifier": -42 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10518789, + "eth_per_fee_asset_at_execution": 10740109, "l1_fee_oracle_output": { "base_fee": 11117325520, "blob_fee": 32996 @@ -22844,22 +22844,22 @@ "slot_of_change": 200 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74601223581917, - "congestion_multiplier": 4610568781, - "prover_cost": 17491186105169, - "sequencer_cost": 3170717370603 + "congestion_cost": 89645150528733, + "congestion_multiplier": 4984147411, + "prover_cost": 18359955192262, + "sequencer_cost": 4140505091709 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784714530, - "congestion_multiplier": 4610568781, - "prover_cost": 183986096, - "sequencer_cost": 33352107 + "congestion_cost": 962798688, + "congestion_multiplier": 4984147411, + "prover_cost": 197187920, + "sequencer_cost": 44469476 } }, "parent_fee_header": { - "eth_per_fee_asset": 10518789, - "excess_mana": 1237242114, - "mana_used": 169040987 + "eth_per_fee_asset": 10740109, + "excess_mana": 1030654901, + "mana_used": 74000455 } }, { @@ -22867,21 +22867,21 @@ "blobs_needed": 1, "block_number": 202, "l1_block_number": 20973762, - "mana_spent": 80783374, - "size_in_fields": 3195, + "mana_spent": 89908273, + "size_in_fields": 3045, "slot_number": 202, "timestamp": 1729029095 }, "fee_header": { - "eth_per_fee_asset": 10477752, - "excess_mana": 1327390685, - "mana_used": 80783374 + "eth_per_fee_asset": 10759449, + "excess_mana": 1017297897, + "mana_used": 89908273 }, "oracle_input": { - "fee_asset_price_modifier": 3 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10474610, + "eth_per_fee_asset_at_execution": 10749775, "l1_fee_oracle_output": { "base_fee": 11117325520, "blob_fee": 32996 @@ -22898,22 +22898,22 @@ "slot_of_change": 200 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77307813656070, - "congestion_multiplier": 4725848411, - "prover_cost": 17564959077236, - "sequencer_cost": 3184090577120 + "congestion_cost": 87425271226608, + "congestion_multiplier": 4888985031, + "prover_cost": 18343446258178, + "sequencer_cost": 4136782025671 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 809769198, - "congestion_multiplier": 4725848411, - "prover_cost": 183986096, - "sequencer_cost": 33352107 + "congestion_cost": 939801995, + "congestion_multiplier": 4888985031, + "prover_cost": 197187920, + "sequencer_cost": 44469476 } }, "parent_fee_header": { - "eth_per_fee_asset": 10474610, - "excess_mana": 1306283101, - "mana_used": 121107584 + "eth_per_fee_asset": 10749775, + "excess_mana": 1029655356, + "mana_used": 62642541 } }, { @@ -22921,21 +22921,21 @@ "blobs_needed": 1, "block_number": 203, "l1_block_number": 20973765, - "mana_spent": 126658874, - "size_in_fields": 4095, + "mana_spent": 52888123, + "size_in_fields": 2010, "slot_number": 203, "timestamp": 1729029131 }, "fee_header": { - "eth_per_fee_asset": 10499755, - "excess_mana": 1308174059, - "mana_used": 126658874 + "eth_per_fee_asset": 10783119, + "excess_mana": 1032206170, + "mana_used": 52888123 }, "oracle_input": { - "fee_asset_price_modifier": 21 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 10477752, + "eth_per_fee_asset_at_execution": 10759449, "l1_fee_oracle_output": { "base_fee": 11117325520, "blob_fee": 32996 @@ -22952,22 +22952,22 @@ "slot_of_change": 205 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75105227438100, - "congestion_multiplier": 4620780592, - "prover_cost": 17559691811756, - "sequencer_cost": 3183135752784 + "congestion_cost": 89930357307331, + "congestion_multiplier": 5004020192, + "prover_cost": 18326953359787, + "sequencer_cost": 4133062575974 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786933947, - "congestion_multiplier": 4620780592, - "prover_cost": 183986096, - "sequencer_cost": 33352107 + "congestion_cost": 967601093, + "congestion_multiplier": 5004020192, + "prover_cost": 197187920, + "sequencer_cost": 44469476 } }, "parent_fee_header": { - "eth_per_fee_asset": 10477752, - "excess_mana": 1327390685, - "mana_used": 80783374 + "eth_per_fee_asset": 10759449, + "excess_mana": 1017297897, + "mana_used": 89908273 } }, { @@ -22975,21 +22975,21 @@ "blobs_needed": 1, "block_number": 204, "l1_block_number": 20973768, - "mana_spent": 97586219, - "size_in_fields": 3390, + "mana_spent": 83144250, + "size_in_fields": 2925, "slot_number": 204, "timestamp": 1729029167 }, "fee_header": { - "eth_per_fee_asset": 10545953, - "excess_mana": 1334832933, - "mana_used": 97586219 + "eth_per_fee_asset": 10839191, + "excess_mana": 1010094293, + "mana_used": 83144250 }, "oracle_input": { - "fee_asset_price_modifier": 44 + "fee_asset_price_modifier": 52 }, "outputs": { - "eth_per_fee_asset_at_execution": 10499755, + "eth_per_fee_asset_at_execution": 10783119, "l1_fee_oracle_output": { "base_fee": 11117325520, "blob_fee": 32996 @@ -23006,22 +23006,22 @@ "slot_of_change": 205 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77978173204994, - "congestion_multiplier": 4767178082, - "prover_cost": 17522894200865, - "sequencer_cost": 3176465260380 + "congestion_cost": 85930566286063, + "congestion_multiplier": 4834352011, + "prover_cost": 18286723906136, + "sequencer_cost": 4123990099711 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 818751714, - "congestion_multiplier": 4767178082, - "prover_cost": 183986096, - "sequencer_cost": 33352107 + "congestion_cost": 926599522, + "congestion_multiplier": 4834352011, + "prover_cost": 197187920, + "sequencer_cost": 44469476 } }, "parent_fee_header": { - "eth_per_fee_asset": 10499755, - "excess_mana": 1308174059, - "mana_used": 126658874 + "eth_per_fee_asset": 10783119, + "excess_mana": 1032206170, + "mana_used": 52888123 } }, { @@ -23029,21 +23029,21 @@ "blobs_needed": 1, "block_number": 205, "l1_block_number": 20973771, - "mana_spent": 110244364, - "size_in_fields": 3600, + "mana_spent": 82333877, + "size_in_fields": 3015, "slot_number": 205, "timestamp": 1729029203 }, "fee_header": { - "eth_per_fee_asset": 10580754, - "excess_mana": 1332419152, - "mana_used": 110244364 + "eth_per_fee_asset": 10819680, + "excess_mana": 1018238543, + "mana_used": 82333877 }, "oracle_input": { - "fee_asset_price_modifier": 33 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 10545953, + "eth_per_fee_asset_at_execution": 10839191, "l1_fee_oracle_output": { "base_fee": 10898681793, "blob_fee": 19806 @@ -23060,22 +23060,22 @@ "slot_of_change": 205 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77101702710035, - "congestion_multiplier": 4753733974, - "prover_cost": 17439653865327, - "sequencer_cost": 3100347972346 + "congestion_cost": 86431854923491, + "congestion_multiplier": 4896164432, + "prover_cost": 18161867799913, + "sequencer_cost": 4021963631788 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 813110933, - "congestion_multiplier": 4753733974, - "prover_cost": 183917770, - "sequencer_cost": 32696124 + "congestion_cost": 936851384, + "congestion_multiplier": 4896164432, + "prover_cost": 196859954, + "sequencer_cost": 43594832 } }, "parent_fee_header": { - "eth_per_fee_asset": 10545953, - "excess_mana": 1334832933, - "mana_used": 97586219 + "eth_per_fee_asset": 10839191, + "excess_mana": 1010094293, + "mana_used": 83144250 } }, { @@ -23083,21 +23083,21 @@ "blobs_needed": 1, "block_number": 206, "l1_block_number": 20973774, - "mana_spent": 91342152, - "size_in_fields": 3165, + "mana_spent": 75994985, + "size_in_fields": 2715, "slot_number": 206, "timestamp": 1729029239 }, "fee_header": { - "eth_per_fee_asset": 10540547, - "excess_mana": 1342663516, - "mana_used": 91342152 + "eth_per_fee_asset": 10778565, + "excess_mana": 1025572420, + "mana_used": 75994985 }, "oracle_input": { "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 10580754, + "eth_per_fee_asset_at_execution": 10819680, "l1_fee_oracle_output": { "base_fee": 10898681793, "blob_fee": 19806 @@ -23114,22 +23114,22 @@ "slot_of_change": 205 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 78021602241202, - "congestion_multiplier": 4811054616, - "prover_cost": 17382293360190, - "sequencer_cost": 3090150664121 + "congestion_cost": 87839761527144, + "congestion_multiplier": 4952502368, + "prover_cost": 18194618879672, + "sequencer_cost": 4029216390873 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 825527380, - "congestion_multiplier": 4811054616, - "prover_cost": 183917770, - "sequencer_cost": 32696124 + "congestion_cost": 950398111, + "congestion_multiplier": 4952502368, + "prover_cost": 196859954, + "sequencer_cost": 43594832 } }, "parent_fee_header": { - "eth_per_fee_asset": 10580754, - "excess_mana": 1332419152, - "mana_used": 110244364 + "eth_per_fee_asset": 10819680, + "excess_mana": 1018238543, + "mana_used": 82333877 } }, { @@ -23137,21 +23137,21 @@ "blobs_needed": 1, "block_number": 207, "l1_block_number": 20973777, - "mana_spent": 89945856, - "size_in_fields": 3285, + "mana_spent": 86905860, + "size_in_fields": 2910, "slot_number": 207, "timestamp": 1729029275 }, "fee_header": { - "eth_per_fee_asset": 10538438, - "excess_mana": 1334005668, - "mana_used": 89945856 + "eth_per_fee_asset": 10805511, + "excess_mana": 1026567405, + "mana_used": 86905860 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": 25 }, "outputs": { - "eth_per_fee_asset_at_execution": 10540547, + "eth_per_fee_asset_at_execution": 10778565, "l1_fee_oracle_output": { "base_fee": 10898681793, "blob_fee": 19806 @@ -23168,22 +23168,22 @@ "slot_of_change": 205 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77322752509903, - "congestion_multiplier": 4762566162, - "prover_cost": 17448598255860, - "sequencer_cost": 3101938068300 + "congestion_cost": 88346450571111, + "congestion_multiplier": 4960195495, + "prover_cost": 18264022529901, + "sequencer_cost": 4044585898031 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815024107, - "congestion_multiplier": 4762566162, - "prover_cost": 183917770, - "sequencer_cost": 32696124 + "congestion_cost": 952247960, + "congestion_multiplier": 4960195495, + "prover_cost": 196859954, + "sequencer_cost": 43594832 } }, "parent_fee_header": { - "eth_per_fee_asset": 10540547, - "excess_mana": 1342663516, - "mana_used": 91342152 + "eth_per_fee_asset": 10778565, + "excess_mana": 1025572420, + "mana_used": 75994985 } }, { @@ -23191,21 +23191,21 @@ "blobs_needed": 1, "block_number": 208, "l1_block_number": 20973780, - "mana_spent": 103215625, - "size_in_fields": 3585, + "mana_spent": 66426396, + "size_in_fields": 2340, "slot_number": 208, "timestamp": 1729029311 }, "fee_header": { - "eth_per_fee_asset": 10552137, - "excess_mana": 1323951524, - "mana_used": 103215625 + "eth_per_fee_asset": 10845491, + "excess_mana": 1038473265, + "mana_used": 66426396 }, "oracle_input": { - "fee_asset_price_modifier": 13 + "fee_asset_price_modifier": 37 }, "outputs": { - "eth_per_fee_asset_at_execution": 10538438, + "eth_per_fee_asset_at_execution": 10805511, "l1_fee_oracle_output": { "base_fee": 10898681793, "blob_fee": 19806 @@ -23222,22 +23222,22 @@ "slot_of_change": 210 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76193425249549, - "congestion_multiplier": 4706870662, - "prover_cost": 17452090148465, - "sequencer_cost": 3102558842212 + "congestion_cost": 90195382245227, + "congestion_multiplier": 5053182768, + "prover_cost": 18218477034543, + "sequencer_cost": 4034499802925 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802959688, - "congestion_multiplier": 4706870662, - "prover_cost": 183917770, - "sequencer_cost": 32696124 + "congestion_cost": 974607195, + "congestion_multiplier": 5053182768, + "prover_cost": 196859954, + "sequencer_cost": 43594832 } }, "parent_fee_header": { - "eth_per_fee_asset": 10538438, - "excess_mana": 1334005668, - "mana_used": 89945856 + "eth_per_fee_asset": 10805511, + "excess_mana": 1026567405, + "mana_used": 86905860 } }, { @@ -23245,21 +23245,21 @@ "blobs_needed": 1, "block_number": 209, "l1_block_number": 20973783, - "mana_spent": 97687931, - "size_in_fields": 3525, + "mana_spent": 66589572, + "size_in_fields": 2295, "slot_number": 209, "timestamp": 1729029347 }, "fee_header": { - "eth_per_fee_asset": 10581682, - "excess_mana": 1327167149, - "mana_used": 97687931 + "eth_per_fee_asset": 10884534, + "excess_mana": 1029899661, + "mana_used": 66589572 }, "oracle_input": { - "fee_asset_price_modifier": 28 + "fee_asset_price_modifier": 36 }, "outputs": { - "eth_per_fee_asset_at_execution": 10552137, + "eth_per_fee_asset_at_execution": 10845491, "l1_fee_oracle_output": { "base_fee": 10898681793, "blob_fee": 19806 @@ -23276,22 +23276,22 @@ "slot_of_change": 210 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76458715045114, - "congestion_multiplier": 4724612587, - "prover_cost": 17429433488212, - "sequencer_cost": 3098531036889 + "congestion_cost": 88374436159691, + "congestion_multiplier": 4986047310, + "prover_cost": 18151317814934, + "sequencer_cost": 4019627327154 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 806802836, - "congestion_multiplier": 4724612587, - "prover_cost": 183917770, - "sequencer_cost": 32696124 + "congestion_cost": 958464152, + "congestion_multiplier": 4986047310, + "prover_cost": 196859954, + "sequencer_cost": 43594832 } }, "parent_fee_header": { - "eth_per_fee_asset": 10552137, - "excess_mana": 1323951524, - "mana_used": 103215625 + "eth_per_fee_asset": 10845491, + "excess_mana": 1038473265, + "mana_used": 66426396 } }, { @@ -23299,21 +23299,21 @@ "blobs_needed": 1, "block_number": 210, "l1_block_number": 20973786, - "mana_spent": 86486686, - "size_in_fields": 3390, + "mana_spent": 79517927, + "size_in_fields": 2835, "slot_number": 210, "timestamp": 1729029383 }, "fee_header": { - "eth_per_fee_asset": 10563693, - "excess_mana": 1324855080, - "mana_used": 86486686 + "eth_per_fee_asset": 10907391, + "excess_mana": 1021489233, + "mana_used": 79517927 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": 21 }, "outputs": { - "eth_per_fee_asset_at_execution": 10581682, + "eth_per_fee_asset_at_execution": 10884534, "l1_fee_oracle_output": { "base_fee": 10041012515, "blob_fee": 14467 @@ -23330,22 +23330,22 @@ "slot_of_change": 210 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74987375163987, - "congestion_multiplier": 4711849211, - "prover_cost": 17355440089771, - "sequencer_cost": 2846720871030 + "congestion_cost": 84922359652697, + "congestion_multiplier": 4921056316, + "prover_cost": 17968013145993, + "sequencer_cost": 3690017964940 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 793492558, - "congestion_multiplier": 4711849211, - "prover_cost": 183649748, - "sequencer_cost": 30123095 + "congestion_cost": 924340311, + "congestion_multiplier": 4921056316, + "prover_cost": 195573450, + "sequencer_cost": 40164126 } }, "parent_fee_header": { - "eth_per_fee_asset": 10581682, - "excess_mana": 1327167149, - "mana_used": 97687931 + "eth_per_fee_asset": 10884534, + "excess_mana": 1029899661, + "mana_used": 66589572 } }, { @@ -23353,21 +23353,21 @@ "blobs_needed": 1, "block_number": 211, "l1_block_number": 20973789, - "mana_spent": 104136558, - "size_in_fields": 3720, + "mana_spent": 70871115, + "size_in_fields": 2400, "slot_number": 211, "timestamp": 1729029419 }, "fee_header": { - "eth_per_fee_asset": 10607004, - "excess_mana": 1311341766, - "mana_used": 104136558 + "eth_per_fee_asset": 10978289, + "excess_mana": 1026007160, + "mana_used": 70871115 }, "oracle_input": { - "fee_asset_price_modifier": 41 + "fee_asset_price_modifier": 65 }, "outputs": { - "eth_per_fee_asset_at_execution": 10563693, + "eth_per_fee_asset_at_execution": 10907391, "l1_fee_oracle_output": { "base_fee": 10041012515, "blob_fee": 14467 @@ -23384,22 +23384,22 @@ "slot_of_change": 210 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73619362565724, - "congestion_multiplier": 4637937984, - "prover_cost": 17384994811947, - "sequencer_cost": 2851568575498 + "congestion_cost": 85496649107014, + "congestion_multiplier": 4955862266, + "prover_cost": 17930360248386, + "sequencer_cost": 3682285342114 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777692345, - "congestion_multiplier": 4637937984, - "prover_cost": 183649748, - "sequencer_cost": 30123095 + "congestion_cost": 932545381, + "congestion_multiplier": 4955862266, + "prover_cost": 195573450, + "sequencer_cost": 40164126 } }, "parent_fee_header": { - "eth_per_fee_asset": 10563693, - "excess_mana": 1324855080, - "mana_used": 86486686 + "eth_per_fee_asset": 10907391, + "excess_mana": 1021489233, + "mana_used": 79517927 } }, { @@ -23407,21 +23407,21 @@ "blobs_needed": 1, "block_number": 212, "l1_block_number": 20973792, - "mana_spent": 99183639, - "size_in_fields": 3615, + "mana_spent": 80919546, + "size_in_fields": 2850, "slot_number": 212, "timestamp": 1729029455 }, "fee_header": { - "eth_per_fee_asset": 10686556, - "excess_mana": 1315478324, - "mana_used": 99183639 + "eth_per_fee_asset": 10978289, + "excess_mana": 1021878275, + "mana_used": 80919546 }, "oracle_input": { - "fee_asset_price_modifier": 75 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 10607004, + "eth_per_fee_asset_at_execution": 10978289, "l1_fee_oracle_output": { "base_fee": 10041012515, "blob_fee": 14467 @@ -23438,22 +23438,22 @@ "slot_of_change": 210 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73772239738950, - "congestion_multiplier": 4660438956, - "prover_cost": 17314007612329, - "sequencer_cost": 2839924921307 + "congestion_cost": 84261270768150, + "congestion_multiplier": 4924043839, + "prover_cost": 17814565639510, + "sequencer_cost": 3658505073059 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782502442, - "congestion_multiplier": 4660438956, - "prover_cost": 183649748, - "sequencer_cost": 30123095 + "congestion_cost": 925044582, + "congestion_multiplier": 4924043839, + "prover_cost": 195573450, + "sequencer_cost": 40164126 } }, "parent_fee_header": { - "eth_per_fee_asset": 10607004, - "excess_mana": 1311341766, - "mana_used": 104136558 + "eth_per_fee_asset": 10978289, + "excess_mana": 1026007160, + "mana_used": 70871115 } }, { @@ -23461,21 +23461,21 @@ "blobs_needed": 1, "block_number": 213, "l1_block_number": 20973795, - "mana_spent": 107686979, - "size_in_fields": 3765, + "mana_spent": 70570724, + "size_in_fields": 2475, "slot_number": 213, "timestamp": 1729029491 }, "fee_header": { - "eth_per_fee_asset": 10599994, - "excess_mana": 1314661963, - "mana_used": 107686979 + "eth_per_fee_asset": 11062821, + "excess_mana": 1027797821, + "mana_used": 70570724 }, "oracle_input": { - "fee_asset_price_modifier": -81 + "fee_asset_price_modifier": 77 }, "outputs": { - "eth_per_fee_asset_at_execution": 10686556, + "eth_per_fee_asset_at_execution": 10978289, "l1_fee_oracle_output": { "base_fee": 10041012515, "blob_fee": 14467 @@ -23492,22 +23492,22 @@ "slot_of_change": 215 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73134067795088, - "congestion_multiplier": 4655989698, - "prover_cost": 17185120070489, - "sequencer_cost": 2818784180797 + "congestion_cost": 85242195937819, + "congestion_multiplier": 4969725480, + "prover_cost": 17814565639510, + "sequencer_cost": 3658505073059 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781551311, - "congestion_multiplier": 4655989698, - "prover_cost": 183649748, - "sequencer_cost": 30123095 + "congestion_cost": 935813462, + "congestion_multiplier": 4969725480, + "prover_cost": 195573450, + "sequencer_cost": 40164126 } }, "parent_fee_header": { - "eth_per_fee_asset": 10686556, - "excess_mana": 1315478324, - "mana_used": 99183639 + "eth_per_fee_asset": 10978289, + "excess_mana": 1021878275, + "mana_used": 80919546 } }, { @@ -23515,21 +23515,21 @@ "blobs_needed": 1, "block_number": 214, "l1_block_number": 20973798, - "mana_spent": 100059471, - "size_in_fields": 3435, + "mana_spent": 74731973, + "size_in_fields": 2505, "slot_number": 214, "timestamp": 1729029527 }, "fee_header": { - "eth_per_fee_asset": 10631793, - "excess_mana": 1322348942, - "mana_used": 100059471 + "eth_per_fee_asset": 11143579, + "excess_mana": 1023368545, + "mana_used": 74731973 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": 73 }, "outputs": { - "eth_per_fee_asset_at_execution": 10599994, + "eth_per_fee_asset_at_execution": 11062821, "l1_fee_oracle_output": { "base_fee": 10041012515, "blob_fee": 14467 @@ -23546,22 +23546,22 @@ "slot_of_change": 215 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74579608158269, - "congestion_multiplier": 4698053450, - "prover_cost": 17325457731392, - "sequencer_cost": 2841803023663 + "congestion_cost": 83861641890437, + "congestion_multiplier": 4935504678, + "prover_cost": 17678442957723, + "sequencer_cost": 3630550110140 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790543399, - "congestion_multiplier": 4698053450, - "prover_cost": 183649748, - "sequencer_cost": 30123095 + "congestion_cost": 927746333, + "congestion_multiplier": 4935504678, + "prover_cost": 195573450, + "sequencer_cost": 40164126 } }, "parent_fee_header": { - "eth_per_fee_asset": 10599994, - "excess_mana": 1314661963, - "mana_used": 107686979 + "eth_per_fee_asset": 11062821, + "excess_mana": 1027797821, + "mana_used": 70570724 } }, { @@ -23569,21 +23569,21 @@ "blobs_needed": 1, "block_number": 215, "l1_block_number": 20973801, - "mana_spent": 102261461, - "size_in_fields": 3540, + "mana_spent": 80987206, + "size_in_fields": 2760, "slot_number": 215, "timestamp": 1729029563 }, "fee_header": { - "eth_per_fee_asset": 10731731, - "excess_mana": 1322408413, - "mana_used": 102261461 + "eth_per_fee_asset": 11132435, + "excess_mana": 1023100518, + "mana_used": 80987206 }, "oracle_input": { - "fee_asset_price_modifier": 94 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 10631793, + "eth_per_fee_asset_at_execution": 11143579, "l1_fee_oracle_output": { "base_fee": 10961019510, "blob_fee": 12365 @@ -23600,22 +23600,22 @@ "slot_of_change": 215 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75423228518464, - "congestion_multiplier": 4698380357, - "prover_cost": 17300680139277, - "sequencer_cost": 3092903332486 + "congestion_cost": 84996326584126, + "congestion_multiplier": 4933441465, + "prover_cost": 17674165633860, + "sequencer_cost": 3934475898632 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801884153, - "congestion_multiplier": 4698380357, - "prover_cost": 183937250, - "sequencer_cost": 32883108 + "congestion_cost": 947163280, + "congestion_multiplier": 4933441465, + "prover_cost": 196953461, + "sequencer_cost": 43844143 } }, "parent_fee_header": { - "eth_per_fee_asset": 10631793, - "excess_mana": 1322348942, - "mana_used": 100059471 + "eth_per_fee_asset": 11143579, + "excess_mana": 1023368545, + "mana_used": 74731973 } }, { @@ -23623,21 +23623,21 @@ "blobs_needed": 1, "block_number": 216, "l1_block_number": 20973804, - "mana_spent": 88787205, - "size_in_fields": 3255, + "mana_spent": 70870547, + "size_in_fields": 2415, "slot_number": 216, "timestamp": 1729029599 }, "fee_header": { - "eth_per_fee_asset": 10825097, - "excess_mana": 1324669874, - "mana_used": 88787205 + "eth_per_fee_asset": 11072319, + "excess_mana": 1029087724, + "mana_used": 70870547 }, "oracle_input": { - "fee_asset_price_modifier": 87 + "fee_asset_price_modifier": -54 }, "outputs": { - "eth_per_fee_asset_at_execution": 10731731, + "eth_per_fee_asset_at_execution": 11132435, "l1_fee_oracle_output": { "base_fee": 10961019510, "blob_fee": 12365 @@ -23654,22 +23654,22 @@ "slot_of_change": 215 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74972352642831, - "congestion_multiplier": 4710828306, - "prover_cost": 17139569562450, - "sequencer_cost": 3064101028996 + "congestion_cost": 86082771828446, + "congestion_multiplier": 4979735872, + "prover_cost": 17691858160412, + "sequencer_cost": 3938414461886 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804583121, - "congestion_multiplier": 4710828306, - "prover_cost": 183937250, - "sequencer_cost": 32883108 + "congestion_cost": 958310862, + "congestion_multiplier": 4979735872, + "prover_cost": 196953461, + "sequencer_cost": 43844143 } }, "parent_fee_header": { - "eth_per_fee_asset": 10731731, - "excess_mana": 1322408413, - "mana_used": 102261461 + "eth_per_fee_asset": 11132435, + "excess_mana": 1023100518, + "mana_used": 80987206 } }, { @@ -23677,21 +23677,21 @@ "blobs_needed": 1, "block_number": 217, "l1_block_number": 20973807, - "mana_spent": 99338598, - "size_in_fields": 3345, + "mana_spent": 78598343, + "size_in_fields": 2745, "slot_number": 217, "timestamp": 1729029635 }, "fee_header": { - "eth_per_fee_asset": 10819684, - "excess_mana": 1313457079, - "mana_used": 99338598 + "eth_per_fee_asset": 11054603, + "excess_mana": 1024958271, + "mana_used": 78598343 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": -16 }, "outputs": { - "eth_per_fee_asset_at_execution": 10825097, + "eth_per_fee_asset_at_execution": 11072319, "l1_fee_oracle_output": { "base_fee": 10961019510, "blob_fee": 12365 @@ -23708,22 +23708,22 @@ "slot_of_change": 215 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73095961357206, - "congestion_multiplier": 4649430707, - "prover_cost": 16991741505873, - "sequencer_cost": 3037673288286 + "congestion_cost": 85854742534062, + "congestion_multiplier": 4947759784, + "prover_cost": 17787914257167, + "sequencer_cost": 3959797672015 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791270872, - "congestion_multiplier": 4649430707, - "prover_cost": 183937250, - "sequencer_cost": 32883108 + "congestion_cost": 950611097, + "congestion_multiplier": 4947759784, + "prover_cost": 196953461, + "sequencer_cost": 43844143 } }, "parent_fee_header": { - "eth_per_fee_asset": 10825097, - "excess_mana": 1324669874, - "mana_used": 88787205 + "eth_per_fee_asset": 11072319, + "excess_mana": 1029087724, + "mana_used": 70870547 } }, { @@ -23731,21 +23731,21 @@ "blobs_needed": 1, "block_number": 218, "l1_block_number": 20973810, - "mana_spent": 103945300, - "size_in_fields": 3645, + "mana_spent": 74675400, + "size_in_fields": 2925, "slot_number": 218, "timestamp": 1729029671 }, "fee_header": { - "eth_per_fee_asset": 10790470, - "excess_mana": 1312795677, - "mana_used": 103945300 + "eth_per_fee_asset": 11032493, + "excess_mana": 1028556614, + "mana_used": 74675400 }, "oracle_input": { - "fee_asset_price_modifier": -27 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10819684, + "eth_per_fee_asset_at_execution": 11054603, "l1_fee_oracle_output": { "base_fee": 10961019510, "blob_fee": 12365 @@ -23762,22 +23762,22 @@ "slot_of_change": 220 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73060458327619, - "congestion_multiplier": 4645834182, - "prover_cost": 17000242336098, - "sequencer_cost": 3039193011552 + "congestion_cost": 86599018888331, + "congestion_multiplier": 4975611712, + "prover_cost": 17816420996756, + "sequencer_cost": 3966143605519 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790491072, - "congestion_multiplier": 4645834182, - "prover_cost": 183937250, - "sequencer_cost": 32883108 + "congestion_cost": 957317774, + "congestion_multiplier": 4975611712, + "prover_cost": 196953461, + "sequencer_cost": 43844143 } }, "parent_fee_header": { - "eth_per_fee_asset": 10819684, - "excess_mana": 1313457079, - "mana_used": 99338598 + "eth_per_fee_asset": 11054603, + "excess_mana": 1024958271, + "mana_used": 78598343 } }, { @@ -23785,21 +23785,21 @@ "blobs_needed": 1, "block_number": 219, "l1_block_number": 20973813, - "mana_spent": 109416027, - "size_in_fields": 3570, + "mana_spent": 68602649, + "size_in_fields": 2325, "slot_number": 219, "timestamp": 1729029707 }, "fee_header": { - "eth_per_fee_asset": 10851975, - "excess_mana": 1316740977, - "mana_used": 109416027 + "eth_per_fee_asset": 11064487, + "excess_mana": 1028232014, + "mana_used": 68602649 }, "oracle_input": { - "fee_asset_price_modifier": 57 + "fee_asset_price_modifier": 29 }, "outputs": { - "eth_per_fee_asset_at_execution": 10790470, + "eth_per_fee_asset_at_execution": 11032493, "l1_fee_oracle_output": { "base_fee": 10961019510, "blob_fee": 12365 @@ -23816,22 +23816,22 @@ "slot_of_change": 220 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73690170215014, - "congestion_multiplier": 4667328929, - "prover_cost": 17046268605539, - "sequencer_cost": 3047421289342 + "congestion_cost": 86717592388230, + "congestion_multiplier": 4973092820, + "prover_cost": 17852126532054, + "sequencer_cost": 3974092075110 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 795151571, - "congestion_multiplier": 4667328929, - "prover_cost": 183937250, - "sequencer_cost": 32883108 + "congestion_cost": 956711231, + "congestion_multiplier": 4973092820, + "prover_cost": 196953461, + "sequencer_cost": 43844143 } }, "parent_fee_header": { - "eth_per_fee_asset": 10790470, - "excess_mana": 1312795677, - "mana_used": 103945300 + "eth_per_fee_asset": 11032493, + "excess_mana": 1028556614, + "mana_used": 74675400 } }, { @@ -23839,21 +23839,21 @@ "blobs_needed": 1, "block_number": 220, "l1_block_number": 20973816, - "mana_spent": 87369100, - "size_in_fields": 3210, + "mana_spent": 85305147, + "size_in_fields": 3015, "slot_number": 220, "timestamp": 1729029743 }, "fee_header": { - "eth_per_fee_asset": 10743455, - "excess_mana": 1326157004, - "mana_used": 87369100 + "eth_per_fee_asset": 10973758, + "excess_mana": 1021834663, + "mana_used": 85305147 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": -82 }, "outputs": { - "eth_per_fee_asset_at_execution": 10851975, + "eth_per_fee_asset_at_execution": 11064487, "l1_fee_oracle_output": { "base_fee": 10899600536, "blob_fee": 9770 @@ -23870,22 +23870,22 @@ "slot_of_change": 220 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74235812098720, - "congestion_multiplier": 4719032010, - "prover_cost": 16947888011169, - "sequencer_cost": 3013169584339 + "congestion_cost": 85272294052133, + "congestion_multiplier": 4923708845, + "prover_cost": 17792178887282, + "sequencer_cost": 3940395429088 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 805605177, - "congestion_multiplier": 4719032010, - "prover_cost": 183918057, - "sequencer_cost": 32698841 + "congestion_cost": 943494189, + "congestion_multiplier": 4923708845, + "prover_cost": 196861332, + "sequencer_cost": 43598454 } }, "parent_fee_header": { - "eth_per_fee_asset": 10851975, - "excess_mana": 1316740977, - "mana_used": 109416027 + "eth_per_fee_asset": 11064487, + "excess_mana": 1028232014, + "mana_used": 68602649 } }, { @@ -23893,21 +23893,21 @@ "blobs_needed": 1, "block_number": 221, "l1_block_number": 20973819, - "mana_spent": 91424447, - "size_in_fields": 3300, + "mana_spent": 53827296, + "size_in_fields": 2040, "slot_number": 221, "timestamp": 1729029779 }, "fee_header": { - "eth_per_fee_asset": 10734860, - "excess_mana": 1313526104, - "mana_used": 91424447 + "eth_per_fee_asset": 11028626, + "excess_mana": 1032139810, + "mana_used": 53827296 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": 50 }, "outputs": { - "eth_per_fee_asset_at_execution": 10743455, + "eth_per_fee_asset_at_execution": 10973758, "l1_fee_oracle_output": { "base_fee": 10899600536, "blob_fee": 9770 @@ -23924,44 +23924,44 @@ "slot_of_change": 220 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73589892450800, - "congestion_multiplier": 4649806207, - "prover_cost": 17119079197521, - "sequencer_cost": 3043605711571 + "congestion_cost": 87725761767300, + "congestion_multiplier": 5003502194, + "prover_cost": 17939281329150, + "sequencer_cost": 3972973889164 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790609698, - "congestion_multiplier": 4649806207, - "prover_cost": 183918057, - "sequencer_cost": 32698841 + "congestion_cost": 962681280, + "congestion_multiplier": 5003502194, + "prover_cost": 196861332, + "sequencer_cost": 43598454 } }, "parent_fee_header": { - "eth_per_fee_asset": 10743455, - "excess_mana": 1326157004, - "mana_used": 87369100 + "eth_per_fee_asset": 10973758, + "excess_mana": 1021834663, + "mana_used": 85305147 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 222, "l1_block_number": 20973822, - "mana_spent": 114181105, - "size_in_fields": 4110, + "mana_spent": 86065961, + "size_in_fields": 2910, "slot_number": 222, "timestamp": 1729029815 }, "fee_header": { - "eth_per_fee_asset": 10796048, - "excess_mana": 1304950551, - "mana_used": 114181105 + "eth_per_fee_asset": 11031934, + "excess_mana": 1010967106, + "mana_used": 86065961 }, "oracle_input": { - "fee_asset_price_modifier": 57 + "fee_asset_price_modifier": 3 }, "outputs": { - "eth_per_fee_asset_at_execution": 10734860, + "eth_per_fee_asset_at_execution": 11028626, "l1_fee_oracle_output": { "base_fee": 10899600536, "blob_fee": 9770 @@ -23978,22 +23978,22 @@ "slot_of_change": 220 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72712110171908, - "congestion_multiplier": 4603386120, - "prover_cost": 17132785802517, - "sequencer_cost": 3046042612573 + "congestion_cost": 83744914733713, + "congestion_multiplier": 4840938892, + "prover_cost": 17850032451912, + "sequencer_cost": 3953208133090 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780554323, - "congestion_multiplier": 4603386120, - "prover_cost": 183918057, - "sequencer_cost": 32698841 + "congestion_cost": 923591344, + "congestion_multiplier": 4840938892, + "prover_cost": 196861332, + "sequencer_cost": 43598454 } }, "parent_fee_header": { - "eth_per_fee_asset": 10734860, - "excess_mana": 1313526104, - "mana_used": 91424447 + "eth_per_fee_asset": 11028626, + "excess_mana": 1032139810, + "mana_used": 53827296 } }, { @@ -24001,21 +24001,21 @@ "blobs_needed": 1, "block_number": 223, "l1_block_number": 20973825, - "mana_spent": 101378841, - "size_in_fields": 3510, + "mana_spent": 85602436, + "size_in_fields": 2790, "slot_number": 223, "timestamp": 1729029851 }, "fee_header": { - "eth_per_fee_asset": 10772296, - "excess_mana": 1319131656, - "mana_used": 101378841 + "eth_per_fee_asset": 11078268, + "excess_mana": 1022033067, + "mana_used": 85602436 }, "oracle_input": { - "fee_asset_price_modifier": -22 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 10796048, + "eth_per_fee_asset_at_execution": 11031934, "l1_fee_oracle_output": { "base_fee": 10899600536, "blob_fee": 9770 @@ -24032,22 +24032,22 @@ "slot_of_change": 225 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73845290424793, - "congestion_multiplier": 4680402164, - "prover_cost": 17035683520489, - "sequencer_cost": 3028778771640 + "congestion_cost": 85557137216376, + "congestion_multiplier": 4925233019, + "prover_cost": 17844679998993, + "sequencer_cost": 3952022736902 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797237300, - "congestion_multiplier": 4680402164, - "prover_cost": 183918057, - "sequencer_cost": 32698841 + "congestion_cost": 943860691, + "congestion_multiplier": 4925233019, + "prover_cost": 196861332, + "sequencer_cost": 43598454 } }, "parent_fee_header": { - "eth_per_fee_asset": 10796048, - "excess_mana": 1304950551, - "mana_used": 114181105 + "eth_per_fee_asset": 11031934, + "excess_mana": 1010967106, + "mana_used": 86065961 } }, { @@ -24055,21 +24055,21 @@ "blobs_needed": 1, "block_number": 224, "l1_block_number": 20973828, - "mana_spent": 87881506, - "size_in_fields": 3075, + "mana_spent": 61888021, + "size_in_fields": 2400, "slot_number": 224, "timestamp": 1729029887 }, "fee_header": { - "eth_per_fee_asset": 10794917, - "excess_mana": 1320510497, - "mana_used": 87881506 + "eth_per_fee_asset": 11124796, + "excess_mana": 1032635503, + "mana_used": 61888021 }, "oracle_input": { - "fee_asset_price_modifier": 21 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 10772296, + "eth_per_fee_asset_at_execution": 11078268, "l1_fee_oracle_output": { "base_fee": 10899600536, "blob_fee": 9770 @@ -24086,22 +24086,22 @@ "slot_of_change": 225 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74160068939807, - "congestion_multiplier": 4687958888, - "prover_cost": 17073245759308, - "sequencer_cost": 3035456972219 + "congestion_cost": 86982189454164, + "congestion_multiplier": 5007372804, + "prover_cost": 17770046003582, + "sequencer_cost": 3935493707140 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798874214, - "congestion_multiplier": 4687958888, - "prover_cost": 183918057, - "sequencer_cost": 32698841 + "congestion_cost": 963612006, + "congestion_multiplier": 5007372804, + "prover_cost": 196861332, + "sequencer_cost": 43598454 } }, "parent_fee_header": { - "eth_per_fee_asset": 10772296, - "excess_mana": 1319131656, - "mana_used": 101378841 + "eth_per_fee_asset": 11078268, + "excess_mana": 1022033067, + "mana_used": 85602436 } }, { @@ -24109,21 +24109,21 @@ "blobs_needed": 1, "block_number": 225, "l1_block_number": 20973831, - "mana_spent": 11911617, - "size_in_fields": 420, + "mana_spent": 90398924, + "size_in_fields": 3060, "slot_number": 225, "timestamp": 1729029923 }, "fee_header": { - "eth_per_fee_asset": 10738783, - "excess_mana": 1308392003, - "mana_used": 11911617 + "eth_per_fee_asset": 11118121, + "excess_mana": 1019523524, + "mana_used": 90398924 }, "oracle_input": { - "fee_asset_price_modifier": -52 + "fee_asset_price_modifier": -6 }, "outputs": { - "eth_per_fee_asset_at_execution": 10794917, + "eth_per_fee_asset_at_execution": 11124796, "l1_fee_oracle_output": { "base_fee": 11150589613, "blob_fee": 9032 @@ -24140,44 +24140,44 @@ "slot_of_change": 225 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72959228496153, - "congestion_multiplier": 4621959016, - "prover_cost": 17044734202218, - "sequencer_cost": 3098847818840 + "congestion_cost": 84911691144719, + "congestion_multiplier": 4905988981, + "prover_cost": 17729566996105, + "sequencer_cost": 4009278552165 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787588816, - "congestion_multiplier": 4621959016, - "prover_cost": 183996491, - "sequencer_cost": 33451805 + "congestion_cost": 944625242, + "congestion_multiplier": 4905988981, + "prover_cost": 197237816, + "sequencer_cost": 44602406 } }, "parent_fee_header": { - "eth_per_fee_asset": 10794917, - "excess_mana": 1320510497, - "mana_used": 87881506 + "eth_per_fee_asset": 11124796, + "excess_mana": 1032635503, + "mana_used": 61888021 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 226, "l1_block_number": 20973834, - "mana_spent": 161111668, - "size_in_fields": 5745, + "mana_spent": 60685081, + "size_in_fields": 2235, "slot_number": 226, "timestamp": 1729029959 }, "fee_header": { - "eth_per_fee_asset": 10718379, - "excess_mana": 1220303620, - "mana_used": 161111668 + "eth_per_fee_asset": 11043629, + "excess_mana": 1034922448, + "mana_used": 60685081 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": -67 }, "outputs": { - "eth_per_fee_asset_at_execution": 10738783, + "eth_per_fee_asset_at_execution": 11118121, "l1_fee_oracle_output": { "base_fee": 11150589613, "blob_fee": 9032 @@ -24194,44 +24194,44 @@ "slot_of_change": 225 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64175363539798, - "congestion_multiplier": 4169329521, - "prover_cost": 17133830807458, - "sequencer_cost": 3115046183539 + "congestion_cost": 87557240292672, + "congestion_multiplier": 5025269183, + "prover_cost": 17740211318082, + "sequencer_cost": 4011685607667 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 689165303, - "congestion_multiplier": 4169329521, - "prover_cost": 183996491, - "sequencer_cost": 33451805 + "congestion_cost": 973471992, + "congestion_multiplier": 5025269183, + "prover_cost": 197237816, + "sequencer_cost": 44602406 } }, "parent_fee_header": { - "eth_per_fee_asset": 10738783, - "excess_mana": 1308392003, - "mana_used": 11911617 + "eth_per_fee_asset": 11118121, + "excess_mana": 1019523524, + "mana_used": 90398924 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 227, "l1_block_number": 20973837, - "mana_spent": 117266748, - "size_in_fields": 4365, + "mana_spent": 68489170, + "size_in_fields": 2325, "slot_number": 227, "timestamp": 1729029995 }, "fee_header": { - "eth_per_fee_asset": 10695870, - "excess_mana": 1281415288, - "mana_used": 117266748 + "eth_per_fee_asset": 11096638, + "excess_mana": 1020607529, + "mana_used": 68489170 }, "oracle_input": { - "fee_asset_price_modifier": -21 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 10718379, + "eth_per_fee_asset_at_execution": 11043629, "l1_fee_oracle_output": { "base_fee": 11150589613, "blob_fee": 9032 @@ -24248,22 +24248,22 @@ "slot_of_change": 225 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70566870326194, - "congestion_multiplier": 4478355433, - "prover_cost": 17166447557042, - "sequencer_cost": 3120976128947 + "congestion_cost": 85717594189374, + "congestion_multiplier": 4914292262, + "prover_cost": 17859873416610, + "sequencer_cost": 4038745416023 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 756362461, - "congestion_multiplier": 4478355433, - "prover_cost": 183996491, - "sequencer_cost": 33451805 + "congestion_cost": 946633309, + "congestion_multiplier": 4914292262, + "prover_cost": 197237816, + "sequencer_cost": 44602406 } }, "parent_fee_header": { - "eth_per_fee_asset": 10718379, - "excess_mana": 1220303620, - "mana_used": 161111668 + "eth_per_fee_asset": 11043629, + "excess_mana": 1034922448, + "mana_used": 60685081 } }, { @@ -24271,21 +24271,21 @@ "blobs_needed": 1, "block_number": 228, "l1_block_number": 20973840, - "mana_spent": 102035379, - "size_in_fields": 3660, + "mana_spent": 76298541, + "size_in_fields": 2775, "slot_number": 228, "timestamp": 1729030031 }, "fee_header": { - "eth_per_fee_asset": 10694800, - "excess_mana": 1298682036, - "mana_used": 102035379 + "eth_per_fee_asset": 11131037, + "excess_mana": 1014096699, + "mana_used": 76298541 }, "oracle_input": { - "fee_asset_price_modifier": -1 + "fee_asset_price_modifier": 31 }, "outputs": { - "eth_per_fee_asset_at_execution": 10695870, + "eth_per_fee_asset_at_execution": 11096638, "l1_fee_oracle_output": { "base_fee": 11150589613, "blob_fee": 9032 @@ -24302,22 +24302,22 @@ "slot_of_change": 230 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72573389728933, - "congestion_multiplier": 4569747644, - "prover_cost": 17202573610188, - "sequencer_cost": 3127544089448 + "congestion_cost": 84225799201524, + "congestion_multiplier": 4864630942, + "prover_cost": 17774556221443, + "sequencer_cost": 4019452198045 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776235542, - "congestion_multiplier": 4569747644, - "prover_cost": 183996491, - "sequencer_cost": 33451805 + "congestion_cost": 934623204, + "congestion_multiplier": 4864630942, + "prover_cost": 197237816, + "sequencer_cost": 44602406 } }, "parent_fee_header": { - "eth_per_fee_asset": 10695870, - "excess_mana": 1281415288, - "mana_used": 117266748 + "eth_per_fee_asset": 11096638, + "excess_mana": 1020607529, + "mana_used": 68489170 } }, { @@ -24325,21 +24325,21 @@ "blobs_needed": 1, "block_number": 229, "l1_block_number": 20973843, - "mana_spent": 116739161, - "size_in_fields": 4035, + "mana_spent": 81289718, + "size_in_fields": 2595, "slot_number": 229, "timestamp": 1729030067 }, "fee_header": { - "eth_per_fee_asset": 10629561, - "excess_mana": 1300717415, - "mana_used": 116739161 + "eth_per_fee_asset": 11134376, + "excess_mana": 1015395240, + "mana_used": 81289718 }, "oracle_input": { - "fee_asset_price_modifier": -61 + "fee_asset_price_modifier": 3 }, "outputs": { - "eth_per_fee_asset_at_execution": 10694800, + "eth_per_fee_asset_at_execution": 11131037, "l1_fee_oracle_output": { "base_fee": 11150589613, "blob_fee": 9032 @@ -24356,22 +24356,22 @@ "slot_of_change": 230 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72802176197779, - "congestion_multiplier": 4580642979, - "prover_cost": 17204294703969, - "sequencer_cost": 3127856995924 + "congestion_cost": 84179830684240, + "congestion_multiplier": 4874495329, + "prover_cost": 17719626302563, + "sequencer_cost": 4007030611793 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778604714, - "congestion_multiplier": 4580642979, - "prover_cost": 183996491, - "sequencer_cost": 33451805 + "congestion_cost": 937008810, + "congestion_multiplier": 4874495329, + "prover_cost": 197237816, + "sequencer_cost": 44602406 } }, "parent_fee_header": { - "eth_per_fee_asset": 10694800, - "excess_mana": 1298682036, - "mana_used": 102035379 + "eth_per_fee_asset": 11131037, + "excess_mana": 1014096699, + "mana_used": 76298541 } }, { @@ -24379,21 +24379,21 @@ "blobs_needed": 1, "block_number": 230, "l1_block_number": 20973846, - "mana_spent": 109069363, - "size_in_fields": 3645, + "mana_spent": 72469902, + "size_in_fields": 2685, "slot_number": 230, "timestamp": 1729030103 }, "fee_header": { - "eth_per_fee_asset": 10616805, - "excess_mana": 1317456576, - "mana_used": 109069363 + "eth_per_fee_asset": 11184480, + "excess_mana": 1021684958, + "mana_used": 72469902 }, "oracle_input": { - "fee_asset_price_modifier": -12 + "fee_asset_price_modifier": 45 }, "outputs": { - "eth_per_fee_asset_at_execution": 10629561, + "eth_per_fee_asset_at_execution": 11134376, "l1_fee_oracle_output": { "base_fee": 11688414692, "blob_fee": 7719 @@ -24410,22 +24410,22 @@ "slot_of_change": 230 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75717611291756, - "congestion_multiplier": 4671238290, - "prover_cost": 17325697740481, - "sequencer_cost": 3298845079303 + "congestion_cost": 86240631536065, + "congestion_multiplier": 4922559097, + "prover_cost": 17786767215334, + "sequencer_cost": 4199040880244 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804844968, - "congestion_multiplier": 4671238290, - "prover_cost": 184164561, - "sequencer_cost": 35065275 + "congestion_cost": 960235618, + "congestion_multiplier": 4922559097, + "prover_cost": 198044554, + "sequencer_cost": 46753700 } }, "parent_fee_header": { - "eth_per_fee_asset": 10629561, - "excess_mana": 1300717415, - "mana_used": 116739161 + "eth_per_fee_asset": 11134376, + "excess_mana": 1015395240, + "mana_used": 81289718 } }, { @@ -24433,21 +24433,21 @@ "blobs_needed": 1, "block_number": 231, "l1_block_number": 20973849, - "mana_spent": 104714664, - "size_in_fields": 3615, + "mana_spent": 78406327, + "size_in_fields": 2655, "slot_number": 231, "timestamp": 1729030139 }, "fee_header": { - "eth_per_fee_asset": 10607249, - "excess_mana": 1326525939, - "mana_used": 104714664 + "eth_per_fee_asset": 11147571, + "excess_mana": 1019154860, + "mana_used": 78406327 }, "oracle_input": { - "fee_asset_price_modifier": -9 + "fee_asset_price_modifier": -33 }, "outputs": { - "eth_per_fee_asset_at_execution": 10616805, + "eth_per_fee_asset_at_execution": 11184480, "l1_fee_oracle_output": { "base_fee": 11688414692, "blob_fee": 7719 @@ -24464,22 +24464,22 @@ "slot_of_change": 230 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 76837564785263, - "congestion_multiplier": 4721069438, - "prover_cost": 17346514417474, - "sequencer_cost": 3302808613326 + "congestion_cost": 85429879618901, + "congestion_multiplier": 4903168281, + "prover_cost": 17707086426906, + "sequencer_cost": 4180230104574 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815769442, - "congestion_multiplier": 4721069438, - "prover_cost": 184164561, - "sequencer_cost": 35065275 + "congestion_cost": 955488780, + "congestion_multiplier": 4903168281, + "prover_cost": 198044554, + "sequencer_cost": 46753700 } }, "parent_fee_header": { - "eth_per_fee_asset": 10616805, - "excess_mana": 1317456576, - "mana_used": 109069363 + "eth_per_fee_asset": 11184480, + "excess_mana": 1021684958, + "mana_used": 72469902 } }, { @@ -24487,21 +24487,21 @@ "blobs_needed": 1, "block_number": 232, "l1_block_number": 20973852, - "mana_spent": 95523532, - "size_in_fields": 3165, + "mana_spent": 69455277, + "size_in_fields": 2505, "slot_number": 232, "timestamp": 1729030175 }, "fee_header": { - "eth_per_fee_asset": 10593459, - "excess_mana": 1331240603, - "mana_used": 95523532 + "eth_per_fee_asset": 11169866, + "excess_mana": 1022561187, + "mana_used": 69455277 }, "oracle_input": { - "fee_asset_price_modifier": -13 + "fee_asset_price_modifier": 20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10607249, + "eth_per_fee_asset_at_execution": 11147571, "l1_fee_oracle_output": { "base_fee": 11688414692, "blob_fee": 7719 @@ -24518,22 +24518,22 @@ "slot_of_change": 230 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77446511908979, - "congestion_multiplier": 4747183556, - "prover_cost": 17362141776817, - "sequencer_cost": 3305784091616 + "congestion_cost": 86286413964083, + "congestion_multiplier": 4929292429, + "prover_cost": 17765713624969, + "sequencer_cost": 4194070618613 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 821494436, - "congestion_multiplier": 4747183556, - "prover_cost": 184164561, - "sequencer_cost": 35065275 + "congestion_cost": 961883926, + "congestion_multiplier": 4929292429, + "prover_cost": 198044554, + "sequencer_cost": 46753700 } }, "parent_fee_header": { - "eth_per_fee_asset": 10607249, - "excess_mana": 1326525939, - "mana_used": 104714664 + "eth_per_fee_asset": 11147571, + "excess_mana": 1019154860, + "mana_used": 78406327 } }, { @@ -24541,21 +24541,21 @@ "blobs_needed": 1, "block_number": 233, "l1_block_number": 20973855, - "mana_spent": 92619171, - "size_in_fields": 3360, + "mana_spent": 79324864, + "size_in_fields": 2820, "slot_number": 233, "timestamp": 1729030211 }, "fee_header": { - "eth_per_fee_asset": 10645366, - "excess_mana": 1326764135, - "mana_used": 92619171 + "eth_per_fee_asset": 11205609, + "excess_mana": 1017016464, + "mana_used": 79324864 }, "oracle_input": { - "fee_asset_price_modifier": 49 + "fee_asset_price_modifier": 32 }, "outputs": { - "eth_per_fee_asset_at_execution": 10593459, + "eth_per_fee_asset_at_execution": 11169866, "l1_fee_oracle_output": { "base_fee": 11688414692, "blob_fee": 7719 @@ -24572,22 +24572,22 @@ "slot_of_change": 235 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 77034132666205, - "congestion_multiplier": 4722385333, - "prover_cost": 17384742887097, - "sequencer_cost": 3310087385056 + "congestion_cost": 85183780718587, + "congestion_multiplier": 4886839064, + "prover_cost": 17730253344132, + "sequencer_cost": 4185699273385 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 816057926, - "congestion_multiplier": 4722385333, - "prover_cost": 184164561, - "sequencer_cost": 35065275 + "congestion_cost": 951491416, + "congestion_multiplier": 4886839064, + "prover_cost": 198044554, + "sequencer_cost": 46753700 } }, "parent_fee_header": { - "eth_per_fee_asset": 10593459, - "excess_mana": 1331240603, - "mana_used": 95523532 + "eth_per_fee_asset": 11169866, + "excess_mana": 1022561187, + "mana_used": 69455277 } }, { @@ -24595,21 +24595,21 @@ "blobs_needed": 1, "block_number": 234, "l1_block_number": 20973858, - "mana_spent": 85883964, - "size_in_fields": 3045, + "mana_spent": 76563402, + "size_in_fields": 2835, "slot_number": 234, "timestamp": 1729030247 }, "fee_header": { - "eth_per_fee_asset": 10577235, - "excess_mana": 1319383306, - "mana_used": 85883964 + "eth_per_fee_asset": 11188800, + "excess_mana": 1021341328, + "mana_used": 76563402 }, "oracle_input": { - "fee_asset_price_modifier": -64 + "fee_asset_price_modifier": -15 }, "outputs": { - "eth_per_fee_asset_at_execution": 10645366, + "eth_per_fee_asset_at_execution": 11205609, "l1_fee_oracle_output": { "base_fee": 11688414692, "blob_fee": 7719 @@ -24626,22 +24626,22 @@ "slot_of_change": 235 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75822298359681, - "congestion_multiplier": 4681780420, - "prover_cost": 17299974561702, - "sequencer_cost": 3293947338213 + "congestion_cost": 85634776030469, + "congestion_multiplier": 4919921003, + "prover_cost": 17673698413001, + "sequencer_cost": 4172347973234 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 807156117, - "congestion_multiplier": 4681780420, - "prover_cost": 184164561, - "sequencer_cost": 35065275 + "congestion_cost": 959589817, + "congestion_multiplier": 4919921003, + "prover_cost": 198044554, + "sequencer_cost": 46753700 } }, "parent_fee_header": { - "eth_per_fee_asset": 10645366, - "excess_mana": 1326764135, - "mana_used": 92619171 + "eth_per_fee_asset": 11205609, + "excess_mana": 1017016464, + "mana_used": 79324864 } }, { @@ -24649,21 +24649,21 @@ "blobs_needed": 1, "block_number": 235, "l1_block_number": 20973861, - "mana_spent": 109597719, - "size_in_fields": 3750, + "mana_spent": 73070399, + "size_in_fields": 2715, "slot_number": 235, "timestamp": 1729030283 }, "fee_header": { - "eth_per_fee_asset": 10558195, - "excess_mana": 1305267270, - "mana_used": 109597719 + "eth_per_fee_asset": 11138450, + "excess_mana": 1022904730, + "mana_used": 73070399 }, "oracle_input": { - "fee_asset_price_modifier": -18 + "fee_asset_price_modifier": -45 }, "outputs": { - "eth_per_fee_asset_at_execution": 10577235, + "eth_per_fee_asset_at_execution": 11188800, "l1_fee_oracle_output": { "base_fee": 9960149966, "blob_fee": 8350 @@ -24680,22 +24680,22 @@ "slot_of_change": 235 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72769971074672, - "congestion_multiplier": 4605092273, - "prover_cost": 17360347765745, - "sequencer_cost": 2824980536029 + "congestion_cost": 82685897147148, + "congestion_multiplier": 4931934878, + "prover_cost": 17468553911054, + "sequencer_cost": 3560761118262 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 769705085, - "congestion_multiplier": 4605092273, - "prover_cost": 183624478, - "sequencer_cost": 29880483 + "congestion_cost": 925155966, + "congestion_multiplier": 4931934878, + "prover_cost": 195452156, + "sequencer_cost": 39840644 } }, "parent_fee_header": { - "eth_per_fee_asset": 10577235, - "excess_mana": 1319383306, - "mana_used": 85883964 + "eth_per_fee_asset": 11188800, + "excess_mana": 1021341328, + "mana_used": 76563402 } }, { @@ -24703,21 +24703,21 @@ "blobs_needed": 1, "block_number": 236, "l1_block_number": 20973864, - "mana_spent": 105504584, - "size_in_fields": 3495, + "mana_spent": 73481862, + "size_in_fields": 2745, "slot_number": 236, "timestamp": 1729030319 }, "fee_header": { - "eth_per_fee_asset": 10529687, - "excess_mana": 1314864989, - "mana_used": 105504584 + "eth_per_fee_asset": 11205280, + "excess_mana": 1020975129, + "mana_used": 73481862 }, "oracle_input": { - "fee_asset_price_modifier": -27 + "fee_asset_price_modifier": 60 }, "outputs": { - "eth_per_fee_asset_at_execution": 10558195, + "eth_per_fee_asset_at_execution": 11138450, "l1_fee_oracle_output": { "base_fee": 9960149966, "blob_fee": 8350 @@ -24734,22 +24734,22 @@ "slot_of_change": 235 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73952801496847, - "congestion_multiplier": 4657095815, - "prover_cost": 17391654350010, - "sequencer_cost": 2830074932316 + "congestion_cost": 82746527748475, + "congestion_multiplier": 4917111200, + "prover_cost": 17547518371049, + "sequencer_cost": 3576857103098 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780808099, - "congestion_multiplier": 4657095815, - "prover_cost": 183624478, - "sequencer_cost": 29880483 + "congestion_cost": 921668062, + "congestion_multiplier": 4917111200, + "prover_cost": 195452156, + "sequencer_cost": 39840644 } }, "parent_fee_header": { - "eth_per_fee_asset": 10558195, - "excess_mana": 1305267270, - "mana_used": 109597719 + "eth_per_fee_asset": 11138450, + "excess_mana": 1022904730, + "mana_used": 73070399 } }, { @@ -24757,21 +24757,21 @@ "blobs_needed": 1, "block_number": 237, "l1_block_number": 20973867, - "mana_spent": 95584169, - "size_in_fields": 3420, + "mana_spent": 77529495, + "size_in_fields": 2445, "slot_number": 237, "timestamp": 1729030355 }, "fee_header": { - "eth_per_fee_asset": 10505468, - "excess_mana": 1320369573, - "mana_used": 95584169 + "eth_per_fee_asset": 11274752, + "excess_mana": 1019456991, + "mana_used": 77529495 }, "oracle_input": { - "fee_asset_price_modifier": -23 + "fee_asset_price_modifier": 62 }, "outputs": { - "eth_per_fee_asset_at_execution": 10529687, + "eth_per_fee_asset_at_execution": 11205280, "l1_fee_oracle_output": { "base_fee": 9960149966, "blob_fee": 8350 @@ -24788,22 +24788,22 @@ "slot_of_change": 235 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74763143671792, - "congestion_multiplier": 4687185996, - "prover_cost": 17438740391809, - "sequencer_cost": 2837737057142 + "congestion_cost": 82008774345666, + "congestion_multiplier": 4905479808, + "prover_cost": 17442862293491, + "sequencer_cost": 3555524181458 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787232502, - "congestion_multiplier": 4687185996, - "prover_cost": 183624478, - "sequencer_cost": 29880483 + "congestion_cost": 918931279, + "congestion_multiplier": 4905479808, + "prover_cost": 195452156, + "sequencer_cost": 39840644 } }, "parent_fee_header": { - "eth_per_fee_asset": 10529687, - "excess_mana": 1314864989, - "mana_used": 105504584 + "eth_per_fee_asset": 11205280, + "excess_mana": 1020975129, + "mana_used": 73481862 } }, { @@ -24811,21 +24811,21 @@ "blobs_needed": 1, "block_number": 238, "l1_block_number": 20973870, - "mana_spent": 101699763, - "size_in_fields": 3690, + "mana_spent": 77093462, + "size_in_fields": 2760, "slot_number": 238, "timestamp": 1729030391 }, "fee_header": { - "eth_per_fee_asset": 10567450, - "excess_mana": 1315953742, - "mana_used": 101699763 + "eth_per_fee_asset": 11343527, + "excess_mana": 1021986486, + "mana_used": 77093462 }, "oracle_input": { - "fee_asset_price_modifier": 59 + "fee_asset_price_modifier": 61 }, "outputs": { - "eth_per_fee_asset_at_execution": 10505468, + "eth_per_fee_asset_at_execution": 11274752, "l1_fee_oracle_output": { "base_fee": 9960149966, "blob_fee": 8350 @@ -24842,22 +24842,22 @@ "slot_of_change": 240 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74444613319464, - "congestion_multiplier": 4663031995, - "prover_cost": 17478943156079, - "sequencer_cost": 2844279093516 + "congestion_cost": 81908219267262, + "congestion_multiplier": 4924875133, + "prover_cost": 17335384051020, + "sequencer_cost": 3533615994392 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782075503, - "congestion_multiplier": 4663031995, - "prover_cost": 183624478, - "sequencer_cost": 29880483 + "congestion_cost": 923494859, + "congestion_multiplier": 4924875133, + "prover_cost": 195452156, + "sequencer_cost": 39840644 } }, "parent_fee_header": { - "eth_per_fee_asset": 10505468, - "excess_mana": 1320369573, - "mana_used": 95584169 + "eth_per_fee_asset": 11274752, + "excess_mana": 1019456991, + "mana_used": 77529495 } }, { @@ -24865,21 +24865,21 @@ "blobs_needed": 1, "block_number": 239, "l1_block_number": 20973873, - "mana_spent": 94324896, - "size_in_fields": 3345, + "mana_spent": 76545326, + "size_in_fields": 2670, "slot_number": 239, "timestamp": 1729030427 }, "fee_header": { - "eth_per_fee_asset": 10539974, - "excess_mana": 1317653505, - "mana_used": 94324896 + "eth_per_fee_asset": 11334452, + "excess_mana": 1024079948, + "mana_used": 76545326 }, "oracle_input": { - "fee_asset_price_modifier": -26 + "fee_asset_price_modifier": -8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10567450, + "eth_per_fee_asset_at_execution": 11343527, "l1_fee_oracle_output": { "base_fee": 9960149966, "blob_fee": 8350 @@ -24896,22 +24896,22 @@ "slot_of_change": 240 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74195516042187, - "congestion_multiplier": 4672314700, - "prover_cost": 17376422694217, - "sequencer_cost": 2827596345382 + "congestion_cost": 81745775806767, + "congestion_multiplier": 4940985085, + "prover_cost": 17230280846513, + "sequencer_cost": 3512191931134 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784057406, - "congestion_multiplier": 4672314700, - "prover_cost": 183624478, - "sequencer_cost": 29880483 + "congestion_cost": 927285415, + "congestion_multiplier": 4940985085, + "prover_cost": 195452156, + "sequencer_cost": 39840644 } }, "parent_fee_header": { - "eth_per_fee_asset": 10567450, - "excess_mana": 1315953742, - "mana_used": 101699763 + "eth_per_fee_asset": 11343527, + "excess_mana": 1021986486, + "mana_used": 77093462 } }, { @@ -24919,21 +24919,21 @@ "blobs_needed": 1, "block_number": 240, "l1_block_number": 20973876, - "mana_spent": 92844069, - "size_in_fields": 3525, + "mana_spent": 76400935, + "size_in_fields": 2640, "slot_number": 240, "timestamp": 1729030463 }, "fee_header": { - "eth_per_fee_asset": 10533650, - "excess_mana": 1311978401, - "mana_used": 92844069 + "eth_per_fee_asset": 11333318, + "excess_mana": 1025625274, + "mana_used": 76400935 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": -1 }, "outputs": { - "eth_per_fee_asset_at_execution": 10539974, + "eth_per_fee_asset_at_execution": 11334452, "l1_fee_oracle_output": { "base_fee": 9576566258, "blob_fee": 7136 @@ -24950,22 +24950,22 @@ "slot_of_change": 240 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73323597572442, - "congestion_multiplier": 4641393899, - "prover_cost": 17410347312053, - "sequencer_cost": 2725787274239 + "congestion_cost": 81323024174438, + "congestion_multiplier": 4952910729, + "prover_cost": 17193313007105, + "sequencer_cost": 3379634321977 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772828812, - "congestion_multiplier": 4641393899, - "prover_cost": 183504608, - "sequencer_cost": 28729727 + "congestion_cost": 921751914, + "congestion_multiplier": 4952910729, + "prover_cost": 194876781, + "sequencer_cost": 38306303 } }, "parent_fee_header": { - "eth_per_fee_asset": 10539974, - "excess_mana": 1317653505, - "mana_used": 94324896 + "eth_per_fee_asset": 11334452, + "excess_mana": 1024079948, + "mana_used": 76545326 } }, { @@ -24973,21 +24973,21 @@ "blobs_needed": 1, "block_number": 241, "l1_block_number": 20973879, - "mana_spent": 122508520, - "size_in_fields": 4080, + "mana_spent": 86196741, + "size_in_fields": 2970, "slot_number": 241, "timestamp": 1729030499 }, "fee_header": { - "eth_per_fee_asset": 10638986, - "excess_mana": 1304822470, - "mana_used": 122508520 + "eth_per_fee_asset": 11281184, + "excess_mana": 1027026209, + "mana_used": 86196741 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -46 }, "outputs": { - "eth_per_fee_asset_at_execution": 10533650, + "eth_per_fee_asset_at_execution": 11333318, "l1_fee_oracle_output": { "base_fee": 9576566258, "blob_fee": 7136 @@ -25004,22 +25004,22 @@ "slot_of_change": 240 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72587931059035, - "congestion_multiplier": 4602696333, - "prover_cost": 17420799817727, - "sequencer_cost": 2727423732515 + "congestion_cost": 81554116543805, + "congestion_multiplier": 4963746947, + "prover_cost": 17195033352104, + "sequencer_cost": 3379972484669 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 764615860, - "congestion_multiplier": 4602696333, - "prover_cost": 183504608, - "sequencer_cost": 28729727 + "congestion_cost": 924278737, + "congestion_multiplier": 4963746947, + "prover_cost": 194876781, + "sequencer_cost": 38306303 } }, "parent_fee_header": { - "eth_per_fee_asset": 10533650, - "excess_mana": 1311978401, - "mana_used": 92844069 + "eth_per_fee_asset": 11333318, + "excess_mana": 1025625274, + "mana_used": 76400935 } }, { @@ -25027,21 +25027,21 @@ "blobs_needed": 1, "block_number": 242, "l1_block_number": 20973882, - "mana_spent": 98704668, - "size_in_fields": 3615, + "mana_spent": 61312654, + "size_in_fields": 2145, "slot_number": 242, "timestamp": 1729030535 }, "fee_header": { - "eth_per_fee_asset": 10627283, - "excess_mana": 1327330990, - "mana_used": 98704668 + "eth_per_fee_asset": 11356767, + "excess_mana": 1038222950, + "mana_used": 61312654 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": 67 }, "outputs": { - "eth_per_fee_asset_at_execution": 10638986, + "eth_per_fee_asset_at_execution": 11281184, "l1_fee_oracle_output": { "base_fee": 9576566258, "blob_fee": 7136 @@ -25058,22 +25058,22 @@ "slot_of_change": 240 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74319386264819, - "congestion_multiplier": 4725518354, - "prover_cost": 17248317461834, - "sequencer_cost": 2700419664055 + "congestion_cost": 83738872178665, + "congestion_multiplier": 5051209929, + "prover_cost": 17274497162710, + "sequencer_cost": 3395592430724 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790682910, - "congestion_multiplier": 4725518354, - "prover_cost": 183504608, - "sequencer_cost": 28729727 + "congestion_cost": 944673625, + "congestion_multiplier": 5051209929, + "prover_cost": 194876781, + "sequencer_cost": 38306303 } }, "parent_fee_header": { - "eth_per_fee_asset": 10638986, - "excess_mana": 1304822470, - "mana_used": 122508520 + "eth_per_fee_asset": 11281184, + "excess_mana": 1027026209, + "mana_used": 86196741 } }, { @@ -25081,21 +25081,21 @@ "blobs_needed": 1, "block_number": 243, "l1_block_number": 20973885, - "mana_spent": 91757685, - "size_in_fields": 3225, + "mana_spent": 79096203, + "size_in_fields": 2550, "slot_number": 243, "timestamp": 1729030571 }, "fee_header": { - "eth_per_fee_asset": 10611342, - "excess_mana": 1326035658, - "mana_used": 91757685 + "eth_per_fee_asset": 11334053, + "excess_mana": 1024535604, + "mana_used": 79096203 }, "oracle_input": { - "fee_asset_price_modifier": -15 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10627283, + "eth_per_fee_asset_at_execution": 11356767, "l1_fee_oracle_output": { "base_fee": 9576566258, "blob_fee": 7136 @@ -25112,22 +25112,22 @@ "slot_of_change": 245 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74258312402145, - "congestion_multiplier": 4718362073, - "prover_cost": 17267311691992, - "sequencer_cost": 2703393426147 + "congestion_cost": 80990507685859, + "congestion_multiplier": 4944498502, + "prover_cost": 17159529732362, + "sequencer_cost": 3372993652155 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789164101, - "congestion_multiplier": 4718362073, - "prover_cost": 183504608, - "sequencer_cost": 28729727 + "congestion_cost": 919790325, + "congestion_multiplier": 4944498502, + "prover_cost": 194876781, + "sequencer_cost": 38306303 } }, "parent_fee_header": { - "eth_per_fee_asset": 10627283, - "excess_mana": 1327330990, - "mana_used": 98704668 + "eth_per_fee_asset": 11356767, + "excess_mana": 1038222950, + "mana_used": 61312654 } }, { @@ -25135,21 +25135,21 @@ "blobs_needed": 1, "block_number": 244, "l1_block_number": 20973888, - "mana_spent": 91842062, - "size_in_fields": 3375, + "mana_spent": 77256345, + "size_in_fields": 2655, "slot_number": 244, "timestamp": 1729030607 }, "fee_header": { - "eth_per_fee_asset": 10634686, - "excess_mana": 1317793343, - "mana_used": 91842062 + "eth_per_fee_asset": 11324985, + "excess_mana": 1028631807, + "mana_used": 77256345 }, "oracle_input": { - "fee_asset_price_modifier": 22 + "fee_asset_price_modifier": -8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10611342, + "eth_per_fee_asset_at_execution": 11334053, "l1_fee_oracle_output": { "base_fee": 9576566258, "blob_fee": 7136 @@ -25166,22 +25166,22 @@ "slot_of_change": 245 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73464178329188, - "congestion_multiplier": 4673079202, - "prover_cost": 17293251692388, - "sequencer_cost": 2707454627323 + "congestion_cost": 81804938004084, + "congestion_multiplier": 4976195391, + "prover_cost": 17193918274425, + "sequencer_cost": 3379753297431 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779553521, - "congestion_multiplier": 4673079202, - "prover_cost": 183504608, - "sequencer_cost": 28729727 + "congestion_cost": 927181503, + "congestion_multiplier": 4976195391, + "prover_cost": 194876781, + "sequencer_cost": 38306303 } }, "parent_fee_header": { - "eth_per_fee_asset": 10611342, - "excess_mana": 1326035658, - "mana_used": 91757685 + "eth_per_fee_asset": 11334053, + "excess_mana": 1024535604, + "mana_used": 79096203 } }, { @@ -25189,21 +25189,21 @@ "blobs_needed": 1, "block_number": 245, "l1_block_number": 20973891, - "mana_spent": 107804607, - "size_in_fields": 3780, + "mana_spent": 66955036, + "size_in_fields": 2415, "slot_number": 245, "timestamp": 1729030643 }, "fee_header": { - "eth_per_fee_asset": 10654891, - "excess_mana": 1309635405, - "mana_used": 107804607 + "eth_per_fee_asset": 11358959, + "excess_mana": 1030888152, + "mana_used": 66955036 }, "oracle_input": { - "fee_asset_price_modifier": 19 + "fee_asset_price_modifier": 30 }, "outputs": { - "eth_per_fee_asset_at_execution": 10634686, + "eth_per_fee_asset_at_execution": 11324985, "l1_fee_oracle_output": { "base_fee": 10292621866, "blob_fee": 6597 @@ -25220,22 +25220,22 @@ "slot_of_change": 245 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73226342084760, - "congestion_multiplier": 4628687844, - "prover_cost": 17276332935453, - "sequencer_cost": 2903507635299 + "congestion_cost": 83620563824147, + "congestion_multiplier": 4993741955, + "prover_cost": 17302527464717, + "sequencer_cost": 3635371084377 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778739155, - "congestion_multiplier": 4628687844, - "prover_cost": 183728376, - "sequencer_cost": 30877892 + "congestion_cost": 947001631, + "congestion_multiplier": 4993741955, + "prover_cost": 195950864, + "sequencer_cost": 41170523 } }, "parent_fee_header": { - "eth_per_fee_asset": 10634686, - "excess_mana": 1317793343, - "mana_used": 91842062 + "eth_per_fee_asset": 11324985, + "excess_mana": 1028631807, + "mana_used": 77256345 } }, { @@ -25243,21 +25243,21 @@ "blobs_needed": 1, "block_number": 246, "l1_block_number": 20973894, - "mana_spent": 109924047, - "size_in_fields": 3525, + "mana_spent": 73260965, + "size_in_fields": 2595, "slot_number": 246, "timestamp": 1729030679 }, "fee_header": { - "eth_per_fee_asset": 10633581, - "excess_mana": 1317440012, - "mana_used": 109924047 + "eth_per_fee_asset": 11319202, + "excess_mana": 1022843188, + "mana_used": 73260965 }, "oracle_input": { - "fee_asset_price_modifier": -20 + "fee_asset_price_modifier": -35 }, "outputs": { - "eth_per_fee_asset_at_execution": 10654891, + "eth_per_fee_asset_at_execution": 11358959, "l1_fee_oracle_output": { "base_fee": 10292621866, "blob_fee": 6597 @@ -25274,22 +25274,22 @@ "slot_of_change": 245 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73942691670896, - "congestion_multiplier": 4671147763, - "prover_cost": 17243571614201, - "sequencer_cost": 2898001678291 + "congestion_cost": 82070336022870, + "congestion_multiplier": 4931461408, + "prover_cost": 17250776589651, + "sequencer_cost": 3624497896331 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787851320, - "congestion_multiplier": 4671147763, - "prover_cost": 183728376, - "sequencer_cost": 30877892 + "congestion_cost": 932233582, + "congestion_multiplier": 4931461408, + "prover_cost": 195950864, + "sequencer_cost": 41170523 } }, "parent_fee_header": { - "eth_per_fee_asset": 10654891, - "excess_mana": 1309635405, - "mana_used": 107804607 + "eth_per_fee_asset": 11358959, + "excess_mana": 1030888152, + "mana_used": 66955036 } }, { @@ -25297,21 +25297,21 @@ "blobs_needed": 1, "block_number": 247, "l1_block_number": 20973897, - "mana_spent": 100081103, - "size_in_fields": 3390, + "mana_spent": 79115204, + "size_in_fields": 2730, "slot_number": 247, "timestamp": 1729030715 }, "fee_header": { - "eth_per_fee_asset": 10678242, - "excess_mana": 1327364059, - "mana_used": 100081103 + "eth_per_fee_asset": 11289772, + "excess_mana": 1021104153, + "mana_used": 79115204 }, "oracle_input": { - "fee_asset_price_modifier": 42 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 10633581, + "eth_per_fee_asset_at_execution": 11319202, "l1_fee_oracle_output": { "base_fee": 10292621866, "blob_fee": 6597 @@ -25328,22 +25328,22 @@ "slot_of_change": 245 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75191868853964, - "congestion_multiplier": 4725701191, - "prover_cost": 17278128224161, - "sequencer_cost": 2903809356416 + "congestion_cost": 82078714029488, + "congestion_multiplier": 4918101004, + "prover_cost": 17311367356109, + "sequencer_cost": 3637228401791 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799558828, - "congestion_multiplier": 4725701191, - "prover_cost": 183728376, - "sequencer_cost": 30877892 + "congestion_cost": 929065544, + "congestion_multiplier": 4918101004, + "prover_cost": 195950864, + "sequencer_cost": 41170523 } }, "parent_fee_header": { - "eth_per_fee_asset": 10633581, - "excess_mana": 1317440012, - "mana_used": 109924047 + "eth_per_fee_asset": 11319202, + "excess_mana": 1022843188, + "mana_used": 73260965 } }, { @@ -25351,21 +25351,21 @@ "blobs_needed": 1, "block_number": 248, "l1_block_number": 20973900, - "mana_spent": 87503685, - "size_in_fields": 3315, + "mana_spent": 60042890, + "size_in_fields": 2310, "slot_number": 248, "timestamp": 1729030751 }, "fee_header": { - "eth_per_fee_asset": 10712412, - "excess_mana": 1327445162, - "mana_used": 87503685 + "eth_per_fee_asset": 11305577, + "excess_mana": 1025219357, + "mana_used": 60042890 }, "oracle_input": { - "fee_asset_price_modifier": 32 + "fee_asset_price_modifier": 14 }, "outputs": { - "eth_per_fee_asset_at_execution": 10678242, + "eth_per_fee_asset_at_execution": 11289772, "l1_fee_oracle_output": { "base_fee": 10292621866, "blob_fee": 6597 @@ -25382,22 +25382,22 @@ "slot_of_change": 250 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74886396749578, - "congestion_multiplier": 4726149637, - "prover_cost": 17205863661828, - "sequencer_cost": 2891664376964 + "congestion_cost": 82957939097442, + "congestion_multiplier": 4949775388, + "prover_cost": 17356494356131, + "sequencer_cost": 3646709871555 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799655067, - "congestion_multiplier": 4726149637, - "prover_cost": 183728376, - "sequencer_cost": 30877892 + "congestion_cost": 936576218, + "congestion_multiplier": 4949775388, + "prover_cost": 195950864, + "sequencer_cost": 41170523 } }, "parent_fee_header": { - "eth_per_fee_asset": 10678242, - "excess_mana": 1327364059, - "mana_used": 100081103 + "eth_per_fee_asset": 11289772, + "excess_mana": 1021104153, + "mana_used": 79115204 } }, { @@ -25405,21 +25405,21 @@ "blobs_needed": 1, "block_number": 249, "l1_block_number": 20973903, - "mana_spent": 115103975, - "size_in_fields": 4035, + "mana_spent": 76162995, + "size_in_fields": 2805, "slot_number": 249, "timestamp": 1729030787 }, "fee_header": { - "eth_per_fee_asset": 10605287, - "excess_mana": 1314948847, - "mana_used": 115103975 + "eth_per_fee_asset": 11340624, + "excess_mana": 1010262247, + "mana_used": 76162995 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 31 }, "outputs": { - "eth_per_fee_asset_at_execution": 10712412, + "eth_per_fee_asset_at_execution": 11305577, "l1_fee_oracle_output": { "base_fee": 10292621866, "blob_fee": 6597 @@ -25436,22 +25436,22 @@ "slot_of_change": 250 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73273297180878, - "congestion_multiplier": 4657552763, - "prover_cost": 17150981123579, - "sequencer_cost": 2882440667891 + "congestion_cost": 80447663396570, + "congestion_multiplier": 4835618817, + "prover_cost": 17332230278915, + "sequencer_cost": 3641611834584 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784933748, - "congestion_multiplier": 4657552763, - "prover_cost": 183728376, - "sequencer_cost": 30877892 + "congestion_cost": 909507253, + "congestion_multiplier": 4835618817, + "prover_cost": 195950864, + "sequencer_cost": 41170523 } }, "parent_fee_header": { - "eth_per_fee_asset": 10712412, - "excess_mana": 1327445162, - "mana_used": 87503685 + "eth_per_fee_asset": 11305577, + "excess_mana": 1025219357, + "mana_used": 60042890 } }, { @@ -25459,21 +25459,21 @@ "blobs_needed": 1, "block_number": 250, "l1_block_number": 20973906, - "mana_spent": 9792590, - "size_in_fields": 315, + "mana_spent": 96754558, + "size_in_fields": 3375, "slot_number": 250, "timestamp": 1729030823 }, "fee_header": { - "eth_per_fee_asset": 10554381, - "excess_mana": 1330052822, - "mana_used": 9792590 + "eth_per_fee_asset": 11366707, + "excess_mana": 1011425242, + "mana_used": 96754558 }, "oracle_input": { - "fee_asset_price_modifier": -48 + "fee_asset_price_modifier": 23 }, "outputs": { - "eth_per_fee_asset_at_execution": 10605287, + "eth_per_fee_asset_at_execution": 11340624, "l1_fee_oracle_output": { "base_fee": 9901212132, "blob_fee": 4455 @@ -25490,44 +25490,44 @@ "slot_of_change": 250 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 75236472808327, - "congestion_multiplier": 4740590959, - "prover_cost": 17312691301990, - "sequencer_cost": 2800834527157 + "congestion_cost": 79652878801026, + "congestion_multiplier": 4844399909, + "prover_cost": 17226895980328, + "sequencer_cost": 3492300952752 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797904387, - "congestion_multiplier": 4740590959, - "prover_cost": 183606060, - "sequencer_cost": 29703654 + "congestion_cost": 903313349, + "congestion_multiplier": 4844399909, + "prover_cost": 195363750, + "sequencer_cost": 39604872 } }, "parent_fee_header": { - "eth_per_fee_asset": 10605287, - "excess_mana": 1314948847, - "mana_used": 115103975 + "eth_per_fee_asset": 11340624, + "excess_mana": 1010262247, + "mana_used": 76162995 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 251, "l1_block_number": 20973909, - "mana_spent": 161197363, - "size_in_fields": 5535, + "mana_spent": 69921577, + "size_in_fields": 2340, "slot_number": 251, "timestamp": 1729030859 }, "fee_header": { - "eth_per_fee_asset": 10627206, - "excess_mana": 1239845412, - "mana_used": 161197363 + "eth_per_fee_asset": 11355340, + "excess_mana": 1033179800, + "mana_used": 69921577 }, "oracle_input": { - "fee_asset_price_modifier": 69 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 10554381, + "eth_per_fee_asset_at_execution": 11366707, "l1_fee_oracle_output": { "base_fee": 9901212132, "blob_fee": 4455 @@ -25544,44 +25544,44 @@ "slot_of_change": 250 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66002659464350, - "congestion_multiplier": 4265754768, - "prover_cost": 17396194054394, - "sequencer_cost": 2814343541322 + "congestion_cost": 82926948323732, + "congestion_multiplier": 5011626387, + "prover_cost": 17187365698791, + "sequencer_cost": 3484287225843 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 696617215, - "congestion_multiplier": 4265754768, - "prover_cost": 183606060, - "sequencer_cost": 29703654 + "congestion_cost": 942606324, + "congestion_multiplier": 5011626387, + "prover_cost": 195363750, + "sequencer_cost": 39604872 } }, "parent_fee_header": { - "eth_per_fee_asset": 10554381, - "excess_mana": 1330052822, - "mana_used": 9792590 + "eth_per_fee_asset": 11366707, + "excess_mana": 1011425242, + "mana_used": 96754558 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 252, "l1_block_number": 20973912, - "mana_spent": 123209269, - "size_in_fields": 4230, + "mana_spent": 68286882, + "size_in_fields": 2610, "slot_number": 252, "timestamp": 1729030895 }, "fee_header": { - "eth_per_fee_asset": 10550690, - "excess_mana": 1301042775, - "mana_used": 123209269 + "eth_per_fee_asset": 11345120, + "excess_mana": 1028101377, + "mana_used": 68286882 }, "oracle_input": { - "fee_asset_price_modifier": -72 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10627206, + "eth_per_fee_asset_at_execution": 11355340, "l1_fee_oracle_output": { "base_fee": 9901212132, "blob_fee": 4455 @@ -25598,22 +25598,22 @@ "slot_of_change": 250 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71905819083587, - "congestion_multiplier": 4582387030, - "prover_cost": 17276983244703, - "sequencer_cost": 2795057703785 + "congestion_cost": 82191641289473, + "congestion_multiplier": 4972079438, + "prover_cost": 17204570712987, + "sequencer_cost": 3487775090839 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 764157952, - "congestion_multiplier": 4582387030, - "prover_cost": 183606060, - "sequencer_cost": 29703654 + "congestion_cost": 933314032, + "congestion_multiplier": 4972079438, + "prover_cost": 195363750, + "sequencer_cost": 39604872 } }, "parent_fee_header": { - "eth_per_fee_asset": 10627206, - "excess_mana": 1239845412, - "mana_used": 161197363 + "eth_per_fee_asset": 11355340, + "excess_mana": 1033179800, + "mana_used": 69921577 } }, { @@ -25621,21 +25621,21 @@ "blobs_needed": 1, "block_number": 253, "l1_block_number": 20973915, - "mana_spent": 91844987, - "size_in_fields": 3240, + "mana_spent": 84549808, + "size_in_fields": 2955, "slot_number": 253, "timestamp": 1729030931 }, "fee_header": { - "eth_per_fee_asset": 10607663, - "excess_mana": 1324252044, - "mana_used": 91844987 + "eth_per_fee_asset": 11399576, + "excess_mana": 1021388259, + "mana_used": 84549808 }, "oracle_input": { - "fee_asset_price_modifier": 54 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 10550690, + "eth_per_fee_asset_at_execution": 11345120, "l1_fee_oracle_output": { "base_fee": 9901212132, "blob_fee": 4455 @@ -25652,22 +25652,22 @@ "slot_of_change": 255 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74977523270990, - "congestion_multiplier": 4708525928, - "prover_cost": 17402279850892, - "sequencer_cost": 2815328097025 + "congestion_cost": 81192889453792, + "congestion_multiplier": 4920281215, + "prover_cost": 17220069069345, + "sequencer_cost": 3490916975757 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791064605, - "congestion_multiplier": 4708525928, - "prover_cost": 183606060, - "sequencer_cost": 29703654 + "congestion_cost": 921143074, + "congestion_multiplier": 4920281215, + "prover_cost": 195363750, + "sequencer_cost": 39604872 } }, "parent_fee_header": { - "eth_per_fee_asset": 10550690, - "excess_mana": 1301042775, - "mana_used": 123209269 + "eth_per_fee_asset": 11345120, + "excess_mana": 1028101377, + "mana_used": 68286882 } }, { @@ -25675,21 +25675,21 @@ "blobs_needed": 1, "block_number": 254, "l1_block_number": 20973918, - "mana_spent": 94063213, - "size_in_fields": 3300, + "mana_spent": 73180483, + "size_in_fields": 2505, "slot_number": 254, "timestamp": 1729030967 }, "fee_header": { - "eth_per_fee_asset": 10557806, - "excess_mana": 1316097031, - "mana_used": 94063213 + "eth_per_fee_asset": 11513571, + "excess_mana": 1030938067, + "mana_used": 73180483 }, "oracle_input": { - "fee_asset_price_modifier": -47 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10607663, + "eth_per_fee_asset_at_execution": 11399576, "l1_fee_oracle_output": { "base_fee": 9901212132, "blob_fee": 4455 @@ -25706,22 +25706,22 @@ "slot_of_change": 255 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73675707363630, - "congestion_multiplier": 4663813809, - "prover_cost": 17308813449297, - "sequencer_cost": 2800207170986 + "congestion_cost": 82327221117698, + "congestion_multiplier": 4994130820, + "prover_cost": 17137808458841, + "sequencer_cost": 3474240796325 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781527075, - "congestion_multiplier": 4663813809, - "prover_cost": 183606060, - "sequencer_cost": 29703654 + "congestion_cost": 938495414, + "congestion_multiplier": 4994130820, + "prover_cost": 195363750, + "sequencer_cost": 39604872 } }, "parent_fee_header": { - "eth_per_fee_asset": 10607663, - "excess_mana": 1324252044, - "mana_used": 91844987 + "eth_per_fee_asset": 11399576, + "excess_mana": 1021388259, + "mana_used": 84549808 } }, { @@ -25729,21 +25729,21 @@ "blobs_needed": 1, "block_number": 255, "l1_block_number": 20973921, - "mana_spent": 102404930, - "size_in_fields": 3585, + "mana_spent": 68238166, + "size_in_fields": 2430, "slot_number": 255, "timestamp": 1729031003 }, "fee_header": { - "eth_per_fee_asset": 10663384, - "excess_mana": 1310160244, - "mana_used": 102404930 + "eth_per_fee_asset": 11505511, + "excess_mana": 1029118550, + "mana_used": 68238166 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 10557806, + "eth_per_fee_asset_at_execution": 11513571, "l1_fee_oracle_output": { "base_fee": 10452785121, "blob_fee": 6343 @@ -25760,22 +25760,22 @@ "slot_of_change": 255 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73999843433381, - "congestion_multiplier": 4631531017, - "prover_cost": 17406876674946, - "sequencer_cost": 2970160751202 + "congestion_cost": 82271887496938, + "congestion_multiplier": 4979975346, + "prover_cost": 17039987767479, + "sequencer_cost": 3631468811892 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781275991, - "congestion_multiplier": 4631531017, - "prover_cost": 183778427, - "sequencer_cost": 31358381 + "congestion_cost": 947243218, + "congestion_multiplier": 4979975346, + "prover_cost": 196191109, + "sequencer_cost": 41811174 } }, "parent_fee_header": { - "eth_per_fee_asset": 10557806, - "excess_mana": 1316097031, - "mana_used": 94063213 + "eth_per_fee_asset": 11513571, + "excess_mana": 1030938067, + "mana_used": 73180483 } }, { @@ -25783,21 +25783,21 @@ "blobs_needed": 1, "block_number": 256, "l1_block_number": 20973924, - "mana_spent": 103591232, - "size_in_fields": 3570, + "mana_spent": 76718479, + "size_in_fields": 2730, "slot_number": 256, "timestamp": 1729031039 }, "fee_header": { - "eth_per_fee_asset": 10760420, - "excess_mana": 1312565174, - "mana_used": 103591232 + "eth_per_fee_asset": 11485951, + "excess_mana": 1022356716, + "mana_used": 76718479 }, "oracle_input": { - "fee_asset_price_modifier": 91 + "fee_asset_price_modifier": -17 }, "outputs": { - "eth_per_fee_asset_at_execution": 10663384, + "eth_per_fee_asset_at_execution": 11505511, "l1_fee_oracle_output": { "base_fee": 10452785121, "blob_fee": 6343 @@ -25814,22 +25814,22 @@ "slot_of_change": 255 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73530467720191, - "congestion_multiplier": 4644581423, - "prover_cost": 17234531458307, - "sequencer_cost": 2940753235559 + "congestion_cost": 81248578355190, + "congestion_multiplier": 4927720360, + "prover_cost": 17051924855837, + "sequencer_cost": 3634012778746 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784083613, - "congestion_multiplier": 4644581423, - "prover_cost": 183778427, - "sequencer_cost": 31358381 + "congestion_cost": 934806412, + "congestion_multiplier": 4927720360, + "prover_cost": 196191109, + "sequencer_cost": 41811174 } }, "parent_fee_header": { - "eth_per_fee_asset": 10663384, - "excess_mana": 1310160244, - "mana_used": 102404930 + "eth_per_fee_asset": 11505511, + "excess_mana": 1029118550, + "mana_used": 68238166 } }, { @@ -25837,21 +25837,21 @@ "blobs_needed": 1, "block_number": 257, "l1_block_number": 20973927, - "mana_spent": 96578113, - "size_in_fields": 3435, + "mana_spent": 80045489, + "size_in_fields": 2925, "slot_number": 257, "timestamp": 1729031075 }, "fee_header": { - "eth_per_fee_asset": 10748583, - "excess_mana": 1316156406, - "mana_used": 96578113 + "eth_per_fee_asset": 11535340, + "excess_mana": 1024075195, + "mana_used": 80045489 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": 43 }, "outputs": { - "eth_per_fee_asset_at_execution": 10760420, + "eth_per_fee_asset_at_execution": 11485951, "l1_fee_oracle_output": { "base_fee": 10452785121, "blob_fee": 6343 @@ -25868,22 +25868,22 @@ "slot_of_change": 255 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73258377646970, - "congestion_multiplier": 4664137810, - "prover_cost": 17079112804148, - "sequencer_cost": 2914233923955 + "congestion_cost": 81661042085240, + "congestion_multiplier": 4940948450, + "prover_cost": 17080963430891, + "sequencer_cost": 3640201320727 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788290912, - "congestion_multiplier": 4664137810, - "prover_cost": 183778427, - "sequencer_cost": 31358381 + "congestion_cost": 937954728, + "congestion_multiplier": 4940948450, + "prover_cost": 196191109, + "sequencer_cost": 41811174 } }, "parent_fee_header": { - "eth_per_fee_asset": 10760420, - "excess_mana": 1312565174, - "mana_used": 103591232 + "eth_per_fee_asset": 11485951, + "excess_mana": 1022356716, + "mana_used": 76718479 } }, { @@ -25891,21 +25891,21 @@ "blobs_needed": 1, "block_number": 258, "l1_block_number": 20973930, - "mana_spent": 108438991, - "size_in_fields": 3840, + "mana_spent": 64634300, + "size_in_fields": 2250, "slot_number": 258, "timestamp": 1729031111 }, "fee_header": { - "eth_per_fee_asset": 10759331, - "excess_mana": 1312734519, - "mana_used": 108438991 + "eth_per_fee_asset": 11544568, + "excess_mana": 1029120684, + "mana_used": 64634300 }, "oracle_input": { - "fee_asset_price_modifier": 10 + "fee_asset_price_modifier": 8 }, "outputs": { - "eth_per_fee_asset_at_execution": 10748583, + "eth_per_fee_asset_at_execution": 11535340, "l1_fee_oracle_output": { "base_fee": 10452785121, "blob_fee": 6343 @@ -25922,22 +25922,22 @@ "slot_of_change": 260 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72966046966377, - "congestion_multiplier": 4645501762, - "prover_cost": 17097921372520, - "sequencer_cost": 2917443257405 + "congestion_cost": 82116969590840, + "congestion_multiplier": 4979991925, + "prover_cost": 17007830631781, + "sequencer_cost": 3624615659357 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784281612, - "congestion_multiplier": 4645501762, - "prover_cost": 183778427, - "sequencer_cost": 31358381 + "congestion_cost": 947247164, + "congestion_multiplier": 4979991925, + "prover_cost": 196191109, + "sequencer_cost": 41811174 } }, "parent_fee_header": { - "eth_per_fee_asset": 10748583, - "excess_mana": 1316156406, - "mana_used": 96578113 + "eth_per_fee_asset": 11535340, + "excess_mana": 1024075195, + "mana_used": 80045489 } }, { @@ -25945,21 +25945,21 @@ "blobs_needed": 1, "block_number": 259, "l1_block_number": 20973933, - "mana_spent": 98425823, - "size_in_fields": 3360, + "mana_spent": 86571643, + "size_in_fields": 2760, "slot_number": 259, "timestamp": 1729031147 }, "fee_header": { - "eth_per_fee_asset": 10786229, - "excess_mana": 1321173510, - "mana_used": 98425823 + "eth_per_fee_asset": 11521478, + "excess_mana": 1018754984, + "mana_used": 86571643 }, "oracle_input": { - "fee_asset_price_modifier": 25 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 10759331, + "eth_per_fee_asset_at_execution": 11544568, "l1_fee_oracle_output": { "base_fee": 10452785121, "blob_fee": 6343 @@ -25976,22 +25976,22 @@ "slot_of_change": 260 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73814846480697, - "congestion_multiplier": 4691596867, - "prover_cost": 17080841457522, - "sequencer_cost": 2914528886601 + "congestion_cost": 80404500887344, + "congestion_multiplier": 4900110606, + "prover_cost": 16994235643985, + "sequencer_cost": 3621718370060 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794198366, - "congestion_multiplier": 4691596867, - "prover_cost": 183778427, - "sequencer_cost": 31358381 + "congestion_cost": 928235228, + "congestion_multiplier": 4900110606, + "prover_cost": 196191109, + "sequencer_cost": 41811174 } }, "parent_fee_header": { - "eth_per_fee_asset": 10759331, - "excess_mana": 1312734519, - "mana_used": 108438991 + "eth_per_fee_asset": 11544568, + "excess_mana": 1029120684, + "mana_used": 64634300 } }, { @@ -25999,21 +25999,21 @@ "blobs_needed": 1, "block_number": 260, "l1_block_number": 20973936, - "mana_spent": 94412365, - "size_in_fields": 3225, + "mana_spent": 72881279, + "size_in_fields": 2625, "slot_number": 260, "timestamp": 1729031183 }, "fee_header": { - "eth_per_fee_asset": 10808880, - "excess_mana": 1319599333, - "mana_used": 94412365 + "eth_per_fee_asset": 11636692, + "excess_mana": 1030326627, + "mana_used": 72881279 }, "oracle_input": { - "fee_asset_price_modifier": 21 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 10786229, + "eth_per_fee_asset_at_execution": 11521478, "l1_fee_oracle_output": { "base_fee": 9360808968, "blob_fee": 4455 @@ -26030,22 +26030,22 @@ "slot_of_change": 260 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72223495069501, - "congestion_multiplier": 4682963897, - "prover_cost": 17006609446175, - "sequencer_cost": 2603546151301 + "congestion_cost": 80329917047102, + "congestion_multiplier": 4989369458, + "prover_cost": 16886127370117, + "sequencer_cost": 3249866032813 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779019157, - "congestion_multiplier": 4682963897, - "prover_cost": 183437184, - "sequencer_cost": 28082445 + "congestion_cost": 925519372, + "congestion_multiplier": 4989369458, + "prover_cost": 194553145, + "sequencer_cost": 37443260 } }, "parent_fee_header": { - "eth_per_fee_asset": 10786229, - "excess_mana": 1321173510, - "mana_used": 98425823 + "eth_per_fee_asset": 11521478, + "excess_mana": 1018754984, + "mana_used": 86571643 } }, { @@ -26053,21 +26053,21 @@ "blobs_needed": 1, "block_number": 261, "l1_block_number": 20973939, - "mana_spent": 97637838, - "size_in_fields": 3555, + "mana_spent": 70922762, + "size_in_fields": 2310, "slot_number": 261, "timestamp": 1729031219 }, "fee_header": { - "eth_per_fee_asset": 10852115, - "excess_mana": 1314011698, - "mana_used": 97637838 + "eth_per_fee_asset": 11651819, + "excess_mana": 1028207906, + "mana_used": 70922762 }, "oracle_input": { - "fee_asset_price_modifier": 40 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 10808880, + "eth_per_fee_asset_at_execution": 11636692, "l1_fee_oracle_output": { "base_fee": 9360808968, "blob_fee": 4455 @@ -26084,22 +26084,22 @@ "slot_of_change": 260 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71474990748348, - "congestion_multiplier": 4652448722, - "prover_cost": 16970970535338, - "sequencer_cost": 2598090181407 + "congestion_cost": 79206346700592, + "congestion_multiplier": 4972905793, + "prover_cost": 16718939110875, + "sequencer_cost": 3217689357079 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772564598, - "congestion_multiplier": 4652448722, - "prover_cost": 183437184, - "sequencer_cost": 28082445 + "congestion_cost": 921699861, + "congestion_multiplier": 4972905793, + "prover_cost": 194553145, + "sequencer_cost": 37443260 } }, "parent_fee_header": { - "eth_per_fee_asset": 10808880, - "excess_mana": 1319599333, - "mana_used": 94412365 + "eth_per_fee_asset": 11636692, + "excess_mana": 1030326627, + "mana_used": 72881279 } }, { @@ -26107,21 +26107,21 @@ "blobs_needed": 1, "block_number": 262, "l1_block_number": 20973942, - "mana_spent": 105601965, - "size_in_fields": 3750, + "mana_spent": 75777203, + "size_in_fields": 2835, "slot_number": 262, "timestamp": 1729031255 }, "fee_header": { - "eth_per_fee_asset": 10858626, - "excess_mana": 1311649536, - "mana_used": 105601965 + "eth_per_fee_asset": 11715904, + "excess_mana": 1024130668, + "mana_used": 75777203 }, "oracle_input": { - "fee_asset_price_modifier": 6 + "fee_asset_price_modifier": 55 }, "outputs": { - "eth_per_fee_asset_at_execution": 10852115, + "eth_per_fee_asset_at_execution": 11651819, "l1_fee_oracle_output": { "base_fee": 9360808968, "blob_fee": 4455 @@ -26138,22 +26138,22 @@ "slot_of_change": 260 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70939960551469, - "congestion_multiplier": 4639608364, - "prover_cost": 16903357916867, - "sequencer_cost": 2587739348505 + "congestion_cost": 78475736106097, + "congestion_multiplier": 4941376047, + "prover_cost": 16697233710891, + "sequencer_cost": 3213511984696 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 769848610, - "congestion_multiplier": 4639608364, - "prover_cost": 183437184, - "sequencer_cost": 28082445 + "congestion_cost": 914385073, + "congestion_multiplier": 4941376047, + "prover_cost": 194553145, + "sequencer_cost": 37443260 } }, "parent_fee_header": { - "eth_per_fee_asset": 10852115, - "excess_mana": 1314011698, - "mana_used": 97637838 + "eth_per_fee_asset": 11651819, + "excess_mana": 1028207906, + "mana_used": 70922762 } }, { @@ -26161,21 +26161,21 @@ "blobs_needed": 1, "block_number": 263, "l1_block_number": 20973945, - "mana_spent": 105564835, - "size_in_fields": 3930, + "mana_spent": 74846774, + "size_in_fields": 2655, "slot_number": 263, "timestamp": 1729031291 }, "fee_header": { - "eth_per_fee_asset": 10908575, - "excess_mana": 1317251501, - "mana_used": 105564835 + "eth_per_fee_asset": 11736992, + "excess_mana": 1024907871, + "mana_used": 74846774 }, "oracle_input": { - "fee_asset_price_modifier": 46 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 10858626, + "eth_per_fee_asset_at_execution": 11715904, "l1_fee_oracle_output": { "base_fee": 9360808968, "blob_fee": 4455 @@ -26192,22 +26192,22 @@ "slot_of_change": 265 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71491726117099, - "congestion_multiplier": 4670117618, - "prover_cost": 16893222402172, - "sequencer_cost": 2586187699991 + "congestion_cost": 78165187338511, + "congestion_multiplier": 4947370786, + "prover_cost": 16605901260373, + "sequencer_cost": 3195934347021 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776301916, - "congestion_multiplier": 4670117618, - "prover_cost": 183437184, - "sequencer_cost": 28082445 + "congestion_cost": 915775831, + "congestion_multiplier": 4947370786, + "prover_cost": 194553145, + "sequencer_cost": 37443260 } }, "parent_fee_header": { - "eth_per_fee_asset": 10858626, - "excess_mana": 1311649536, - "mana_used": 105601965 + "eth_per_fee_asset": 11715904, + "excess_mana": 1024130668, + "mana_used": 75777203 } }, { @@ -26215,21 +26215,21 @@ "blobs_needed": 1, "block_number": 264, "l1_block_number": 20973948, - "mana_spent": 99814471, - "size_in_fields": 3615, + "mana_spent": 83230923, + "size_in_fields": 2940, "slot_number": 264, "timestamp": 1729031327 }, "fee_header": { - "eth_per_fee_asset": 10927119, - "excess_mana": 1322816336, - "mana_used": 99814471 + "eth_per_fee_asset": 11732297, + "excess_mana": 1024754645, + "mana_used": 83230923 }, "oracle_input": { - "fee_asset_price_modifier": 17 + "fee_asset_price_modifier": -4 }, "outputs": { - "eth_per_fee_asset_at_execution": 10908575, + "eth_per_fee_asset_at_execution": 11736992, "l1_fee_oracle_output": { "base_fee": 9360808968, "blob_fee": 4455 @@ -26246,22 +26246,22 @@ "slot_of_change": 265 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71755885988775, - "congestion_multiplier": 4700623287, - "prover_cost": 16815870450541, - "sequencer_cost": 2574345870107 + "congestion_cost": 78001374542984, + "congestion_multiplier": 4946188345, + "prover_cost": 16576065230342, + "sequencer_cost": 3190192171896 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782754464, - "congestion_multiplier": 4700623287, - "prover_cost": 183437184, - "sequencer_cost": 28082445 + "congestion_cost": 915501509, + "congestion_multiplier": 4946188345, + "prover_cost": 194553145, + "sequencer_cost": 37443260 } }, "parent_fee_header": { - "eth_per_fee_asset": 10908575, - "excess_mana": 1317251501, - "mana_used": 105564835 + "eth_per_fee_asset": 11736992, + "excess_mana": 1024907871, + "mana_used": 74846774 } }, { @@ -26269,21 +26269,21 @@ "blobs_needed": 1, "block_number": 265, "l1_block_number": 20973951, - "mana_spent": 110102294, - "size_in_fields": 3810, + "mana_spent": 80652066, + "size_in_fields": 2700, "slot_number": 265, "timestamp": 1729031363 }, "fee_header": { - "eth_per_fee_asset": 10920562, - "excess_mana": 1322630807, - "mana_used": 110102294 + "eth_per_fee_asset": 11744029, + "excess_mana": 1032985568, + "mana_used": 80652066 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 10927119, + "eth_per_fee_asset_at_execution": 11732297, "l1_fee_oracle_output": { "base_fee": 9631901056, "blob_fee": 5864 @@ -26300,22 +26300,22 @@ "slot_of_change": 265 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71918398802100, - "congestion_multiplier": 4699603039, - "prover_cost": 16795085786108, - "sequencer_cost": 2644404897577 + "congestion_cost": 79806177937705, + "congestion_multiplier": 5010108084, + "prover_cost": 16617358305880, + "sequencer_cost": 3283895302003 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785860902, - "congestion_multiplier": 4699603039, - "prover_cost": 183521901, - "sequencer_cost": 28895727 + "congestion_cost": 936309782, + "congestion_multiplier": 5010108084, + "prover_cost": 194959783, + "sequencer_cost": 38527635 } }, "parent_fee_header": { - "eth_per_fee_asset": 10927119, - "excess_mana": 1322816336, - "mana_used": 99814471 + "eth_per_fee_asset": 11732297, + "excess_mana": 1024754645, + "mana_used": 83230923 } }, { @@ -26323,21 +26323,21 @@ "blobs_needed": 1, "block_number": 266, "l1_block_number": 20973954, - "mana_spent": 97562701, - "size_in_fields": 3240, + "mana_spent": 62955305, + "size_in_fields": 2295, "slot_number": 266, "timestamp": 1729031399 }, "fee_header": { - "eth_per_fee_asset": 10956599, - "excess_mana": 1332733101, - "mana_used": 97562701 + "eth_per_fee_asset": 11733459, + "excess_mana": 1038637634, + "mana_used": 62955305 }, "oracle_input": { - "fee_asset_price_modifier": 33 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 10920562, + "eth_per_fee_asset_at_execution": 11744029, "l1_fee_oracle_output": { "base_fee": 9631901056, "blob_fee": 5864 @@ -26354,22 +26354,22 @@ "slot_of_change": 265 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73048460875915, - "congestion_multiplier": 4755480438, - "prover_cost": 16805170008650, - "sequencer_cost": 2645992669609 + "congestion_cost": 80608601273039, + "congestion_multiplier": 5054478649, + "prover_cost": 16600757968156, + "sequencer_cost": 3280614770281 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797730246, - "congestion_multiplier": 4755480438, - "prover_cost": 183521901, - "sequencer_cost": 28895727 + "congestion_cost": 946669751, + "congestion_multiplier": 5054478649, + "prover_cost": 194959783, + "sequencer_cost": 38527635 } }, "parent_fee_header": { - "eth_per_fee_asset": 10920562, - "excess_mana": 1322630807, - "mana_used": 110102294 + "eth_per_fee_asset": 11744029, + "excess_mana": 1032985568, + "mana_used": 80652066 } }, { @@ -26377,21 +26377,21 @@ "blobs_needed": 1, "block_number": 267, "l1_block_number": 20973957, - "mana_spent": 86663944, - "size_in_fields": 3375, + "mana_spent": 71235634, + "size_in_fields": 2580, "slot_number": 267, "timestamp": 1729031435 }, "fee_header": { - "eth_per_fee_asset": 10911676, - "excess_mana": 1330295802, - "mana_used": 86663944 + "eth_per_fee_asset": 11659538, + "excess_mana": 1026592939, + "mana_used": 71235634 }, "oracle_input": { - "fee_asset_price_modifier": -41 + "fee_asset_price_modifier": -63 }, "outputs": { - "eth_per_fee_asset_at_execution": 10956599, + "eth_per_fee_asset_at_execution": 11733459, "l1_fee_oracle_output": { "base_fee": 9631901056, "blob_fee": 5864 @@ -26408,22 +26408,22 @@ "slot_of_change": 265 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72545665949808, - "congestion_multiplier": 4741938837, - "prover_cost": 16749896660451, - "sequencer_cost": 2637289819588 + "congestion_cost": 78808981562897, + "congestion_multiplier": 4960393079, + "prover_cost": 16615712638533, + "sequencer_cost": 3283570087900 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794853771, - "congestion_multiplier": 4741938837, - "prover_cost": 183521901, - "sequencer_cost": 28895727 + "congestion_cost": 924701954, + "congestion_multiplier": 4960393079, + "prover_cost": 194959783, + "sequencer_cost": 38527635 } }, "parent_fee_header": { - "eth_per_fee_asset": 10956599, - "excess_mana": 1332733101, - "mana_used": 97562701 + "eth_per_fee_asset": 11733459, + "excess_mana": 1038637634, + "mana_used": 62955305 } }, { @@ -26431,21 +26431,21 @@ "blobs_needed": 1, "block_number": 268, "l1_block_number": 20973960, - "mana_spent": 108558096, - "size_in_fields": 3795, + "mana_spent": 76085240, + "size_in_fields": 2490, "slot_number": 268, "timestamp": 1729031471 }, "fee_header": { - "eth_per_fee_asset": 10866938, - "excess_mana": 1316959746, - "mana_used": 108558096 + "eth_per_fee_asset": 11638550, + "excess_mana": 1022828573, + "mana_used": 76085240 }, "oracle_input": { - "fee_asset_price_modifier": -41 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 10911676, + "eth_per_fee_asset_at_execution": 11659538, "l1_fee_oracle_output": { "base_fee": 9631901056, "blob_fee": 5864 @@ -26462,22 +26462,22 @@ "slot_of_change": 270 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71415161887139, - "congestion_multiplier": 4668523730, - "prover_cost": 16818855416895, - "sequencer_cost": 2648147452326 + "congestion_cost": 78727006250162, + "congestion_multiplier": 4931348975, + "prover_cost": 16721055585565, + "sequencer_cost": 3304387789637 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779259108, - "congestion_multiplier": 4668523730, - "prover_cost": 183521901, - "sequencer_cost": 28895727 + "congestion_cost": 917920521, + "congestion_multiplier": 4931348975, + "prover_cost": 194959783, + "sequencer_cost": 38527635 } }, "parent_fee_header": { - "eth_per_fee_asset": 10911676, - "excess_mana": 1330295802, - "mana_used": 86663944 + "eth_per_fee_asset": 11659538, + "excess_mana": 1026592939, + "mana_used": 71235634 } }, { @@ -26485,21 +26485,21 @@ "blobs_needed": 1, "block_number": 269, "l1_block_number": 20973963, - "mana_spent": 104050809, - "size_in_fields": 3390, + "mana_spent": 77244760, + "size_in_fields": 2550, "slot_number": 269, "timestamp": 1729031507 }, "fee_header": { - "eth_per_fee_asset": 10829990, - "excess_mana": 1325517842, - "mana_used": 104050809 + "eth_per_fee_asset": 11738641, + "excess_mana": 1023913813, + "mana_used": 77244760 }, "oracle_input": { - "fee_asset_price_modifier": -34 + "fee_asset_price_modifier": 86 }, "outputs": { - "eth_per_fee_asset_at_execution": 10866938, + "eth_per_fee_asset_at_execution": 11638550, "l1_fee_oracle_output": { "base_fee": 9631901056, "blob_fee": 5864 @@ -26516,22 +26516,22 @@ "slot_of_change": 270 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72627507307027, - "congestion_multiplier": 4715504344, - "prover_cost": 16888096812552, - "sequencer_cost": 2659049586922 + "congestion_cost": 79036604731690, + "congestion_multiplier": 4939704693, + "prover_cost": 16751208956443, + "sequencer_cost": 3310346649712 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789238619, - "congestion_multiplier": 4715504344, - "prover_cost": 183521901, - "sequencer_cost": 28895727 + "congestion_cost": 919871476, + "congestion_multiplier": 4939704693, + "prover_cost": 194959783, + "sequencer_cost": 38527635 } }, "parent_fee_header": { - "eth_per_fee_asset": 10866938, - "excess_mana": 1316959746, - "mana_used": 108558096 + "eth_per_fee_asset": 11638550, + "excess_mana": 1022828573, + "mana_used": 76085240 } }, { @@ -26539,21 +26539,21 @@ "blobs_needed": 1, "block_number": 270, "l1_block_number": 20973966, - "mana_spent": 91644651, - "size_in_fields": 3150, + "mana_spent": 77902907, + "size_in_fields": 2685, "slot_number": 270, "timestamp": 1729031543 }, "fee_header": { - "eth_per_fee_asset": 10823492, - "excess_mana": 1329568651, - "mana_used": 91644651 + "eth_per_fee_asset": 11789117, + "excess_mana": 1026158573, + "mana_used": 77902907 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 43 }, "outputs": { - "eth_per_fee_asset_at_execution": 10829990, + "eth_per_fee_asset_at_execution": 11738641, "l1_fee_oracle_output": { "base_fee": 8514142139, "blob_fee": 7422 @@ -26570,22 +26570,22 @@ "slot_of_change": 270 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72036753496541, - "congestion_multiplier": 4737906270, - "prover_cost": 16913459846224, - "sequencer_cost": 2358493036467 + "congestion_cost": 76635012860518, + "congestion_multiplier": 4957033000, + "prover_cost": 16465546991343, + "sequencer_cost": 2901239419453 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780157320, - "congestion_multiplier": 4737906270, - "prover_cost": 183172601, - "sequencer_cost": 25542456 + "congestion_cost": 899590904, + "congestion_multiplier": 4957033000, + "prover_cost": 193283145, + "sequencer_cost": 34056608 } }, "parent_fee_header": { - "eth_per_fee_asset": 10829990, - "excess_mana": 1325517842, - "mana_used": 104050809 + "eth_per_fee_asset": 11738641, + "excess_mana": 1023913813, + "mana_used": 77244760 } }, { @@ -26593,21 +26593,21 @@ "blobs_needed": 1, "block_number": 271, "l1_block_number": 20973969, - "mana_spent": 97377318, - "size_in_fields": 3390, + "mana_spent": 68765442, + "size_in_fields": 2520, "slot_number": 271, "timestamp": 1729031579 }, "fee_header": { - "eth_per_fee_asset": 10824574, - "excess_mana": 1321213302, - "mana_used": 97377318 + "eth_per_fee_asset": 11820947, + "excess_mana": 1029061480, + "mana_used": 68765442 }, "oracle_input": { - "fee_asset_price_modifier": 1 + "fee_asset_price_modifier": 27 }, "outputs": { - "eth_per_fee_asset_at_execution": 10823492, + "eth_per_fee_asset_at_execution": 11789117, "l1_fee_oracle_output": { "base_fee": 8514142139, "blob_fee": 7422 @@ -26624,22 +26624,22 @@ "slot_of_change": 270 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71191205204384, - "congestion_multiplier": 4691815297, - "prover_cost": 16923614024014, - "sequencer_cost": 2359908983164 + "congestion_cost": 76740762009573, + "congestion_multiplier": 4979532003, + "prover_cost": 16395048501088, + "sequencer_cost": 2888817542485 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 770537440, - "congestion_multiplier": 4691815297, - "prover_cost": 183172601, - "sequencer_cost": 25542456 + "congestion_cost": 904705822, + "congestion_multiplier": 4979532003, + "prover_cost": 193283145, + "sequencer_cost": 34056608 } }, "parent_fee_header": { - "eth_per_fee_asset": 10823492, - "excess_mana": 1329568651, - "mana_used": 91644651 + "eth_per_fee_asset": 11789117, + "excess_mana": 1026158573, + "mana_used": 77902907 } }, { @@ -26647,21 +26647,21 @@ "blobs_needed": 1, "block_number": 272, "l1_block_number": 20973972, - "mana_spent": 105860555, - "size_in_fields": 3600, + "mana_spent": 70559097, + "size_in_fields": 2670, "slot_number": 272, "timestamp": 1729031615 }, "fee_header": { - "eth_per_fee_asset": 10812666, - "excess_mana": 1318590620, - "mana_used": 105860555 + "eth_per_fee_asset": 11871777, + "excess_mana": 1022826922, + "mana_used": 70559097 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": 43 }, "outputs": { - "eth_per_fee_asset_at_execution": 10824574, + "eth_per_fee_asset_at_execution": 11820947, "l1_fee_oracle_output": { "base_fee": 8514142139, "blob_fee": 7422 @@ -26678,22 +26678,22 @@ "slot_of_change": 270 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70906917168288, - "congestion_multiplier": 4677440350, - "prover_cost": 16921922377731, - "sequencer_cost": 2359673091985 + "congestion_cost": 75607226476864, + "congestion_multiplier": 4931336274, + "prover_cost": 16350901920126, + "sequencer_cost": 2881038888002 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 767537172, - "congestion_multiplier": 4677440350, - "prover_cost": 183172601, - "sequencer_cost": 25542456 + "congestion_cost": 893749017, + "congestion_multiplier": 4931336274, + "prover_cost": 193283145, + "sequencer_cost": 34056608 } }, "parent_fee_header": { - "eth_per_fee_asset": 10824574, - "excess_mana": 1321213302, - "mana_used": 97377318 + "eth_per_fee_asset": 11820947, + "excess_mana": 1029061480, + "mana_used": 68765442 } }, { @@ -26701,21 +26701,21 @@ "blobs_needed": 1, "block_number": 273, "l1_block_number": 20973975, - "mana_spent": 92227881, - "size_in_fields": 3315, + "mana_spent": 77528646, + "size_in_fields": 2820, "slot_number": 273, "timestamp": 1729031651 }, "fee_header": { - "eth_per_fee_asset": 10845103, - "excess_mana": 1324451175, - "mana_used": 92227881 + "eth_per_fee_asset": 11883648, + "excess_mana": 1018386019, + "mana_used": 77528646 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 10812666, + "eth_per_fee_asset_at_execution": 11871777, "l1_fee_oracle_output": { "base_fee": 8514142139, "blob_fee": 7422 @@ -26732,22 +26732,22 @@ "slot_of_change": 275 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71606224496346, - "congestion_multiplier": 4709623064, - "prover_cost": 16940558507958, - "sequencer_cost": 2362271802348 + "congestion_cost": 74631554231520, + "congestion_multiplier": 4897290985, + "prover_cost": 16280894174478, + "sequencer_cost": 2868703480533 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774254189, - "congestion_multiplier": 4709623064, - "prover_cost": 183172601, - "sequencer_cost": 25542456 + "congestion_cost": 886009169, + "congestion_multiplier": 4897290985, + "prover_cost": 193283145, + "sequencer_cost": 34056608 } }, "parent_fee_header": { - "eth_per_fee_asset": 10812666, - "excess_mana": 1318590620, - "mana_used": 105860555 + "eth_per_fee_asset": 11871777, + "excess_mana": 1022826922, + "mana_used": 70559097 } }, { @@ -26755,21 +26755,21 @@ "blobs_needed": 1, "block_number": 274, "l1_block_number": 20973978, - "mana_spent": 104030431, - "size_in_fields": 3630, + "mana_spent": 81017065, + "size_in_fields": 2790, "slot_number": 274, "timestamp": 1729031687 }, "fee_header": { - "eth_per_fee_asset": 10926441, - "excess_mana": 1316679056, - "mana_used": 104030431 + "eth_per_fee_asset": 11852750, + "excess_mana": 1020914665, + "mana_used": 81017065 }, "oracle_input": { - "fee_asset_price_modifier": 75 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 10845103, + "eth_per_fee_asset_at_execution": 11883648, "l1_fee_oracle_output": { "base_fee": 8514142139, "blob_fee": 7422 @@ -26786,22 +26786,22 @@ "slot_of_change": 275 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70571592911566, - "congestion_multiplier": 4666990805, - "prover_cost": 16889890395693, - "sequencer_cost": 2355206400530 + "congestion_cost": 74927299849340, + "congestion_multiplier": 4916647422, + "prover_cost": 16264630608379, + "sequencer_cost": 2865837830269 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 765356194, - "congestion_multiplier": 4666990805, - "prover_cost": 183172601, - "sequencer_cost": 25542456 + "congestion_cost": 890409657, + "congestion_multiplier": 4916647422, + "prover_cost": 193283145, + "sequencer_cost": 34056608 } }, "parent_fee_header": { - "eth_per_fee_asset": 10845103, - "excess_mana": 1324451175, - "mana_used": 92227881 + "eth_per_fee_asset": 11883648, + "excess_mana": 1018386019, + "mana_used": 77528646 } }, { @@ -26809,21 +26809,21 @@ "blobs_needed": 1, "block_number": 275, "l1_block_number": 20973981, - "mana_spent": 106570502, - "size_in_fields": 3480, + "mana_spent": 69350810, + "size_in_fields": 2415, "slot_number": 275, "timestamp": 1729031723 }, "fee_header": { - "eth_per_fee_asset": 10997462, - "excess_mana": 1320709487, - "mana_used": 106570502 + "eth_per_fee_asset": 11768595, + "excess_mana": 1026931730, + "mana_used": 69350810 }, "oracle_input": { - "fee_asset_price_modifier": 65 + "fee_asset_price_modifier": -71 }, "outputs": { - "eth_per_fee_asset_at_execution": 10926441, + "eth_per_fee_asset_at_execution": 11852750, "l1_fee_oracle_output": { "base_fee": 9886481693, "blob_fee": 10991 @@ -26840,22 +26840,22 @@ "slot_of_change": 275 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72002437939308, - "congestion_multiplier": 4689050458, - "prover_cost": 16803408996580, - "sequencer_cost": 2714469331780 + "congestion_cost": 78535642108372, + "congestion_multiplier": 4963015408, + "prover_cost": 16480703127967, + "sequencer_cost": 3336439644809 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786730390, - "congestion_multiplier": 4689050458, - "prover_cost": 183601457, - "sequencer_cost": 29659489 + "congestion_cost": 930863332, + "congestion_multiplier": 4963015408, + "prover_cost": 195341654, + "sequencer_cost": 39545985 } }, "parent_fee_header": { - "eth_per_fee_asset": 10926441, - "excess_mana": 1316679056, - "mana_used": 104030431 + "eth_per_fee_asset": 11852750, + "excess_mana": 1020914665, + "mana_used": 81017065 } }, { @@ -26863,21 +26863,21 @@ "blobs_needed": 1, "block_number": 276, "l1_block_number": 20973984, - "mana_spent": 111568778, - "size_in_fields": 3525, + "mana_spent": 76746661, + "size_in_fields": 2745, "slot_number": 276, "timestamp": 1729031759 }, "fee_header": { - "eth_per_fee_asset": 11052449, - "excess_mana": 1327279989, - "mana_used": 111568778 + "eth_per_fee_asset": 11839206, + "excess_mana": 1021282540, + "mana_used": 76746661 }, "oracle_input": { - "fee_asset_price_modifier": 50 + "fee_asset_price_modifier": 60 }, "outputs": { - "eth_per_fee_asset_at_execution": 10997462, + "eth_per_fee_asset_at_execution": 11768595, "l1_fee_oracle_output": { "base_fee": 9886481693, "blob_fee": 10991 @@ -26894,22 +26894,22 @@ "slot_of_change": 275 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72239161635658, - "congestion_multiplier": 4725236385, - "prover_cost": 16694893512704, - "sequencer_cost": 2696939439300 + "congestion_cost": 78228115760633, + "congestion_multiplier": 4919469822, + "prover_cost": 16598553523170, + "sequencer_cost": 3360297894524 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794447435, - "congestion_multiplier": 4725236385, - "prover_cost": 183601457, - "sequencer_cost": 29659489 + "congestion_cost": 920635012, + "congestion_multiplier": 4919469822, + "prover_cost": 195341654, + "sequencer_cost": 39545985 } }, "parent_fee_header": { - "eth_per_fee_asset": 10997462, - "excess_mana": 1320709487, - "mana_used": 106570502 + "eth_per_fee_asset": 11768595, + "excess_mana": 1026931730, + "mana_used": 69350810 } }, { @@ -26917,21 +26917,21 @@ "blobs_needed": 1, "block_number": 277, "l1_block_number": 20973987, - "mana_spent": 91761500, - "size_in_fields": 3000, + "mana_spent": 77053014, + "size_in_fields": 2535, "slot_number": 277, "timestamp": 1729031795 }, "fee_header": { - "eth_per_fee_asset": 10977292, - "excess_mana": 1338848767, - "mana_used": 91761500 + "eth_per_fee_asset": 11865252, + "excess_mana": 1023029201, + "mana_used": 77053014 }, "oracle_input": { - "fee_asset_price_modifier": -68 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 11052449, + "eth_per_fee_asset_at_execution": 11839206, "l1_fee_oracle_output": { "base_fee": 9886481693, "blob_fee": 10991 @@ -26948,22 +26948,22 @@ "slot_of_change": 275 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73122252814739, - "congestion_multiplier": 4789629494, - "prover_cost": 16611834806929, - "sequencer_cost": 2683521905417 + "congestion_cost": 78027856175491, + "congestion_multiplier": 4932892628, + "prover_cost": 16499556980426, + "sequencer_cost": 3340256517203 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 808179970, - "congestion_multiplier": 4789629494, - "prover_cost": 183601457, - "sequencer_cost": 29659489 + "congestion_cost": 923787863, + "congestion_multiplier": 4932892628, + "prover_cost": 195341654, + "sequencer_cost": 39545985 } }, "parent_fee_header": { - "eth_per_fee_asset": 11052449, - "excess_mana": 1327279989, - "mana_used": 111568778 + "eth_per_fee_asset": 11839206, + "excess_mana": 1021282540, + "mana_used": 76746661 } }, { @@ -26971,21 +26971,21 @@ "blobs_needed": 1, "block_number": 278, "l1_block_number": 20973990, - "mana_spent": 84191206, - "size_in_fields": 3075, + "mana_spent": 82445972, + "size_in_fields": 2835, "slot_number": 278, "timestamp": 1729031831 }, "fee_header": { - "eth_per_fee_asset": 11046448, - "excess_mana": 1330610267, - "mana_used": 84191206 + "eth_per_fee_asset": 11944749, + "excess_mana": 1025082215, + "mana_used": 82445972 }, "oracle_input": { - "fee_asset_price_modifier": 63 + "fee_asset_price_modifier": 67 }, "outputs": { - "eth_per_fee_asset_at_execution": 10977292, + "eth_per_fee_asset_at_execution": 11865252, "l1_fee_oracle_output": { "base_fee": 9886481693, "blob_fee": 10991 @@ -27002,22 +27002,22 @@ "slot_of_change": 280 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72730283115363, - "congestion_multiplier": 4743683832, - "prover_cost": 16725569202314, - "sequencer_cost": 2701894875349 + "congestion_cost": 78169827661478, + "congestion_multiplier": 4948716539, + "prover_cost": 16463337988945, + "sequencer_cost": 3332924155341 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798381555, - "congestion_multiplier": 4743683832, - "prover_cost": 183601457, - "sequencer_cost": 29659489 + "congestion_cost": 927504704, + "congestion_multiplier": 4948716539, + "prover_cost": 195341654, + "sequencer_cost": 39545985 } }, "parent_fee_header": { - "eth_per_fee_asset": 10977292, - "excess_mana": 1338848767, - "mana_used": 91761500 + "eth_per_fee_asset": 11865252, + "excess_mana": 1023029201, + "mana_used": 77053014 } }, { @@ -27025,21 +27025,21 @@ "blobs_needed": 1, "block_number": 279, "l1_block_number": 20973993, - "mana_spent": 102388876, - "size_in_fields": 3615, + "mana_spent": 56601594, + "size_in_fields": 2055, "slot_number": 279, "timestamp": 1729031867 }, "fee_header": { - "eth_per_fee_asset": 11027669, - "excess_mana": 1314801473, - "mana_used": 102388876 + "eth_per_fee_asset": 11945943, + "excess_mana": 1032528187, + "mana_used": 56601594 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": 1 }, "outputs": { - "eth_per_fee_asset_at_execution": 11046448, + "eth_per_fee_asset_at_execution": 11944749, "l1_fee_oracle_output": { "base_fee": 9886481693, "blob_fee": 10991 @@ -27056,22 +27056,22 @@ "slot_of_change": 280 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70596621556541, - "congestion_multiplier": 4656749742, - "prover_cost": 16620859211939, - "sequencer_cost": 2684979732852 + "congestion_cost": 78786540093894, + "congestion_multiplier": 5006534575, + "prover_cost": 16353768002995, + "sequencer_cost": 3310742234936 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779841909, - "congestion_multiplier": 4656749742, - "prover_cost": 183601457, - "sequencer_cost": 29659489 + "congestion_cost": 941085446, + "congestion_multiplier": 5006534575, + "prover_cost": 195341654, + "sequencer_cost": 39545985 } }, "parent_fee_header": { - "eth_per_fee_asset": 11046448, - "excess_mana": 1330610267, - "mana_used": 84191206 + "eth_per_fee_asset": 11944749, + "excess_mana": 1025082215, + "mana_used": 82445972 } }, { @@ -27079,21 +27079,21 @@ "blobs_needed": 1, "block_number": 280, "l1_block_number": 20973996, - "mana_spent": 109638392, - "size_in_fields": 3585, + "mana_spent": 78037391, + "size_in_fields": 2880, "slot_number": 280, "timestamp": 1729031903 }, "fee_header": { - "eth_per_fee_asset": 11016641, - "excess_mana": 1317190349, - "mana_used": 109638392 + "eth_per_fee_asset": 11994921, + "excess_mana": 1014129781, + "mana_used": 78037391 }, "oracle_input": { - "fee_asset_price_modifier": -10 + "fee_asset_price_modifier": 41 }, "outputs": { - "eth_per_fee_asset_at_execution": 11027669, + "eth_per_fee_asset_at_execution": 11945943, "l1_fee_oracle_output": { "base_fee": 10488751351, "blob_fee": 12860 @@ -27110,22 +27110,22 @@ "slot_of_change": 280 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71632800095832, - "congestion_multiplier": 4669783494, - "prover_cost": 16666229826086, - "sequencer_cost": 2853395853648 + "congestion_cost": 77065109301125, + "congestion_multiplier": 4864882002, + "prover_cost": 16427757858882, + "sequencer_cost": 3512077112707 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789942809, - "congestion_multiplier": 4669783494, - "prover_cost": 183789666, - "sequencer_cost": 31466305 + "congestion_cost": 920615403, + "congestion_multiplier": 4864882002, + "prover_cost": 196245059, + "sequencer_cost": 41955073 } }, "parent_fee_header": { - "eth_per_fee_asset": 11027669, - "excess_mana": 1314801473, - "mana_used": 102388876 + "eth_per_fee_asset": 11945943, + "excess_mana": 1032528187, + "mana_used": 56601594 } }, { @@ -27133,21 +27133,21 @@ "blobs_needed": 1, "block_number": 281, "l1_block_number": 20973999, - "mana_spent": 97273933, - "size_in_fields": 3495, + "mana_spent": 78108363, + "size_in_fields": 3000, "slot_number": 281, "timestamp": 1729031939 }, "fee_header": { - "eth_per_fee_asset": 11056300, - "excess_mana": 1326828741, - "mana_used": 97273933 + "eth_per_fee_asset": 12070489, + "excess_mana": 1017167172, + "mana_used": 78108363 }, "oracle_input": { - "fee_asset_price_modifier": 36 + "fee_asset_price_modifier": 63 }, "outputs": { - "eth_per_fee_asset_at_execution": 11016641, + "eth_per_fee_asset_at_execution": 11994921, "l1_fee_oracle_output": { "base_fee": 10488751351, "blob_fee": 12860 @@ -27164,22 +27164,22 @@ "slot_of_change": 280 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72739277788938, - "congestion_multiplier": 4722742307, - "prover_cost": 16682913240071, - "sequencer_cost": 2856252191571 + "congestion_cost": 77209285663491, + "congestion_multiplier": 4887988117, + "prover_cost": 16360679574297, + "sequencer_cost": 3497736500308 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801342510, - "congestion_multiplier": 4722742307, - "prover_cost": 183789666, - "sequencer_cost": 31466305 + "congestion_cost": 926119282, + "congestion_multiplier": 4887988117, + "prover_cost": 196245059, + "sequencer_cost": 41955073 } }, "parent_fee_header": { - "eth_per_fee_asset": 11016641, - "excess_mana": 1317190349, - "mana_used": 109638392 + "eth_per_fee_asset": 11994921, + "excess_mana": 1014129781, + "mana_used": 78037391 } }, { @@ -27187,21 +27187,21 @@ "blobs_needed": 1, "block_number": 282, "l1_block_number": 20974002, - "mana_spent": 83393132, - "size_in_fields": 2940, + "mana_spent": 79579887, + "size_in_fields": 2820, "slot_number": 282, "timestamp": 1729031975 }, "fee_header": { - "eth_per_fee_asset": 11070673, - "excess_mana": 1324102674, - "mana_used": 83393132 + "eth_per_fee_asset": 12056004, + "excess_mana": 1020275535, + "mana_used": 79579887 }, "oracle_input": { - "fee_asset_price_modifier": 13 + "fee_asset_price_modifier": -12 }, "outputs": { - "eth_per_fee_asset_at_execution": 11056300, + "eth_per_fee_asset_at_execution": 12070489, "l1_fee_oracle_output": { "base_fee": 10488751351, "blob_fee": 12860 @@ -27218,22 +27218,22 @@ "slot_of_change": 280 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72185562620407, - "congestion_multiplier": 4707703125, - "prover_cost": 16623071551966, - "sequencer_cost": 2846006801553 + "congestion_cost": 77194787385996, + "congestion_multiplier": 4911747757, + "prover_cost": 16258252586122, + "sequencer_cost": 3475838717057 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798105236, - "congestion_multiplier": 4707703125, - "prover_cost": 183789666, - "sequencer_cost": 31466305 + "congestion_cost": 931778832, + "congestion_multiplier": 4911747757, + "prover_cost": 196245059, + "sequencer_cost": 41955073 } }, "parent_fee_header": { - "eth_per_fee_asset": 11056300, - "excess_mana": 1326828741, - "mana_used": 97273933 + "eth_per_fee_asset": 12070489, + "excess_mana": 1017167172, + "mana_used": 78108363 } }, { @@ -27241,21 +27241,21 @@ "blobs_needed": 1, "block_number": 283, "l1_block_number": 20974005, - "mana_spent": 107345187, - "size_in_fields": 3840, + "mana_spent": 77259817, + "size_in_fields": 2835, "slot_number": 283, "timestamp": 1729032011 }, "fee_header": { - "eth_per_fee_asset": 11130454, - "excess_mana": 1307495806, - "mana_used": 107345187 + "eth_per_fee_asset": 12060826, + "excess_mana": 1024855422, + "mana_used": 77259817 }, "oracle_input": { - "fee_asset_price_modifier": 54 + "fee_asset_price_modifier": 4 }, "outputs": { - "eth_per_fee_asset_at_execution": 11070673, + "eth_per_fee_asset_at_execution": 12056004, "l1_fee_oracle_output": { "base_fee": 10488751351, "blob_fee": 12860 @@ -27272,22 +27272,22 @@ "slot_of_change": 285 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70330470785291, - "congestion_multiplier": 4617115199, - "prover_cost": 16601489900389, - "sequencer_cost": 2842311844999 + "congestion_cost": 77983370194635, + "congestion_multiplier": 4946966007, + "prover_cost": 16277786487132, + "sequencer_cost": 3480014854010 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778605644, - "congestion_multiplier": 4617115199, - "prover_cost": 183789666, - "sequencer_cost": 31466305 + "congestion_cost": 940167823, + "congestion_multiplier": 4946966007, + "prover_cost": 196245059, + "sequencer_cost": 41955073 } }, "parent_fee_header": { - "eth_per_fee_asset": 11070673, - "excess_mana": 1324102674, - "mana_used": 83393132 + "eth_per_fee_asset": 12056004, + "excess_mana": 1020275535, + "mana_used": 79579887 } }, { @@ -27295,21 +27295,21 @@ "blobs_needed": 1, "block_number": 284, "l1_block_number": 20974008, - "mana_spent": 103406835, - "size_in_fields": 3780, + "mana_spent": 82420836, + "size_in_fields": 2835, "slot_number": 284, "timestamp": 1729032047 }, "fee_header": { - "eth_per_fee_asset": 11130454, - "excess_mana": 1314840993, - "mana_used": 103406835 + "eth_per_fee_asset": 12105451, + "excess_mana": 1027115239, + "mana_used": 82420836 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": 37 }, "outputs": { - "eth_per_fee_asset_at_execution": 11130454, + "eth_per_fee_asset_at_execution": 12060826, "l1_fee_oracle_output": { "base_fee": 10488751351, "blob_fee": 12860 @@ -27326,22 +27326,22 @@ "slot_of_change": 285 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70723401399440, - "congestion_multiplier": 4656965068, - "prover_cost": 16512324295128, - "sequencer_cost": 2827045958773 + "congestion_cost": 78297230388699, + "congestion_multiplier": 4964436394, + "prover_cost": 16271278517740, + "sequencer_cost": 3478623520479 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787183566, - "congestion_multiplier": 4656965068, - "prover_cost": 183789666, - "sequencer_cost": 31466305 + "congestion_cost": 944329272, + "congestion_multiplier": 4964436394, + "prover_cost": 196245059, + "sequencer_cost": 41955073 } }, "parent_fee_header": { - "eth_per_fee_asset": 11130454, - "excess_mana": 1307495806, - "mana_used": 107345187 + "eth_per_fee_asset": 12060826, + "excess_mana": 1024855422, + "mana_used": 77259817 } }, { @@ -27349,21 +27349,21 @@ "blobs_needed": 1, "block_number": 285, "l1_block_number": 20974011, - "mana_spent": 98114660, - "size_in_fields": 3420, + "mana_spent": 69637561, + "size_in_fields": 2445, "slot_number": 285, "timestamp": 1729032083 }, "fee_header": { - "eth_per_fee_asset": 11036958, - "excess_mana": 1318247828, - "mana_used": 98114660 + "eth_per_fee_asset": 12173241, + "excess_mana": 1034536075, + "mana_used": 69637561 }, "oracle_input": { - "fee_asset_price_modifier": -84 + "fee_asset_price_modifier": 56 }, "outputs": { - "eth_per_fee_asset_at_execution": 11130454, + "eth_per_fee_asset_at_execution": 12105451, "l1_fee_oracle_output": { "base_fee": 9281566366, "blob_fee": 16276 @@ -27380,22 +27380,22 @@ "slot_of_change": 285 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69762604831753, - "congestion_multiplier": 4675564761, - "prover_cost": 16478431248178, - "sequencer_cost": 2501673696330 + "congestion_cost": 76939942510197, + "congestion_multiplier": 5022241156, + "prover_cost": 16061713107591, + "sequencer_cost": 3066911839964 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776489464, - "congestion_multiplier": 4675564761, - "prover_cost": 183412421, - "sequencer_cost": 27844764 + "congestion_cost": 931392704, + "congestion_multiplier": 5022241156, + "prover_cost": 194434281, + "sequencer_cost": 37126351 } }, "parent_fee_header": { - "eth_per_fee_asset": 11130454, - "excess_mana": 1314840993, - "mana_used": 103406835 + "eth_per_fee_asset": 12105451, + "excess_mana": 1027115239, + "mana_used": 82420836 } }, { @@ -27403,21 +27403,21 @@ "blobs_needed": 1, "block_number": 286, "l1_block_number": 20974014, - "mana_spent": 125567166, - "size_in_fields": 3990, + "mana_spent": 80351953, + "size_in_fields": 2655, "slot_number": 286, "timestamp": 1729032119 }, "fee_header": { - "eth_per_fee_asset": 10987291, - "excess_mana": 1316362488, - "mana_used": 125567166 + "eth_per_fee_asset": 12161067, + "excess_mana": 1029173636, + "mana_used": 80351953 }, "oracle_input": { - "fee_asset_price_modifier": -45 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 11036958, + "eth_per_fee_asset_at_execution": 12173241, "l1_fee_oracle_output": { "base_fee": 9281566366, "blob_fee": 16276 @@ -27434,22 +27434,22 @@ "slot_of_change": 285 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70156382492350, - "congestion_multiplier": 4665262543, - "prover_cost": 16618022918997, - "sequencer_cost": 2522865811395 + "congestion_cost": 75715637848623, + "congestion_multiplier": 4980403315, + "prover_cost": 15972269094155, + "sequencer_cost": 3049832908098 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774313047, - "congestion_multiplier": 4665262543, - "prover_cost": 183412421, - "sequencer_cost": 27844764 + "congestion_cost": 921704707, + "congestion_multiplier": 4980403315, + "prover_cost": 194434281, + "sequencer_cost": 37126351 } }, "parent_fee_header": { - "eth_per_fee_asset": 11036958, - "excess_mana": 1318247828, - "mana_used": 98114660 + "eth_per_fee_asset": 12173241, + "excess_mana": 1034536075, + "mana_used": 69637561 } }, { @@ -27457,21 +27457,21 @@ "blobs_needed": 1, "block_number": 287, "l1_block_number": 20974017, - "mana_spent": 95938334, - "size_in_fields": 3165, + "mana_spent": 72144121, + "size_in_fields": 2595, "slot_number": 287, "timestamp": 1729032155 }, "fee_header": { - "eth_per_fee_asset": 11044424, - "excess_mana": 1341929654, - "mana_used": 95938334 + "eth_per_fee_asset": 12120935, + "excess_mana": 1034525589, + "mana_used": 72144121 }, "oracle_input": { - "fee_asset_price_modifier": 52 + "fee_asset_price_modifier": -33 }, "outputs": { - "eth_per_fee_asset_at_execution": 10987291, + "eth_per_fee_asset_at_execution": 12161067, "l1_fee_oracle_output": { "base_fee": 9281566366, "blob_fee": 16276 @@ -27488,22 +27488,22 @@ "slot_of_change": 285 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73197330442964, - "congestion_multiplier": 4806925528, - "prover_cost": 16693143105066, - "sequencer_cost": 2534270185436 + "congestion_cost": 76586510048831, + "congestion_multiplier": 5022159002, + "prover_cost": 15988258349371, + "sequencer_cost": 3052885984429 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804240370, - "congestion_multiplier": 4806925528, - "prover_cost": 183412421, - "sequencer_cost": 27844764 + "congestion_cost": 931373680, + "congestion_multiplier": 5022159002, + "prover_cost": 194434281, + "sequencer_cost": 37126351 } }, "parent_fee_header": { - "eth_per_fee_asset": 10987291, - "excess_mana": 1316362488, - "mana_used": 125567166 + "eth_per_fee_asset": 12161067, + "excess_mana": 1029173636, + "mana_used": 80351953 } }, { @@ -27511,21 +27511,21 @@ "blobs_needed": 1, "block_number": 288, "l1_block_number": 20974020, - "mana_spent": 99794442, - "size_in_fields": 3330, + "mana_spent": 67999169, + "size_in_fields": 2340, "slot_number": 288, "timestamp": 1729032191 }, "fee_header": { - "eth_per_fee_asset": 11032275, - "excess_mana": 1337867988, - "mana_used": 99794442 + "eth_per_fee_asset": 12090632, + "excess_mana": 1031669710, + "mana_used": 67999169 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11044424, + "eth_per_fee_asset_at_execution": 12120935, "l1_fee_oracle_output": { "base_fee": 9281566366, "blob_fee": 16276 @@ -27542,22 +27542,22 @@ "slot_of_change": 290 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72382771795071, - "congestion_multiplier": 4784136492, - "prover_cost": 16606789181582, - "sequencer_cost": 2521160361102 + "congestion_cost": 76413587978156, + "congestion_multiplier": 4999834191, + "prover_cost": 16041194924319, + "sequencer_cost": 3062993985200 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799426022, - "congestion_multiplier": 4784136492, - "prover_cost": 183412421, - "sequencer_cost": 27844764 + "congestion_cost": 926204133, + "congestion_multiplier": 4999834191, + "prover_cost": 194434281, + "sequencer_cost": 37126351 } }, "parent_fee_header": { - "eth_per_fee_asset": 11044424, - "excess_mana": 1341929654, - "mana_used": 95938334 + "eth_per_fee_asset": 12120935, + "excess_mana": 1034525589, + "mana_used": 72144121 } }, { @@ -27565,21 +27565,21 @@ "blobs_needed": 1, "block_number": 289, "l1_block_number": 20974023, - "mana_spent": 103424198, - "size_in_fields": 3195, + "mana_spent": 75672812, + "size_in_fields": 2670, "slot_number": 289, "timestamp": 1729032227 }, "fee_header": { - "eth_per_fee_asset": 11079713, - "excess_mana": 1337662430, - "mana_used": 103424198 + "eth_per_fee_asset": 12079750, + "excess_mana": 1024668879, + "mana_used": 75672812 }, "oracle_input": { - "fee_asset_price_modifier": 43 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 11032275, + "eth_per_fee_asset_at_execution": 12090632, "l1_fee_oracle_output": { "base_fee": 9281566366, "blob_fee": 16276 @@ -27596,22 +27596,22 @@ "slot_of_change": 290 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72440451312173, - "congestion_multiplier": 4782986032, - "prover_cost": 16625076967353, - "sequencer_cost": 2523936722027 + "congestion_cost": 75565002391935, + "congestion_multiplier": 4945526614, + "prover_cost": 16081399301542, + "sequencer_cost": 3070670830111 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799182980, - "congestion_multiplier": 4782986032, - "prover_cost": 183412421, - "sequencer_cost": 27844764 + "congestion_cost": 913628636, + "congestion_multiplier": 4945526614, + "prover_cost": 194434281, + "sequencer_cost": 37126351 } }, "parent_fee_header": { - "eth_per_fee_asset": 11032275, - "excess_mana": 1337867988, - "mana_used": 99794442 + "eth_per_fee_asset": 12090632, + "excess_mana": 1031669710, + "mana_used": 67999169 } }, { @@ -27619,21 +27619,21 @@ "blobs_needed": 1, "block_number": 290, "l1_block_number": 20974026, - "mana_spent": 65586381, - "size_in_fields": 2340, + "mana_spent": 71645589, + "size_in_fields": 2520, "slot_number": 290, "timestamp": 1729032263 }, "fee_header": { - "eth_per_fee_asset": 11127355, - "excess_mana": 1341086628, - "mana_used": 65586381 + "eth_per_fee_asset": 12019351, + "excess_mana": 1025341691, + "mana_used": 71645589 }, "oracle_input": { - "fee_asset_price_modifier": 43 + "fee_asset_price_modifier": -50 }, "outputs": { - "eth_per_fee_asset_at_execution": 11079713, + "eth_per_fee_asset_at_execution": 12079750, "l1_fee_oracle_output": { "base_fee": 9799646679, "blob_fee": 29330 @@ -27650,44 +27650,44 @@ "slot_of_change": 290 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73085333528044, - "congestion_multiplier": 4802186600, - "prover_cost": 16568508678881, - "sequencer_cost": 2653413134438 + "congestion_cost": 76664571948923, + "congestion_multiplier": 4950720098, + "prover_cost": 16160218713136, + "sequencer_cost": 3244996047104 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 809764520, - "congestion_multiplier": 4802186600, - "prover_cost": 183574321, - "sequencer_cost": 29399056 + "congestion_cost": 926088863, + "congestion_multiplier": 4950720098, + "prover_cost": 195211402, + "sequencer_cost": 39198741 } }, "parent_fee_header": { - "eth_per_fee_asset": 11079713, - "excess_mana": 1337662430, - "mana_used": 103424198 + "eth_per_fee_asset": 12079750, + "excess_mana": 1024668879, + "mana_used": 75672812 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 291, "l1_block_number": 20974029, - "mana_spent": 123274891, - "size_in_fields": 4170, + "mana_spent": 70667712, + "size_in_fields": 2565, "slot_number": 291, "timestamp": 1729032299 }, "fee_header": { - "eth_per_fee_asset": 11118453, - "excess_mana": 1306673009, - "mana_used": 123274891 + "eth_per_fee_asset": 12051803, + "excess_mana": 1021987280, + "mana_used": 70667712 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": 27 }, "outputs": { - "eth_per_fee_asset_at_execution": 11127355, + "eth_per_fee_asset_at_execution": 12019351, "l1_fee_oracle_output": { "base_fee": 9799646679, "blob_fee": 29330 @@ -27704,22 +27704,22 @@ "slot_of_change": 290 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69145190029437, - "congestion_multiplier": 4612672568, - "prover_cost": 16497570267148, - "sequencer_cost": 2642052491361 + "congestion_cost": 76545894283311, + "congestion_multiplier": 4924881233, + "prover_cost": 16241426180166, + "sequencer_cost": 3261302627738 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 769403076, - "congestion_multiplier": 4612672568, - "prover_cost": 183574321, - "sequencer_cost": 29399056 + "congestion_cost": 920031971, + "congestion_multiplier": 4924881233, + "prover_cost": 195211402, + "sequencer_cost": 39198741 } }, "parent_fee_header": { - "eth_per_fee_asset": 11127355, - "excess_mana": 1341086628, - "mana_used": 65586381 + "eth_per_fee_asset": 12019351, + "excess_mana": 1025341691, + "mana_used": 71645589 } }, { @@ -27727,21 +27727,21 @@ "blobs_needed": 1, "block_number": 292, "l1_block_number": 20974032, - "mana_spent": 95349505, - "size_in_fields": 3450, + "mana_spent": 77932253, + "size_in_fields": 2655, "slot_number": 292, "timestamp": 1729032335 }, "fee_header": { - "eth_per_fee_asset": 11161814, - "excess_mana": 1329947900, - "mana_used": 95349505 + "eth_per_fee_asset": 12096394, + "excess_mana": 1017654992, + "mana_used": 77932253 }, "oracle_input": { - "fee_asset_price_modifier": 39 + "fee_asset_price_modifier": 37 }, "outputs": { - "eth_per_fee_asset_at_execution": 11118453, + "eth_per_fee_asset_at_execution": 12051803, "l1_fee_oracle_output": { "base_fee": 9799646679, "blob_fee": 29330 @@ -27758,22 +27758,22 @@ "slot_of_change": 290 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71639674692154, - "congestion_multiplier": 4740009046, - "prover_cost": 16510779062519, - "sequencer_cost": 2644167853208 + "congestion_cost": 75694576985701, + "congestion_multiplier": 4891709288, + "prover_cost": 16197692743568, + "sequencer_cost": 3252520888369 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796522356, - "congestion_multiplier": 4740009046, - "prover_cost": 183574321, - "sequencer_cost": 29399056 + "congestion_cost": 912256130, + "congestion_multiplier": 4891709288, + "prover_cost": 195211402, + "sequencer_cost": 39198741 } }, "parent_fee_header": { - "eth_per_fee_asset": 11118453, - "excess_mana": 1306673009, - "mana_used": 123274891 + "eth_per_fee_asset": 12051803, + "excess_mana": 1021987280, + "mana_used": 70667712 } }, { @@ -27781,21 +27781,21 @@ "blobs_needed": 1, "block_number": 293, "l1_block_number": 20974035, - "mana_spent": 95083495, - "size_in_fields": 3420, + "mana_spent": 70883867, + "size_in_fields": 2430, "slot_number": 293, "timestamp": 1729032371 }, "fee_header": { - "eth_per_fee_asset": 11196415, - "excess_mana": 1325297405, - "mana_used": 95083495 + "eth_per_fee_asset": 12015348, + "excess_mana": 1020587245, + "mana_used": 70883867 }, "oracle_input": { - "fee_asset_price_modifier": 31 + "fee_asset_price_modifier": -67 }, "outputs": { - "eth_per_fee_asset_at_execution": 11161814, + "eth_per_fee_asset_at_execution": 12096394, "l1_fee_oracle_output": { "base_fee": 9799646679, "blob_fee": 29330 @@ -27812,22 +27812,22 @@ "slot_of_change": 295 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70870606336927, - "congestion_multiplier": 4714288319, - "prover_cost": 16446638601934, - "sequencer_cost": 2633895888249 + "congestion_cost": 75850154765131, + "congestion_multiplier": 4914136761, + "prover_cost": 16137983104717, + "sequencer_cost": 3240531103733 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791044526, - "congestion_multiplier": 4714288319, - "prover_cost": 183574321, - "sequencer_cost": 29399056 + "congestion_cost": 917513357, + "congestion_multiplier": 4914136761, + "prover_cost": 195211402, + "sequencer_cost": 39198741 } }, "parent_fee_header": { - "eth_per_fee_asset": 11161814, - "excess_mana": 1329947900, - "mana_used": 95349505 + "eth_per_fee_asset": 12096394, + "excess_mana": 1017654992, + "mana_used": 77932253 } }, { @@ -27835,21 +27835,21 @@ "blobs_needed": 1, "block_number": 294, "l1_block_number": 20974038, - "mana_spent": 90239888, - "size_in_fields": 3240, + "mana_spent": 80492087, + "size_in_fields": 2760, "slot_number": 294, "timestamp": 1729032407 }, "fee_header": { - "eth_per_fee_asset": 11284866, - "excess_mana": 1320380900, - "mana_used": 90239888 + "eth_per_fee_asset": 12069417, + "excess_mana": 1016471112, + "mana_used": 80492087 }, "oracle_input": { - "fee_asset_price_modifier": 79 + "fee_asset_price_modifier": 45 }, "outputs": { - "eth_per_fee_asset_at_execution": 11196415, + "eth_per_fee_asset_at_execution": 12015348, "l1_fee_oracle_output": { "base_fee": 9799646679, "blob_fee": 29330 @@ -27866,22 +27866,22 @@ "slot_of_change": 295 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70137243215798, - "congestion_multiplier": 4687248114, - "prover_cost": 16395812498912, - "sequencer_cost": 2625756190710 + "congestion_cost": 75748148201784, + "congestion_multiplier": 4882683358, + "prover_cost": 16246837128646, + "sequencer_cost": 3262389154272 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785285682, - "congestion_multiplier": 4687248114, - "prover_cost": 183574321, - "sequencer_cost": 29399056 + "congestion_cost": 910140361, + "congestion_multiplier": 4882683358, + "prover_cost": 195211402, + "sequencer_cost": 39198741 } }, "parent_fee_header": { - "eth_per_fee_asset": 11196415, - "excess_mana": 1325297405, - "mana_used": 95083495 + "eth_per_fee_asset": 12015348, + "excess_mana": 1020587245, + "mana_used": 70883867 } }, { @@ -27889,21 +27889,21 @@ "blobs_needed": 1, "block_number": 295, "l1_block_number": 20974041, - "mana_spent": 118474613, - "size_in_fields": 4005, + "mana_spent": 79437755, + "size_in_fields": 2565, "slot_number": 295, "timestamp": 1729032443 }, "fee_header": { - "eth_per_fee_asset": 11357089, - "excess_mana": 1310620788, - "mana_used": 118474613 + "eth_per_fee_asset": 12023553, + "excess_mana": 1021963199, + "mana_used": 79437755 }, "oracle_input": { - "fee_asset_price_modifier": 64 + "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 11284866, + "eth_per_fee_asset_at_execution": 12069417, "l1_fee_oracle_output": { "base_fee": 9306209488, "blob_fee": 69572 @@ -27920,22 +27920,22 @@ "slot_of_change": 295 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68056793230864, - "congestion_multiplier": 4634027327, - "prover_cost": 16253637570885, - "sequencer_cost": 2474012806178 + "congestion_cost": 75342344953365, + "congestion_multiplier": 4924696227, + "prover_cost": 16112729057253, + "sequencer_cost": 3084258585150 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 768011792, - "congestion_multiplier": 4634027327, - "prover_cost": 183420122, - "sequencer_cost": 27918903 + "congestion_cost": 909338179, + "congestion_multiplier": 4924696227, + "prover_cost": 194471246, + "sequencer_cost": 37225203 } }, "parent_fee_header": { - "eth_per_fee_asset": 11284866, - "excess_mana": 1320380900, - "mana_used": 90239888 + "eth_per_fee_asset": 12069417, + "excess_mana": 1016471112, + "mana_used": 80492087 } }, { @@ -27943,21 +27943,21 @@ "blobs_needed": 1, "block_number": 296, "l1_block_number": 20974044, - "mana_spent": 104203894, - "size_in_fields": 3795, + "mana_spent": 87663904, + "size_in_fields": 2775, "slot_number": 296, "timestamp": 1729032479 }, "fee_header": { - "eth_per_fee_asset": 11349139, - "excess_mana": 1329095401, - "mana_used": 104203894 + "eth_per_fee_asset": 12136574, + "excess_mana": 1026400954, + "mana_used": 87663904 }, "oracle_input": { - "fee_asset_price_modifier": -7 + "fee_asset_price_modifier": 94 }, "outputs": { - "eth_per_fee_asset_at_execution": 11357089, + "eth_per_fee_asset_at_execution": 12023553, "l1_fee_oracle_output": { "base_fee": 9306209488, "blob_fee": 69572 @@ -27974,22 +27974,22 @@ "slot_of_change": 295 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69508233579926, - "congestion_multiplier": 4735283605, - "prover_cost": 16150276008228, - "sequencer_cost": 2458279846183 + "congestion_cost": 76289001345942, + "congestion_multiplier": 4958907680, + "prover_cost": 16174191272747, + "sequencer_cost": 3096023529817 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789411195, - "congestion_multiplier": 4735283605, - "prover_cost": 183420122, - "sequencer_cost": 27918903 + "congestion_cost": 917264851, + "congestion_multiplier": 4958907680, + "prover_cost": 194471246, + "sequencer_cost": 37225203 } }, "parent_fee_header": { - "eth_per_fee_asset": 11357089, - "excess_mana": 1310620788, - "mana_used": 118474613 + "eth_per_fee_asset": 12023553, + "excess_mana": 1021963199, + "mana_used": 79437755 } }, { @@ -27997,21 +27997,21 @@ "blobs_needed": 1, "block_number": 297, "l1_block_number": 20974047, - "mana_spent": 105455318, - "size_in_fields": 3645, + "mana_spent": 63299374, + "size_in_fields": 2475, "slot_number": 297, "timestamp": 1729032515 }, "fee_header": { - "eth_per_fee_asset": 11391130, - "excess_mana": 1333299295, - "mana_used": 105455318 + "eth_per_fee_asset": 12203325, + "excess_mana": 1039064858, + "mana_used": 63299374 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": 55 }, "outputs": { - "eth_per_fee_asset_at_execution": 11349139, + "eth_per_fee_asset_at_execution": 12136574, "l1_fee_oracle_output": { "base_fee": 9306209488, "blob_fee": 69572 @@ -28028,22 +28028,22 @@ "slot_of_change": 295 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69991702982932, - "congestion_multiplier": 4758631735, - "prover_cost": 16161589174298, - "sequencer_cost": 2460001855648 + "congestion_cost": 77467419635888, + "congestion_multiplier": 5057848428, + "prover_cost": 16023570243135, + "sequencer_cost": 3067192026350 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794345566, - "congestion_multiplier": 4758631735, - "prover_cost": 183420122, - "sequencer_cost": 27918903 + "congestion_cost": 940189071, + "congestion_multiplier": 5057848428, + "prover_cost": 194471246, + "sequencer_cost": 37225203 } }, "parent_fee_header": { - "eth_per_fee_asset": 11349139, - "excess_mana": 1329095401, - "mana_used": 104203894 + "eth_per_fee_asset": 12136574, + "excess_mana": 1026400954, + "mana_used": 87663904 } }, { @@ -28051,21 +28051,21 @@ "blobs_needed": 1, "block_number": 298, "l1_block_number": 20974050, - "mana_spent": 83940820, - "size_in_fields": 2985, + "mana_spent": 66188627, + "size_in_fields": 2445, "slot_number": 298, "timestamp": 1729032551 }, "fee_header": { - "eth_per_fee_asset": 11505041, - "excess_mana": 1338754613, - "mana_used": 83940820 + "eth_per_fee_asset": 12196003, + "excess_mana": 1027364232, + "mana_used": 66188627 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -6 }, "outputs": { - "eth_per_fee_asset_at_execution": 11391130, + "eth_per_fee_asset_at_execution": 12203325, "l1_fee_oracle_output": { "base_fee": 9306209488, "blob_fee": 69572 @@ -28082,22 +28082,22 @@ "slot_of_change": 300 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70299004576368, - "congestion_multiplier": 4789101897, - "prover_cost": 16102012881953, - "sequencer_cost": 2450933577266 + "congestion_cost": 75306747054594, + "congestion_multiplier": 4966365100, + "prover_cost": 15935922873480, + "sequencer_cost": 3050414784496 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 800785100, - "congestion_multiplier": 4789101897, - "prover_cost": 183420122, - "sequencer_cost": 27918903 + "congestion_cost": 918992709, + "congestion_multiplier": 4966365100, + "prover_cost": 194471246, + "sequencer_cost": 37225203 } }, "parent_fee_header": { - "eth_per_fee_asset": 11391130, - "excess_mana": 1333299295, - "mana_used": 105455318 + "eth_per_fee_asset": 12203325, + "excess_mana": 1039064858, + "mana_used": 63299374 } }, { @@ -28105,21 +28105,21 @@ "blobs_needed": 1, "block_number": 299, "l1_block_number": 20974053, - "mana_spent": 98745541, - "size_in_fields": 3390, + "mana_spent": 82915192, + "size_in_fields": 2835, "slot_number": 299, "timestamp": 1729032587 }, "fee_header": { - "eth_per_fee_asset": 11455569, - "excess_mana": 1322695433, - "mana_used": 98745541 + "eth_per_fee_asset": 12088678, + "excess_mana": 1018552859, + "mana_used": 82915192 }, "oracle_input": { - "fee_asset_price_modifier": -43 + "fee_asset_price_modifier": -88 }, "outputs": { - "eth_per_fee_asset_at_execution": 11505041, + "eth_per_fee_asset_at_execution": 12196003, "l1_fee_oracle_output": { "base_fee": 9306209488, "blob_fee": 69572 @@ -28136,22 +28136,22 @@ "slot_of_change": 300 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67965477133024, - "congestion_multiplier": 4699958401, - "prover_cost": 15942587427546, - "sequencer_cost": 2426666971461 + "congestion_cost": 74063924467713, + "congestion_multiplier": 4898565771, + "prover_cost": 15945490174117, + "sequencer_cost": 3052246133426 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781945601, - "congestion_multiplier": 4699958401, - "prover_cost": 183420122, - "sequencer_cost": 27918903 + "congestion_cost": 903283845, + "congestion_multiplier": 4898565771, + "prover_cost": 194471246, + "sequencer_cost": 37225203 } }, "parent_fee_header": { - "eth_per_fee_asset": 11505041, - "excess_mana": 1338754613, - "mana_used": 83940820 + "eth_per_fee_asset": 12196003, + "excess_mana": 1027364232, + "mana_used": 66188627 } }, { @@ -28159,21 +28159,21 @@ "blobs_needed": 1, "block_number": 300, "l1_block_number": 20974056, - "mana_spent": 102442882, - "size_in_fields": 3660, + "mana_spent": 83923092, + "size_in_fields": 2985, "slot_number": 300, "timestamp": 1729032623 }, "fee_header": { - "eth_per_fee_asset": 11455569, - "excess_mana": 1321440974, - "mana_used": 102442882 + "eth_per_fee_asset": 12020981, + "excess_mana": 1026468051, + "mana_used": 83923092 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": -56 }, "outputs": { - "eth_per_fee_asset_at_execution": 11455569, + "eth_per_fee_asset_at_execution": 12088678, "l1_fee_oracle_output": { "base_fee": 9289243594, "blob_fee": 38607 @@ -28190,22 +28190,22 @@ "slot_of_change": 300 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68113666636725, - "congestion_multiplier": 4693065252, - "prover_cost": 16010974225724, - "sequencer_cost": 2432693042136 + "congestion_cost": 75857344616178, + "congestion_multiplier": 4959426763, + "prover_cost": 16084951307331, + "sequencer_cost": 3073717159147 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780280808, - "congestion_multiplier": 4693065252, - "prover_cost": 183414820, - "sequencer_cost": 27867883 + "congestion_cost": 917015013, + "congestion_multiplier": 4959426763, + "prover_cost": 194445797, + "sequencer_cost": 37157177 } }, "parent_fee_header": { - "eth_per_fee_asset": 11455569, - "excess_mana": 1322695433, - "mana_used": 98745541 + "eth_per_fee_asset": 12088678, + "excess_mana": 1018552859, + "mana_used": 82915192 } }, { @@ -28213,21 +28213,21 @@ "blobs_needed": 1, "block_number": 301, "l1_block_number": 20974059, - "mana_spent": 107102341, - "size_in_fields": 3525, + "mana_spent": 69182931, + "size_in_fields": 2385, "slot_number": 301, "timestamp": 1729032659 }, "fee_header": { - "eth_per_fee_asset": 11470461, - "excess_mana": 1323883856, - "mana_used": 107102341 + "eth_per_fee_asset": 11946450, + "excess_mana": 1035391143, + "mana_used": 69182931 }, "oracle_input": { - "fee_asset_price_modifier": 13 + "fee_asset_price_modifier": -62 }, "outputs": { - "eth_per_fee_asset_at_execution": 11455569, + "eth_per_fee_asset_at_execution": 12020981, "l1_fee_oracle_output": { "base_fee": 9289243594, "blob_fee": 38607 @@ -28244,22 +28244,22 @@ "slot_of_change": 300 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68361416268367, - "congestion_multiplier": 4706498026, - "prover_cost": 16010974225724, - "sequencer_cost": 2432693042136 + "congestion_cost": 77623914637250, + "congestion_multiplier": 5028944824, + "prover_cost": 16175534841957, + "sequencer_cost": 3091027013520 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783118921, - "congestion_multiplier": 4706498026, - "prover_cost": 183414820, - "sequencer_cost": 27867883 + "congestion_cost": 933115603, + "congestion_multiplier": 5028944824, + "prover_cost": 194445797, + "sequencer_cost": 37157177 } }, "parent_fee_header": { - "eth_per_fee_asset": 11455569, - "excess_mana": 1321440974, - "mana_used": 102442882 + "eth_per_fee_asset": 12020981, + "excess_mana": 1026468051, + "mana_used": 83923092 } }, { @@ -28267,21 +28267,21 @@ "blobs_needed": 1, "block_number": 302, "l1_block_number": 20974062, - "mana_spent": 89916419, - "size_in_fields": 3375, + "mana_spent": 67066566, + "size_in_fields": 2310, "slot_number": 302, "timestamp": 1729032695 }, "fee_header": { - "eth_per_fee_asset": 11486519, - "excess_mana": 1330986197, - "mana_used": 89916419 + "eth_per_fee_asset": 11964369, + "excess_mana": 1029574074, + "mana_used": 67066566 }, "oracle_input": { - "fee_asset_price_modifier": 14 + "fee_asset_price_modifier": 15 }, "outputs": { - "eth_per_fee_asset_at_execution": 11470461, + "eth_per_fee_asset_at_execution": 11946450, "l1_fee_oracle_output": { "base_fee": 9289243594, "blob_fee": 38607 @@ -28298,22 +28298,22 @@ "slot_of_change": 300 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68996055781891, - "congestion_multiplier": 4745770744, - "prover_cost": 15990187316796, - "sequencer_cost": 2429534697865 + "congestion_cost": 77227463137585, + "congestion_multiplier": 4983515461, + "prover_cost": 16276450075127, + "sequencer_cost": 3110311180309 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791416567, - "congestion_multiplier": 4745770744, - "prover_cost": 183414820, - "sequencer_cost": 27867883 + "congestion_cost": 922594027, + "congestion_multiplier": 4983515461, + "prover_cost": 194445797, + "sequencer_cost": 37157177 } }, "parent_fee_header": { - "eth_per_fee_asset": 11470461, - "excess_mana": 1323883856, - "mana_used": 107102341 + "eth_per_fee_asset": 11946450, + "excess_mana": 1035391143, + "mana_used": 69182931 } }, { @@ -28321,21 +28321,21 @@ "blobs_needed": 1, "block_number": 303, "l1_block_number": 20974065, - "mana_spent": 95852865, - "size_in_fields": 3495, + "mana_spent": 69825997, + "size_in_fields": 2430, "slot_number": 303, "timestamp": 1729032731 }, "fee_header": { - "eth_per_fee_asset": 11435978, - "excess_mana": 1320902616, - "mana_used": 95852865 + "eth_per_fee_asset": 11994279, + "excess_mana": 1021640640, + "mana_used": 69825997 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": 25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11486519, + "eth_per_fee_asset_at_execution": 11964369, "l1_fee_oracle_output": { "base_fee": 9289243594, "blob_fee": 38607 @@ -28352,22 +28352,22 @@ "slot_of_change": 305 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67875780295145, - "congestion_multiplier": 4690110120, - "prover_cost": 15967833248698, - "sequencer_cost": 2426138240837 + "congestion_cost": 75925235505525, + "congestion_multiplier": 4922218782, + "prover_cost": 16252072884078, + "sequencer_cost": 3105652876471 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779656440, - "congestion_multiplier": 4690110120, - "prover_cost": 183414820, - "sequencer_cost": 27867883 + "congestion_cost": 908397534, + "congestion_multiplier": 4922218782, + "prover_cost": 194445797, + "sequencer_cost": 37157177 } }, "parent_fee_header": { - "eth_per_fee_asset": 11486519, - "excess_mana": 1330986197, - "mana_used": 89916419 + "eth_per_fee_asset": 11964369, + "excess_mana": 1029574074, + "mana_used": 67066566 } }, { @@ -28375,21 +28375,21 @@ "blobs_needed": 1, "block_number": 304, "l1_block_number": 20974068, - "mana_spent": 92640358, - "size_in_fields": 3420, + "mana_spent": 84935697, + "size_in_fields": 2970, "slot_number": 304, "timestamp": 1729032767 }, "fee_header": { - "eth_per_fee_asset": 11406244, - "excess_mana": 1316755481, - "mana_used": 92640358 + "eth_per_fee_asset": 12006273, + "excess_mana": 1016466637, + "mana_used": 84935697 }, "oracle_input": { - "fee_asset_price_modifier": -26 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 11435978, + "eth_per_fee_asset_at_execution": 11994279, "l1_fee_oracle_output": { "base_fee": 9289243594, "blob_fee": 38607 @@ -28406,22 +28406,22 @@ "slot_of_change": 305 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67756330328723, - "congestion_multiplier": 4667408133, - "prover_cost": 16038402662195, - "sequencer_cost": 2436860494136 + "congestion_cost": 74971835989475, + "congestion_multiplier": 4882649272, + "prover_cost": 16211545270875, + "sequencer_cost": 3097908344470 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774859903, - "congestion_multiplier": 4667408133, - "prover_cost": 183414820, - "sequencer_cost": 27867883 + "congestion_cost": 899233118, + "congestion_multiplier": 4882649272, + "prover_cost": 194445797, + "sequencer_cost": 37157177 } }, "parent_fee_header": { - "eth_per_fee_asset": 11435978, - "excess_mana": 1320902616, - "mana_used": 95852865 + "eth_per_fee_asset": 11994279, + "excess_mana": 1021640640, + "mana_used": 69825997 } }, { @@ -28429,21 +28429,21 @@ "blobs_needed": 1, "block_number": 305, "l1_block_number": 20974071, - "mana_spent": 113121443, - "size_in_fields": 3960, + "mana_spent": 75990837, + "size_in_fields": 2655, "slot_number": 305, "timestamp": 1729032803 }, "fee_header": { - "eth_per_fee_asset": 11391415, - "excess_mana": 1309395839, - "mana_used": 113121443 + "eth_per_fee_asset": 12009874, + "excess_mana": 1026402334, + "mana_used": 75990837 }, "oracle_input": { - "fee_asset_price_modifier": -13 + "fee_asset_price_modifier": 3 }, "outputs": { - "eth_per_fee_asset_at_execution": 11406244, + "eth_per_fee_asset_at_execution": 12006273, "l1_fee_oracle_output": { "base_fee": 8774425004, "blob_fee": 25067 @@ -28460,22 +28460,22 @@ "slot_of_change": 305 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66649353021030, - "congestion_multiplier": 4627390641, - "prover_cost": 16066107212857, - "sequencer_cost": 2307803866023 + "congestion_cost": 75434508110886, + "congestion_multiplier": 4958918356, + "prover_cost": 16131031586572, + "sequencer_cost": 2923291182868 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760218783, - "congestion_multiplier": 4627390641, - "prover_cost": 183253939, - "sequencer_cost": 26323374 + "congestion_cost": 905687298, + "congestion_multiplier": 4958918356, + "prover_cost": 193673569, + "sequencer_cost": 35097832 } }, "parent_fee_header": { - "eth_per_fee_asset": 11406244, - "excess_mana": 1316755481, - "mana_used": 92640358 + "eth_per_fee_asset": 12006273, + "excess_mana": 1016466637, + "mana_used": 84935697 } }, { @@ -28483,21 +28483,21 @@ "blobs_needed": 1, "block_number": 306, "l1_block_number": 20974074, - "mana_spent": 109149367, - "size_in_fields": 3585, + "mana_spent": 79988650, + "size_in_fields": 2745, "slot_number": 306, "timestamp": 1729032839 }, "fee_header": { - "eth_per_fee_asset": 11393693, - "excess_mana": 1322517282, - "mana_used": 109149367 + "eth_per_fee_asset": 11890976, + "excess_mana": 1027393171, + "mana_used": 79988650 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": -99 }, "outputs": { - "eth_per_fee_asset_at_execution": 11391415, + "eth_per_fee_asset_at_execution": 12009874, "l1_fee_oracle_output": { "base_fee": 8774425004, "blob_fee": 25067 @@ -28514,22 +28514,22 @@ "slot_of_change": 305 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68053183033013, - "congestion_multiplier": 4698978859, - "prover_cost": 16087021585993, - "sequencer_cost": 2310808095395 + "congestion_cost": 75558011099867, + "congestion_multiplier": 4966589311, + "prover_cost": 16126194912620, + "sequencer_cost": 2922414673127 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 775222050, - "congestion_multiplier": 4698978859, - "prover_cost": 183253939, - "sequencer_cost": 26323374 + "congestion_cost": 907442193, + "congestion_multiplier": 4966589311, + "prover_cost": 193673569, + "sequencer_cost": 35097832 } }, "parent_fee_header": { - "eth_per_fee_asset": 11391415, - "excess_mana": 1309395839, - "mana_used": 113121443 + "eth_per_fee_asset": 12009874, + "excess_mana": 1026402334, + "mana_used": 75990837 } }, { @@ -28537,21 +28537,21 @@ "blobs_needed": 1, "block_number": 307, "l1_block_number": 20974077, - "mana_spent": 100483896, - "size_in_fields": 3435, + "mana_spent": 63929957, + "size_in_fields": 2400, "slot_number": 307, "timestamp": 1729032875 }, "fee_header": { - "eth_per_fee_asset": 11421037, - "excess_mana": 1331666649, - "mana_used": 100483896 + "eth_per_fee_asset": 11915947, + "excess_mana": 1032381821, + "mana_used": 63929957 }, "oracle_input": { - "fee_asset_price_modifier": 24 + "fee_asset_price_modifier": 21 }, "outputs": { - "eth_per_fee_asset_at_execution": 11393693, + "eth_per_fee_asset_at_execution": 11890976, "l1_fee_oracle_output": { "base_fee": 8774425004, "blob_fee": 25067 @@ -28568,22 +28568,22 @@ "slot_of_change": 305 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68969799080948, - "congestion_multiplier": 4749550493, - "prover_cost": 16083805224523, - "sequencer_cost": 2310346083575 + "congestion_cost": 77060035946587, + "congestion_multiplier": 5005391559, + "prover_cost": 16287440913177, + "sequencer_cost": 2951635929633 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785820717, - "congestion_multiplier": 4749550493, - "prover_cost": 183253939, - "sequencer_cost": 26323374 + "congestion_cost": 916319038, + "congestion_multiplier": 5005391559, + "prover_cost": 193673569, + "sequencer_cost": 35097832 } }, "parent_fee_header": { - "eth_per_fee_asset": 11393693, - "excess_mana": 1322517282, - "mana_used": 109149367 + "eth_per_fee_asset": 11890976, + "excess_mana": 1027393171, + "mana_used": 79988650 } }, { @@ -28591,21 +28591,21 @@ "blobs_needed": 1, "block_number": 308, "l1_block_number": 20974080, - "mana_spent": 108746593, - "size_in_fields": 3495, + "mana_spent": 78859929, + "size_in_fields": 2715, "slot_number": 308, "timestamp": 1729032911 }, "fee_header": { - "eth_per_fee_asset": 11416468, - "excess_mana": 1332150545, - "mana_used": 108746593 + "eth_per_fee_asset": 11899264, + "excess_mana": 1021311778, + "mana_used": 78859929 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": -14 }, "outputs": { - "eth_per_fee_asset_at_execution": 11421037, + "eth_per_fee_asset_at_execution": 11915947, "l1_fee_oracle_output": { "base_fee": 8774425004, "blob_fee": 25067 @@ -28622,22 +28622,22 @@ "slot_of_change": 310 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68854030417729, - "congestion_multiplier": 4752240252, - "prover_cost": 16045297725592, - "sequencer_cost": 2304814702904 + "congestion_cost": 75253266483982, + "congestion_multiplier": 4919694210, + "prover_cost": 16253309032006, + "sequencer_cost": 2945450495878 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786384429, - "congestion_multiplier": 4752240252, - "prover_cost": 183253939, - "sequencer_cost": 26323374 + "congestion_cost": 896713935, + "congestion_multiplier": 4919694210, + "prover_cost": 193673569, + "sequencer_cost": 35097832 } }, "parent_fee_header": { - "eth_per_fee_asset": 11421037, - "excess_mana": 1331666649, - "mana_used": 100483896 + "eth_per_fee_asset": 11915947, + "excess_mana": 1032381821, + "mana_used": 63929957 } }, { @@ -28645,21 +28645,21 @@ "blobs_needed": 1, "block_number": 309, "l1_block_number": 20974083, - "mana_spent": 94237206, - "size_in_fields": 3240, + "mana_spent": 69528023, + "size_in_fields": 2715, "slot_number": 309, "timestamp": 1729032947 }, "fee_header": { - "eth_per_fee_asset": 11391351, - "excess_mana": 1340897138, - "mana_used": 94237206 + "eth_per_fee_asset": 12001597, + "excess_mana": 1025171707, + "mana_used": 69528023 }, "oracle_input": { - "fee_asset_price_modifier": -22 + "fee_asset_price_modifier": 86 }, "outputs": { - "eth_per_fee_asset_at_execution": 11416468, + "eth_per_fee_asset_at_execution": 11899264, "l1_fee_oracle_output": { "base_fee": 8774425004, "blob_fee": 25067 @@ -28676,22 +28676,22 @@ "slot_of_change": 310 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69778932240690, - "congestion_multiplier": 4801122058, - "prover_cost": 16051719235757, - "sequencer_cost": 2305737115893 + "congestion_cost": 75930030462389, + "congestion_multiplier": 4949407465, + "prover_cost": 16276096487985, + "sequencer_cost": 2949580074869 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796628947, - "congestion_multiplier": 4801122058, - "prover_cost": 183253939, - "sequencer_cost": 26323374 + "congestion_cost": 903511478, + "congestion_multiplier": 4949407465, + "prover_cost": 193673569, + "sequencer_cost": 35097832 } }, "parent_fee_header": { - "eth_per_fee_asset": 11416468, - "excess_mana": 1332150545, - "mana_used": 108746593 + "eth_per_fee_asset": 11899264, + "excess_mana": 1021311778, + "mana_used": 78859929 } }, { @@ -28699,21 +28699,21 @@ "blobs_needed": 1, "block_number": 310, "l1_block_number": 20974086, - "mana_spent": 90448276, - "size_in_fields": 3300, + "mana_spent": 76662280, + "size_in_fields": 2685, "slot_number": 310, "timestamp": 1729032983 }, "fee_header": { - "eth_per_fee_asset": 11422107, - "excess_mana": 1335134344, - "mana_used": 90448276 + "eth_per_fee_asset": 11922386, + "excess_mana": 1019699730, + "mana_used": 76662280 }, "oracle_input": { - "fee_asset_price_modifier": 27 + "fee_asset_price_modifier": -66 }, "outputs": { - "eth_per_fee_asset_at_execution": 11391351, + "eth_per_fee_asset_at_execution": 12001597, "l1_fee_oracle_output": { "base_fee": 8631635582, "blob_fee": 13375 @@ -28730,22 +28730,22 @@ "slot_of_change": 310 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69182720293669, - "congestion_multiplier": 4768859528, - "prover_cost": 16083194873023, - "sequencer_cost": 2273212369631 + "congestion_cost": 74224979558971, + "congestion_multiplier": 4907337732, + "prover_cost": 16119470183844, + "sequencer_cost": 2876834891224 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788084650, - "congestion_multiplier": 4768859528, - "prover_cost": 183209318, - "sequencer_cost": 25894960 + "congestion_cost": 890818292, + "congestion_multiplier": 4907337732, + "prover_cost": 193459385, + "sequencer_cost": 34526613 } }, "parent_fee_header": { - "eth_per_fee_asset": 11391351, - "excess_mana": 1340897138, - "mana_used": 94237206 + "eth_per_fee_asset": 12001597, + "excess_mana": 1025171707, + "mana_used": 69528023 } }, { @@ -28753,21 +28753,21 @@ "blobs_needed": 1, "block_number": 311, "l1_block_number": 20974089, - "mana_spent": 97121891, - "size_in_fields": 3420, + "mana_spent": 68596871, + "size_in_fields": 2565, "slot_number": 311, "timestamp": 1729033019 }, "fee_header": { - "eth_per_fee_asset": 11362712, - "excess_mana": 1325582620, - "mana_used": 97121891 + "eth_per_fee_asset": 11989151, + "excess_mana": 1021362010, + "mana_used": 68596871 }, "oracle_input": { - "fee_asset_price_modifier": -52 + "fee_asset_price_modifier": 56 }, "outputs": { - "eth_per_fee_asset_at_execution": 11422107, + "eth_per_fee_asset_at_execution": 11922386, "l1_fee_oracle_output": { "base_fee": 8631635582, "blob_fee": 13375 @@ -28784,22 +28784,22 @@ "slot_of_change": 310 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68026204534768, - "congestion_multiplier": 4715861747, - "prover_cost": 16039888087198, - "sequencer_cost": 2267091351885 + "congestion_cost": 74961781307870, + "congestion_multiplier": 4920079742, + "prover_cost": 16226566142046, + "sequencer_cost": 2895948260693 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777002587, - "congestion_multiplier": 4715861747, - "prover_cost": 183209318, - "sequencer_cost": 25894960 + "congestion_cost": 893723292, + "congestion_multiplier": 4920079742, + "prover_cost": 193459385, + "sequencer_cost": 34526613 } }, "parent_fee_header": { - "eth_per_fee_asset": 11422107, - "excess_mana": 1335134344, - "mana_used": 90448276 + "eth_per_fee_asset": 11922386, + "excess_mana": 1019699730, + "mana_used": 76662280 } }, { @@ -28807,21 +28807,21 @@ "blobs_needed": 1, "block_number": 312, "l1_block_number": 20974092, - "mana_spent": 93539900, - "size_in_fields": 3480, + "mana_spent": 77459681, + "size_in_fields": 2745, "slot_number": 312, "timestamp": 1729033055 }, "fee_header": { - "eth_per_fee_asset": 11327487, - "excess_mana": 1322704511, - "mana_used": 93539900 + "eth_per_fee_asset": 12002339, + "excess_mana": 1014958881, + "mana_used": 77459681 }, "oracle_input": { - "fee_asset_price_modifier": -31 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 11362712, + "eth_per_fee_asset_at_execution": 11989151, "l1_fee_oracle_output": { "base_fee": 8631635582, "blob_fee": 13375 @@ -28838,22 +28838,22 @@ "slot_of_change": 310 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68090044700597, - "congestion_multiplier": 4700008320, - "prover_cost": 16123731552820, - "sequencer_cost": 2278941858247 + "congestion_cost": 73614424073899, + "congestion_multiplier": 4871178291, + "prover_cost": 16136203889667, + "sequencer_cost": 2879821348485 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 773687568, - "congestion_multiplier": 4700008320, - "prover_cost": 183209318, - "sequencer_cost": 25894960 + "congestion_cost": 882574446, + "congestion_multiplier": 4871178291, + "prover_cost": 193459385, + "sequencer_cost": 34526613 } }, "parent_fee_header": { - "eth_per_fee_asset": 11362712, - "excess_mana": 1325582620, - "mana_used": 97121891 + "eth_per_fee_asset": 11989151, + "excess_mana": 1021362010, + "mana_used": 68596871 } }, { @@ -28861,21 +28861,21 @@ "blobs_needed": 1, "block_number": 313, "l1_block_number": 20974095, - "mana_spent": 93231253, - "size_in_fields": 3300, + "mana_spent": 80328191, + "size_in_fields": 2895, "slot_number": 313, "timestamp": 1729033091 }, "fee_header": { - "eth_per_fee_asset": 11363734, - "excess_mana": 1316244411, - "mana_used": 93231253 + "eth_per_fee_asset": 12063550, + "excess_mana": 1017418562, + "mana_used": 80328191 }, "oracle_input": { - "fee_asset_price_modifier": 32 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 11327487, + "eth_per_fee_asset_at_execution": 12002339, "l1_fee_oracle_output": { "base_fee": 8631635582, "blob_fee": 13375 @@ -28892,22 +28892,22 @@ "slot_of_change": 315 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67648483463279, - "congestion_multiplier": 4664618081, - "prover_cost": 16173871397955, - "sequencer_cost": 2286028666376 + "congestion_cost": 73889261584763, + "congestion_multiplier": 4889905407, + "prover_cost": 16118473657510, + "sequencer_cost": 2876657041599 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 766287317, - "congestion_multiplier": 4664618081, - "prover_cost": 183209318, - "sequencer_cost": 25894960 + "congestion_cost": 886843966, + "congestion_multiplier": 4889905407, + "prover_cost": 193459385, + "sequencer_cost": 34526613 } }, "parent_fee_header": { - "eth_per_fee_asset": 11327487, - "excess_mana": 1322704511, - "mana_used": 93539900 + "eth_per_fee_asset": 12002339, + "excess_mana": 1014958881, + "mana_used": 77459681 } }, { @@ -28915,21 +28915,21 @@ "blobs_needed": 1, "block_number": 314, "l1_block_number": 20974098, - "mana_spent": 100770918, - "size_in_fields": 3960, + "mana_spent": 78045193, + "size_in_fields": 2775, "slot_number": 314, "timestamp": 1729033127 }, "fee_header": { - "eth_per_fee_asset": 11380779, - "excess_mana": 1309475664, - "mana_used": 100770918 + "eth_per_fee_asset": 12004438, + "excess_mana": 1022746753, + "mana_used": 78045193 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -49 }, "outputs": { - "eth_per_fee_asset_at_execution": 11363734, + "eth_per_fee_asset_at_execution": 12063550, "l1_fee_oracle_output": { "base_fee": 8631635582, "blob_fee": 13375 @@ -28946,22 +28946,22 @@ "slot_of_change": 315 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66755634635588, - "congestion_multiplier": 4627822838, - "prover_cost": 16122281461358, - "sequencer_cost": 2278736901093 + "congestion_cost": 74285680914822, + "congestion_multiplier": 4930719581, + "prover_cost": 16036687790908, + "sequencer_cost": 2862060753261 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 758593275, - "congestion_multiplier": 4627822838, - "prover_cost": 183209318, - "sequencer_cost": 25894960 + "congestion_cost": 896149026, + "congestion_multiplier": 4930719581, + "prover_cost": 193459385, + "sequencer_cost": 34526613 } }, "parent_fee_header": { - "eth_per_fee_asset": 11363734, - "excess_mana": 1316244411, - "mana_used": 93231253 + "eth_per_fee_asset": 12063550, + "excess_mana": 1017418562, + "mana_used": 80328191 } }, { @@ -28969,21 +28969,21 @@ "blobs_needed": 1, "block_number": 315, "l1_block_number": 20974101, - "mana_spent": 118291671, - "size_in_fields": 3930, + "mana_spent": 77570932, + "size_in_fields": 2820, "slot_number": 315, "timestamp": 1729033175 }, "fee_header": { - "eth_per_fee_asset": 11491172, - "excess_mana": 1310246582, - "mana_used": 118291671 + "eth_per_fee_asset": 11933611, + "excess_mana": 1025791946, + "mana_used": 77570932 }, "oracle_input": { - "fee_asset_price_modifier": 97 + "fee_asset_price_modifier": -59 }, "outputs": { - "eth_per_fee_asset_at_execution": 11380779, + "eth_per_fee_asset_at_execution": 12004438, "l1_fee_oracle_output": { "base_fee": 8743056595, "blob_fee": 9032 @@ -29000,22 +29000,22 @@ "slot_of_change": 315 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66850164650417, - "congestion_multiplier": 4631998897, - "prover_cost": 16101194566734, - "sequencer_cost": 2304693378195 + "congestion_cost": 75299238248388, + "congestion_multiplier": 4954198695, + "prover_cost": 16129577744498, + "sequencer_cost": 2913278739080 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760806950, - "congestion_multiplier": 4631998897, - "prover_cost": 183244137, - "sequencer_cost": 26229206 + "congestion_cost": 903925037, + "congestion_multiplier": 4954198695, + "prover_cost": 193626516, + "sequencer_cost": 34972274 } }, "parent_fee_header": { - "eth_per_fee_asset": 11380779, - "excess_mana": 1309475664, - "mana_used": 100770918 + "eth_per_fee_asset": 12004438, + "excess_mana": 1022746753, + "mana_used": 78045193 } }, { @@ -29023,21 +29023,21 @@ "blobs_needed": 1, "block_number": 316, "l1_block_number": 20974103, - "mana_spent": 92977276, - "size_in_fields": 3345, + "mana_spent": 67663704, + "size_in_fields": 2415, "slot_number": 316, "timestamp": 1729033199 }, "fee_header": { - "eth_per_fee_asset": 11464742, - "excess_mana": 1328538253, - "mana_used": 92977276 + "eth_per_fee_asset": 11883489, + "excess_mana": 1028362878, + "mana_used": 67663704 }, "oracle_input": { - "fee_asset_price_modifier": -23 + "fee_asset_price_modifier": -42 }, "outputs": { - "eth_per_fee_asset_at_execution": 11491172, + "eth_per_fee_asset_at_execution": 11933611, "l1_fee_oracle_output": { "base_fee": 8743056595, "blob_fee": 9032 @@ -29054,22 +29054,22 @@ "slot_of_change": 315 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68034484298034, - "congestion_multiplier": 4732197854, - "prover_cost": 15946514158870, - "sequencer_cost": 2282552728304 + "congestion_cost": 76127529043808, + "congestion_multiplier": 4974108170, + "prover_cost": 16225308165316, + "sequencer_cost": 2930569297089 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781795961, - "congestion_multiplier": 4732197854, - "prover_cost": 183244137, - "sequencer_cost": 26229206 + "congestion_cost": 908476318, + "congestion_multiplier": 4974108170, + "prover_cost": 193626516, + "sequencer_cost": 34972274 } }, "parent_fee_header": { - "eth_per_fee_asset": 11491172, - "excess_mana": 1310246582, - "mana_used": 118291671 + "eth_per_fee_asset": 11933611, + "excess_mana": 1025791946, + "mana_used": 77570932 } }, { @@ -29077,21 +29077,21 @@ "blobs_needed": 1, "block_number": 317, "l1_block_number": 20974106, - "mana_spent": 94064111, - "size_in_fields": 3735, + "mana_spent": 69908229, + "size_in_fields": 2535, "slot_number": 317, "timestamp": 1729033235 }, "fee_header": { - "eth_per_fee_asset": 11535823, - "excess_mana": 1321515529, - "mana_used": 94064111 + "eth_per_fee_asset": 11864475, + "excess_mana": 1021026582, + "mana_used": 69908229 }, "oracle_input": { - "fee_asset_price_modifier": 62 + "fee_asset_price_modifier": -16 }, "outputs": { - "eth_per_fee_asset_at_execution": 11464742, + "eth_per_fee_asset_at_execution": 11883489, "l1_fee_oracle_output": { "base_fee": 8743056595, "blob_fee": 9032 @@ -29108,22 +29108,22 @@ "slot_of_change": 315 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67483810800104, - "congestion_multiplier": 4693474642, - "prover_cost": 15983276117335, - "sequencer_cost": 2287814762862 + "congestion_cost": 75359779186063, + "congestion_multiplier": 4917505897, + "prover_cost": 16293743024461, + "sequencer_cost": 2942929807905 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 773684480, - "congestion_multiplier": 4693474642, - "prover_cost": 183244137, - "sequencer_cost": 26229206 + "congestion_cost": 895537107, + "congestion_multiplier": 4917505897, + "prover_cost": 193626516, + "sequencer_cost": 34972274 } }, "parent_fee_header": { - "eth_per_fee_asset": 11464742, - "excess_mana": 1328538253, - "mana_used": 92977276 + "eth_per_fee_asset": 11883489, + "excess_mana": 1028362878, + "mana_used": 67663704 } }, { @@ -29131,21 +29131,21 @@ "blobs_needed": 1, "block_number": 318, "l1_block_number": 20974109, - "mana_spent": 110423071, - "size_in_fields": 3735, + "mana_spent": 81101379, + "size_in_fields": 2760, "slot_number": 318, "timestamp": 1729033271 }, "fee_header": { - "eth_per_fee_asset": 11578505, - "excess_mana": 1315579640, - "mana_used": 110423071 + "eth_per_fee_asset": 11769559, + "excess_mana": 1015934811, + "mana_used": 81101379 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": -80 }, "outputs": { - "eth_per_fee_asset_at_execution": 11535823, + "eth_per_fee_asset_at_execution": 11864475, "l1_fee_oracle_output": { "base_fee": 8743056595, "blob_fee": 9032 @@ -29162,22 +29162,22 @@ "slot_of_change": 320 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66478144992343, - "congestion_multiplier": 4660991436, - "prover_cost": 15884790968100, - "sequencer_cost": 2273717791960 + "congestion_cost": 74730932637138, + "congestion_multiplier": 4878600069, + "prover_cost": 16319855366546, + "sequencer_cost": 2947646145321 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 766880114, - "congestion_multiplier": 4660991436, - "prover_cost": 183244137, - "sequencer_cost": 26229206 + "congestion_cost": 886643282, + "congestion_multiplier": 4878600069, + "prover_cost": 193626516, + "sequencer_cost": 34972274 } }, "parent_fee_header": { - "eth_per_fee_asset": 11535823, - "excess_mana": 1321515529, - "mana_used": 94064111 + "eth_per_fee_asset": 11864475, + "excess_mana": 1021026582, + "mana_used": 69908229 } }, { @@ -29185,21 +29185,21 @@ "blobs_needed": 1, "block_number": 319, "l1_block_number": 20974112, - "mana_spent": 80925078, - "size_in_fields": 3030, + "mana_spent": 73672050, + "size_in_fields": 2670, "slot_number": 319, "timestamp": 1729033307 }, "fee_header": { - "eth_per_fee_asset": 11658396, - "excess_mana": 1326002711, - "mana_used": 80925078 + "eth_per_fee_asset": 11751904, + "excess_mana": 1022036190, + "mana_used": 73672050 }, "oracle_input": { - "fee_asset_price_modifier": 69 + "fee_asset_price_modifier": -15 }, "outputs": { - "eth_per_fee_asset_at_execution": 11578505, + "eth_per_fee_asset_at_execution": 11769559, "l1_fee_oracle_output": { "base_fee": 8743056595, "blob_fee": 9032 @@ -29216,44 +29216,44 @@ "slot_of_change": 320 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67267720228130, - "congestion_multiplier": 4718180194, - "prover_cost": 15826234647738, - "sequencer_cost": 2265336155230 + "congestion_cost": 76239815187638, + "congestion_multiplier": 4925257014, + "prover_cost": 16451467382933, + "sequencer_cost": 2971417535696 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778859635, - "congestion_multiplier": 4718180194, - "prover_cost": 183244137, - "sequencer_cost": 26229206 + "congestion_cost": 897309003, + "congestion_multiplier": 4925257014, + "prover_cost": 193626516, + "sequencer_cost": 34972274 } }, "parent_fee_header": { - "eth_per_fee_asset": 11578505, - "excess_mana": 1315579640, - "mana_used": 110423071 + "eth_per_fee_asset": 11769559, + "excess_mana": 1015934811, + "mana_used": 81101379 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 320, "l1_block_number": 20974115, - "mana_spent": 115540565, - "size_in_fields": 4200, + "mana_spent": 61454784, + "size_in_fields": 2250, "slot_number": 320, "timestamp": 1729033343 }, "fee_header": { - "eth_per_fee_asset": 11643240, - "excess_mana": 1306927789, - "mana_used": 115540565 + "eth_per_fee_asset": 11716648, + "excess_mana": 1020708240, + "mana_used": 61454784 }, "oracle_input": { - "fee_asset_price_modifier": -13 + "fee_asset_price_modifier": -30 }, "outputs": { - "eth_per_fee_asset_at_execution": 11658396, + "eth_per_fee_asset_at_execution": 11751904, "l1_fee_oracle_output": { "base_fee": 9495549897, "blob_fee": 5638 @@ -29270,22 +29270,22 @@ "slot_of_change": 320 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65708448829496, - "congestion_multiplier": 4614047776, - "prover_cost": 15737953231303, - "sequencer_cost": 2443446937298 + "congestion_cost": 77534861244612, + "congestion_multiplier": 4915064403, + "prover_cost": 16572229997795, + "sequencer_cost": 3232006490183 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 766055117, - "congestion_multiplier": 4614047776, - "prover_cost": 183479291, - "sequencer_cost": 28486672 + "congestion_cost": 911182246, + "congestion_multiplier": 4915064403, + "prover_cost": 194755256, + "sequencer_cost": 37982230 } }, "parent_fee_header": { - "eth_per_fee_asset": 11658396, - "excess_mana": 1326002711, - "mana_used": 80925078 + "eth_per_fee_asset": 11751904, + "excess_mana": 1022036190, + "mana_used": 73672050 } }, { @@ -29293,21 +29293,21 @@ "blobs_needed": 1, "block_number": 321, "l1_block_number": 20974118, - "mana_spent": 105363983, - "size_in_fields": 3585, + "mana_spent": 90913957, + "size_in_fields": 3315, "slot_number": 321, "timestamp": 1729033379 }, "fee_header": { - "eth_per_fee_asset": 11612967, - "excess_mana": 1322468354, - "mana_used": 105363983 + "eth_per_fee_asset": 11675639, + "excess_mana": 1007163024, + "mana_used": 90913957 }, "oracle_input": { - "fee_asset_price_modifier": -26 + "fee_asset_price_modifier": -35 }, "outputs": { - "eth_per_fee_asset_at_execution": 11643240, + "eth_per_fee_asset_at_execution": 11716648, "l1_fee_oracle_output": { "base_fee": 9495549897, "blob_fee": 5638 @@ -29324,22 +29324,22 @@ "slot_of_change": 320 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67335260546034, - "congestion_multiplier": 4698709870, - "prover_cost": 15758439317579, - "sequencer_cost": 2446627571020 + "congestion_cost": 75726794813671, + "congestion_multiplier": 4812296052, + "prover_cost": 16622096695233, + "sequencer_cost": 3241731764922 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784000599, - "congestion_multiplier": 4698709870, - "prover_cost": 183479291, - "sequencer_cost": 28486672 + "congestion_cost": 887264199, + "congestion_multiplier": 4812296052, + "prover_cost": 194755256, + "sequencer_cost": 37982230 } }, "parent_fee_header": { - "eth_per_fee_asset": 11643240, - "excess_mana": 1306927789, - "mana_used": 115540565 + "eth_per_fee_asset": 11716648, + "excess_mana": 1020708240, + "mana_used": 61454784 } }, { @@ -29347,21 +29347,21 @@ "blobs_needed": 1, "block_number": 322, "l1_block_number": 20974121, - "mana_spent": 98638176, - "size_in_fields": 3300, + "mana_spent": 64423394, + "size_in_fields": 2445, "slot_number": 322, "timestamp": 1729033415 }, "fee_header": { - "eth_per_fee_asset": 11673354, - "excess_mana": 1327832337, - "mana_used": 98638176 + "eth_per_fee_asset": 11646449, + "excess_mana": 1023076981, + "mana_used": 64423394 }, "oracle_input": { - "fee_asset_price_modifier": 52 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11612967, + "eth_per_fee_asset_at_execution": 11675639, "l1_fee_oracle_output": { "base_fee": 9495549897, "blob_fee": 5638 @@ -29378,22 +29378,22 @@ "slot_of_change": 320 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68050723040891, - "congestion_multiplier": 4728291043, - "prover_cost": 15799518848198, - "sequencer_cost": 2453005506690 + "congestion_cost": 78404027308484, + "congestion_multiplier": 4933260324, + "prover_cost": 16680479415303, + "sequencer_cost": 3253117880743 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790270801, - "congestion_multiplier": 4728291043, - "prover_cost": 183479291, - "sequencer_cost": 28486672 + "congestion_cost": 915417119, + "congestion_multiplier": 4933260324, + "prover_cost": 194755256, + "sequencer_cost": 37982230 } }, "parent_fee_header": { - "eth_per_fee_asset": 11612967, - "excess_mana": 1322468354, - "mana_used": 105363983 + "eth_per_fee_asset": 11675639, + "excess_mana": 1007163024, + "mana_used": 90913957 } }, { @@ -29401,21 +29401,21 @@ "blobs_needed": 1, "block_number": 323, "l1_block_number": 20974124, - "mana_spent": 103182697, - "size_in_fields": 3480, + "mana_spent": 83306921, + "size_in_fields": 2880, "slot_number": 323, "timestamp": 1729033451 }, "fee_header": { - "eth_per_fee_asset": 11556620, - "excess_mana": 1326470513, - "mana_used": 103182697 + "eth_per_fee_asset": 11651107, + "excess_mana": 1012500375, + "mana_used": 83306921 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 4 }, "outputs": { - "eth_per_fee_asset_at_execution": 11673354, + "eth_per_fee_asset_at_execution": 11646449, "l1_fee_oracle_output": { "base_fee": 9495549897, "blob_fee": 5638 @@ -29432,22 +29432,22 @@ "slot_of_change": 325 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67562002660076, - "congestion_multiplier": 4720763294, - "prover_cost": 15717786935957, - "sequencer_cost": 2440315953753 + "congestion_cost": 76987291405304, + "congestion_multiplier": 4852531791, + "prover_cost": 16722286423957, + "sequencer_cost": 3261271311110 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788675174, - "congestion_multiplier": 4720763294, - "prover_cost": 183479291, - "sequencer_cost": 28486672 + "congestion_cost": 896628563, + "congestion_multiplier": 4852531791, + "prover_cost": 194755256, + "sequencer_cost": 37982230 } }, "parent_fee_header": { - "eth_per_fee_asset": 11673354, - "excess_mana": 1327832337, - "mana_used": 98638176 + "eth_per_fee_asset": 11646449, + "excess_mana": 1023076981, + "mana_used": 64423394 } }, { @@ -29455,21 +29455,21 @@ "blobs_needed": 1, "block_number": 324, "l1_block_number": 20974127, - "mana_spent": 93440372, - "size_in_fields": 3015, + "mana_spent": 73417396, + "size_in_fields": 2565, "slot_number": 324, "timestamp": 1729033487 }, "fee_header": { - "eth_per_fee_asset": 11556620, - "excess_mana": 1329653210, - "mana_used": 93440372 + "eth_per_fee_asset": 11651107, + "excess_mana": 1020807296, + "mana_used": 73417396 }, "oracle_input": { "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 11556620, + "eth_per_fee_asset_at_execution": 11651107, "l1_fee_oracle_output": { "base_fee": 9495549897, "blob_fee": 5638 @@ -29486,22 +29486,22 @@ "slot_of_change": 325 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68567475870973, - "congestion_multiplier": 4738375033, - "prover_cost": 15876553092514, - "sequencer_cost": 2464965707967 + "congestion_cost": 78220810005436, + "congestion_multiplier": 4915823973, + "prover_cost": 16715601015423, + "sequencer_cost": 3259967486352 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 792408263, - "congestion_multiplier": 4738375033, - "prover_cost": 183479291, - "sequencer_cost": 28486672 + "congestion_cost": 911359027, + "congestion_multiplier": 4915823973, + "prover_cost": 194755256, + "sequencer_cost": 37982230 } }, "parent_fee_header": { - "eth_per_fee_asset": 11556620, - "excess_mana": 1326470513, - "mana_used": 103182697 + "eth_per_fee_asset": 11651107, + "excess_mana": 1012500375, + "mana_used": 83306921 } }, { @@ -29509,21 +29509,21 @@ "blobs_needed": 1, "block_number": 325, "l1_block_number": 20974130, - "mana_spent": 65409790, - "size_in_fields": 2520, + "mana_spent": 75382995, + "size_in_fields": 2625, "slot_number": 325, "timestamp": 1729033523 }, "fee_header": { - "eth_per_fee_asset": 11498836, - "excess_mana": 1323093582, - "mana_used": 65409790 + "eth_per_fee_asset": 11712857, + "excess_mana": 1019224692, + "mana_used": 75382995 }, "oracle_input": { - "fee_asset_price_modifier": -50 + "fee_asset_price_modifier": 53 }, "outputs": { - "eth_per_fee_asset_at_execution": 11556620, + "eth_per_fee_asset_at_execution": 11651107, "l1_fee_oracle_output": { "base_fee": 10608376541, "blob_fee": 3661 @@ -29540,22 +29540,22 @@ "slot_of_change": 325 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69083902213624, - "congestion_multiplier": 4702148313, - "prover_cost": 15906644762916, - "sequencer_cost": 2753845415009 + "congestion_cost": 80029360729414, + "congestion_multiplier": 4903702451, + "prover_cost": 16858869805247, + "sequencer_cost": 3642016677042 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798376406, - "congestion_multiplier": 4702148313, - "prover_cost": 183827049, - "sequencer_cost": 31825145 + "congestion_cost": 932430645, + "congestion_multiplier": 4903702451, + "prover_cost": 196424496, + "sequencer_cost": 42433526 } }, "parent_fee_header": { - "eth_per_fee_asset": 11556620, - "excess_mana": 1329653210, - "mana_used": 93440372 + "eth_per_fee_asset": 11651107, + "excess_mana": 1020807296, + "mana_used": 73417396 } }, { @@ -29563,21 +29563,21 @@ "blobs_needed": 1, "block_number": 326, "l1_block_number": 20974133, - "mana_spent": 18291767, - "size_in_fields": 765, + "mana_spent": 67074472, + "size_in_fields": 2655, "slot_number": 326, "timestamp": 1729033559 }, "fee_header": { - "eth_per_fee_asset": 11529882, - "excess_mana": 1288503372, - "mana_used": 18291767 + "eth_per_fee_asset": 11752680, + "excess_mana": 1019607687, + "mana_used": 67074472 }, "oracle_input": { - "fee_asset_price_modifier": 27 + "fee_asset_price_modifier": 34 }, "outputs": { - "eth_per_fee_asset_at_execution": 11498836, + "eth_per_fee_asset_at_execution": 11712857, "l1_fee_oracle_output": { "base_fee": 10608376541, "blob_fee": 3661 @@ -29594,44 +29594,44 @@ "slot_of_change": 325 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65933408042345, - "congestion_multiplier": 4515649121, - "prover_cost": 15986578902422, - "sequencer_cost": 2767684050804 + "congestion_cost": 79667212448680, + "congestion_multiplier": 4906633152, + "prover_cost": 16769990105745, + "sequencer_cost": 3622816021745 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 758157446, - "congestion_multiplier": 4515649121, - "prover_cost": 183827049, - "sequencer_cost": 31825145 + "congestion_cost": 933130667, + "congestion_multiplier": 4906633152, + "prover_cost": 196424496, + "sequencer_cost": 42433526 } }, "parent_fee_header": { - "eth_per_fee_asset": 11498836, - "excess_mana": 1323093582, - "mana_used": 65409790 + "eth_per_fee_asset": 11712857, + "excess_mana": 1019224692, + "mana_used": 75382995 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 327, "l1_block_number": 20974136, - "mana_spent": 188322510, - "size_in_fields": 6690, + "mana_spent": 84216561, + "size_in_fields": 2895, "slot_number": 327, "timestamp": 1729033595 }, "fee_header": { - "eth_per_fee_asset": 11600214, - "excess_mana": 1206795139, - "mana_used": 188322510 + "eth_per_fee_asset": 11706844, + "excess_mana": 1011682159, + "mana_used": 84216561 }, "oracle_input": { - "fee_asset_price_modifier": 61 + "fee_asset_price_modifier": -39 }, "outputs": { - "eth_per_fee_asset_at_execution": 11529882, + "eth_per_fee_asset_at_execution": 11752680, "l1_fee_oracle_output": { "base_fee": 10608376541, "blob_fee": 3661 @@ -29648,44 +29648,44 @@ "slot_of_change": 325 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 58055578626044, - "congestion_multiplier": 4103951597, - "prover_cost": 15943532553066, - "sequencer_cost": 2760231631166 + "congestion_cost": 78171924616343, + "congestion_multiplier": 4846341888, + "prover_cost": 16713166358652, + "sequencer_cost": 3610540404402 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 669373971, - "congestion_multiplier": 4103951597, - "prover_cost": 183827049, - "sequencer_cost": 31825145 + "congestion_cost": 918729615, + "congestion_multiplier": 4846341888, + "prover_cost": 196424496, + "sequencer_cost": 42433526 } }, "parent_fee_header": { - "eth_per_fee_asset": 11529882, - "excess_mana": 1288503372, - "mana_used": 18291767 + "eth_per_fee_asset": 11752680, + "excess_mana": 1019607687, + "mana_used": 67074472 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 328, "l1_block_number": 20974139, - "mana_spent": 126315456, - "size_in_fields": 4275, + "mana_spent": 77340193, + "size_in_fields": 2745, "slot_number": 328, "timestamp": 1729033631 }, "fee_header": { - "eth_per_fee_asset": 11617614, - "excess_mana": 1295117649, - "mana_used": 126315456 + "eth_per_fee_asset": 11656504, + "excess_mana": 1020898720, + "mana_used": 77340193 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -43 }, "outputs": { - "eth_per_fee_asset_at_execution": 11600214, + "eth_per_fee_asset_at_execution": 11706844, "l1_fee_oracle_output": { "base_fee": 10608376541, "blob_fee": 3661 @@ -29702,22 +29702,22 @@ "slot_of_change": 330 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66009360258354, - "congestion_multiplier": 4550729958, - "prover_cost": 15846867049177, - "sequencer_cost": 2743496369981 + "congestion_cost": 79909960703329, + "congestion_multiplier": 4916525125, + "prover_cost": 16778603695411, + "sequencer_cost": 3624676812983 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 765722705, - "congestion_multiplier": 4550729958, - "prover_cost": 183827049, - "sequencer_cost": 31825145 + "congestion_cost": 935493444, + "congestion_multiplier": 4916525125, + "prover_cost": 196424496, + "sequencer_cost": 42433526 } }, "parent_fee_header": { - "eth_per_fee_asset": 11600214, - "excess_mana": 1206795139, - "mana_used": 188322510 + "eth_per_fee_asset": 11706844, + "excess_mana": 1011682159, + "mana_used": 84216561 } }, { @@ -29725,21 +29725,21 @@ "blobs_needed": 1, "block_number": 329, "l1_block_number": 20974142, - "mana_spent": 87710943, - "size_in_fields": 3165, + "mana_spent": 64666615, + "size_in_fields": 2640, "slot_number": 329, "timestamp": 1729033667 }, "fee_header": { - "eth_per_fee_asset": 11630393, - "excess_mana": 1321433105, - "mana_used": 87710943 + "eth_per_fee_asset": 11626197, + "excess_mana": 1023238913, + "mana_used": 64666615 }, "oracle_input": { - "fee_asset_price_modifier": 11 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 11617614, + "eth_per_fee_asset_at_execution": 11656504, "l1_fee_oracle_output": { "base_fee": 10608376541, "blob_fee": 3661 @@ -29756,22 +29756,22 @@ "slot_of_change": 330 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68551796091694, - "congestion_multiplier": 4693022044, - "prover_cost": 15823132787852, - "sequencer_cost": 2739387364738 + "congestion_cost": 80623528718388, + "congestion_multiplier": 4934506692, + "prover_cost": 16851064092631, + "sequencer_cost": 3640330411246 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796408306, - "congestion_multiplier": 4693022044, - "prover_cost": 183827049, - "sequencer_cost": 31825145 + "congestion_cost": 939788485, + "congestion_multiplier": 4934506692, + "prover_cost": 196424496, + "sequencer_cost": 42433526 } }, "parent_fee_header": { - "eth_per_fee_asset": 11617614, - "excess_mana": 1295117649, - "mana_used": 126315456 + "eth_per_fee_asset": 11656504, + "excess_mana": 1020898720, + "mana_used": 77340193 } }, { @@ -29779,21 +29779,21 @@ "blobs_needed": 1, "block_number": 330, "l1_block_number": 20974145, - "mana_spent": 107284059, - "size_in_fields": 3630, + "mana_spent": 69351529, + "size_in_fields": 2745, "slot_number": 330, "timestamp": 1729033703 }, "fee_header": { - "eth_per_fee_asset": 11601317, - "excess_mana": 1309144048, - "mana_used": 107284059 + "eth_per_fee_asset": 11661075, + "excess_mana": 1012905528, + "mana_used": 69351529 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": 30 }, "outputs": { - "eth_per_fee_asset_at_execution": 11630393, + "eth_per_fee_asset_at_execution": 11626197, "l1_fee_oracle_output": { "base_fee": 10028608487, "blob_fee": 1736 @@ -29810,22 +29810,22 @@ "slot_of_change": 330 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66635501311091, - "congestion_multiplier": 4626027633, - "prover_cost": 15790169085430, - "sequencer_cost": 2586828579224 + "congestion_cost": 78155087772898, + "congestion_multiplier": 4855599748, + "prover_cost": 16820190127520, + "sequencer_cost": 3450349585510 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774997068, - "congestion_multiplier": 4626027633, - "prover_cost": 183645872, - "sequencer_cost": 30085833 + "congestion_cost": 908646447, + "congestion_multiplier": 4855599748, + "prover_cost": 195554844, + "sequencer_cost": 40114444 } }, "parent_fee_header": { - "eth_per_fee_asset": 11630393, - "excess_mana": 1321433105, - "mana_used": 87710943 + "eth_per_fee_asset": 11626197, + "excess_mana": 1023238913, + "mana_used": 64666615 } }, { @@ -29833,21 +29833,21 @@ "blobs_needed": 1, "block_number": 331, "l1_block_number": 20974148, - "mana_spent": 122732640, - "size_in_fields": 4020, + "mana_spent": 87066548, + "size_in_fields": 2985, "slot_number": 331, "timestamp": 1729033739 }, "fee_header": { - "eth_per_fee_asset": 11485303, - "excess_mana": 1316428107, - "mana_used": 122732640 + "eth_per_fee_asset": 11544464, + "excess_mana": 1007257057, + "mana_used": 87066548 }, "oracle_input": { "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 11601317, + "eth_per_fee_asset_at_execution": 11661075, "l1_fee_oracle_output": { "base_fee": 10028608487, "blob_fee": 1736 @@ -29864,22 +29864,22 @@ "slot_of_change": 330 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67531933486518, - "congestion_multiplier": 4665620729, - "prover_cost": 15829743467919, - "sequencer_cost": 2593311862783 + "congestion_cost": 77060431563986, + "congestion_multiplier": 4813002026, + "prover_cost": 16769881335984, + "sequencer_cost": 3440029671364 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783459368, - "congestion_multiplier": 4665620729, - "prover_cost": 183645872, - "sequencer_cost": 30085833 + "congestion_cost": 898607472, + "congestion_multiplier": 4813002026, + "prover_cost": 195554844, + "sequencer_cost": 40114444 } }, "parent_fee_header": { - "eth_per_fee_asset": 11601317, - "excess_mana": 1309144048, - "mana_used": 107284059 + "eth_per_fee_asset": 11661075, + "excess_mana": 1012905528, + "mana_used": 69351529 } }, { @@ -29887,21 +29887,21 @@ "blobs_needed": 1, "block_number": 332, "l1_block_number": 20974151, - "mana_spent": 85765863, - "size_in_fields": 2985, + "mana_spent": 81446057, + "size_in_fields": 2955, "slot_number": 332, "timestamp": 1729033775 }, "fee_header": { - "eth_per_fee_asset": 11540432, - "excess_mana": 1339160747, - "mana_used": 85765863 + "eth_per_fee_asset": 11498286, + "excess_mana": 1019323605, + "mana_used": 81446057 }, "oracle_input": { - "fee_asset_price_modifier": 48 + "fee_asset_price_modifier": -40 }, "outputs": { - "eth_per_fee_asset_at_execution": 11485303, + "eth_per_fee_asset_at_execution": 11544464, "l1_fee_oracle_output": { "base_fee": 10028608487, "blob_fee": 1736 @@ -29918,22 +29918,22 @@ "slot_of_change": 330 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70554316851720, - "congestion_multiplier": 4791378108, - "prover_cost": 15989641022096, - "sequencer_cost": 2619507121406 + "congestion_cost": 79705832336608, + "congestion_multiplier": 4904459171, + "prover_cost": 16939274443578, + "sequencer_cost": 3474777521070 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 810337707, - "congestion_multiplier": 4791378108, - "prover_cost": 183645872, - "sequencer_cost": 30085833 + "congestion_cost": 920161112, + "congestion_multiplier": 4904459171, + "prover_cost": 195554844, + "sequencer_cost": 40114444 } }, "parent_fee_header": { - "eth_per_fee_asset": 11485303, - "excess_mana": 1316428107, - "mana_used": 122732640 + "eth_per_fee_asset": 11544464, + "excess_mana": 1007257057, + "mana_used": 87066548 } }, { @@ -29941,21 +29941,21 @@ "blobs_needed": 1, "block_number": 333, "l1_block_number": 20974154, - "mana_spent": 80616829, - "size_in_fields": 2820, + "mana_spent": 73376366, + "size_in_fields": 2580, "slot_number": 333, "timestamp": 1729033811 }, "fee_header": { - "eth_per_fee_asset": 11496578, - "excess_mana": 1324926610, - "mana_used": 80616829 + "eth_per_fee_asset": 11501735, + "excess_mana": 1025769662, + "mana_used": 73376366 }, "oracle_input": { - "fee_asset_price_modifier": -38 + "fee_asset_price_modifier": 3 }, "outputs": { - "eth_per_fee_asset_at_execution": 11540432, + "eth_per_fee_asset_at_execution": 11498286, "l1_fee_oracle_output": { "base_fee": 10028608487, "blob_fee": 1736 @@ -29972,22 +29972,22 @@ "slot_of_change": 335 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68751685032242, - "congestion_multiplier": 4712243563, - "prover_cost": 15913258013219, - "sequencer_cost": 2606993655004 + "congestion_cost": 81041870414426, + "congestion_multiplier": 4954026475, + "prover_cost": 17007303871204, + "sequencer_cost": 3488732494565 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 793424146, - "congestion_multiplier": 4712243563, - "prover_cost": 183645872, - "sequencer_cost": 30085833 + "congestion_cost": 931842604, + "congestion_multiplier": 4954026475, + "prover_cost": 195554844, + "sequencer_cost": 40114444 } }, "parent_fee_header": { - "eth_per_fee_asset": 11540432, - "excess_mana": 1339160747, - "mana_used": 85765863 + "eth_per_fee_asset": 11498286, + "excess_mana": 1019323605, + "mana_used": 81446057 } }, { @@ -29995,21 +29995,21 @@ "blobs_needed": 1, "block_number": 334, "l1_block_number": 20974157, - "mana_spent": 97185748, - "size_in_fields": 3540, + "mana_spent": 72732903, + "size_in_fields": 2415, "slot_number": 334, "timestamp": 1729033847 }, "fee_header": { - "eth_per_fee_asset": 11517271, - "excess_mana": 1305543439, - "mana_used": 97185748 + "eth_per_fee_asset": 11415471, + "excess_mana": 1024146028, + "mana_used": 72732903 }, "oracle_input": { - "fee_asset_price_modifier": 18 + "fee_asset_price_modifier": -75 }, "outputs": { - "eth_per_fee_asset_at_execution": 11496578, + "eth_per_fee_asset_at_execution": 11501735, "l1_fee_oracle_output": { "base_fee": 10028608487, "blob_fee": 1736 @@ -30026,22 +30026,22 @@ "slot_of_change": 335 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67049568923901, - "congestion_multiplier": 4606580500, - "prover_cost": 15973959555618, - "sequencer_cost": 2616938101060 + "congestion_cost": 80760788785345, + "congestion_multiplier": 4941494452, + "prover_cost": 17002203928364, + "sequencer_cost": 3487686336019 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 770840599, - "congestion_multiplier": 4606580500, - "prover_cost": 183645872, - "sequencer_cost": 30085833 + "congestion_cost": 928889191, + "congestion_multiplier": 4941494452, + "prover_cost": 195554844, + "sequencer_cost": 40114444 } }, "parent_fee_header": { - "eth_per_fee_asset": 11496578, - "excess_mana": 1324926610, - "mana_used": 80616829 + "eth_per_fee_asset": 11501735, + "excess_mana": 1025769662, + "mana_used": 73376366 } }, { @@ -30049,21 +30049,21 @@ "blobs_needed": 1, "block_number": 335, "l1_block_number": 20974160, - "mana_spent": 111222874, - "size_in_fields": 3720, + "mana_spent": 72330254, + "size_in_fields": 2385, "slot_number": 335, "timestamp": 1729033883 }, "fee_header": { - "eth_per_fee_asset": 11474657, - "excess_mana": 1302729187, - "mana_used": 111222874 + "eth_per_fee_asset": 11501087, + "excess_mana": 1021878931, + "mana_used": 72330254 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": 75 }, "outputs": { - "eth_per_fee_asset_at_execution": 11517271, + "eth_per_fee_asset_at_execution": 11415471, "l1_fee_oracle_output": { "base_fee": 8760412288, "blob_fee": 1605 @@ -30080,22 +30080,22 @@ "slot_of_change": 335 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65338115339997, - "congestion_multiplier": 4591437473, - "prover_cost": 15910849019703, - "sequencer_cost": 2281898550447 + "congestion_cost": 78613247758240, + "congestion_multiplier": 4924048878, + "prover_cost": 16964043796354, + "sequencer_cost": 3069663792235 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 752516781, - "congestion_multiplier": 4591437473, - "prover_cost": 183249560, - "sequencer_cost": 26281244 + "congestion_cost": 897407250, + "congestion_multiplier": 4924048878, + "prover_cost": 193652550, + "sequencer_cost": 35041658 } }, "parent_fee_header": { - "eth_per_fee_asset": 11517271, - "excess_mana": 1305543439, - "mana_used": 97185748 + "eth_per_fee_asset": 11415471, + "excess_mana": 1024146028, + "mana_used": 72732903 } }, { @@ -30103,21 +30103,21 @@ "blobs_needed": 1, "block_number": 336, "l1_block_number": 20974163, - "mana_spent": 95414898, - "size_in_fields": 3795, + "mana_spent": 63891993, + "size_in_fields": 2295, "slot_number": 336, "timestamp": 1729033919 }, "fee_header": { - "eth_per_fee_asset": 11475804, - "excess_mana": 1313952061, - "mana_used": 95414898 + "eth_per_fee_asset": 11441281, + "excess_mana": 1019209185, + "mana_used": 63891993 }, "oracle_input": { - "fee_asset_price_modifier": 1 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 11474657, + "eth_per_fee_asset_at_execution": 11501087, "l1_fee_oracle_output": { "base_fee": 8760412288, "blob_fee": 1605 @@ -30134,22 +30134,22 @@ "slot_of_change": 335 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66688921507632, - "congestion_multiplier": 4652124107, - "prover_cost": 15969937924942, - "sequencer_cost": 2290372949710 + "congestion_cost": 77621098857874, + "congestion_multiplier": 4903583827, + "prover_cost": 16837760639495, + "sequencer_cost": 3046812705617 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 765232500, - "congestion_multiplier": 4652124107, - "prover_cost": 183249560, - "sequencer_cost": 26281244 + "congestion_cost": 892727011, + "congestion_multiplier": 4903583827, + "prover_cost": 193652550, + "sequencer_cost": 35041658 } }, "parent_fee_header": { - "eth_per_fee_asset": 11474657, - "excess_mana": 1302729187, - "mana_used": 111222874 + "eth_per_fee_asset": 11501087, + "excess_mana": 1021878931, + "mana_used": 72330254 } }, { @@ -30157,21 +30157,21 @@ "blobs_needed": 1, "block_number": 337, "l1_block_number": 20974166, - "mana_spent": 97814475, - "size_in_fields": 3345, + "mana_spent": 85167843, + "size_in_fields": 3045, "slot_number": 337, "timestamp": 1729033955 }, "fee_header": { - "eth_per_fee_asset": 11537773, - "excess_mana": 1309366959, - "mana_used": 97814475 + "eth_per_fee_asset": 11466451, + "excess_mana": 1008101178, + "mana_used": 85167843 }, "oracle_input": { - "fee_asset_price_modifier": 54 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 11475804, + "eth_per_fee_asset_at_execution": 11441281, "l1_fee_oracle_output": { "base_fee": 8760412288, "blob_fee": 1605 @@ -30188,22 +30188,22 @@ "slot_of_change": 335 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66227805563776, - "congestion_multiplier": 4627234286, - "prover_cost": 15968341738845, - "sequencer_cost": 2290144028253 + "congestion_cost": 76343013863570, + "congestion_multiplier": 4819344101, + "prover_cost": 16925775181993, + "sequencer_cost": 3062739041197 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760017316, - "congestion_multiplier": 4627234286, - "prover_cost": 183249560, - "sequencer_cost": 26281244 + "congestion_cost": 873461874, + "congestion_multiplier": 4819344101, + "prover_cost": 193652550, + "sequencer_cost": 35041658 } }, "parent_fee_header": { - "eth_per_fee_asset": 11475804, - "excess_mana": 1313952061, - "mana_used": 95414898 + "eth_per_fee_asset": 11441281, + "excess_mana": 1019209185, + "mana_used": 63891993 } }, { @@ -30211,21 +30211,21 @@ "blobs_needed": 1, "block_number": 338, "l1_block_number": 20974169, - "mana_spent": 112102554, - "size_in_fields": 3690, + "mana_spent": 82200688, + "size_in_fields": 2850, "slot_number": 338, "timestamp": 1729033991 }, "fee_header": { - "eth_per_fee_asset": 11575847, - "excess_mana": 1307181434, - "mana_used": 112102554 + "eth_per_fee_asset": 11467597, + "excess_mana": 1018269021, + "mana_used": 82200688 }, "oracle_input": { - "fee_asset_price_modifier": 33 + "fee_asset_price_modifier": 1 }, "outputs": { - "eth_per_fee_asset_at_execution": 11537773, + "eth_per_fee_asset_at_execution": 11466451, "l1_fee_oracle_output": { "base_fee": 8760412288, "blob_fee": 1605 @@ -30242,22 +30242,22 @@ "slot_of_change": 340 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65657496121652, - "congestion_multiplier": 4615417265, - "prover_cost": 15882576299604, - "sequencer_cost": 2277843739863 + "congestion_cost": 77712230052699, + "congestion_multiplier": 4896397229, + "prover_cost": 16888621422619, + "sequencer_cost": 3056016024488 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 757541286, - "congestion_multiplier": 4615417265, - "prover_cost": 183249560, - "sequencer_cost": 26281244 + "congestion_cost": 891083478, + "congestion_multiplier": 4896397229, + "prover_cost": 193652550, + "sequencer_cost": 35041658 } }, "parent_fee_header": { - "eth_per_fee_asset": 11537773, - "excess_mana": 1309366959, - "mana_used": 97814475 + "eth_per_fee_asset": 11466451, + "excess_mana": 1008101178, + "mana_used": 85167843 } }, { @@ -30265,21 +30265,21 @@ "blobs_needed": 1, "block_number": 339, "l1_block_number": 20974172, - "mana_spent": 109019951, - "size_in_fields": 3765, + "mana_spent": 72538797, + "size_in_fields": 2760, "slot_number": 339, "timestamp": 1729034027 }, "fee_header": { - "eth_per_fee_asset": 11691605, - "excess_mana": 1319283988, - "mana_used": 109019951 + "eth_per_fee_asset": 11464156, + "excess_mana": 1025469709, + "mana_used": 72538797 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 11575847, + "eth_per_fee_asset_at_execution": 11467597, "l1_fee_oracle_output": { "base_fee": 8760412288, "blob_fee": 1605 @@ -30296,22 +30296,22 @@ "slot_of_change": 340 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66632914723217, - "congestion_multiplier": 4681236419, - "prover_cost": 15830337080302, - "sequencer_cost": 2270351707310 + "congestion_cost": 78807524889478, + "congestion_multiplier": 4951708896, + "prover_cost": 16886933679306, + "sequencer_cost": 3055710625339 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 771332426, - "congestion_multiplier": 4681236419, - "prover_cost": 183249560, - "sequencer_cost": 26281244 + "congestion_cost": 903732936, + "congestion_multiplier": 4951708896, + "prover_cost": 193652550, + "sequencer_cost": 35041658 } }, "parent_fee_header": { - "eth_per_fee_asset": 11575847, - "excess_mana": 1307181434, - "mana_used": 112102554 + "eth_per_fee_asset": 11467597, + "excess_mana": 1018269021, + "mana_used": 82200688 } }, { @@ -30319,21 +30319,21 @@ "blobs_needed": 1, "block_number": 340, "l1_block_number": 20974175, - "mana_spent": 91054339, - "size_in_fields": 3165, + "mana_spent": 73136438, + "size_in_fields": 2835, "slot_number": 340, "timestamp": 1729034063 }, "fee_header": { - "eth_per_fee_asset": 11741878, - "excess_mana": 1328303939, - "mana_used": 91054339 + "eth_per_fee_asset": 11518037, + "excess_mana": 1023008506, + "mana_used": 73136438 }, "oracle_input": { - "fee_asset_price_modifier": 43 + "fee_asset_price_modifier": 47 }, "outputs": { - "eth_per_fee_asset_at_execution": 11691605, + "eth_per_fee_asset_at_execution": 11464156, "l1_fee_oracle_output": { "base_fee": 9477902554, "blob_fee": 926 @@ -30350,22 +30350,22 @@ "slot_of_change": 340 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67621665032304, - "congestion_multiplier": 4730900712, - "prover_cost": 15692779220646, - "sequencer_cost": 2431976790185 + "congestion_cost": 79806369435308, + "congestion_multiplier": 4932733376, + "prover_cost": 16985880600369, + "sequencer_cost": 3306969653938 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790605797, - "congestion_multiplier": 4730900712, - "prover_cost": 183473776, - "sequencer_cost": 28433712 + "congestion_cost": 914912669, + "congestion_multiplier": 4932733376, + "prover_cost": 194728785, + "sequencer_cost": 37911616 } }, "parent_fee_header": { - "eth_per_fee_asset": 11691605, - "excess_mana": 1319283988, - "mana_used": 109019951 + "eth_per_fee_asset": 11464156, + "excess_mana": 1025469709, + "mana_used": 72538797 } }, { @@ -30373,21 +30373,21 @@ "blobs_needed": 1, "block_number": 341, "l1_block_number": 20974178, - "mana_spent": 97906763, - "size_in_fields": 3405, + "mana_spent": 70954771, + "size_in_fields": 2610, "slot_number": 341, "timestamp": 1729034099 }, "fee_header": { - "eth_per_fee_asset": 11807632, - "excess_mana": 1319358278, - "mana_used": 97906763 + "eth_per_fee_asset": 11476572, + "excess_mana": 1021144944, + "mana_used": 70954771 }, "oracle_input": { - "fee_asset_price_modifier": 56 + "fee_asset_price_modifier": -36 }, "outputs": { - "eth_per_fee_asset_at_execution": 11741878, + "eth_per_fee_asset_at_execution": 11518037, "l1_fee_oracle_output": { "base_fee": 9477902554, "blob_fee": 926 @@ -30404,22 +30404,22 @@ "slot_of_change": 340 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66443186345490, - "congestion_multiplier": 4681643326, - "prover_cost": 15625590386819, - "sequencer_cost": 2421564250625 + "congestion_cost": 79143815651921, + "congestion_multiplier": 4918413972, + "prover_cost": 16906421207017, + "sequencer_cost": 3291499758162 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780167788, - "congestion_multiplier": 4681643326, - "prover_cost": 183473776, - "sequencer_cost": 28433712 + "congestion_cost": 911581397, + "congestion_multiplier": 4918413972, + "prover_cost": 194728785, + "sequencer_cost": 37911616 } }, "parent_fee_header": { - "eth_per_fee_asset": 11741878, - "excess_mana": 1328303939, - "mana_used": 91054339 + "eth_per_fee_asset": 11518037, + "excess_mana": 1023008506, + "mana_used": 73136438 } }, { @@ -30427,21 +30427,21 @@ "blobs_needed": 1, "block_number": 342, "l1_block_number": 20974181, - "mana_spent": 121185027, - "size_in_fields": 3840, + "mana_spent": 81881190, + "size_in_fields": 3045, "slot_number": 342, "timestamp": 1729034135 }, "fee_header": { - "eth_per_fee_asset": 11851320, - "excess_mana": 1317265041, - "mana_used": 121185027 + "eth_per_fee_asset": 11468538, + "excess_mana": 1017099715, + "mana_used": 81881190 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 11807632, + "eth_per_fee_asset_at_execution": 11476572, "l1_fee_oracle_output": { "base_fee": 9477902554, "blob_fee": 926 @@ -30458,22 +30458,22 @@ "slot_of_change": 340 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65867659324072, - "congestion_multiplier": 4670191602, - "prover_cost": 15538575050442, - "sequencer_cost": 2408079113577 + "congestion_cost": 78802577633810, + "congestion_multiplier": 4887473767, + "prover_cost": 16967504320977, + "sequencer_cost": 3303391988479 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777741082, - "congestion_multiplier": 4670191602, - "prover_cost": 183473776, - "sequencer_cost": 28433712 + "congestion_cost": 904383456, + "congestion_multiplier": 4887473767, + "prover_cost": 194728785, + "sequencer_cost": 37911616 } }, "parent_fee_header": { - "eth_per_fee_asset": 11807632, - "excess_mana": 1319358278, - "mana_used": 97906763 + "eth_per_fee_asset": 11476572, + "excess_mana": 1021144944, + "mana_used": 70954771 } }, { @@ -30481,21 +30481,21 @@ "blobs_needed": 1, "block_number": 343, "l1_block_number": 20974184, - "mana_spent": 89165716, - "size_in_fields": 3165, + "mana_spent": 78263008, + "size_in_fields": 2850, "slot_number": 343, "timestamp": 1729034171 }, "fee_header": { - "eth_per_fee_asset": 11838283, - "excess_mana": 1338450068, - "mana_used": 89165716 + "eth_per_fee_asset": 11439866, + "excess_mana": 1023980905, + "mana_used": 78263008 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11851320, + "eth_per_fee_asset_at_execution": 11468538, "l1_fee_oracle_output": { "base_fee": 9477902554, "blob_fee": 926 @@ -30512,22 +30512,22 @@ "slot_of_change": 345 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67720517292589, - "congestion_multiplier": 4787395759, - "prover_cost": 15481294573094, - "sequencer_cost": 2399202114195 + "congestion_cost": 79927778239912, + "congestion_multiplier": 4940221727, + "prover_cost": 16979390485518, + "sequencer_cost": 3305706097848 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802577521, - "congestion_multiplier": 4787395759, - "prover_cost": 183473776, - "sequencer_cost": 28433712 + "congestion_cost": 916654762, + "congestion_multiplier": 4940221727, + "prover_cost": 194728785, + "sequencer_cost": 37911616 } }, "parent_fee_header": { - "eth_per_fee_asset": 11851320, - "excess_mana": 1317265041, - "mana_used": 121185027 + "eth_per_fee_asset": 11468538, + "excess_mana": 1017099715, + "mana_used": 81881190 } }, { @@ -30535,21 +30535,21 @@ "blobs_needed": 1, "block_number": 344, "l1_block_number": 20974187, - "mana_spent": 95127337, - "size_in_fields": 3585, + "mana_spent": 64500213, + "size_in_fields": 2385, "slot_number": 344, "timestamp": 1729034207 }, "fee_header": { - "eth_per_fee_asset": 11776723, - "excess_mana": 1327615784, - "mana_used": 95127337 + "eth_per_fee_asset": 11356354, + "excess_mana": 1027243913, + "mana_used": 64500213 }, "oracle_input": { - "fee_asset_price_modifier": -52 + "fee_asset_price_modifier": -73 }, "outputs": { - "eth_per_fee_asset_at_execution": 11838283, + "eth_per_fee_asset_at_execution": 11439866, "l1_fee_oracle_output": { "base_fee": 9477902554, "blob_fee": 926 @@ -30566,22 +30566,22 @@ "slot_of_change": 345 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66715667888663, - "congestion_multiplier": 4727093201, - "prover_cost": 15498343467546, - "sequencer_cost": 2401844253935 + "congestion_cost": 80640798240120, + "congestion_multiplier": 4965433013, + "prover_cost": 17021946323498, + "sequencer_cost": 3313991265283 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789798957, - "congestion_multiplier": 4727093201, - "prover_cost": 183473776, - "sequencer_cost": 28433712 + "congestion_cost": 922519926, + "congestion_multiplier": 4965433013, + "prover_cost": 194728785, + "sequencer_cost": 37911616 } }, "parent_fee_header": { - "eth_per_fee_asset": 11838283, - "excess_mana": 1338450068, - "mana_used": 89165716 + "eth_per_fee_asset": 11439866, + "excess_mana": 1023980905, + "mana_used": 78263008 } }, { @@ -30589,21 +30589,21 @@ "blobs_needed": 1, "block_number": 345, "l1_block_number": 20974190, - "mana_spent": 85484116, - "size_in_fields": 3195, + "mana_spent": 292232, + "size_in_fields": 15, "slot_number": 345, "timestamp": 1729034243 }, "fee_header": { - "eth_per_fee_asset": 11769656, - "excess_mana": 1322743121, - "mana_used": 85484116 + "eth_per_fee_asset": 11410864, + "excess_mana": 1016744126, + "mana_used": 292232 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 11776723, + "eth_per_fee_asset_at_execution": 11356354, "l1_fee_oracle_output": { "base_fee": 9674041257, "blob_fee": 703 @@ -30620,44 +30620,44 @@ "slot_of_change": 345 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66785006661022, - "congestion_multiplier": 4700220642, - "prover_cost": 15584561936288, - "sequencer_cost": 2464363558522 + "congestion_cost": 79950275678268, + "congestion_multiplier": 4884763345, + "prover_cost": 17173028685087, + "sequencer_cost": 3407446527293 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786508524, - "congestion_multiplier": 4700220642, - "prover_cost": 183535069, - "sequencer_cost": 29022127 + "congestion_cost": 907943633, + "congestion_multiplier": 4884763345, + "prover_cost": 195022993, + "sequencer_cost": 38696169 } }, "parent_fee_header": { - "eth_per_fee_asset": 11776723, - "excess_mana": 1327615784, - "mana_used": 95127337 + "eth_per_fee_asset": 11356354, + "excess_mana": 1027243913, + "mana_used": 64500213 } }, { "block_header": { - "blobs_needed": 1, + "blobs_needed": 2, "block_number": 346, "l1_block_number": 20974193, - "mana_spent": 109807490, - "size_in_fields": 3585, + "mana_spent": 146703177, + "size_in_fields": 5055, "slot_number": 346, "timestamp": 1729034279 }, "fee_header": { - "eth_per_fee_asset": 11662552, - "excess_mana": 1308227237, - "mana_used": 109807490 + "eth_per_fee_asset": 11327564, + "excess_mana": 942036358, + "mana_used": 146703177 }, "oracle_input": { - "fee_asset_price_modifier": -91 + "fee_asset_price_modifier": -73 }, "outputs": { - "eth_per_fee_asset_at_execution": 11769656, + "eth_per_fee_asset_at_execution": 11410864, "l1_fee_oracle_output": { "base_fee": 9674041257, "blob_fee": 703 @@ -30674,22 +30674,22 @@ "slot_of_change": 345 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65395631019293, - "congestion_multiplier": 4621068098, - "prover_cost": 15593919567403, - "sequencer_cost": 2465843266788 + "congestion_cost": 68561877347763, + "congestion_multiplier": 4347394589, + "prover_cost": 17090992671546, + "sequencer_cost": 3391169064850 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 769684081, - "congestion_multiplier": 4621068098, - "prover_cost": 183535069, - "sequencer_cost": 29022127 + "congestion_cost": 782350258, + "congestion_multiplier": 4347394589, + "prover_cost": 195022993, + "sequencer_cost": 38696169 } }, "parent_fee_header": { - "eth_per_fee_asset": 11769656, - "excess_mana": 1322743121, - "mana_used": 85484116 + "eth_per_fee_asset": 11410864, + "excess_mana": 1016744126, + "mana_used": 292232 } }, { @@ -30697,21 +30697,21 @@ "blobs_needed": 1, "block_number": 347, "l1_block_number": 20974196, - "mana_spent": 114619445, - "size_in_fields": 3900, + "mana_spent": 77139454, + "size_in_fields": 2730, "slot_number": 347, "timestamp": 1729034315 }, "fee_header": { - "eth_per_fee_asset": 11664884, - "excess_mana": 1318034727, - "mana_used": 114619445 + "eth_per_fee_asset": 11214288, + "excess_mana": 1013739535, + "mana_used": 77139454 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 11662552, + "eth_per_fee_asset_at_execution": 11327564, "l1_fee_oracle_output": { "base_fee": 9674041257, "blob_fee": 703 @@ -30728,22 +30728,22 @@ "slot_of_change": 345 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66968188523404, - "congestion_multiplier": 4674399156, - "prover_cost": 15737127602947, - "sequencer_cost": 2488488540073 + "congestion_cost": 79682180211033, + "congestion_multiplier": 4861921242, + "prover_cost": 17216675447608, + "sequencer_cost": 3416106852277 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781019981, - "congestion_multiplier": 4674399156, - "prover_cost": 183535069, - "sequencer_cost": 29022127 + "congestion_cost": 902604996, + "congestion_multiplier": 4861921242, + "prover_cost": 195022993, + "sequencer_cost": 38696169 } }, "parent_fee_header": { - "eth_per_fee_asset": 11662552, - "excess_mana": 1308227237, - "mana_used": 109807490 + "eth_per_fee_asset": 11327564, + "excess_mana": 942036358, + "mana_used": 146703177 } }, { @@ -30751,21 +30751,21 @@ "blobs_needed": 1, "block_number": 348, "l1_block_number": 20974199, - "mana_spent": 81946117, - "size_in_fields": 2910, + "mana_spent": 73757976, + "size_in_fields": 2760, "slot_number": 348, "timestamp": 1729034351 }, "fee_header": { - "eth_per_fee_asset": 11662551, - "excess_mana": 1332654172, - "mana_used": 81946117 + "eth_per_fee_asset": 11326430, + "excess_mana": 1015878989, + "mana_used": 73757976 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 11664884, + "eth_per_fee_asset_at_execution": 11214288, "l1_fee_oracle_output": { "base_fee": 9674041257, "blob_fee": 703 @@ -30782,22 +30782,22 @@ "slot_of_change": 350 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68424259512568, - "congestion_multiplier": 4755041304, - "prover_cost": 15733981495230, - "sequencer_cost": 2487991050747 + "congestion_cost": 80825806239327, + "congestion_multiplier": 4878175248, + "prover_cost": 17390581818481, + "sequencer_cost": 3450613092869 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798161050, - "congestion_multiplier": 4755041304, - "prover_cost": 183535069, - "sequencer_cost": 29022127 + "congestion_cost": 906403869, + "congestion_multiplier": 4878175248, + "prover_cost": 195022993, + "sequencer_cost": 38696169 } }, "parent_fee_header": { - "eth_per_fee_asset": 11664884, - "excess_mana": 1318034727, - "mana_used": 114619445 + "eth_per_fee_asset": 11214288, + "excess_mana": 1013739535, + "mana_used": 77139454 } }, { @@ -30805,21 +30805,21 @@ "blobs_needed": 1, "block_number": 349, "l1_block_number": 20974202, - "mana_spent": 117302315, - "size_in_fields": 4050, + "mana_spent": 83124860, + "size_in_fields": 2685, "slot_number": 349, "timestamp": 1729034387 }, "fee_header": { - "eth_per_fee_asset": 11655553, - "excess_mana": 1314600289, - "mana_used": 117302315 + "eth_per_fee_asset": 11334358, + "excess_mana": 1014636965, + "mana_used": 83124860 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 11662551, + "eth_per_fee_asset_at_execution": 11326430, "l1_fee_oracle_output": { "base_fee": 9674041257, "blob_fee": 703 @@ -30836,22 +30836,22 @@ "slot_of_change": 350 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66626547485195, - "congestion_multiplier": 4655653741, - "prover_cost": 15737128952320, - "sequencer_cost": 2488488753447 + "congestion_cost": 79830710382707, + "congestion_multiplier": 4868732654, + "prover_cost": 17218399177853, + "sequencer_cost": 3416448872240 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777035508, - "congestion_multiplier": 4655653741, - "prover_cost": 183535069, - "sequencer_cost": 29022127 + "congestion_cost": 904196953, + "congestion_multiplier": 4868732654, + "prover_cost": 195022993, + "sequencer_cost": 38696169 } }, "parent_fee_header": { - "eth_per_fee_asset": 11662551, - "excess_mana": 1332654172, - "mana_used": 81946117 + "eth_per_fee_asset": 11326430, + "excess_mana": 1015878989, + "mana_used": 73757976 } }, { @@ -30859,21 +30859,21 @@ "blobs_needed": 1, "block_number": 350, "l1_block_number": 20974205, - "mana_spent": 103574484, - "size_in_fields": 3480, + "mana_spent": 69522010, + "size_in_fields": 2565, "slot_number": 350, "timestamp": 1729034423 }, "fee_header": { - "eth_per_fee_asset": 11713830, - "excess_mana": 1331902604, - "mana_used": 103574484 + "eth_per_fee_asset": 11380828, + "excess_mana": 1022761825, + "mana_used": 69522010 }, "oracle_input": { - "fee_asset_price_modifier": 50 + "fee_asset_price_modifier": 41 }, "outputs": { - "eth_per_fee_asset_at_execution": 11655553, + "eth_per_fee_asset_at_execution": 11334358, "l1_fee_oracle_output": { "base_fee": 10075372811, "blob_fee": 475 @@ -30890,22 +30890,22 @@ "slot_of_change": 350 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68830635320350, - "congestion_multiplier": 4750861870, - "prover_cost": 15757337811428, - "sequencer_cost": 2593280730653 + "congestion_cost": 81820973539040, + "congestion_multiplier": 4930835515, + "prover_cost": 17259468158673, + "sequencer_cost": 3555692700019 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802259118, - "congestion_multiplier": 4750861870, - "prover_cost": 183660486, - "sequencer_cost": 30226121 + "congestion_cost": 927388206, + "congestion_multiplier": 4930835515, + "prover_cost": 195624991, + "sequencer_cost": 40301494 } }, "parent_fee_header": { - "eth_per_fee_asset": 11655553, - "excess_mana": 1314600289, - "mana_used": 117302315 + "eth_per_fee_asset": 11334358, + "excess_mana": 1014636965, + "mana_used": 83124860 } }, { @@ -30913,21 +30913,21 @@ "blobs_needed": 1, "block_number": 351, "l1_block_number": 20974208, - "mana_spent": 89996314, - "size_in_fields": 3210, + "mana_spent": 80104632, + "size_in_fields": 2895, "slot_number": 351, "timestamp": 1729034459 }, "fee_header": { - "eth_per_fee_asset": 11736086, - "excess_mana": 1335477088, - "mana_used": 89996314 + "eth_per_fee_asset": 11274986, + "excess_mana": 1017283835, + "mana_used": 80104632 }, "oracle_input": { - "fee_asset_price_modifier": 19 + "fee_asset_price_modifier": -93 }, "outputs": { - "eth_per_fee_asset_at_execution": 11713830, + "eth_per_fee_asset_at_execution": 11380828, "l1_fee_oracle_output": { "base_fee": 10075372811, "blob_fee": 475 @@ -30944,22 +30944,22 @@ "slot_of_change": 350 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68851749342444, - "congestion_multiplier": 4770772274, - "prover_cost": 15678944119900, - "sequencer_cost": 2580379004989 + "congestion_cost": 80617092710654, + "congestion_multiplier": 4888877784, + "prover_cost": 17188994596879, + "sequencer_cost": 3541174157100 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 806517687, - "congestion_multiplier": 4770772274, - "prover_cost": 183660486, - "sequencer_cost": 30226121 + "congestion_cost": 917489266, + "congestion_multiplier": 4888877784, + "prover_cost": 195624991, + "sequencer_cost": 40301494 } }, "parent_fee_header": { - "eth_per_fee_asset": 11713830, - "excess_mana": 1331902604, - "mana_used": 103574484 + "eth_per_fee_asset": 11380828, + "excess_mana": 1022761825, + "mana_used": 69522010 } }, { @@ -30967,21 +30967,21 @@ "blobs_needed": 1, "block_number": 352, "l1_block_number": 20974211, - "mana_spent": 90509197, - "size_in_fields": 3315, + "mana_spent": 73553034, + "size_in_fields": 2535, "slot_number": 352, "timestamp": 1729034495 }, "fee_header": { - "eth_per_fee_asset": 11711440, - "excess_mana": 1325473402, - "mana_used": 90509197 + "eth_per_fee_asset": 11303173, + "excess_mana": 1022388467, + "mana_used": 73553034 }, "oracle_input": { - "fee_asset_price_modifier": -21 + "fee_asset_price_modifier": 25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11736086, + "eth_per_fee_asset_at_execution": 11274986, "l1_fee_oracle_output": { "base_fee": 10075372811, "blob_fee": 475 @@ -30998,22 +30998,22 @@ "slot_of_change": 350 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67709471198490, - "congestion_multiplier": 4715259169, - "prover_cost": 15649210989082, - "sequencer_cost": 2575485643170 + "congestion_cost": 82191751191532, + "congestion_multiplier": 4927964443, + "prover_cost": 17350353339685, + "sequencer_cost": 3574416323001 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794644177, - "congestion_multiplier": 4715259169, - "prover_cost": 183660486, - "sequencer_cost": 30226121 + "congestion_cost": 926710844, + "congestion_multiplier": 4927964443, + "prover_cost": 195624991, + "sequencer_cost": 40301494 } }, "parent_fee_header": { - "eth_per_fee_asset": 11736086, - "excess_mana": 1335477088, - "mana_used": 89996314 + "eth_per_fee_asset": 11274986, + "excess_mana": 1017283835, + "mana_used": 80104632 } }, { @@ -31021,21 +31021,21 @@ "blobs_needed": 1, "block_number": 353, "l1_block_number": 20974214, - "mana_spent": 107314558, - "size_in_fields": 3720, + "mana_spent": 58374803, + "size_in_fields": 2235, "slot_number": 353, "timestamp": 1729034531 }, "fee_header": { - "eth_per_fee_asset": 11659909, - "excess_mana": 1315982599, - "mana_used": 107314558 + "eth_per_fee_asset": 11217268, + "excess_mana": 1020941501, + "mana_used": 58374803 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": -76 }, "outputs": { - "eth_per_fee_asset_at_execution": 11711440, + "eth_per_fee_asset_at_execution": 11303173, "l1_fee_oracle_output": { "base_fee": 10075372811, "blob_fee": 475 @@ -31052,22 +31052,22 @@ "slot_of_change": 355 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66901009440343, - "congestion_multiplier": 4663189434, - "prover_cost": 15682143784198, - "sequencer_cost": 2580905593164 + "congestion_cost": 81754868389611, + "congestion_multiplier": 4916853257, + "prover_cost": 17307086337616, + "sequencer_cost": 3565502713265 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783507158, - "congestion_multiplier": 4663189434, - "prover_cost": 183660486, - "sequencer_cost": 30226121 + "congestion_cost": 924089421, + "congestion_multiplier": 4916853257, + "prover_cost": 195624991, + "sequencer_cost": 40301494 } }, "parent_fee_header": { - "eth_per_fee_asset": 11711440, - "excess_mana": 1325473402, - "mana_used": 90509197 + "eth_per_fee_asset": 11303173, + "excess_mana": 1022388467, + "mana_used": 73553034 } }, { @@ -31075,21 +31075,21 @@ "blobs_needed": 1, "block_number": 354, "l1_block_number": 20974216, - "mana_spent": 91069957, - "size_in_fields": 3480, + "mana_spent": 79549419, + "size_in_fields": 3105, "slot_number": 354, "timestamp": 1729034567 }, "fee_header": { - "eth_per_fee_asset": 11641253, - "excess_mana": 1323297157, - "mana_used": 91069957 + "eth_per_fee_asset": 11274476, + "excess_mana": 1004316304, + "mana_used": 79549419 }, "oracle_input": { - "fee_asset_price_modifier": -16 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 11659909, + "eth_per_fee_asset_at_execution": 11217268, "l1_fee_oracle_output": { "base_fee": 10075372811, "blob_fee": 475 @@ -31106,22 +31106,22 @@ "slot_of_change": 355 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67931878027522, - "congestion_multiplier": 4703268417, - "prover_cost": 15751451061926, - "sequencer_cost": 2592311912555 + "congestion_cost": 79733392925979, + "congestion_multiplier": 4790972590, + "prover_cost": 17439628882898, + "sequencer_cost": 3592808338002 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 792079516, - "congestion_multiplier": 4703268417, - "prover_cost": 183660486, - "sequencer_cost": 30226121 + "congestion_cost": 894390837, + "congestion_multiplier": 4790972590, + "prover_cost": 195624991, + "sequencer_cost": 40301494 } }, "parent_fee_header": { - "eth_per_fee_asset": 11659909, - "excess_mana": 1315982599, - "mana_used": 107314558 + "eth_per_fee_asset": 11217268, + "excess_mana": 1020941501, + "mana_used": 58374803 } }, { @@ -31129,21 +31129,21 @@ "blobs_needed": 1, "block_number": 355, "l1_block_number": 20974219, - "mana_spent": 108089840, - "size_in_fields": 3690, + "mana_spent": 84021260, + "size_in_fields": 2910, "slot_number": 355, "timestamp": 1729034603 }, "fee_header": { - "eth_per_fee_asset": 11627283, - "excess_mana": 1314367114, - "mana_used": 108089840 + "eth_per_fee_asset": 11335358, + "excess_mana": 1008865723, + "mana_used": 84021260 }, "oracle_input": { - "fee_asset_price_modifier": -12 + "fee_asset_price_modifier": 54 }, "outputs": { - "eth_per_fee_asset_at_execution": 11641253, + "eth_per_fee_asset_at_execution": 11274476, "l1_fee_oracle_output": { "base_fee": 9652277053, "blob_fee": 243 @@ -31160,22 +31160,22 @@ "slot_of_change": 355 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66702622733138, - "congestion_multiplier": 4654383783, - "prover_cost": 15765336257189, - "sequencer_cost": 2487432667257 + "congestion_cost": 79253371509240, + "congestion_multiplier": 4825095514, + "prover_cost": 17294847849249, + "sequencer_cost": 3424470458761 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776502107, - "congestion_multiplier": 4654383783, - "prover_cost": 183528268, - "sequencer_cost": 28956833 + "congestion_cost": 893540235, + "congestion_multiplier": 4825095514, + "prover_cost": 194990347, + "sequencer_cost": 38609110 } }, "parent_fee_header": { - "eth_per_fee_asset": 11641253, - "excess_mana": 1323297157, - "mana_used": 91069957 + "eth_per_fee_asset": 11274476, + "excess_mana": 1004316304, + "mana_used": 79549419 } }, { @@ -31183,21 +31183,21 @@ "blobs_needed": 1, "block_number": 356, "l1_block_number": 20974222, - "mana_spent": 92502947, - "size_in_fields": 3495, + "mana_spent": 79375509, + "size_in_fields": 2655, "slot_number": 356, "timestamp": 1729034639 }, "fee_header": { - "eth_per_fee_asset": 11565658, - "excess_mana": 1322456954, - "mana_used": 92502947 + "eth_per_fee_asset": 11331957, + "excess_mana": 1017886983, + "mana_used": 79375509 }, "oracle_input": { - "fee_asset_price_modifier": -53 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 11627283, + "eth_per_fee_asset_at_execution": 11335358, "l1_fee_oracle_output": { "base_fee": 9652277053, "blob_fee": 243 @@ -31214,22 +31214,22 @@ "slot_of_change": 355 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67591665481954, - "congestion_multiplier": 4698647199, - "prover_cost": 15784278063930, - "sequencer_cost": 2490421278987 + "congestion_cost": 80236971871555, + "congestion_multiplier": 4893479947, + "prover_cost": 17201957538527, + "sequencer_cost": 3406077690710 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785907423, - "congestion_multiplier": 4698647199, - "prover_cost": 183528268, - "sequencer_cost": 28956833 + "congestion_cost": 909514801, + "congestion_multiplier": 4893479947, + "prover_cost": 194990347, + "sequencer_cost": 38609110 } }, "parent_fee_header": { - "eth_per_fee_asset": 11627283, - "excess_mana": 1314367114, - "mana_used": 108089840 + "eth_per_fee_asset": 11335358, + "excess_mana": 1008865723, + "mana_used": 84021260 } }, { @@ -31237,21 +31237,21 @@ "blobs_needed": 1, "block_number": 357, "l1_block_number": 20974225, - "mana_spent": 93061894, - "size_in_fields": 3390, + "mana_spent": 73284704, + "size_in_fields": 2610, "slot_number": 357, "timestamp": 1729034675 }, "fee_header": { - "eth_per_fee_asset": 11632738, - "excess_mana": 1314959901, - "mana_used": 93061894 + "eth_per_fee_asset": 11336489, + "excess_mana": 1022262492, + "mana_used": 73284704 }, "oracle_input": { - "fee_asset_price_modifier": 58 + "fee_asset_price_modifier": 4 }, "outputs": { - "eth_per_fee_asset_at_execution": 11565658, + "eth_per_fee_asset_at_execution": 11331957, "l1_fee_oracle_output": { "base_fee": 9652277053, "blob_fee": 243 @@ -31268,22 +31268,22 @@ "slot_of_change": 355 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67197929162353, - "congestion_multiplier": 4657613001, - "prover_cost": 15868381029424, - "sequencer_cost": 2503690927054 + "congestion_cost": 80951962136814, + "congestion_multiplier": 4926996090, + "prover_cost": 17207120270577, + "sequencer_cost": 3407099938696 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777188267, - "congestion_multiplier": 4657613001, - "prover_cost": 183528268, - "sequencer_cost": 28956833 + "congestion_cost": 917344154, + "congestion_multiplier": 4926996090, + "prover_cost": 194990347, + "sequencer_cost": 38609110 } }, "parent_fee_header": { - "eth_per_fee_asset": 11565658, - "excess_mana": 1322456954, - "mana_used": 92502947 + "eth_per_fee_asset": 11331957, + "excess_mana": 1017886983, + "mana_used": 79375509 } }, { @@ -31291,21 +31291,21 @@ "blobs_needed": 1, "block_number": 358, "l1_block_number": 20974228, - "mana_spent": 118584117, - "size_in_fields": 3900, + "mana_spent": 73502032, + "size_in_fields": 2775, "slot_number": 358, "timestamp": 1729034711 }, "fee_header": { - "eth_per_fee_asset": 11559451, - "excess_mana": 1308021795, - "mana_used": 118584117 + "eth_per_fee_asset": 11358028, + "excess_mana": 1020547196, + "mana_used": 73502032 }, "oracle_input": { - "fee_asset_price_modifier": -63 + "fee_asset_price_modifier": 19 }, "outputs": { - "eth_per_fee_asset_at_execution": 11632738, + "eth_per_fee_asset_at_execution": 11336489, "l1_fee_oracle_output": { "base_fee": 9652277053, "blob_fee": 243 @@ -31322,22 +31322,22 @@ "slot_of_change": 360 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66122612750326, - "congestion_multiplier": 4619957479, - "prover_cost": 15776876260774, - "sequencer_cost": 2489253432855 + "congestion_cost": 80648294635138, + "congestion_multiplier": 4913829753, + "prover_cost": 17200241362207, + "sequencer_cost": 3405737878809 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 769187030, - "congestion_multiplier": 4619957479, - "prover_cost": 183528268, - "sequencer_cost": 28956833 + "congestion_cost": 914268505, + "congestion_multiplier": 4913829753, + "prover_cost": 194990347, + "sequencer_cost": 38609110 } }, "parent_fee_header": { - "eth_per_fee_asset": 11632738, - "excess_mana": 1314959901, - "mana_used": 93061894 + "eth_per_fee_asset": 11336489, + "excess_mana": 1022262492, + "mana_used": 73284704 } }, { @@ -31345,21 +31345,21 @@ "blobs_needed": 1, "block_number": 359, "l1_block_number": 20974231, - "mana_spent": 86893132, - "size_in_fields": 3045, + "mana_spent": 72200920, + "size_in_fields": 2505, "slot_number": 359, "timestamp": 1729034747 }, "fee_header": { - "eth_per_fee_asset": 11547891, - "excess_mana": 1326605912, - "mana_used": 86893132 + "eth_per_fee_asset": 11417089, + "excess_mana": 1019049228, + "mana_used": 72200920 }, "oracle_input": { - "fee_asset_price_modifier": -10 + "fee_asset_price_modifier": 52 }, "outputs": { - "eth_per_fee_asset_at_execution": 11559451, + "eth_per_fee_asset_at_execution": 11358028, "l1_fee_oracle_output": { "base_fee": 9652277053, "blob_fee": 243 @@ -31376,22 +31376,22 @@ "slot_of_change": 360 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68408584715659, - "congestion_multiplier": 4721511202, - "prover_cost": 15876901766356, - "sequencer_cost": 2505035316989 + "congestion_cost": 80259466167895, + "congestion_multiplier": 4902360374, + "prover_cost": 17167623376171, + "sequencer_cost": 3399279346732 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790765683, - "congestion_multiplier": 4721511202, - "prover_cost": 183528268, - "sequencer_cost": 28956833 + "congestion_cost": 911589264, + "congestion_multiplier": 4902360374, + "prover_cost": 194990347, + "sequencer_cost": 38609110 } }, "parent_fee_header": { - "eth_per_fee_asset": 11559451, - "excess_mana": 1308021795, - "mana_used": 118584117 + "eth_per_fee_asset": 11358028, + "excess_mana": 1020547196, + "mana_used": 73502032 } }, { @@ -31399,21 +31399,21 @@ "blobs_needed": 1, "block_number": 360, "l1_block_number": 20974234, - "mana_spent": 122874486, - "size_in_fields": 3855, + "mana_spent": 82672209, + "size_in_fields": 2835, "slot_number": 360, "timestamp": 1729034783 }, "fee_header": { - "eth_per_fee_asset": 11566367, - "excess_mana": 1313499044, - "mana_used": 122874486 + "eth_per_fee_asset": 11425080, + "excess_mana": 1016250148, + "mana_used": 82672209 }, "oracle_input": { - "fee_asset_price_modifier": 16 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 11547891, + "eth_per_fee_asset_at_execution": 11417089, "l1_fee_oracle_output": { "base_fee": 9281105159, "blob_fee": 171 @@ -31430,22 +31430,22 @@ "slot_of_change": 360 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66766380025583, - "congestion_multiplier": 4649658996, - "prover_cost": 15882750971585, - "sequencer_cost": 2411117060250 + "congestion_cost": 78713301788223, + "congestion_multiplier": 4881000568, + "prover_cost": 17030049340949, + "sequencer_cost": 3251653902322 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 771010879, - "congestion_multiplier": 4649658996, - "prover_cost": 183412277, - "sequencer_cost": 27843317 + "congestion_cost": 898676772, + "congestion_multiplier": 4881000568, + "prover_cost": 194433589, + "sequencer_cost": 37124422 } }, "parent_fee_header": { - "eth_per_fee_asset": 11547891, - "excess_mana": 1326605912, - "mana_used": 86893132 + "eth_per_fee_asset": 11417089, + "excess_mana": 1019049228, + "mana_used": 72200920 } }, { @@ -31453,21 +31453,21 @@ "blobs_needed": 1, "block_number": 361, "l1_block_number": 20974237, - "mana_spent": 99390502, - "size_in_fields": 3300, + "mana_spent": 81542423, + "size_in_fields": 2970, "slot_number": 361, "timestamp": 1729034819 }, "fee_header": { - "eth_per_fee_asset": 11554800, - "excess_mana": 1336373530, - "mana_used": 99390502 + "eth_per_fee_asset": 11366812, + "excess_mana": 1023922357, + "mana_used": 81542423 }, "oracle_input": { - "fee_asset_price_modifier": -10 + "fee_asset_price_modifier": -51 }, "outputs": { - "eth_per_fee_asset_at_execution": 11566367, + "eth_per_fee_asset_at_execution": 11425080, "l1_fee_oracle_output": { "base_fee": 9281105159, "blob_fee": 171 @@ -31484,22 +31484,22 @@ "slot_of_change": 360 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68963259076943, - "congestion_multiplier": 4775778662, - "prover_cost": 15857380022613, - "sequencer_cost": 2407265565757 + "congestion_cost": 79849368932209, + "congestion_multiplier": 4939770533, + "prover_cost": 17018138078684, + "sequencer_cost": 3249379610471 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797654364, - "congestion_multiplier": 4775778662, - "prover_cost": 183412277, - "sequencer_cost": 27843317 + "congestion_cost": 912285428, + "congestion_multiplier": 4939770533, + "prover_cost": 194433589, + "sequencer_cost": 37124422 } }, "parent_fee_header": { - "eth_per_fee_asset": 11566367, - "excess_mana": 1313499044, - "mana_used": 122874486 + "eth_per_fee_asset": 11425080, + "excess_mana": 1016250148, + "mana_used": 82672209 } }, { @@ -31507,21 +31507,21 @@ "blobs_needed": 1, "block_number": 362, "l1_block_number": 20974240, - "mana_spent": 94864072, - "size_in_fields": 3375, + "mana_spent": 59651661, + "size_in_fields": 2130, "slot_number": 362, "timestamp": 1729034855 }, "fee_header": { - "eth_per_fee_asset": 11520135, - "excess_mana": 1335764032, - "mana_used": 94864072 + "eth_per_fee_asset": 11403185, + "excess_mana": 1030464780, + "mana_used": 59651661 }, "oracle_input": { - "fee_asset_price_modifier": -30 + "fee_asset_price_modifier": 32 }, "outputs": { - "eth_per_fee_asset_at_execution": 11554800, + "eth_per_fee_asset_at_execution": 11366812, "l1_fee_oracle_output": { "base_fee": 9281105159, "blob_fee": 171 @@ -31538,22 +31538,22 @@ "slot_of_change": 360 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68970051753384, - "congestion_multiplier": 4772374208, - "prover_cost": 15873254145464, - "sequencer_cost": 2409675373006 + "congestion_cost": 81290996807197, + "congestion_multiplier": 4990444876, + "prover_cost": 17105375632148, + "sequencer_cost": 3266036422526 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796935154, - "congestion_multiplier": 4772374208, - "prover_cost": 183412277, - "sequencer_cost": 27843317 + "congestion_cost": 924019478, + "congestion_multiplier": 4990444876, + "prover_cost": 194433589, + "sequencer_cost": 37124422 } }, "parent_fee_header": { - "eth_per_fee_asset": 11554800, - "excess_mana": 1336373530, - "mana_used": 99390502 + "eth_per_fee_asset": 11366812, + "excess_mana": 1023922357, + "mana_used": 81542423 } }, { @@ -31561,21 +31561,21 @@ "blobs_needed": 1, "block_number": 363, "l1_block_number": 20974243, - "mana_spent": 94195924, - "size_in_fields": 3390, + "mana_spent": 39127638, + "size_in_fields": 1365, "slot_number": 363, "timestamp": 1729034891 }, "fee_header": { - "eth_per_fee_asset": 11620360, - "excess_mana": 1330628104, - "mana_used": 94195924 + "eth_per_fee_asset": 11316520, + "excess_mana": 1015116441, + "mana_used": 39127638 }, "oracle_input": { - "fee_asset_price_modifier": 87 + "fee_asset_price_modifier": -76 }, "outputs": { - "eth_per_fee_asset_at_execution": 11520135, + "eth_per_fee_asset_at_execution": 11403185, "l1_fee_oracle_output": { "base_fee": 9281105159, "blob_fee": 171 @@ -31592,22 +31592,22 @@ "slot_of_change": 365 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68653280972836, - "congestion_multiplier": 4743782830, - "prover_cost": 15921018026265, - "sequencer_cost": 2416926277340 + "congestion_cost": 78634138093875, + "congestion_multiplier": 4872375743, + "prover_cost": 17050814224272, + "sequencer_cost": 3255618671451 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790895065, - "congestion_multiplier": 4743782830, - "prover_cost": 183412277, - "sequencer_cost": 27843317 + "congestion_cost": 896679624, + "congestion_multiplier": 4872375743, + "prover_cost": 194433589, + "sequencer_cost": 37124422 } }, "parent_fee_header": { - "eth_per_fee_asset": 11520135, - "excess_mana": 1335764032, - "mana_used": 94864072 + "eth_per_fee_asset": 11403185, + "excess_mana": 1030464780, + "mana_used": 59651661 } }, { @@ -31615,21 +31615,21 @@ "blobs_needed": 1, "block_number": 364, "l1_block_number": 20974246, - "mana_spent": 103389305, - "size_in_fields": 3435, + "mana_spent": 116258571, + "size_in_fields": 4095, "slot_number": 364, "timestamp": 1729034927 }, "fee_header": { - "eth_per_fee_asset": 11616873, - "excess_mana": 1324824028, - "mana_used": 103389305 + "eth_per_fee_asset": 11426290, + "excess_mana": 979244079, + "mana_used": 116258571 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": 97 }, "outputs": { - "eth_per_fee_asset_at_execution": 11620360, + "eth_per_fee_asset_at_execution": 11316520, "l1_fee_oracle_output": { "base_fee": 9281105159, "blob_fee": 171 @@ -31646,22 +31646,22 @@ "slot_of_change": 365 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67477491747244, - "congestion_multiplier": 4711678029, - "prover_cost": 15783700074697, - "sequencer_cost": 2396080414032 + "congestion_cost": 73810372446654, + "congestion_multiplier": 4607202158, + "prover_cost": 17181394015122, + "sequencer_cost": 3280551088144 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784112746, - "congestion_multiplier": 4711678029, - "prover_cost": 183412277, - "sequencer_cost": 27843317 + "congestion_cost": 835276556, + "congestion_multiplier": 4607202158, + "prover_cost": 194433589, + "sequencer_cost": 37124422 } }, "parent_fee_header": { - "eth_per_fee_asset": 11620360, - "excess_mana": 1330628104, - "mana_used": 94195924 + "eth_per_fee_asset": 11316520, + "excess_mana": 1015116441, + "mana_used": 39127638 } }, { @@ -31669,21 +31669,21 @@ "blobs_needed": 1, "block_number": 365, "l1_block_number": 20974249, - "mana_spent": 107521235, - "size_in_fields": 3630, + "mana_spent": 72238728, + "size_in_fields": 2685, "slot_number": 365, "timestamp": 1729034963 }, "fee_header": { - "eth_per_fee_asset": 11582022, - "excess_mana": 1328213333, - "mana_used": 107521235 + "eth_per_fee_asset": 11434288, + "excess_mana": 1020502650, + "mana_used": 72238728 }, "oracle_input": { - "fee_asset_price_modifier": -30 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 11616873, + "eth_per_fee_asset_at_execution": 11426290, "l1_fee_oracle_output": { "base_fee": 9333245081, "blob_fee": 95 @@ -31700,22 +31700,22 @@ "slot_of_change": 365 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67893657010799, - "congestion_multiplier": 4730399221, - "prover_cost": 15789840432964, - "sequencer_cost": 2410264448962 + "congestion_cost": 79406511824924, + "congestion_multiplier": 4913488294, + "prover_cost": 17023180664941, + "sequencer_cost": 3267288069881 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788711991, - "congestion_multiplier": 4730399221, - "prover_cost": 183428571, - "sequencer_cost": 27999736 + "congestion_cost": 907321832, + "congestion_multiplier": 4913488294, + "prover_cost": 194511799, + "sequencer_cost": 37332981 } }, "parent_fee_header": { - "eth_per_fee_asset": 11616873, - "excess_mana": 1324824028, - "mana_used": 103389305 + "eth_per_fee_asset": 11426290, + "excess_mana": 979244079, + "mana_used": 116258571 } }, { @@ -31723,21 +31723,21 @@ "blobs_needed": 1, "block_number": 366, "l1_block_number": 20974252, - "mana_spent": 85453721, - "size_in_fields": 2895, + "mana_spent": 38509537, + "size_in_fields": 1335, "slot_number": 366, "timestamp": 1729034999 }, "fee_header": { - "eth_per_fee_asset": 11551908, - "excess_mana": 1335734568, - "mana_used": 85453721 + "eth_per_fee_asset": 11442292, + "excess_mana": 1017741378, + "mana_used": 38509537 }, "oracle_input": { - "fee_asset_price_modifier": -26 + "fee_asset_price_modifier": 7 }, "outputs": { - "eth_per_fee_asset_at_execution": 11582022, + "eth_per_fee_asset_at_execution": 11434288, "l1_fee_oracle_output": { "base_fee": 9333245081, "blob_fee": 95 @@ -31754,22 +31754,22 @@ "slot_of_change": 365 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68861197897915, - "congestion_multiplier": 4772209693, - "prover_cost": 15837353011418, - "sequencer_cost": 2417517079488 + "congestion_cost": 78922739133386, + "congestion_multiplier": 4892368549, + "prover_cost": 17011273373559, + "sequencer_cost": 3265002683158 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797551909, - "congestion_multiplier": 4772209693, - "prover_cost": 183428571, - "sequencer_cost": 27999736 + "congestion_cost": 902425329, + "congestion_multiplier": 4892368549, + "prover_cost": 194511799, + "sequencer_cost": 37332981 } }, "parent_fee_header": { - "eth_per_fee_asset": 11582022, - "excess_mana": 1328213333, - "mana_used": 107521235 + "eth_per_fee_asset": 11434288, + "excess_mana": 1020502650, + "mana_used": 72238728 } }, { @@ -31777,21 +31777,21 @@ "blobs_needed": 1, "block_number": 367, "l1_block_number": 20974255, - "mana_spent": 103485383, - "size_in_fields": 3690, + "mana_spent": 111826723, + "size_in_fields": 3705, "slot_number": 367, "timestamp": 1729035035 }, "fee_header": { - "eth_per_fee_asset": 11561149, - "excess_mana": 1321188289, - "mana_used": 103485383 + "eth_per_fee_asset": 11382792, + "excess_mana": 981250915, + "mana_used": 111826723 }, "oracle_input": { - "fee_asset_price_modifier": 8 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 11551908, + "eth_per_fee_asset_at_execution": 11442292, "l1_fee_oracle_output": { "base_fee": 9333245081, "blob_fee": 95 @@ -31808,22 +31808,22 @@ "slot_of_change": 365 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67566780050534, - "congestion_multiplier": 4691677992, - "prover_cost": 15878638489850, - "sequencer_cost": 2423819164765 + "congestion_cost": 73382174393033, + "congestion_multiplier": 4621648362, + "prover_cost": 16999373814268, + "sequencer_cost": 3262718780469 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780525227, - "congestion_multiplier": 4691677992, - "prover_cost": 183428571, - "sequencer_cost": 27999736 + "congestion_cost": 839660267, + "congestion_multiplier": 4621648362, + "prover_cost": 194511799, + "sequencer_cost": 37332981 } }, "parent_fee_header": { - "eth_per_fee_asset": 11551908, - "excess_mana": 1335734568, - "mana_used": 85453721 + "eth_per_fee_asset": 11442292, + "excess_mana": 1017741378, + "mana_used": 38509537 } }, { @@ -31831,21 +31831,21 @@ "blobs_needed": 1, "block_number": 368, "l1_block_number": 20974258, - "mana_spent": 89470399, - "size_in_fields": 3165, + "mana_spent": 88003975, + "size_in_fields": 3030, "slot_number": 368, "timestamp": 1729035071 }, "fee_header": { - "eth_per_fee_asset": 11624735, - "excess_mana": 1324673672, - "mana_used": 89470399 + "eth_per_fee_asset": 11268964, + "excess_mana": 1018077638, + "mana_used": 88003975 }, "oracle_input": { - "fee_asset_price_modifier": 55 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 11561149, + "eth_per_fee_asset_at_execution": 11382792, "l1_fee_oracle_output": { "base_fee": 9333245081, "blob_fee": 95 @@ -31862,22 +31862,22 @@ "slot_of_change": 370 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67863373441516, - "congestion_multiplier": 4710849240, - "prover_cost": 15865946455669, - "sequencer_cost": 2421881769710 + "congestion_cost": 79332072922004, + "congestion_multiplier": 4894935591, + "prover_cost": 17088232746413, + "sequencer_cost": 3279773626717 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784578572, - "congestion_multiplier": 4710849240, - "prover_cost": 183428571, - "sequencer_cost": 27999736 + "congestion_cost": 903020485, + "congestion_multiplier": 4894935591, + "prover_cost": 194511799, + "sequencer_cost": 37332981 } }, "parent_fee_header": { - "eth_per_fee_asset": 11561149, - "excess_mana": 1321188289, - "mana_used": 103485383 + "eth_per_fee_asset": 11382792, + "excess_mana": 981250915, + "mana_used": 111826723 } }, { @@ -31885,21 +31885,21 @@ "blobs_needed": 1, "block_number": 369, "l1_block_number": 20974261, - "mana_spent": 109206679, - "size_in_fields": 3705, + "mana_spent": 64674258, + "size_in_fields": 2400, "slot_number": 369, "timestamp": 1729035107 }, "fee_header": { - "eth_per_fee_asset": 11572423, - "excess_mana": 1314144071, - "mana_used": 109206679 + "eth_per_fee_asset": 11355735, + "excess_mana": 1031081613, + "mana_used": 64674258 }, "oracle_input": { - "fee_asset_price_modifier": -45 + "fee_asset_price_modifier": 77 }, "outputs": { - "eth_per_fee_asset_at_execution": 11624735, + "eth_per_fee_asset_at_execution": 11268964, "l1_fee_oracle_output": { "base_fee": 9333245081, "blob_fee": 95 @@ -31916,22 +31916,22 @@ "slot_of_change": 370 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66443098014708, - "congestion_multiplier": 4653169332, - "prover_cost": 15779161503467, - "sequencer_cost": 2408634347364 + "congestion_cost": 82197235877229, + "congestion_multiplier": 4995249290, + "prover_cost": 17260841280530, + "sequencer_cost": 3312902676768 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772383407, - "congestion_multiplier": 4653169332, - "prover_cost": 183428571, - "sequencer_cost": 27999736 + "congestion_cost": 926277692, + "congestion_multiplier": 4995249290, + "prover_cost": 194511799, + "sequencer_cost": 37332981 } }, "parent_fee_header": { - "eth_per_fee_asset": 11624735, - "excess_mana": 1324673672, - "mana_used": 89470399 + "eth_per_fee_asset": 11268964, + "excess_mana": 1018077638, + "mana_used": 88003975 } }, { @@ -31939,21 +31939,21 @@ "blobs_needed": 1, "block_number": 370, "l1_block_number": 20974264, - "mana_spent": 81696256, - "size_in_fields": 3090, + "mana_spent": 92676699, + "size_in_fields": 3030, "slot_number": 370, "timestamp": 1729035143 }, "fee_header": { - "eth_per_fee_asset": 11630285, - "excess_mana": 1323350750, - "mana_used": 81696256 + "eth_per_fee_asset": 11345514, + "excess_mana": 1020755871, + "mana_used": 92676699 }, "oracle_input": { - "fee_asset_price_modifier": 50 + "fee_asset_price_modifier": -9 }, "outputs": { - "eth_per_fee_asset_at_execution": 11572423, + "eth_per_fee_asset_at_execution": 11355735, "l1_fee_oracle_output": { "base_fee": 8803070742, "blob_fee": 75 @@ -31970,22 +31970,22 @@ "slot_of_change": 370 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67102102731641, - "congestion_multiplier": 4703563339, - "prover_cost": 15836172856800, - "sequencer_cost": 2282081548523 + "congestion_cost": 78934097352572, + "congestion_multiplier": 4915429627, + "prover_cost": 17058916749995, + "sequencer_cost": 3100837066029 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776533917, - "congestion_multiplier": 4703563339, - "prover_cost": 183262891, - "sequencer_cost": 26409213 + "congestion_cost": 896354692, + "congestion_multiplier": 4915429627, + "prover_cost": 193716538, + "sequencer_cost": 35212284 } }, "parent_fee_header": { - "eth_per_fee_asset": 11572423, - "excess_mana": 1314144071, - "mana_used": 109206679 + "eth_per_fee_asset": 11355735, + "excess_mana": 1031081613, + "mana_used": 64674258 } }, { @@ -31993,21 +31993,21 @@ "blobs_needed": 1, "block_number": 371, "l1_block_number": 20974267, - "mana_spent": 118437160, - "size_in_fields": 3975, + "mana_spent": 70692668, + "size_in_fields": 2640, "slot_number": 371, "timestamp": 1729035179 }, "fee_header": { - "eth_per_fee_asset": 11584926, - "excess_mana": 1305047006, - "mana_used": 118437160 + "eth_per_fee_asset": 11311477, + "excess_mana": 1038432570, + "mana_used": 70692668 }, "oracle_input": { - "fee_asset_price_modifier": -39 + "fee_asset_price_modifier": -30 }, "outputs": { - "eth_per_fee_asset_at_execution": 11630285, + "eth_per_fee_asset_at_execution": 11345514, "l1_fee_oracle_output": { "base_fee": 8803070742, "blob_fee": 75 @@ -32024,22 +32024,22 @@ "slot_of_change": 370 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64971621933599, - "congestion_multiplier": 4603905653, - "prover_cost": 15757386082973, - "sequencer_cost": 2270727931431 + "congestion_cost": 81778306297979, + "congestion_multiplier": 5052861981, + "prover_cost": 17074284867129, + "sequencer_cost": 3103630562706 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 755638480, - "congestion_multiplier": 4603905653, - "prover_cost": 183262891, - "sequencer_cost": 26409213 + "congestion_cost": 927816919, + "congestion_multiplier": 5052861981, + "prover_cost": 193716538, + "sequencer_cost": 35212284 } }, "parent_fee_header": { - "eth_per_fee_asset": 11630285, - "excess_mana": 1323350750, - "mana_used": 81696256 + "eth_per_fee_asset": 11345514, + "excess_mana": 1020755871, + "mana_used": 92676699 } }, { @@ -32047,21 +32047,21 @@ "blobs_needed": 1, "block_number": 372, "l1_block_number": 20974270, - "mana_spent": 93362598, - "size_in_fields": 3510, + "mana_spent": 64837185, + "size_in_fields": 2235, "slot_number": 372, "timestamp": 1729035215 }, "fee_header": { - "eth_per_fee_asset": 11637058, - "excess_mana": 1323484166, - "mana_used": 93362598 + "eth_per_fee_asset": 11251526, + "excess_mana": 1034125238, + "mana_used": 64837185 }, "oracle_input": { - "fee_asset_price_modifier": 45 + "fee_asset_price_modifier": -53 }, "outputs": { - "eth_per_fee_asset_at_execution": 11584926, + "eth_per_fee_asset_at_execution": 11311477, "l1_fee_oracle_output": { "base_fee": 8803070742, "blob_fee": 75 @@ -32078,22 +32078,22 @@ "slot_of_change": 370 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67042972307290, - "congestion_multiplier": 4704297607, - "prover_cost": 15819081710147, - "sequencer_cost": 2279618618195 + "congestion_cost": 81339536207341, + "congestion_multiplier": 5019023404, + "prover_cost": 17125662546103, + "sequencer_cost": 3112969597163 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776687873, - "congestion_multiplier": 4704297607, - "prover_cost": 183262891, - "sequencer_cost": 26409213 + "congestion_cost": 920070293, + "congestion_multiplier": 5019023404, + "prover_cost": 193716538, + "sequencer_cost": 35212284 } }, "parent_fee_header": { - "eth_per_fee_asset": 11584926, - "excess_mana": 1305047006, - "mana_used": 118437160 + "eth_per_fee_asset": 11311477, + "excess_mana": 1038432570, + "mana_used": 70692668 } }, { @@ -32101,21 +32101,21 @@ "blobs_needed": 1, "block_number": 373, "l1_block_number": 20974273, - "mana_spent": 89448042, - "size_in_fields": 3330, + "mana_spent": 67092638, + "size_in_fields": 2535, "slot_number": 373, "timestamp": 1729035251 }, "fee_header": { - "eth_per_fee_asset": 11720844, - "excess_mana": 1316846764, - "mana_used": 89448042 + "eth_per_fee_asset": 11326911, + "excess_mana": 1023962423, + "mana_used": 67092638 }, "oracle_input": { - "fee_asset_price_modifier": 72 + "fee_asset_price_modifier": 67 }, "outputs": { - "eth_per_fee_asset_at_execution": 11637058, + "eth_per_fee_asset_at_execution": 11251526, "l1_fee_oracle_output": { "base_fee": 8803070742, "blob_fee": 75 @@ -32132,22 +32132,22 @@ "slot_of_change": 375 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66086952819175, - "congestion_multiplier": 4667906644, - "prover_cost": 15748214969798, - "sequencer_cost": 2269406322458 + "congestion_cost": 80166700143608, + "congestion_multiplier": 4940079293, + "prover_cost": 17216912443699, + "sequencer_cost": 3129556293076 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 769057703, - "congestion_multiplier": 4667906644, - "prover_cost": 183262891, - "sequencer_cost": 26409213 + "congestion_cost": 901997711, + "congestion_multiplier": 4940079293, + "prover_cost": 193716538, + "sequencer_cost": 35212284 } }, "parent_fee_header": { - "eth_per_fee_asset": 11637058, - "excess_mana": 1323484166, - "mana_used": 93362598 + "eth_per_fee_asset": 11251526, + "excess_mana": 1034125238, + "mana_used": 64837185 } }, { @@ -32155,21 +32155,21 @@ "blobs_needed": 1, "block_number": 374, "l1_block_number": 20974276, - "mana_spent": 118125941, - "size_in_fields": 3930, + "mana_spent": 81954573, + "size_in_fields": 2925, "slot_number": 374, "timestamp": 1729035287 }, "fee_header": { - "eth_per_fee_asset": 11723188, - "excess_mana": 1306294806, - "mana_used": 118125941 + "eth_per_fee_asset": 11258949, + "excess_mana": 1016055061, + "mana_used": 81954573 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": -60 }, "outputs": { - "eth_per_fee_asset_at_execution": 11720844, + "eth_per_fee_asset_at_execution": 11326911, "l1_fee_oracle_output": { "base_fee": 8803070742, "blob_fee": 75 @@ -32186,22 +32186,22 @@ "slot_of_change": 375 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64589955467371, - "congestion_multiplier": 4610631923, - "prover_cost": 15635639464189, - "sequencer_cost": 2253183559137 + "congestion_cost": 78409097943826, + "congestion_multiplier": 4879515331, + "prover_cost": 17102327192295, + "sequencer_cost": 3108727878237 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 757048792, - "congestion_multiplier": 4610631923, - "prover_cost": 183262891, - "sequencer_cost": 26409213 + "congestion_cost": 888132874, + "congestion_multiplier": 4879515331, + "prover_cost": 193716538, + "sequencer_cost": 35212284 } }, "parent_fee_header": { - "eth_per_fee_asset": 11720844, - "excess_mana": 1316846764, - "mana_used": 89448042 + "eth_per_fee_asset": 11326911, + "excess_mana": 1023962423, + "mana_used": 67092638 } }, { @@ -32209,21 +32209,21 @@ "blobs_needed": 1, "block_number": 375, "l1_block_number": 20974279, - "mana_spent": 86783977, - "size_in_fields": 3210, + "mana_spent": 57364631, + "size_in_fields": 2235, "slot_number": 375, "timestamp": 1729035323 }, "fee_header": { - "eth_per_fee_asset": 11799388, - "excess_mana": 1324420747, - "mana_used": 86783977 + "eth_per_fee_asset": 11317495, + "excess_mana": 1023009634, + "mana_used": 57364631 }, "oracle_input": { - "fee_asset_price_modifier": 65 + "fee_asset_price_modifier": 52 }, "outputs": { - "eth_per_fee_asset_at_execution": 11723188, + "eth_per_fee_asset_at_execution": 11258949, "l1_fee_oracle_output": { "base_fee": 9280527156, "blob_fee": 59 @@ -32240,22 +32240,22 @@ "slot_of_change": 375 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66844965379725, - "congestion_multiplier": 4709455401, - "prover_cost": 15645240526724, - "sequencer_cost": 2374915594632 + "congestion_cost": 80881920861353, + "congestion_multiplier": 4932742056, + "prover_cost": 17269171571876, + "sequencer_cost": 3297120272950 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783636096, - "congestion_multiplier": 4709455401, - "prover_cost": 183412096, - "sequencer_cost": 27841582 + "congestion_cost": 910645422, + "congestion_multiplier": 4932742056, + "prover_cost": 194432722, + "sequencer_cost": 37122109 } }, "parent_fee_header": { - "eth_per_fee_asset": 11723188, - "excess_mana": 1306294806, - "mana_used": 118125941 + "eth_per_fee_asset": 11258949, + "excess_mana": 1016055061, + "mana_used": 81954573 } }, { @@ -32263,21 +32263,21 @@ "blobs_needed": 1, "block_number": 376, "l1_block_number": 20974282, - "mana_spent": 97266154, - "size_in_fields": 3555, + "mana_spent": 93000010, + "size_in_fields": 3330, "slot_number": 376, "timestamp": 1729035359 }, "fee_header": { - "eth_per_fee_asset": 11852485, - "excess_mana": 1311204724, - "mana_used": 97266154 + "eth_per_fee_asset": 11371818, + "excess_mana": 1005374265, + "mana_used": 93000010 }, "oracle_input": { - "fee_asset_price_modifier": 45 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 11799388, + "eth_per_fee_asset_at_execution": 11317495, "l1_fee_oracle_output": { "base_fee": 9280527156, "blob_fee": 59 @@ -32294,22 +32294,22 @@ "slot_of_change": 375 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65119537894678, - "congestion_multiplier": 4637194400, - "prover_cost": 15544204157030, - "sequencer_cost": 2359578479834 + "congestion_cost": 77724837430898, + "congestion_multiplier": 4798886231, + "prover_cost": 17179837234300, + "sequencer_cost": 3280064095456 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 768370694, - "congestion_multiplier": 4637194400, - "prover_cost": 183412096, - "sequencer_cost": 27841582 + "congestion_cost": 879650459, + "congestion_multiplier": 4798886231, + "prover_cost": 194432722, + "sequencer_cost": 37122109 } }, "parent_fee_header": { - "eth_per_fee_asset": 11799388, - "excess_mana": 1324420747, - "mana_used": 86783977 + "eth_per_fee_asset": 11317495, + "excess_mana": 1023009634, + "mana_used": 57364631 } }, { @@ -32317,21 +32317,21 @@ "blobs_needed": 1, "block_number": 377, "l1_block_number": 20974285, - "mana_spent": 99972411, - "size_in_fields": 3540, + "mana_spent": 71952138, + "size_in_fields": 2835, "slot_number": 377, "timestamp": 1729035395 }, "fee_header": { - "eth_per_fee_asset": 11794407, - "excess_mana": 1308470878, - "mana_used": 99972411 + "eth_per_fee_asset": 11258099, + "excess_mana": 1023374275, + "mana_used": 71952138 }, "oracle_input": { - "fee_asset_price_modifier": -49 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 11852485, + "eth_per_fee_asset_at_execution": 11371818, "l1_fee_oracle_output": { "base_fee": 9280527156, "blob_fee": 59 @@ -32348,22 +32348,22 @@ "slot_of_change": 375 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64563867745878, - "congestion_multiplier": 4622385567, - "prover_cost": 15474568919514, - "sequencer_cost": 2349007992839 + "congestion_cost": 80136292719423, + "congestion_multiplier": 4935548795, + "prover_cost": 17097769415586, + "sequencer_cost": 3264395279629 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 765242274, - "congestion_multiplier": 4622385567, - "prover_cost": 183412096, - "sequencer_cost": 27841582 + "congestion_cost": 911295336, + "congestion_multiplier": 4935548795, + "prover_cost": 194432722, + "sequencer_cost": 37122109 } }, "parent_fee_header": { - "eth_per_fee_asset": 11852485, - "excess_mana": 1311204724, - "mana_used": 97266154 + "eth_per_fee_asset": 11371818, + "excess_mana": 1005374265, + "mana_used": 93000010 } }, { @@ -32371,21 +32371,21 @@ "blobs_needed": 1, "block_number": 378, "l1_block_number": 20974288, - "mana_spent": 101251226, - "size_in_fields": 3705, + "mana_spent": 79205585, + "size_in_fields": 2520, "slot_number": 378, "timestamp": 1729035431 }, "fee_header": { - "eth_per_fee_asset": 11750767, - "excess_mana": 1308443289, - "mana_used": 101251226 + "eth_per_fee_asset": 11283992, + "excess_mana": 1020326413, + "mana_used": 79205585 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": 23 }, "outputs": { - "eth_per_fee_asset_at_execution": 11794407, + "eth_per_fee_asset_at_execution": 11258099, "l1_fee_oracle_output": { "base_fee": 9280527156, "blob_fee": 59 @@ -32402,22 +32402,22 @@ "slot_of_change": 380 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64879120586563, - "congestion_multiplier": 4622236363, - "prover_cost": 15550768766925, - "sequencer_cost": 2360574974223 + "congestion_cost": 80464238589482, + "congestion_multiplier": 4912137616, + "prover_cost": 17270475415077, + "sequencer_cost": 3297369209491 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 765210754, - "congestion_multiplier": 4622236363, - "prover_cost": 183412096, - "sequencer_cost": 27841582 + "congestion_cost": 905874364, + "congestion_multiplier": 4912137616, + "prover_cost": 194432722, + "sequencer_cost": 37122109 } }, "parent_fee_header": { - "eth_per_fee_asset": 11794407, - "excess_mana": 1308470878, - "mana_used": 99972411 + "eth_per_fee_asset": 11258099, + "excess_mana": 1023374275, + "mana_used": 71952138 } }, { @@ -32425,21 +32425,21 @@ "blobs_needed": 1, "block_number": 379, "l1_block_number": 20974291, - "mana_spent": 102447272, - "size_in_fields": 3855, + "mana_spent": 78507779, + "size_in_fields": 2820, "slot_number": 379, "timestamp": 1729035467 }, "fee_header": { - "eth_per_fee_asset": 11711989, - "excess_mana": 1309694515, - "mana_used": 102447272 + "eth_per_fee_asset": 11311073, + "excess_mana": 1024531998, + "mana_used": 78507779 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 11750767, + "eth_per_fee_asset_at_execution": 11283992, "l1_fee_oracle_output": { "base_fee": 9280527156, "blob_fee": 59 @@ -32456,22 +32456,22 @@ "slot_of_change": 380 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65241807704978, - "congestion_multiplier": 4629007970, - "prover_cost": 15608521213977, - "sequencer_cost": 2369341677867 + "congestion_cost": 80943095581777, + "congestion_multiplier": 4944470687, + "prover_cost": 17230845431298, + "sequencer_cost": 3289802846369 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 766641281, - "congestion_multiplier": 4629007970, - "prover_cost": 183412096, - "sequencer_cost": 27841582 + "congestion_cost": 913361243, + "congestion_multiplier": 4944470687, + "prover_cost": 194432722, + "sequencer_cost": 37122109 } }, "parent_fee_header": { - "eth_per_fee_asset": 11750767, - "excess_mana": 1308443289, - "mana_used": 101251226 + "eth_per_fee_asset": 11283992, + "excess_mana": 1020326413, + "mana_used": 79205585 } }, { @@ -32479,21 +32479,21 @@ "blobs_needed": 1, "block_number": 380, "l1_block_number": 20974294, - "mana_spent": 109866188, - "size_in_fields": 3690, + "mana_spent": 67699439, + "size_in_fields": 2520, "slot_number": 380, "timestamp": 1729035503 }, "fee_header": { - "eth_per_fee_asset": 11693249, - "excess_mana": 1312141787, - "mana_used": 109866188 + "eth_per_fee_asset": 11205880, + "excess_mana": 1028039777, + "mana_used": 67699439 }, "oracle_input": { - "fee_asset_price_modifier": -16 + "fee_asset_price_modifier": -93 }, "outputs": { - "eth_per_fee_asset_at_execution": 11711989, + "eth_per_fee_asset_at_execution": 11311073, "l1_fee_oracle_output": { "base_fee": 8552275570, "blob_fee": 35 @@ -32510,22 +32510,22 @@ "slot_of_change": 380 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64947031029487, - "congestion_multiplier": 4642281240, - "prover_cost": 15640769300586, - "sequencer_cost": 2190646439303 + "congestion_cost": 79898323174115, + "congestion_multiplier": 4971601664, + "prover_cost": 17093015401811, + "sequencer_cost": 3024390612633 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760658913, - "congestion_multiplier": 4642281240, - "prover_cost": 183184518, - "sequencer_cost": 25656827 + "congestion_cost": 903735766, + "congestion_multiplier": 4971601664, + "prover_cost": 193340345, + "sequencer_cost": 34209103 } }, "parent_fee_header": { - "eth_per_fee_asset": 11711989, - "excess_mana": 1309694515, - "mana_used": 102447272 + "eth_per_fee_asset": 11311073, + "excess_mana": 1024531998, + "mana_used": 78507779 } }, { @@ -32533,21 +32533,21 @@ "blobs_needed": 1, "block_number": 381, "l1_block_number": 20974297, - "mana_spent": 104711130, - "size_in_fields": 3660, + "mana_spent": 85386558, + "size_in_fields": 2865, "slot_number": 381, "timestamp": 1729035539 }, "fee_header": { - "eth_per_fee_asset": 11706111, - "excess_mana": 1322007975, - "mana_used": 104711130 + "eth_per_fee_asset": 11215965, + "excess_mana": 1020739216, + "mana_used": 85386558 }, "oracle_input": { - "fee_asset_price_modifier": 11 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 11693249, + "eth_per_fee_asset_at_execution": 11205880, "l1_fee_oracle_output": { "base_fee": 8552275570, "blob_fee": 35 @@ -32564,22 +32564,22 @@ "slot_of_change": 380 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66013742031834, - "congestion_multiplier": 4696179623, - "prover_cost": 15665835731370, - "sequencer_cost": 2194157244065 + "congestion_cost": 79505115974828, + "congestion_multiplier": 4915301917, + "prover_cost": 17253472730388, + "sequencer_cost": 3052781486149 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 771915123, - "congestion_multiplier": 4696179623, - "prover_cost": 183184518, - "sequencer_cost": 25656827 + "congestion_cost": 890924789, + "congestion_multiplier": 4915301917, + "prover_cost": 193340345, + "sequencer_cost": 34209103 } }, "parent_fee_header": { - "eth_per_fee_asset": 11693249, - "excess_mana": 1312141787, - "mana_used": 109866188 + "eth_per_fee_asset": 11205880, + "excess_mana": 1028039777, + "mana_used": 67699439 } }, { @@ -32587,21 +32587,21 @@ "blobs_needed": 1, "block_number": 382, "l1_block_number": 20974300, - "mana_spent": 99303432, - "size_in_fields": 3510, + "mana_spent": 74505578, + "size_in_fields": 2685, "slot_number": 382, "timestamp": 1729035575 }, "fee_header": { - "eth_per_fee_asset": 11770494, - "excess_mana": 1326719105, - "mana_used": 99303432 + "eth_per_fee_asset": 11186803, + "excess_mana": 1031125774, + "mana_used": 74505578 }, "oracle_input": { - "fee_asset_price_modifier": 55 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 11706111, + "eth_per_fee_asset_at_execution": 11215965, "l1_fee_oracle_output": { "base_fee": 8552275570, "blob_fee": 35 @@ -32618,22 +32618,22 @@ "slot_of_change": 380 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66404290972468, - "congestion_multiplier": 4722136540, - "prover_cost": 15648623014083, - "sequencer_cost": 2191746430561 + "congestion_cost": 81062581686017, + "congestion_multiplier": 4995593430, + "prover_cost": 17237959016456, + "sequencer_cost": 3050036532746 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777336001, - "congestion_multiplier": 4722136540, - "prover_cost": 183184518, - "sequencer_cost": 25656827 + "congestion_cost": 909195079, + "congestion_multiplier": 4995593430, + "prover_cost": 193340345, + "sequencer_cost": 34209103 } }, "parent_fee_header": { - "eth_per_fee_asset": 11706111, - "excess_mana": 1322007975, - "mana_used": 104711130 + "eth_per_fee_asset": 11215965, + "excess_mana": 1020739216, + "mana_used": 85386558 } }, { @@ -32641,21 +32641,21 @@ "blobs_needed": 1, "block_number": 383, "l1_block_number": 20974303, - "mana_spent": 93117127, - "size_in_fields": 3270, + "mana_spent": 73239066, + "size_in_fields": 2505, "slot_number": 383, "timestamp": 1729035611 }, "fee_header": { - "eth_per_fee_asset": 11852887, - "excess_mana": 1326022537, - "mana_used": 93117127 + "eth_per_fee_asset": 11232668, + "excess_mana": 1030631352, + "mana_used": 73239066 }, "oracle_input": { - "fee_asset_price_modifier": 70 + "fee_asset_price_modifier": 41 }, "outputs": { - "eth_per_fee_asset_at_execution": 11770494, + "eth_per_fee_asset_at_execution": 11186803, "l1_fee_oracle_output": { "base_fee": 8552275570, "blob_fee": 35 @@ -32672,22 +32672,22 @@ "slot_of_change": 385 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65972813800339, - "congestion_multiplier": 4718289640, - "prover_cost": 15563027176260, - "sequencer_cost": 2179757875923 + "congestion_cost": 81195552294968, + "congestion_multiplier": 4991741823, + "prover_cost": 17282895300830, + "sequencer_cost": 3057987433944 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776532609, - "congestion_multiplier": 4718289640, - "prover_cost": 183184518, - "sequencer_cost": 25656827 + "congestion_cost": 908318648, + "congestion_multiplier": 4991741823, + "prover_cost": 193340345, + "sequencer_cost": 34209103 } }, "parent_fee_header": { - "eth_per_fee_asset": 11770494, - "excess_mana": 1326719105, - "mana_used": 99303432 + "eth_per_fee_asset": 11186803, + "excess_mana": 1031125774, + "mana_used": 74505578 } }, { @@ -32695,21 +32695,21 @@ "blobs_needed": 1, "block_number": 384, "l1_block_number": 20974306, - "mana_spent": 84803023, - "size_in_fields": 3240, + "mana_spent": 65953761, + "size_in_fields": 2235, "slot_number": 384, "timestamp": 1729035647 }, "fee_header": { - "eth_per_fee_asset": 11888445, - "excess_mana": 1319139664, - "mana_used": 84803023 + "eth_per_fee_asset": 11278721, + "excess_mana": 1028870418, + "mana_used": 65953761 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": 41 }, "outputs": { - "eth_per_fee_asset_at_execution": 11852887, + "eth_per_fee_asset_at_execution": 11232668, "l1_fee_oracle_output": { "base_fee": 8552275570, "blob_fee": 35 @@ -32726,22 +32726,22 @@ "slot_of_change": 385 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64847433034670, - "congestion_multiplier": 4680446016, - "prover_cost": 15454843870528, - "sequencer_cost": 2164605720109 + "congestion_cost": 80586609966573, + "congestion_multiplier": 4978048041, + "prover_cost": 17212326136587, + "sequencer_cost": 3045501122263 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 768629296, - "congestion_multiplier": 4680446016, - "prover_cost": 183184518, - "sequencer_cost": 25656827 + "congestion_cost": 905202635, + "congestion_multiplier": 4978048041, + "prover_cost": 193340345, + "sequencer_cost": 34209103 } }, "parent_fee_header": { - "eth_per_fee_asset": 11852887, - "excess_mana": 1326022537, - "mana_used": 93117127 + "eth_per_fee_asset": 11232668, + "excess_mana": 1030631352, + "mana_used": 73239066 } }, { @@ -32749,21 +32749,21 @@ "blobs_needed": 1, "block_number": 385, "l1_block_number": 20974309, - "mana_spent": 115584692, - "size_in_fields": 4095, + "mana_spent": 80898336, + "size_in_fields": 2595, "slot_number": 385, "timestamp": 1729035683 }, "fee_header": { - "eth_per_fee_asset": 11812358, - "excess_mana": 1303942687, - "mana_used": 115584692 + "eth_per_fee_asset": 11174956, + "excess_mana": 1019824179, + "mana_used": 80898336 }, "oracle_input": { - "fee_asset_price_modifier": -64 + "fee_asset_price_modifier": -92 }, "outputs": { - "eth_per_fee_asset_at_execution": 11888445, + "eth_per_fee_asset_at_execution": 11278721, "l1_fee_oracle_output": { "base_fee": 8851561697, "blob_fee": 24 @@ -32780,22 +32780,22 @@ "slot_of_change": 385 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63504519136019, - "congestion_multiplier": 4597961003, - "prover_cost": 15416485923938, - "sequencer_cost": 2233655116376 + "congestion_cost": 79420590774433, + "congestion_multiplier": 4908290537, + "prover_cost": 17181848367382, + "sequencer_cost": 3139207628241 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 754969983, - "congestion_multiplier": 4597961003, - "prover_cost": 183278045, - "sequencer_cost": 26554686 + "congestion_cost": 895762685, + "congestion_multiplier": 4908290537, + "prover_cost": 193789274, + "sequencer_cost": 35406247 } }, "parent_fee_header": { - "eth_per_fee_asset": 11888445, - "excess_mana": 1319139664, - "mana_used": 84803023 + "eth_per_fee_asset": 11278721, + "excess_mana": 1028870418, + "mana_used": 65953761 } }, { @@ -32803,21 +32803,21 @@ "blobs_needed": 1, "block_number": 386, "l1_block_number": 20974312, - "mana_spent": 109188281, - "size_in_fields": 3660, + "mana_spent": 81227882, + "size_in_fields": 2730, "slot_number": 386, "timestamp": 1729035719 }, "fee_header": { - "eth_per_fee_asset": 11802908, - "excess_mana": 1319527379, - "mana_used": 109188281 + "eth_per_fee_asset": 11091143, + "excess_mana": 1025722515, + "mana_used": 81227882 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": -75 }, "outputs": { - "eth_per_fee_asset_at_execution": 11812358, + "eth_per_fee_asset_at_execution": 11174956, "l1_fee_oracle_output": { "base_fee": 8851561697, "blob_fee": 24 @@ -32834,22 +32834,22 @@ "slot_of_change": 385 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65416545197835, - "congestion_multiplier": 4682569673, - "prover_cost": 15515788210957, - "sequencer_cost": 2248042770123 + "congestion_cost": 81088610102805, + "congestion_multiplier": 4953662123, + "prover_cost": 17341390337466, + "sequencer_cost": 3168356725521 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772723651, - "congestion_multiplier": 4682569673, - "prover_cost": 183278045, - "sequencer_cost": 26554686 + "congestion_cost": 906161650, + "congestion_multiplier": 4953662123, + "prover_cost": 193789274, + "sequencer_cost": 35406247 } }, "parent_fee_header": { - "eth_per_fee_asset": 11812358, - "excess_mana": 1303942687, - "mana_used": 115584692 + "eth_per_fee_asset": 11174956, + "excess_mana": 1019824179, + "mana_used": 80898336 } }, { @@ -32857,21 +32857,21 @@ "blobs_needed": 1, "block_number": 387, "l1_block_number": 20974315, - "mana_spent": 97726483, - "size_in_fields": 3480, + "mana_spent": 74561970, + "size_in_fields": 2685, "slot_number": 387, "timestamp": 1729035767 }, "fee_header": { - "eth_per_fee_asset": 11865463, - "excess_mana": 1328715660, - "mana_used": 97726483 + "eth_per_fee_asset": 11135507, + "excess_mana": 1031950397, + "mana_used": 74561970 }, "oracle_input": { - "fee_asset_price_modifier": 53 + "fee_asset_price_modifier": 40 }, "outputs": { - "eth_per_fee_asset_at_execution": 11802908, + "eth_per_fee_asset_at_execution": 11091143, "l1_fee_oracle_output": { "base_fee": 8851561697, "blob_fee": 24 @@ -32888,22 +32888,22 @@ "slot_of_change": 385 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66368677617415, - "congestion_multiplier": 4733180200, - "prover_cost": 15528210929036, - "sequencer_cost": 2249842665893 + "congestion_cost": 82700760868380, + "congestion_multiplier": 5002023956, + "prover_cost": 17472434896927, + "sequencer_cost": 3192299206674 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783343396, - "congestion_multiplier": 4733180200, - "prover_cost": 183278045, - "sequencer_cost": 26554686 + "congestion_cost": 917245965, + "congestion_multiplier": 5002023956, + "prover_cost": 193789274, + "sequencer_cost": 35406247 } }, "parent_fee_header": { - "eth_per_fee_asset": 11802908, - "excess_mana": 1319527379, - "mana_used": 109188281 + "eth_per_fee_asset": 11091143, + "excess_mana": 1025722515, + "mana_used": 81227882 } }, { @@ -32911,21 +32911,21 @@ "blobs_needed": 1, "block_number": 388, "l1_block_number": 20974317, - "mana_spent": 109755878, - "size_in_fields": 3540, + "mana_spent": 72926274, + "size_in_fields": 2865, "slot_number": 388, "timestamp": 1729035791 }, "fee_header": { - "eth_per_fee_asset": 11865463, - "excess_mana": 1326442143, - "mana_used": 109755878 + "eth_per_fee_asset": 11134393, + "excess_mana": 1031512367, + "mana_used": 72926274 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": -1 }, "outputs": { - "eth_per_fee_asset_at_execution": 11865463, + "eth_per_fee_asset_at_execution": 11135507, "l1_fee_oracle_output": { "base_fee": 8851561697, "blob_fee": 24 @@ -32942,22 +32942,22 @@ "slot_of_change": 390 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65796424800280, - "congestion_multiplier": 4720606601, - "prover_cost": 15446345835810, - "sequencer_cost": 2237981442444 + "congestion_cost": 82300953068415, + "congestion_multiplier": 4998607107, + "prover_cost": 17402824496451, + "sequencer_cost": 3179581046467 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780705044, - "congestion_multiplier": 4720606601, - "prover_cost": 183278045, - "sequencer_cost": 26554686 + "congestion_cost": 916462839, + "congestion_multiplier": 4998607107, + "prover_cost": 193789274, + "sequencer_cost": 35406247 } }, "parent_fee_header": { - "eth_per_fee_asset": 11865463, - "excess_mana": 1328715660, - "mana_used": 97726483 + "eth_per_fee_asset": 11135507, + "excess_mana": 1031950397, + "mana_used": 74561970 } }, { @@ -32965,21 +32965,21 @@ "blobs_needed": 1, "block_number": 389, "l1_block_number": 20974320, - "mana_spent": 85326858, - "size_in_fields": 3120, + "mana_spent": 79295506, + "size_in_fields": 2640, "slot_number": 389, "timestamp": 1729035827 }, "fee_header": { - "eth_per_fee_asset": 11814441, - "excess_mana": 1336198021, - "mana_used": 85326858 + "eth_per_fee_asset": 11141073, + "excess_mana": 1029438641, + "mana_used": 79295506 }, "oracle_input": { - "fee_asset_price_modifier": -43 + "fee_asset_price_modifier": 6 }, "outputs": { - "eth_per_fee_asset_at_execution": 11865463, + "eth_per_fee_asset_at_execution": 11134393, "l1_fee_oracle_output": { "base_fee": 8851561697, "blob_fee": 24 @@ -32996,22 +32996,22 @@ "slot_of_change": 390 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66754764563339, - "congestion_multiplier": 4774798078, - "prover_cost": 15446345835810, - "sequencer_cost": 2237981442444 + "congestion_cost": 81976862860868, + "congestion_multiplier": 4982462678, + "prover_cost": 17404565655263, + "sequencer_cost": 3179899164688 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 792076189, - "congestion_multiplier": 4774798078, - "prover_cost": 183278045, - "sequencer_cost": 26554686 + "congestion_cost": 912762608, + "congestion_multiplier": 4982462678, + "prover_cost": 193789274, + "sequencer_cost": 35406247 } }, "parent_fee_header": { - "eth_per_fee_asset": 11865463, - "excess_mana": 1326442143, - "mana_used": 109755878 + "eth_per_fee_asset": 11134393, + "excess_mana": 1031512367, + "mana_used": 72926274 } }, { @@ -33019,21 +33019,21 @@ "blobs_needed": 1, "block_number": 390, "l1_block_number": 20974323, - "mana_spent": 106406351, - "size_in_fields": 3525, + "mana_spent": 74881520, + "size_in_fields": 2385, "slot_number": 390, "timestamp": 1729035863 }, "fee_header": { - "eth_per_fee_asset": 11868787, - "excess_mana": 1321524879, - "mana_used": 106406351 + "eth_per_fee_asset": 11200120, + "excess_mana": 1033734147, + "mana_used": 74881520 }, "oracle_input": { - "fee_asset_price_modifier": 46 + "fee_asset_price_modifier": 53 }, "outputs": { - "eth_per_fee_asset_at_execution": 11814441, + "eth_per_fee_asset_at_execution": 11141073, "l1_fee_oracle_output": { "base_fee": 10688618941, "blob_fee": 21 @@ -33050,22 +33050,22 @@ "slot_of_change": 390 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67502023752119, - "congestion_multiplier": 4693525987, - "prover_cost": 15561644008380, - "sequencer_cost": 2714123926812 + "congestion_cost": 86258935113342, + "congestion_multiplier": 5015962222, + "prover_cost": 17641465952158, + "sequencer_cost": 3837554605378 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797498677, - "congestion_multiplier": 4693525987, - "prover_cost": 183852125, - "sequencer_cost": 32065857 + "congestion_cost": 961017093, + "congestion_multiplier": 5015962222, + "prover_cost": 196544860, + "sequencer_cost": 42754476 } }, "parent_fee_header": { - "eth_per_fee_asset": 11814441, - "excess_mana": 1336198021, - "mana_used": 85326858 + "eth_per_fee_asset": 11141073, + "excess_mana": 1029438641, + "mana_used": 79295506 } }, { @@ -33073,21 +33073,21 @@ "blobs_needed": 1, "block_number": 391, "l1_block_number": 20974326, - "mana_spent": 88012866, - "size_in_fields": 3330, + "mana_spent": 68069368, + "size_in_fields": 2220, "slot_number": 391, "timestamp": 1729035899 }, "fee_header": { - "eth_per_fee_asset": 11833180, - "excess_mana": 1327931230, - "mana_used": 88012866 + "eth_per_fee_asset": 11140759, + "excess_mana": 1033615667, + "mana_used": 68069368 }, "oracle_input": { - "fee_asset_price_modifier": -30 + "fee_asset_price_modifier": -53 }, "outputs": { - "eth_per_fee_asset_at_execution": 11868787, + "eth_per_fee_asset_at_execution": 11200120, "l1_fee_oracle_output": { "base_fee": 10688618941, "blob_fee": 21 @@ -33104,22 +33104,22 @@ "slot_of_change": 390 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67835340713420, - "congestion_multiplier": 4728838160, - "prover_cost": 15490388781938, - "sequencer_cost": 2701696222201 + "congestion_cost": 85784371953158, + "congestion_multiplier": 5015035213, + "prover_cost": 17548460195070, + "sequencer_cost": 3817323028682 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 805123210, - "congestion_multiplier": 4728838160, - "prover_cost": 183852125, - "sequencer_cost": 32065857 + "congestion_cost": 960795260, + "congestion_multiplier": 5015035213, + "prover_cost": 196544860, + "sequencer_cost": 42754476 } }, "parent_fee_header": { - "eth_per_fee_asset": 11868787, - "excess_mana": 1321524879, - "mana_used": 106406351 + "eth_per_fee_asset": 11200120, + "excess_mana": 1033734147, + "mana_used": 74881520 } }, { @@ -33127,21 +33127,21 @@ "blobs_needed": 1, "block_number": 392, "l1_block_number": 20974329, - "mana_spent": 97920445, - "size_in_fields": 3435, + "mana_spent": 64502595, + "size_in_fields": 2580, "slot_number": 392, "timestamp": 1729035935 }, "fee_header": { - "eth_per_fee_asset": 11871046, - "excess_mana": 1315944096, - "mana_used": 97920445 + "eth_per_fee_asset": 11157470, + "excess_mana": 1026685035, + "mana_used": 64502595 }, "oracle_input": { - "fee_asset_price_modifier": 32 + "fee_asset_price_modifier": 15 }, "outputs": { - "eth_per_fee_asset_at_execution": 11833180, + "eth_per_fee_asset_at_execution": 11140759, "l1_fee_oracle_output": { "base_fee": 10688618941, "blob_fee": 21 @@ -33158,22 +33158,22 @@ "slot_of_change": 390 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66837748855338, - "congestion_multiplier": 4662979369, - "prover_cost": 15537000620290, - "sequencer_cost": 2709825845631 + "congestion_cost": 85083070552016, + "congestion_multiplier": 4961105788, + "prover_cost": 17641963173246, + "sequencer_cost": 3837662766065 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790903113, - "congestion_multiplier": 4662979369, - "prover_cost": 183852125, - "sequencer_cost": 32065857 + "congestion_cost": 947889984, + "congestion_multiplier": 4961105788, + "prover_cost": 196544860, + "sequencer_cost": 42754476 } }, "parent_fee_header": { - "eth_per_fee_asset": 11833180, - "excess_mana": 1327931230, - "mana_used": 88012866 + "eth_per_fee_asset": 11140759, + "excess_mana": 1033615667, + "mana_used": 68069368 } }, { @@ -33181,21 +33181,21 @@ "blobs_needed": 1, "block_number": 393, "l1_block_number": 20974332, - "mana_spent": 95899760, - "size_in_fields": 3615, + "mana_spent": 71218626, + "size_in_fields": 2445, "slot_number": 393, "timestamp": 1729035971 }, "fee_header": { - "eth_per_fee_asset": 11836619, - "excess_mana": 1313864541, - "mana_used": 95899760 + "eth_per_fee_asset": 11092756, + "excess_mana": 1016187630, + "mana_used": 71218626 }, "oracle_input": { - "fee_asset_price_modifier": -29 + "fee_asset_price_modifier": -58 }, "outputs": { - "eth_per_fee_asset_at_execution": 11871046, + "eth_per_fee_asset_at_execution": 11157470, "l1_fee_oracle_output": { "base_fee": 10688618941, "blob_fee": 21 @@ -33212,22 +33212,22 @@ "slot_of_change": 395 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66418444928948, - "congestion_multiplier": 4651647761, - "prover_cost": 15487441039316, - "sequencer_cost": 2701182103077 + "congestion_cost": 83227375829826, + "congestion_multiplier": 4880524557, + "prover_cost": 17615540082116, + "sequencer_cost": 3831914941291 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788456415, - "congestion_multiplier": 4651647761, - "prover_cost": 183852125, - "sequencer_cost": 32065857 + "congestion_cost": 928606949, + "congestion_multiplier": 4880524557, + "prover_cost": 196544860, + "sequencer_cost": 42754476 } }, "parent_fee_header": { - "eth_per_fee_asset": 11871046, - "excess_mana": 1315944096, - "mana_used": 97920445 + "eth_per_fee_asset": 11157470, + "excess_mana": 1026685035, + "mana_used": 64502595 } }, { @@ -33235,21 +33235,21 @@ "blobs_needed": 1, "block_number": 394, "l1_block_number": 20974335, - "mana_spent": 97769164, - "size_in_fields": 3645, + "mana_spent": 89346522, + "size_in_fields": 3015, "slot_number": 394, "timestamp": 1729036007 }, "fee_header": { - "eth_per_fee_asset": 11840169, - "excess_mana": 1309764301, - "mana_used": 97769164 + "eth_per_fee_asset": 11065024, + "excess_mana": 1012406256, + "mana_used": 89346522 }, "oracle_input": { - "fee_asset_price_modifier": 3 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11836619, + "eth_per_fee_asset_at_execution": 11092756, "l1_fee_oracle_output": { "base_fee": 10688618941, "blob_fee": 21 @@ -33266,22 +33266,22 @@ "slot_of_change": 395 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66205534536510, - "congestion_multiplier": 4629385942, - "prover_cost": 15532486514942, - "sequencer_cost": 2709038535413 + "congestion_cost": 83093670860515, + "congestion_multiplier": 4851819367, + "prover_cost": 17718307334986, + "sequencer_cost": 3854269939770 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783649688, - "congestion_multiplier": 4629385942, - "prover_cost": 183852125, - "sequencer_cost": 32065857 + "congestion_cost": 921737816, + "congestion_multiplier": 4851819367, + "prover_cost": 196544860, + "sequencer_cost": 42754476 } }, "parent_fee_header": { - "eth_per_fee_asset": 11836619, - "excess_mana": 1313864541, - "mana_used": 95899760 + "eth_per_fee_asset": 11092756, + "excess_mana": 1016187630, + "mana_used": 71218626 } }, { @@ -33289,21 +33289,21 @@ "blobs_needed": 1, "block_number": 395, "l1_block_number": 20974338, - "mana_spent": 110183557, - "size_in_fields": 3930, + "mana_spent": 68774469, + "size_in_fields": 2580, "slot_number": 395, "timestamp": 1729036043 }, "fee_header": { - "eth_per_fee_asset": 11889897, - "excess_mana": 1307533465, - "mana_used": 110183557 + "eth_per_fee_asset": 11007485, + "excess_mana": 1026752778, + "mana_used": 68774469 }, "oracle_input": { - "fee_asset_price_modifier": 42 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 11840169, + "eth_per_fee_asset_at_execution": 11065024, "l1_fee_oracle_output": { "base_fee": 10075589335, "blob_fee": 23 @@ -33320,22 +33320,22 @@ "slot_of_change": 395 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65345232487814, - "congestion_multiplier": 4617318638, - "prover_cost": 15511649622569, - "sequencer_cost": 2552900131747 + "congestion_cost": 84469602054185, + "congestion_multiplier": 4961630101, + "prover_cost": 17679610636182, + "sequencer_cost": 3642319980508 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 773698596, - "congestion_multiplier": 4617318638, - "prover_cost": 183660553, - "sequencer_cost": 30226769 + "congestion_cost": 934658174, + "congestion_multiplier": 4961630101, + "prover_cost": 195625316, + "sequencer_cost": 40302358 } }, "parent_fee_header": { - "eth_per_fee_asset": 11840169, - "excess_mana": 1309764301, - "mana_used": 97769164 + "eth_per_fee_asset": 11065024, + "excess_mana": 1012406256, + "mana_used": 89346522 } }, { @@ -33343,21 +33343,21 @@ "blobs_needed": 1, "block_number": 396, "l1_block_number": 20974341, - "mana_spent": 115457895, - "size_in_fields": 3915, + "mana_spent": 83164110, + "size_in_fields": 2805, "slot_number": 396, "timestamp": 1729036079 }, "fee_header": { - "eth_per_fee_asset": 11919621, - "excess_mana": 1317717022, - "mana_used": 115457895 + "eth_per_fee_asset": 10972261, + "excess_mana": 1020527247, + "mana_used": 83164110 }, "oracle_input": { - "fee_asset_price_modifier": 25 + "fee_asset_price_modifier": -32 }, "outputs": { - "eth_per_fee_asset_at_execution": 11889897, + "eth_per_fee_asset_at_execution": 11007485, "l1_fee_oracle_output": { "base_fee": 10075589335, "blob_fee": 23 @@ -33374,22 +33374,22 @@ "slot_of_change": 395 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66067504705887, - "congestion_multiplier": 4672661936, - "prover_cost": 15446774097371, - "sequencer_cost": 2542222947769 + "congestion_cost": 83883345923252, + "congestion_multiplier": 4913676835, + "prover_cost": 17772026580096, + "sequencer_cost": 3661359338669 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785535826, - "congestion_multiplier": 4672661936, - "prover_cost": 183660553, - "sequencer_cost": 30226769 + "congestion_cost": 923344672, + "congestion_multiplier": 4913676835, + "prover_cost": 195625316, + "sequencer_cost": 40302358 } }, "parent_fee_header": { - "eth_per_fee_asset": 11889897, - "excess_mana": 1307533465, - "mana_used": 110183557 + "eth_per_fee_asset": 11007485, + "excess_mana": 1026752778, + "mana_used": 68774469 } }, { @@ -33397,21 +33397,21 @@ "blobs_needed": 1, "block_number": 397, "l1_block_number": 20974344, - "mana_spent": 92954801, - "size_in_fields": 3270, + "mana_spent": 71488554, + "size_in_fields": 2535, "slot_number": 397, "timestamp": 1729036115 }, "fee_header": { - "eth_per_fee_asset": 11912469, - "excess_mana": 1333174917, - "mana_used": 92954801 + "eth_per_fee_asset": 10928371, + "excess_mana": 1028691357, + "mana_used": 71488554 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": -40 }, "outputs": { - "eth_per_fee_asset_at_execution": 11919621, + "eth_per_fee_asset_at_execution": 10972261, "l1_fee_oracle_output": { "base_fee": 10075589335, "blob_fee": 23 @@ -33428,22 +33428,22 @@ "slot_of_change": 395 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67432980629166, - "congestion_multiplier": 4757939299, - "prover_cost": 15408254423526, - "sequencer_cost": 2535883397635 + "congestion_cost": 85506861256764, + "congestion_multiplier": 4976657691, + "prover_cost": 17829079712924, + "sequencer_cost": 3673113317301 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 803775572, - "congestion_multiplier": 4757939299, - "prover_cost": 183660553, - "sequencer_cost": 30226769 + "congestion_cost": 938203599, + "congestion_multiplier": 4976657691, + "prover_cost": 195625316, + "sequencer_cost": 40302358 } }, "parent_fee_header": { - "eth_per_fee_asset": 11919621, - "excess_mana": 1317717022, - "mana_used": 115457895 + "eth_per_fee_asset": 10972261, + "excess_mana": 1020527247, + "mana_used": 83164110 } }, { @@ -33451,21 +33451,21 @@ "blobs_needed": 1, "block_number": 398, "l1_block_number": 20974347, - "mana_spent": 110173045, - "size_in_fields": 3720, + "mana_spent": 70145905, + "size_in_fields": 2550, "slot_number": 398, "timestamp": 1729036151 }, "fee_header": { - "eth_per_fee_asset": 12010151, - "excess_mana": 1326129718, - "mana_used": 110173045 + "eth_per_fee_asset": 10863893, + "excess_mana": 1025179911, + "mana_used": 70145905 }, "oracle_input": { - "fee_asset_price_modifier": 82 + "fee_asset_price_modifier": -59 }, "outputs": { - "eth_per_fee_asset_at_execution": 11912469, + "eth_per_fee_asset_at_execution": 10928371, "l1_fee_oracle_output": { "base_fee": 10075589335, "blob_fee": 23 @@ -33482,22 +33482,22 @@ "slot_of_change": 400 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66772184171057, - "congestion_multiplier": 4718881359, - "prover_cost": 15417505220791, - "sequencer_cost": 2537405889577 + "congestion_cost": 85263344463690, + "congestion_multiplier": 4949470809, + "prover_cost": 17900684008624, + "sequencer_cost": 3687865099017 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 795421574, - "congestion_multiplier": 4718881359, - "prover_cost": 183660553, - "sequencer_cost": 30226769 + "congestion_cost": 931789461, + "congestion_multiplier": 4949470809, + "prover_cost": 195625316, + "sequencer_cost": 40302358 } }, "parent_fee_header": { - "eth_per_fee_asset": 11912469, - "excess_mana": 1333174917, - "mana_used": 92954801 + "eth_per_fee_asset": 10928371, + "excess_mana": 1028691357, + "mana_used": 71488554 } }, { @@ -33505,21 +33505,21 @@ "blobs_needed": 1, "block_number": 399, "l1_block_number": 20974350, - "mana_spent": 93733387, - "size_in_fields": 3090, + "mana_spent": 59114777, + "size_in_fields": 2445, "slot_number": 399, "timestamp": 1729036187 }, "fee_header": { - "eth_per_fee_asset": 12008949, - "excess_mana": 1336302763, - "mana_used": 93733387 + "eth_per_fee_asset": 10926903, + "excess_mana": 1020325816, + "mana_used": 59114777 }, "oracle_input": { - "fee_asset_price_modifier": -1 + "fee_asset_price_modifier": 58 }, "outputs": { - "eth_per_fee_asset_at_execution": 12010151, + "eth_per_fee_asset_at_execution": 10863893, "l1_fee_oracle_output": { "base_fee": 10075589335, "blob_fee": 23 @@ -33536,22 +33536,22 @@ "slot_of_change": 400 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67235342336662, - "congestion_multiplier": 4775383257, - "prover_cost": 15292110232420, - "sequencer_cost": 2516768440297 + "congestion_cost": 84958536318427, + "congestion_multiplier": 4912133041, + "prover_cost": 18006925878228, + "sequencer_cost": 3709752848266 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 807506614, - "congestion_multiplier": 4775383257, - "prover_cost": 183660553, - "sequencer_cost": 30226769 + "congestion_cost": 922980448, + "congestion_multiplier": 4912133041, + "prover_cost": 195625316, + "sequencer_cost": 40302358 } }, "parent_fee_header": { - "eth_per_fee_asset": 12010151, - "excess_mana": 1326129718, - "mana_used": 110173045 + "eth_per_fee_asset": 10863893, + "excess_mana": 1025179911, + "mana_used": 70145905 } }, { @@ -33559,21 +33559,21 @@ "blobs_needed": 1, "block_number": 400, "l1_block_number": 20974353, - "mana_spent": 90400362, - "size_in_fields": 3270, + "mana_spent": 89519125, + "size_in_fields": 3090, "slot_number": 400, "timestamp": 1729036223 }, "fee_header": { - "eth_per_fee_asset": 12032966, - "excess_mana": 1330036150, - "mana_used": 90400362 + "eth_per_fee_asset": 10965147, + "excess_mana": 1004440593, + "mana_used": 89519125 }, "oracle_input": { - "fee_asset_price_modifier": 20 + "fee_asset_price_modifier": 35 }, "outputs": { - "eth_per_fee_asset_at_execution": 12008949, + "eth_per_fee_asset_at_execution": 10926903, "l1_fee_oracle_output": { "base_fee": 9477825247, "blob_fee": 15 @@ -33590,22 +33590,22 @@ "slot_of_change": 400 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66003999683903, - "congestion_multiplier": 4740498489, - "prover_cost": 15278085700922, - "sequencer_cost": 2367690628048 + "congestion_cost": 80731738810165, + "congestion_multiplier": 4791901605, + "prover_cost": 17821030258986, + "sequencer_cost": 3469537708901 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 792638666, - "congestion_multiplier": 4740498489, - "prover_cost": 183473752, - "sequencer_cost": 28433476 + "congestion_cost": 882147879, + "congestion_multiplier": 4791901605, + "prover_cost": 194728669, + "sequencer_cost": 37911302 } }, "parent_fee_header": { - "eth_per_fee_asset": 12008949, - "excess_mana": 1336302763, - "mana_used": 93733387 + "eth_per_fee_asset": 10926903, + "excess_mana": 1020325816, + "mana_used": 59114777 } }, { @@ -33613,21 +33613,21 @@ "blobs_needed": 1, "block_number": 401, "l1_block_number": 20974356, - "mana_spent": 98057895, - "size_in_fields": 3570, + "mana_spent": 78810149, + "size_in_fields": 2760, "slot_number": 401, "timestamp": 1729036259 }, "fee_header": { - "eth_per_fee_asset": 12028152, - "excess_mana": 1320436512, - "mana_used": 98057895 + "eth_per_fee_asset": 10891680, + "excess_mana": 1018959718, + "mana_used": 78810149 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": -67 }, "outputs": { - "eth_per_fee_asset_at_execution": 12032966, + "eth_per_fee_asset_at_execution": 10965147, "l1_fee_oracle_output": { "base_fee": 9477825247, "blob_fee": 15 @@ -33644,22 +33644,22 @@ "slot_of_change": 400 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64939862374747, - "congestion_multiplier": 4687553105, - "prover_cost": 15247591657785, - "sequencer_cost": 2362964874995 + "congestion_cost": 82779169581585, + "congestion_multiplier": 4901675878, + "prover_cost": 17758874459230, + "sequencer_cost": 3457436731127 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781419156, - "congestion_multiplier": 4687553105, - "prover_cost": 183473752, - "sequencer_cost": 28433476 + "congestion_cost": 907685763, + "congestion_multiplier": 4901675878, + "prover_cost": 194728669, + "sequencer_cost": 37911302 } }, "parent_fee_header": { - "eth_per_fee_asset": 12032966, - "excess_mana": 1330036150, - "mana_used": 90400362 + "eth_per_fee_asset": 10965147, + "excess_mana": 1004440593, + "mana_used": 89519125 } }, { @@ -33667,21 +33667,21 @@ "blobs_needed": 1, "block_number": 402, "l1_block_number": 20974359, - "mana_spent": 97291321, - "size_in_fields": 3570, + "mana_spent": 74379223, + "size_in_fields": 2685, "slot_number": 402, "timestamp": 1729036295 }, "fee_header": { - "eth_per_fee_asset": 12069047, - "excess_mana": 1318494407, - "mana_used": 97291321 + "eth_per_fee_asset": 10897125, + "excess_mana": 1022769867, + "mana_used": 74379223 }, "oracle_input": { - "fee_asset_price_modifier": 34 + "fee_asset_price_modifier": 5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12028152, + "eth_per_fee_asset_at_execution": 10891680, "l1_fee_oracle_output": { "base_fee": 9477825247, "blob_fee": 15 @@ -33698,22 +33698,22 @@ "slot_of_change": 400 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64778414838789, - "congestion_multiplier": 4676913844, - "prover_cost": 15253694166818, - "sequencer_cost": 2363910599068 + "congestion_cost": 83961689197627, + "congestion_multiplier": 4930897376, + "prover_cost": 17878662336757, + "sequencer_cost": 3480757973059 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779164620, - "congestion_multiplier": 4676913844, - "prover_cost": 183473752, - "sequencer_cost": 28433476 + "congestion_cost": 914483851, + "congestion_multiplier": 4930897376, + "prover_cost": 194728669, + "sequencer_cost": 37911302 } }, "parent_fee_header": { - "eth_per_fee_asset": 12028152, - "excess_mana": 1320436512, - "mana_used": 98057895 + "eth_per_fee_asset": 10891680, + "excess_mana": 1018959718, + "mana_used": 78810149 } }, { @@ -33721,21 +33721,21 @@ "blobs_needed": 1, "block_number": 403, "l1_block_number": 20974362, - "mana_spent": 111651663, - "size_in_fields": 3855, + "mana_spent": 67374509, + "size_in_fields": 2445, "slot_number": 403, "timestamp": 1729036331 }, "fee_header": { - "eth_per_fee_asset": 12101633, - "excess_mana": 1315785728, - "mana_used": 111651663 + "eth_per_fee_asset": 10870971, + "excess_mana": 1022149090, + "mana_used": 67374509 }, "oracle_input": { - "fee_asset_price_modifier": 27 + "fee_asset_price_modifier": -24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12069047, + "eth_per_fee_asset_at_execution": 10897125, "l1_fee_oracle_output": { "base_fee": 9477825247, "blob_fee": 15 @@ -33752,22 +33752,22 @@ "slot_of_change": 405 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64299089397863, - "congestion_multiplier": 4662115443, - "prover_cost": 15202008244728, - "sequencer_cost": 2355900677162 + "congestion_cost": 83817841861960, + "congestion_multiplier": 4926124546, + "prover_cost": 17869728850500, + "sequencer_cost": 3479018732006 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776028732, - "congestion_multiplier": 4662115443, - "prover_cost": 183473752, - "sequencer_cost": 28433476 + "congestion_cost": 913373500, + "congestion_multiplier": 4926124546, + "prover_cost": 194728669, + "sequencer_cost": 37911302 } }, "parent_fee_header": { - "eth_per_fee_asset": 12069047, - "excess_mana": 1318494407, - "mana_used": 97291321 + "eth_per_fee_asset": 10897125, + "excess_mana": 1022769867, + "mana_used": 74379223 } }, { @@ -33775,21 +33775,21 @@ "blobs_needed": 1, "block_number": 404, "l1_block_number": 20974365, - "mana_spent": 87488533, - "size_in_fields": 3315, + "mana_spent": 79337269, + "size_in_fields": 2730, "slot_number": 404, "timestamp": 1729036367 }, "fee_header": { - "eth_per_fee_asset": 12148829, - "excess_mana": 1327437391, - "mana_used": 87488533 + "eth_per_fee_asset": 10923151, + "excess_mana": 1014523599, + "mana_used": 79337269 }, "oracle_input": { - "fee_asset_price_modifier": 39 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 12101633, + "eth_per_fee_asset_at_execution": 10870971, "l1_fee_oracle_output": { "base_fee": 9477825247, "blob_fee": 15 @@ -33806,22 +33806,22 @@ "slot_of_change": 405 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65246478223229, - "congestion_multiplier": 4726106666, - "prover_cost": 15161073881517, - "sequencer_cost": 2349556956487 + "congestion_cost": 82772878062135, + "congestion_multiplier": 4867871690, + "prover_cost": 17912720859986, + "sequencer_cost": 3487388753038 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789588934, - "congestion_multiplier": 4726106666, - "prover_cost": 183473752, - "sequencer_cost": 28433476 + "congestion_cost": 899821557, + "congestion_multiplier": 4867871690, + "prover_cost": 194728669, + "sequencer_cost": 37911302 } }, "parent_fee_header": { - "eth_per_fee_asset": 12101633, - "excess_mana": 1315785728, - "mana_used": 111651663 + "eth_per_fee_asset": 10870971, + "excess_mana": 1022149090, + "mana_used": 67374509 } }, { @@ -33829,21 +33829,21 @@ "blobs_needed": 1, "block_number": 405, "l1_block_number": 20974368, - "mana_spent": 96483328, - "size_in_fields": 3450, + "mana_spent": 86455608, + "size_in_fields": 2895, "slot_number": 405, "timestamp": 1729036403 }, "fee_header": { - "eth_per_fee_asset": 12114812, - "excess_mana": 1314925924, - "mana_used": 96483328 + "eth_per_fee_asset": 10903489, + "excess_mana": 1018860868, + "mana_used": 86455608 }, "oracle_input": { - "fee_asset_price_modifier": -28 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12148829, + "eth_per_fee_asset_at_execution": 10923151, "l1_fee_oracle_output": { "base_fee": 9879493917, "blob_fee": 9 @@ -33860,22 +33860,22 @@ "slot_of_change": 405 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64195627660905, - "congestion_multiplier": 4657427850, - "prover_cost": 15112507798077, - "sequencer_cost": 2439616361380 + "congestion_cost": 83870281936046, + "congestion_multiplier": 4900920068, + "prover_cost": 17882309967152, + "sequencer_cost": 3617818338317 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779901703, - "congestion_multiplier": 4657427850, - "prover_cost": 183599273, - "sequencer_cost": 29638482 + "congestion_cost": 916127754, + "congestion_multiplier": 4900920068, + "prover_cost": 195331172, + "sequencer_cost": 39517976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12148829, - "excess_mana": 1327437391, - "mana_used": 87488533 + "eth_per_fee_asset": 10923151, + "excess_mana": 1014523599, + "mana_used": 79337269 } }, { @@ -33883,21 +33883,21 @@ "blobs_needed": 1, "block_number": 406, "l1_block_number": 20974371, - "mana_spent": 99660167, - "size_in_fields": 3675, + "mana_spent": 50995839, + "size_in_fields": 1755, "slot_number": 406, "timestamp": 1729036439 }, "fee_header": { - "eth_per_fee_asset": 12076044, - "excess_mana": 1311409252, - "mana_used": 99660167 + "eth_per_fee_asset": 10881682, + "excess_mana": 1030316476, + "mana_used": 50995839 }, "oracle_input": { - "fee_asset_price_modifier": -32 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 12114812, + "eth_per_fee_asset_at_execution": 10903489, "l1_fee_oracle_output": { "base_fee": 9879493917, "blob_fee": 9 @@ -33914,22 +33914,22 @@ "slot_of_change": 405 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64039278529457, - "congestion_multiplier": 4638304203, - "prover_cost": 15154941983417, - "sequencer_cost": 2446466523790 + "congestion_cost": 85924923939484, + "congestion_multiplier": 4989290449, + "prover_cost": 17914556707491, + "sequencer_cost": 3624342263289 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 775823820, - "congestion_multiplier": 4638304203, - "prover_cost": 183599273, - "sequencer_cost": 29638482 + "congestion_cost": 936881463, + "congestion_multiplier": 4989290449, + "prover_cost": 195331172, + "sequencer_cost": 39517976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12114812, - "excess_mana": 1314925924, - "mana_used": 96483328 + "eth_per_fee_asset": 10903489, + "excess_mana": 1018860868, + "mana_used": 86455608 } }, { @@ -33937,21 +33937,21 @@ "blobs_needed": 1, "block_number": 407, "l1_block_number": 20974374, - "mana_spent": 101094899, - "size_in_fields": 3645, + "mana_spent": 80708196, + "size_in_fields": 2835, "slot_number": 407, "timestamp": 1729036475 }, "fee_header": { - "eth_per_fee_asset": 12066383, - "excess_mana": 1311069419, - "mana_used": 101094899 + "eth_per_fee_asset": 10879505, + "excess_mana": 1006312315, + "mana_used": 80708196 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": -2 }, "outputs": { - "eth_per_fee_asset_at_execution": 12076044, + "eth_per_fee_asset_at_execution": 10881682, "l1_fee_oracle_output": { "base_fee": 9879493917, "blob_fee": 9 @@ -33968,22 +33968,22 @@ "slot_of_change": 405 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64212306861420, - "congestion_multiplier": 4636460359, - "prover_cost": 15203594239968, - "sequencer_cost": 2454320471175 + "congestion_cost": 82139473199089, + "congestion_multiplier": 4805913860, + "prover_cost": 17950457659028, + "sequencer_cost": 3631605481580 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 775430643, - "congestion_multiplier": 4636460359, - "prover_cost": 183599273, - "sequencer_cost": 29638482 + "congestion_cost": 893815627, + "congestion_multiplier": 4805913860, + "prover_cost": 195331172, + "sequencer_cost": 39517976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12076044, - "excess_mana": 1311409252, - "mana_used": 99660167 + "eth_per_fee_asset": 10881682, + "excess_mana": 1030316476, + "mana_used": 50995839 } }, { @@ -33991,21 +33991,21 @@ "blobs_needed": 1, "block_number": 408, "l1_block_number": 20974377, - "mana_spent": 96484646, - "size_in_fields": 3465, + "mana_spent": 95405417, + "size_in_fields": 3075, "slot_number": 408, "timestamp": 1729036511 }, "fee_header": { - "eth_per_fee_asset": 12072416, - "excess_mana": 1312164318, - "mana_used": 96484646 + "eth_per_fee_asset": 10966541, + "excess_mana": 1012020511, + "mana_used": 95405417 }, "oracle_input": { - "fee_asset_price_modifier": 5 + "fee_asset_price_modifier": 80 }, "outputs": { - "eth_per_fee_asset_at_execution": 12066383, + "eth_per_fee_asset_at_execution": 10879505, "l1_fee_oracle_output": { "base_fee": 9879493917, "blob_fee": 9 @@ -34022,22 +34022,22 @@ "slot_of_change": 410 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64368748281901, - "congestion_multiplier": 4642403618, - "prover_cost": 15215767061265, - "sequencer_cost": 2456285533122 + "congestion_cost": 83083837637834, + "congestion_multiplier": 4848900604, + "prover_cost": 17954049563836, + "sequencer_cost": 3632332169525 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776697970, - "congestion_multiplier": 4642403618, - "prover_cost": 183599273, - "sequencer_cost": 29638482 + "congestion_cost": 903911027, + "congestion_multiplier": 4848900604, + "prover_cost": 195331172, + "sequencer_cost": 39517976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12066383, - "excess_mana": 1311069419, - "mana_used": 101094899 + "eth_per_fee_asset": 10879505, + "excess_mana": 1006312315, + "mana_used": 80708196 } }, { @@ -34045,21 +34045,21 @@ "blobs_needed": 1, "block_number": 409, "l1_block_number": 20974380, - "mana_spent": 118635288, - "size_in_fields": 4035, + "mana_spent": 70151662, + "size_in_fields": 2445, "slot_number": 409, "timestamp": 1729036547 }, "fee_header": { - "eth_per_fee_asset": 12089317, - "excess_mana": 1308648964, - "mana_used": 118635288 + "eth_per_fee_asset": 10969830, + "excess_mana": 1032425928, + "mana_used": 70151662 }, "oracle_input": { - "fee_asset_price_modifier": 14 + "fee_asset_price_modifier": 3 }, "outputs": { - "eth_per_fee_asset_at_execution": 12072416, + "eth_per_fee_asset_at_execution": 10966541, "l1_fee_oracle_output": { "base_fee": 9879493917, "blob_fee": 9 @@ -34076,22 +34076,22 @@ "slot_of_change": 410 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64000011348185, - "congestion_multiplier": 4623348791, - "prover_cost": 15208163221016, - "sequencer_cost": 2455058043063 + "congestion_cost": 85783081556893, + "congestion_multiplier": 5005735976, + "prover_cost": 17811557171947, + "sequencer_cost": 3603504149577 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772634761, - "congestion_multiplier": 4623348791, - "prover_cost": 183599273, - "sequencer_cost": 29638482 + "congestion_cost": 940743681, + "congestion_multiplier": 5005735976, + "prover_cost": 195331172, + "sequencer_cost": 39517976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12072416, - "excess_mana": 1312164318, - "mana_used": 96484646 + "eth_per_fee_asset": 10966541, + "excess_mana": 1012020511, + "mana_used": 95405417 } }, { @@ -34099,21 +34099,21 @@ "blobs_needed": 1, "block_number": 410, "l1_block_number": 20974383, - "mana_spent": 107097761, - "size_in_fields": 3555, + "mana_spent": 70495329, + "size_in_fields": 2340, "slot_number": 410, "timestamp": 1729036583 }, "fee_header": { - "eth_per_fee_asset": 12044586, - "excess_mana": 1327284252, - "mana_used": 107097761 + "eth_per_fee_asset": 10875489, + "excess_mana": 1027577590, + "mana_used": 70495329 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": -86 }, "outputs": { - "eth_per_fee_asset_at_execution": 12089317, + "eth_per_fee_asset_at_execution": 10969830, "l1_fee_oracle_output": { "base_fee": 8963243946, "blob_fee": 6 @@ -34130,22 +34130,22 @@ "slot_of_change": 410 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64772858053106, - "congestion_multiplier": 4725259953, - "prover_cost": 15163217657375, - "sequencer_cost": 2224255679622 + "congestion_cost": 83127031230202, + "congestion_multiplier": 4968018373, + "prover_cost": 17680930059992, + "sequencer_cost": 3268325580251 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783059614, - "congestion_multiplier": 4725259953, - "prover_cost": 183312945, - "sequencer_cost": 26889732 + "congestion_cost": 911889401, + "congestion_multiplier": 4968018373, + "prover_cost": 193956797, + "sequencer_cost": 35852976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12089317, - "excess_mana": 1308648964, - "mana_used": 118635288 + "eth_per_fee_asset": 10969830, + "excess_mana": 1032425928, + "mana_used": 70151662 } }, { @@ -34153,21 +34153,21 @@ "blobs_needed": 1, "block_number": 411, "l1_block_number": 20974386, - "mana_spent": 97968341, - "size_in_fields": 3360, + "mana_spent": 67939526, + "size_in_fields": 2565, "slot_number": 411, "timestamp": 1729036619 }, "fee_header": { - "eth_per_fee_asset": 12040972, - "excess_mana": 1334382013, - "mana_used": 97968341 + "eth_per_fee_asset": 10866788, + "excess_mana": 1023072919, + "mana_used": 67939526 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": -8 }, "outputs": { - "eth_per_fee_asset_at_execution": 12044586, + "eth_per_fee_asset_at_execution": 10875489, "l1_fee_oracle_output": { "base_fee": 8963243946, "blob_fee": 6 @@ -34184,22 +34184,22 @@ "slot_of_change": 410 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65701086446641, - "congestion_multiplier": 4764663695, - "prover_cost": 15219530584115, - "sequencer_cost": 2232516086481 + "congestion_cost": 83112996390324, + "congestion_multiplier": 4933229063, + "prover_cost": 17834305841329, + "sequencer_cost": 3296677142518 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791342386, - "congestion_multiplier": 4764663695, - "prover_cost": 183312945, - "sequencer_cost": 26889732 + "congestion_cost": 903894478, + "congestion_multiplier": 4933229063, + "prover_cost": 193956797, + "sequencer_cost": 35852976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12044586, - "excess_mana": 1327284252, - "mana_used": 107097761 + "eth_per_fee_asset": 10875489, + "excess_mana": 1027577590, + "mana_used": 70495329 } }, { @@ -34207,21 +34207,21 @@ "blobs_needed": 1, "block_number": 412, "l1_block_number": 20974389, - "mana_spent": 85504422, - "size_in_fields": 3120, + "mana_spent": 82513980, + "size_in_fields": 2805, "slot_number": 412, "timestamp": 1729036655 }, "fee_header": { - "eth_per_fee_asset": 11997624, - "excess_mana": 1332350354, - "mana_used": 85504422 + "eth_per_fee_asset": 10853747, + "excess_mana": 1016012445, + "mana_used": 82513980 }, "oracle_input": { - "fee_asset_price_modifier": -36 + "fee_asset_price_modifier": -12 }, "outputs": { - "eth_per_fee_asset_at_execution": 12040972, + "eth_per_fee_asset_at_execution": 10866788, "l1_fee_oracle_output": { "base_fee": 8963243946, "blob_fee": 6 @@ -34238,44 +34238,44 @@ "slot_of_change": 410 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65523323200154, - "congestion_multiplier": 4753351344, - "prover_cost": 15224098602671, - "sequencer_cost": 2233186158061 + "congestion_cost": 82036751798232, + "congestion_multiplier": 4879190947, + "prover_cost": 17848585709044, + "sequencer_cost": 3299316780635 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788964500, - "congestion_multiplier": 4753351344, - "prover_cost": 183312945, - "sequencer_cost": 26889732 + "congestion_cost": 891475990, + "congestion_multiplier": 4879190947, + "prover_cost": 193956797, + "sequencer_cost": 35852976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12040972, - "excess_mana": 1334382013, - "mana_used": 97968341 + "eth_per_fee_asset": 10866788, + "excess_mana": 1023072919, + "mana_used": 67939526 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 413, "l1_block_number": 20974392, - "mana_spent": 119036361, - "size_in_fields": 4110, + "mana_spent": 66892207, + "size_in_fields": 2670, "slot_number": 413, "timestamp": 1729036691 }, "fee_header": { - "eth_per_fee_asset": 12043214, - "excess_mana": 1317854776, - "mana_used": 119036361 + "eth_per_fee_asset": 10863515, + "excess_mana": 1023526425, + "mana_used": 66892207 }, "oracle_input": { - "fee_asset_price_modifier": 38 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 11997624, + "eth_per_fee_asset_at_execution": 10853747, "l1_fee_oracle_output": { "base_fee": 8963243946, "blob_fee": 6 @@ -34292,22 +34292,22 @@ "slot_of_change": 415 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64359550440988, - "congestion_multiplier": 4673415099, - "prover_cost": 15279104012595, - "sequencer_cost": 2241254768445 + "congestion_cost": 83353409932994, + "congestion_multiplier": 4936720407, + "prover_cost": 17870031151454, + "sequencer_cost": 3303280977528 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772161687, - "congestion_multiplier": 4673415099, - "prover_cost": 183312945, - "sequencer_cost": 26889732 + "congestion_cost": 904696823, + "congestion_multiplier": 4936720407, + "prover_cost": 193956797, + "sequencer_cost": 35852976 } }, "parent_fee_header": { - "eth_per_fee_asset": 11997624, - "excess_mana": 1332350354, - "mana_used": 85504422 + "eth_per_fee_asset": 10853747, + "excess_mana": 1016012445, + "mana_used": 82513980 } }, { @@ -34315,21 +34315,21 @@ "blobs_needed": 1, "block_number": 414, "l1_block_number": 20974395, - "mana_spent": 86544539, - "size_in_fields": 3030, + "mana_spent": 88310587, + "size_in_fields": 2940, "slot_number": 414, "timestamp": 1729036727 }, "fee_header": { - "eth_per_fee_asset": 11996245, - "excess_mana": 1336891137, - "mana_used": 86544539 + "eth_per_fee_asset": 10811370, + "excess_mana": 1015418632, + "mana_used": 88310587 }, "oracle_input": { - "fee_asset_price_modifier": -39 + "fee_asset_price_modifier": -48 }, "outputs": { - "eth_per_fee_asset_at_execution": 12043214, + "eth_per_fee_asset_at_execution": 10863515, "l1_fee_oracle_output": { "base_fee": 8963243946, "blob_fee": 6 @@ -34346,22 +34346,22 @@ "slot_of_change": 415 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65953068425090, - "congestion_multiplier": 4778671751, - "prover_cost": 15221264439875, - "sequencer_cost": 2232770421584 + "congestion_cost": 81965898698534, + "congestion_multiplier": 4874673210, + "prover_cost": 17853963196995, + "sequencer_cost": 3300310811004 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794286917, - "congestion_multiplier": 4778671751, - "prover_cost": 183312945, - "sequencer_cost": 26889732 + "congestion_cost": 890437770, + "congestion_multiplier": 4874673210, + "prover_cost": 193956797, + "sequencer_cost": 35852976 } }, "parent_fee_header": { - "eth_per_fee_asset": 12043214, - "excess_mana": 1317854776, - "mana_used": 119036361 + "eth_per_fee_asset": 10863515, + "excess_mana": 1023526425, + "mana_used": 66892207 } }, { @@ -34369,21 +34369,21 @@ "blobs_needed": 1, "block_number": 415, "l1_block_number": 20974398, - "mana_spent": 89466654, - "size_in_fields": 3420, + "mana_spent": 72547918, + "size_in_fields": 2565, "slot_number": 415, "timestamp": 1729036763 }, "fee_header": { - "eth_per_fee_asset": 12041830, - "excess_mana": 1323435676, - "mana_used": 89466654 + "eth_per_fee_asset": 10830830, + "excess_mana": 1028729219, + "mana_used": 72547918 }, "oracle_input": { - "fee_asset_price_modifier": 38 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 11996245, + "eth_per_fee_asset_at_execution": 10811370, "l1_fee_oracle_output": { "base_fee": 8676856119, "blob_fee": 4 @@ -34400,22 +34400,22 @@ "slot_of_change": 415 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64610493616961, - "congestion_multiplier": 4704030724, - "prover_cost": 15273400051433, - "sequencer_cost": 2169893079043 + "congestion_cost": 83955884406880, + "congestion_multiplier": 4976951645, + "prover_cost": 17900341584832, + "sequencer_cost": 3210270761245 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 775083311, - "congestion_multiplier": 4704030724, - "prover_cost": 183223449, - "sequencer_cost": 26030569 + "congestion_cost": 907678130, + "congestion_multiplier": 4976951645, + "prover_cost": 193527216, + "sequencer_cost": 34707425 } }, "parent_fee_header": { - "eth_per_fee_asset": 11996245, - "excess_mana": 1336891137, - "mana_used": 86544539 + "eth_per_fee_asset": 10811370, + "excess_mana": 1015418632, + "mana_used": 88310587 } }, { @@ -34423,21 +34423,21 @@ "blobs_needed": 1, "block_number": 416, "l1_block_number": 20974401, - "mana_spent": 121724693, - "size_in_fields": 3915, + "mana_spent": 71917666, + "size_in_fields": 2760, "slot_number": 416, "timestamp": 1729036799 }, "fee_header": { - "eth_per_fee_asset": 12162248, - "excess_mana": 1312902330, - "mana_used": 121724693 + "eth_per_fee_asset": 10750681, + "excess_mana": 1026277137, + "mana_used": 71917666 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -74 }, "outputs": { - "eth_per_fee_asset_at_execution": 12041830, + "eth_per_fee_asset_at_execution": 10830830, "l1_fee_oracle_output": { "base_fee": 8676856119, "blob_fee": 4 @@ -34454,22 +34454,22 @@ "slot_of_change": 415 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63364685350981, - "congestion_multiplier": 4646413944, - "prover_cost": 15215581767888, - "sequencer_cost": 2161678831208 + "congestion_cost": 83404621991113, + "congestion_multiplier": 4957949937, + "prover_cost": 17868179631663, + "sequencer_cost": 3204502794339 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 763026769, - "congestion_multiplier": 4646413944, - "prover_cost": 183223449, - "sequencer_cost": 26030569 + "congestion_cost": 903341282, + "congestion_multiplier": 4957949937, + "prover_cost": 193527216, + "sequencer_cost": 34707425 } }, "parent_fee_header": { - "eth_per_fee_asset": 12041830, - "excess_mana": 1323435676, - "mana_used": 89466654 + "eth_per_fee_asset": 10830830, + "excess_mana": 1028729219, + "mana_used": 72547918 } }, { @@ -34477,21 +34477,21 @@ "blobs_needed": 1, "block_number": 417, "l1_block_number": 20974404, - "mana_spent": 93695941, - "size_in_fields": 3285, + "mana_spent": 105297834, + "size_in_fields": 3300, "slot_number": 417, "timestamp": 1729036835 }, "fee_header": { - "eth_per_fee_asset": 12276573, - "excess_mana": 1334627023, - "mana_used": 93695941 + "eth_per_fee_asset": 10717353, + "excess_mana": 1023194803, + "mana_used": 105297834 }, "oracle_input": { - "fee_asset_price_modifier": 94 + "fee_asset_price_modifier": -31 }, "outputs": { - "eth_per_fee_asset_at_execution": 12162248, + "eth_per_fee_asset_at_execution": 10750681, "l1_fee_oracle_output": { "base_fee": 8676856119, "blob_fee": 4 @@ -34508,22 +34508,22 @@ "slot_of_change": 415 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64795328462305, - "congestion_multiplier": 4766029737, - "prover_cost": 15064932815052, - "sequencer_cost": 2140276123296 + "congestion_cost": 83521520822728, + "congestion_multiplier": 4934167152, + "prover_cost": 18001391353720, + "sequencer_cost": 3228393159466 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788056854, - "congestion_multiplier": 4766029737, - "prover_cost": 183223449, - "sequencer_cost": 26030569 + "congestion_cost": 897913227, + "congestion_multiplier": 4934167152, + "prover_cost": 193527216, + "sequencer_cost": 34707425 } }, "parent_fee_header": { - "eth_per_fee_asset": 12162248, - "excess_mana": 1312902330, - "mana_used": 121724693 + "eth_per_fee_asset": 10750681, + "excess_mana": 1026277137, + "mana_used": 71917666 } }, { @@ -34531,21 +34531,21 @@ "blobs_needed": 1, "block_number": 418, "l1_block_number": 20974407, - "mana_spent": 90907473, - "size_in_fields": 3405, + "mana_spent": 66165088, + "size_in_fields": 2100, "slot_number": 418, "timestamp": 1729036871 }, "fee_header": { - "eth_per_fee_asset": 12366191, - "excess_mana": 1328322964, - "mana_used": 90907473 + "eth_per_fee_asset": 10610179, + "excess_mana": 1053492637, + "mana_used": 66165088 }, "oracle_input": { - "fee_asset_price_modifier": 73 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12276573, + "eth_per_fee_asset_at_execution": 10717353, "l1_fee_oracle_output": { "base_fee": 8676856119, "blob_fee": 4 @@ -34562,22 +34562,22 @@ "slot_of_change": 420 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63594946244364, - "congestion_multiplier": 4731006020, - "prover_cost": 14924641347386, - "sequencer_cost": 2120344904071 + "congestion_cost": 88866916019282, + "congestion_multiplier": 5172977887, + "prover_cost": 18057370695918, + "sequencer_cost": 3238432568192 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780728000, - "congestion_multiplier": 4731006020, - "prover_cost": 183223449, - "sequencer_cost": 26030569 + "congestion_cost": 952418109, + "congestion_multiplier": 5172977887, + "prover_cost": 193527216, + "sequencer_cost": 34707425 } }, "parent_fee_header": { - "eth_per_fee_asset": 12276573, - "excess_mana": 1334627023, - "mana_used": 93695941 + "eth_per_fee_asset": 10717353, + "excess_mana": 1023194803, + "mana_used": 105297834 } }, { @@ -34585,21 +34585,21 @@ "blobs_needed": 1, "block_number": 419, "l1_block_number": 20974410, - "mana_spent": 119582639, - "size_in_fields": 4065, + "mana_spent": 66165103, + "size_in_fields": 2325, "slot_number": 419, "timestamp": 1729036907 }, "fee_header": { - "eth_per_fee_asset": 12320436, - "excess_mana": 1319230437, - "mana_used": 119582639 + "eth_per_fee_asset": 10633521, + "excess_mana": 1044657725, + "mana_used": 66165103 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12366191, + "eth_per_fee_asset_at_execution": 10610179, "l1_fee_oracle_output": { "base_fee": 8676856119, "blob_fee": 4 @@ -34616,22 +34616,22 @@ "slot_of_change": 420 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62286935322284, - "congestion_multiplier": 4680943127, - "prover_cost": 14816482213481, - "sequencer_cost": 2104978727888 + "congestion_cost": 88241435889065, + "congestion_multiplier": 5102170582, + "prover_cost": 18239769187683, + "sequencer_cost": 3271144153176 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 770252139, - "congestion_multiplier": 4680943127, - "prover_cost": 183223449, - "sequencer_cost": 26030569 + "congestion_cost": 936257430, + "congestion_multiplier": 5102170582, + "prover_cost": 193527216, + "sequencer_cost": 34707425 } }, "parent_fee_header": { - "eth_per_fee_asset": 12366191, - "excess_mana": 1328322964, - "mana_used": 90907473 + "eth_per_fee_asset": 10610179, + "excess_mana": 1053492637, + "mana_used": 66165088 } }, { @@ -34639,21 +34639,21 @@ "blobs_needed": 1, "block_number": 420, "l1_block_number": 20974413, - "mana_spent": 94357590, - "size_in_fields": 3225, + "mana_spent": 70703130, + "size_in_fields": 2280, "slot_number": 420, "timestamp": 1729036943 }, "fee_header": { - "eth_per_fee_asset": 12279778, - "excess_mana": 1338813076, - "mana_used": 94357590 + "eth_per_fee_asset": 10559086, + "excess_mana": 1035822828, + "mana_used": 70703130 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": -70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12320436, + "eth_per_fee_asset_at_execution": 10633521, "l1_fee_oracle_output": { "base_fee": 9781867870, "blob_fee": 3 @@ -34670,22 +34670,22 @@ "slot_of_change": 420 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65486642518171, - "congestion_multiplier": 4789429491, - "prover_cost": 14899534805425, - "sequencer_cost": 2381864083382 + "congestion_cost": 88853423245227, + "congestion_multiplier": 5032332600, + "prover_cost": 18355607046810, + "sequencer_cost": 3679634619615 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 806823988, - "congestion_multiplier": 4789429491, - "prover_cost": 183568765, - "sequencer_cost": 29345604 + "congestion_cost": 944824742, + "congestion_multiplier": 5032332600, + "prover_cost": 195184733, + "sequencer_cost": 39127472 } }, "parent_fee_header": { - "eth_per_fee_asset": 12320436, - "excess_mana": 1319230437, - "mana_used": 119582639 + "eth_per_fee_asset": 10633521, + "excess_mana": 1044657725, + "mana_used": 66165103 } }, { @@ -34693,21 +34693,21 @@ "blobs_needed": 1, "block_number": 421, "l1_block_number": 20974416, - "mana_spent": 94703311, - "size_in_fields": 3450, + "mana_spent": 71129042, + "size_in_fields": 2415, "slot_number": 421, "timestamp": 1729036979 }, "fee_header": { - "eth_per_fee_asset": 12260130, - "excess_mana": 1333170666, - "mana_used": 94703311 + "eth_per_fee_asset": 10516849, + "excess_mana": 1031525958, + "mana_used": 71129042 }, "oracle_input": { - "fee_asset_price_modifier": -16 + "fee_asset_price_modifier": -40 }, "outputs": { - "eth_per_fee_asset_at_execution": 12279778, + "eth_per_fee_asset_at_execution": 10559086, "l1_fee_oracle_output": { "base_fee": 9781867870, "blob_fee": 3 @@ -34724,22 +34724,22 @@ "slot_of_change": 420 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65157060249787, - "congestion_multiplier": 4757915634, - "prover_cost": 14948866746614, - "sequencer_cost": 2389750368452 + "congestion_cost": 88733748356629, + "congestion_multiplier": 4998713088, + "prover_cost": 18485002679210, + "sequencer_cost": 3705573758941 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 800114235, - "congestion_multiplier": 4757915634, - "prover_cost": 183568765, - "sequencer_cost": 29345604 + "congestion_cost": 936947280, + "congestion_multiplier": 4998713088, + "prover_cost": 195184733, + "sequencer_cost": 39127472 } }, "parent_fee_header": { - "eth_per_fee_asset": 12279778, - "excess_mana": 1338813076, - "mana_used": 94357590 + "eth_per_fee_asset": 10559086, + "excess_mana": 1035822828, + "mana_used": 70703130 } }, { @@ -34747,21 +34747,21 @@ "blobs_needed": 1, "block_number": 422, "l1_block_number": 20974419, - "mana_spent": 99527138, - "size_in_fields": 3435, + "mana_spent": 65918937, + "size_in_fields": 2625, "slot_number": 422, "timestamp": 1729037015 }, "fee_header": { - "eth_per_fee_asset": 12256451, - "excess_mana": 1327873977, - "mana_used": 99527138 + "eth_per_fee_asset": 10443231, + "excess_mana": 1027655000, + "mana_used": 65918937 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": -70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12260130, + "eth_per_fee_asset_at_execution": 10516849, "l1_fee_oracle_output": { "base_fee": 9781867870, "blob_fee": 3 @@ -34778,22 +34778,22 @@ "slot_of_change": 420 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64751008512961, - "congestion_multiplier": 4728521405, - "prover_cost": 14972823697629, - "sequencer_cost": 2393580165953 + "congestion_cost": 88419612661550, + "congestion_multiplier": 4968618345, + "prover_cost": 18559240795414, + "sequencer_cost": 3720455813334 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 793855782, - "congestion_multiplier": 4728521405, - "prover_cost": 183568765, - "sequencer_cost": 29345604 + "congestion_cost": 929895715, + "congestion_multiplier": 4968618345, + "prover_cost": 195184733, + "sequencer_cost": 39127472 } }, "parent_fee_header": { - "eth_per_fee_asset": 12260130, - "excess_mana": 1333170666, - "mana_used": 94703311 + "eth_per_fee_asset": 10516849, + "excess_mana": 1031525958, + "mana_used": 71129042 } }, { @@ -34801,21 +34801,21 @@ "blobs_needed": 1, "block_number": 423, "l1_block_number": 20974422, - "mana_spent": 85844952, - "size_in_fields": 3240, + "mana_spent": 87390056, + "size_in_fields": 2955, "slot_number": 423, "timestamp": 1729037051 }, "fee_header": { - "eth_per_fee_asset": 12142466, - "excess_mana": 1327401115, - "mana_used": 85844952 + "eth_per_fee_asset": 10416078, + "excess_mana": 1018573937, + "mana_used": 87390056 }, "oracle_input": { - "fee_asset_price_modifier": -93 + "fee_asset_price_modifier": -26 }, "outputs": { - "eth_per_fee_asset_at_execution": 12256451, + "eth_per_fee_asset_at_execution": 10443231, "l1_fee_oracle_output": { "base_fee": 9781867870, "blob_fee": 3 @@ -34832,22 +34832,22 @@ "slot_of_change": 425 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64725012322083, - "congestion_multiplier": 4725906081, - "prover_cost": 14977318067033, - "sequencer_cost": 2394298643221 + "congestion_cost": 87474775191701, + "congestion_multiplier": 4898726847, + "prover_cost": 18690071396487, + "sequencer_cost": 3746682611924 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 793298942, - "congestion_multiplier": 4725906081, - "prover_cost": 183568765, - "sequencer_cost": 29345604 + "congestion_cost": 913519284, + "congestion_multiplier": 4898726847, + "prover_cost": 195184733, + "sequencer_cost": 39127472 } }, "parent_fee_header": { - "eth_per_fee_asset": 12256451, - "excess_mana": 1327873977, - "mana_used": 99527138 + "eth_per_fee_asset": 10443231, + "excess_mana": 1027655000, + "mana_used": 65918937 } }, { @@ -34855,21 +34855,21 @@ "blobs_needed": 1, "block_number": 424, "l1_block_number": 20974425, - "mana_spent": 90570074, - "size_in_fields": 3360, + "mana_spent": 30347807, + "size_in_fields": 1125, "slot_number": 424, "timestamp": 1729037087 }, "fee_header": { - "eth_per_fee_asset": 12148537, - "excess_mana": 1313246067, - "mana_used": 90570074 + "eth_per_fee_asset": 10397329, + "excess_mana": 1030963993, + "mana_used": 30347807 }, "oracle_input": { - "fee_asset_price_modifier": 5 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12142466, + "eth_per_fee_asset_at_execution": 10416078, "l1_fee_oracle_output": { "base_fee": 9781867870, "blob_fee": 3 @@ -34886,22 +34886,22 @@ "slot_of_change": 425 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63971508588124, - "congestion_multiplier": 4648282979, - "prover_cost": 15117914680593, - "sequencer_cost": 2416774648577 + "congestion_cost": 89853486888252, + "congestion_multiplier": 4994332810, + "prover_cost": 18738793334689, + "sequencer_cost": 3756449596480 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776771868, - "congestion_multiplier": 4648282979, - "prover_cost": 183568765, - "sequencer_cost": 29345604 + "congestion_cost": 935920928, + "congestion_multiplier": 4994332810, + "prover_cost": 195184733, + "sequencer_cost": 39127472 } }, "parent_fee_header": { - "eth_per_fee_asset": 12142466, - "excess_mana": 1327401115, - "mana_used": 85844952 + "eth_per_fee_asset": 10416078, + "excess_mana": 1018573937, + "mana_used": 87390056 } }, { @@ -34909,21 +34909,21 @@ "blobs_needed": 1, "block_number": 425, "l1_block_number": 20974428, - "mana_spent": 110560940, - "size_in_fields": 3870, + "mana_spent": 95509305, + "size_in_fields": 3270, "slot_number": 425, "timestamp": 1729037123 }, "fee_header": { - "eth_per_fee_asset": 12142462, - "excess_mana": 1303816141, - "mana_used": 110560940 + "eth_per_fee_asset": 10422282, + "excess_mana": 986311800, + "mana_used": 95509305 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12148537, + "eth_per_fee_asset_at_execution": 10397329, "l1_fee_oracle_output": { "base_fee": 9286533358, "blob_fee": 2 @@ -34940,22 +34940,22 @@ "slot_of_change": 425 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62559817861196, - "congestion_multiplier": 4597280284, - "prover_cost": 15097618174107, - "sequencer_cost": 2293247409133 + "congestion_cost": 81483753856400, + "congestion_multiplier": 4658280601, + "prover_cost": 18701123336581, + "sequencer_cost": 3572661209432 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760010262, - "congestion_multiplier": 4597280284, - "prover_cost": 183413973, - "sequencer_cost": 27859601 + "congestion_cost": 847213397, + "congestion_multiplier": 4658280601, + "prover_cost": 194441732, + "sequencer_cost": 37146134 } }, "parent_fee_header": { - "eth_per_fee_asset": 12148537, - "excess_mana": 1313246067, - "mana_used": 90570074 + "eth_per_fee_asset": 10397329, + "excess_mana": 1030963993, + "mana_used": 30347807 } }, { @@ -34963,21 +34963,21 @@ "blobs_needed": 1, "block_number": 426, "l1_block_number": 20974431, - "mana_spent": 107777795, - "size_in_fields": 3720, + "mana_spent": 82456676, + "size_in_fields": 2835, "slot_number": 426, "timestamp": 1729037159 }, "fee_header": { - "eth_per_fee_asset": 12135176, - "excess_mana": 1314377081, - "mana_used": 107777795 + "eth_per_fee_asset": 10458759, + "excess_mana": 1006821105, + "mana_used": 82456676 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 35 }, "outputs": { - "eth_per_fee_asset_at_execution": 12142462, + "eth_per_fee_asset_at_execution": 10422282, "l1_fee_oracle_output": { "base_fee": 9286533358, "blob_fee": 2 @@ -34994,22 +34994,22 @@ "slot_of_change": 425 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63585637657339, - "congestion_multiplier": 4654438060, - "prover_cost": 15105171669469, - "sequencer_cost": 2294394744658 + "congestion_cost": 84653937976348, + "congestion_multiplier": 4809729888, + "prover_cost": 18656349156548, + "sequencer_cost": 3564107553413 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772086189, - "congestion_multiplier": 4654438060, - "prover_cost": 183413973, - "sequencer_cost": 27859601 + "congestion_cost": 882287214, + "congestion_multiplier": 4809729888, + "prover_cost": 194441732, + "sequencer_cost": 37146134 } }, "parent_fee_header": { - "eth_per_fee_asset": 12142462, - "excess_mana": 1303816141, - "mana_used": 110560940 + "eth_per_fee_asset": 10422282, + "excess_mana": 986311800, + "mana_used": 95509305 } }, { @@ -35017,21 +35017,21 @@ "blobs_needed": 1, "block_number": 427, "l1_block_number": 20974434, - "mana_spent": 94700565, - "size_in_fields": 3180, + "mana_spent": 82079252, + "size_in_fields": 3120, "slot_number": 427, "timestamp": 1729037195 }, "fee_header": { - "eth_per_fee_asset": 12096343, - "excess_mana": 1322154876, - "mana_used": 94700565 + "eth_per_fee_asset": 10380318, + "excess_mana": 1014277781, + "mana_used": 82079252 }, "oracle_input": { - "fee_asset_price_modifier": -32 + "fee_asset_price_modifier": -75 }, "outputs": { - "eth_per_fee_asset_at_execution": 12135176, + "eth_per_fee_asset_at_execution": 10458759, "l1_fee_oracle_output": { "base_fee": 9286533358, "blob_fee": 2 @@ -35048,22 +35048,22 @@ "slot_of_change": 425 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64364589602986, - "congestion_multiplier": 4696986844, - "prover_cost": 15114240864740, - "sequencer_cost": 2295772306888 + "congestion_cost": 85604795463784, + "congestion_multiplier": 4866005335, + "prover_cost": 18591281432147, + "sequencer_cost": 3551677020190 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781075623, - "congestion_multiplier": 4696986844, - "prover_cost": 183413973, - "sequencer_cost": 27859601 + "congestion_cost": 895319925, + "congestion_multiplier": 4866005335, + "prover_cost": 194441732, + "sequencer_cost": 37146134 } }, "parent_fee_header": { - "eth_per_fee_asset": 12135176, - "excess_mana": 1314377081, - "mana_used": 107777795 + "eth_per_fee_asset": 10458759, + "excess_mana": 1006821105, + "mana_used": 82456676 } }, { @@ -35071,21 +35071,21 @@ "blobs_needed": 1, "block_number": 428, "l1_block_number": 20974437, - "mana_spent": 106004761, - "size_in_fields": 3600, + "mana_spent": 75431632, + "size_in_fields": 2775, "slot_number": 428, "timestamp": 1729037231 }, "fee_header": { - "eth_per_fee_asset": 12137470, - "excess_mana": 1316855441, - "mana_used": 106004761 + "eth_per_fee_asset": 10307655, + "excess_mana": 1021357033, + "mana_used": 75431632 }, "oracle_input": { - "fee_asset_price_modifier": 34 + "fee_asset_price_modifier": -70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12096343, + "eth_per_fee_asset_at_execution": 10380318, "l1_fee_oracle_output": { "base_fee": 9286533358, "blob_fee": 2 @@ -35102,22 +35102,22 @@ "slot_of_change": 430 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64064135499465, - "congestion_multiplier": 4667954033, - "prover_cost": 15162762249715, - "sequencer_cost": 2303142445614 + "congestion_cost": 87457248901238, + "congestion_multiplier": 4920041542, + "prover_cost": 18731770259833, + "sequencer_cost": 3578515995368 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774941757, - "congestion_multiplier": 4667954033, - "prover_cost": 183413973, - "sequencer_cost": 27859601 + "congestion_cost": 907834055, + "congestion_multiplier": 4920041542, + "prover_cost": 194441732, + "sequencer_cost": 37146134 } }, "parent_fee_header": { - "eth_per_fee_asset": 12096343, - "excess_mana": 1322154876, - "mana_used": 94700565 + "eth_per_fee_asset": 10380318, + "excess_mana": 1014277781, + "mana_used": 82079252 } }, { @@ -35125,21 +35125,21 @@ "blobs_needed": 1, "block_number": 429, "l1_block_number": 20974440, - "mana_spent": 102390595, - "size_in_fields": 3570, + "mana_spent": 90211355, + "size_in_fields": 3135, "slot_number": 429, "timestamp": 1729037267 }, "fee_header": { - "eth_per_fee_asset": 12076782, - "excess_mana": 1322860202, - "mana_used": 102390595 + "eth_per_fee_asset": 10317962, + "excess_mana": 1021788665, + "mana_used": 90211355 }, "oracle_input": { - "fee_asset_price_modifier": -50 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 12137470, + "eth_per_fee_asset_at_execution": 10307655, "l1_fee_oracle_output": { "base_fee": 9286533358, "blob_fee": 2 @@ -35156,22 +35156,22 @@ "slot_of_change": 430 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64419922685700, - "congestion_multiplier": 4700864545, - "prover_cost": 15111384250590, - "sequencer_cost": 2295338402485 + "congestion_cost": 88148229446950, + "congestion_multiplier": 4923355547, + "prover_cost": 18863818395164, + "sequencer_cost": 3603742461307 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781894879, - "congestion_multiplier": 4700864545, - "prover_cost": 183413973, - "sequencer_cost": 27859601 + "congestion_cost": 908601538, + "congestion_multiplier": 4923355547, + "prover_cost": 194441732, + "sequencer_cost": 37146134 } }, "parent_fee_header": { - "eth_per_fee_asset": 12137470, - "excess_mana": 1316855441, - "mana_used": 106004761 + "eth_per_fee_asset": 10307655, + "excess_mana": 1021357033, + "mana_used": 75431632 } }, { @@ -35179,21 +35179,21 @@ "blobs_needed": 1, "block_number": 430, "l1_block_number": 20974443, - "mana_spent": 98748249, - "size_in_fields": 3495, + "mana_spent": 77191180, + "size_in_fields": 2460, "slot_number": 430, "timestamp": 1729037303 }, "fee_header": { - "eth_per_fee_asset": 12075574, - "excess_mana": 1325250797, - "mana_used": 98748249 + "eth_per_fee_asset": 10290103, + "excess_mana": 1037000020, + "mana_used": 77191180 }, "oracle_input": { - "fee_asset_price_modifier": -1 + "fee_asset_price_modifier": -27 }, "outputs": { - "eth_per_fee_asset_at_execution": 12076782, + "eth_per_fee_asset_at_execution": 10317962, "l1_fee_oracle_output": { "base_fee": 10094874015, "blob_fee": 1 @@ -35210,22 +35210,22 @@ "slot_of_change": 430 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65797449436448, - "congestion_multiplier": 4714031250, - "prover_cost": 15208238419805, - "sequencer_cost": 2507673236132 + "congestion_cost": 92455258897058, + "congestion_multiplier": 5041582565, + "prover_cost": 18962489200872, + "sequencer_cost": 3913514800695 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794621453, - "congestion_multiplier": 4714031250, - "prover_cost": 183666580, - "sequencer_cost": 30284623 + "congestion_cost": 953949848, + "congestion_multiplier": 5041582565, + "prover_cost": 195654243, + "sequencer_cost": 40379497 } }, "parent_fee_header": { - "eth_per_fee_asset": 12076782, - "excess_mana": 1322860202, - "mana_used": 102390595 + "eth_per_fee_asset": 10317962, + "excess_mana": 1021788665, + "mana_used": 90211355 } }, { @@ -35233,21 +35233,21 @@ "blobs_needed": 1, "block_number": 431, "l1_block_number": 20974446, - "mana_spent": 89805507, - "size_in_fields": 3375, + "mana_spent": 71664651, + "size_in_fields": 2565, "slot_number": 431, "timestamp": 1729037339 }, "fee_header": { - "eth_per_fee_asset": 11983799, - "excess_mana": 1323999046, - "mana_used": 89805507 + "eth_per_fee_asset": 10279812, + "excess_mana": 1039191200, + "mana_used": 71664651 }, "oracle_input": { - "fee_asset_price_modifier": -76 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 12075574, + "eth_per_fee_asset_at_execution": 10290103, "l1_fee_oracle_output": { "base_fee": 10094874015, "blob_fee": 1 @@ -35264,22 +35264,22 @@ "slot_of_change": 430 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65681799556692, - "congestion_multiplier": 4707132375, - "prover_cost": 15209759801067, - "sequencer_cost": 2507924095369 + "congestion_cost": 93101542132280, + "congestion_multiplier": 5058845395, + "prover_cost": 19013827461203, + "sequencer_cost": 3924110089083 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 793145431, - "congestion_multiplier": 4707132375, - "prover_cost": 183666580, - "sequencer_cost": 30284623 + "congestion_cost": 958024458, + "congestion_multiplier": 5058845395, + "prover_cost": 195654243, + "sequencer_cost": 40379497 } }, "parent_fee_header": { - "eth_per_fee_asset": 12075574, - "excess_mana": 1325250797, - "mana_used": 98748249 + "eth_per_fee_asset": 10290103, + "excess_mana": 1037000020, + "mana_used": 77191180 } }, { @@ -35287,21 +35287,21 @@ "blobs_needed": 1, "block_number": 432, "l1_block_number": 20974449, - "mana_spent": 98882710, - "size_in_fields": 3450, + "mana_spent": 68430646, + "size_in_fields": 2490, "slot_number": 432, "timestamp": 1729037375 }, "fee_header": { - "eth_per_fee_asset": 12074875, - "excess_mana": 1313804553, - "mana_used": 98882710 + "eth_per_fee_asset": 10217105, + "excess_mana": 1035855851, + "mana_used": 68430646 }, "oracle_input": { - "fee_asset_price_modifier": 76 + "fee_asset_price_modifier": -61 }, "outputs": { - "eth_per_fee_asset_at_execution": 11983799, + "eth_per_fee_asset_at_execution": 10279812, "l1_fee_oracle_output": { "base_fee": 10094874015, "blob_fee": 1 @@ -35318,22 +35318,22 @@ "slot_of_change": 430 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65188391677798, - "congestion_multiplier": 4651321293, - "prover_cost": 15326240034567, - "sequencer_cost": 2527130419995 + "congestion_cost": 92591940008242, + "congestion_multiplier": 5032591852, + "prover_cost": 19032861982301, + "sequencer_cost": 3928038469965 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781204583, - "congestion_multiplier": 4651321293, - "prover_cost": 183666580, - "sequencer_cost": 30284623 + "congestion_cost": 951827736, + "congestion_multiplier": 5032591852, + "prover_cost": 195654243, + "sequencer_cost": 40379497 } }, "parent_fee_header": { - "eth_per_fee_asset": 11983799, - "excess_mana": 1323999046, - "mana_used": 89805507 + "eth_per_fee_asset": 10279812, + "excess_mana": 1039191200, + "mana_used": 71664651 } }, { @@ -35341,21 +35341,21 @@ "blobs_needed": 1, "block_number": 433, "l1_block_number": 20974452, - "mana_spent": 105415057, - "size_in_fields": 3840, + "mana_spent": 70512442, + "size_in_fields": 2340, "slot_number": 433, "timestamp": 1729037411 }, "fee_header": { - "eth_per_fee_asset": 12102647, - "excess_mana": 1312687263, - "mana_used": 105415057 + "eth_per_fee_asset": 10235495, + "excess_mana": 1029286497, + "mana_used": 70512442 }, "oracle_input": { - "fee_asset_price_modifier": 23 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12074875, + "eth_per_fee_asset_at_execution": 10217105, "l1_fee_oracle_output": { "base_fee": 10094874015, "blob_fee": 1 @@ -35372,22 +35372,22 @@ "slot_of_change": 435 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64589035994162, - "congestion_multiplier": 4645244921, - "prover_cost": 15210640275780, - "sequencer_cost": 2508069276080 + "congestion_cost": 91974827409526, + "congestion_multiplier": 4981280257, + "prover_cost": 19149675274944, + "sequencer_cost": 3952146620790 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779904536, - "congestion_multiplier": 4645244921, - "prover_cost": 183666580, - "sequencer_cost": 30284623 + "congestion_cost": 939716469, + "congestion_multiplier": 4981280257, + "prover_cost": 195654243, + "sequencer_cost": 40379497 } }, "parent_fee_header": { - "eth_per_fee_asset": 12074875, - "excess_mana": 1313804553, - "mana_used": 98882710 + "eth_per_fee_asset": 10217105, + "excess_mana": 1035855851, + "mana_used": 68430646 } }, { @@ -35395,21 +35395,21 @@ "blobs_needed": 1, "block_number": 434, "l1_block_number": 20974455, - "mana_spent": 110899893, - "size_in_fields": 3765, + "mana_spent": 76426963, + "size_in_fields": 2655, "slot_number": 434, "timestamp": 1729037447 }, "fee_header": { - "eth_per_fee_asset": 12040923, - "excess_mana": 1318102320, - "mana_used": 110899893 + "eth_per_fee_asset": 10133140, + "excess_mana": 1024798939, + "mana_used": 76426963 }, "oracle_input": { - "fee_asset_price_modifier": -51 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12102647, + "eth_per_fee_asset_at_execution": 10235495, "l1_fee_oracle_output": { "base_fee": 10094874015, "blob_fee": 1 @@ -35426,22 +35426,22 @@ "slot_of_change": 435 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64962748562360, - "congestion_multiplier": 4674768840, - "prover_cost": 15175736349247, - "sequencer_cost": 2502313997922 + "congestion_cost": 91008228424713, + "congestion_multiplier": 4946530132, + "prover_cost": 19115269266411, + "sequencer_cost": 3945045842923 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786221214, - "congestion_multiplier": 4674768840, - "prover_cost": 183666580, - "sequencer_cost": 30284623 + "congestion_cost": 931514267, + "congestion_multiplier": 4946530132, + "prover_cost": 195654243, + "sequencer_cost": 40379497 } }, "parent_fee_header": { - "eth_per_fee_asset": 12102647, - "excess_mana": 1312687263, - "mana_used": 105415057 + "eth_per_fee_asset": 10235495, + "excess_mana": 1029286497, + "mana_used": 70512442 } }, { @@ -35449,21 +35449,21 @@ "blobs_needed": 1, "block_number": 435, "l1_block_number": 20974458, - "mana_spent": 112851698, - "size_in_fields": 3900, + "mana_spent": 76818970, + "size_in_fields": 2940, "slot_number": 435, "timestamp": 1729037483 }, "fee_header": { - "eth_per_fee_asset": 12034902, - "excess_mana": 1329002213, - "mana_used": 112851698 + "eth_per_fee_asset": 10189885, + "excess_mana": 1026225902, + "mana_used": 76818970 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 56 }, "outputs": { - "eth_per_fee_asset_at_execution": 12040923, + "eth_per_fee_asset_at_execution": 10133140, "l1_fee_oracle_output": { "base_fee": 9153946155, "blob_fee": 1 @@ -35480,22 +35480,22 @@ "slot_of_change": 435 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65395099196300, - "congestion_multiplier": 4734767346, - "prover_cost": 15229109927869, - "sequencer_cost": 2280708796162 + "congestion_cost": 90163112717283, + "congestion_multiplier": 4957553681, + "prover_cost": 19169068126958, + "sequencer_cost": 3613468776707 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787417354, - "congestion_multiplier": 4734767346, - "prover_cost": 183372540, - "sequencer_cost": 27461839 + "congestion_cost": 913635444, + "congestion_multiplier": 4957553681, + "prover_cost": 194242851, + "sequencer_cost": 36615785 } }, "parent_fee_header": { - "eth_per_fee_asset": 12040923, - "excess_mana": 1318102320, - "mana_used": 110899893 + "eth_per_fee_asset": 10133140, + "excess_mana": 1024798939, + "mana_used": 76426963 } }, { @@ -35503,21 +35503,21 @@ "blobs_needed": 1, "block_number": 436, "l1_block_number": 20974461, - "mana_spent": 85351899, - "size_in_fields": 3120, + "mana_spent": 70843266, + "size_in_fields": 2655, "slot_number": 436, "timestamp": 1729037519 }, "fee_header": { - "eth_per_fee_asset": 12008425, - "excess_mana": 1341853911, - "mana_used": 85351899 + "eth_per_fee_asset": 10252043, + "excess_mana": 1028044872, + "mana_used": 70843266 }, "oracle_input": { - "fee_asset_price_modifier": -22 + "fee_asset_price_modifier": 61 }, "outputs": { - "eth_per_fee_asset_at_execution": 12034902, + "eth_per_fee_asset_at_execution": 10189885, "l1_fee_oracle_output": { "base_fee": 9153946155, "blob_fee": 1 @@ -35534,22 +35534,22 @@ "slot_of_change": 435 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66684462407754, - "congestion_multiplier": 4806499560, - "prover_cost": 15236728973780, - "sequencer_cost": 2281849823123 + "congestion_cost": 89980177892096, + "congestion_multiplier": 4971641179, + "prover_cost": 19062320232270, + "sequencer_cost": 3593346244831 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802540970, - "congestion_multiplier": 4806499560, - "prover_cost": 183372540, - "sequencer_cost": 27461839 + "congestion_cost": 916887665, + "congestion_multiplier": 4971641179, + "prover_cost": 194242851, + "sequencer_cost": 36615785 } }, "parent_fee_header": { - "eth_per_fee_asset": 12034902, - "excess_mana": 1329002213, - "mana_used": 112851698 + "eth_per_fee_asset": 10189885, + "excess_mana": 1026225902, + "mana_used": 76818970 } }, { @@ -35557,21 +35557,21 @@ "blobs_needed": 1, "block_number": 437, "l1_block_number": 20974464, - "mana_spent": 99186431, - "size_in_fields": 3450, + "mana_spent": 74839903, + "size_in_fields": 2775, "slot_number": 437, "timestamp": 1729037555 }, "fee_header": { - "eth_per_fee_asset": 11980805, - "excess_mana": 1327205810, - "mana_used": 99186431 + "eth_per_fee_asset": 10261269, + "excess_mana": 1023888138, + "mana_used": 74839903 }, "oracle_input": { - "fee_asset_price_modifier": -23 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 12008425, + "eth_per_fee_asset_at_execution": 10252043, "l1_fee_oracle_output": { "base_fee": 9153946155, "blob_fee": 1 @@ -35588,22 +35588,22 @@ "slot_of_change": 435 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65397538811293, - "congestion_multiplier": 4724826302, - "prover_cost": 15270323960054, - "sequencer_cost": 2286881002297 + "congestion_cost": 88711018574542, + "congestion_multiplier": 4939506847, + "prover_cost": 18946745638894, + "sequencer_cost": 3571559834465 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785321440, - "congestion_multiplier": 4724826302, - "prover_cost": 183372540, - "sequencer_cost": 27461839 + "congestion_cost": 909469177, + "congestion_multiplier": 4939506847, + "prover_cost": 194242851, + "sequencer_cost": 36615785 } }, "parent_fee_header": { - "eth_per_fee_asset": 12008425, - "excess_mana": 1341853911, - "mana_used": 85351899 + "eth_per_fee_asset": 10252043, + "excess_mana": 1028044872, + "mana_used": 70843266 } }, { @@ -35611,21 +35611,21 @@ "blobs_needed": 1, "block_number": 438, "l1_block_number": 20974467, - "mana_spent": 90161230, - "size_in_fields": 3330, + "mana_spent": 76025332, + "size_in_fields": 2550, "slot_number": 438, "timestamp": 1729037591 }, "fee_header": { - "eth_per_fee_asset": 11950852, - "excess_mana": 1326392241, - "mana_used": 90161230 + "eth_per_fee_asset": 10180204, + "excess_mana": 1023728041, + "mana_used": 76025332 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": -79 }, "outputs": { - "eth_per_fee_asset_at_execution": 11980805, + "eth_per_fee_asset_at_execution": 10261269, "l1_fee_oracle_output": { "base_fee": 9153946155, "blob_fee": 1 @@ -35642,22 +35642,22 @@ "slot_of_change": 440 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65469196351999, - "congestion_multiplier": 4720330995, - "prover_cost": 15305527466644, - "sequencer_cost": 2292153073187 + "congestion_cost": 88603506447400, + "congestion_multiplier": 4938273353, + "prover_cost": 18929710448094, + "sequencer_cost": 3568348612633 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784373675, - "congestion_multiplier": 4720330995, - "prover_cost": 183372540, - "sequencer_cost": 27461839 + "congestion_cost": 909184414, + "congestion_multiplier": 4938273353, + "prover_cost": 194242851, + "sequencer_cost": 36615785 } }, "parent_fee_header": { - "eth_per_fee_asset": 11980805, - "excess_mana": 1327205810, - "mana_used": 99186431 + "eth_per_fee_asset": 10261269, + "excess_mana": 1023888138, + "mana_used": 74839903 } }, { @@ -35665,21 +35665,21 @@ "blobs_needed": 1, "block_number": 439, "l1_block_number": 20974470, - "mana_spent": 104646844, - "size_in_fields": 3495, + "mana_spent": 76617220, + "size_in_fields": 2805, "slot_number": 439, "timestamp": 1729037627 }, "fee_header": { - "eth_per_fee_asset": 11903048, - "excess_mana": 1316553471, - "mana_used": 104646844 + "eth_per_fee_asset": 10177149, + "excess_mana": 1024753373, + "mana_used": 76617220 }, "oracle_input": { - "fee_asset_price_modifier": -40 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 11950852, + "eth_per_fee_asset_at_execution": 10180204, "l1_fee_oracle_output": { "base_fee": 9153946155, "blob_fee": 1 @@ -35696,22 +35696,22 @@ "slot_of_change": 440 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64680171840468, - "congestion_multiplier": 4666305113, - "prover_cost": 15343888452472, - "sequencer_cost": 2297898007607 + "congestion_cost": 89488323809622, + "congestion_multiplier": 4946178530, + "prover_cost": 19080447798493, + "sequencer_cost": 3596763385096 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772983161, - "congestion_multiplier": 4666305113, - "prover_cost": 183372540, - "sequencer_cost": 27461839 + "congestion_cost": 911009392, + "congestion_multiplier": 4946178530, + "prover_cost": 194242851, + "sequencer_cost": 36615785 } }, "parent_fee_header": { - "eth_per_fee_asset": 11950852, - "excess_mana": 1326392241, - "mana_used": 90161230 + "eth_per_fee_asset": 10180204, + "excess_mana": 1023728041, + "mana_used": 76025332 } }, { @@ -35719,21 +35719,21 @@ "blobs_needed": 1, "block_number": 440, "l1_block_number": 20974473, - "mana_spent": 91209683, - "size_in_fields": 3390, + "mana_spent": 74255444, + "size_in_fields": 2505, "slot_number": 440, "timestamp": 1729037663 }, "fee_header": { - "eth_per_fee_asset": 12022078, - "excess_mana": 1321200315, - "mana_used": 91209683 + "eth_per_fee_asset": 10208698, + "excess_mana": 1026370593, + "mana_used": 74255444 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 31 }, "outputs": { - "eth_per_fee_asset_at_execution": 11903048, + "eth_per_fee_asset_at_execution": 10177149, "l1_fee_oracle_output": { "base_fee": 9088279390, "blob_fee": 1 @@ -35750,22 +35750,22 @@ "slot_of_change": 440 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65323060362355, - "congestion_multiplier": 4691744006, - "prover_cost": 15403787248443, - "sequencer_cost": 2290576245681 + "congestion_cost": 89658121739203, + "congestion_multiplier": 4958672816, + "prover_cost": 19076496865675, + "sequencer_cost": 3572033582294 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777543523, - "congestion_multiplier": 4691744006, - "prover_cost": 183352019, - "sequencer_cost": 27264839 + "congestion_cost": 912464064, + "congestion_multiplier": 4958672816, + "prover_cost": 194144351, + "sequencer_cost": 36353118 } }, "parent_fee_header": { - "eth_per_fee_asset": 11903048, - "excess_mana": 1316553471, - "mana_used": 104646844 + "eth_per_fee_asset": 10177149, + "excess_mana": 1024753373, + "mana_used": 76617220 } }, { @@ -35773,21 +35773,21 @@ "blobs_needed": 1, "block_number": 441, "l1_block_number": 20974476, - "mana_spent": 108489445, - "size_in_fields": 3555, + "mana_spent": 66476604, + "size_in_fields": 2505, "slot_number": 441, "timestamp": 1729037699 }, "fee_header": { - "eth_per_fee_asset": 12113445, - "excess_mana": 1312409998, - "mana_used": 108489445 + "eth_per_fee_asset": 10218906, + "excess_mana": 1025626037, + "mana_used": 66476604 }, "oracle_input": { - "fee_asset_price_modifier": 76 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 12022078, + "eth_per_fee_asset_at_execution": 10208698, "l1_fee_oracle_output": { "base_fee": 9088279390, "blob_fee": 1 @@ -35804,22 +35804,22 @@ "slot_of_change": 440 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63835278809537, - "congestion_multiplier": 4643738248, - "prover_cost": 15251275112340, - "sequencer_cost": 2267897363501 + "congestion_cost": 89251075602394, + "congestion_multiplier": 4952916625, + "prover_cost": 19017542785574, + "sequencer_cost": 3560994555819 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 767432701, - "congestion_multiplier": 4643738248, - "prover_cost": 183352019, - "sequencer_cost": 27264839 + "congestion_cost": 911137277, + "congestion_multiplier": 4952916625, + "prover_cost": 194144351, + "sequencer_cost": 36353118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12022078, - "excess_mana": 1321200315, - "mana_used": 91209683 + "eth_per_fee_asset": 10208698, + "excess_mana": 1026370593, + "mana_used": 74255444 } }, { @@ -35827,21 +35827,21 @@ "blobs_needed": 1, "block_number": 442, "l1_block_number": 20974479, - "mana_spent": 101867289, - "size_in_fields": 3645, + "mana_spent": 66416384, + "size_in_fields": 2475, "slot_number": 442, "timestamp": 1729037735 }, "fee_header": { - "eth_per_fee_asset": 12174012, - "excess_mana": 1320899443, - "mana_used": 101867289 + "eth_per_fee_asset": 10191314, + "excess_mana": 1017102641, + "mana_used": 66416384 }, "oracle_input": { - "fee_asset_price_modifier": 50 + "fee_asset_price_modifier": -27 }, "outputs": { - "eth_per_fee_asset_at_execution": 12113445, + "eth_per_fee_asset_at_execution": 10218906, "l1_fee_oracle_output": { "base_fee": 9088279390, "blob_fee": 1 @@ -35858,22 +35858,22 @@ "slot_of_change": 440 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64159760580083, - "congestion_multiplier": 4690092708, - "prover_cost": 15136240681326, - "sequencer_cost": 2250791496557 + "congestion_cost": 87686294990873, + "congestion_multiplier": 4887496076, + "prover_cost": 18998545539024, + "sequencer_cost": 3557437361691 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777195731, - "congestion_multiplier": 4690092708, - "prover_cost": 183352019, - "sequencer_cost": 27264839 + "congestion_cost": 896058006, + "congestion_multiplier": 4887496076, + "prover_cost": 194144351, + "sequencer_cost": 36353118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12113445, - "excess_mana": 1312409998, - "mana_used": 108489445 + "eth_per_fee_asset": 10218906, + "excess_mana": 1025626037, + "mana_used": 66476604 } }, { @@ -35881,21 +35881,21 @@ "blobs_needed": 1, "block_number": 443, "l1_block_number": 20974482, - "mana_spent": 110111117, - "size_in_fields": 3750, + "mana_spent": 86642089, + "size_in_fields": 3135, "slot_number": 443, "timestamp": 1729037771 }, "fee_header": { - "eth_per_fee_asset": 12176446, - "excess_mana": 1322766732, - "mana_used": 110111117 + "eth_per_fee_asset": 10152587, + "excess_mana": 1008519025, + "mana_used": 86642089 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 12174012, + "eth_per_fee_asset_at_execution": 10191314, "l1_fee_oracle_output": { "base_fee": 9088279390, "blob_fee": 1 @@ -35912,22 +35912,22 @@ "slot_of_change": 445 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64018024049919, - "congestion_multiplier": 4700350487, - "prover_cost": 15060936279676, - "sequencer_cost": 2239593570304 + "congestion_cost": 86453373922146, + "congestion_multiplier": 4822486572, + "prover_cost": 19049982269215, + "sequencer_cost": 3567068780336 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779356193, - "congestion_multiplier": 4700350487, - "prover_cost": 183352019, - "sequencer_cost": 27264839 + "congestion_cost": 881073480, + "congestion_multiplier": 4822486572, + "prover_cost": 194144351, + "sequencer_cost": 36353118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12174012, - "excess_mana": 1320899443, - "mana_used": 101867289 + "eth_per_fee_asset": 10191314, + "excess_mana": 1017102641, + "mana_used": 66416384 } }, { @@ -35935,21 +35935,21 @@ "blobs_needed": 1, "block_number": 444, "l1_block_number": 20974485, - "mana_spent": 79661379, - "size_in_fields": 2895, + "mana_spent": 79872584, + "size_in_fields": 2805, "slot_number": 444, "timestamp": 1729037807 }, "fee_header": { - "eth_per_fee_asset": 12163051, - "excess_mana": 1332877849, - "mana_used": 79661379 + "eth_per_fee_asset": 10119083, + "excess_mana": 1020161114, + "mana_used": 79872584 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": -33 }, "outputs": { - "eth_per_fee_asset_at_execution": 12176446, + "eth_per_fee_asset_at_execution": 10152587, "l1_fee_oracle_output": { "base_fee": 9088279390, "blob_fee": 1 @@ -35966,22 +35966,22 @@ "slot_of_change": 445 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64972745495689, - "congestion_multiplier": 4756285871, - "prover_cost": 15057925687020, - "sequencer_cost": 2239145888711 + "congestion_cost": 88789772596877, + "congestion_multiplier": 4910871104, + "prover_cost": 19122648345688, + "sequencer_cost": 3580675349052 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791137127, - "congestion_multiplier": 4756285871, - "prover_cost": 183352019, - "sequencer_cost": 27264839 + "congestion_cost": 901445891, + "congestion_multiplier": 4910871104, + "prover_cost": 194144351, + "sequencer_cost": 36353118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12176446, - "excess_mana": 1322766732, - "mana_used": 110111117 + "eth_per_fee_asset": 10152587, + "excess_mana": 1008519025, + "mana_used": 86642089 } }, { @@ -35989,21 +35989,21 @@ "blobs_needed": 1, "block_number": 445, "l1_block_number": 20974488, - "mana_spent": 81480565, - "size_in_fields": 2850, + "mana_spent": 73170957, + "size_in_fields": 2760, "slot_number": 445, "timestamp": 1729037843 }, "fee_header": { - "eth_per_fee_asset": 12240894, - "excess_mana": 1312539228, - "mana_used": 81480565 + "eth_per_fee_asset": 10093785, + "excess_mana": 1025033698, + "mana_used": 73170957 }, "oracle_input": { - "fee_asset_price_modifier": 64 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 12163051, + "eth_per_fee_asset_at_execution": 10119083, "l1_fee_oracle_output": { "base_fee": 9346078135, "blob_fee": 1 @@ -36020,44 +36020,44 @@ "slot_of_change": 445 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63363443185432, - "congestion_multiplier": 4644440430, - "prover_cost": 15081132275118, - "sequencer_cost": 2305197519932 + "congestion_cost": 90490528044884, + "congestion_multiplier": 4948342002, + "prover_cost": 19224177625582, + "sequencer_cost": 3694436837805 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 770692791, - "congestion_multiplier": 4644440430, - "prover_cost": 183432581, - "sequencer_cost": 28038235 + "congestion_cost": 915681164, + "congestion_multiplier": 4948342002, + "prover_cost": 194531049, + "sequencer_cost": 37384313 } }, "parent_fee_header": { - "eth_per_fee_asset": 12163051, - "excess_mana": 1332877849, - "mana_used": 79661379 + "eth_per_fee_asset": 10119083, + "excess_mana": 1020161114, + "mana_used": 79872584 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 446, "l1_block_number": 20974491, - "mana_spent": 114447049, - "size_in_fields": 4350, + "mana_spent": 73723608, + "size_in_fields": 2715, "slot_number": 446, "timestamp": 1729037879 }, "fee_header": { - "eth_per_fee_asset": 12308218, - "excess_mana": 1294019793, - "mana_used": 114447049 + "eth_per_fee_asset": 10041297, + "excess_mana": 1023204655, + "mana_used": 73723608 }, "oracle_input": { - "fee_asset_price_modifier": 55 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 12240894, + "eth_per_fee_asset_at_execution": 10093785, "l1_fee_oracle_output": { "base_fee": 9346078135, "blob_fee": 1 @@ -36074,22 +36074,22 @@ "slot_of_change": 445 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 61240660118453, - "congestion_multiplier": 4544888337, - "prover_cost": 14985227467864, - "sequencer_cost": 2290538174745 + "congestion_cost": 90393384245851, + "congestion_multiplier": 4934242986, + "prover_cost": 19272359080365, + "sequencer_cost": 3703696185326 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 749640429, - "congestion_multiplier": 4544888337, - "prover_cost": 183432581, - "sequencer_cost": 28038235 + "congestion_cost": 912411386, + "congestion_multiplier": 4934242986, + "prover_cost": 194531049, + "sequencer_cost": 37384313 } }, "parent_fee_header": { - "eth_per_fee_asset": 12240894, - "excess_mana": 1312539228, - "mana_used": 81480565 + "eth_per_fee_asset": 10093785, + "excess_mana": 1025033698, + "mana_used": 73170957 } }, { @@ -36097,21 +36097,21 @@ "blobs_needed": 1, "block_number": 447, "l1_block_number": 20974494, - "mana_spent": 111792406, - "size_in_fields": 3840, + "mana_spent": 76372836, + "size_in_fields": 2565, "slot_number": 447, "timestamp": 1729037915 }, "fee_header": { - "eth_per_fee_asset": 12290986, - "excess_mana": 1308466842, - "mana_used": 111792406 + "eth_per_fee_asset": 10040292, + "excess_mana": 1021928263, + "mana_used": 76372836 }, "oracle_input": { - "fee_asset_price_modifier": -14 + "fee_asset_price_modifier": -1 }, "outputs": { - "eth_per_fee_asset_at_execution": 12308218, + "eth_per_fee_asset_at_execution": 10041297, "l1_fee_oracle_output": { "base_fee": 9346078135, "blob_fee": 1 @@ -36128,22 +36128,22 @@ "slot_of_change": 445 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62236809179038, - "congestion_multiplier": 4622363740, - "prover_cost": 14903260650730, - "sequencer_cost": 2278009294279 + "congestion_cost": 90639197506060, + "congestion_multiplier": 4924427837, + "prover_cost": 19373099809716, + "sequencer_cost": 3723056194833 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 766024215, - "congestion_multiplier": 4622363740, - "prover_cost": 183432581, - "sequencer_cost": 28038235 + "congestion_cost": 910135102, + "congestion_multiplier": 4924427837, + "prover_cost": 194531049, + "sequencer_cost": 37384313 } }, "parent_fee_header": { - "eth_per_fee_asset": 12308218, - "excess_mana": 1294019793, - "mana_used": 114447049 + "eth_per_fee_asset": 10041297, + "excess_mana": 1023204655, + "mana_used": 73723608 } }, { @@ -36151,21 +36151,21 @@ "blobs_needed": 1, "block_number": 448, "l1_block_number": 20974497, - "mana_spent": 99223472, - "size_in_fields": 3510, + "mana_spent": 83648944, + "size_in_fields": 2835, "slot_number": 448, "timestamp": 1729037951 }, "fee_header": { - "eth_per_fee_asset": 12338920, - "excess_mana": 1320259248, - "mana_used": 99223472 + "eth_per_fee_asset": 10030251, + "excess_mana": 1023301099, + "mana_used": 83648944 }, "oracle_input": { - "fee_asset_price_modifier": 39 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 12290986, + "eth_per_fee_asset_at_execution": 10040292, "l1_fee_oracle_output": { "base_fee": 9346078135, "blob_fee": 1 @@ -36182,22 +36182,22 @@ "slot_of_change": 450 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63428946546681, - "congestion_multiplier": 4686581012, - "prover_cost": 14924155067788, - "sequencer_cost": 2281203070283 + "congestion_cost": 90892134013633, + "congestion_multiplier": 4934985412, + "prover_cost": 19375038992890, + "sequencer_cost": 3723428860436 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779604294, - "congestion_multiplier": 4686581012, - "prover_cost": 183432581, - "sequencer_cost": 28038235 + "congestion_cost": 912583566, + "congestion_multiplier": 4934985412, + "prover_cost": 194531049, + "sequencer_cost": 37384313 } }, "parent_fee_header": { - "eth_per_fee_asset": 12290986, - "excess_mana": 1308466842, - "mana_used": 111792406 + "eth_per_fee_asset": 10040292, + "excess_mana": 1021928263, + "mana_used": 76372836 } }, { @@ -36205,21 +36205,21 @@ "blobs_needed": 1, "block_number": 449, "l1_block_number": 20974500, - "mana_spent": 118280340, - "size_in_fields": 3915, + "mana_spent": 64893041, + "size_in_fields": 2265, "slot_number": 449, "timestamp": 1729037987 }, "fee_header": { - "eth_per_fee_asset": 12246378, - "excess_mana": 1319482720, - "mana_used": 118280340 + "eth_per_fee_asset": 10049308, + "excess_mana": 1031950043, + "mana_used": 64893041 }, "oracle_input": { - "fee_asset_price_modifier": -75 + "fee_asset_price_modifier": 19 }, "outputs": { - "eth_per_fee_asset_at_execution": 12338920, + "eth_per_fee_asset_at_execution": 10030251, "l1_fee_oracle_output": { "base_fee": 9346078135, "blob_fee": 1 @@ -36236,22 +36236,22 @@ "slot_of_change": 450 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63109597436405, - "congestion_multiplier": 4682325010, - "prover_cost": 14866177996130, - "sequencer_cost": 2272341096304 + "congestion_cost": 92533097426974, + "congestion_multiplier": 5002021194, + "prover_cost": 19394434795301, + "sequencer_cost": 3727156279539 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778704274, - "congestion_multiplier": 4682325010, - "prover_cost": 183432581, - "sequencer_cost": 28038235 + "congestion_cost": 928130193, + "congestion_multiplier": 5002021194, + "prover_cost": 194531049, + "sequencer_cost": 37384313 } }, "parent_fee_header": { - "eth_per_fee_asset": 12338920, - "excess_mana": 1320259248, - "mana_used": 99223472 + "eth_per_fee_asset": 10030251, + "excess_mana": 1023301099, + "mana_used": 83648944 } }, { @@ -36259,21 +36259,21 @@ "blobs_needed": 1, "block_number": 450, "l1_block_number": 20974503, - "mana_spent": 88195323, - "size_in_fields": 3090, + "mana_spent": 81914200, + "size_in_fields": 2880, "slot_number": 450, "timestamp": 1729038023 }, "fee_header": { - "eth_per_fee_asset": 12123914, - "excess_mana": 1337763060, - "mana_used": 88195323 + "eth_per_fee_asset": 10093524, + "excess_mana": 1021843084, + "mana_used": 81914200 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 44 }, "outputs": { - "eth_per_fee_asset_at_execution": 12246378, + "eth_per_fee_asset_at_execution": 10049308, "l1_fee_oracle_output": { "base_fee": 9519428616, "blob_fee": 1 @@ -36290,22 +36290,22 @@ "slot_of_change": 450 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65511846604768, - "congestion_multiplier": 4783549200, - "prover_cost": 14982940506981, - "sequencer_cost": 2331978157134 + "congestion_cost": 90924110296948, + "congestion_multiplier": 4923773527, + "prover_cost": 19383531084927, + "sequencer_cost": 3789088263590 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802282837, - "congestion_multiplier": 4783549200, - "prover_cost": 183486753, - "sequencer_cost": 28558286 + "congestion_cost": 913724389, + "congestion_multiplier": 4923773527, + "prover_cost": 194791074, + "sequencer_cost": 38077715 } }, "parent_fee_header": { - "eth_per_fee_asset": 12246378, - "excess_mana": 1319482720, - "mana_used": 118280340 + "eth_per_fee_asset": 10049308, + "excess_mana": 1031950043, + "mana_used": 64893041 } }, { @@ -36313,21 +36313,21 @@ "blobs_needed": 1, "block_number": 451, "l1_block_number": 20974506, - "mana_spent": 101892915, - "size_in_fields": 3495, + "mana_spent": 66213805, + "size_in_fields": 2490, "slot_number": 451, "timestamp": 1729038059 }, "fee_header": { - "eth_per_fee_asset": 12007524, - "excess_mana": 1325958383, - "mana_used": 101892915 + "eth_per_fee_asset": 10055168, + "excess_mana": 1028757284, + "mana_used": 66213805 }, "oracle_input": { - "fee_asset_price_modifier": -96 + "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 12123914, + "eth_per_fee_asset_at_execution": 10093524, "l1_fee_oracle_output": { "base_fee": 9519428616, "blob_fee": 1 @@ -36344,22 +36344,22 @@ "slot_of_change": 450 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65026011979300, - "congestion_multiplier": 4717935497, - "prover_cost": 15134283615011, - "sequencer_cost": 2355533534798 + "congestion_cost": 91757710785649, + "congestion_multiplier": 4977169548, + "prover_cost": 19298618995705, + "sequencer_cost": 3772489667633 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788369777, - "congestion_multiplier": 4717935497, - "prover_cost": 183486753, - "sequencer_cost": 28558286 + "congestion_cost": 926158656, + "congestion_multiplier": 4977169548, + "prover_cost": 194791074, + "sequencer_cost": 38077715 } }, "parent_fee_header": { - "eth_per_fee_asset": 12123914, - "excess_mana": 1337763060, - "mana_used": 88195323 + "eth_per_fee_asset": 10093524, + "excess_mana": 1021843084, + "mana_used": 81914200 } }, { @@ -36367,21 +36367,21 @@ "blobs_needed": 1, "block_number": 452, "l1_block_number": 20974509, - "mana_spent": 97543789, - "size_in_fields": 3690, + "mana_spent": 88457423, + "size_in_fields": 3015, "slot_number": 452, "timestamp": 1729038095 }, "fee_header": { - "eth_per_fee_asset": 12044747, - "excess_mana": 1327851298, - "mana_used": 97543789 + "eth_per_fee_asset": 10030030, + "excess_mana": 1019971089, + "mana_used": 88457423 }, "oracle_input": { - "fee_asset_price_modifier": 31 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 12007524, + "eth_per_fee_asset_at_execution": 10055168, "l1_fee_oracle_output": { "base_fee": 9519428616, "blob_fee": 1 @@ -36398,22 +36398,22 @@ "slot_of_change": 450 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65841039501566, - "congestion_multiplier": 4728395938, - "prover_cost": 15280981574553, - "sequencer_cost": 2378365931228 + "congestion_cost": 90538602935327, + "congestion_multiplier": 4909415546, + "prover_cost": 19372234655851, + "sequencer_cost": 3786880040195 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790587862, - "congestion_multiplier": 4728395938, - "prover_cost": 183486753, - "sequencer_cost": 28558286 + "congestion_cost": 910380863, + "congestion_multiplier": 4909415546, + "prover_cost": 194791074, + "sequencer_cost": 38077715 } }, "parent_fee_header": { - "eth_per_fee_asset": 12007524, - "excess_mana": 1325958383, - "mana_used": 101892915 + "eth_per_fee_asset": 10055168, + "excess_mana": 1028757284, + "mana_used": 66213805 } }, { @@ -36421,21 +36421,21 @@ "blobs_needed": 1, "block_number": 453, "l1_block_number": 20974512, - "mana_spent": 97115438, - "size_in_fields": 3480, + "mana_spent": 63982927, + "size_in_fields": 2235, "slot_number": 453, "timestamp": 1729038131 }, "fee_header": { - "eth_per_fee_asset": 12039929, - "excess_mana": 1325395087, - "mana_used": 97115438 + "eth_per_fee_asset": 10023008, + "excess_mana": 1033428512, + "mana_used": 63982927 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 12044747, + "eth_per_fee_asset_at_execution": 10030030, "l1_fee_oracle_output": { "base_fee": 9519428616, "blob_fee": 1 @@ -36452,22 +36452,22 @@ "slot_of_change": 455 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65398689154700, - "congestion_multiplier": 4714827137, - "prover_cost": 15233757338366, - "sequencer_cost": 2371015846161 + "congestion_cost": 93183716399652, + "congestion_multiplier": 5013571228, + "prover_cost": 19420786777308, + "sequencer_cost": 3796370997894 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787710665, - "congestion_multiplier": 4714827137, - "prover_cost": 183486753, - "sequencer_cost": 28558286 + "congestion_cost": 934635471, + "congestion_multiplier": 5013571228, + "prover_cost": 194791074, + "sequencer_cost": 38077715 } }, "parent_fee_header": { - "eth_per_fee_asset": 12044747, - "excess_mana": 1327851298, - "mana_used": 97543789 + "eth_per_fee_asset": 10030030, + "excess_mana": 1019971089, + "mana_used": 88457423 } }, { @@ -36475,21 +36475,21 @@ "blobs_needed": 1, "block_number": 454, "l1_block_number": 20974515, - "mana_spent": 97153492, - "size_in_fields": 3450, + "mana_spent": 65876410, + "size_in_fields": 2415, "slot_number": 454, "timestamp": 1729038167 }, "fee_header": { - "eth_per_fee_asset": 12110964, - "excess_mana": 1322510525, - "mana_used": 97153492 + "eth_per_fee_asset": 10008975, + "excess_mana": 1022411439, + "mana_used": 65876410 }, "oracle_input": { - "fee_asset_price_modifier": 59 + "fee_asset_price_modifier": -14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12039929, + "eth_per_fee_asset_at_execution": 10023008, "l1_fee_oracle_output": { "base_fee": 9519428616, "blob_fee": 1 @@ -36506,22 +36506,22 @@ "slot_of_change": 455 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65145088397116, - "congestion_multiplier": 4698941711, - "prover_cost": 15239853407774, - "sequencer_cost": 2371964651952 + "congestion_cost": 91264164210984, + "congestion_multiplier": 4928141047, + "prover_cost": 19434392749163, + "sequencer_cost": 3799030690189 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784342239, - "congestion_multiplier": 4698941711, - "prover_cost": 183486753, - "sequencer_cost": 28558286 + "congestion_cost": 914741448, + "congestion_multiplier": 4928141047, + "prover_cost": 194791074, + "sequencer_cost": 38077715 } }, "parent_fee_header": { - "eth_per_fee_asset": 12039929, - "excess_mana": 1325395087, - "mana_used": 97115438 + "eth_per_fee_asset": 10023008, + "excess_mana": 1033428512, + "mana_used": 63982927 } }, { @@ -36529,21 +36529,21 @@ "blobs_needed": 1, "block_number": 455, "l1_block_number": 20974518, - "mana_spent": 99790073, - "size_in_fields": 3555, + "mana_spent": 75897646, + "size_in_fields": 2640, "slot_number": 455, "timestamp": 1729038203 }, "fee_header": { - "eth_per_fee_asset": 12129130, - "excess_mana": 1319664017, - "mana_used": 99790073 + "eth_per_fee_asset": 10109064, + "excess_mana": 1013287849, + "mana_used": 75897646 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12110964, + "eth_per_fee_asset_at_execution": 10008975, "l1_fee_oracle_output": { "base_fee": 11205455997, "blob_fee": 1 @@ -36560,22 +36560,22 @@ "slot_of_change": 455 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66188007824976, - "congestion_multiplier": 4683318318, - "prover_cost": 15193971016676, - "sequencer_cost": 2775697128652 + "congestion_cost": 93346606021097, + "congestion_multiplier": 4858496592, + "prover_cost": 19714317899686, + "sequencer_cost": 4478163248485 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801600580, - "congestion_multiplier": 4683318318, - "prover_cost": 184013636, - "sequencer_cost": 33616368 + "congestion_cost": 934303846, + "congestion_multiplier": 4858496592, + "prover_cost": 197320115, + "sequencer_cost": 44821824 } }, "parent_fee_header": { - "eth_per_fee_asset": 12110964, - "excess_mana": 1322510525, - "mana_used": 97153492 + "eth_per_fee_asset": 10008975, + "excess_mana": 1022411439, + "mana_used": 65876410 } }, { @@ -36583,21 +36583,21 @@ "blobs_needed": 1, "block_number": 456, "l1_block_number": 20974521, - "mana_spent": 108852349, - "size_in_fields": 3750, + "mana_spent": 77634987, + "size_in_fields": 2910, "slot_number": 456, "timestamp": 1729038239 }, "fee_header": { - "eth_per_fee_asset": 12027245, - "excess_mana": 1319454090, - "mana_used": 108852349 + "eth_per_fee_asset": 10097944, + "excess_mana": 1014185495, + "mana_used": 77634987 }, "oracle_input": { - "fee_asset_price_modifier": -84 + "fee_asset_price_modifier": -11 }, "outputs": { - "eth_per_fee_asset_at_execution": 12129130, + "eth_per_fee_asset_at_execution": 10109064, "l1_fee_oracle_output": { "base_fee": 11205455997, "blob_fee": 1 @@ -36614,22 +36614,22 @@ "slot_of_change": 455 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66068240096364, - "congestion_multiplier": 4682168168, - "prover_cost": 15171214753243, - "sequencer_cost": 2771539920836 + "congestion_cost": 92585466864193, + "congestion_multiplier": 4865304846, + "prover_cost": 19519128081493, + "sequencer_cost": 4433825327449 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801350273, - "congestion_multiplier": 4682168168, - "prover_cost": 184013636, - "sequencer_cost": 33616368 + "congestion_cost": 935952410, + "congestion_multiplier": 4865304846, + "prover_cost": 197320115, + "sequencer_cost": 44821824 } }, "parent_fee_header": { - "eth_per_fee_asset": 12129130, - "excess_mana": 1319664017, - "mana_used": 99790073 + "eth_per_fee_asset": 10109064, + "excess_mana": 1013287849, + "mana_used": 75897646 } }, { @@ -36637,21 +36637,21 @@ "blobs_needed": 1, "block_number": 457, "l1_block_number": 20974524, - "mana_spent": 91915037, - "size_in_fields": 3255, + "mana_spent": 73008976, + "size_in_fields": 2670, "slot_number": 457, "timestamp": 1729038275 }, "fee_header": { - "eth_per_fee_asset": 12077759, - "excess_mana": 1328306439, - "mana_used": 91915037 + "eth_per_fee_asset": 10083806, + "excess_mana": 1016820482, + "mana_used": 73008976 }, "oracle_input": { - "fee_asset_price_modifier": 42 + "fee_asset_price_modifier": -14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12027245, + "eth_per_fee_asset_at_execution": 10097944, "l1_fee_oracle_output": { "base_fee": 11205455997, "blob_fee": 1 @@ -36668,22 +36668,22 @@ "slot_of_change": 455 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67509969905827, - "congestion_multiplier": 4730914550, - "prover_cost": 15299732898100, - "sequencer_cost": 2795018144222 + "congestion_cost": 93167978253792, + "congestion_multiplier": 4885345230, + "prover_cost": 19540622823815, + "sequencer_cost": 4438707919157 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 811958948, - "congestion_multiplier": 4730914550, - "prover_cost": 184013636, - "sequencer_cost": 33616368 + "congestion_cost": 940805027, + "congestion_multiplier": 4885345230, + "prover_cost": 197320115, + "sequencer_cost": 44821824 } }, "parent_fee_header": { - "eth_per_fee_asset": 12027245, - "excess_mana": 1319454090, - "mana_used": 108852349 + "eth_per_fee_asset": 10097944, + "excess_mana": 1014185495, + "mana_used": 77634987 } }, { @@ -36691,21 +36691,21 @@ "blobs_needed": 1, "block_number": 458, "l1_block_number": 20974527, - "mana_spent": 114507235, - "size_in_fields": 3600, + "mana_spent": 90478516, + "size_in_fields": 3135, "slot_number": 458, "timestamp": 1729038311 }, "fee_header": { - "eth_per_fee_asset": 12127277, - "excess_mana": 1320221476, - "mana_used": 114507235 + "eth_per_fee_asset": 10102965, + "excess_mana": 1014829458, + "mana_used": 90478516 }, "oracle_input": { - "fee_asset_price_modifier": 41 + "fee_asset_price_modifier": 19 }, "outputs": { - "eth_per_fee_asset_at_execution": 12077759, + "eth_per_fee_asset_at_execution": 10083806, "l1_fee_oracle_output": { "base_fee": 11205455997, "blob_fee": 1 @@ -36722,22 +36722,22 @@ "slot_of_change": 460 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66425035141039, - "congestion_multiplier": 4686373901, - "prover_cost": 15235743319601, - "sequencer_cost": 2783328264789 + "congestion_cost": 92934800312502, + "congestion_multiplier": 4870194900, + "prover_cost": 19568019753653, + "sequencer_cost": 4444931209506 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802265566, - "congestion_multiplier": 4686373901, - "prover_cost": 184013636, - "sequencer_cost": 33616368 + "congestion_cost": 937136497, + "congestion_multiplier": 4870194900, + "prover_cost": 197320115, + "sequencer_cost": 44821824 } }, "parent_fee_header": { - "eth_per_fee_asset": 12077759, - "excess_mana": 1328306439, - "mana_used": 91915037 + "eth_per_fee_asset": 10083806, + "excess_mana": 1016820482, + "mana_used": 73008976 } }, { @@ -36745,21 +36745,21 @@ "blobs_needed": 1, "block_number": 459, "l1_block_number": 20974530, - "mana_spent": 95387989, - "size_in_fields": 3375, + "mana_spent": 67147261, + "size_in_fields": 2475, "slot_number": 459, "timestamp": 1729038347 }, "fee_header": { - "eth_per_fee_asset": 12240060, - "excess_mana": 1334728711, - "mana_used": 95387989 + "eth_per_fee_asset": 10099934, + "excess_mana": 1030307974, + "mana_used": 67147261 }, "oracle_input": { - "fee_asset_price_modifier": 93 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 12127277, + "eth_per_fee_asset_at_execution": 10102965, "l1_fee_oracle_output": { "base_fee": 11205455997, "blob_fee": 1 @@ -36776,22 +36776,22 @@ "slot_of_change": 460 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67593448883868, - "congestion_multiplier": 4766596809, - "prover_cost": 15173532854903, - "sequencer_cost": 2771963401183 + "congestion_cost": 95611387449131, + "congestion_multiplier": 4989224276, + "prover_cost": 19530911470049, + "sequencer_cost": 4436501957594 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 819724478, - "congestion_multiplier": 4766596809, - "prover_cost": 184013636, - "sequencer_cost": 33616368 + "congestion_cost": 965958501, + "congestion_multiplier": 4989224276, + "prover_cost": 197320115, + "sequencer_cost": 44821824 } }, "parent_fee_header": { - "eth_per_fee_asset": 12127277, - "excess_mana": 1320221476, - "mana_used": 114507235 + "eth_per_fee_asset": 10102965, + "excess_mana": 1014829458, + "mana_used": 90478516 } }, { @@ -36799,21 +36799,21 @@ "blobs_needed": 1, "block_number": 460, "l1_block_number": 20974533, - "mana_spent": 97167772, - "size_in_fields": 3300, + "mana_spent": 77818553, + "size_in_fields": 2610, "slot_number": 460, "timestamp": 1729038383 }, "fee_header": { - "eth_per_fee_asset": 12218027, - "excess_mana": 1330116700, - "mana_used": 97167772 + "eth_per_fee_asset": 10077714, + "excess_mana": 1022455235, + "mana_used": 77818553 }, "oracle_input": { - "fee_asset_price_modifier": -18 + "fee_asset_price_modifier": -22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12240060, + "eth_per_fee_asset_at_execution": 10099934, "l1_fee_oracle_output": { "base_fee": 11061772061, "blob_fee": 1 @@ -36830,22 +36830,22 @@ "slot_of_change": 460 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66369071965334, - "congestion_multiplier": 4740945271, - "prover_cost": 15030051731773, - "sequencer_cost": 2711205418928 + "congestion_cost": 93876326518570, + "congestion_multiplier": 4928477757, + "prover_cost": 19515433467189, + "sequencer_cost": 4380928528840 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 812361423, - "congestion_multiplier": 4740945271, - "prover_cost": 183968735, - "sequencer_cost": 33185317 + "congestion_cost": 948144702, + "congestion_multiplier": 4928477757, + "prover_cost": 197104590, + "sequencer_cost": 44247089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12240060, - "excess_mana": 1334728711, - "mana_used": 95387989 + "eth_per_fee_asset": 10099934, + "excess_mana": 1030307974, + "mana_used": 67147261 } }, { @@ -36853,21 +36853,21 @@ "blobs_needed": 1, "block_number": 461, "l1_block_number": 20974536, - "mana_spent": 94787944, - "size_in_fields": 3255, + "mana_spent": 66264230, + "size_in_fields": 2280, "slot_number": 461, "timestamp": 1729038419 }, "fee_header": { - "eth_per_fee_asset": 12147162, - "excess_mana": 1327284472, - "mana_used": 94787944 + "eth_per_fee_asset": 10162366, + "excess_mana": 1025273788, + "mana_used": 66264230 }, "oracle_input": { - "fee_asset_price_modifier": -58 + "fee_asset_price_modifier": 84 }, "outputs": { - "eth_per_fee_asset_at_execution": 12218027, + "eth_per_fee_asset_at_execution": 10077714, "l1_fee_oracle_output": { "base_fee": 11061772061, "blob_fee": 1 @@ -36884,22 +36884,22 @@ "slot_of_change": 460 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66209999126701, - "congestion_multiplier": 4725261170, - "prover_cost": 15057155709347, - "sequencer_cost": 2716094587122 + "congestion_cost": 94603435362425, + "congestion_multiplier": 4950195703, + "prover_cost": 19558462365573, + "sequencer_cost": 4390587885309 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 808955557, - "congestion_multiplier": 4725261170, - "prover_cost": 183968735, - "sequencer_cost": 33185317 + "congestion_cost": 953386365, + "congestion_multiplier": 4950195703, + "prover_cost": 197104590, + "sequencer_cost": 44247089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12218027, - "excess_mana": 1330116700, - "mana_used": 97167772 + "eth_per_fee_asset": 10077714, + "excess_mana": 1022455235, + "mana_used": 77818553 } }, { @@ -36907,21 +36907,21 @@ "blobs_needed": 1, "block_number": 462, "l1_block_number": 20974539, - "mana_spent": 95740203, - "size_in_fields": 3390, + "mana_spent": 75376754, + "size_in_fields": 2745, "slot_number": 462, "timestamp": 1729038455 }, "fee_header": { - "eth_per_fee_asset": 12196965, - "excess_mana": 1322072416, - "mana_used": 95740203 + "eth_per_fee_asset": 10211145, + "excess_mana": 1016538018, + "mana_used": 75376754 }, "oracle_input": { - "fee_asset_price_modifier": 41 + "fee_asset_price_modifier": 48 }, "outputs": { - "eth_per_fee_asset_at_execution": 12147162, + "eth_per_fee_asset_at_execution": 10162366, "l1_fee_oracle_output": { "base_fee": 11061772061, "blob_fee": 1 @@ -36938,22 +36938,22 @@ "slot_of_change": 460 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66082700881079, - "congestion_multiplier": 4696533709, - "prover_cost": 15144997242978, - "sequencer_cost": 2731939937905 + "congestion_cost": 92224109228107, + "congestion_multiplier": 4883193007, + "prover_cost": 19395541353264, + "sequencer_cost": 4354014508039 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802717273, - "congestion_multiplier": 4696533709, - "prover_cost": 183968735, - "sequencer_cost": 33185317 + "congestion_cost": 937215152, + "congestion_multiplier": 4883193007, + "prover_cost": 197104590, + "sequencer_cost": 44247089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12147162, - "excess_mana": 1327284472, - "mana_used": 94787944 + "eth_per_fee_asset": 10162366, + "excess_mana": 1025273788, + "mana_used": 66264230 } }, { @@ -36961,21 +36961,21 @@ "blobs_needed": 1, "block_number": 463, "l1_block_number": 20974542, - "mana_spent": 98849091, - "size_in_fields": 3150, + "mana_spent": 91082921, + "size_in_fields": 2985, "slot_number": 463, "timestamp": 1729038491 }, "fee_header": { - "eth_per_fee_asset": 12240874, - "excess_mana": 1317812619, - "mana_used": 98849091 + "eth_per_fee_asset": 10233609, + "excess_mana": 1016914772, + "mana_used": 91082921 }, "oracle_input": { - "fee_asset_price_modifier": 36 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12196965, + "eth_per_fee_asset_at_execution": 10211145, "l1_fee_oracle_output": { "base_fee": 11061772061, "blob_fee": 1 @@ -36992,22 +36992,22 @@ "slot_of_change": 465 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65397163802635, - "congestion_multiplier": 4673184595, - "prover_cost": 15083156752520, - "sequencer_cost": 2720784801793 + "congestion_cost": 91851407653109, + "congestion_multiplier": 4886063880, + "prover_cost": 19302888167782, + "sequencer_cost": 4333215227088 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797646918, - "congestion_multiplier": 4673184595, - "prover_cost": 183968735, - "sequencer_cost": 33185317 + "congestion_cost": 937908042, + "congestion_multiplier": 4886063880, + "prover_cost": 197104590, + "sequencer_cost": 44247089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12196965, - "excess_mana": 1322072416, - "mana_used": 95740203 + "eth_per_fee_asset": 10211145, + "excess_mana": 1016538018, + "mana_used": 75376754 } }, { @@ -37015,21 +37015,21 @@ "blobs_needed": 1, "block_number": 464, "l1_block_number": 20974545, - "mana_spent": 103846271, - "size_in_fields": 3765, + "mana_spent": 80827511, + "size_in_fields": 2625, "slot_number": 464, "timestamp": 1729038527 }, "fee_header": { - "eth_per_fee_asset": 12173549, - "excess_mana": 1316661710, - "mana_used": 103846271 + "eth_per_fee_asset": 10247936, + "excess_mana": 1032997693, + "mana_used": 80827511 }, "oracle_input": { - "fee_asset_price_modifier": -55 + "fee_asset_price_modifier": 14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12240874, + "eth_per_fee_asset_at_execution": 10233609, "l1_fee_oracle_output": { "base_fee": 11061772061, "blob_fee": 1 @@ -37046,22 +37046,22 @@ "slot_of_change": 465 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65051020376487, - "congestion_multiplier": 4666896090, - "prover_cost": 15029052255583, - "sequencer_cost": 2711025127781 + "congestion_cost": 94577503498522, + "congestion_multiplier": 5010202851, + "prover_cost": 19260516011507, + "sequencer_cost": 4323703299589 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796281344, - "congestion_multiplier": 4666896090, - "prover_cost": 183968735, - "sequencer_cost": 33185317 + "congestion_cost": 967869191, + "congestion_multiplier": 5010202851, + "prover_cost": 197104590, + "sequencer_cost": 44247089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12240874, - "excess_mana": 1317812619, - "mana_used": 98849091 + "eth_per_fee_asset": 10233609, + "excess_mana": 1016914772, + "mana_used": 91082921 } }, { @@ -37069,21 +37069,21 @@ "blobs_needed": 1, "block_number": 465, "l1_block_number": 20974548, - "mana_spent": 94922473, - "size_in_fields": 3450, + "mana_spent": 8367355, + "size_in_fields": 315, "slot_number": 465, "timestamp": 1729038563 }, "fee_header": { - "eth_per_fee_asset": 12139463, - "excess_mana": 1320507981, - "mana_used": 94922473 + "eth_per_fee_asset": 10230514, + "excess_mana": 1038825204, + "mana_used": 8367355 }, "oracle_input": { - "fee_asset_price_modifier": -28 + "fee_asset_price_modifier": -17 }, "outputs": { - "eth_per_fee_asset_at_execution": 12173549, + "eth_per_fee_asset_at_execution": 10247936, "l1_fee_oracle_output": { "base_fee": 9735543051, "blob_fee": 1 @@ -37100,22 +37100,22 @@ "slot_of_change": 465 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64455368438572, - "congestion_multiplier": 4687945088, - "prover_cost": 15078124629063, - "sequencer_cost": 2399187779998 + "congestion_cost": 92635924541293, + "congestion_multiplier": 5055957853, + "prover_cost": 19039467654756, + "sequencer_cost": 3800001580807 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784650586, - "congestion_multiplier": 4687945088, - "prover_cost": 183554289, - "sequencer_cost": 29206630 + "congestion_cost": 949327026, + "congestion_multiplier": 5055957853, + "prover_cost": 195115246, + "sequencer_cost": 38942173 } }, "parent_fee_header": { - "eth_per_fee_asset": 12173549, - "excess_mana": 1316661710, - "mana_used": 103846271 + "eth_per_fee_asset": 10247936, + "excess_mana": 1032997693, + "mana_used": 80827511 } }, { @@ -37123,21 +37123,21 @@ "blobs_needed": 1, "block_number": 466, "l1_block_number": 20974551, - "mana_spent": 113665337, - "size_in_fields": 3690, + "mana_spent": 6526095, + "size_in_fields": 180, "slot_number": 466, "timestamp": 1729038599 }, "fee_header": { - "eth_per_fee_asset": 12025352, - "excess_mana": 1315430454, - "mana_used": 113665337 + "eth_per_fee_asset": 10332819, + "excess_mana": 972192559, + "mana_used": 6526095 }, "oracle_input": { - "fee_asset_price_modifier": -94 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12139463, + "eth_per_fee_asset_at_execution": 10230514, "l1_fee_oracle_output": { "base_fee": 9735543051, "blob_fee": 1 @@ -37154,44 +37154,44 @@ "slot_of_change": 465 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64149692782951, - "congestion_multiplier": 4660177942, - "prover_cost": 15120462000667, - "sequencer_cost": 2405924380675 + "congestion_cost": 81373739774952, + "congestion_multiplier": 4556798959, + "prover_cost": 19071890816044, + "sequencer_cost": 3806472773509 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778742822, - "congestion_multiplier": 4660177942, - "prover_cost": 183554289, - "sequencer_cost": 29206630 + "congestion_cost": 832495184, + "congestion_multiplier": 4556798959, + "prover_cost": 195115246, + "sequencer_cost": 38942173 } }, "parent_fee_header": { - "eth_per_fee_asset": 12139463, - "excess_mana": 1320507981, - "mana_used": 94922473 + "eth_per_fee_asset": 10230514, + "excess_mana": 1038825204, + "mana_used": 8367355 } }, { "block_header": { - "blobs_needed": 1, + "blobs_needed": 2, "block_number": 467, "l1_block_number": 20974554, - "mana_spent": 91860072, - "size_in_fields": 3330, + "mana_spent": 149961226, + "size_in_fields": 5640, "slot_number": 467, "timestamp": 1729038635 }, "fee_header": { - "eth_per_fee_asset": 12022946, - "excess_mana": 1329095791, - "mana_used": 91860072 + "eth_per_fee_asset": 10436147, + "excess_mana": 903718654, + "mana_used": 149961226 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": 100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12025352, + "eth_per_fee_asset_at_execution": 10332819, "l1_fee_oracle_output": { "base_fee": 9735543051, "blob_fee": 1 @@ -37208,22 +37208,22 @@ "slot_of_change": 465 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66087282268328, - "congestion_multiplier": 4735285766, - "prover_cost": 15263943126156, - "sequencer_cost": 2428754684271 + "congestion_cost": 70110651217253, + "congestion_multiplier": 4095140809, + "prover_cost": 18883060469752, + "sequencer_cost": 3768784975330 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794722832, - "congestion_multiplier": 4735285766, - "prover_cost": 183554289, - "sequencer_cost": 29206630 + "congestion_cost": 724440669, + "congestion_multiplier": 4095140809, + "prover_cost": 195115246, + "sequencer_cost": 38942173 } }, "parent_fee_header": { - "eth_per_fee_asset": 12025352, - "excess_mana": 1315430454, - "mana_used": 113665337 + "eth_per_fee_asset": 10332819, + "excess_mana": 972192559, + "mana_used": 6526095 } }, { @@ -37231,21 +37231,21 @@ "blobs_needed": 1, "block_number": 468, "l1_block_number": 20974557, - "mana_spent": 99619496, - "size_in_fields": 3525, + "mana_spent": 112542738, + "size_in_fields": 4005, "slot_number": 468, "timestamp": 1729038671 }, "fee_header": { - "eth_per_fee_asset": 11996495, - "excess_mana": 1320955863, - "mana_used": 99619496 + "eth_per_fee_asset": 10447626, + "excess_mana": 978679880, + "mana_used": 112542738 }, "oracle_input": { - "fee_asset_price_modifier": -22 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 12022946, + "eth_per_fee_asset_at_execution": 10436147, "l1_fee_oracle_output": { "base_fee": 9735543051, "blob_fee": 1 @@ -37262,22 +37262,22 @@ "slot_of_change": 470 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65306239252843, - "congestion_multiplier": 4690402318, - "prover_cost": 15266997705887, - "sequencer_cost": 2429240720203 + "congestion_cost": 80809874947143, + "congestion_multiplier": 4603148911, + "prover_cost": 18696099815383, + "sequencer_cost": 3731470340539 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785173388, - "congestion_multiplier": 4690402318, - "prover_cost": 183554289, - "sequencer_cost": 29206630 + "congestion_cost": 843343734, + "congestion_multiplier": 4603148911, + "prover_cost": 195115246, + "sequencer_cost": 38942173 } }, "parent_fee_header": { - "eth_per_fee_asset": 12022946, - "excess_mana": 1329095791, - "mana_used": 91860072 + "eth_per_fee_asset": 10436147, + "excess_mana": 903718654, + "mana_used": 149961226 } }, { @@ -37285,21 +37285,21 @@ "blobs_needed": 1, "block_number": 469, "l1_block_number": 20974560, - "mana_spent": 108043296, - "size_in_fields": 3615, + "mana_spent": 77369519, + "size_in_fields": 2865, "slot_number": 469, "timestamp": 1729038707 }, "fee_header": { - "eth_per_fee_asset": 11972502, - "excess_mana": 1320575359, - "mana_used": 108043296 + "eth_per_fee_asset": 10435088, + "excess_mana": 1016222618, + "mana_used": 77369519 }, "oracle_input": { - "fee_asset_price_modifier": -20 + "fee_asset_price_modifier": -12 }, "outputs": { - "eth_per_fee_asset_at_execution": 11996495, + "eth_per_fee_asset_at_execution": 10447626, "l1_fee_oracle_output": { "base_fee": 9735543051, "blob_fee": 1 @@ -37316,22 +37316,22 @@ "slot_of_change": 470 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65413207524365, - "congestion_multiplier": 4688314664, - "prover_cost": 15300659817722, - "sequencer_cost": 2434596938523 + "congestion_cost": 86941082404750, + "congestion_multiplier": 4880790949, + "prover_cost": 18675558064579, + "sequencer_cost": 3727370505032 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784729217, - "congestion_multiplier": 4688314664, - "prover_cost": 183554289, - "sequencer_cost": 29206630 + "congestion_cost": 908327913, + "congestion_multiplier": 4880790949, + "prover_cost": 195115246, + "sequencer_cost": 38942173 } }, "parent_fee_header": { - "eth_per_fee_asset": 11996495, - "excess_mana": 1320955863, - "mana_used": 99619496 + "eth_per_fee_asset": 10447626, + "excess_mana": 978679880, + "mana_used": 112542738 } }, { @@ -37339,21 +37339,21 @@ "blobs_needed": 1, "block_number": 470, "l1_block_number": 20974563, - "mana_spent": 99756645, - "size_in_fields": 3480, + "mana_spent": 75367205, + "size_in_fields": 2610, "slot_number": 470, "timestamp": 1729038743 }, "fee_header": { - "eth_per_fee_asset": 11949754, - "excess_mana": 1328618655, - "mana_used": 99756645 + "eth_per_fee_asset": 10461175, + "excess_mana": 1018592137, + "mana_used": 75367205 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": 25 }, "outputs": { - "eth_per_fee_asset_at_execution": 11972502, + "eth_per_fee_asset_at_execution": 10435088, "l1_fee_oracle_output": { "base_fee": 10411709768, "blob_fee": 1 @@ -37370,22 +37370,22 @@ "slot_of_change": 470 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67030345286224, - "congestion_multiplier": 4732643034, - "prover_cost": 15348971418005, - "sequencer_cost": 2608905807659 + "congestion_cost": 88840463635765, + "congestion_multiplier": 4898865933, + "prover_cost": 18795193294010, + "sequencer_cost": 3991038695601 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802520943, - "congestion_multiplier": 4732643034, - "prover_cost": 183765591, - "sequencer_cost": 31235130 + "congestion_cost": 927058056, + "congestion_multiplier": 4898865933, + "prover_cost": 196129496, + "sequencer_cost": 41646840 } }, "parent_fee_header": { - "eth_per_fee_asset": 11972502, - "excess_mana": 1320575359, - "mana_used": 108043296 + "eth_per_fee_asset": 10435088, + "excess_mana": 1016222618, + "mana_used": 77369519 } }, { @@ -37393,21 +37393,21 @@ "blobs_needed": 1, "block_number": 471, "l1_block_number": 20974566, - "mana_spent": 99186155, - "size_in_fields": 3540, + "mana_spent": 80981883, + "size_in_fields": 2700, "slot_number": 471, "timestamp": 1729038779 }, "fee_header": { - "eth_per_fee_asset": 11927049, - "excess_mana": 1328375300, - "mana_used": 99186155 + "eth_per_fee_asset": 10428745, + "excess_mana": 1018959342, + "mana_used": 80981883 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": -31 }, "outputs": { - "eth_per_fee_asset_at_execution": 11949754, + "eth_per_fee_asset_at_execution": 10461175, "l1_fee_oracle_output": { "base_fee": 10411709768, "blob_fee": 1 @@ -37424,22 +37424,22 @@ "slot_of_change": 470 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67133705848673, - "congestion_multiplier": 4731295723, - "prover_cost": 15378190295801, - "sequencer_cost": 2613872218625 + "congestion_cost": 88682725410865, + "congestion_multiplier": 4901673003, + "prover_cost": 18748323778161, + "sequencer_cost": 3981086254652 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 802231270, - "congestion_multiplier": 4731295723, - "prover_cost": 183765591, - "sequencer_cost": 31235130 + "congestion_cost": 927725510, + "congestion_multiplier": 4901673003, + "prover_cost": 196129496, + "sequencer_cost": 41646840 } }, "parent_fee_header": { - "eth_per_fee_asset": 11949754, - "excess_mana": 1328618655, - "mana_used": 99756645 + "eth_per_fee_asset": 10461175, + "excess_mana": 1018592137, + "mana_used": 75367205 } }, { @@ -37447,21 +37447,21 @@ "blobs_needed": 1, "block_number": 472, "l1_block_number": 20974569, - "mana_spent": 65068057, - "size_in_fields": 2130, + "mana_spent": 79029578, + "size_in_fields": 2700, "slot_number": 472, "timestamp": 1729038815 }, "fee_header": { - "eth_per_fee_asset": 11999803, - "excess_mana": 1327561455, - "mana_used": 65068057 + "eth_per_fee_asset": 10511132, + "excess_mana": 1024941225, + "mana_used": 79029578 }, "oracle_input": { - "fee_asset_price_modifier": 61 + "fee_asset_price_modifier": 79 }, "outputs": { - "eth_per_fee_asset_at_execution": 11927049, + "eth_per_fee_asset_at_execution": 10428745, "l1_fee_oracle_output": { "base_fee": 10411709768, "blob_fee": 1 @@ -37478,22 +37478,22 @@ "slot_of_change": 470 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67180333039632, - "congestion_multiplier": 4726792734, - "prover_cost": 15407465082101, - "sequencer_cost": 2618848132510 + "congestion_cost": 90006282922826, + "congestion_multiplier": 4947628216, + "prover_cost": 18806624958229, + "sequencer_cost": 3993466136146 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801263124, - "congestion_multiplier": 4726792734, - "prover_cost": 183765591, - "sequencer_cost": 31235130 + "congestion_cost": 938652573, + "congestion_multiplier": 4947628216, + "prover_cost": 196129496, + "sequencer_cost": 41646840 } }, "parent_fee_header": { - "eth_per_fee_asset": 11927049, - "excess_mana": 1328375300, - "mana_used": 99186155 + "eth_per_fee_asset": 10428745, + "excess_mana": 1018959342, + "mana_used": 80981883 } }, { @@ -37501,21 +37501,21 @@ "blobs_needed": 1, "block_number": 473, "l1_block_number": 20974572, - "mana_spent": 103170950, - "size_in_fields": 3840, + "mana_spent": 62963425, + "size_in_fields": 2310, "slot_number": 473, "timestamp": 1729038851 }, "fee_header": { - "eth_per_fee_asset": 11989003, - "excess_mana": 1292629512, - "mana_used": 103170950 + "eth_per_fee_asset": 10502723, + "excess_mana": 1028970803, + "mana_used": 62963425 }, "oracle_input": { - "fee_asset_price_modifier": -9 + "fee_asset_price_modifier": -8 }, "outputs": { - "eth_per_fee_asset_at_execution": 11999803, + "eth_per_fee_asset_at_execution": 10511132, "l1_fee_oracle_output": { "base_fee": 10411709768, "blob_fee": 1 @@ -37532,44 +37532,44 @@ "slot_of_change": 475 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63381488262766, - "congestion_multiplier": 4537501500, - "prover_cost": 15314050655665, - "sequencer_cost": 2602970232095 + "congestion_cost": 90006581974235, + "congestion_multiplier": 4978827667, + "prover_cost": 18659217294579, + "sequencer_cost": 3962165064620 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760565373, - "congestion_multiplier": 4537501500, - "prover_cost": 183765591, - "sequencer_cost": 31235130 + "congestion_cost": 946071064, + "congestion_multiplier": 4978827667, + "prover_cost": 196129496, + "sequencer_cost": 41646840 } }, "parent_fee_header": { - "eth_per_fee_asset": 11999803, - "excess_mana": 1327561455, - "mana_used": 65068057 + "eth_per_fee_asset": 10511132, + "excess_mana": 1024941225, + "mana_used": 79029578 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 474, "l1_block_number": 20974575, - "mana_spent": 121986139, - "size_in_fields": 4500, + "mana_spent": 67984981, + "size_in_fields": 2535, "slot_number": 474, "timestamp": 1729038887 }, "fee_header": { - "eth_per_fee_asset": 12077721, - "excess_mana": 1295800462, - "mana_used": 121986139 + "eth_per_fee_asset": 10504823, + "excess_mana": 1016934228, + "mana_used": 67984981 }, "oracle_input": { - "fee_asset_price_modifier": 74 + "fee_asset_price_modifier": 2 }, "outputs": { - "eth_per_fee_asset_at_execution": 11989003, + "eth_per_fee_asset_at_execution": 10502723, "l1_fee_oracle_output": { "base_fee": 10411709768, "blob_fee": 1 @@ -37586,22 +37586,22 @@ "slot_of_change": 475 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63741034679865, - "congestion_multiplier": 4554366949, - "prover_cost": 15327845943487, - "sequencer_cost": 2605315054138 + "congestion_cost": 87981877937751, + "congestion_multiplier": 4886212181, + "prover_cost": 18674156787721, + "sequencer_cost": 3965337370128 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 764191456, - "congestion_multiplier": 4554366949, - "prover_cost": 183765591, - "sequencer_cost": 31235130 + "congestion_cost": 924049293, + "congestion_multiplier": 4886212181, + "prover_cost": 196129496, + "sequencer_cost": 41646840 } }, "parent_fee_header": { - "eth_per_fee_asset": 11989003, - "excess_mana": 1292629512, - "mana_used": 103170950 + "eth_per_fee_asset": 10502723, + "excess_mana": 1028970803, + "mana_used": 62963425 } }, { @@ -37609,21 +37609,21 @@ "blobs_needed": 1, "block_number": 475, "l1_block_number": 20974578, - "mana_spent": 109848173, - "size_in_fields": 3825, + "mana_spent": 83503795, + "size_in_fields": 2985, "slot_number": 475, "timestamp": 1729038923 }, "fee_header": { - "eth_per_fee_asset": 12146564, - "excess_mana": 1317786601, - "mana_used": 109848173 + "eth_per_fee_asset": 10478560, + "excess_mana": 1009919209, + "mana_used": 83503795 }, "oracle_input": { - "fee_asset_price_modifier": 57 + "fee_asset_price_modifier": -25 }, "outputs": { - "eth_per_fee_asset_at_execution": 12077721, + "eth_per_fee_asset_at_execution": 10504823, "l1_fee_oracle_output": { "base_fee": 9601279331, "blob_fee": 1 @@ -37640,22 +37640,22 @@ "slot_of_change": 475 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64568992610444, - "congestion_multiplier": 4673042340, - "prover_cost": 15194284666785, - "sequencer_cost": 2384873603224 + "congestion_cost": 85134134958771, + "congestion_multiplier": 4833031780, + "prover_cost": 18554701016857, + "sequencer_cost": 3655950985562 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779846278, - "congestion_multiplier": 4673042340, - "prover_cost": 183512331, - "sequencer_cost": 28803838 + "congestion_cost": 894319019, + "congestion_multiplier": 4833031780, + "prover_cost": 194913850, + "sequencer_cost": 38405118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12077721, - "excess_mana": 1295800462, - "mana_used": 121986139 + "eth_per_fee_asset": 10504823, + "excess_mana": 1016934228, + "mana_used": 67984981 } }, { @@ -37663,21 +37663,21 @@ "blobs_needed": 1, "block_number": 476, "l1_block_number": 20974581, - "mana_spent": 92318234, - "size_in_fields": 3105, + "mana_spent": 64446879, + "size_in_fields": 2610, "slot_number": 476, "timestamp": 1729038959 }, "fee_header": { - "eth_per_fee_asset": 12174501, - "excess_mana": 1327634774, - "mana_used": 92318234 + "eth_per_fee_asset": 10573914, + "excess_mana": 1018423004, + "mana_used": 64446879 }, "oracle_input": { - "fee_asset_price_modifier": 23 + "fee_asset_price_modifier": 91 }, "outputs": { - "eth_per_fee_asset_at_execution": 12146564, + "eth_per_fee_asset_at_execution": 10478560, "l1_fee_oracle_output": { "base_fee": 9601279331, "blob_fee": 1 @@ -37694,22 +37694,22 @@ "slot_of_change": 475 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65149654585445, - "congestion_multiplier": 4727198231, - "prover_cost": 15108168120631, - "sequencer_cost": 2371356870964 + "congestion_cost": 86784619069796, + "congestion_multiplier": 4897573550, + "prover_cost": 18601205700020, + "sequencer_cost": 3665114099648 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791344449, - "congestion_multiplier": 4727198231, - "prover_cost": 183512331, - "sequencer_cost": 28803838 + "congestion_cost": 909377838, + "congestion_multiplier": 4897573550, + "prover_cost": 194913850, + "sequencer_cost": 38405118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12146564, - "excess_mana": 1317786601, - "mana_used": 109848173 + "eth_per_fee_asset": 10478560, + "excess_mana": 1009919209, + "mana_used": 83503795 } }, { @@ -37717,21 +37717,21 @@ "blobs_needed": 1, "block_number": 477, "l1_block_number": 20974584, - "mana_spent": 89589549, - "size_in_fields": 3360, + "mana_spent": 86044980, + "size_in_fields": 3000, "slot_number": 477, "timestamp": 1729038995 }, "fee_header": { - "eth_per_fee_asset": 12246330, - "excess_mana": 1319953008, - "mana_used": 89589549 + "eth_per_fee_asset": 10642644, + "excess_mana": 1007869883, + "mana_used": 86044980 }, "oracle_input": { - "fee_asset_price_modifier": 59 + "fee_asset_price_modifier": 65 }, "outputs": { - "eth_per_fee_asset_at_execution": 12174501, + "eth_per_fee_asset_at_execution": 10573914, "l1_fee_oracle_output": { "base_fee": 9601279331, "blob_fee": 1 @@ -37748,22 +37748,22 @@ "slot_of_change": 475 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64262535113349, - "congestion_multiplier": 4684902107, - "prover_cost": 15073499193109, - "sequencer_cost": 2365915284742 + "congestion_cost": 84237471101052, + "congestion_multiplier": 4817605498, + "prover_cost": 18433462765066, + "sequencer_cost": 3632062640192 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782364298, - "congestion_multiplier": 4684902107, - "prover_cost": 183512331, - "sequencer_cost": 28803838 + "congestion_cost": 890719775, + "congestion_multiplier": 4817605498, + "prover_cost": 194913850, + "sequencer_cost": 38405118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12174501, - "excess_mana": 1327634774, - "mana_used": 92318234 + "eth_per_fee_asset": 10573914, + "excess_mana": 1018423004, + "mana_used": 64446879 } }, { @@ -37771,21 +37771,21 @@ "blobs_needed": 1, "block_number": 478, "l1_block_number": 20974587, - "mana_spent": 108367308, - "size_in_fields": 3690, + "mana_spent": 80027982, + "size_in_fields": 2835, "slot_number": 478, "timestamp": 1729039031 }, "fee_header": { - "eth_per_fee_asset": 12240206, - "excess_mana": 1309542557, - "mana_used": 108367308 + "eth_per_fee_asset": 10666057, + "excess_mana": 1018914863, + "mana_used": 80027982 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12246330, + "eth_per_fee_asset_at_execution": 10642644, "l1_fee_oracle_output": { "base_fee": 9601279331, "blob_fee": 1 @@ -37802,22 +37802,22 @@ "slot_of_change": 480 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62902302077439, - "congestion_multiplier": 4628185047, - "prover_cost": 14985087858975, - "sequencer_cost": 2352038365780 + "congestion_cost": 85529025118195, + "congestion_multiplier": 4901332901, + "prover_cost": 18314419800193, + "sequencer_cost": 3608606846194 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 770322349, - "congestion_multiplier": 4628185047, - "prover_cost": 183512331, - "sequencer_cost": 28803838 + "congestion_cost": 910254966, + "congestion_multiplier": 4901332901, + "prover_cost": 194913850, + "sequencer_cost": 38405118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12246330, - "excess_mana": 1319953008, - "mana_used": 89589549 + "eth_per_fee_asset": 10642644, + "excess_mana": 1007869883, + "mana_used": 86044980 } }, { @@ -37825,21 +37825,21 @@ "blobs_needed": 1, "block_number": 479, "l1_block_number": 20974590, - "mana_spent": 98385346, - "size_in_fields": 3390, + "mana_spent": 82328977, + "size_in_fields": 2820, "slot_number": 479, "timestamp": 1729039067 }, "fee_header": { - "eth_per_fee_asset": 12196141, - "excess_mana": 1317909865, - "mana_used": 98385346 + "eth_per_fee_asset": 10710854, + "excess_mana": 1023942845, + "mana_used": 82328977 }, "oracle_input": { - "fee_asset_price_modifier": -36 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 12240206, + "eth_per_fee_asset_at_execution": 10666057, "l1_fee_oracle_output": { "base_fee": 9601279331, "blob_fee": 1 @@ -37856,22 +37856,22 @@ "slot_of_change": 480 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63723549832413, - "congestion_multiplier": 4673716330, - "prover_cost": 14992585173812, - "sequencer_cost": 2353215133798 + "congestion_cost": 86185554043074, + "congestion_multiplier": 4939928417, + "prover_cost": 18274217923269, + "sequencer_cost": 3600685614188 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779989377, - "congestion_multiplier": 4673716330, - "prover_cost": 183512331, - "sequencer_cost": 28803838 + "congestion_cost": 919260032, + "congestion_multiplier": 4939928417, + "prover_cost": 194913850, + "sequencer_cost": 38405118 } }, "parent_fee_header": { - "eth_per_fee_asset": 12240206, - "excess_mana": 1309542557, - "mana_used": 108367308 + "eth_per_fee_asset": 10666057, + "excess_mana": 1018914863, + "mana_used": 80027982 } }, { @@ -37879,21 +37879,21 @@ "blobs_needed": 1, "block_number": 480, "l1_block_number": 20974593, - "mana_spent": 120814173, - "size_in_fields": 3900, + "mana_spent": 71125994, + "size_in_fields": 2490, "slot_number": 480, "timestamp": 1729039103 }, "fee_header": { - "eth_per_fee_asset": 12205897, - "excess_mana": 1316295211, - "mana_used": 120814173 + "eth_per_fee_asset": 10651944, + "excess_mana": 1031271822, + "mana_used": 71125994 }, "oracle_input": { - "fee_asset_price_modifier": 8 + "fee_asset_price_modifier": -55 }, "outputs": { - "eth_per_fee_asset_at_execution": 12196141, + "eth_per_fee_asset_at_execution": 10710854, "l1_fee_oracle_output": { "base_fee": 10495736507, "blob_fee": 1 @@ -37910,22 +37910,22 @@ "slot_of_change": 480 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64690562285235, - "congestion_multiplier": 4664895336, - "prover_cost": 15069672366038, - "sequencer_cost": 2581735485020 + "congestion_cost": 88898168530726, + "congestion_multiplier": 4996731730, + "prover_cost": 18323052111438, + "sequencer_cost": 3919663828860 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788975219, - "congestion_multiplier": 4664895336, - "prover_cost": 183791849, - "sequencer_cost": 31487210 + "congestion_cost": 952175304, + "congestion_multiplier": 4996731730, + "prover_cost": 196255536, + "sequencer_cost": 41982947 } }, "parent_fee_header": { - "eth_per_fee_asset": 12196141, - "excess_mana": 1317909865, - "mana_used": 98385346 + "eth_per_fee_asset": 10710854, + "excess_mana": 1023942845, + "mana_used": 82328977 } }, { @@ -37933,21 +37933,21 @@ "blobs_needed": 1, "block_number": 481, "l1_block_number": 20974596, - "mana_spent": 88048088, - "size_in_fields": 3180, + "mana_spent": 72282478, + "size_in_fields": 2625, "slot_number": 481, "timestamp": 1729039139 }, "fee_header": { - "eth_per_fee_asset": 12247397, - "excess_mana": 1337109384, - "mana_used": 88048088 + "eth_per_fee_asset": 10596553, + "excess_mana": 1027397816, + "mana_used": 72282478 }, "oracle_input": { - "fee_asset_price_modifier": 34 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 12205897, + "eth_per_fee_asset_at_execution": 10651944, "l1_fee_oracle_output": { "base_fee": 10495736507, "blob_fee": 1 @@ -37964,22 +37964,22 @@ "slot_of_change": 480 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66667089030819, - "congestion_multiplier": 4779892136, - "prover_cost": 15057627391089, - "sequencer_cost": 2579671940539 + "congestion_cost": 88716462835329, + "congestion_multiplier": 4966625300, + "prover_cost": 18424386759826, + "sequencer_cost": 3941341317604 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 813731622, - "congestion_multiplier": 4779892136, - "prover_cost": 183791849, - "sequencer_cost": 31487210 + "congestion_cost": 945002794, + "congestion_multiplier": 4966625300, + "prover_cost": 196255536, + "sequencer_cost": 41982947 } }, "parent_fee_header": { - "eth_per_fee_asset": 12205897, - "excess_mana": 1316295211, - "mana_used": 120814173 + "eth_per_fee_asset": 10651944, + "excess_mana": 1031271822, + "mana_used": 71125994 } }, { @@ -37987,21 +37987,21 @@ "blobs_needed": 1, "block_number": 482, "l1_block_number": 20974599, - "mana_spent": 98552656, - "size_in_fields": 3705, + "mana_spent": 89619461, + "size_in_fields": 3030, "slot_number": 482, "timestamp": 1729039175 }, "fee_header": { - "eth_per_fee_asset": 12175137, - "excess_mana": 1325157472, - "mana_used": 98552656 + "eth_per_fee_asset": 10598672, + "excess_mana": 1024680294, + "mana_used": 89619461 }, "oracle_input": { - "fee_asset_price_modifier": -59 + "fee_asset_price_modifier": 2 }, "outputs": { - "eth_per_fee_asset_at_execution": 12247397, + "eth_per_fee_asset_at_execution": 10596553, "l1_fee_oracle_output": { "base_fee": 10495736507, "blob_fee": 1 @@ -38018,22 +38018,22 @@ "slot_of_change": 480 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65274469995543, - "congestion_multiplier": 4713516552, - "prover_cost": 15006604995331, - "sequencer_cost": 2570930786355 + "congestion_cost": 88707833198211, + "congestion_multiplier": 4945614682, + "prover_cost": 18520695928195, + "sequencer_cost": 3961943756616 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799442348, - "congestion_multiplier": 4713516552, - "prover_cost": 183791849, - "sequencer_cost": 31487210 + "congestion_cost": 939997256, + "congestion_multiplier": 4945614682, + "prover_cost": 196255536, + "sequencer_cost": 41982947 } }, "parent_fee_header": { - "eth_per_fee_asset": 12247397, - "excess_mana": 1337109384, - "mana_used": 88048088 + "eth_per_fee_asset": 10596553, + "excess_mana": 1027397816, + "mana_used": 72282478 } }, { @@ -38041,21 +38041,21 @@ "blobs_needed": 1, "block_number": 483, "l1_block_number": 20974602, - "mana_spent": 97198060, - "size_in_fields": 3645, + "mana_spent": 78979888, + "size_in_fields": 2565, "slot_number": 483, "timestamp": 1729039211 }, "fee_header": { - "eth_per_fee_asset": 12189747, - "excess_mana": 1323710128, - "mana_used": 97198060 + "eth_per_fee_asset": 10605031, + "excess_mana": 1039299755, + "mana_used": 78979888 }, "oracle_input": { - "fee_asset_price_modifier": 12 + "fee_asset_price_modifier": 6 }, "outputs": { - "eth_per_fee_asset_at_execution": 12175137, + "eth_per_fee_asset_at_execution": 10598672, "l1_fee_oracle_output": { "base_fee": 10495736507, "blob_fee": 1 @@ -38072,22 +38072,22 @@ "slot_of_change": 485 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65520862804255, - "congestion_multiplier": 4705541473, - "prover_cost": 15095669888561, - "sequencer_cost": 2586189379225 + "congestion_cost": 91254572648347, + "congestion_multiplier": 5059702162, + "prover_cost": 18516993072340, + "sequencer_cost": 3961151642395 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797725481, - "congestion_multiplier": 4705541473, - "prover_cost": 183791849, - "sequencer_cost": 31487210 + "congestion_cost": 967177284, + "congestion_multiplier": 5059702162, + "prover_cost": 196255536, + "sequencer_cost": 41982947 } }, "parent_fee_header": { - "eth_per_fee_asset": 12175137, - "excess_mana": 1325157472, - "mana_used": 98552656 + "eth_per_fee_asset": 10598672, + "excess_mana": 1024680294, + "mana_used": 89619461 } }, { @@ -38095,21 +38095,21 @@ "blobs_needed": 1, "block_number": 484, "l1_block_number": 20974605, - "mana_spent": 106323745, - "size_in_fields": 3795, + "mana_spent": 54712049, + "size_in_fields": 2085, "slot_number": 484, "timestamp": 1729039247 }, "fee_header": { - "eth_per_fee_asset": 12277513, - "excess_mana": 1320908188, - "mana_used": 106323745 + "eth_per_fee_asset": 10599728, + "excess_mana": 1043279643, + "mana_used": 54712049 }, "oracle_input": { - "fee_asset_price_modifier": 72 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12189747, + "eth_per_fee_asset_at_execution": 10605031, "l1_fee_oracle_output": { "base_fee": 10495736507, "blob_fee": 1 @@ -38126,22 +38126,22 @@ "slot_of_change": 485 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65170344880825, - "congestion_multiplier": 4690140696, - "prover_cost": 15077576999753, - "sequencer_cost": 2583089706456 + "congestion_cost": 91907750198939, + "congestion_multiplier": 5091213677, + "prover_cost": 18505889893203, + "sequencer_cost": 3958776452422 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794410016, - "congestion_multiplier": 4690140696, - "prover_cost": 183791849, - "sequencer_cost": 31487210 + "congestion_cost": 974684540, + "congestion_multiplier": 5091213677, + "prover_cost": 196255536, + "sequencer_cost": 41982947 } }, "parent_fee_header": { - "eth_per_fee_asset": 12189747, - "excess_mana": 1323710128, - "mana_used": 97198060 + "eth_per_fee_asset": 10605031, + "excess_mana": 1039299755, + "mana_used": 78979888 } }, { @@ -38149,21 +38149,21 @@ "blobs_needed": 1, "block_number": 485, "l1_block_number": 20974608, - "mana_spent": 98458043, - "size_in_fields": 3555, + "mana_spent": 78204166, + "size_in_fields": 2805, "slot_number": 485, "timestamp": 1729039283 }, "fee_header": { - "eth_per_fee_asset": 12300840, - "excess_mana": 1327231933, - "mana_used": 98458043 + "eth_per_fee_asset": 10552029, + "excess_mana": 1022991692, + "mana_used": 78204166 }, "oracle_input": { - "fee_asset_price_modifier": 19 + "fee_asset_price_modifier": -45 }, "outputs": { - "eth_per_fee_asset_at_execution": 12277513, + "eth_per_fee_asset_at_execution": 10599728, "l1_fee_oracle_output": { "base_fee": 9236581399, "blob_fee": 1 @@ -38180,22 +38180,22 @@ "slot_of_change": 485 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64049740285350, - "congestion_multiplier": 4724970714, - "prover_cost": 14937745372374, - "sequencer_cost": 2256950980219 + "congestion_cost": 85819460461627, + "congestion_multiplier": 4932603993, + "prover_cost": 18336961476748, + "sequencer_cost": 3485591894434 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 786371519, - "congestion_multiplier": 4724970714, - "prover_cost": 183398363, - "sequencer_cost": 27709745 + "congestion_cost": 909662938, + "congestion_multiplier": 4932603993, + "prover_cost": 194366804, + "sequencer_cost": 36946326 } }, "parent_fee_header": { - "eth_per_fee_asset": 12277513, - "excess_mana": 1320908188, - "mana_used": 106323745 + "eth_per_fee_asset": 10599728, + "excess_mana": 1043279643, + "mana_used": 54712049 } }, { @@ -38203,21 +38203,21 @@ "blobs_needed": 1, "block_number": 486, "l1_block_number": 20974611, - "mana_spent": 97319136, - "size_in_fields": 3510, + "mana_spent": 74878288, + "size_in_fields": 2370, "slot_number": 486, "timestamp": 1729039319 }, "fee_header": { - "eth_per_fee_asset": 12245486, - "excess_mana": 1325689976, - "mana_used": 97319136 + "eth_per_fee_asset": 10556249, + "excess_mana": 1026195858, + "mana_used": 74878288 }, "oracle_input": { - "fee_asset_price_modifier": -45 + "fee_asset_price_modifier": 4 }, "outputs": { - "eth_per_fee_asset_at_execution": 12300840, + "eth_per_fee_asset_at_execution": 10552029, "l1_fee_oracle_output": { "base_fee": 9236581399, "blob_fee": 1 @@ -38234,22 +38234,22 @@ "slot_of_change": 485 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63782115611617, - "congestion_multiplier": 4716454127, - "prover_cost": 14909417812117, - "sequencer_cost": 2252670955805 + "congestion_cost": 86749229271452, + "congestion_multiplier": 4957321333, + "prover_cost": 18419851196391, + "sequencer_cost": 3501348034582 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784573599, - "congestion_multiplier": 4716454127, - "prover_cost": 183398363, - "sequencer_cost": 27709745 + "congestion_cost": 915380383, + "congestion_multiplier": 4957321333, + "prover_cost": 194366804, + "sequencer_cost": 36946326 } }, "parent_fee_header": { - "eth_per_fee_asset": 12300840, - "excess_mana": 1327231933, - "mana_used": 98458043 + "eth_per_fee_asset": 10552029, + "excess_mana": 1022991692, + "mana_used": 78204166 } }, { @@ -38257,21 +38257,21 @@ "blobs_needed": 1, "block_number": 487, "l1_block_number": 20974614, - "mana_spent": 52258270, - "size_in_fields": 1905, + "mana_spent": 71394604, + "size_in_fields": 2535, "slot_number": 487, "timestamp": 1729039355 }, "fee_header": { - "eth_per_fee_asset": 12320183, - "excess_mana": 1323009112, - "mana_used": 52258270 + "eth_per_fee_asset": 10543581, + "excess_mana": 1026074146, + "mana_used": 71394604 }, "oracle_input": { - "fee_asset_price_modifier": 61 + "fee_asset_price_modifier": -12 }, "outputs": { - "eth_per_fee_asset_at_execution": 12245486, + "eth_per_fee_asset_at_execution": 10556249, "l1_fee_oracle_output": { "base_fee": 9236581399, "blob_fee": 1 @@ -38288,44 +38288,44 @@ "slot_of_change": 485 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63815795142798, - "congestion_multiplier": 4701683623, - "prover_cost": 14976813741815, - "sequencer_cost": 2262853838550 + "congestion_cost": 86693927075802, + "congestion_multiplier": 4956380172, + "prover_cost": 18412487617524, + "sequencer_cost": 3499948324448 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781455426, - "congestion_multiplier": 4701683623, - "prover_cost": 183398363, - "sequencer_cost": 27709745 + "congestion_cost": 915162681, + "congestion_multiplier": 4956380172, + "prover_cost": 194366804, + "sequencer_cost": 36946326 } }, "parent_fee_header": { - "eth_per_fee_asset": 12245486, - "excess_mana": 1325689976, - "mana_used": 97319136 + "eth_per_fee_asset": 10556249, + "excess_mana": 1026195858, + "mana_used": 74878288 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 488, "l1_block_number": 20974617, - "mana_spent": 142231196, - "size_in_fields": 4710, + "mana_spent": 74416273, + "size_in_fields": 2595, "slot_number": 488, "timestamp": 1729039403 }, "fee_header": { - "eth_per_fee_asset": 12286918, - "excess_mana": 1275267382, - "mana_used": 142231196 + "eth_per_fee_asset": 10541472, + "excess_mana": 1022468750, + "mana_used": 74416273 }, "oracle_input": { - "fee_asset_price_modifier": -27 + "fee_asset_price_modifier": -2 }, "outputs": { - "eth_per_fee_asset_at_execution": 12320183, + "eth_per_fee_asset_at_execution": 10543581, "l1_fee_oracle_output": { "base_fee": 9236581399, "blob_fee": 1 @@ -38342,22 +38342,22 @@ "slot_of_change": 490 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 59052126092608, - "congestion_multiplier": 4446257976, - "prover_cost": 14886009647747, - "sequencer_cost": 2249134205231 + "congestion_cost": 86188224095780, + "congestion_multiplier": 4928581668, + "prover_cost": 18434610024811, + "sequencer_cost": 3504153474992 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 727533000, - "congestion_multiplier": 4446257976, - "prover_cost": 183398363, - "sequencer_cost": 27709745 + "congestion_cost": 908732522, + "congestion_multiplier": 4928581668, + "prover_cost": 194366804, + "sequencer_cost": 36946326 } }, "parent_fee_header": { - "eth_per_fee_asset": 12320183, - "excess_mana": 1323009112, - "mana_used": 52258270 + "eth_per_fee_asset": 10543581, + "excess_mana": 1026074146, + "mana_used": 71394604 } }, { @@ -38365,21 +38365,21 @@ "blobs_needed": 1, "block_number": 489, "l1_block_number": 20974619, - "mana_spent": 109309983, - "size_in_fields": 3855, + "mana_spent": 74929234, + "size_in_fields": 2715, "slot_number": 489, "timestamp": 1729039427 }, "fee_header": { - "eth_per_fee_asset": 12302890, - "excess_mana": 1317498578, - "mana_used": 109309983 + "eth_per_fee_asset": 10546742, + "excess_mana": 1021885023, + "mana_used": 74929234 }, "oracle_input": { - "fee_asset_price_modifier": 13 + "fee_asset_price_modifier": 5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12286918, + "eth_per_fee_asset_at_execution": 10541472, "l1_fee_oracle_output": { "base_fee": 9236581399, "blob_fee": 1 @@ -38396,22 +38396,22 @@ "slot_of_change": 490 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63081452240505, - "congestion_multiplier": 4671467852, - "prover_cost": 14926311301175, - "sequencer_cost": 2255223401019 + "congestion_cost": 86107030593071, + "congestion_multiplier": 4924095674, + "prover_cost": 18438298180748, + "sequencer_cost": 3504854540239 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 775076631, - "congestion_multiplier": 4671467852, - "prover_cost": 183398363, - "sequencer_cost": 27709745 + "congestion_cost": 907694852, + "congestion_multiplier": 4924095674, + "prover_cost": 194366804, + "sequencer_cost": 36946326 } }, "parent_fee_header": { - "eth_per_fee_asset": 12286918, - "excess_mana": 1275267382, - "mana_used": 142231196 + "eth_per_fee_asset": 10541472, + "excess_mana": 1022468750, + "mana_used": 74416273 } }, { @@ -38419,21 +38419,21 @@ "blobs_needed": 1, "block_number": 490, "l1_block_number": 20974622, - "mana_spent": 109642796, - "size_in_fields": 3645, + "mana_spent": 88583451, + "size_in_fields": 3135, "slot_number": 490, "timestamp": 1729039463 }, "fee_header": { - "eth_per_fee_asset": 12289356, - "excess_mana": 1326808561, - "mana_used": 109642796 + "eth_per_fee_asset": 10506664, + "excess_mana": 1021814257, + "mana_used": 88583451 }, "oracle_input": { - "fee_asset_price_modifier": -11 + "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 12302890, + "eth_per_fee_asset_at_execution": 10546742, "l1_fee_oracle_output": { "base_fee": 9095358037, "blob_fee": 1 @@ -38450,22 +38450,22 @@ "slot_of_change": 490 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63735926355515, - "congestion_multiplier": 4722630802, - "prover_cost": 14903346368212, - "sequencer_cost": 2217858974599 + "congestion_cost": 85763128177404, + "congestion_multiplier": 4923552109, + "prover_cost": 18408999575414, + "sequencer_cost": 3449542332600 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784136091, - "congestion_multiplier": 4722630802, - "prover_cost": 183354231, - "sequencer_cost": 27286075 + "congestion_cost": 904521586, + "congestion_multiplier": 4923552109, + "prover_cost": 194154969, + "sequencer_cost": 36381433 } }, "parent_fee_header": { - "eth_per_fee_asset": 12302890, - "excess_mana": 1317498578, - "mana_used": 109309983 + "eth_per_fee_asset": 10546742, + "excess_mana": 1021885023, + "mana_used": 74929234 } }, { @@ -38473,21 +38473,21 @@ "blobs_needed": 1, "block_number": 491, "l1_block_number": 20974625, - "mana_spent": 93734472, - "size_in_fields": 3315, + "mana_spent": 74098669, + "size_in_fields": 2445, "slot_number": 491, "timestamp": 1729039499 }, "fee_header": { - "eth_per_fee_asset": 12229138, - "excess_mana": 1336451357, - "mana_used": 93734472 + "eth_per_fee_asset": 10473042, + "excess_mana": 1035397708, + "mana_used": 74098669 }, "oracle_input": { - "fee_asset_price_modifier": -49 + "fee_asset_price_modifier": -32 }, "outputs": { - "eth_per_fee_asset_at_execution": 12289356, + "eth_per_fee_asset_at_execution": 10506664, "l1_fee_oracle_output": { "base_fee": 9095358037, "blob_fee": 1 @@ -38504,22 +38504,22 @@ "slot_of_change": 490 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64724528933819, - "congestion_multiplier": 4776213553, - "prover_cost": 14919759098850, - "sequencer_cost": 2220301454365 + "congestion_cost": 88403923167240, + "congestion_multiplier": 5028996328, + "prover_cost": 18479221282798, + "sequencer_cost": 3462700720229 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 795422778, - "congestion_multiplier": 4776213553, - "prover_cost": 183354231, - "sequencer_cost": 27286075 + "congestion_cost": 928830317, + "congestion_multiplier": 5028996328, + "prover_cost": 194154969, + "sequencer_cost": 36381433 } }, "parent_fee_header": { - "eth_per_fee_asset": 12289356, - "excess_mana": 1326808561, - "mana_used": 109642796 + "eth_per_fee_asset": 10506664, + "excess_mana": 1021814257, + "mana_used": 88583451 } }, { @@ -38527,21 +38527,21 @@ "blobs_needed": 1, "block_number": 492, "l1_block_number": 20974628, - "mana_spent": 105366277, - "size_in_fields": 3510, + "mana_spent": 63738491, + "size_in_fields": 2220, "slot_number": 492, "timestamp": 1729039535 }, "fee_header": { - "eth_per_fee_asset": 12208348, - "excess_mana": 1330185829, - "mana_used": 105366277 + "eth_per_fee_asset": 10539022, + "excess_mana": 1034496377, + "mana_used": 63738491 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": 63 }, "outputs": { - "eth_per_fee_asset_at_execution": 12229138, + "eth_per_fee_asset_at_execution": 10473042, "l1_fee_oracle_output": { "base_fee": 9095358037, "blob_fee": 1 @@ -38558,22 +38558,22 @@ "slot_of_change": 490 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64442369527599, - "congestion_multiplier": 4741328739, - "prover_cost": 14993226096558, - "sequencer_cost": 2231234531821 + "congestion_cost": 88532186159475, + "congestion_multiplier": 5021930144, + "prover_cost": 18538545820785, + "sequencer_cost": 3473817158377 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788074630, - "congestion_multiplier": 4741328739, - "prover_cost": 183354231, - "sequencer_cost": 27286075 + "congestion_cost": 927201304, + "congestion_multiplier": 5021930144, + "prover_cost": 194154969, + "sequencer_cost": 36381433 } }, "parent_fee_header": { - "eth_per_fee_asset": 12229138, - "excess_mana": 1336451357, - "mana_used": 93734472 + "eth_per_fee_asset": 10473042, + "excess_mana": 1035397708, + "mana_used": 74098669 } }, { @@ -38581,21 +38581,21 @@ "blobs_needed": 1, "block_number": 493, "l1_block_number": 20974631, - "mana_spent": 8458152, - "size_in_fields": 330, + "mana_spent": 70567276, + "size_in_fields": 2445, "slot_number": 493, "timestamp": 1729039571 }, "fee_header": { - "eth_per_fee_asset": 12135097, - "excess_mana": 1335552106, - "mana_used": 8458152 + "eth_per_fee_asset": 10533752, + "excess_mana": 1023234868, + "mana_used": 70567276 }, "oracle_input": { - "fee_asset_price_modifier": -60 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12208348, + "eth_per_fee_asset_at_execution": 10539022, "l1_fee_oracle_output": { "base_fee": 9095358037, "blob_fee": 1 @@ -38612,44 +38612,44 @@ "slot_of_change": 495 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65067348342299, - "congestion_multiplier": 4771191028, - "prover_cost": 15018758557669, - "sequencer_cost": 2235034174977 + "congestion_cost": 86064896439158, + "congestion_multiplier": 4934475554, + "prover_cost": 18422484458236, + "sequencer_cost": 3452069176818 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794364832, - "congestion_multiplier": 4771191028, - "prover_cost": 183354231, - "sequencer_cost": 27286075 + "congestion_cost": 907039837, + "congestion_multiplier": 4934475554, + "prover_cost": 194154969, + "sequencer_cost": 36381433 } }, "parent_fee_header": { - "eth_per_fee_asset": 12208348, - "excess_mana": 1330185829, - "mana_used": 105366277 + "eth_per_fee_asset": 10539022, + "excess_mana": 1034496377, + "mana_used": 63738491 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 494, "l1_block_number": 20974634, - "mana_spent": 152572809, - "size_in_fields": 5640, + "mana_spent": 85564821, + "size_in_fields": 2835, "slot_number": 494, "timestamp": 1729039607 }, "fee_header": { - "eth_per_fee_asset": 12152086, - "excess_mana": 1244010258, - "mana_used": 152572809 + "eth_per_fee_asset": 10601168, + "excess_mana": 1018802144, + "mana_used": 85564821 }, "oracle_input": { - "fee_asset_price_modifier": 14 + "fee_asset_price_modifier": 64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12135097, + "eth_per_fee_asset_at_execution": 10533752, "l1_fee_oracle_output": { "base_fee": 9095358037, "blob_fee": 1 @@ -38666,44 +38666,44 @@ "slot_of_change": 495 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 57048471553215, - "congestion_multiplier": 4286591963, - "prover_cost": 15109416183489, - "sequencer_cost": 2248525495924 + "congestion_cost": 85363750447135, + "congestion_multiplier": 4900471118, + "prover_cost": 18431701164030, + "sequencer_cost": 3453796235188 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 692288736, - "congestion_multiplier": 4286591963, - "prover_cost": 183354231, - "sequencer_cost": 27286075 + "congestion_cost": 899200577, + "congestion_multiplier": 4900471118, + "prover_cost": 194154969, + "sequencer_cost": 36381433 } }, "parent_fee_header": { - "eth_per_fee_asset": 12135097, - "excess_mana": 1335552106, - "mana_used": 8458152 + "eth_per_fee_asset": 10533752, + "excess_mana": 1023234868, + "mana_used": 70567276 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 495, "l1_block_number": 20974637, - "mana_spent": 132752180, - "size_in_fields": 4635, + "mana_spent": 72726096, + "size_in_fields": 2700, "slot_number": 495, "timestamp": 1729039643 }, "fee_header": { - "eth_per_fee_asset": 12098616, - "excess_mana": 1296583067, - "mana_used": 132752180 + "eth_per_fee_asset": 10607528, + "excess_mana": 1029366965, + "mana_used": 72726096 }, "oracle_input": { - "fee_asset_price_modifier": -44 + "fee_asset_price_modifier": 6 }, "outputs": { - "eth_per_fee_asset_at_execution": 12152086, + "eth_per_fee_asset_at_execution": 10601168, "l1_fee_oracle_output": { "base_fee": 9986090744, "blob_fee": 1 @@ -38720,22 +38720,22 @@ "slot_of_change": 495 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62546579163446, - "congestion_multiplier": 4558539055, - "prover_cost": 15111198604092, - "sequencer_cost": 2465278224661 + "congestion_cost": 88431921841066, + "congestion_multiplier": 4981905597, + "prover_cost": 18440521648181, + "sequencer_cost": 3767920949843 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 760071409, - "congestion_multiplier": 4558539055, - "prover_cost": 183632585, - "sequencer_cost": 29958273 + "congestion_cost": 937481660, + "congestion_multiplier": 4981905597, + "prover_cost": 195491068, + "sequencer_cost": 39944363 } }, "parent_fee_header": { - "eth_per_fee_asset": 12152086, - "excess_mana": 1244010258, - "mana_used": 152572809 + "eth_per_fee_asset": 10601168, + "excess_mana": 1018802144, + "mana_used": 85564821 } }, { @@ -38743,21 +38743,21 @@ "blobs_needed": 1, "block_number": 496, "l1_block_number": 20974640, - "mana_spent": 95306463, - "size_in_fields": 3075, + "mana_spent": 84637730, + "size_in_fields": 2850, "slot_number": 496, "timestamp": 1729039679 }, "fee_header": { - "eth_per_fee_asset": 12219602, - "excess_mana": 1329335247, - "mana_used": 95306463 + "eth_per_fee_asset": 10640411, + "excess_mana": 1027093061, + "mana_used": 84637730 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 31 }, "outputs": { - "eth_per_fee_asset_at_execution": 12098616, + "eth_per_fee_asset_at_execution": 10607528, "l1_fee_oracle_output": { "base_fee": 9986090744, "blob_fee": 1 @@ -38774,22 +38774,22 @@ "slot_of_change": 495 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65966742972916, - "congestion_multiplier": 4736612606, - "prover_cost": 15177982754392, - "sequencer_cost": 2476173555720 + "congestion_cost": 87987356997785, + "congestion_multiplier": 4964264639, + "prover_cost": 18429465187366, + "sequencer_cost": 3765661801695 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798106292, - "congestion_multiplier": 4736612606, - "prover_cost": 183632585, - "sequencer_cost": 29958273 + "congestion_cost": 933328353, + "congestion_multiplier": 4964264639, + "prover_cost": 195491068, + "sequencer_cost": 39944363 } }, "parent_fee_header": { - "eth_per_fee_asset": 12098616, - "excess_mana": 1296583067, - "mana_used": 132752180 + "eth_per_fee_asset": 10607528, + "excess_mana": 1029366965, + "mana_used": 72726096 } }, { @@ -38797,21 +38797,21 @@ "blobs_needed": 1, "block_number": 497, "l1_block_number": 20974643, - "mana_spent": 97665701, - "size_in_fields": 3555, + "mana_spent": 59249651, + "size_in_fields": 2070, "slot_number": 497, "timestamp": 1729039715 }, "fee_header": { - "eth_per_fee_asset": 12234265, - "excess_mana": 1324641710, - "mana_used": 97665701 + "eth_per_fee_asset": 10660627, + "excess_mana": 1036730791, + "mana_used": 59249651 }, "oracle_input": { - "fee_asset_price_modifier": 12 + "fee_asset_price_modifier": 19 }, "outputs": { - "eth_per_fee_asset_at_execution": 12219602, + "eth_per_fee_asset_at_execution": 10640411, "l1_fee_oracle_output": { "base_fee": 9986090744, "blob_fee": 1 @@ -38828,22 +38828,22 @@ "slot_of_change": 495 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64860201338800, - "congestion_multiplier": 4710673078, - "prover_cost": 15027705894186, - "sequencer_cost": 2451657017962 + "congestion_cost": 89379377732684, + "congestion_multiplier": 5039465558, + "prover_cost": 18372510986653, + "sequencer_cost": 3754024445109 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 792565846, - "congestion_multiplier": 4710673078, - "prover_cost": 183632585, - "sequencer_cost": 29958273 + "congestion_cost": 951033314, + "congestion_multiplier": 5039465558, + "prover_cost": 195491068, + "sequencer_cost": 39944363 } }, "parent_fee_header": { - "eth_per_fee_asset": 12219602, - "excess_mana": 1329335247, - "mana_used": 95306463 + "eth_per_fee_asset": 10640411, + "excess_mana": 1027093061, + "mana_used": 84637730 } }, { @@ -38851,21 +38851,21 @@ "blobs_needed": 1, "block_number": 498, "l1_block_number": 20974646, - "mana_spent": 84791582, - "size_in_fields": 3150, + "mana_spent": 89648228, + "size_in_fields": 2925, "slot_number": 498, "timestamp": 1729039751 }, "fee_header": { - "eth_per_fee_asset": 12188998, - "excess_mana": 1322307411, - "mana_used": 84791582 + "eth_per_fee_asset": 10700071, + "excess_mana": 1020980442, + "mana_used": 89648228 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": 37 }, "outputs": { - "eth_per_fee_asset_at_execution": 12234265, + "eth_per_fee_asset_at_execution": 10660627, "l1_fee_oracle_output": { "base_fee": 9986090744, "blob_fee": 1 @@ -38882,22 +38882,22 @@ "slot_of_change": 500 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64558161115523, - "congestion_multiplier": 4697825171, - "prover_cost": 15009694901983, - "sequencer_cost": 2448718660255 + "congestion_cost": 86508641377285, + "congestion_multiplier": 4917151955, + "prover_cost": 18337670758015, + "sequencer_cost": 3746905599455 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789821651, - "congestion_multiplier": 4697825171, - "prover_cost": 183632585, - "sequencer_cost": 29958273 + "congestion_cost": 922236358, + "congestion_multiplier": 4917151955, + "prover_cost": 195491068, + "sequencer_cost": 39944363 } }, "parent_fee_header": { - "eth_per_fee_asset": 12234265, - "excess_mana": 1324641710, - "mana_used": 97665701 + "eth_per_fee_asset": 10660627, + "excess_mana": 1036730791, + "mana_used": 59249651 } }, { @@ -38905,21 +38905,21 @@ "blobs_needed": 1, "block_number": 499, "l1_block_number": 20974649, - "mana_spent": 103304554, - "size_in_fields": 3960, + "mana_spent": 69441129, + "size_in_fields": 2490, "slot_number": 499, "timestamp": 1729039787 }, "fee_header": { - "eth_per_fee_asset": 12168276, - "excess_mana": 1307098993, - "mana_used": 103304554 + "eth_per_fee_asset": 10606980, + "excess_mana": 1035628670, + "mana_used": 69441129 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": -87 }, "outputs": { - "eth_per_fee_asset_at_execution": 12188998, + "eth_per_fee_asset_at_execution": 10700071, "l1_fee_oracle_output": { "base_fee": 9986090744, "blob_fee": 1 @@ -38936,22 +38936,22 @@ "slot_of_change": 500 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63346059454600, - "congestion_multiplier": 4614972102, - "prover_cost": 15065437290252, - "sequencer_cost": 2457812611012 + "congestion_cost": 88690548034682, + "congestion_multiplier": 5030808605, + "prover_cost": 18270072039709, + "sequencer_cost": 3733093266391 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772124992, - "congestion_multiplier": 4614972102, - "prover_cost": 183632585, - "sequencer_cost": 29958273 + "congestion_cost": 948995161, + "congestion_multiplier": 5030808605, + "prover_cost": 195491068, + "sequencer_cost": 39944363 } }, "parent_fee_header": { - "eth_per_fee_asset": 12188998, - "excess_mana": 1322307411, - "mana_used": 84791582 + "eth_per_fee_asset": 10700071, + "excess_mana": 1020980442, + "mana_used": 89648228 } }, { @@ -38959,21 +38959,21 @@ "blobs_needed": 1, "block_number": 500, "l1_block_number": 20974652, - "mana_spent": 112995380, - "size_in_fields": 3990, + "mana_spent": 81725847, + "size_in_fields": 2835, "slot_number": 500, "timestamp": 1729039823 }, "fee_header": { - "eth_per_fee_asset": 12244936, - "excess_mana": 1310403547, - "mana_used": 112995380 + "eth_per_fee_asset": 10556066, + "excess_mana": 1030069799, + "mana_used": 81725847 }, "oracle_input": { - "fee_asset_price_modifier": 63 + "fee_asset_price_modifier": -48 }, "outputs": { - "eth_per_fee_asset_at_execution": 12168276, + "eth_per_fee_asset_at_execution": 10606980, "l1_fee_oracle_output": { "base_fee": 10629066393, "blob_fee": 1 @@ -38990,22 +38990,22 @@ "slot_of_change": 500 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64403611571599, - "congestion_multiplier": 4632849637, - "prover_cost": 15107605629590, - "sequencer_cost": 2620519126950 + "congestion_cost": 89834163824199, + "congestion_multiplier": 4987370859, + "prover_cost": 18521344529735, + "sequencer_cost": 4008329043706 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783680921, - "congestion_multiplier": 4632849637, - "prover_cost": 183833515, - "sequencer_cost": 31887200 + "congestion_cost": 952869179, + "congestion_multiplier": 4987370859, + "prover_cost": 196455531, + "sequencer_cost": 42516266 } }, "parent_fee_header": { - "eth_per_fee_asset": 12168276, - "excess_mana": 1307098993, - "mana_used": 103304554 + "eth_per_fee_asset": 10606980, + "excess_mana": 1035628670, + "mana_used": 69441129 } }, { @@ -39013,21 +39013,21 @@ "blobs_needed": 1, "block_number": 501, "l1_block_number": 20974655, - "mana_spent": 82862661, - "size_in_fields": 3000, + "mana_spent": 57361245, + "size_in_fields": 2205, "slot_number": 501, "timestamp": 1729039859 }, "fee_header": { - "eth_per_fee_asset": 12270650, - "excess_mana": 1323398927, - "mana_used": 82862661 + "eth_per_fee_asset": 10569788, + "excess_mana": 1036795646, + "mana_used": 57361245 }, "oracle_input": { - "fee_asset_price_modifier": 21 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 12244936, + "eth_per_fee_asset_at_execution": 10556066, "l1_fee_oracle_output": { "base_fee": 10629066393, "blob_fee": 1 @@ -39044,22 +39044,22 @@ "slot_of_change": 500 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65250853577349, - "congestion_multiplier": 4703828473, - "prover_cost": 15013023751207, - "sequencer_cost": 2604113243222 + "congestion_cost": 91458332299173, + "congestion_multiplier": 5039975446, + "prover_cost": 18610676647911, + "sequencer_cost": 4027662009692 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798992526, - "congestion_multiplier": 4703828473, - "prover_cost": 183833515, - "sequencer_cost": 31887200 + "congestion_cost": 965440192, + "congestion_multiplier": 5039975446, + "prover_cost": 196455531, + "sequencer_cost": 42516266 } }, "parent_fee_header": { - "eth_per_fee_asset": 12244936, - "excess_mana": 1310403547, - "mana_used": 112995380 + "eth_per_fee_asset": 10556066, + "excess_mana": 1030069799, + "mana_used": 81725847 } }, { @@ -39067,21 +39067,21 @@ "blobs_needed": 1, "block_number": 502, "l1_block_number": 20974658, - "mana_spent": 104538239, - "size_in_fields": 3645, + "mana_spent": 88905304, + "size_in_fields": 2640, "slot_number": 502, "timestamp": 1729039895 }, "fee_header": { - "eth_per_fee_asset": 12268195, - "excess_mana": 1306261588, - "mana_used": 104538239 + "eth_per_fee_asset": 10576129, + "excess_mana": 1019156891, + "mana_used": 88905304 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": 6 }, "outputs": { - "eth_per_fee_asset_at_execution": 12270650, + "eth_per_fee_asset_at_execution": 10569788, "l1_fee_oracle_output": { "base_fee": 10629066393, "blob_fee": 1 @@ -39098,22 +39098,22 @@ "slot_of_change": 500 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63472549946417, - "congestion_multiplier": 4610452734, - "prover_cost": 14981562916390, - "sequencer_cost": 2598656142911 + "congestion_cost": 88246883475809, + "congestion_multiplier": 4903183816, + "prover_cost": 18586515737118, + "sequencer_cost": 4022433184091 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778849445, - "congestion_multiplier": 4610452734, - "prover_cost": 183833515, - "sequencer_cost": 31887200 + "congestion_cost": 932750850, + "congestion_multiplier": 4903183816, + "prover_cost": 196455531, + "sequencer_cost": 42516266 } }, "parent_fee_header": { - "eth_per_fee_asset": 12270650, - "excess_mana": 1323398927, - "mana_used": 82862661 + "eth_per_fee_asset": 10569788, + "excess_mana": 1036795646, + "mana_used": 57361245 } }, { @@ -39121,21 +39121,21 @@ "blobs_needed": 1, "block_number": 503, "l1_block_number": 20974661, - "mana_spent": 99371031, - "size_in_fields": 3690, + "mana_spent": 68333585, + "size_in_fields": 2205, "slot_number": 503, "timestamp": 1729039931 }, "fee_header": { - "eth_per_fee_asset": 12265741, - "excess_mana": 1310799827, - "mana_used": 99371031 + "eth_per_fee_asset": 10520075, + "excess_mana": 1033062195, + "mana_used": 68333585 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": -53 }, "outputs": { - "eth_per_fee_asset_at_execution": 12268195, + "eth_per_fee_asset_at_execution": 10576129, "l1_fee_oracle_output": { "base_fee": 10629066393, "blob_fee": 1 @@ -39152,22 +39152,22 @@ "slot_of_change": 505 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63916851500975, - "congestion_multiplier": 4634998145, - "prover_cost": 14984560890987, - "sequencer_cost": 2599176162427 + "congestion_cost": 90623503457646, + "congestion_multiplier": 5010707019, + "prover_cost": 18575372047751, + "sequencer_cost": 4020021503142 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784144398, - "congestion_multiplier": 4634998145, - "prover_cost": 183833515, - "sequencer_cost": 31887200 + "congestion_cost": 958445863, + "congestion_multiplier": 5010707019, + "prover_cost": 196455531, + "sequencer_cost": 42516266 } }, "parent_fee_header": { - "eth_per_fee_asset": 12268195, - "excess_mana": 1306261588, - "mana_used": 104538239 + "eth_per_fee_asset": 10576129, + "excess_mana": 1019156891, + "mana_used": 88905304 } }, { @@ -39175,21 +39175,21 @@ "blobs_needed": 1, "block_number": 504, "l1_block_number": 20974664, - "mana_spent": 113778431, - "size_in_fields": 3765, + "mana_spent": 74532492, + "size_in_fields": 2625, "slot_number": 504, "timestamp": 1729039967 }, "fee_header": { - "eth_per_fee_asset": 12266967, - "excess_mana": 1310170858, - "mana_used": 113778431 + "eth_per_fee_asset": 10456954, + "excess_mana": 1026395780, + "mana_used": 74532492 }, "oracle_input": { - "fee_asset_price_modifier": 1 + "fee_asset_price_modifier": -60 }, "outputs": { - "eth_per_fee_asset_at_execution": 12265741, + "eth_per_fee_asset_at_execution": 10520075, "l1_fee_oracle_output": { "base_fee": 10629066393, "blob_fee": 1 @@ -39206,22 +39206,22 @@ "slot_of_change": 505 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63869673589228, - "congestion_multiplier": 4631588533, - "prover_cost": 14987558843775, - "sequencer_cost": 2599696178160 + "congestion_cost": 89928799652094, + "congestion_multiplier": 4958867655, + "prover_cost": 18674346998477, + "sequencer_cost": 4041441339535 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783408874, - "congestion_multiplier": 4631588533, - "prover_cost": 183833515, - "sequencer_cost": 31887200 + "congestion_cost": 946057717, + "congestion_multiplier": 4958867655, + "prover_cost": 196455531, + "sequencer_cost": 42516266 } }, "parent_fee_header": { - "eth_per_fee_asset": 12265741, - "excess_mana": 1310799827, - "mana_used": 99371031 + "eth_per_fee_asset": 10520075, + "excess_mana": 1033062195, + "mana_used": 68333585 } }, { @@ -39229,21 +39229,21 @@ "blobs_needed": 1, "block_number": 505, "l1_block_number": 20974667, - "mana_spent": 105012819, - "size_in_fields": 3615, + "mana_spent": 61700800, + "size_in_fields": 2295, "slot_number": 505, "timestamp": 1729040003 }, "fee_header": { - "eth_per_fee_asset": 12318488, - "excess_mana": 1323949289, - "mana_used": 105012819 + "eth_per_fee_asset": 10456954, + "excess_mana": 1025928272, + "mana_used": 61700800 }, "oracle_input": { - "fee_asset_price_modifier": 42 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 12266967, + "eth_per_fee_asset_at_execution": 10456954, "l1_fee_oracle_output": { "base_fee": 9964934916, "blob_fee": 1 @@ -39260,22 +39260,22 @@ "slot_of_change": 505 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64522166155661, - "congestion_multiplier": 4706858354, - "prover_cost": 14969142250077, - "sequencer_cost": 2437016827387 + "congestion_cost": 89007404450666, + "congestion_multiplier": 4955252409, + "prover_cost": 18691803942143, + "sequencer_cost": 3811792611883 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791491283, - "congestion_multiplier": 4706858354, - "prover_cost": 183625974, - "sequencer_cost": 29894805 + "congestion_cost": 930746334, + "congestion_multiplier": 4955252409, + "prover_cost": 195459334, + "sequencer_cost": 39859740 } }, "parent_fee_header": { - "eth_per_fee_asset": 12266967, - "excess_mana": 1310170858, - "mana_used": 113778431 + "eth_per_fee_asset": 10456954, + "excess_mana": 1026395780, + "mana_used": 74532492 } }, { @@ -39283,21 +39283,21 @@ "blobs_needed": 1, "block_number": 506, "l1_block_number": 20974670, - "mana_spent": 99660921, - "size_in_fields": 3450, + "mana_spent": 86691881, + "size_in_fields": 3015, "slot_number": 506, "timestamp": 1729040039 }, "fee_header": { - "eth_per_fee_asset": 12254431, - "excess_mana": 1328962108, - "mana_used": 99660921 + "eth_per_fee_asset": 10352384, + "excess_mana": 1012629072, + "mana_used": 86691881 }, "oracle_input": { - "fee_asset_price_modifier": -52 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12318488, + "eth_per_fee_asset_at_execution": 10456954, "l1_fee_oracle_output": { "base_fee": 9964934916, "blob_fee": 1 @@ -39314,22 +39314,22 @@ "slot_of_change": 505 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64732213563873, - "congestion_multiplier": 4734545182, - "prover_cost": 14906535120220, - "sequencer_cost": 2426824217388 + "congestion_cost": 86717746965321, + "congestion_multiplier": 4853506118, + "prover_cost": 18691803942143, + "sequencer_cost": 3811792611883 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797402996, - "congestion_multiplier": 4734545182, - "prover_cost": 183625974, - "sequencer_cost": 29894805 + "congestion_cost": 906803491, + "congestion_multiplier": 4853506118, + "prover_cost": 195459334, + "sequencer_cost": 39859740 } }, "parent_fee_header": { - "eth_per_fee_asset": 12318488, - "excess_mana": 1323949289, - "mana_used": 105012819 + "eth_per_fee_asset": 10456954, + "excess_mana": 1025928272, + "mana_used": 61700800 } }, { @@ -39337,21 +39337,21 @@ "blobs_needed": 1, "block_number": 507, "l1_block_number": 20974673, - "mana_spent": 92086893, - "size_in_fields": 3225, + "mana_spent": 87432255, + "size_in_fields": 2760, "slot_number": 507, "timestamp": 1729040075 }, "fee_header": { - "eth_per_fee_asset": 12248303, - "excess_mana": 1328623029, - "mana_used": 92086893 + "eth_per_fee_asset": 10389652, + "excess_mana": 1024320953, + "mana_used": 87432255 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 36 }, "outputs": { - "eth_per_fee_asset_at_execution": 12254431, + "eth_per_fee_asset_at_execution": 10352384, "l1_fee_oracle_output": { "base_fee": 9964934916, "blob_fee": 1 @@ -39368,22 +39368,22 @@ "slot_of_change": 505 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65037864181536, - "congestion_multiplier": 4732667254, - "prover_cost": 14984455337013, - "sequencer_cost": 2439509839339 + "congestion_cost": 89624397916461, + "congestion_multiplier": 4942843086, + "prover_cost": 18880610881513, + "sequencer_cost": 3850295738644 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797002019, - "congestion_multiplier": 4732667254, - "prover_cost": 183625974, - "sequencer_cost": 29894805 + "congestion_cost": 927826183, + "congestion_multiplier": 4942843086, + "prover_cost": 195459334, + "sequencer_cost": 39859740 } }, "parent_fee_header": { - "eth_per_fee_asset": 12254431, - "excess_mana": 1328962108, - "mana_used": 99660921 + "eth_per_fee_asset": 10352384, + "excess_mana": 1012629072, + "mana_used": 86691881 } }, { @@ -39391,21 +39391,21 @@ "blobs_needed": 1, "block_number": 508, "l1_block_number": 20974676, - "mana_spent": 101817229, - "size_in_fields": 3360, + "mana_spent": 59785102, + "size_in_fields": 2250, "slot_number": 508, "timestamp": 1729040111 }, "fee_header": { - "eth_per_fee_asset": 12165014, - "excess_mana": 1320709922, - "mana_used": 101817229 + "eth_per_fee_asset": 10446795, + "excess_mana": 1036753208, + "mana_used": 59785102 }, "oracle_input": { - "fee_asset_price_modifier": -68 + "fee_asset_price_modifier": 55 }, "outputs": { - "eth_per_fee_asset_at_execution": 12248303, + "eth_per_fee_asset_at_execution": 10389652, "l1_fee_oracle_output": { "base_fee": 9964934916, "blob_fee": 1 @@ -39422,22 +39422,22 @@ "slot_of_change": 510 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64310087446400, - "congestion_multiplier": 4689052844, - "prover_cost": 14991952272899, - "sequencer_cost": 2440730360770 + "congestion_cost": 91495342288655, + "congestion_multiplier": 5039641794, + "prover_cost": 18812885551894, + "sequencer_cost": 3836484609880 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787689437, - "congestion_multiplier": 4689052844, - "prover_cost": 183625974, - "sequencer_cost": 29894805 + "congestion_cost": 950604766, + "congestion_multiplier": 5039641794, + "prover_cost": 195459334, + "sequencer_cost": 39859740 } }, "parent_fee_header": { - "eth_per_fee_asset": 12248303, - "excess_mana": 1328623029, - "mana_used": 92086893 + "eth_per_fee_asset": 10389652, + "excess_mana": 1024320953, + "mana_used": 87432255 } }, { @@ -39445,21 +39445,21 @@ "blobs_needed": 1, "block_number": 509, "l1_block_number": 20974679, - "mana_spent": 101211569, - "size_in_fields": 3540, + "mana_spent": 84304350, + "size_in_fields": 2640, "slot_number": 509, "timestamp": 1729040147 }, "fee_header": { - "eth_per_fee_asset": 12166230, - "excess_mana": 1322527151, - "mana_used": 101211569 + "eth_per_fee_asset": 10401873, + "excess_mana": 1021538310, + "mana_used": 84304350 }, "oracle_input": { - "fee_asset_price_modifier": 1 + "fee_asset_price_modifier": -43 }, "outputs": { - "eth_per_fee_asset_at_execution": 12165014, + "eth_per_fee_asset_at_execution": 10446795, "l1_fee_oracle_output": { "base_fee": 9964934916, "blob_fee": 1 @@ -39476,22 +39476,22 @@ "slot_of_change": 510 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64925567040038, - "congestion_multiplier": 4699033117, - "prover_cost": 15094596191998, - "sequencer_cost": 2457441068297 + "congestion_cost": 88332163405141, + "congestion_multiplier": 4921433088, + "prover_cost": 18709980812297, + "sequencer_cost": 3815499394791 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789820432, - "congestion_multiplier": 4699033117, - "prover_cost": 183625974, - "sequencer_cost": 29894805 + "congestion_cost": 922788003, + "congestion_multiplier": 4921433088, + "prover_cost": 195459334, + "sequencer_cost": 39859740 } }, "parent_fee_header": { - "eth_per_fee_asset": 12165014, - "excess_mana": 1320709922, - "mana_used": 101817229 + "eth_per_fee_asset": 10446795, + "excess_mana": 1036753208, + "mana_used": 59785102 } }, { @@ -39499,21 +39499,21 @@ "blobs_needed": 1, "block_number": 510, "l1_block_number": 20974682, - "mana_spent": 120103465, - "size_in_fields": 3945, + "mana_spent": 82821431, + "size_in_fields": 2655, "slot_number": 510, "timestamp": 1729040183 }, "fee_header": { - "eth_per_fee_asset": 12184479, - "excess_mana": 1323738720, - "mana_used": 120103465 + "eth_per_fee_asset": 10454922, + "excess_mana": 1030842660, + "mana_used": 82821431 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 12166230, + "eth_per_fee_asset_at_execution": 10401873, "l1_fee_oracle_output": { "base_fee": 9296854474, "blob_fee": 1 @@ -39530,22 +39530,22 @@ "slot_of_change": 510 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64362003841782, - "congestion_multiplier": 4705698888, - "prover_cost": 15075927300405, - "sequencer_cost": 2292457400526 + "congestion_cost": 88930790733554, + "congestion_multiplier": 4993387574, + "prover_cost": 18694442145180, + "sequencer_cost": 3575069412980 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783042942, - "congestion_multiplier": 4705698888, - "prover_cost": 183417199, - "sequencer_cost": 27890564 + "congestion_cost": 925046791, + "congestion_multiplier": 4993387574, + "prover_cost": 194457213, + "sequencer_cost": 37187418 } }, "parent_fee_header": { - "eth_per_fee_asset": 12166230, - "excess_mana": 1322527151, - "mana_used": 101211569 + "eth_per_fee_asset": 10401873, + "excess_mana": 1021538310, + "mana_used": 84304350 } }, { @@ -39553,21 +39553,21 @@ "blobs_needed": 1, "block_number": 511, "l1_block_number": 20974685, - "mana_spent": 85878152, - "size_in_fields": 3075, + "mana_spent": 69532411, + "size_in_fields": 2400, "slot_number": 511, "timestamp": 1729040219 }, "fee_header": { - "eth_per_fee_asset": 12178386, - "excess_mana": 1343842185, - "mana_used": 85878152 + "eth_per_fee_asset": 10467467, + "excess_mana": 1038664091, + "mana_used": 69532411 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 12 }, "outputs": { - "eth_per_fee_asset_at_execution": 12184479, + "eth_per_fee_asset_at_execution": 10454922, "l1_fee_oracle_output": { "base_fee": 9296854474, "blob_fee": 1 @@ -39584,22 +39584,22 @@ "slot_of_change": 510 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66207865350665, - "congestion_multiplier": 4817693842, - "prover_cost": 15053347705717, - "sequencer_cost": 2289023929542 + "congestion_cost": 89837737192110, + "congestion_multiplier": 5054687267, + "prover_cost": 18599585247982, + "sequencer_cost": 3556929262600 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 806708345, - "congestion_multiplier": 4817693842, - "prover_cost": 183417199, - "sequencer_cost": 27890564 + "congestion_cost": 939246535, + "congestion_multiplier": 5054687267, + "prover_cost": 194457213, + "sequencer_cost": 37187418 } }, "parent_fee_header": { - "eth_per_fee_asset": 12184479, - "excess_mana": 1323738720, - "mana_used": 120103465 + "eth_per_fee_asset": 10454922, + "excess_mana": 1030842660, + "mana_used": 82821431 } }, { @@ -39607,21 +39607,21 @@ "blobs_needed": 1, "block_number": 512, "l1_block_number": 20974688, - "mana_spent": 86755827, - "size_in_fields": 3345, + "mana_spent": 82940625, + "size_in_fields": 3150, "slot_number": 512, "timestamp": 1729040255 }, "fee_header": { - "eth_per_fee_asset": 12171078, - "excess_mana": 1329720337, - "mana_used": 86755827 + "eth_per_fee_asset": 10421410, + "excess_mana": 1033196502, + "mana_used": 82940625 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": -44 }, "outputs": { - "eth_per_fee_asset_at_execution": 12178386, + "eth_per_fee_asset_at_execution": 10467467, "l1_fee_oracle_output": { "base_fee": 9296854474, "blob_fee": 1 @@ -39638,22 +39638,22 @@ "slot_of_change": 510 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64871182848040, - "congestion_multiplier": 4738747193, - "prover_cost": 15060879085291, - "sequencer_cost": 2290169157063 + "congestion_cost": 88780023094413, + "congestion_multiplier": 5011756967, + "prover_cost": 18577294105633, + "sequencer_cost": 3552666370957 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790026305, - "congestion_multiplier": 4738747193, - "prover_cost": 183417199, - "sequencer_cost": 27890564 + "congestion_cost": 929301962, + "congestion_multiplier": 5011756967, + "prover_cost": 194457213, + "sequencer_cost": 37187418 } }, "parent_fee_header": { - "eth_per_fee_asset": 12178386, - "excess_mana": 1343842185, - "mana_used": 85878152 + "eth_per_fee_asset": 10467467, + "excess_mana": 1038664091, + "mana_used": 69532411 } }, { @@ -39661,21 +39661,21 @@ "blobs_needed": 1, "block_number": 513, "l1_block_number": 20974691, - "mana_spent": 105840695, - "size_in_fields": 3630, + "mana_spent": 71067344, + "size_in_fields": 2505, "slot_number": 513, "timestamp": 1729040291 }, "fee_header": { - "eth_per_fee_asset": 12135781, - "excess_mana": 1316476164, - "mana_used": 105840695 + "eth_per_fee_asset": 10435999, + "excess_mana": 1041137127, + "mana_used": 71067344 }, "oracle_input": { - "fee_asset_price_modifier": -29 + "fee_asset_price_modifier": 14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12171078, + "eth_per_fee_asset_at_execution": 10421410, "l1_fee_oracle_output": { "base_fee": 9296854474, "blob_fee": 1 @@ -39692,22 +39692,22 @@ "slot_of_change": 515 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63645106045661, - "congestion_multiplier": 4665883069, - "prover_cost": 15069922236963, - "sequencer_cost": 2291544265841 + "congestion_cost": 90560920547220, + "congestion_multiplier": 5074225592, + "prover_cost": 18659395705572, + "sequencer_cost": 3568367236296 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774629550, - "congestion_multiplier": 4665883069, - "prover_cost": 183417199, - "sequencer_cost": 27890564 + "congestion_cost": 943772483, + "congestion_multiplier": 5074225592, + "prover_cost": 194457213, + "sequencer_cost": 37187418 } }, "parent_fee_header": { - "eth_per_fee_asset": 12171078, - "excess_mana": 1329720337, - "mana_used": 86755827 + "eth_per_fee_asset": 10421410, + "excess_mana": 1033196502, + "mana_used": 82940625 } }, { @@ -39715,21 +39715,21 @@ "blobs_needed": 1, "block_number": 514, "l1_block_number": 20974694, - "mana_spent": 97653790, - "size_in_fields": 3330, + "mana_spent": 67570004, + "size_in_fields": 2400, "slot_number": 514, "timestamp": 1729040327 }, "fee_header": { - "eth_per_fee_asset": 12026558, - "excess_mana": 1322316859, - "mana_used": 97653790 + "eth_per_fee_asset": 10445391, + "excess_mana": 1037204471, + "mana_used": 67570004 }, "oracle_input": { - "fee_asset_price_modifier": -90 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 12135781, + "eth_per_fee_asset_at_execution": 10435999, "l1_fee_oracle_output": { "base_fee": 9296854474, "blob_fee": 1 @@ -39746,22 +39746,22 @@ "slot_of_change": 515 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64387297199909, - "congestion_multiplier": 4697877102, - "prover_cost": 15113753206325, - "sequencer_cost": 2298209237626 + "congestion_cost": 89745451393777, + "congestion_multiplier": 5043190801, + "prover_cost": 18633310811931, + "sequencer_cost": 3563378838960 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781390138, - "congestion_multiplier": 4697877102, - "prover_cost": 183417199, - "sequencer_cost": 27890564 + "congestion_cost": 936583441, + "congestion_multiplier": 5043190801, + "prover_cost": 194457213, + "sequencer_cost": 37187418 } }, "parent_fee_header": { - "eth_per_fee_asset": 12135781, - "excess_mana": 1316476164, - "mana_used": 105840695 + "eth_per_fee_asset": 10435999, + "excess_mana": 1041137127, + "mana_used": 71067344 } }, { @@ -39769,21 +39769,21 @@ "blobs_needed": 1, "block_number": 515, "l1_block_number": 20974697, - "mana_spent": 101938796, - "size_in_fields": 3855, + "mana_spent": 62534738, + "size_in_fields": 2400, "slot_number": 515, "timestamp": 1729040363 }, "fee_header": { - "eth_per_fee_asset": 12028963, - "excess_mana": 1319970649, - "mana_used": 101938796 + "eth_per_fee_asset": 10426589, + "excess_mana": 1029774475, + "mana_used": 62534738 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12026558, + "eth_per_fee_asset_at_execution": 10445391, "l1_fee_oracle_output": { "base_fee": 9351751903, "blob_fee": 1 @@ -39800,22 +39800,22 @@ "slot_of_change": 515 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64801496737471, - "congestion_multiplier": 4684998804, - "prover_cost": 15252439974929, - "sequencer_cost": 2332775179732 + "congestion_cost": 88491101864928, + "congestion_multiplier": 4985073679, + "prover_cost": 18624440099945, + "sequencer_cost": 3581197487007 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779338959, - "congestion_multiplier": 4684998804, - "prover_cost": 183434354, - "sequencer_cost": 28055256 + "congestion_cost": 924324159, + "congestion_multiplier": 4985073679, + "prover_cost": 194539559, + "sequencer_cost": 37407008 } }, "parent_fee_header": { - "eth_per_fee_asset": 12026558, - "excess_mana": 1322316859, - "mana_used": 97653790 + "eth_per_fee_asset": 10445391, + "excess_mana": 1037204471, + "mana_used": 67570004 } }, { @@ -39823,21 +39823,21 @@ "blobs_needed": 1, "block_number": 516, "l1_block_number": 20974700, - "mana_spent": 94279745, - "size_in_fields": 3375, + "mana_spent": 66577344, + "size_in_fields": 2685, "slot_number": 516, "timestamp": 1729040399 }, "fee_header": { - "eth_per_fee_asset": 12055426, - "excess_mana": 1321909445, - "mana_used": 94279745 + "eth_per_fee_asset": 10427631, + "excess_mana": 1017309213, + "mana_used": 66577344 }, "oracle_input": { - "fee_asset_price_modifier": 22 + "fee_asset_price_modifier": 1 }, "outputs": { - "eth_per_fee_asset_at_execution": 12028963, + "eth_per_fee_asset_at_execution": 10426589, "l1_fee_oracle_output": { "base_fee": 9351751903, "blob_fee": 1 @@ -39854,22 +39854,22 @@ "slot_of_change": 515 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64975600806155, - "congestion_multiplier": 4695638278, - "prover_cost": 15249390491932, - "sequencer_cost": 2332308778405 + "congestion_cost": 86515038139511, + "congestion_multiplier": 4889071337, + "prover_cost": 18658025074164, + "sequencer_cost": 3587655368405 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781589098, - "congestion_multiplier": 4695638278, - "prover_cost": 183434354, - "sequencer_cost": 28055256 + "congestion_cost": 902056745, + "congestion_multiplier": 4889071337, + "prover_cost": 194539559, + "sequencer_cost": 37407008 } }, "parent_fee_header": { - "eth_per_fee_asset": 12028963, - "excess_mana": 1319970649, - "mana_used": 101938796 + "eth_per_fee_asset": 10426589, + "excess_mana": 1029774475, + "mana_used": 62534738 } }, { @@ -39877,21 +39877,21 @@ "blobs_needed": 1, "block_number": 517, "l1_block_number": 20974703, - "mana_spent": 99884570, - "size_in_fields": 3585, + "mana_spent": 95733083, + "size_in_fields": 3135, "slot_number": 517, "timestamp": 1729040435 }, "fee_header": { - "eth_per_fee_asset": 11985504, - "excess_mana": 1316189190, - "mana_used": 99884570 + "eth_per_fee_asset": 10407818, + "excess_mana": 1008886557, + "mana_used": 95733083 }, "oracle_input": { - "fee_asset_price_modifier": -58 + "fee_asset_price_modifier": -19 }, "outputs": { - "eth_per_fee_asset_at_execution": 12055426, + "eth_per_fee_asset_at_execution": 10427631, "l1_fee_oracle_output": { "base_fee": 9351751903, "blob_fee": 1 @@ -39908,22 +39908,22 @@ "slot_of_change": 515 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64283494668708, - "congestion_multiplier": 4664316717, - "prover_cost": 15215916384872, - "sequencer_cost": 2327189101406 + "congestion_cost": 85086837748670, + "congestion_multiplier": 4825252337, + "prover_cost": 18656160637062, + "sequencer_cost": 3587296865415 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774964913, - "congestion_multiplier": 4664316717, - "prover_cost": 183434354, - "sequencer_cost": 28055256 + "congestion_cost": 887254147, + "congestion_multiplier": 4825252337, + "prover_cost": 194539559, + "sequencer_cost": 37407008 } }, "parent_fee_header": { - "eth_per_fee_asset": 12055426, - "excess_mana": 1321909445, - "mana_used": 94279745 + "eth_per_fee_asset": 10427631, + "excess_mana": 1017309213, + "mana_used": 66577344 } }, { @@ -39931,21 +39931,21 @@ "blobs_needed": 1, "block_number": 518, "l1_block_number": 20974706, - "mana_spent": 72647195, - "size_in_fields": 2520, + "mana_spent": 73235215, + "size_in_fields": 2430, "slot_number": 518, "timestamp": 1729040471 }, "fee_header": { - "eth_per_fee_asset": 12104160, - "excess_mana": 1316073760, - "mana_used": 72647195 + "eth_per_fee_asset": 10419266, + "excess_mana": 1029619640, + "mana_used": 73235215 }, "oracle_input": { - "fee_asset_price_modifier": 99 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 11985504, + "eth_per_fee_asset_at_execution": 10407818, "l1_fee_oracle_output": { "base_fee": 9351751903, "blob_fee": 1 @@ -39962,44 +39962,44 @@ "slot_of_change": 520 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64647402228559, - "congestion_multiplier": 4663686829, - "prover_cost": 15304684225211, - "sequencer_cost": 2340765644900 + "congestion_cost": 88783730076756, + "congestion_multiplier": 4983869717, + "prover_cost": 18691675719157, + "sequencer_cost": 3594125877298 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774831698, - "congestion_multiplier": 4663686829, - "prover_cost": 183434354, - "sequencer_cost": 28055256 + "congestion_cost": 924044904, + "congestion_multiplier": 4983869717, + "prover_cost": 194539559, + "sequencer_cost": 37407008 } }, "parent_fee_header": { - "eth_per_fee_asset": 11985504, - "excess_mana": 1316189190, - "mana_used": 99884570 + "eth_per_fee_asset": 10407818, + "excess_mana": 1008886557, + "mana_used": 95733083 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 519, "l1_block_number": 20974709, - "mana_spent": 128733934, - "size_in_fields": 4320, + "mana_spent": 76235549, + "size_in_fields": 2820, "slot_number": 519, "timestamp": 1729040507 }, "fee_header": { - "eth_per_fee_asset": 12170732, - "excess_mana": 1288720955, - "mana_used": 128733934 + "eth_per_fee_asset": 10502620, + "excess_mana": 1027854855, + "mana_used": 76235549 }, "oracle_input": { - "fee_asset_price_modifier": 55 + "fee_asset_price_modifier": 80 }, "outputs": { - "eth_per_fee_asset_at_execution": 12104160, + "eth_per_fee_asset_at_execution": 10419266, "l1_fee_oracle_output": { "base_fee": 9351751903, "blob_fee": 1 @@ -40016,22 +40016,22 @@ "slot_of_change": 520 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 61447172790182, - "congestion_multiplier": 4516798825, - "prover_cost": 15154653771927, - "sequencer_cost": 2317819328231 + "congestion_cost": 88381154776162, + "congestion_multiplier": 4970167672, + "prover_cost": 18671138542773, + "sequencer_cost": 3590176889620 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 743766411, - "congestion_multiplier": 4516798825, - "prover_cost": 183434354, - "sequencer_cost": 28055256 + "congestion_cost": 920866761, + "congestion_multiplier": 4970167672, + "prover_cost": 194539559, + "sequencer_cost": 37407008 } }, "parent_fee_header": { - "eth_per_fee_asset": 12104160, - "excess_mana": 1316073760, - "mana_used": 72647195 + "eth_per_fee_asset": 10419266, + "excess_mana": 1029619640, + "mana_used": 73235215 } }, { @@ -40039,21 +40039,21 @@ "blobs_needed": 1, "block_number": 520, "l1_block_number": 20974712, - "mana_spent": 95352054, - "size_in_fields": 3525, + "mana_spent": 70957388, + "size_in_fields": 2670, "slot_number": 520, "timestamp": 1729040543 }, "fee_header": { - "eth_per_fee_asset": 12191422, - "excess_mana": 1317454889, - "mana_used": 95352054 + "eth_per_fee_asset": 10486866, + "excess_mana": 1029090404, + "mana_used": 70957388 }, "oracle_input": { - "fee_asset_price_modifier": 17 + "fee_asset_price_modifier": -15 }, "outputs": { - "eth_per_fee_asset_at_execution": 12170732, + "eth_per_fee_asset_at_execution": 10502620, "l1_fee_oracle_output": { "base_fee": 9897877678, "blob_fee": 1 @@ -40070,22 +40070,22 @@ "slot_of_change": 520 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64340272302439, - "congestion_multiplier": 4671229070, - "prover_cost": 15085782679300, - "sequencer_cost": 2439757444335 + "congestion_cost": 89029676880626, + "congestion_multiplier": 4979756691, + "prover_cost": 18600953666800, + "sequencer_cost": 3769679470456 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 783068211, - "congestion_multiplier": 4671229070, - "prover_cost": 183605018, - "sequencer_cost": 29693634 + "congestion_cost": 935044865, + "congestion_multiplier": 4979756691, + "prover_cost": 195358748, + "sequencer_cost": 39591511 } }, "parent_fee_header": { - "eth_per_fee_asset": 12170732, - "excess_mana": 1288720955, - "mana_used": 128733934 + "eth_per_fee_asset": 10502620, + "excess_mana": 1027854855, + "mana_used": 76235549 } }, { @@ -40093,21 +40093,21 @@ "blobs_needed": 1, "block_number": 521, "l1_block_number": 20974715, - "mana_spent": 104551868, - "size_in_fields": 3630, + "mana_spent": 72839925, + "size_in_fields": 2535, "slot_number": 521, "timestamp": 1729040579 }, "fee_header": { - "eth_per_fee_asset": 12184107, - "excess_mana": 1312806943, - "mana_used": 104551868 + "eth_per_fee_asset": 10553981, + "excess_mana": 1025047792, + "mana_used": 72839925 }, "oracle_input": { - "fee_asset_price_modifier": -6 + "fee_asset_price_modifier": 64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12191422, + "eth_per_fee_asset_at_execution": 10486866, "l1_fee_oracle_output": { "base_fee": 9897877678, "blob_fee": 1 @@ -40124,22 +40124,22 @@ "slot_of_change": 520 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63787848374046, - "congestion_multiplier": 4645895420, - "prover_cost": 15060180674576, - "sequencer_cost": 2435616944439 + "congestion_cost": 88462037943462, + "congestion_multiplier": 4948450800, + "prover_cost": 18628897136666, + "sequencer_cost": 3775342509383 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777664578, - "congestion_multiplier": 4645895420, - "prover_cost": 183605018, - "sequencer_cost": 29693634 + "congestion_cost": 927689538, + "congestion_multiplier": 4948450800, + "prover_cost": 195358748, + "sequencer_cost": 39591511 } }, "parent_fee_header": { - "eth_per_fee_asset": 12191422, - "excess_mana": 1317454889, - "mana_used": 95352054 + "eth_per_fee_asset": 10486866, + "excess_mana": 1029090404, + "mana_used": 70957388 } }, { @@ -40147,21 +40147,21 @@ "blobs_needed": 1, "block_number": 522, "l1_block_number": 20974718, - "mana_spent": 103711820, - "size_in_fields": 3375, + "mana_spent": 75179012, + "size_in_fields": 2655, "slot_number": 522, "timestamp": 1729040615 }, "fee_header": { - "eth_per_fee_asset": 12252337, - "excess_mana": 1317358811, - "mana_used": 103711820 + "eth_per_fee_asset": 10570867, + "excess_mana": 1022887717, + "mana_used": 75179012 }, "oracle_input": { - "fee_asset_price_modifier": 56 + "fee_asset_price_modifier": 16 }, "outputs": { - "eth_per_fee_asset_at_execution": 12184107, + "eth_per_fee_asset_at_execution": 10553981, "l1_fee_oracle_output": { "base_fee": 9897877678, "blob_fee": 1 @@ -40178,22 +40178,22 @@ "slot_of_change": 520 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64260451340423, - "congestion_multiplier": 4670704001, - "prover_cost": 15069222389462, - "sequencer_cost": 2437079221317 + "congestion_cost": 87528901558569, + "congestion_multiplier": 4931803985, + "prover_cost": 18510432035078, + "sequencer_cost": 3751334306932 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782956215, - "congestion_multiplier": 4670704001, - "prover_cost": 183605018, - "sequencer_cost": 29693634 + "congestion_cost": 923778364, + "congestion_multiplier": 4931803985, + "prover_cost": 195358748, + "sequencer_cost": 39591511 } }, "parent_fee_header": { - "eth_per_fee_asset": 12184107, - "excess_mana": 1312806943, - "mana_used": 104551868 + "eth_per_fee_asset": 10553981, + "excess_mana": 1025047792, + "mana_used": 72839925 } }, { @@ -40201,21 +40201,21 @@ "blobs_needed": 1, "block_number": 523, "l1_block_number": 20974721, - "mana_spent": 102451286, - "size_in_fields": 3630, + "mana_spent": 64073180, + "size_in_fields": 2325, "slot_number": 523, "timestamp": 1729040651 }, "fee_header": { - "eth_per_fee_asset": 12192300, - "excess_mana": 1321070631, - "mana_used": 102451286 + "eth_per_fee_asset": 10617378, + "excess_mana": 1023066729, + "mana_used": 64073180 }, "oracle_input": { - "fee_asset_price_modifier": -49 + "fee_asset_price_modifier": 44 }, "outputs": { - "eth_per_fee_asset_at_execution": 12252337, + "eth_per_fee_asset_at_execution": 10570867, "l1_fee_oracle_output": { "base_fee": 9897877678, "blob_fee": 1 @@ -40232,22 +40232,22 @@ "slot_of_change": 525 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64256491475872, - "congestion_multiplier": 4691032181, - "prover_cost": 14985305905315, - "sequencer_cost": 2423507776517 + "congestion_cost": 87419697362573, + "congestion_multiplier": 4933181426, + "prover_cost": 18480863300996, + "sequencer_cost": 3745341891068 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787292188, - "congestion_multiplier": 4691032181, - "prover_cost": 183605018, - "sequencer_cost": 29693634 + "congestion_cost": 924101994, + "congestion_multiplier": 4933181426, + "prover_cost": 195358748, + "sequencer_cost": 39591511 } }, "parent_fee_header": { - "eth_per_fee_asset": 12252337, - "excess_mana": 1317358811, - "mana_used": 103711820 + "eth_per_fee_asset": 10570867, + "excess_mana": 1022887717, + "mana_used": 75179012 } }, { @@ -40255,21 +40255,21 @@ "blobs_needed": 1, "block_number": 524, "l1_block_number": 20974724, - "mana_spent": 87176172, - "size_in_fields": 3255, + "mana_spent": 74633150, + "size_in_fields": 2760, "slot_number": 524, "timestamp": 1729040687 }, "fee_header": { - "eth_per_fee_asset": 12227657, - "excess_mana": 1323521917, - "mana_used": 87176172 + "eth_per_fee_asset": 10591896, + "excess_mana": 1012139909, + "mana_used": 74633150 }, "oracle_input": { - "fee_asset_price_modifier": 29 + "fee_asset_price_modifier": -24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12192300, + "eth_per_fee_asset_at_execution": 10617378, "l1_fee_oracle_output": { "base_fee": 9897877678, "blob_fee": 1 @@ -40286,22 +40286,22 @@ "slot_of_change": 525 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64808609204170, - "congestion_multiplier": 4704505394, - "prover_cost": 15059096150850, - "sequencer_cost": 2435441549175 + "congestion_cost": 85191693372884, + "congestion_multiplier": 4849803848, + "prover_cost": 18399905136655, + "sequencer_cost": 3728934865087 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790166006, - "congestion_multiplier": 4704505394, - "prover_cost": 183605018, - "sequencer_cost": 29693634 + "congestion_cost": 904512411, + "congestion_multiplier": 4849803848, + "prover_cost": 195358748, + "sequencer_cost": 39591511 } }, "parent_fee_header": { - "eth_per_fee_asset": 12192300, - "excess_mana": 1321070631, - "mana_used": 102451286 + "eth_per_fee_asset": 10617378, + "excess_mana": 1023066729, + "mana_used": 64073180 } }, { @@ -40309,21 +40309,21 @@ "blobs_needed": 1, "block_number": 525, "l1_block_number": 20974727, - "mana_spent": 102979099, - "size_in_fields": 3675, + "mana_spent": 79730817, + "size_in_fields": 2715, "slot_number": 525, "timestamp": 1729040723 }, "fee_header": { - "eth_per_fee_asset": 12123721, - "excess_mana": 1310698089, - "mana_used": 102979099 + "eth_per_fee_asset": 10658624, + "excess_mana": 1011773059, + "mana_used": 79730817 }, "oracle_input": { - "fee_asset_price_modifier": -85 + "fee_asset_price_modifier": 63 }, "outputs": { - "eth_per_fee_asset_at_execution": 12227657, + "eth_per_fee_asset_at_execution": 10591896, "l1_fee_oracle_output": { "base_fee": 9931038619, "blob_fee": 1 @@ -40340,22 +40340,22 @@ "slot_of_change": 525 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63431756059236, - "congestion_multiplier": 4634446458, - "prover_cost": 15016399380520, - "sequencer_cost": 2436535143242 + "congestion_cost": 85401342592488, + "congestion_multiplier": 4847029167, + "prover_cost": 18448867794775, + "sequencer_cost": 3750429101646 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 775621756, - "congestion_multiplier": 4634446458, - "prover_cost": 183615381, - "sequencer_cost": 29793116 + "congestion_cost": 904562139, + "congestion_multiplier": 4847029167, + "prover_cost": 195408489, + "sequencer_cost": 39724155 } }, "parent_fee_header": { - "eth_per_fee_asset": 12227657, - "excess_mana": 1323521917, - "mana_used": 87176172 + "eth_per_fee_asset": 10591896, + "excess_mana": 1012139909, + "mana_used": 74633150 } }, { @@ -40363,21 +40363,21 @@ "blobs_needed": 1, "block_number": 526, "l1_block_number": 20974730, - "mana_spent": 113063751, - "size_in_fields": 3750, + "mana_spent": 84809098, + "size_in_fields": 2925, "slot_number": 526, "timestamp": 1729040759 }, "fee_header": { - "eth_per_fee_asset": 12076438, - "excess_mana": 1313677188, - "mana_used": 113063751 + "eth_per_fee_asset": 10739629, + "excess_mana": 1016503876, + "mana_used": 84809098 }, "oracle_input": { - "fee_asset_price_modifier": -39 + "fee_asset_price_modifier": 76 }, "outputs": { - "eth_per_fee_asset_at_execution": 12123721, + "eth_per_fee_asset_at_execution": 10658624, "l1_fee_oracle_output": { "base_fee": 9931038619, "blob_fee": 1 @@ -40394,22 +40394,22 @@ "slot_of_change": 525 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64260393405622, - "congestion_multiplier": 4650628218, - "prover_cost": 15145134154770, - "sequencer_cost": 2457423426356 + "congestion_cost": 85658738407510, + "congestion_multiplier": 4882932927, + "prover_cost": 18333369204130, + "sequencer_cost": 3726949651288 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779075081, - "congestion_multiplier": 4650628218, - "prover_cost": 183615381, - "sequencer_cost": 29793116 + "congestion_cost": 913004285, + "congestion_multiplier": 4882932927, + "prover_cost": 195408489, + "sequencer_cost": 39724155 } }, "parent_fee_header": { - "eth_per_fee_asset": 12123721, - "excess_mana": 1310698089, - "mana_used": 102979099 + "eth_per_fee_asset": 10658624, + "excess_mana": 1011773059, + "mana_used": 79730817 } }, { @@ -40417,21 +40417,21 @@ "blobs_needed": 1, "block_number": 527, "l1_block_number": 20974733, - "mana_spent": 96815853, - "size_in_fields": 3525, + "mana_spent": 82566327, + "size_in_fields": 2625, "slot_number": 527, "timestamp": 1729040795 }, "fee_header": { - "eth_per_fee_asset": 12128366, - "excess_mana": 1326740939, - "mana_used": 96815853 + "eth_per_fee_asset": 10753590, + "excess_mana": 1026312974, + "mana_used": 82566327 }, "oracle_input": { - "fee_asset_price_modifier": 43 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 12076438, + "eth_per_fee_asset_at_execution": 10739629, "l1_fee_oracle_output": { "base_fee": 9931038619, "blob_fee": 1 @@ -40448,22 +40448,22 @@ "slot_of_change": 525 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65777782157289, - "congestion_multiplier": 4722257172, - "prover_cost": 15204432051902, - "sequencer_cost": 2467045001184 + "congestion_cost": 86661132148979, + "congestion_multiplier": 4958227123, + "prover_cost": 18195087465312, + "sequencer_cost": 3698838665656 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794361308, - "congestion_multiplier": 4722257172, - "prover_cost": 183615381, - "sequencer_cost": 29793116 + "congestion_cost": 930708408, + "congestion_multiplier": 4958227123, + "prover_cost": 195408489, + "sequencer_cost": 39724155 } }, "parent_fee_header": { - "eth_per_fee_asset": 12076438, - "excess_mana": 1313677188, - "mana_used": 113063751 + "eth_per_fee_asset": 10739629, + "excess_mana": 1016503876, + "mana_used": 84809098 } }, { @@ -40471,21 +40471,21 @@ "blobs_needed": 1, "block_number": 528, "l1_block_number": 20974736, - "mana_spent": 104260853, - "size_in_fields": 3870, + "mana_spent": 77564736, + "size_in_fields": 2550, "slot_number": 528, "timestamp": 1729040831 }, "fee_header": { - "eth_per_fee_asset": 12147771, - "excess_mana": 1323556792, - "mana_used": 104260853 + "eth_per_fee_asset": 10763268, + "excess_mana": 1033879301, + "mana_used": 77564736 }, "oracle_input": { - "fee_asset_price_modifier": 16 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 12128366, + "eth_per_fee_asset_at_execution": 10753590, "l1_fee_oracle_output": { "base_fee": 9931038619, "blob_fee": 1 @@ -40502,22 +40502,22 @@ "slot_of_change": 530 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65187173193817, - "congestion_multiplier": 4704697360, - "prover_cost": 15139333773404, - "sequencer_cost": 2456482266449 + "congestion_cost": 87835868021750, + "congestion_multiplier": 5017098166, + "prover_cost": 18171465436194, + "sequencer_cost": 3694036596151 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790613895, - "congestion_multiplier": 4704697360, - "prover_cost": 183615381, - "sequencer_cost": 29793116 + "congestion_cost": 944550912, + "congestion_multiplier": 5017098166, + "prover_cost": 195408489, + "sequencer_cost": 39724155 } }, "parent_fee_header": { - "eth_per_fee_asset": 12128366, - "excess_mana": 1326740939, - "mana_used": 96815853 + "eth_per_fee_asset": 10753590, + "excess_mana": 1026312974, + "mana_used": 82566327 } }, { @@ -40525,21 +40525,21 @@ "blobs_needed": 1, "block_number": 529, "l1_block_number": 20974739, - "mana_spent": 91921884, - "size_in_fields": 3090, + "mana_spent": 72530511, + "size_in_fields": 2535, "slot_number": 529, "timestamp": 1729040867 }, "fee_header": { - "eth_per_fee_asset": 12159918, - "excess_mana": 1327817645, - "mana_used": 91921884 + "eth_per_fee_asset": 10700841, + "excess_mana": 1036444037, + "mana_used": 72530511 }, "oracle_input": { - "fee_asset_price_modifier": 10 + "fee_asset_price_modifier": -58 }, "outputs": { - "eth_per_fee_asset_at_execution": 12147771, + "eth_per_fee_asset_at_execution": 10763268, "l1_fee_oracle_output": { "base_fee": 9931038619, "blob_fee": 1 @@ -40556,22 +40556,22 @@ "slot_of_change": 530 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65496101465858, - "congestion_multiplier": 4728209766, - "prover_cost": 15115150013941, - "sequencer_cost": 2452558251222 + "congestion_cost": 88196286388112, + "congestion_multiplier": 5037211727, + "prover_cost": 18155126212597, + "sequencer_cost": 3690715031903 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 795631642, - "congestion_multiplier": 4728209766, - "prover_cost": 183615381, - "sequencer_cost": 29793116 + "congestion_cost": 949280267, + "congestion_multiplier": 5037211727, + "prover_cost": 195408489, + "sequencer_cost": 39724155 } }, "parent_fee_header": { - "eth_per_fee_asset": 12147771, - "excess_mana": 1323556792, - "mana_used": 104260853 + "eth_per_fee_asset": 10763268, + "excess_mana": 1033879301, + "mana_used": 77564736 } }, { @@ -40579,21 +40579,21 @@ "blobs_needed": 1, "block_number": 530, "l1_block_number": 20974742, - "mana_spent": 107539205, - "size_in_fields": 3660, + "mana_spent": 60661207, + "size_in_fields": 2115, "slot_number": 530, "timestamp": 1729040903 }, "fee_header": { - "eth_per_fee_asset": 12162349, - "excess_mana": 1319739529, - "mana_used": 107539205 + "eth_per_fee_asset": 10719032, + "excess_mana": 1033974548, + "mana_used": 60661207 }, "oracle_input": { - "fee_asset_price_modifier": 2 + "fee_asset_price_modifier": 17 }, "outputs": { - "eth_per_fee_asset_at_execution": 12159918, + "eth_per_fee_asset_at_execution": 10700841, "l1_fee_oracle_output": { "base_fee": 10365019463, "blob_fee": 1 @@ -40610,22 +40610,22 @@ "slot_of_change": 530 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65085580675791, - "congestion_multiplier": 4683732103, - "prover_cost": 15111203874895, - "sequencer_cost": 2557176701357 + "congestion_cost": 89181437234700, + "congestion_multiplier": 5017843689, + "prover_cost": 18321874047096, + "sequencer_cost": 3874469118830 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791435324, - "congestion_multiplier": 4683732103, - "prover_cost": 183751000, - "sequencer_cost": 31095059 + "congestion_cost": 954316380, + "congestion_multiplier": 5017843689, + "prover_cost": 196059461, + "sequencer_cost": 41460078 } }, "parent_fee_header": { - "eth_per_fee_asset": 12159918, - "excess_mana": 1327817645, - "mana_used": 91921884 + "eth_per_fee_asset": 10700841, + "excess_mana": 1036444037, + "mana_used": 72530511 } }, { @@ -40633,21 +40633,21 @@ "blobs_needed": 1, "block_number": 531, "l1_block_number": 20974745, - "mana_spent": 89584244, - "size_in_fields": 3345, + "mana_spent": 74511658, + "size_in_fields": 2505, "slot_number": 531, "timestamp": 1729040939 }, "fee_header": { - "eth_per_fee_asset": 12257215, - "excess_mana": 1327278734, - "mana_used": 89584244 + "eth_per_fee_asset": 10711528, + "excess_mana": 1019635755, + "mana_used": 74511658 }, "oracle_input": { - "fee_asset_price_modifier": 78 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 12162349, + "eth_per_fee_asset_at_execution": 10719032, "l1_fee_oracle_output": { "base_fee": 10365019463, "blob_fee": 1 @@ -40664,22 +40664,22 @@ "slot_of_change": 530 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65805615757286, - "congestion_multiplier": 4725229447, - "prover_cost": 15108183460284, - "sequencer_cost": 2556665575047 + "congestion_cost": 86570572324069, + "congestion_multiplier": 4906847999, + "prover_cost": 18290780454803, + "sequencer_cost": 3867893854595 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 800350865, - "congestion_multiplier": 4725229447, - "prover_cost": 183751000, - "sequencer_cost": 31095059 + "congestion_cost": 927952735, + "congestion_multiplier": 4906847999, + "prover_cost": 196059461, + "sequencer_cost": 41460078 } }, "parent_fee_header": { - "eth_per_fee_asset": 12162349, - "excess_mana": 1319739529, - "mana_used": 107539205 + "eth_per_fee_asset": 10719032, + "excess_mana": 1033974548, + "mana_used": 60661207 } }, { @@ -40687,21 +40687,21 @@ "blobs_needed": 1, "block_number": 532, "l1_block_number": 20974748, - "mana_spent": 91827743, - "size_in_fields": 3195, + "mana_spent": 97305825, + "size_in_fields": 3105, "slot_number": 532, "timestamp": 1729040975 }, "fee_header": { - "eth_per_fee_asset": 12279277, - "excess_mana": 1316862978, - "mana_used": 91827743 + "eth_per_fee_asset": 10786508, + "excess_mana": 1019147413, + "mana_used": 97305825 }, "oracle_input": { - "fee_asset_price_modifier": 18 + "fee_asset_price_modifier": 70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12257215, + "eth_per_fee_asset_at_execution": 10711528, "l1_fee_oracle_output": { "base_fee": 10365019463, "blob_fee": 1 @@ -40718,22 +40718,22 @@ "slot_of_change": 530 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64293096922915, - "congestion_multiplier": 4667995197, - "prover_cost": 14991252091116, - "sequencer_cost": 2536877993900 + "congestion_cost": 86548361821022, + "congestion_multiplier": 4903111319, + "prover_cost": 18303594127748, + "sequencer_cost": 3870603521739 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788054312, - "congestion_multiplier": 4667995197, - "prover_cost": 183751000, - "sequencer_cost": 31095059 + "congestion_cost": 927065201, + "congestion_multiplier": 4903111319, + "prover_cost": 196059461, + "sequencer_cost": 41460078 } }, "parent_fee_header": { - "eth_per_fee_asset": 12257215, - "excess_mana": 1327278734, - "mana_used": 89584244 + "eth_per_fee_asset": 10711528, + "excess_mana": 1019635755, + "mana_used": 74511658 } }, { @@ -40741,21 +40741,21 @@ "blobs_needed": 1, "block_number": 533, "l1_block_number": 20974751, - "mana_spent": 117435304, - "size_in_fields": 3945, + "mana_spent": 60273677, + "size_in_fields": 2130, "slot_number": 533, "timestamp": 1729041011 }, "fee_header": { - "eth_per_fee_asset": 12206829, - "excess_mana": 1308690721, - "mana_used": 117435304 + "eth_per_fee_asset": 10827496, + "excess_mana": 1041453238, + "mana_used": 60273677 }, "oracle_input": { - "fee_asset_price_modifier": -59 + "fee_asset_price_modifier": 38 }, "outputs": { - "eth_per_fee_asset_at_execution": 12279277, + "eth_per_fee_asset_at_execution": 10786508, "l1_fee_oracle_output": { "base_fee": 10365019463, "blob_fee": 1 @@ -40772,22 +40772,22 @@ "slot_of_change": 535 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63400372595227, - "congestion_multiplier": 4623574673, - "prover_cost": 14964317524558, - "sequencer_cost": 2532320021774 + "congestion_cost": 89769800198545, + "congestion_multiplier": 5076728478, + "prover_cost": 18176360783305, + "sequencer_cost": 3843697886286 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778510737, - "congestion_multiplier": 4623574673, - "prover_cost": 183751000, - "sequencer_cost": 31095059 + "congestion_cost": 968302668, + "congestion_multiplier": 5076728478, + "prover_cost": 196059461, + "sequencer_cost": 41460078 } }, "parent_fee_header": { - "eth_per_fee_asset": 12279277, - "excess_mana": 1316862978, - "mana_used": 91827743 + "eth_per_fee_asset": 10786508, + "excess_mana": 1019147413, + "mana_used": 97305825 } }, { @@ -40795,21 +40795,21 @@ "blobs_needed": 1, "block_number": 534, "l1_block_number": 20974754, - "mana_spent": 93377323, - "size_in_fields": 3465, + "mana_spent": 65721673, + "size_in_fields": 2580, "slot_number": 534, "timestamp": 1729041047 }, "fee_header": { - "eth_per_fee_asset": 12144574, - "excess_mana": 1326126025, - "mana_used": 93377323 + "eth_per_fee_asset": 10744124, + "excess_mana": 1026726915, + "mana_used": 65721673 }, "oracle_input": { - "fee_asset_price_modifier": -51 + "fee_asset_price_modifier": -77 }, "outputs": { - "eth_per_fee_asset_at_execution": 12206829, + "eth_per_fee_asset_at_execution": 10827496, "l1_fee_oracle_output": { "base_fee": 10365019463, "blob_fee": 1 @@ -40826,22 +40826,22 @@ "slot_of_change": 535 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65453740934686, - "congestion_multiplier": 4718860969, - "prover_cost": 15053131325097, - "sequencer_cost": 2547349438581 + "congestion_cost": 86900702433878, + "congestion_multiplier": 4961429922, + "prover_cost": 18107553306878, + "sequencer_cost": 3829147385509 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798982623, - "congestion_multiplier": 4718860969, - "prover_cost": 183751000, - "sequencer_cost": 31095059 + "congestion_cost": 940917008, + "congestion_multiplier": 4961429922, + "prover_cost": 196059461, + "sequencer_cost": 41460078 } }, "parent_fee_header": { - "eth_per_fee_asset": 12206829, - "excess_mana": 1308690721, - "mana_used": 117435304 + "eth_per_fee_asset": 10827496, + "excess_mana": 1041453238, + "mana_used": 60273677 } }, { @@ -40849,21 +40849,21 @@ "blobs_needed": 1, "block_number": 535, "l1_block_number": 20974757, - "mana_spent": 93751918, - "size_in_fields": 3540, + "mana_spent": 91565129, + "size_in_fields": 3135, "slot_number": 535, "timestamp": 1729041083 }, "fee_header": { - "eth_per_fee_asset": 12172506, - "excess_mana": 1319503348, - "mana_used": 93751918 + "eth_per_fee_asset": 10753793, + "excess_mana": 1017448588, + "mana_used": 91565129 }, "oracle_input": { - "fee_asset_price_modifier": 23 + "fee_asset_price_modifier": 9 }, "outputs": { - "eth_per_fee_asset_at_execution": 12144574, + "eth_per_fee_asset_at_execution": 10744124, "l1_fee_oracle_output": { "base_fee": 9876371928, "blob_fee": 1 @@ -40880,22 +40880,22 @@ "slot_of_change": 535 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64654119197594, - "congestion_multiplier": 4682438018, - "prover_cost": 15117722367207, - "sequencer_cost": 2439699902196 + "congestion_cost": 85025821090673, + "congestion_multiplier": 4890134458, + "prover_cost": 18179843140307, + "sequencer_cost": 3676938948211 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785196735, - "congestion_multiplier": 4682438018, - "prover_cost": 183598298, - "sequencer_cost": 29629116 + "congestion_cost": 913527965, + "congestion_multiplier": 4890134458, + "prover_cost": 195326489, + "sequencer_cost": 39505488 } }, "parent_fee_header": { - "eth_per_fee_asset": 12144574, - "excess_mana": 1326126025, - "mana_used": 93377323 + "eth_per_fee_asset": 10744124, + "excess_mana": 1026726915, + "mana_used": 65721673 } }, { @@ -40903,21 +40903,21 @@ "blobs_needed": 1, "block_number": 536, "l1_block_number": 20974760, - "mana_spent": 115409378, - "size_in_fields": 4050, + "mana_spent": 68123028, + "size_in_fields": 2565, "slot_number": 536, "timestamp": 1729041119 }, "fee_header": { - "eth_per_fee_asset": 12128684, - "excess_mana": 1313255266, - "mana_used": 115409378 + "eth_per_fee_asset": 10711853, + "excess_mana": 1034013717, + "mana_used": 68123028 }, "oracle_input": { - "fee_asset_price_modifier": -36 + "fee_asset_price_modifier": -39 }, "outputs": { - "eth_per_fee_asset_at_execution": 12172506, + "eth_per_fee_asset_at_execution": 10753793, "l1_fee_oracle_output": { "base_fee": 9876371928, "blob_fee": 1 @@ -40934,22 +40934,22 @@ "slot_of_change": 535 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63908336705688, - "congestion_multiplier": 4648333008, - "prover_cost": 15083032039582, - "sequencer_cost": 2434101572840 + "congestion_cost": 87744871042246, + "congestion_multiplier": 5018150307, + "prover_cost": 18163497195827, + "sequencer_cost": 3673632921891 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777924612, - "congestion_multiplier": 4648333008, - "prover_cost": 183598298, - "sequencer_cost": 29629116 + "congestion_cost": 943590180, + "congestion_multiplier": 5018150307, + "prover_cost": 195326489, + "sequencer_cost": 39505488 } }, "parent_fee_header": { - "eth_per_fee_asset": 12172506, - "excess_mana": 1319503348, - "mana_used": 93751918 + "eth_per_fee_asset": 10753793, + "excess_mana": 1017448588, + "mana_used": 91565129 } }, { @@ -40957,21 +40957,21 @@ "blobs_needed": 1, "block_number": 537, "l1_block_number": 20974763, - "mana_spent": 106700004, - "size_in_fields": 3780, + "mana_spent": 81948995, + "size_in_fields": 2835, "slot_number": 537, "timestamp": 1729041155 }, "fee_header": { - "eth_per_fee_asset": 12126258, - "excess_mana": 1328664644, - "mana_used": 106700004 + "eth_per_fee_asset": 10652937, + "excess_mana": 1027136745, + "mana_used": 81948995 }, "oracle_input": { - "fee_asset_price_modifier": -2 + "fee_asset_price_modifier": -55 }, "outputs": { - "eth_per_fee_asset_at_execution": 12128684, + "eth_per_fee_asset_at_execution": 10711853, "l1_fee_oracle_output": { "base_fee": 9876371928, "blob_fee": 1 @@ -40988,22 +40988,22 @@ "slot_of_change": 535 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65625926192817, - "congestion_multiplier": 4732897691, - "prover_cost": 15137528358395, - "sequencer_cost": 2442896195499 + "congestion_cost": 86914518804543, + "congestion_multiplier": 4964602951, + "prover_cost": 18234612536226, + "sequencer_cost": 3688016256385 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 795956121, - "congestion_multiplier": 4732897691, - "prover_cost": 183598298, - "sequencer_cost": 29629116 + "congestion_cost": 931015549, + "congestion_multiplier": 4964602951, + "prover_cost": 195326489, + "sequencer_cost": 39505488 } }, "parent_fee_header": { - "eth_per_fee_asset": 12128684, - "excess_mana": 1313255266, - "mana_used": 115409378 + "eth_per_fee_asset": 10711853, + "excess_mana": 1034013717, + "mana_used": 68123028 } }, { @@ -41011,21 +41011,21 @@ "blobs_needed": 1, "block_number": 538, "l1_block_number": 20974766, - "mana_spent": 89577497, - "size_in_fields": 3330, + "mana_spent": 69963191, + "size_in_fields": 2565, "slot_number": 538, "timestamp": 1729041191 }, "fee_header": { - "eth_per_fee_asset": 12247520, - "excess_mana": 1335364648, - "mana_used": 89577497 + "eth_per_fee_asset": 10666785, + "excess_mana": 1034085740, + "mana_used": 69963191 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 12126258, + "eth_per_fee_asset_at_execution": 10652937, "l1_fee_oracle_output": { "base_fee": 9876371928, "blob_fee": 1 @@ -41042,22 +41042,22 @@ "slot_of_change": 540 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66294004630283, - "congestion_multiplier": 4770144697, - "prover_cost": 15140556798314, - "sequencer_cost": 2443384925507 + "congestion_cost": 88588019435392, + "congestion_multiplier": 5018714157, + "prover_cost": 18335458944327, + "sequencer_cost": 3708412806722 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 803898204, - "congestion_multiplier": 4770144697, - "prover_cost": 183598298, - "sequencer_cost": 29629116 + "congestion_cost": 943722590, + "congestion_multiplier": 5018714157, + "prover_cost": 195326489, + "sequencer_cost": 39505488 } }, "parent_fee_header": { - "eth_per_fee_asset": 12126258, - "excess_mana": 1328664644, - "mana_used": 106700004 + "eth_per_fee_asset": 10652937, + "excess_mana": 1027136745, + "mana_used": 81948995 } }, { @@ -41065,21 +41065,21 @@ "blobs_needed": 1, "block_number": 539, "l1_block_number": 20974769, - "mana_spent": 112052442, - "size_in_fields": 3930, + "mana_spent": 77353355, + "size_in_fields": 2640, "slot_number": 539, "timestamp": 1729041227 }, "fee_header": { - "eth_per_fee_asset": 12236497, - "excess_mana": 1324942145, - "mana_used": 112052442 + "eth_per_fee_asset": 10693451, + "excess_mana": 1029048931, + "mana_used": 77353355 }, "oracle_input": { - "fee_asset_price_modifier": -9 + "fee_asset_price_modifier": 25 }, "outputs": { - "eth_per_fee_asset_at_execution": 12247520, + "eth_per_fee_asset_at_execution": 10666785, "l1_fee_oracle_output": { "base_fee": 9876371928, "blob_fee": 1 @@ -41096,22 +41096,22 @@ "slot_of_change": 540 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64631072902923, - "congestion_multiplier": 4712329213, - "prover_cost": 14990651005265, - "sequencer_cost": 2419193110116 + "congestion_cost": 87608260220864, + "congestion_multiplier": 4979434522, + "prover_cost": 18311655198826, + "sequencer_cost": 3703598413206 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791570358, - "congestion_multiplier": 4712329213, - "prover_cost": 183598298, - "sequencer_cost": 29629116 + "congestion_cost": 934498476, + "congestion_multiplier": 4979434522, + "prover_cost": 195326489, + "sequencer_cost": 39505488 } }, "parent_fee_header": { - "eth_per_fee_asset": 12247520, - "excess_mana": 1335364648, - "mana_used": 89577497 + "eth_per_fee_asset": 10666785, + "excess_mana": 1034085740, + "mana_used": 69963191 } }, { @@ -41119,21 +41119,21 @@ "blobs_needed": 1, "block_number": 540, "l1_block_number": 20974772, - "mana_spent": 92384437, - "size_in_fields": 3240, + "mana_spent": 80358761, + "size_in_fields": 2610, "slot_number": 540, "timestamp": 1729041263 }, "fee_header": { - "eth_per_fee_asset": 12345401, - "excess_mana": 1336994587, - "mana_used": 92384437 + "eth_per_fee_asset": 10738363, + "excess_mana": 1031402286, + "mana_used": 80358761 }, "oracle_input": { - "fee_asset_price_modifier": 89 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 12236497, + "eth_per_fee_asset_at_execution": 10693451, "l1_fee_oracle_output": { "base_fee": 9355897486, "blob_fee": 1 @@ -41150,22 +41150,22 @@ "slot_of_change": 540 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65322946836828, - "congestion_multiplier": 4779250179, - "prover_cost": 14990862907906, - "sequencer_cost": 2293768633295 + "congestion_cost": 86721794395467, + "congestion_multiplier": 4997748788, + "prover_cost": 18192983537308, + "sequencer_cost": 3499673772293 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799324043, - "congestion_multiplier": 4779250179, - "prover_cost": 183435649, - "sequencer_cost": 28067693 + "congestion_cost": 927355259, + "congestion_multiplier": 4997748788, + "prover_cost": 194545778, + "sequencer_cost": 37423590 } }, "parent_fee_header": { - "eth_per_fee_asset": 12236497, - "excess_mana": 1324942145, - "mana_used": 112052442 + "eth_per_fee_asset": 10693451, + "excess_mana": 1029048931, + "mana_used": 77353355 } }, { @@ -41173,21 +41173,21 @@ "blobs_needed": 1, "block_number": 541, "l1_block_number": 20974775, - "mana_spent": 103747256, - "size_in_fields": 3630, + "mana_spent": 74268504, + "size_in_fields": 2340, "slot_number": 541, "timestamp": 1729041299 }, "fee_header": { - "eth_per_fee_asset": 12339228, - "excess_mana": 1329379024, - "mana_used": 103747256 + "eth_per_fee_asset": 10639570, + "excess_mana": 1036761047, + "mana_used": 74268504 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": -92 }, "outputs": { - "eth_per_fee_asset_at_execution": 12345401, + "eth_per_fee_asset_at_execution": 10738363, "l1_fee_oracle_output": { "base_fee": 9355897486, "blob_fee": 1 @@ -41204,22 +41204,22 @@ "slot_of_change": 540 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64020388321125, - "congestion_multiplier": 4736855217, - "prover_cost": 14858622170313, - "sequencer_cost": 2273534330720 + "congestion_cost": 87265391382281, + "congestion_multiplier": 5039703424, + "prover_cost": 18116893422210, + "sequencer_cost": 3485036778884 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790357366, - "congestion_multiplier": 4736855217, - "prover_cost": 183435649, - "sequencer_cost": 28067693 + "congestion_cost": 937087450, + "congestion_multiplier": 5039703424, + "prover_cost": 194545778, + "sequencer_cost": 37423590 } }, "parent_fee_header": { - "eth_per_fee_asset": 12345401, - "excess_mana": 1336994587, - "mana_used": 92384437 + "eth_per_fee_asset": 10738363, + "excess_mana": 1031402286, + "mana_used": 80358761 } }, { @@ -41227,21 +41227,21 @@ "blobs_needed": 1, "block_number": 542, "l1_block_number": 20974778, - "mana_spent": 96953149, - "size_in_fields": 3435, + "mana_spent": 62710434, + "size_in_fields": 2370, "slot_number": 542, "timestamp": 1729041335 }, "fee_header": { - "eth_per_fee_asset": 12304678, - "excess_mana": 1333126280, - "mana_used": 96953149 + "eth_per_fee_asset": 10601267, + "excess_mana": 1036029551, + "mana_used": 62710434 }, "oracle_input": { - "fee_asset_price_modifier": -28 + "fee_asset_price_modifier": -36 }, "outputs": { - "eth_per_fee_asset_at_execution": 12339228, + "eth_per_fee_asset_at_execution": 10639570, "l1_fee_oracle_output": { "base_fee": 9355897486, "blob_fee": 1 @@ -41258,22 +41258,22 @@ "slot_of_change": 540 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64409171870396, - "congestion_multiplier": 4757668554, - "prover_cost": 14866055558744, - "sequencer_cost": 2274671721765 + "congestion_cost": 87950373934285, + "congestion_multiplier": 5033955728, + "prover_cost": 18285116597758, + "sequencer_cost": 3517396849685 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794759457, - "congestion_multiplier": 4757668554, - "prover_cost": 183435649, - "sequencer_cost": 28067693 + "congestion_cost": 935754160, + "congestion_multiplier": 5033955728, + "prover_cost": 194545778, + "sequencer_cost": 37423590 } }, "parent_fee_header": { - "eth_per_fee_asset": 12339228, - "excess_mana": 1329379024, - "mana_used": 103747256 + "eth_per_fee_asset": 10639570, + "excess_mana": 1036761047, + "mana_used": 74268504 } }, { @@ -41281,21 +41281,21 @@ "blobs_needed": 1, "block_number": 543, "l1_block_number": 20974781, - "mana_spent": 98471294, - "size_in_fields": 3300, + "mana_spent": 61171346, + "size_in_fields": 2310, "slot_number": 543, "timestamp": 1729041371 }, "fee_header": { - "eth_per_fee_asset": 12408037, - "excess_mana": 1330079429, - "mana_used": 98471294 + "eth_per_fee_asset": 10546140, + "excess_mana": 1023739985, + "mana_used": 61171346 }, "oracle_input": { - "fee_asset_price_modifier": 84 + "fee_asset_price_modifier": -52 }, "outputs": { - "eth_per_fee_asset_at_execution": 12304678, + "eth_per_fee_asset_at_execution": 10601267, "l1_fee_oracle_output": { "base_fee": 9355897486, "blob_fee": 1 @@ -41312,22 +41312,22 @@ "slot_of_change": 545 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64299017170543, - "congestion_multiplier": 4740738537, - "prover_cost": 14907797587227, - "sequencer_cost": 2281058716043 + "congestion_cost": 86176503714132, + "congestion_multiplier": 4938365367, + "prover_cost": 18351181797422, + "sequencer_cost": 3530105410986 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791178702, - "congestion_multiplier": 4740738537, - "prover_cost": 183435649, - "sequencer_cost": 28067693 + "congestion_cost": 913580125, + "congestion_multiplier": 4938365367, + "prover_cost": 194545778, + "sequencer_cost": 37423590 } }, "parent_fee_header": { - "eth_per_fee_asset": 12304678, - "excess_mana": 1333126280, - "mana_used": 96953149 + "eth_per_fee_asset": 10601267, + "excess_mana": 1036029551, + "mana_used": 62710434 } }, { @@ -41335,21 +41335,21 @@ "blobs_needed": 1, "block_number": 544, "l1_block_number": 20974784, - "mana_spent": 97850685, - "size_in_fields": 3210, + "mana_spent": 85248091, + "size_in_fields": 3030, "slot_number": 544, "timestamp": 1729041407 }, "fee_header": { - "eth_per_fee_asset": 12377016, - "excess_mana": 1328550723, - "mana_used": 97850685 + "eth_per_fee_asset": 10575669, + "excess_mana": 1009911331, + "mana_used": 85248091 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 12408037, + "eth_per_fee_asset_at_execution": 10546140, "l1_fee_oracle_output": { "base_fee": 9355897486, "blob_fee": 1 @@ -41366,22 +41366,22 @@ "slot_of_change": 545 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63619001216712, - "congestion_multiplier": 4732266897, - "prover_cost": 14783615571102, - "sequencer_cost": 2262057487418 + "congestion_cost": 84308778472503, + "congestion_multiplier": 4832972384, + "prover_cost": 18447107472498, + "sequencer_cost": 3548558050624 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789386921, - "congestion_multiplier": 4732266897, - "prover_cost": 183435649, - "sequencer_cost": 28067693 + "congestion_cost": 889132181, + "congestion_multiplier": 4832972384, + "prover_cost": 194545778, + "sequencer_cost": 37423590 } }, "parent_fee_header": { - "eth_per_fee_asset": 12408037, - "excess_mana": 1330079429, - "mana_used": 98471294 + "eth_per_fee_asset": 10546140, + "excess_mana": 1023739985, + "mana_used": 61171346 } }, { @@ -41389,21 +41389,21 @@ "blobs_needed": 1, "block_number": 545, "l1_block_number": 20974787, - "mana_spent": 113463662, - "size_in_fields": 3945, + "mana_spent": 80440318, + "size_in_fields": 2970, "slot_number": 545, "timestamp": 1729041443 }, "fee_header": { - "eth_per_fee_asset": 12362163, - "excess_mana": 1326401408, - "mana_used": 113463662 + "eth_per_fee_asset": 10507984, + "excess_mana": 1020159422, + "mana_used": 80440318 }, "oracle_input": { - "fee_asset_price_modifier": -12 + "fee_asset_price_modifier": -64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12377016, + "eth_per_fee_asset_at_execution": 10575669, "l1_fee_oracle_output": { "base_fee": 8890810110, "blob_fee": 1 @@ -41420,22 +41420,22 @@ "slot_of_change": 545 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63112265670498, - "congestion_multiplier": 4720381622, - "prover_cost": 14808925673200, - "sequencer_cost": 2154996891012 + "congestion_cost": 84835805091858, + "congestion_multiplier": 4910858141, + "prover_cost": 18329634465678, + "sequencer_cost": 3362741496543 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781141522, - "congestion_multiplier": 4720381622, - "prover_cost": 183290310, - "sequencer_cost": 26672431 + "congestion_cost": 897195394, + "congestion_multiplier": 4910858141, + "prover_cost": 193848147, + "sequencer_cost": 35563241 } }, "parent_fee_header": { - "eth_per_fee_asset": 12377016, - "excess_mana": 1328550723, - "mana_used": 97850685 + "eth_per_fee_asset": 10575669, + "excess_mana": 1009911331, + "mana_used": 85248091 } }, { @@ -41443,21 +41443,21 @@ "blobs_needed": 1, "block_number": 546, "l1_block_number": 20974790, - "mana_spent": 90664893, - "size_in_fields": 3135, + "mana_spent": 86502914, + "size_in_fields": 2715, "slot_number": 546, "timestamp": 1729041479 }, "fee_header": { - "eth_per_fee_asset": 12358454, - "excess_mana": 1339865070, - "mana_used": 90664893 + "eth_per_fee_asset": 10486968, + "excess_mana": 1025599740, + "mana_used": 86502914 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": -20 }, "outputs": { - "eth_per_fee_asset_at_execution": 12362163, + "eth_per_fee_asset_at_execution": 10507984, "l1_fee_oracle_output": { "base_fee": 8890810110, "blob_fee": 1 @@ -41474,22 +41474,22 @@ "slot_of_change": 545 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64461008320308, - "congestion_multiplier": 4795328108, - "prover_cost": 14826718431071, - "sequencer_cost": 2157586095573 + "congestion_cost": 86296046606086, + "congestion_multiplier": 4952713444, + "prover_cost": 18447701005255, + "sequencer_cost": 3384401898595 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796877492, - "congestion_multiplier": 4795328108, - "prover_cost": 183290310, - "sequencer_cost": 26672431 + "congestion_cost": 906797477, + "congestion_multiplier": 4952713444, + "prover_cost": 193848147, + "sequencer_cost": 35563241 } }, "parent_fee_header": { - "eth_per_fee_asset": 12362163, - "excess_mana": 1326401408, - "mana_used": 113463662 + "eth_per_fee_asset": 10507984, + "excess_mana": 1020159422, + "mana_used": 80440318 } }, { @@ -41497,21 +41497,21 @@ "blobs_needed": 1, "block_number": 547, "l1_block_number": 20974793, - "mana_spent": 84946124, - "size_in_fields": 3015, + "mana_spent": 68277041, + "size_in_fields": 2400, "slot_number": 547, "timestamp": 1729041515 }, "fee_header": { - "eth_per_fee_asset": 12373284, - "excess_mana": 1330529963, - "mana_used": 84946124 + "eth_per_fee_asset": 10436630, + "excess_mana": 1037102654, + "mana_used": 68277041 }, "oracle_input": { - "fee_asset_price_modifier": 12 + "fee_asset_price_modifier": -48 }, "outputs": { - "eth_per_fee_asset_at_execution": 12358454, + "eth_per_fee_asset_at_execution": 10486968, "l1_fee_oracle_output": { "base_fee": 8890810110, "blob_fee": 1 @@ -41528,22 +41528,22 @@ "slot_of_change": 545 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63595377140216, - "congestion_multiplier": 4743238157, - "prover_cost": 14831168202755, - "sequencer_cost": 2158233626957 + "congestion_cost": 88430732505335, + "congestion_multiplier": 5042389832, + "prover_cost": 18484670402351, + "sequencer_cost": 3391184277477 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785940543, - "congestion_multiplier": 4743238157, - "prover_cost": 183290310, - "sequencer_cost": 26672431 + "congestion_cost": 927370262, + "congestion_multiplier": 5042389832, + "prover_cost": 193848147, + "sequencer_cost": 35563241 } }, "parent_fee_header": { - "eth_per_fee_asset": 12358454, - "excess_mana": 1339865070, - "mana_used": 90664893 + "eth_per_fee_asset": 10486968, + "excess_mana": 1025599740, + "mana_used": 86502914 } }, { @@ -41551,21 +41551,21 @@ "blobs_needed": 1, "block_number": 548, "l1_block_number": 20974796, - "mana_spent": 97495287, - "size_in_fields": 3720, + "mana_spent": 73589773, + "size_in_fields": 2490, "slot_number": 548, "timestamp": 1729041551 }, "fee_header": { - "eth_per_fee_asset": 12336164, - "excess_mana": 1315476087, - "mana_used": 97495287 + "eth_per_fee_asset": 10458546, + "excess_mana": 1030379695, + "mana_used": 73589773 }, "oracle_input": { - "fee_asset_price_modifier": -30 + "fee_asset_price_modifier": 21 }, "outputs": { - "eth_per_fee_asset_at_execution": 12373284, + "eth_per_fee_asset_at_execution": 10436630, "l1_fee_oracle_output": { "base_fee": 8890810110, "blob_fee": 1 @@ -41582,22 +41582,22 @@ "slot_of_change": 550 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62113925050133, - "congestion_multiplier": 4660426758, - "prover_cost": 14813392305552, - "sequencer_cost": 2155646875963 + "congestion_cost": 87700871449884, + "congestion_multiplier": 4989782525, + "prover_cost": 18573825746434, + "sequencer_cost": 3407540652491 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 768553235, - "congestion_multiplier": 4660426758, - "prover_cost": 183290310, - "sequencer_cost": 26672431 + "congestion_cost": 915301546, + "congestion_multiplier": 4989782525, + "prover_cost": 193848147, + "sequencer_cost": 35563241 } }, "parent_fee_header": { - "eth_per_fee_asset": 12373284, - "excess_mana": 1330529963, - "mana_used": 84946124 + "eth_per_fee_asset": 10436630, + "excess_mana": 1037102654, + "mana_used": 68277041 } }, { @@ -41605,21 +41605,21 @@ "blobs_needed": 1, "block_number": 549, "l1_block_number": 20974798, - "mana_spent": 111970136, - "size_in_fields": 3855, + "mana_spent": 54839927, + "size_in_fields": 2175, "slot_number": 549, "timestamp": 1729041587 }, "fee_header": { - "eth_per_fee_asset": 12394143, - "excess_mana": 1312971374, - "mana_used": 111970136 + "eth_per_fee_asset": 10353960, + "excess_mana": 1028969468, + "mana_used": 54839927 }, "oracle_input": { - "fee_asset_price_modifier": 47 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12336164, + "eth_per_fee_asset_at_execution": 10458546, "l1_fee_oracle_output": { "base_fee": 8890810110, "blob_fee": 1 @@ -41636,22 +41636,22 @@ "slot_of_change": 550 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62068717390593, - "congestion_multiplier": 4646789303, - "prover_cost": 14857966382419, - "sequencer_cost": 2162133301730 + "congestion_cost": 87276567698799, + "congestion_multiplier": 4978817298, + "prover_cost": 18534904087050, + "sequencer_cost": 3400400112980 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 765689877, - "congestion_multiplier": 4646789303, - "prover_cost": 183290310, - "sequencer_cost": 26672431 + "congestion_cost": 912785998, + "congestion_multiplier": 4978817298, + "prover_cost": 193848147, + "sequencer_cost": 35563241 } }, "parent_fee_header": { - "eth_per_fee_asset": 12336164, - "excess_mana": 1315476087, - "mana_used": 97495287 + "eth_per_fee_asset": 10458546, + "excess_mana": 1030379695, + "mana_used": 73589773 } }, { @@ -41659,21 +41659,21 @@ "blobs_needed": 1, "block_number": 550, "l1_block_number": 20974801, - "mana_spent": 86870415, - "size_in_fields": 3495, + "mana_spent": 91662017, + "size_in_fields": 3090, "slot_number": 550, "timestamp": 1729041623 }, "fee_header": { - "eth_per_fee_asset": 12327214, - "excess_mana": 1324941510, - "mana_used": 86870415 + "eth_per_fee_asset": 10448181, + "excess_mana": 1008809395, + "mana_used": 91662017 }, "oracle_input": { - "fee_asset_price_modifier": -54 + "fee_asset_price_modifier": 91 }, "outputs": { - "eth_per_fee_asset_at_execution": 12394143, + "eth_per_fee_asset_at_execution": 10353960, "l1_fee_oracle_output": { "base_fee": 10676042346, "blob_fee": 1 @@ -41690,22 +41690,22 @@ "slot_of_change": 550 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64659833600436, - "congestion_multiplier": 4712325712, - "prover_cost": 14833473762567, - "sequencer_cost": 2584134134971 + "congestion_cost": 88369744909195, + "congestion_multiplier": 4824671544, + "prover_cost": 18980756638040, + "sequencer_cost": 4124428720992 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801403224, - "congestion_multiplier": 4712325712, - "prover_cost": 183848195, - "sequencer_cost": 32028128 + "congestion_cost": 914976804, + "congestion_multiplier": 4824671544, + "prover_cost": 196525995, + "sequencer_cost": 42704170 } }, "parent_fee_header": { - "eth_per_fee_asset": 12394143, - "excess_mana": 1312971374, - "mana_used": 111970136 + "eth_per_fee_asset": 10353960, + "excess_mana": 1028969468, + "mana_used": 54839927 } }, { @@ -41713,21 +41713,21 @@ "blobs_needed": 1, "block_number": 551, "l1_block_number": 20974804, - "mana_spent": 86362954, - "size_in_fields": 3000, + "mana_spent": 66022998, + "size_in_fields": 2265, "slot_number": 551, "timestamp": 1729041671 }, "fee_header": { - "eth_per_fee_asset": 12305025, - "excess_mana": 1311811925, - "mana_used": 86362954 + "eth_per_fee_asset": 10424150, + "excess_mana": 1025471412, + "mana_used": 66022998 }, "oracle_input": { - "fee_asset_price_modifier": -18 + "fee_asset_price_modifier": -23 }, "outputs": { - "eth_per_fee_asset_at_execution": 12327214, + "eth_per_fee_asset_at_execution": 10448181, "l1_fee_oracle_output": { "base_fee": 10676042346, "blob_fee": 1 @@ -41744,44 +41744,44 @@ "slot_of_change": 550 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63752895341965, - "congestion_multiplier": 4640489950, - "prover_cost": 14914010172940, - "sequencer_cost": 2598164354087 + "congestion_cost": 90481885602863, + "congestion_multiplier": 4951722051, + "prover_cost": 18809589439540, + "sequencer_cost": 4087234897635 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785895584, - "congestion_multiplier": 4640489950, - "prover_cost": 183848195, - "sequencer_cost": 32028128 + "congestion_cost": 945371118, + "congestion_multiplier": 4951722051, + "prover_cost": 196525995, + "sequencer_cost": 42704170 } }, "parent_fee_header": { - "eth_per_fee_asset": 12327214, - "excess_mana": 1324941510, - "mana_used": 86870415 + "eth_per_fee_asset": 10448181, + "excess_mana": 1008809395, + "mana_used": 91662017 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 552, "l1_block_number": 20974806, - "mana_spent": 129070172, - "size_in_fields": 4485, + "mana_spent": 91514525, + "size_in_fields": 3180, "slot_number": 552, "timestamp": 1729041695 }, "fee_header": { - "eth_per_fee_asset": 12281645, - "excess_mana": 1298174879, - "mana_used": 129070172 + "eth_per_fee_asset": 10491906, + "excess_mana": 1016494410, + "mana_used": 91514525 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": 65 }, "outputs": { - "eth_per_fee_asset_at_execution": 12305025, + "eth_per_fee_asset_at_execution": 10424150, "l1_fee_oracle_output": { "base_fee": 10676042346, "blob_fee": 1 @@ -41798,22 +41798,22 @@ "slot_of_change": 550 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62579214995500, - "congestion_multiplier": 4567036880, - "prover_cost": 14940903817750, - "sequencer_cost": 2602849486288 + "congestion_cost": 89110137037553, + "congestion_multiplier": 4882860822, + "prover_cost": 18852951559600, + "sequencer_cost": 4096657281410 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 770038805, - "congestion_multiplier": 4567036880, - "prover_cost": 183848195, - "sequencer_cost": 32028128 + "congestion_cost": 928897435, + "congestion_multiplier": 4882860822, + "prover_cost": 196525995, + "sequencer_cost": 42704170 } }, "parent_fee_header": { - "eth_per_fee_asset": 12305025, - "excess_mana": 1311811925, - "mana_used": 86362954 + "eth_per_fee_asset": 10424150, + "excess_mana": 1025471412, + "mana_used": 66022998 } }, { @@ -41821,21 +41821,21 @@ "blobs_needed": 1, "block_number": 553, "l1_block_number": 20974809, - "mana_spent": 103758590, - "size_in_fields": 3465, + "mana_spent": 68465980, + "size_in_fields": 2415, "slot_number": 553, "timestamp": 1729041731 }, "fee_header": { - "eth_per_fee_asset": 12327087, - "excess_mana": 1327245051, - "mana_used": 103758590 + "eth_per_fee_asset": 10565349, + "excess_mana": 1033008935, + "mana_used": 68465980 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": 70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12281645, + "eth_per_fee_asset_at_execution": 10491906, "l1_fee_oracle_output": { "base_fee": 10676042346, "blob_fee": 1 @@ -41852,22 +41852,22 @@ "slot_of_change": 555 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65475645648446, - "congestion_multiplier": 4725043233, - "prover_cost": 14969346125866, - "sequencer_cost": 2607804410566 + "congestion_cost": 91440250227176, + "congestion_multiplier": 5010290719, + "prover_cost": 18731200508278, + "sequencer_cost": 4070201353310 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 804148636, - "congestion_multiplier": 4725043233, - "prover_cost": 183848195, - "sequencer_cost": 32028128 + "congestion_cost": 959382510, + "congestion_multiplier": 5010290719, + "prover_cost": 196525995, + "sequencer_cost": 42704170 } }, "parent_fee_header": { - "eth_per_fee_asset": 12281645, - "excess_mana": 1298174879, - "mana_used": 129070172 + "eth_per_fee_asset": 10491906, + "excess_mana": 1016494410, + "mana_used": 91514525 } }, { @@ -41875,21 +41875,21 @@ "blobs_needed": 1, "block_number": 554, "l1_block_number": 20974812, - "mana_spent": 95965819, - "size_in_fields": 3450, + "mana_spent": 66560694, + "size_in_fields": 2685, "slot_number": 554, "timestamp": 1729041767 }, "fee_header": { - "eth_per_fee_asset": 12345577, - "excess_mana": 1331003641, - "mana_used": 95965819 + "eth_per_fee_asset": 10612893, + "excess_mana": 1026474915, + "mana_used": 66560694 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": 45 }, "outputs": { - "eth_per_fee_asset_at_execution": 12327087, + "eth_per_fee_asset_at_execution": 10565349, "l1_fee_oracle_output": { "base_fee": 10676042346, "blob_fee": 1 @@ -41906,22 +41906,22 @@ "slot_of_change": 555 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65598962999126, - "congestion_multiplier": 4745867603, - "prover_cost": 14914163824755, - "sequencer_cost": 2598191121715 + "congestion_cost": 89654115732477, + "congestion_multiplier": 4959479868, + "prover_cost": 18600994155518, + "sequencer_cost": 4041908128166 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 808644124, - "congestion_multiplier": 4745867603, - "prover_cost": 183848195, - "sequencer_cost": 32028128 + "congestion_cost": 947227022, + "congestion_multiplier": 4959479868, + "prover_cost": 196525995, + "sequencer_cost": 42704170 } }, "parent_fee_header": { - "eth_per_fee_asset": 12327087, - "excess_mana": 1327245051, - "mana_used": 103758590 + "eth_per_fee_asset": 10565349, + "excess_mana": 1033008935, + "mana_used": 68465980 } }, { @@ -41929,21 +41929,21 @@ "blobs_needed": 1, "block_number": 555, "l1_block_number": 20974815, - "mana_spent": 98446853, - "size_in_fields": 3540, + "mana_spent": 90941869, + "size_in_fields": 3150, "slot_number": 555, "timestamp": 1729041803 }, "fee_header": { - "eth_per_fee_asset": 12440637, - "excess_mana": 1326969460, - "mana_used": 98446853 + "eth_per_fee_asset": 10587422, + "excess_mana": 1018035609, + "mana_used": 90941869 }, "oracle_input": { - "fee_asset_price_modifier": 77 + "fee_asset_price_modifier": -24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12345577, + "eth_per_fee_asset_at_execution": 10612893, "l1_fee_oracle_output": { "base_fee": 10509900232, "blob_fee": 1 @@ -41960,22 +41960,22 @@ "slot_of_change": 555 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64943952153877, - "congestion_multiplier": 4723519929, - "prover_cost": 14887621291415, - "sequencer_cost": 2553926884098 + "congestion_cost": 87454992620768, + "congestion_multiplier": 4894614664, + "prover_cost": 18494182688924, + "sequencer_cost": 3961182026428 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801770562, - "congestion_multiplier": 4723519929, - "prover_cost": 183796275, - "sequencer_cost": 31529701 + "congestion_cost": 928150479, + "congestion_multiplier": 4894614664, + "prover_cost": 196276782, + "sequencer_cost": 42039601 } }, "parent_fee_header": { - "eth_per_fee_asset": 12345577, - "excess_mana": 1331003641, - "mana_used": 95965819 + "eth_per_fee_asset": 10612893, + "excess_mana": 1026474915, + "mana_used": 66560694 } }, { @@ -41983,21 +41983,21 @@ "blobs_needed": 1, "block_number": 556, "l1_block_number": 20974818, - "mana_spent": 96713012, - "size_in_fields": 3480, + "mana_spent": 64036214, + "size_in_fields": 2295, "slot_number": 556, "timestamp": 1729041839 }, "fee_header": { - "eth_per_fee_asset": 12423220, - "excess_mana": 1325416313, - "mana_used": 96713012 + "eth_per_fee_asset": 10495311, + "excess_mana": 1033977478, + "mana_used": 64036214 }, "oracle_input": { - "fee_asset_price_modifier": -14 + "fee_asset_price_modifier": -87 }, "outputs": { - "eth_per_fee_asset_at_execution": 12440637, + "eth_per_fee_asset_at_execution": 10587422, "l1_fee_oracle_output": { "base_fee": 10509900232, "blob_fee": 1 @@ -42014,22 +42014,22 @@ "slot_of_change": 555 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64299279128553, - "congestion_multiplier": 4714944228, - "prover_cost": 14773863669522, - "sequencer_cost": 2534412104461 + "congestion_cost": 90439716202868, + "congestion_multiplier": 5017866624, + "prover_cost": 18538675609606, + "sequencer_cost": 3970711755893 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799923991, - "congestion_multiplier": 4714944228, - "prover_cost": 183796275, - "sequencer_cost": 31529701 + "congestion_cost": 957523441, + "congestion_multiplier": 5017866624, + "prover_cost": 196276782, + "sequencer_cost": 42039601 } }, "parent_fee_header": { - "eth_per_fee_asset": 12440637, - "excess_mana": 1326969460, - "mana_used": 98446853 + "eth_per_fee_asset": 10587422, + "excess_mana": 1018035609, + "mana_used": 90941869 } }, { @@ -42037,21 +42037,21 @@ "blobs_needed": 1, "block_number": 557, "l1_block_number": 20974821, - "mana_spent": 90359047, - "size_in_fields": 3345, + "mana_spent": 79128655, + "size_in_fields": 2760, "slot_number": 557, "timestamp": 1729041875 }, "fee_header": { - "eth_per_fee_asset": 12357376, - "excess_mana": 1322129325, - "mana_used": 90359047 + "eth_per_fee_asset": 10484815, + "excess_mana": 1023013692, + "mana_used": 79128655 }, "oracle_input": { - "fee_asset_price_modifier": -53 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 12423220, + "eth_per_fee_asset_at_execution": 10495311, "l1_fee_oracle_output": { "base_fee": 10509900232, "blob_fee": 1 @@ -42068,22 +42068,22 @@ "slot_of_change": 555 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64075744050255, - "congestion_multiplier": 4696846431, - "prover_cost": 14794576204881, - "sequencer_cost": 2537965277924 + "congestion_cost": 89301241573499, + "congestion_multiplier": 4932773283, + "prover_cost": 18701378358393, + "sequencer_cost": 4005560292592 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796027065, - "congestion_multiplier": 4696846431, - "prover_cost": 183796275, - "sequencer_cost": 31529701 + "congestion_cost": 937244303, + "congestion_multiplier": 4932773283, + "prover_cost": 196276782, + "sequencer_cost": 42039601 } }, "parent_fee_header": { - "eth_per_fee_asset": 12423220, - "excess_mana": 1325416313, - "mana_used": 96713012 + "eth_per_fee_asset": 10495311, + "excess_mana": 1033977478, + "mana_used": 64036214 } }, { @@ -42091,21 +42091,21 @@ "blobs_needed": 1, "block_number": 558, "l1_block_number": 20974824, - "mana_spent": 93610706, - "size_in_fields": 3450, + "mana_spent": 67400381, + "size_in_fields": 2145, "slot_number": 558, "timestamp": 1729041911 }, "fee_header": { - "eth_per_fee_asset": 12333896, - "excess_mana": 1312488372, - "mana_used": 93610706 + "eth_per_fee_asset": 10549820, + "excess_mana": 1027142347, + "mana_used": 67400381 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": 62 }, "outputs": { - "eth_per_fee_asset_at_execution": 12357376, + "eth_per_fee_asset_at_execution": 10484815, "l1_fee_oracle_output": { "base_fee": 10509900232, "blob_fee": 1 @@ -42122,22 +42122,22 @@ "slot_of_change": 560 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63499175553128, - "congestion_multiplier": 4644164087, - "prover_cost": 14873406376888, - "sequencer_cost": 2551488358047 + "congestion_cost": 90115102078578, + "congestion_multiplier": 4964646337, + "prover_cost": 18720099687024, + "sequencer_cost": 4009570125940 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784683188, - "congestion_multiplier": 4644164087, - "prover_cost": 183796275, - "sequencer_cost": 31529701 + "congestion_cost": 944840174, + "congestion_multiplier": 4964646337, + "prover_cost": 196276782, + "sequencer_cost": 42039601 } }, "parent_fee_header": { - "eth_per_fee_asset": 12357376, - "excess_mana": 1322129325, - "mana_used": 90359047 + "eth_per_fee_asset": 10484815, + "excess_mana": 1023013692, + "mana_used": 79128655 } }, { @@ -42145,21 +42145,21 @@ "blobs_needed": 1, "block_number": 559, "l1_block_number": 20974827, - "mana_spent": 103338281, - "size_in_fields": 3900, + "mana_spent": 75170592, + "size_in_fields": 2520, "slot_number": 559, "timestamp": 1729041947 }, "fee_header": { - "eth_per_fee_asset": 12306761, - "excess_mana": 1306099078, - "mana_used": 103338281 + "eth_per_fee_asset": 10619448, + "excess_mana": 1019542728, + "mana_used": 75170592 }, "oracle_input": { - "fee_asset_price_modifier": -22 + "fee_asset_price_modifier": 66 }, "outputs": { - "eth_per_fee_asset_at_execution": 12333896, + "eth_per_fee_asset_at_execution": 10549820, "l1_fee_oracle_output": { "base_fee": 10509900232, "blob_fee": 1 @@ -42176,22 +42176,22 @@ "slot_of_change": 560 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63016221151857, - "congestion_multiplier": 4609576201, - "prover_cost": 14901720835007, - "sequencer_cost": 2556345618611 + "congestion_cost": 88238111455931, + "congestion_multiplier": 4906135958, + "prover_cost": 18604751739841, + "sequencer_cost": 3984864291524 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 777235518, - "congestion_multiplier": 4609576201, - "prover_cost": 183796275, - "sequencer_cost": 31529701 + "congestion_cost": 930896193, + "congestion_multiplier": 4906135958, + "prover_cost": 196276782, + "sequencer_cost": 42039601 } }, "parent_fee_header": { - "eth_per_fee_asset": 12333896, - "excess_mana": 1312488372, - "mana_used": 93610706 + "eth_per_fee_asset": 10549820, + "excess_mana": 1027142347, + "mana_used": 67400381 } }, { @@ -42199,21 +42199,21 @@ "blobs_needed": 1, "block_number": 560, "l1_block_number": 20974830, - "mana_spent": 121333845, - "size_in_fields": 3900, + "mana_spent": 79282984, + "size_in_fields": 3120, "slot_number": 560, "timestamp": 1729041983 }, "fee_header": { - "eth_per_fee_asset": 12336297, - "excess_mana": 1309437359, - "mana_used": 121333845 + "eth_per_fee_asset": 10681040, + "excess_mana": 1019713320, + "mana_used": 79282984 }, "oracle_input": { - "fee_asset_price_modifier": 24 + "fee_asset_price_modifier": 58 }, "outputs": { - "eth_per_fee_asset_at_execution": 12306761, + "eth_per_fee_asset_at_execution": 10619448, "l1_fee_oracle_output": { "base_fee": 11739497916, "blob_fee": 1 @@ -42230,22 +42230,22 @@ "slot_of_change": 560 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64671384127798, - "congestion_multiplier": 4627615438, - "prover_cost": 14965800099637, - "sequencer_cost": 2861719180214 + "congestion_cost": 90177246971783, + "congestion_multiplier": 4907441770, + "prover_cost": 18656447868101, + "sequencer_cost": 4421886335335 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 795895268, - "congestion_multiplier": 4627615438, - "prover_cost": 184180525, - "sequencer_cost": 35218494 + "congestion_cost": 957632585, + "congestion_multiplier": 4907441770, + "prover_cost": 198121178, + "sequencer_cost": 46957992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12306761, - "excess_mana": 1306099078, - "mana_used": 103338281 + "eth_per_fee_asset": 10619448, + "excess_mana": 1019542728, + "mana_used": 75170592 } }, { @@ -42253,21 +42253,21 @@ "blobs_needed": 1, "block_number": 561, "l1_block_number": 20974833, - "mana_spent": 87722402, - "size_in_fields": 3195, + "mana_spent": 99501353, + "size_in_fields": 3210, "slot_number": 561, "timestamp": 1729042019 }, "fee_header": { - "eth_per_fee_asset": 12393043, - "excess_mana": 1330771204, - "mana_used": 87722402 + "eth_per_fee_asset": 10599864, + "excess_mana": 1023996304, + "mana_used": 99501353 }, "oracle_input": { - "fee_asset_price_modifier": 46 + "fee_asset_price_modifier": -76 }, "outputs": { - "eth_per_fee_asset_at_execution": 12336297, + "eth_per_fee_asset_at_execution": 10681040, "l1_fee_oracle_output": { "base_fee": 11739497916, "blob_fee": 1 @@ -42284,22 +42284,22 @@ "slot_of_change": 560 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66596690157509, - "congestion_multiplier": 4744577134, - "prover_cost": 14929968450014, - "sequencer_cost": 2854867550612 + "congestion_cost": 90412109214085, + "congestion_multiplier": 4940340405, + "prover_cost": 18548865840780, + "sequencer_cost": 4396387617686 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 821556549, - "congestion_multiplier": 4744577134, - "prover_cost": 184180525, - "sequencer_cost": 35218494 + "congestion_cost": 965695355, + "congestion_multiplier": 4940340405, + "prover_cost": 198121178, + "sequencer_cost": 46957992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12336297, - "excess_mana": 1309437359, - "mana_used": 121333845 + "eth_per_fee_asset": 10681040, + "excess_mana": 1019713320, + "mana_used": 79282984 } }, { @@ -42307,21 +42307,21 @@ "blobs_needed": 1, "block_number": 562, "l1_block_number": 20974836, - "mana_spent": 97054736, - "size_in_fields": 3420, + "mana_spent": 69628504, + "size_in_fields": 2340, "slot_number": 562, "timestamp": 1729042055 }, "fee_header": { - "eth_per_fee_asset": 12269112, - "excess_mana": 1318493606, - "mana_used": 97054736 + "eth_per_fee_asset": 10599864, + "excess_mana": 1048497657, + "mana_used": 69628504 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 12393043, + "eth_per_fee_asset_at_execution": 10599864, "l1_fee_oracle_output": { "base_fee": 11739497916, "blob_fee": 1 @@ -42338,22 +42338,22 @@ "slot_of_change": 560 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65093805290598, - "congestion_multiplier": 4676909461, - "prover_cost": 14861606225364, - "sequencer_cost": 2841795513822 + "congestion_cost": 95554954195639, + "congestion_multiplier": 5132825809, + "prover_cost": 18690916977803, + "sequencer_cost": 4430056083739 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 806710328, - "congestion_multiplier": 4676909461, - "prover_cost": 184180525, - "sequencer_cost": 35218494 + "congestion_cost": 1012869519, + "congestion_multiplier": 5132825809, + "prover_cost": 198121178, + "sequencer_cost": 46957992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12393043, - "excess_mana": 1330771204, - "mana_used": 87722402 + "eth_per_fee_asset": 10599864, + "excess_mana": 1023996304, + "mana_used": 99501353 } }, { @@ -42361,21 +42361,21 @@ "blobs_needed": 1, "block_number": 563, "l1_block_number": 20974839, - "mana_spent": 97218936, - "size_in_fields": 3390, + "mana_spent": 62158406, + "size_in_fields": 2190, "slot_number": 563, "timestamp": 1729042091 }, "fee_header": { - "eth_per_fee_asset": 12221262, - "excess_mana": 1315548342, - "mana_used": 97218936 + "eth_per_fee_asset": 10651803, + "excess_mana": 1043126161, + "mana_used": 62158406 }, "oracle_input": { - "fee_asset_price_modifier": -39 + "fee_asset_price_modifier": 49 }, "outputs": { - "eth_per_fee_asset_at_execution": 12269112, + "eth_per_fee_asset_at_execution": 10599864, "l1_fee_oracle_output": { "base_fee": 11739497916, "blob_fee": 1 @@ -42392,22 +42392,22 @@ "slot_of_change": 565 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65463619779492, - "congestion_multiplier": 4660820760, - "prover_cost": 15011724157380, - "sequencer_cost": 2870500652370 + "congestion_cost": 94564660074884, + "congestion_multiplier": 5089994824, + "prover_cost": 18690916977803, + "sequencer_cost": 4430056083739 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 803180483, - "congestion_multiplier": 4660820760, - "prover_cost": 184180525, - "sequencer_cost": 35218494 + "congestion_cost": 1002372536, + "congestion_multiplier": 5089994824, + "prover_cost": 198121178, + "sequencer_cost": 46957992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12269112, - "excess_mana": 1318493606, - "mana_used": 97054736 + "eth_per_fee_asset": 10599864, + "excess_mana": 1048497657, + "mana_used": 69628504 } }, { @@ -42415,21 +42415,21 @@ "blobs_needed": 1, "block_number": 564, "l1_block_number": 20974842, - "mana_spent": 116194947, - "size_in_fields": 3930, + "mana_spent": 73206794, + "size_in_fields": 2595, "slot_number": 564, "timestamp": 1729042127 }, "fee_header": { - "eth_per_fee_asset": 12251815, - "excess_mana": 1312767278, - "mana_used": 116194947 + "eth_per_fee_asset": 10700801, + "excess_mana": 1030284567, + "mana_used": 73206794 }, "oracle_input": { - "fee_asset_price_modifier": 25 + "fee_asset_price_modifier": 46 }, "outputs": { - "eth_per_fee_asset_at_execution": 12221262, + "eth_per_fee_asset_at_execution": 10651803, "l1_fee_oracle_output": { "base_fee": 11739497916, "blob_fee": 1 @@ -42446,22 +42446,22 @@ "slot_of_change": 565 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65448116160181, - "congestion_multiplier": 4645679818, - "prover_cost": 15070499675075, - "sequencer_cost": 2881739545393 + "congestion_cost": 91780811755531, + "congestion_multiplier": 4989042098, + "prover_cost": 18599778647803, + "sequencer_cost": 4408454793992 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799858575, - "congestion_multiplier": 4645679818, - "prover_cost": 184180525, - "sequencer_cost": 35218494 + "congestion_cost": 977631126, + "congestion_multiplier": 4989042098, + "prover_cost": 198121178, + "sequencer_cost": 46957992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12221262, - "excess_mana": 1315548342, - "mana_used": 97218936 + "eth_per_fee_asset": 10651803, + "excess_mana": 1043126161, + "mana_used": 62158406 } }, { @@ -42469,21 +42469,21 @@ "blobs_needed": 1, "block_number": 565, "l1_block_number": 20974845, - "mana_spent": 109721749, - "size_in_fields": 3675, + "mana_spent": 72885078, + "size_in_fields": 2505, "slot_number": 565, "timestamp": 1729042163 }, "fee_header": { - "eth_per_fee_asset": 12317974, - "excess_mana": 1328962225, - "mana_used": 109721749 + "eth_per_fee_asset": 10704011, + "excess_mana": 1028491361, + "mana_used": 72885078 }, "oracle_input": { - "fee_asset_price_modifier": 54 + "fee_asset_price_modifier": 3 }, "outputs": { - "eth_per_fee_asset_at_execution": 12251815, + "eth_per_fee_asset_at_execution": 10700801, "l1_fee_oracle_output": { "base_fee": 11927979805, "blob_fee": 1 @@ -42500,22 +42500,22 @@ "slot_of_change": 565 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67066580747424, - "congestion_multiplier": 4734545830, - "prover_cost": 15037725022783, - "sequencer_cost": 2920705217962 + "congestion_cost": 91426454057038, + "congestion_multiplier": 4975105247, + "prover_cost": 18541032675966, + "sequencer_cost": 4458724164668 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 821687340, - "congestion_multiplier": 4734545830, - "prover_cost": 184239425, - "sequencer_cost": 35783940 + "congestion_cost": 978336291, + "congestion_multiplier": 4975105247, + "prover_cost": 198403901, + "sequencer_cost": 47711920 } }, "parent_fee_header": { - "eth_per_fee_asset": 12251815, - "excess_mana": 1312767278, - "mana_used": 116194947 + "eth_per_fee_asset": 10700801, + "excess_mana": 1030284567, + "mana_used": 73206794 } }, { @@ -42523,21 +42523,21 @@ "blobs_needed": 1, "block_number": 566, "l1_block_number": 20974848, - "mana_spent": 95938954, - "size_in_fields": 3270, + "mana_spent": 68756911, + "size_in_fields": 2505, "slot_number": 566, "timestamp": 1729042199 }, "fee_header": { - "eth_per_fee_asset": 12411590, - "excess_mana": 1338683974, - "mana_used": 95938954 + "eth_per_fee_asset": 10729700, + "excess_mana": 1026376439, + "mana_used": 68756911 }, "oracle_input": { - "fee_asset_price_modifier": 76 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12317974, + "eth_per_fee_asset_at_execution": 10704011, "l1_fee_oracle_output": { "base_fee": 11927979805, "blob_fee": 1 @@ -42554,22 +42554,22 @@ "slot_of_change": 565 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67673780282375, - "congestion_multiplier": 4788706105, - "prover_cost": 14956958425144, - "sequencer_cost": 2905018309018 + "congestion_cost": 91022247641562, + "congestion_multiplier": 4958718038, + "prover_cost": 18535472450468, + "sequencer_cost": 4457387048650 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 833603866, - "congestion_multiplier": 4788706105, - "prover_cost": 184239425, - "sequencer_cost": 35783940 + "congestion_cost": 974303140, + "congestion_multiplier": 4958718038, + "prover_cost": 198403901, + "sequencer_cost": 47711920 } }, "parent_fee_header": { - "eth_per_fee_asset": 12317974, - "excess_mana": 1328962225, - "mana_used": 109721749 + "eth_per_fee_asset": 10704011, + "excess_mana": 1028491361, + "mana_used": 72885078 } }, { @@ -42577,21 +42577,21 @@ "blobs_needed": 1, "block_number": 567, "l1_block_number": 20974851, - "mana_spent": 97222731, - "size_in_fields": 3150, + "mana_spent": 93323876, + "size_in_fields": 3090, "slot_number": 567, "timestamp": 1729042235 }, "fee_header": { - "eth_per_fee_asset": 12370631, - "excess_mana": 1334622928, - "mana_used": 97222731 + "eth_per_fee_asset": 10723262, + "excess_mana": 1020133350, + "mana_used": 93323876 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": -6 }, "outputs": { - "eth_per_fee_asset_at_execution": 12411590, + "eth_per_fee_asset_at_execution": 10729700, "l1_fee_oracle_output": { "base_fee": 11927979805, "blob_fee": 1 @@ -42608,22 +42608,22 @@ "slot_of_change": 565 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66760947710971, - "congestion_multiplier": 4766006902, - "prover_cost": 14844143659274, - "sequencer_cost": 2883106838045 + "congestion_cost": 89701939942403, + "congestion_multiplier": 4910658410, + "prover_cost": 18491094904797, + "sequencer_cost": 4446715192410 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 828609511, - "congestion_multiplier": 4766006902, - "prover_cost": 184239425, - "sequencer_cost": 35783940 + "congestion_cost": 962474905, + "congestion_multiplier": 4910658410, + "prover_cost": 198403901, + "sequencer_cost": 47711920 } }, "parent_fee_header": { - "eth_per_fee_asset": 12411590, - "excess_mana": 1338683974, - "mana_used": 95938954 + "eth_per_fee_asset": 10729700, + "excess_mana": 1026376439, + "mana_used": 68756911 } }, { @@ -42631,21 +42631,21 @@ "blobs_needed": 1, "block_number": 568, "l1_block_number": 20974854, - "mana_spent": 47056984, - "size_in_fields": 1560, + "mana_spent": 71436080, + "size_in_fields": 2340, "slot_number": 568, "timestamp": 1729042271 }, "fee_header": { - "eth_per_fee_asset": 12370631, - "excess_mana": 1331845659, - "mana_used": 47056984 + "eth_per_fee_asset": 10797252, + "excess_mana": 1038457226, + "mana_used": 71436080 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": 69 }, "outputs": { - "eth_per_fee_asset_at_execution": 12370631, + "eth_per_fee_asset_at_execution": 10723262, "l1_fee_oracle_output": { "base_fee": 11927979805, "blob_fee": 1 @@ -42662,44 +42662,44 @@ "slot_of_change": 570 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66706994008633, - "congestion_multiplier": 4750545351, - "prover_cost": 14893292427848, - "sequencer_cost": 2892652767673 + "congestion_cost": 93024052475824, + "congestion_multiplier": 5053056335, + "prover_cost": 18502196533108, + "sequencer_cost": 4449384897991 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 825207608, - "congestion_multiplier": 4750545351, - "prover_cost": 184239425, - "sequencer_cost": 35783940 + "congestion_cost": 997521287, + "congestion_multiplier": 5053056335, + "prover_cost": 198403901, + "sequencer_cost": 47711920 } }, "parent_fee_header": { - "eth_per_fee_asset": 12370631, - "excess_mana": 1334622928, - "mana_used": 97222731 + "eth_per_fee_asset": 10723262, + "excess_mana": 1020133350, + "mana_used": 93323876 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 569, "l1_block_number": 20974857, - "mana_spent": 123488245, - "size_in_fields": 4485, + "mana_spent": 65324979, + "size_in_fields": 2310, "slot_number": 569, "timestamp": 1729042307 }, "fee_header": { - "eth_per_fee_asset": 12339704, - "excess_mana": 1278902643, - "mana_used": 123488245 + "eth_per_fee_asset": 10818846, + "excess_mana": 1034893306, + "mana_used": 65324979 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": 20 }, "outputs": { - "eth_per_fee_asset_at_execution": 12370631, + "eth_per_fee_asset_at_execution": 10797252, "l1_fee_oracle_output": { "base_fee": 11927979805, "blob_fee": 1 @@ -42716,22 +42716,22 @@ "slot_of_change": 570 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 61632023055251, - "congestion_multiplier": 4465209320, - "prover_cost": 14893292427848, - "sequencer_cost": 2892652767673 + "congestion_cost": 91747993285699, + "congestion_multiplier": 5025040732, + "prover_cost": 18375407094324, + "sequencer_cost": 4418894733586 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 762427015, - "congestion_multiplier": 4465209320, - "prover_cost": 184239425, - "sequencer_cost": 35783940 + "congestion_cost": 990626204, + "congestion_multiplier": 5025040732, + "prover_cost": 198403901, + "sequencer_cost": 47711920 } }, "parent_fee_header": { - "eth_per_fee_asset": 12370631, - "excess_mana": 1331845659, - "mana_used": 47056984 + "eth_per_fee_asset": 10797252, + "excess_mana": 1038457226, + "mana_used": 71436080 } }, { @@ -42739,21 +42739,21 @@ "blobs_needed": 1, "block_number": 570, "l1_block_number": 20974860, - "mana_spent": 100619604, - "size_in_fields": 3495, + "mana_spent": 74131617, + "size_in_fields": 2595, "slot_number": 570, "timestamp": 1729042343 }, "fee_header": { - "eth_per_fee_asset": 12350809, - "excess_mana": 1302390888, - "mana_used": 100619604 + "eth_per_fee_asset": 10710657, + "excess_mana": 1025218285, + "mana_used": 74131617 }, "oracle_input": { - "fee_asset_price_modifier": 9 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12339704, + "eth_per_fee_asset_at_execution": 10818846, "l1_fee_oracle_output": { "base_fee": 11106740027, "blob_fee": 1 @@ -42770,44 +42770,44 @@ "slot_of_change": 570 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63213455849509, - "congestion_multiplier": 4589620496, - "prover_cost": 14909821823928, - "sequencer_cost": 2700244754656 + "congestion_cost": 88203473364905, + "congestion_multiplier": 4949767110, + "prover_cost": 18224868160616, + "sequencer_cost": 4106441759131 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780035334, - "congestion_multiplier": 4589620496, - "prover_cost": 183982788, - "sequencer_cost": 33320221 + "congestion_cost": 954259795, + "congestion_multiplier": 4949767110, + "prover_cost": 197172042, + "sequencer_cost": 44426961 } }, "parent_fee_header": { - "eth_per_fee_asset": 12339704, - "excess_mana": 1278902643, - "mana_used": 123488245 + "eth_per_fee_asset": 10818846, + "excess_mana": 1034893306, + "mana_used": 65324979 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 571, "l1_block_number": 20974863, - "mana_spent": 127930087, - "size_in_fields": 4395, + "mana_spent": 74961830, + "size_in_fields": 2730, "slot_number": 571, "timestamp": 1729042379 }, "fee_header": { - "eth_per_fee_asset": 12385391, - "excess_mana": 1303010492, - "mana_used": 127930087 + "eth_per_fee_asset": 10605692, + "excess_mana": 1024349902, + "mana_used": 74961830 }, "oracle_input": { - "fee_asset_price_modifier": 28 + "fee_asset_price_modifier": -98 }, "outputs": { - "eth_per_fee_asset_at_execution": 12350809, + "eth_per_fee_asset_at_execution": 10710657, "l1_fee_oracle_output": { "base_fee": 11106740027, "blob_fee": 1 @@ -42824,22 +42824,22 @@ "slot_of_change": 570 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63215179183809, - "congestion_multiplier": 4592948887, - "prover_cost": 14896415935183, - "sequencer_cost": 2697816879850 + "congestion_cost": 88943272947682, + "congestion_multiplier": 4943066312, + "prover_cost": 18408958666122, + "sequencer_cost": 4147921177945 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780758604, - "congestion_multiplier": 4592948887, - "prover_cost": 183982788, - "sequencer_cost": 33320221 + "congestion_cost": 952640889, + "congestion_multiplier": 4943066312, + "prover_cost": 197172042, + "sequencer_cost": 44426961 } }, "parent_fee_header": { - "eth_per_fee_asset": 12350809, - "excess_mana": 1302390888, - "mana_used": 100619604 + "eth_per_fee_asset": 10710657, + "excess_mana": 1025218285, + "mana_used": 74131617 } }, { @@ -42847,21 +42847,21 @@ "blobs_needed": 1, "block_number": 572, "l1_block_number": 20974866, - "mana_spent": 86843557, - "size_in_fields": 3180, + "mana_spent": 75159114, + "size_in_fields": 2550, "slot_number": 572, "timestamp": 1729042415 }, "fee_header": { - "eth_per_fee_asset": 12420070, - "excess_mana": 1330940579, - "mana_used": 86843557 + "eth_per_fee_asset": 10555845, + "excess_mana": 1024311732, + "mana_used": 75159114 }, "oracle_input": { - "fee_asset_price_modifier": 28 + "fee_asset_price_modifier": -47 }, "outputs": { - "eth_per_fee_asset_at_execution": 12385391, + "eth_per_fee_asset_at_execution": 10605692, "l1_fee_oracle_output": { "base_fee": 11106740027, "blob_fee": 1 @@ -42878,22 +42878,22 @@ "slot_of_change": 570 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65715504096722, - "congestion_multiplier": 4745517454, - "prover_cost": 14854822750449, - "sequencer_cost": 2690284142019 + "congestion_cost": 89816843634532, + "congestion_multiplier": 4942771985, + "prover_cost": 18591152939384, + "sequencer_cost": 4188973336205 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 813912213, - "congestion_multiplier": 4745517454, - "prover_cost": 183982788, - "sequencer_cost": 33320221 + "congestion_cost": 952569780, + "congestion_multiplier": 4942771985, + "prover_cost": 197172042, + "sequencer_cost": 44426961 } }, "parent_fee_header": { - "eth_per_fee_asset": 12385391, - "excess_mana": 1303010492, - "mana_used": 127930087 + "eth_per_fee_asset": 10605692, + "excess_mana": 1024349902, + "mana_used": 74961830 } }, { @@ -42901,21 +42901,21 @@ "blobs_needed": 1, "block_number": 573, "l1_block_number": 20974869, - "mana_spent": 88619966, - "size_in_fields": 3210, + "mana_spent": 71703190, + "size_in_fields": 2475, "slot_number": 573, "timestamp": 1729042451 }, "fee_header": { - "eth_per_fee_asset": 12466024, - "excess_mana": 1317784136, - "mana_used": 88619966 + "eth_per_fee_asset": 10579067, + "excess_mana": 1024470846, + "mana_used": 71703190 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12420070, + "eth_per_fee_asset_at_execution": 10555845, "l1_fee_oracle_output": { "base_fee": 11106740027, "blob_fee": 1 @@ -42932,44 +42932,44 @@ "slot_of_change": 575 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64263746017535, - "congestion_multiplier": 4673028863, - "prover_cost": 14813345496443, - "sequencer_cost": 2682772399834 + "congestion_cost": 90269062400974, + "congestion_multiplier": 4943999021, + "prover_cost": 18678944414209, + "sequencer_cost": 4208754580993 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798160224, - "congestion_multiplier": 4673028863, - "prover_cost": 183982788, - "sequencer_cost": 33320221 + "congestion_cost": 952866231, + "congestion_multiplier": 4943999021, + "prover_cost": 197172042, + "sequencer_cost": 44426961 } }, "parent_fee_header": { - "eth_per_fee_asset": 12420070, - "excess_mana": 1330940579, - "mana_used": 86843557 + "eth_per_fee_asset": 10555845, + "excess_mana": 1024311732, + "mana_used": 75159114 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 574, "l1_block_number": 20974872, - "mana_spent": 120424598, - "size_in_fields": 4170, + "mana_spent": 94262139, + "size_in_fields": 3090, "slot_number": 574, "timestamp": 1729042487 }, "fee_header": { - "eth_per_fee_asset": 12467270, - "excess_mana": 1306404102, - "mana_used": 120424598 + "eth_per_fee_asset": 10513476, + "excess_mana": 1021174036, + "mana_used": 94262139 }, "oracle_input": { - "fee_asset_price_modifier": 1 + "fee_asset_price_modifier": -62 }, "outputs": { - "eth_per_fee_asset_at_execution": 12466024, + "eth_per_fee_asset_at_execution": 10579067, "l1_fee_oracle_output": { "base_fee": 11106740027, "blob_fee": 1 @@ -42986,22 +42986,22 @@ "slot_of_change": 575 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62949446351139, - "congestion_multiplier": 4611221551, - "prover_cost": 14758738471866, - "sequencer_cost": 2672882789252 + "congestion_cost": 89491713966837, + "congestion_multiplier": 4918637192, + "prover_cost": 18637942457497, + "sequencer_cost": 4199515987563 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784729309, - "congestion_multiplier": 4611221551, - "prover_cost": 183982788, - "sequencer_cost": 33320221 + "congestion_cost": 946738838, + "congestion_multiplier": 4918637192, + "prover_cost": 197172042, + "sequencer_cost": 44426961 } }, "parent_fee_header": { - "eth_per_fee_asset": 12466024, - "excess_mana": 1317784136, - "mana_used": 88619966 + "eth_per_fee_asset": 10579067, + "excess_mana": 1024470846, + "mana_used": 71703190 } }, { @@ -43009,21 +43009,21 @@ "blobs_needed": 1, "block_number": 575, "l1_block_number": 20974875, - "mana_spent": 103366555, - "size_in_fields": 3630, + "mana_spent": 71543913, + "size_in_fields": 2145, "slot_number": 575, "timestamp": 1729042523 }, "fee_header": { - "eth_per_fee_asset": 12360051, - "excess_mana": 1326828700, - "mana_used": 103366555 + "eth_per_fee_asset": 10443035, + "excess_mana": 1040436175, + "mana_used": 71543913 }, "oracle_input": { - "fee_asset_price_modifier": -86 + "fee_asset_price_modifier": -67 }, "outputs": { - "eth_per_fee_asset_at_execution": 12467270, + "eth_per_fee_asset_at_execution": 10513476, "l1_fee_oracle_output": { "base_fee": 11497572527, "blob_fee": 1 @@ -43040,22 +43040,22 @@ "slot_of_change": 575 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65273523072814, - "congestion_multiplier": 4722742080, - "prover_cost": 14767059909668, - "sequencer_cost": 2766661666909 + "congestion_cost": 94329885282470, + "congestion_multiplier": 5068680035, + "prover_cost": 18809981589344, + "sequencer_cost": 4374413467059 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 813782636, - "congestion_multiplier": 4722742080, - "prover_cost": 184104923, - "sequencer_cost": 34492718 + "congestion_cost": 991734985, + "congestion_multiplier": 5068680035, + "prover_cost": 197758290, + "sequencer_cost": 45990291 } }, "parent_fee_header": { - "eth_per_fee_asset": 12467270, - "excess_mana": 1306404102, - "mana_used": 120424598 + "eth_per_fee_asset": 10513476, + "excess_mana": 1021174036, + "mana_used": 94262139 } }, { @@ -43063,21 +43063,21 @@ "blobs_needed": 1, "block_number": 576, "l1_block_number": 20974878, - "mana_spent": 84884230, - "size_in_fields": 3030, + "mana_spent": 65593135, + "size_in_fields": 2520, "slot_number": 576, "timestamp": 1729042559 }, "fee_header": { - "eth_per_fee_asset": 12348926, - "excess_mana": 1330195255, - "mana_used": 84884230 + "eth_per_fee_asset": 10399174, + "excess_mana": 1036980088, + "mana_used": 65593135 }, "oracle_input": { - "fee_asset_price_modifier": -9 + "fee_asset_price_modifier": -42 }, "outputs": { - "eth_per_fee_asset_at_execution": 12360051, + "eth_per_fee_asset_at_execution": 10443035, "l1_fee_oracle_output": { "base_fee": 11497572527, "blob_fee": 1 @@ -43094,22 +43094,22 @@ "slot_of_change": 575 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66169392585840, - "congestion_multiplier": 4741381029, - "prover_cost": 14895158846837, - "sequencer_cost": 2790661462482 + "congestion_cost": 94330029919464, + "congestion_multiplier": 5041425804, + "prover_cost": 18936859830500, + "sequencer_cost": 4403920028996 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 817857067, - "congestion_multiplier": 4741381029, - "prover_cost": 184104923, - "sequencer_cost": 34492718 + "congestion_cost": 985091804, + "congestion_multiplier": 5041425804, + "prover_cost": 197758290, + "sequencer_cost": 45990291 } }, "parent_fee_header": { - "eth_per_fee_asset": 12360051, - "excess_mana": 1326828700, - "mana_used": 103366555 + "eth_per_fee_asset": 10443035, + "excess_mana": 1040436175, + "mana_used": 71543913 } }, { @@ -43117,21 +43117,21 @@ "blobs_needed": 1, "block_number": 577, "l1_block_number": 20974881, - "mana_spent": 113427639, - "size_in_fields": 3720, + "mana_spent": 64190332, + "size_in_fields": 2295, "slot_number": 577, "timestamp": 1729042595 }, "fee_header": { - "eth_per_fee_asset": 12342751, - "excess_mana": 1315079485, - "mana_used": 113427639 + "eth_per_fee_asset": 10465728, + "excess_mana": 1027573223, + "mana_used": 64190332 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": 64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12348926, + "eth_per_fee_asset_at_execution": 10399174, "l1_fee_oracle_output": { "base_fee": 11497572527, "blob_fee": 1 @@ -43148,22 +43148,22 @@ "slot_of_change": 575 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64757699171572, - "congestion_multiplier": 4658264708, - "prover_cost": 14908577717609, - "sequencer_cost": 2793175536075 + "congestion_cost": 93006482822579, + "congestion_multiplier": 4967984528, + "prover_cost": 19016730559562, + "sequencer_cost": 4422494613515 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799688035, - "congestion_multiplier": 4658264708, - "prover_cost": 184104923, - "sequencer_cost": 34492718 + "congestion_cost": 967190598, + "congestion_multiplier": 4967984528, + "prover_cost": 197758290, + "sequencer_cost": 45990291 } }, "parent_fee_header": { - "eth_per_fee_asset": 12348926, - "excess_mana": 1330195255, - "mana_used": 84884230 + "eth_per_fee_asset": 10399174, + "excess_mana": 1036980088, + "mana_used": 65593135 } }, { @@ -43171,21 +43171,21 @@ "blobs_needed": 1, "block_number": 578, "l1_block_number": 20974884, - "mana_spent": 90154341, - "size_in_fields": 3120, + "mana_spent": 80296472, + "size_in_fields": 2700, "slot_number": 578, "timestamp": 1729042631 }, "fee_header": { - "eth_per_fee_asset": 12264991, - "excess_mana": 1328507124, - "mana_used": 90154341 + "eth_per_fee_asset": 10441656, + "excess_mana": 1016763555, + "mana_used": 80296472 }, "oracle_input": { - "fee_asset_price_modifier": -63 + "fee_asset_price_modifier": -23 }, "outputs": { - "eth_per_fee_asset_at_execution": 12342751, + "eth_per_fee_asset_at_execution": 10465728, "l1_fee_oracle_output": { "base_fee": 11497572527, "blob_fee": 1 @@ -43202,22 +43202,22 @@ "slot_of_change": 580 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66096445678926, - "congestion_multiplier": 4732025506, - "prover_cost": 14916036384434, - "sequencer_cost": 2794572944071 + "congestion_cost": 90480245712482, + "congestion_multiplier": 4884911400, + "prover_cost": 18895798744245, + "sequencer_cost": 4394370941038 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815811971, - "congestion_multiplier": 4732025506, - "prover_cost": 184104923, - "sequencer_cost": 34492718 + "congestion_cost": 946941641, + "congestion_multiplier": 4884911400, + "prover_cost": 197758290, + "sequencer_cost": 45990291 } }, "parent_fee_header": { - "eth_per_fee_asset": 12342751, - "excess_mana": 1315079485, - "mana_used": 113427639 + "eth_per_fee_asset": 10465728, + "excess_mana": 1027573223, + "mana_used": 64190332 } }, { @@ -43225,21 +43225,21 @@ "blobs_needed": 1, "block_number": 579, "l1_block_number": 20974887, - "mana_spent": 103851879, - "size_in_fields": 3570, + "mana_spent": 92447781, + "size_in_fields": 3045, "slot_number": 579, "timestamp": 1729042667 }, "fee_header": { - "eth_per_fee_asset": 12228196, - "excess_mana": 1318661465, - "mana_used": 103851879 + "eth_per_fee_asset": 10482378, + "excess_mana": 1022060027, + "mana_used": 92447781 }, "oracle_input": { - "fee_asset_price_modifier": -30 + "fee_asset_price_modifier": 39 }, "outputs": { - "eth_per_fee_asset_at_execution": 12264991, + "eth_per_fee_asset_at_execution": 10441656, "l1_fee_oracle_output": { "base_fee": 11497572527, "blob_fee": 1 @@ -43256,22 +43256,22 @@ "slot_of_change": 580 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65549541781156, - "congestion_multiplier": 4677828073, - "prover_cost": 15010604002890, - "sequencer_cost": 2812290526753 + "congestion_cost": 91634935109910, + "congestion_multiplier": 4925440167, + "prover_cost": 18939360768063, + "sequencer_cost": 4404501642269 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 803964540, - "congestion_multiplier": 4677828073, - "prover_cost": 184104923, - "sequencer_cost": 34492718 + "congestion_cost": 956820470, + "congestion_multiplier": 4925440167, + "prover_cost": 197758290, + "sequencer_cost": 45990291 } }, "parent_fee_header": { - "eth_per_fee_asset": 12264991, - "excess_mana": 1328507124, - "mana_used": 90154341 + "eth_per_fee_asset": 10441656, + "excess_mana": 1016763555, + "mana_used": 80296472 } }, { @@ -43279,21 +43279,21 @@ "blobs_needed": 1, "block_number": 580, "l1_block_number": 20974890, - "mana_spent": 99771108, - "size_in_fields": 3375, + "mana_spent": 62414519, + "size_in_fields": 2265, "slot_number": 580, "timestamp": 1729042703 }, "fee_header": { - "eth_per_fee_asset": 12195179, - "excess_mana": 1322513344, - "mana_used": 99771108 + "eth_per_fee_asset": 10551561, + "excess_mana": 1039507808, + "mana_used": 62414519 }, "oracle_input": { - "fee_asset_price_modifier": -27 + "fee_asset_price_modifier": 66 }, "outputs": { - "eth_per_fee_asset_at_execution": 12228196, + "eth_per_fee_asset_at_execution": 10482378, "l1_fee_oracle_output": { "base_fee": 9240923295, "blob_fee": 1 @@ -43310,22 +43310,22 @@ "slot_of_change": 580 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63863308700646, - "congestion_multiplier": 4698957209, - "prover_cost": 14998101109927, - "sequencer_cost": 2267118551257 + "congestion_cost": 89630360591843, + "congestion_multiplier": 5061344619, + "prover_cost": 18542864605723, + "sequencer_cost": 3526269897919 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780933056, - "congestion_multiplier": 4698957209, - "prover_cost": 183399720, - "sequencer_cost": 27722770 + "congestion_cost": 939539320, + "congestion_multiplier": 5061344619, + "prover_cost": 194373316, + "sequencer_cost": 36963694 } }, "parent_fee_header": { - "eth_per_fee_asset": 12228196, - "excess_mana": 1318661465, - "mana_used": 103851879 + "eth_per_fee_asset": 10482378, + "excess_mana": 1022060027, + "mana_used": 92447781 } }, { @@ -43333,21 +43333,21 @@ "blobs_needed": 1, "block_number": 581, "l1_block_number": 20974893, - "mana_spent": 98452182, - "size_in_fields": 3375, + "mana_spent": 68154990, + "size_in_fields": 2430, "slot_number": 581, "timestamp": 1729042739 }, "fee_header": { - "eth_per_fee_asset": 12242740, - "excess_mana": 1322284452, - "mana_used": 98452182 + "eth_per_fee_asset": 10514630, + "excess_mana": 1026922327, + "mana_used": 68154990 }, "oracle_input": { - "fee_asset_price_modifier": 39 + "fee_asset_price_modifier": -35 }, "outputs": { - "eth_per_fee_asset_at_execution": 12195179, + "eth_per_fee_asset_at_execution": 10551561, "l1_fee_oracle_output": { "base_fee": 9240923295, "blob_fee": 1 @@ -43364,22 +43364,22 @@ "slot_of_change": 580 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64014428570504, - "congestion_multiplier": 4697698979, - "prover_cost": 15038706688931, - "sequencer_cost": 2273256505707 + "congestion_cost": 86885276311250, + "congestion_multiplier": 4962942608, + "prover_cost": 18421285343468, + "sequencer_cost": 3503149344443 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780667415, - "congestion_multiplier": 4697698979, - "prover_cost": 183399720, - "sequencer_cost": 27722770 + "congestion_cost": 916775293, + "congestion_multiplier": 4962942608, + "prover_cost": 194373316, + "sequencer_cost": 36963694 } }, "parent_fee_header": { - "eth_per_fee_asset": 12195179, - "excess_mana": 1322513344, - "mana_used": 99771108 + "eth_per_fee_asset": 10551561, + "excess_mana": 1039507808, + "mana_used": 62414519 } }, { @@ -43387,21 +43387,21 @@ "blobs_needed": 1, "block_number": 582, "l1_block_number": 20974896, - "mana_spent": 105889211, - "size_in_fields": 3645, + "mana_spent": 81001781, + "size_in_fields": 2820, "slot_number": 582, "timestamp": 1729042775 }, "fee_header": { - "eth_per_fee_asset": 12197441, - "excess_mana": 1320736634, - "mana_used": 105889211 + "eth_per_fee_asset": 10529350, + "excess_mana": 1020077317, + "mana_used": 81001781 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": 14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12242740, + "eth_per_fee_asset_at_execution": 10514630, "l1_fee_oracle_output": { "base_fee": 9240923295, "blob_fee": 1 @@ -43418,22 +43418,22 @@ "slot_of_change": 580 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63619170381794, - "congestion_multiplier": 4689199394, - "prover_cost": 14980283825353, - "sequencer_cost": 2264425283883 + "congestion_cost": 86030675924879, + "congestion_multiplier": 4910229180, + "prover_cost": 18485987238734, + "sequencer_cost": 3515453610827 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778872962, - "congestion_multiplier": 4689199394, - "prover_cost": 183399720, - "sequencer_cost": 27722770 + "congestion_cost": 904580726, + "congestion_multiplier": 4910229180, + "prover_cost": 194373316, + "sequencer_cost": 36963694 } }, "parent_fee_header": { - "eth_per_fee_asset": 12242740, - "excess_mana": 1322284452, - "mana_used": 98452182 + "eth_per_fee_asset": 10514630, + "excess_mana": 1026922327, + "mana_used": 68154990 } }, { @@ -43441,21 +43441,21 @@ "blobs_needed": 1, "block_number": 583, "l1_block_number": 20974899, - "mana_spent": 96050384, - "size_in_fields": 3375, + "mana_spent": 78784644, + "size_in_fields": 2655, "slot_number": 583, "timestamp": 1729042811 }, "fee_header": { - "eth_per_fee_asset": 12227934, - "excess_mana": 1326625845, - "mana_used": 96050384 + "eth_per_fee_asset": 10583049, + "excess_mana": 1026079098, + "mana_used": 78784644 }, "oracle_input": { - "fee_asset_price_modifier": 25 + "fee_asset_price_modifier": 51 }, "outputs": { - "eth_per_fee_asset_at_execution": 12197441, + "eth_per_fee_asset_at_execution": 10529350, "l1_fee_oracle_output": { "base_fee": 9240923295, "blob_fee": 1 @@ -43472,22 +43472,22 @@ "slot_of_change": 585 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64416623044129, - "congestion_multiplier": 4721621316, - "prover_cost": 15035917779804, - "sequencer_cost": 2272834933164 + "congestion_cost": 86925215421655, + "congestion_multiplier": 4956418461, + "prover_cost": 18460143883526, + "sequencer_cost": 3510539017129 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 785717959, - "congestion_multiplier": 4721621316, - "prover_cost": 183399720, - "sequencer_cost": 27722770 + "congestion_cost": 915266017, + "congestion_multiplier": 4956418461, + "prover_cost": 194373316, + "sequencer_cost": 36963694 } }, "parent_fee_header": { - "eth_per_fee_asset": 12197441, - "excess_mana": 1320736634, - "mana_used": 105889211 + "eth_per_fee_asset": 10529350, + "excess_mana": 1020077317, + "mana_used": 81001781 } }, { @@ -43495,21 +43495,21 @@ "blobs_needed": 1, "block_number": 584, "l1_block_number": 20974902, - "mana_spent": 95479465, - "size_in_fields": 3315, + "mana_spent": 67717868, + "size_in_fields": 2415, "slot_number": 584, "timestamp": 1729042847 }, "fee_header": { - "eth_per_fee_asset": 12179022, - "excess_mana": 1322676229, - "mana_used": 95479465 + "eth_per_fee_asset": 10547066, + "excess_mana": 1029863742, + "mana_used": 67717868 }, "oracle_input": { - "fee_asset_price_modifier": -40 + "fee_asset_price_modifier": -34 }, "outputs": { - "eth_per_fee_asset_at_execution": 12227934, + "eth_per_fee_asset_at_execution": 10583049, "l1_fee_oracle_output": { "base_fee": 9240923295, "blob_fee": 1 @@ -43526,22 +43526,22 @@ "slot_of_change": 585 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63880139932061, - "congestion_multiplier": 4699852800, - "prover_cost": 14998422464499, - "sequencer_cost": 2267167127334 + "congestion_cost": 87125707818229, + "congestion_multiplier": 4985767931, + "prover_cost": 18366476050522, + "sequencer_cost": 3492726340018 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781122135, - "congestion_multiplier": 4699852800, - "prover_cost": 183399720, - "sequencer_cost": 27722770 + "congestion_cost": 922055635, + "congestion_multiplier": 4985767931, + "prover_cost": 194373316, + "sequencer_cost": 36963694 } }, "parent_fee_header": { - "eth_per_fee_asset": 12227934, - "excess_mana": 1326625845, - "mana_used": 96050384 + "eth_per_fee_asset": 10583049, + "excess_mana": 1026079098, + "mana_used": 78784644 } }, { @@ -43549,21 +43549,21 @@ "blobs_needed": 1, "block_number": 585, "l1_block_number": 20974905, - "mana_spent": 99229793, - "size_in_fields": 3375, + "mana_spent": 100410134, + "size_in_fields": 3180, "slot_number": 585, "timestamp": 1729042883 }, "fee_header": { - "eth_per_fee_asset": 12221648, - "excess_mana": 1318155694, - "mana_used": 99229793 + "eth_per_fee_asset": 10473236, + "excess_mana": 1022581610, + "mana_used": 100410134 }, "oracle_input": { - "fee_asset_price_modifier": 35 + "fee_asset_price_modifier": -70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12179022, + "eth_per_fee_asset_at_execution": 10547066, "l1_fee_oracle_output": { "base_fee": 10358997954, "blob_fee": 1 @@ -43580,22 +43580,22 @@ "slot_of_change": 585 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64824500522292, - "congestion_multiplier": 4675060777, - "prover_cost": 15087345929748, - "sequencer_cost": 2551682228672 + "congestion_cost": 88478719010577, + "congestion_multiplier": 4929449478, + "prover_cost": 18588148400703, + "sequencer_cost": 3928674761304 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789499018, - "congestion_multiplier": 4675060777, - "prover_cost": 183749118, - "sequencer_cost": 31076994 + "congestion_cost": 933190889, + "congestion_multiplier": 4929449478, + "prover_cost": 196050428, + "sequencer_cost": 41435992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12179022, - "excess_mana": 1322676229, - "mana_used": 95479465 + "eth_per_fee_asset": 10547066, + "excess_mana": 1029863742, + "mana_used": 67717868 } }, { @@ -43603,21 +43603,21 @@ "blobs_needed": 1, "block_number": 586, "l1_block_number": 20974908, - "mana_spent": 94876210, - "size_in_fields": 3420, + "mana_spent": 65128274, + "size_in_fields": 2175, "slot_number": 586, "timestamp": 1729042919 }, "fee_header": { - "eth_per_fee_asset": 12343864, - "excess_mana": 1317385487, - "mana_used": 94876210 + "eth_per_fee_asset": 10508845, + "excess_mana": 1047991744, + "mana_used": 65128274 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": 34 }, "outputs": { - "eth_per_fee_asset_at_execution": 12221648, + "eth_per_fee_asset_at_execution": 10473236, "l1_fee_oracle_output": { "base_fee": 10358997954, "blob_fee": 1 @@ -43634,22 +43634,22 @@ "slot_of_change": 585 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64524390245899, - "congestion_multiplier": 4670849780, - "prover_cost": 15034725104176, - "sequencer_cost": 2542782610005 + "congestion_cost": 93622290092576, + "congestion_multiplier": 5128776456, + "prover_cost": 18719183641045, + "sequencer_cost": 3956369549966 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 788594385, - "congestion_multiplier": 4670849780, - "prover_cost": 183749118, - "sequencer_cost": 31076994 + "congestion_cost": 980528339, + "congestion_multiplier": 5128776456, + "prover_cost": 196050428, + "sequencer_cost": 41435992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12221648, - "excess_mana": 1318155694, - "mana_used": 99229793 + "eth_per_fee_asset": 10473236, + "excess_mana": 1022581610, + "mana_used": 100410134 } }, { @@ -43657,21 +43657,21 @@ "blobs_needed": 1, "block_number": 587, "l1_block_number": 20974911, - "mana_spent": 111449628, - "size_in_fields": 3645, + "mana_spent": 66400015, + "size_in_fields": 2310, "slot_number": 587, "timestamp": 1729042955 }, "fee_header": { - "eth_per_fee_asset": 12435208, - "excess_mana": 1312261697, - "mana_used": 111449628 + "eth_per_fee_asset": 10509895, + "excess_mana": 1038120018, + "mana_used": 66400015 }, "oracle_input": { - "fee_asset_price_modifier": 74 + "fee_asset_price_modifier": 1 }, "outputs": { - "eth_per_fee_asset_at_execution": 12343864, + "eth_per_fee_asset_at_execution": 10508845, "l1_fee_oracle_output": { "base_fee": 10358997954, "blob_fee": 1 @@ -43688,22 +43688,22 @@ "slot_of_change": 585 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63399681007503, - "congestion_multiplier": 4642932573, - "prover_cost": 14885867018626, - "sequencer_cost": 2517606642459 + "congestion_cost": 91533820700563, + "congestion_multiplier": 5050398902, + "prover_cost": 18655754081443, + "sequencer_cost": 3942963475054 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782597040, - "congestion_multiplier": 4642932573, - "prover_cost": 183749118, - "sequencer_cost": 31076994 + "congestion_cost": 961914734, + "congestion_multiplier": 5050398902, + "prover_cost": 196050428, + "sequencer_cost": 41435992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12343864, - "excess_mana": 1317385487, - "mana_used": 94876210 + "eth_per_fee_asset": 10508845, + "excess_mana": 1047991744, + "mana_used": 65128274 } }, { @@ -43711,21 +43711,21 @@ "blobs_needed": 1, "block_number": 588, "l1_block_number": 20974914, - "mana_spent": 100874932, - "size_in_fields": 3510, + "mana_spent": 64418472, + "size_in_fields": 2310, "slot_number": 588, "timestamp": 1729042991 }, "fee_header": { - "eth_per_fee_asset": 12435208, - "excess_mana": 1323711325, - "mana_used": 100874932 + "eth_per_fee_asset": 10550883, + "excess_mana": 1029520033, + "mana_used": 64418472 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": 39 }, "outputs": { - "eth_per_fee_asset_at_execution": 12435208, + "eth_per_fee_asset_at_execution": 10509895, "l1_fee_oracle_output": { "base_fee": 10358997954, "blob_fee": 1 @@ -43742,22 +43742,22 @@ "slot_of_change": 590 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64015695033007, - "congestion_multiplier": 4705548063, - "prover_cost": 14776521470329, - "sequencer_cost": 2499113324040 + "congestion_cost": 90003853891976, + "congestion_multiplier": 4983095349, + "prover_cost": 18653890262463, + "sequencer_cost": 3942569549934 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796048483, - "congestion_multiplier": 4705548063, - "prover_cost": 183749118, - "sequencer_cost": 31076994 + "congestion_cost": 945931054, + "congestion_multiplier": 4983095349, + "prover_cost": 196050428, + "sequencer_cost": 41435992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12435208, - "excess_mana": 1312261697, - "mana_used": 111449628 + "eth_per_fee_asset": 10509895, + "excess_mana": 1038120018, + "mana_used": 66400015 } }, { @@ -43765,21 +43765,21 @@ "blobs_needed": 1, "block_number": 589, "l1_block_number": 20974917, - "mana_spent": 91010509, - "size_in_fields": 3405, + "mana_spent": 79417261, + "size_in_fields": 2865, "slot_number": 589, "timestamp": 1729043027 }, "fee_header": { - "eth_per_fee_asset": 12414068, - "excess_mana": 1324586257, - "mana_used": 91010509 + "eth_per_fee_asset": 10550883, + "excess_mana": 1018938505, + "mana_used": 79417261 }, "oracle_input": { - "fee_asset_price_modifier": -17 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 12435208, + "eth_per_fee_asset_at_execution": 10550883, "l1_fee_oracle_output": { "base_fee": 10358997954, "blob_fee": 1 @@ -43796,22 +43796,22 @@ "slot_of_change": 590 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64098953149799, - "congestion_multiplier": 4710367459, - "prover_cost": 14776521470329, - "sequencer_cost": 2499113324040 + "congestion_cost": 87817911922633, + "congestion_multiplier": 4901513673, + "prover_cost": 18581423753823, + "sequencer_cost": 3927253482008 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 797083815, - "congestion_multiplier": 4710367459, - "prover_cost": 183749118, - "sequencer_cost": 31076994 + "congestion_cost": 926556514, + "congestion_multiplier": 4901513673, + "prover_cost": 196050428, + "sequencer_cost": 41435992 } }, "parent_fee_header": { - "eth_per_fee_asset": 12435208, - "excess_mana": 1323711325, - "mana_used": 100874932 + "eth_per_fee_asset": 10550883, + "excess_mana": 1029520033, + "mana_used": 64418472 } }, { @@ -43819,21 +43819,21 @@ "blobs_needed": 1, "block_number": 590, "l1_block_number": 20974920, - "mana_spent": 110411212, - "size_in_fields": 3825, + "mana_spent": 73178227, + "size_in_fields": 2535, "slot_number": 590, "timestamp": 1729043063 }, "fee_header": { - "eth_per_fee_asset": 12417792, - "excess_mana": 1315596766, - "mana_used": 110411212 + "eth_per_fee_asset": 10520285, + "excess_mana": 1023355766, + "mana_used": 73178227 }, "oracle_input": { - "fee_asset_price_modifier": 3 + "fee_asset_price_modifier": -29 }, "outputs": { - "eth_per_fee_asset_at_execution": 12414068, + "eth_per_fee_asset_at_execution": 10550883, "l1_fee_oracle_output": { "base_fee": 9673168819, "blob_fee": 1 @@ -43850,22 +43850,22 @@ "slot_of_change": 590 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62685280763728, - "congestion_multiplier": 4661084831, - "prover_cost": 14784420143341, - "sequencer_cost": 2337630742800 + "congestion_cost": 87173837962188, + "congestion_multiplier": 4935406288, + "prover_cost": 18483920729668, + "sequencer_cost": 3667245291224 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778179338, - "congestion_multiplier": 4661084831, - "prover_cost": 183534797, - "sequencer_cost": 29019507 + "congestion_cost": 919760965, + "congestion_multiplier": 4935406288, + "prover_cost": 195021685, + "sequencer_cost": 38692676 } }, "parent_fee_header": { - "eth_per_fee_asset": 12414068, - "excess_mana": 1324586257, - "mana_used": 91010509 + "eth_per_fee_asset": 10550883, + "excess_mana": 1018938505, + "mana_used": 79417261 } }, { @@ -43873,21 +43873,21 @@ "blobs_needed": 1, "block_number": 591, "l1_block_number": 20974923, - "mana_spent": 97308072, - "size_in_fields": 3555, + "mana_spent": 74061333, + "size_in_fields": 2745, "slot_number": 591, "timestamp": 1729043099 }, "fee_header": { - "eth_per_fee_asset": 12540728, - "excess_mana": 1326007978, - "mana_used": 97308072 + "eth_per_fee_asset": 10589718, + "excess_mana": 1021533993, + "mana_used": 74061333 }, "oracle_input": { - "fee_asset_price_modifier": 99 + "fee_asset_price_modifier": 66 }, "outputs": { - "eth_per_fee_asset_at_execution": 12417792, + "eth_per_fee_asset_at_execution": 10520285, "l1_fee_oracle_output": { "base_fee": 9673168819, "blob_fee": 1 @@ -43904,22 +43904,22 @@ "slot_of_change": 590 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63644276132182, - "congestion_multiplier": 4718209269, - "prover_cost": 14779986409823, - "sequencer_cost": 2336929705378 + "congestion_cost": 87116221851405, + "congestion_multiplier": 4921399944, + "prover_cost": 18537680775759, + "sequencer_cost": 3677911387382 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 790321383, - "congestion_multiplier": 4718209269, - "prover_cost": 183534797, - "sequencer_cost": 29019507 + "congestion_cost": 916487482, + "congestion_multiplier": 4921399944, + "prover_cost": 195021685, + "sequencer_cost": 38692676 } }, "parent_fee_header": { - "eth_per_fee_asset": 12417792, - "excess_mana": 1315596766, - "mana_used": 110411212 + "eth_per_fee_asset": 10520285, + "excess_mana": 1023355766, + "mana_used": 73178227 } }, { @@ -43927,21 +43927,21 @@ "blobs_needed": 1, "block_number": 592, "l1_block_number": 20974926, - "mana_spent": 94919724, - "size_in_fields": 3405, + "mana_spent": 62798923, + "size_in_fields": 2490, "slot_number": 592, "timestamp": 1729043135 }, "fee_header": { - "eth_per_fee_asset": 12476770, - "excess_mana": 1323316050, - "mana_used": 94919724 + "eth_per_fee_asset": 10600307, + "excess_mana": 1020595326, + "mana_used": 62798923 }, "oracle_input": { - "fee_asset_price_modifier": -51 + "fee_asset_price_modifier": 10 }, "outputs": { - "eth_per_fee_asset_at_execution": 12540728, + "eth_per_fee_asset_at_execution": 10589718, "l1_fee_oracle_output": { "base_fee": 9673168819, "blob_fee": 1 @@ -43958,22 +43958,22 @@ "slot_of_change": 590 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62768902969589, - "congestion_multiplier": 4703372383, - "prover_cost": 14635099094726, - "sequencer_cost": 2314020924464 + "congestion_cost": 86386101121862, + "congestion_multiplier": 4914198711, + "prover_cost": 18416135821559, + "sequencer_cost": 3653796635567 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787167739, - "congestion_multiplier": 4703372383, - "prover_cost": 183534797, - "sequencer_cost": 29019507 + "congestion_cost": 914804450, + "congestion_multiplier": 4914198711, + "prover_cost": 195021685, + "sequencer_cost": 38692676 } }, "parent_fee_header": { - "eth_per_fee_asset": 12540728, - "excess_mana": 1326007978, - "mana_used": 97308072 + "eth_per_fee_asset": 10589718, + "excess_mana": 1021533993, + "mana_used": 74061333 } }, { @@ -43981,21 +43981,21 @@ "blobs_needed": 1, "block_number": 593, "l1_block_number": 20974929, - "mana_spent": 105774170, - "size_in_fields": 3540, + "mana_spent": 88904901, + "size_in_fields": 3165, "slot_number": 593, "timestamp": 1729043171 }, "fee_header": { - "eth_per_fee_asset": 12371965, - "excess_mana": 1318235774, - "mana_used": 105774170 + "eth_per_fee_asset": 10672389, + "excess_mana": 1008394249, + "mana_used": 88904901 }, "oracle_input": { - "fee_asset_price_modifier": -84 + "fee_asset_price_modifier": 68 }, "outputs": { - "eth_per_fee_asset_at_execution": 12476770, + "eth_per_fee_asset_at_execution": 10600307, "l1_fee_oracle_output": { "base_fee": 9673168819, "blob_fee": 1 @@ -44012,22 +44012,22 @@ "slot_of_change": 595 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62615812666259, - "congestion_multiplier": 4675498821, - "prover_cost": 14710121048958, - "sequencer_cost": 2325882980932 + "congestion_cost": 84257054064567, + "congestion_multiplier": 4821547964, + "prover_cost": 18397739329626, + "sequencer_cost": 3650146736317 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781243093, - "congestion_multiplier": 4675498821, - "prover_cost": 183534797, - "sequencer_cost": 29019507 + "congestion_cost": 893150640, + "congestion_multiplier": 4821547964, + "prover_cost": 195021685, + "sequencer_cost": 38692676 } }, "parent_fee_header": { - "eth_per_fee_asset": 12476770, - "excess_mana": 1323316050, - "mana_used": 94919724 + "eth_per_fee_asset": 10600307, + "excess_mana": 1020595326, + "mana_used": 62798923 } }, { @@ -44035,21 +44035,21 @@ "blobs_needed": 1, "block_number": 594, "l1_block_number": 20974932, - "mana_spent": 96688579, - "size_in_fields": 3270, + "mana_spent": 71490736, + "size_in_fields": 2625, "slot_number": 594, "timestamp": 1729043207 }, "fee_header": { - "eth_per_fee_asset": 12328663, - "excess_mana": 1324009944, - "mana_used": 96688579 + "eth_per_fee_asset": 10655313, + "excess_mana": 1022299150, + "mana_used": 71490736 }, "oracle_input": { - "fee_asset_price_modifier": -35 + "fee_asset_price_modifier": -16 }, "outputs": { - "eth_per_fee_asset_at_execution": 12371965, + "eth_per_fee_asset_at_execution": 10672389, "l1_fee_oracle_output": { "base_fee": 9673168819, "blob_fee": 1 @@ -44066,22 +44066,22 @@ "slot_of_change": 595 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63690747508581, - "congestion_multiplier": 4707192394, - "prover_cost": 14834732962792, - "sequencer_cost": 2345585927539 + "congestion_cost": 86003352576448, + "congestion_multiplier": 4927277856, + "prover_cost": 18273479817874, + "sequencer_cost": 3625493411082 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 787979699, - "congestion_multiplier": 4707192394, - "prover_cost": 183534797, - "sequencer_cost": 29019507 + "congestion_cost": 917861234, + "congestion_multiplier": 4927277856, + "prover_cost": 195021685, + "sequencer_cost": 38692676 } }, "parent_fee_header": { - "eth_per_fee_asset": 12371965, - "excess_mana": 1318235774, - "mana_used": 105774170 + "eth_per_fee_asset": 10672389, + "excess_mana": 1008394249, + "mana_used": 88904901 } }, { @@ -44089,21 +44089,21 @@ "blobs_needed": 1, "block_number": 595, "l1_block_number": 20974935, - "mana_spent": 108976747, - "size_in_fields": 3720, + "mana_spent": 74863933, + "size_in_fields": 2760, "slot_number": 595, "timestamp": 1729043243 }, "fee_header": { - "eth_per_fee_asset": 12369347, - "excess_mana": 1320698523, - "mana_used": 108976747 + "eth_per_fee_asset": 10700065, + "excess_mana": 1018789886, + "mana_used": 74863933 }, "oracle_input": { - "fee_asset_price_modifier": 33 + "fee_asset_price_modifier": 42 }, "outputs": { - "eth_per_fee_asset_at_execution": 12328663, + "eth_per_fee_asset_at_execution": 10655313, "l1_fee_oracle_output": { "base_fee": 10121856747, "blob_fee": 1 @@ -44120,22 +44120,22 @@ "slot_of_change": 595 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64045358040852, - "congestion_multiplier": 4688990308, - "prover_cost": 14898210130329, - "sequencer_cost": 2463006004788 + "congestion_cost": 86454475715543, + "congestion_multiplier": 4900377410, + "prover_cost": 18365928527863, + "sequencer_cost": 3799740749052 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 789593636, - "congestion_multiplier": 4688990308, - "prover_cost": 183675012, - "sequencer_cost": 30365571 + "congestion_cost": 921199499, + "congestion_multiplier": 4900377410, + "prover_cost": 195694717, + "sequencer_cost": 40487427 } }, "parent_fee_header": { - "eth_per_fee_asset": 12328663, - "excess_mana": 1324009944, - "mana_used": 96688579 + "eth_per_fee_asset": 10655313, + "excess_mana": 1022299150, + "mana_used": 71490736 } }, { @@ -44143,21 +44143,21 @@ "blobs_needed": 1, "block_number": 596, "l1_block_number": 20974938, - "mana_spent": 54708672, - "size_in_fields": 1995, + "mana_spent": 81981640, + "size_in_fields": 2760, "slot_number": 596, "timestamp": 1729043279 }, "fee_header": { - "eth_per_fee_asset": 12389137, - "excess_mana": 1329675270, - "mana_used": 54708672 + "eth_per_fee_asset": 10679734, + "excess_mana": 1018653819, + "mana_used": 81981640 }, "oracle_input": { - "fee_asset_price_modifier": 16 + "fee_asset_price_modifier": -19 }, "outputs": { - "eth_per_fee_asset_at_execution": 12369347, + "eth_per_fee_asset_at_execution": 10700065, "l1_fee_oracle_output": { "base_fee": 10121856747, "blob_fee": 1 @@ -44174,44 +44174,44 @@ "slot_of_change": 595 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64691381687328, - "congestion_multiplier": 4738497333, - "prover_cost": 14849208450536, - "sequencer_cost": 2454904935564 + "congestion_cost": 86069930790141, + "congestion_multiplier": 4899337344, + "prover_cost": 18289114785752, + "sequencer_cost": 3783848696247 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 800190148, - "congestion_multiplier": 4738497333, - "prover_cost": 183675012, - "sequencer_cost": 30365571 + "congestion_cost": 920953854, + "congestion_multiplier": 4899337344, + "prover_cost": 195694717, + "sequencer_cost": 40487427 } }, "parent_fee_header": { - "eth_per_fee_asset": 12369347, - "excess_mana": 1320698523, - "mana_used": 108976747 + "eth_per_fee_asset": 10700065, + "excess_mana": 1018789886, + "mana_used": 74863933 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 597, "l1_block_number": 20974941, - "mana_spent": 129713810, - "size_in_fields": 4575, + "mana_spent": 78763156, + "size_in_fields": 2655, "slot_number": 597, "timestamp": 1729043315 }, "fee_header": { - "eth_per_fee_asset": 12343297, - "excess_mana": 1284383942, - "mana_used": 129713810 + "eth_per_fee_asset": 10720316, + "excess_mana": 1025635459, + "mana_used": 78763156 }, "oracle_input": { - "fee_asset_price_modifier": -37 + "fee_asset_price_modifier": 38 }, "outputs": { - "eth_per_fee_asset_at_execution": 12389137, + "eth_per_fee_asset_at_execution": 10679734, "l1_fee_oracle_output": { "base_fee": 10121856747, "blob_fee": 1 @@ -44228,22 +44228,22 @@ "slot_of_change": 595 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 60362910507811, - "congestion_multiplier": 4493937262, - "prover_cost": 14825488813305, - "sequencer_cost": 2450983551155 + "congestion_cost": 87420296891290, + "congestion_multiplier": 4952989425, + "prover_cost": 18323931757102, + "sequencer_cost": 3791052005603 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 747844368, - "congestion_multiplier": 4493937262, - "prover_cost": 183675012, - "sequencer_cost": 30365571 + "congestion_cost": 933625517, + "congestion_multiplier": 4952989425, + "prover_cost": 195694717, + "sequencer_cost": 40487427 } }, "parent_fee_header": { - "eth_per_fee_asset": 12389137, - "excess_mana": 1329675270, - "mana_used": 54708672 + "eth_per_fee_asset": 10679734, + "excess_mana": 1018653819, + "mana_used": 81981640 } }, { @@ -44251,21 +44251,21 @@ "blobs_needed": 1, "block_number": 598, "l1_block_number": 20974944, - "mana_spent": 110697866, - "size_in_fields": 3960, + "mana_spent": 62154801, + "size_in_fields": 2355, "slot_number": 598, "timestamp": 1729043351 }, "fee_header": { - "eth_per_fee_asset": 12366749, - "excess_mana": 1314097752, - "mana_used": 110697866 + "eth_per_fee_asset": 10658138, + "excess_mana": 1029398615, + "mana_used": 62154801 }, "oracle_input": { - "fee_asset_price_modifier": 19 + "fee_asset_price_modifier": -58 }, "outputs": { - "eth_per_fee_asset_at_execution": 12343297, + "eth_per_fee_asset_at_execution": 10720316, "l1_fee_oracle_output": { "base_fee": 10121856747, "blob_fee": 1 @@ -44282,22 +44282,22 @@ "slot_of_change": 600 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63343895881304, - "congestion_multiplier": 4652917169, - "prover_cost": 14880547069394, - "sequencer_cost": 2460085907356 + "congestion_cost": 87731844565030, + "congestion_multiplier": 4982151580, + "prover_cost": 18254566096746, + "sequencer_cost": 3776700892026 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781872520, - "congestion_multiplier": 4652917169, - "prover_cost": 183675012, - "sequencer_cost": 30365571 + "congestion_cost": 940513097, + "congestion_multiplier": 4982151580, + "prover_cost": 195694717, + "sequencer_cost": 40487427 } }, "parent_fee_header": { - "eth_per_fee_asset": 12343297, - "excess_mana": 1284383942, - "mana_used": 129713810 + "eth_per_fee_asset": 10720316, + "excess_mana": 1025635459, + "mana_used": 78763156 } }, { @@ -44305,21 +44305,21 @@ "blobs_needed": 1, "block_number": 599, "l1_block_number": 20974947, - "mana_spent": 28784389, - "size_in_fields": 900, + "mana_spent": 84560191, + "size_in_fields": 2955, "slot_number": 599, "timestamp": 1729043387 }, "fee_header": { - "eth_per_fee_asset": 12366749, - "excess_mana": 1324795618, - "mana_used": 28784389 + "eth_per_fee_asset": 10682651, + "excess_mana": 1016553416, + "mana_used": 84560191 }, "oracle_input": { - "fee_asset_price_modifier": 0 + "fee_asset_price_modifier": 23 }, "outputs": { - "eth_per_fee_asset_at_execution": 12366749, + "eth_per_fee_asset_at_execution": 10658138, "l1_fee_oracle_output": { "base_fee": 10121856747, "blob_fee": 1 @@ -44336,44 +44336,44 @@ "slot_of_change": 600 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64238079627880, - "congestion_multiplier": 4711521416, - "prover_cost": 14852327964286, - "sequencer_cost": 2455420660677 + "congestion_cost": 86053356974737, + "congestion_multiplier": 4883310307, + "prover_cost": 18361060534214, + "sequencer_cost": 3798733606189 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794416207, - "congestion_multiplier": 4711521416, - "prover_cost": 183675012, - "sequencer_cost": 30365571 + "congestion_cost": 917168554, + "congestion_multiplier": 4883310307, + "prover_cost": 195694717, + "sequencer_cost": 40487427 } }, "parent_fee_header": { - "eth_per_fee_asset": 12366749, - "excess_mana": 1314097752, - "mana_used": 110697866 + "eth_per_fee_asset": 10658138, + "excess_mana": 1029398615, + "mana_used": 62154801 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 600, "l1_block_number": 20974950, - "mana_spent": 145845705, - "size_in_fields": 5400, + "mana_spent": 74726766, + "size_in_fields": 2625, "slot_number": 600, "timestamp": 1729043423 }, "fee_header": { - "eth_per_fee_asset": 12243081, - "excess_mana": 1253580007, - "mana_used": 145845705 + "eth_per_fee_asset": 10751019, + "excess_mana": 1026113607, + "mana_used": 74726766 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12366749, + "eth_per_fee_asset_at_execution": 10682651, "l1_fee_oracle_output": { "base_fee": 9837009832, "blob_fee": 1 @@ -44390,22 +44390,22 @@ "slot_of_change": 600 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 57464423350066, - "congestion_multiplier": 4334856943, - "prover_cost": 14845130033771, - "sequencer_cost": 2386320770318 + "congestion_cost": 86897872260360, + "congestion_multiplier": 4956685292, + "prover_cost": 18278931512413, + "sequencer_cost": 3683359121252 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 710648100, - "congestion_multiplier": 4334856943, - "prover_cost": 183585997, - "sequencer_cost": 29511030 + "congestion_cost": 928299642, + "congestion_multiplier": 4956685292, + "prover_cost": 195267446, + "sequencer_cost": 39348040 } }, "parent_fee_header": { - "eth_per_fee_asset": 12366749, - "excess_mana": 1324795618, - "mana_used": 28784389 + "eth_per_fee_asset": 10682651, + "excess_mana": 1016553416, + "mana_used": 84560191 } }, { @@ -44413,21 +44413,21 @@ "blobs_needed": 1, "block_number": 601, "l1_block_number": 20974953, - "mana_spent": 117068322, - "size_in_fields": 3975, + "mana_spent": 77830181, + "size_in_fields": 2715, "slot_number": 601, "timestamp": 1729043459 }, "fee_header": { - "eth_per_fee_asset": 12283483, - "excess_mana": 1299425712, - "mana_used": 117068322 + "eth_per_fee_asset": 10739192, + "excess_mana": 1025840373, + "mana_used": 77830181 }, "oracle_input": { - "fee_asset_price_modifier": 33 + "fee_asset_price_modifier": -11 }, "outputs": { - "eth_per_fee_asset_at_execution": 12243081, + "eth_per_fee_asset_at_execution": 10751019, "l1_fee_oracle_output": { "base_fee": 9837009832, "blob_fee": 1 @@ -44444,22 +44444,22 @@ "slot_of_change": 600 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62202502948400, - "congestion_multiplier": 4573725516, - "prover_cost": 14995081466831, - "sequencer_cost": 2410425120932 + "congestion_cost": 86299174152702, + "congestion_multiplier": 4954572979, + "prover_cost": 18162691927156, + "sequencer_cost": 3659935862824 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 761550282, - "congestion_multiplier": 4573725516, - "prover_cost": 183585997, - "sequencer_cost": 29511030 + "congestion_cost": 927804061, + "congestion_multiplier": 4954572979, + "prover_cost": 195267446, + "sequencer_cost": 39348040 } }, "parent_fee_header": { - "eth_per_fee_asset": 12243081, - "excess_mana": 1253580007, - "mana_used": 145845705 + "eth_per_fee_asset": 10751019, + "excess_mana": 1026113607, + "mana_used": 74726766 } }, { @@ -44467,21 +44467,21 @@ "blobs_needed": 1, "block_number": 602, "l1_block_number": 20974956, - "mana_spent": 98700127, - "size_in_fields": 3510, + "mana_spent": 65454584, + "size_in_fields": 2475, "slot_number": 602, "timestamp": 1729043495 }, "fee_header": { - "eth_per_fee_asset": 12308049, - "excess_mana": 1316494034, - "mana_used": 98700127 + "eth_per_fee_asset": 10739192, + "excess_mana": 1028670554, + "mana_used": 65454584 }, "oracle_input": { - "fee_asset_price_modifier": 20 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 12283483, + "eth_per_fee_asset_at_execution": 10739192, "l1_fee_oracle_output": { "base_fee": 9837009832, "blob_fee": 1 @@ -44498,22 +44498,22 @@ "slot_of_change": 600 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63598376128335, - "congestion_multiplier": 4665980624, - "prover_cost": 14945760660881, - "sequencer_cost": 2402496913946 + "congestion_cost": 86873163735224, + "congestion_multiplier": 4976496188, + "prover_cost": 18182694377753, + "sequencer_cost": 3663966525601 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781209572, - "congestion_multiplier": 4665980624, - "prover_cost": 183585997, - "sequencer_cost": 29511030 + "congestion_cost": 932947585, + "congestion_multiplier": 4976496188, + "prover_cost": 195267446, + "sequencer_cost": 39348040 } }, "parent_fee_header": { - "eth_per_fee_asset": 12283483, - "excess_mana": 1299425712, - "mana_used": 117068322 + "eth_per_fee_asset": 10739192, + "excess_mana": 1025840373, + "mana_used": 77830181 } }, { @@ -44521,21 +44521,21 @@ "blobs_needed": 1, "block_number": 603, "l1_block_number": 20974959, - "mana_spent": 101472087, - "size_in_fields": 3765, + "mana_spent": 82675500, + "size_in_fields": 2820, "slot_number": 603, "timestamp": 1729043531 }, "fee_header": { - "eth_per_fee_asset": 12244047, - "excess_mana": 1315194161, - "mana_used": 101472087 + "eth_per_fee_asset": 10826179, + "excess_mana": 1019125138, + "mana_used": 82675500 }, "oracle_input": { - "fee_asset_price_modifier": -52 + "fee_asset_price_modifier": 81 }, "outputs": { - "eth_per_fee_asset_at_execution": 12308049, + "eth_per_fee_asset_at_execution": 10739192, "l1_fee_oracle_output": { "base_fee": 9837009832, "blob_fee": 1 @@ -44552,22 +44552,22 @@ "slot_of_change": 605 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63348669476373, - "congestion_multiplier": 4658889754, - "prover_cost": 14915929973955, - "sequencer_cost": 2397701699108 + "congestion_cost": 85266227291588, + "congestion_multiplier": 4902940944, + "prover_cost": 18182694377753, + "sequencer_cost": 3663966525601 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779698528, - "congestion_multiplier": 4658889754, - "prover_cost": 183585997, - "sequencer_cost": 29511030 + "congestion_cost": 915690386, + "congestion_multiplier": 4902940944, + "prover_cost": 195267446, + "sequencer_cost": 39348040 } }, "parent_fee_header": { - "eth_per_fee_asset": 12308049, - "excess_mana": 1316494034, - "mana_used": 98700127 + "eth_per_fee_asset": 10739192, + "excess_mana": 1028670554, + "mana_used": 65454584 } }, { @@ -44575,21 +44575,21 @@ "blobs_needed": 1, "block_number": 604, "l1_block_number": 20974962, - "mana_spent": 105689106, - "size_in_fields": 3510, + "mana_spent": 62395021, + "size_in_fields": 2325, "slot_number": 604, "timestamp": 1729043567 }, "fee_header": { - "eth_per_fee_asset": 12301594, - "excess_mana": 1316666248, - "mana_used": 105689106 + "eth_per_fee_asset": 10852161, + "excess_mana": 1026800638, + "mana_used": 62395021 }, "oracle_input": { - "fee_asset_price_modifier": 47 + "fee_asset_price_modifier": 24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12244047, + "eth_per_fee_asset_at_execution": 10826179, "l1_fee_oracle_output": { "base_fee": 9837009832, "blob_fee": 1 @@ -44606,22 +44606,22 @@ "slot_of_change": 605 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63819579833368, - "congestion_multiplier": 4666920869, - "prover_cost": 14993898422638, - "sequencer_cost": 2410234949278 + "congestion_cost": 85861012089307, + "congestion_multiplier": 4962000558, + "prover_cost": 18036598692854, + "sequencer_cost": 3634527010869 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781409935, - "congestion_multiplier": 4666920869, - "prover_cost": 183585997, - "sequencer_cost": 29511030 + "congestion_cost": 929546686, + "congestion_multiplier": 4962000558, + "prover_cost": 195267446, + "sequencer_cost": 39348040 } }, "parent_fee_header": { - "eth_per_fee_asset": 12244047, - "excess_mana": 1315194161, - "mana_used": 101472087 + "eth_per_fee_asset": 10826179, + "excess_mana": 1019125138, + "mana_used": 82675500 } }, { @@ -44629,21 +44629,21 @@ "blobs_needed": 1, "block_number": 605, "l1_block_number": 20974965, - "mana_spent": 96815243, - "size_in_fields": 3390, + "mana_spent": 45083001, + "size_in_fields": 1635, "slot_number": 605, "timestamp": 1729043603 }, "fee_header": { - "eth_per_fee_asset": 12260998, - "excess_mana": 1322355354, - "mana_used": 96815243 + "eth_per_fee_asset": 10743639, + "excess_mana": 1014195659, + "mana_used": 45083001 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": -100 }, "outputs": { - "eth_per_fee_asset_at_execution": 12301594, + "eth_per_fee_asset_at_execution": 10852161, "l1_fee_oracle_output": { "base_fee": 9063522095, "blob_fee": 1 @@ -44660,22 +44660,22 @@ "slot_of_change": 605 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63290703952675, - "congestion_multiplier": 4698088695, - "prover_cost": 14904107711570, - "sequencer_cost": 2210328759021 + "congestion_cost": 82051347653247, + "congestion_multiplier": 4865381990, + "prover_cost": 17886503434662, + "sequencer_cost": 3340725317290 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778576544, - "congestion_multiplier": 4698088695, - "prover_cost": 183344282, - "sequencer_cost": 27190567 + "congestion_cost": 890434435, + "congestion_multiplier": 4865381990, + "prover_cost": 194107215, + "sequencer_cost": 36254089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12301594, - "excess_mana": 1316666248, - "mana_used": 105689106 + "eth_per_fee_asset": 10852161, + "excess_mana": 1026800638, + "mana_used": 62395021 } }, { @@ -44683,21 +44683,21 @@ "blobs_needed": 1, "block_number": 606, "l1_block_number": 20974968, - "mana_spent": 93302343, - "size_in_fields": 3300, + "mana_spent": 109395613, + "size_in_fields": 3930, "slot_number": 606, "timestamp": 1729043639 }, "fee_header": { - "eth_per_fee_asset": 12383607, - "excess_mana": 1319170597, - "mana_used": 93302343 + "eth_per_fee_asset": 10738267, + "excess_mana": 984278660, + "mana_used": 109395613 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12260998, + "eth_per_fee_asset_at_execution": 10743639, "l1_fee_oracle_output": { "base_fee": 9063522095, "blob_fee": 1 @@ -44714,22 +44714,22 @@ "slot_of_change": 605 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63200223097664, - "congestion_multiplier": 4680615412, - "prover_cost": 14953455012390, - "sequencer_cost": 2217647127910 + "congestion_cost": 78123266334620, + "congestion_multiplier": 4643529346, + "prover_cost": 18067175842376, + "sequencer_cost": 3374470139960 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 774897809, - "congestion_multiplier": 4680615412, - "prover_cost": 183344282, - "sequencer_cost": 27190567 + "congestion_cost": 839328171, + "congestion_multiplier": 4643529346, + "prover_cost": 194107215, + "sequencer_cost": 36254089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12260998, - "excess_mana": 1322355354, - "mana_used": 96815243 + "eth_per_fee_asset": 10743639, + "excess_mana": 1014195659, + "mana_used": 45083001 } }, { @@ -44737,21 +44737,21 @@ "blobs_needed": 1, "block_number": 607, "l1_block_number": 20974971, - "mana_spent": 107763075, - "size_in_fields": 3840, + "mana_spent": 84768727, + "size_in_fields": 3030, "slot_number": 607, "timestamp": 1729043675 }, "fee_header": { - "eth_per_fee_asset": 12277107, - "excess_mana": 1312472940, - "mana_used": 107763075 + "eth_per_fee_asset": 10757595, + "excess_mana": 1018674273, + "mana_used": 84768727 }, "oracle_input": { - "fee_asset_price_modifier": -86 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12383607, + "eth_per_fee_asset_at_execution": 10738267, "l1_fee_oracle_output": { "base_fee": 9063522095, "blob_fee": 1 @@ -44768,22 +44768,22 @@ "slot_of_change": 605 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 61953345418666, - "congestion_multiplier": 4644080236, - "prover_cost": 14805402174020, - "sequencer_cost": 2195690399413 + "congestion_cost": 83653390998753, + "congestion_multiplier": 4899493676, + "prover_cost": 18076214253194, + "sequencer_cost": 3376158275819 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 767205882, - "congestion_multiplier": 4644080236, - "prover_cost": 183344282, - "sequencer_cost": 27190567 + "congestion_cost": 898292448, + "congestion_multiplier": 4899493676, + "prover_cost": 194107215, + "sequencer_cost": 36254089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12383607, - "excess_mana": 1319170597, - "mana_used": 93302343 + "eth_per_fee_asset": 10738267, + "excess_mana": 984278660, + "mana_used": 109395613 } }, { @@ -44791,21 +44791,21 @@ "blobs_needed": 1, "block_number": 608, "l1_block_number": 20974974, - "mana_spent": 96638619, - "size_in_fields": 3150, + "mana_spent": 67863793, + "size_in_fields": 2445, "slot_number": 608, "timestamp": 1729043711 }, "fee_header": { - "eth_per_fee_asset": 12399878, - "excess_mana": 1320236015, - "mana_used": 96638619 + "eth_per_fee_asset": 10733928, + "excess_mana": 1028443000, + "mana_used": 67863793 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12277107, + "eth_per_fee_asset_at_execution": 10757595, "l1_fee_oracle_output": { "base_fee": 9063522095, "blob_fee": 1 @@ -44822,22 +44822,22 @@ "slot_of_change": 610 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63217414004782, - "congestion_multiplier": 4686453620, - "prover_cost": 14933834330841, - "sequencer_cost": 2214737315559 + "congestion_cost": 85114188440818, + "congestion_multiplier": 4974729924, + "prover_cost": 18043737006274, + "sequencer_cost": 3370092385892 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776126956, - "congestion_multiplier": 4686453620, - "prover_cost": 183344282, - "sequencer_cost": 27190567 + "congestion_cost": 915623968, + "congestion_multiplier": 4974729924, + "prover_cost": 194107215, + "sequencer_cost": 36254089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12277107, - "excess_mana": 1312472940, - "mana_used": 107763075 + "eth_per_fee_asset": 10757595, + "excess_mana": 1018674273, + "mana_used": 84768727 } }, { @@ -44845,21 +44845,21 @@ "blobs_needed": 1, "block_number": 609, "l1_block_number": 20974977, - "mana_spent": 101734035, - "size_in_fields": 3645, + "mana_spent": 87009824, + "size_in_fields": 2880, "slot_number": 609, "timestamp": 1729043747 }, "fee_header": { - "eth_per_fee_asset": 12446997, - "excess_mana": 1316874634, - "mana_used": 101734035 + "eth_per_fee_asset": 10665230, + "excess_mana": 1021306793, + "mana_used": 87009824 }, "oracle_input": { - "fee_asset_price_modifier": 38 + "fee_asset_price_modifier": -64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12399878, + "eth_per_fee_asset_at_execution": 10733928, "l1_fee_oracle_output": { "base_fee": 9063522095, "blob_fee": 1 @@ -44876,22 +44876,22 @@ "slot_of_change": 610 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62279178633855, - "congestion_multiplier": 4668058857, - "prover_cost": 14785974668461, - "sequencer_cost": 2192809235704 + "congestion_cost": 84119909878286, + "congestion_multiplier": 4919655952, + "prover_cost": 18083521242178, + "sequencer_cost": 3377523027917 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772254217, - "congestion_multiplier": 4668058857, - "prover_cost": 183344282, - "sequencer_cost": 27190567 + "congestion_cost": 902937056, + "congestion_multiplier": 4919655952, + "prover_cost": 194107215, + "sequencer_cost": 36254089 } }, "parent_fee_header": { - "eth_per_fee_asset": 12399878, - "excess_mana": 1320236015, - "mana_used": 96638619 + "eth_per_fee_asset": 10733928, + "excess_mana": 1028443000, + "mana_used": 67863793 } }, { @@ -44899,21 +44899,21 @@ "blobs_needed": 1, "block_number": 610, "l1_block_number": 20974980, - "mana_spent": 100289431, - "size_in_fields": 3480, + "mana_spent": 67852911, + "size_in_fields": 2460, "slot_number": 610, "timestamp": 1729043783 }, "fee_header": { - "eth_per_fee_asset": 12322527, - "excess_mana": 1318608669, - "mana_used": 100289431 + "eth_per_fee_asset": 10650298, + "excess_mana": 1033316617, + "mana_used": 67852911 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": -14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12446997, + "eth_per_fee_asset_at_execution": 10665230, "l1_fee_oracle_output": { "base_fee": 8890027161, "blob_fee": 1 @@ -44930,22 +44930,22 @@ "slot_of_change": 610 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62033971326578, - "congestion_multiplier": 4677539126, - "prover_cost": 14725645470952, - "sequencer_cost": 2142692088703 + "congestion_cost": 86312335598951, + "congestion_multiplier": 5012696155, + "prover_cost": 18175601651348, + "sequencer_cost": 3334209295065 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772136655, - "congestion_multiplier": 4677539126, - "prover_cost": 183290065, - "sequencer_cost": 26670082 + "congestion_cost": 920540911, + "congestion_multiplier": 5012696155, + "prover_cost": 193846972, + "sequencer_cost": 35560109 } }, "parent_fee_header": { - "eth_per_fee_asset": 12446997, - "excess_mana": 1316874634, - "mana_used": 101734035 + "eth_per_fee_asset": 10665230, + "excess_mana": 1021306793, + "mana_used": 87009824 } }, { @@ -44953,21 +44953,21 @@ "blobs_needed": 1, "block_number": 611, "l1_block_number": 20974983, - "mana_spent": 94756982, - "size_in_fields": 3465, + "mana_spent": 68100720, + "size_in_fields": 2490, "slot_number": 611, "timestamp": 1729043819 }, "fee_header": { - "eth_per_fee_asset": 12299114, - "excess_mana": 1318898100, - "mana_used": 94756982 + "eth_per_fee_asset": 10702484, + "excess_mana": 1026169528, + "mana_used": 68100720 }, "oracle_input": { - "fee_asset_price_modifier": -19 + "fee_asset_price_modifier": 49 }, "outputs": { - "eth_per_fee_asset_at_execution": 12322527, + "eth_per_fee_asset_at_execution": 10650298, "l1_fee_oracle_output": { "base_fee": 8890027161, "blob_fee": 1 @@ -44984,22 +44984,22 @@ "slot_of_change": 610 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62687570739346, - "congestion_multiplier": 4679123369, - "prover_cost": 14874389400811, - "sequencer_cost": 2164335448403 + "congestion_cost": 85236190010834, + "congestion_multiplier": 4957117716, + "prover_cost": 18201084326467, + "sequencer_cost": 3338883944844 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 772469283, - "congestion_multiplier": 4679123369, - "prover_cost": 183290065, - "sequencer_cost": 26670082 + "congestion_cost": 907790824, + "congestion_multiplier": 4957117716, + "prover_cost": 193846972, + "sequencer_cost": 35560109 } }, "parent_fee_header": { - "eth_per_fee_asset": 12322527, - "excess_mana": 1318608669, - "mana_used": 100289431 + "eth_per_fee_asset": 10650298, + "excess_mana": 1033316617, + "mana_used": 67852911 } }, { @@ -45007,21 +45007,21 @@ "blobs_needed": 1, "block_number": 612, "l1_block_number": 20974986, - "mana_spent": 111233983, - "size_in_fields": 3780, + "mana_spent": 69874360, + "size_in_fields": 2415, "slot_number": 612, "timestamp": 1729043855 }, "fee_header": { - "eth_per_fee_asset": 12295424, - "excess_mana": 1313655082, - "mana_used": 111233983 + "eth_per_fee_asset": 10708905, + "excess_mana": 1019270248, + "mana_used": 69874360 }, "oracle_input": { - "fee_asset_price_modifier": -3 + "fee_asset_price_modifier": 6 }, "outputs": { - "eth_per_fee_asset_at_execution": 12299114, + "eth_per_fee_asset_at_execution": 10702484, "l1_fee_oracle_output": { "base_fee": 8890027161, "blob_fee": 1 @@ -45038,22 +45038,22 @@ "slot_of_change": 610 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62318406187633, - "congestion_multiplier": 4650507936, - "prover_cost": 14902704780198, - "sequencer_cost": 2168455548912 + "congestion_cost": 83683090112539, + "congestion_multiplier": 4904050956, + "prover_cost": 18112334669223, + "sequencer_cost": 3322603332087 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 766461182, - "congestion_multiplier": 4650507936, - "prover_cost": 183290065, - "sequencer_cost": 26670082 + "congestion_cost": 895616933, + "congestion_multiplier": 4904050956, + "prover_cost": 193846972, + "sequencer_cost": 35560109 } }, "parent_fee_header": { - "eth_per_fee_asset": 12299114, - "excess_mana": 1318898100, - "mana_used": 94756982 + "eth_per_fee_asset": 10702484, + "excess_mana": 1026169528, + "mana_used": 68100720 } }, { @@ -45061,21 +45061,21 @@ "blobs_needed": 1, "block_number": 613, "l1_block_number": 20974989, - "mana_spent": 102111169, - "size_in_fields": 3780, + "mana_spent": 71596429, + "size_in_fields": 2865, "slot_number": 613, "timestamp": 1729043891 }, "fee_header": { - "eth_per_fee_asset": 12276980, - "excess_mana": 1324889065, - "mana_used": 102111169 + "eth_per_fee_asset": 10659644, + "excess_mana": 1014144608, + "mana_used": 71596429 }, "oracle_input": { - "fee_asset_price_modifier": -15 + "fee_asset_price_modifier": -46 }, "outputs": { - "eth_per_fee_asset_at_execution": 12295424, + "eth_per_fee_asset_at_execution": 10708905, "l1_fee_oracle_output": { "base_fee": 8890027161, "blob_fee": 1 @@ -45092,22 +45092,22 @@ "slot_of_change": 615 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63387789066892, - "congestion_multiplier": 4712036569, - "prover_cost": 14907177255539, - "sequencer_cost": 2169106327688 + "congestion_cost": 82796244060434, + "congestion_multiplier": 4864994528, + "prover_cost": 18101474613885, + "sequencer_cost": 3320611117570 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779379743, - "congestion_multiplier": 4712036569, - "prover_cost": 183290065, - "sequencer_cost": 26670082 + "congestion_cost": 886657112, + "congestion_multiplier": 4864994528, + "prover_cost": 193846972, + "sequencer_cost": 35560109 } }, "parent_fee_header": { - "eth_per_fee_asset": 12295424, - "excess_mana": 1313655082, - "mana_used": 111233983 + "eth_per_fee_asset": 10708905, + "excess_mana": 1019270248, + "mana_used": 69874360 } }, { @@ -45115,21 +45115,21 @@ "blobs_needed": 1, "block_number": 614, "l1_block_number": 20974992, - "mana_spent": 100043266, - "size_in_fields": 3540, + "mana_spent": 78991883, + "size_in_fields": 2820, "slot_number": 614, "timestamp": 1729043927 }, "fee_header": { - "eth_per_fee_asset": 12349414, - "excess_mana": 1327000234, - "mana_used": 100043266 + "eth_per_fee_asset": 10591422, + "excess_mana": 1010741037, + "mana_used": 78991883 }, "oracle_input": { - "fee_asset_price_modifier": 59 + "fee_asset_price_modifier": -64 }, "outputs": { - "eth_per_fee_asset_at_execution": 12276980, + "eth_per_fee_asset_at_execution": 10659644, "l1_fee_oracle_output": { "base_fee": 8890027161, "blob_fee": 1 @@ -45146,22 +45146,22 @@ "slot_of_change": 615 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63682314380247, - "congestion_multiplier": 4723690005, - "prover_cost": 14929572663636, - "sequencer_cost": 2172365027882 + "congestion_cost": 82624428545644, + "congestion_multiplier": 4839231950, + "prover_cost": 18185126257500, + "sequencer_cost": 3335956529130 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 781826500, - "congestion_multiplier": 4723690005, - "prover_cost": 183290065, - "sequencer_cost": 26670082 + "congestion_cost": 880746994, + "congestion_multiplier": 4839231950, + "prover_cost": 193846972, + "sequencer_cost": 35560109 } }, "parent_fee_header": { - "eth_per_fee_asset": 12276980, - "excess_mana": 1324889065, - "mana_used": 102111169 + "eth_per_fee_asset": 10659644, + "excess_mana": 1014144608, + "mana_used": 71596429 } }, { @@ -45169,21 +45169,21 @@ "blobs_needed": 1, "block_number": 615, "l1_block_number": 20974995, - "mana_spent": 97056783, - "size_in_fields": 3555, + "mana_spent": 84475512, + "size_in_fields": 2835, "slot_number": 615, "timestamp": 1729043963 }, "fee_header": { - "eth_per_fee_asset": 12472908, - "excess_mana": 1327043500, - "mana_used": 97056783 + "eth_per_fee_asset": 10526814, + "excess_mana": 1014732920, + "mana_used": 84475512 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -61 }, "outputs": { - "eth_per_fee_asset_at_execution": 12349414, + "eth_per_fee_asset_at_execution": 10591422, "l1_fee_oracle_output": { "base_fee": 9086553653, "blob_fee": 1 @@ -45200,22 +45200,22 @@ "slot_of_change": 615 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63509164321482, - "congestion_multiplier": 4723929130, - "prover_cost": 14846978164309, - "sequencer_cost": 2207364738117 + "congestion_cost": 84206290241292, + "congestion_multiplier": 4869461508, + "prover_cost": 18330094108233, + "sequencer_cost": 3431665266477 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784300963, - "congestion_multiplier": 4723929130, - "prover_cost": 183351480, - "sequencer_cost": 27259661 + "congestion_cost": 891864355, + "congestion_multiplier": 4869461508, + "prover_cost": 194141762, + "sequencer_cost": 36346215 } }, "parent_fee_header": { - "eth_per_fee_asset": 12349414, - "excess_mana": 1327000234, - "mana_used": 100043266 + "eth_per_fee_asset": 10591422, + "excess_mana": 1010741037, + "mana_used": 78991883 } }, { @@ -45223,21 +45223,21 @@ "blobs_needed": 1, "block_number": 616, "l1_block_number": 20974998, - "mana_spent": 96222199, - "size_in_fields": 3465, + "mana_spent": 82935768, + "size_in_fields": 2985, "slot_number": 616, "timestamp": 1729043999 }, "fee_header": { - "eth_per_fee_asset": 12467918, - "excess_mana": 1324100283, - "mana_used": 96222199 + "eth_per_fee_asset": 10526814, + "excess_mana": 1024208432, + "mana_used": 82935768 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 12472908, + "eth_per_fee_asset_at_execution": 10526814, "l1_fee_oracle_output": { "base_fee": 9086553653, "blob_fee": 1 @@ -45254,22 +45254,22 @@ "slot_of_change": 615 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62606154956006, - "congestion_multiplier": 4707689955, - "prover_cost": 14699978545501, - "sequencer_cost": 2185509666231 + "congestion_cost": 86310821583815, + "congestion_multiplier": 4941975531, + "prover_cost": 18442594502003, + "sequencer_cost": 3452727007431 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 780880811, - "congestion_multiplier": 4707689955, - "prover_cost": 183351480, - "sequencer_cost": 27259661 + "congestion_cost": 908577965, + "congestion_multiplier": 4941975531, + "prover_cost": 194141762, + "sequencer_cost": 36346215 } }, "parent_fee_header": { - "eth_per_fee_asset": 12472908, - "excess_mana": 1327043500, - "mana_used": 97056783 + "eth_per_fee_asset": 10526814, + "excess_mana": 1014732920, + "mana_used": 84475512 } }, { @@ -45277,21 +45277,21 @@ "blobs_needed": 1, "block_number": 617, "l1_block_number": 20975000, - "mana_spent": 101571519, - "size_in_fields": 3630, + "mana_spent": 74236971, + "size_in_fields": 2475, "slot_number": 617, "timestamp": 1729044035 }, "fee_header": { - "eth_per_fee_asset": 12431761, - "excess_mana": 1320322482, - "mana_used": 101571519 + "eth_per_fee_asset": 10519445, + "excess_mana": 1032144200, + "mana_used": 74236971 }, "oracle_input": { - "fee_asset_price_modifier": -29 + "fee_asset_price_modifier": -7 }, "outputs": { - "eth_per_fee_asset_at_execution": 12467918, + "eth_per_fee_asset_at_execution": 10526814, "l1_fee_oracle_output": { "base_fee": 9086553653, "blob_fee": 1 @@ -45308,22 +45308,22 @@ "slot_of_change": 615 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62280491498260, - "congestion_multiplier": 4686927756, - "prover_cost": 14705861876859, - "sequencer_cost": 2186384366661 + "congestion_cost": 87658717917881, + "congestion_multiplier": 5003536460, + "prover_cost": 18442594502003, + "sequencer_cost": 3452727007431 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 776508061, - "congestion_multiplier": 4686927756, - "prover_cost": 183351480, - "sequencer_cost": 27259661 + "congestion_cost": 922767019, + "congestion_multiplier": 5003536460, + "prover_cost": 194141762, + "sequencer_cost": 36346215 } }, "parent_fee_header": { - "eth_per_fee_asset": 12467918, - "excess_mana": 1324100283, - "mana_used": 96222199 + "eth_per_fee_asset": 10526814, + "excess_mana": 1024208432, + "mana_used": 82935768 } }, { @@ -45331,21 +45331,21 @@ "blobs_needed": 1, "block_number": 618, "l1_block_number": 20975003, - "mana_spent": 100950961, - "size_in_fields": 3315, + "mana_spent": 64193974, + "size_in_fields": 2355, "slot_number": 618, "timestamp": 1729044071 }, "fee_header": { - "eth_per_fee_asset": 12481488, - "excess_mana": 1321894001, - "mana_used": 100950961 + "eth_per_fee_asset": 10494198, + "excess_mana": 1031381171, + "mana_used": 64193974 }, "oracle_input": { - "fee_asset_price_modifier": 40 + "fee_asset_price_modifier": -24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12431761, + "eth_per_fee_asset_at_execution": 10519445, "l1_fee_oracle_output": { "base_fee": 9086553653, "blob_fee": 1 @@ -45362,22 +45362,22 @@ "slot_of_change": 620 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62607761201330, - "congestion_multiplier": 4695553431, - "prover_cost": 14748632957150, - "sequencer_cost": 2192743328963 + "congestion_cost": 87589705255363, + "congestion_multiplier": 4997584168, + "prover_cost": 18455513765223, + "sequencer_cost": 3455145684968 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 778324724, - "congestion_multiplier": 4695553431, - "prover_cost": 183351480, - "sequencer_cost": 27259661 + "congestion_cost": 921395087, + "congestion_multiplier": 4997584168, + "prover_cost": 194141762, + "sequencer_cost": 36346215 } }, "parent_fee_header": { - "eth_per_fee_asset": 12431761, - "excess_mana": 1320322482, - "mana_used": 101571519 + "eth_per_fee_asset": 10519445, + "excess_mana": 1032144200, + "mana_used": 74236971 } }, { @@ -45385,21 +45385,21 @@ "blobs_needed": 1, "block_number": 619, "l1_block_number": 20975006, - "mana_spent": 91652834, - "size_in_fields": 3285, + "mana_spent": 70138930, + "size_in_fields": 2655, "slot_number": 619, "timestamp": 1729044107 }, "fee_header": { - "eth_per_fee_asset": 12542647, - "excess_mana": 1322844962, - "mana_used": 91652834 + "eth_per_fee_asset": 10499445, + "excess_mana": 1020575145, + "mana_used": 70138930 }, "oracle_input": { - "fee_asset_price_modifier": 49 + "fee_asset_price_modifier": 5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12481488, + "eth_per_fee_asset_at_execution": 10494198, "l1_fee_oracle_output": { "base_fee": 9086553653, "blob_fee": 1 @@ -45416,22 +45416,22 @@ "slot_of_change": 620 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62446532897360, - "congestion_multiplier": 4700780725, - "prover_cost": 14689873515081, - "sequencer_cost": 2184007307463 + "congestion_cost": 85965605375466, + "congestion_multiplier": 4914044003, + "prover_cost": 18499914143035, + "sequencer_cost": 3463458093701 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 779425651, - "congestion_multiplier": 4700780725, - "prover_cost": 183351480, - "sequencer_cost": 27259661 + "congestion_cost": 902140084, + "congestion_multiplier": 4914044003, + "prover_cost": 194141762, + "sequencer_cost": 36346215 } }, "parent_fee_header": { - "eth_per_fee_asset": 12481488, - "excess_mana": 1321894001, - "mana_used": 100950961 + "eth_per_fee_asset": 10494198, + "excess_mana": 1031381171, + "mana_used": 64193974 } }, { @@ -45439,21 +45439,21 @@ "blobs_needed": 1, "block_number": 620, "l1_block_number": 20975008, - "mana_spent": 109488109, - "size_in_fields": 3840, + "mana_spent": 74038656, + "size_in_fields": 2565, "slot_number": 620, "timestamp": 1729044143 }, "fee_header": { - "eth_per_fee_asset": 12619157, - "excess_mana": 1314497796, - "mana_used": 109488109 + "eth_per_fee_asset": 10445897, + "excess_mana": 1015714075, + "mana_used": 74038656 }, "oracle_input": { - "fee_asset_price_modifier": 61 + "fee_asset_price_modifier": -51 }, "outputs": { - "eth_per_fee_asset_at_execution": 12542647, + "eth_per_fee_asset_at_execution": 10499445, "l1_fee_oracle_output": { "base_fee": 10168459328, "blob_fee": 1 @@ -45470,22 +45470,22 @@ "slot_of_change": 620 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62419280794557, - "congestion_multiplier": 4655095483, - "prover_cost": 14645200092134, - "sequencer_cost": 2432132388004 + "congestion_cost": 87304908592788, + "congestion_multiplier": 4876920421, + "prover_cost": 18645235057663, + "sequencer_cost": 3873903620620 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 782903005, - "congestion_multiplier": 4655095483, - "prover_cost": 183689575, - "sequencer_cost": 30505378 + "congestion_cost": 916653086, + "congestion_multiplier": 4876920421, + "prover_cost": 195764620, + "sequencer_cost": 40673838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12542647, - "excess_mana": 1322844962, - "mana_used": 91652834 + "eth_per_fee_asset": 10499445, + "excess_mana": 1020575145, + "mana_used": 70138930 } }, { @@ -45493,21 +45493,21 @@ "blobs_needed": 1, "block_number": 621, "l1_block_number": 20975011, - "mana_spent": 103539841, - "size_in_fields": 3780, + "mana_spent": 73692913, + "size_in_fields": 2535, "slot_number": 621, "timestamp": 1729044179 }, "fee_header": { - "eth_per_fee_asset": 12610323, - "excess_mana": 1323985905, - "mana_used": 103539841 + "eth_per_fee_asset": 10511706, + "excess_mana": 1014752731, + "mana_used": 73692913 }, "oracle_input": { - "fee_asset_price_modifier": -7 + "fee_asset_price_modifier": 63 }, "outputs": { - "eth_per_fee_asset_at_execution": 12619157, + "eth_per_fee_asset_at_execution": 10445897, "l1_fee_oracle_output": { "base_fee": 10168459328, "blob_fee": 1 @@ -45524,22 +45524,22 @@ "slot_of_change": 620 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 62922867430844, - "congestion_multiplier": 4707060003, - "prover_cost": 14556406184661, - "sequencer_cost": 2417386359486 + "congestion_cost": 87587030008051, + "congestion_multiplier": 4869612002, + "prover_cost": 18740814694995, + "sequencer_cost": 3893762115403 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 794033543, - "congestion_multiplier": 4707060003, - "prover_cost": 183689575, - "sequencer_cost": 30505378 + "congestion_cost": 914925094, + "congestion_multiplier": 4869612002, + "prover_cost": 195764620, + "sequencer_cost": 40673838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12619157, - "excess_mana": 1314497796, - "mana_used": 109488109 + "eth_per_fee_asset": 10445897, + "excess_mana": 1015714075, + "mana_used": 74038656 } }, { @@ -45547,21 +45547,21 @@ "blobs_needed": 1, "block_number": 622, "l1_block_number": 20975014, - "mana_spent": 98927227, - "size_in_fields": 3315, + "mana_spent": 86287037, + "size_in_fields": 3060, "slot_number": 622, "timestamp": 1729044215 }, "fee_header": { - "eth_per_fee_asset": 12484219, - "excess_mana": 1327525746, - "mana_used": 98927227 + "eth_per_fee_asset": 10460198, + "excess_mana": 1013445644, + "mana_used": 86287037 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": -49 }, "outputs": { - "eth_per_fee_asset_at_execution": 12610323, + "eth_per_fee_asset_at_execution": 10511706, "l1_fee_oracle_output": { "base_fee": 10168459328, "blob_fee": 1 @@ -45578,22 +45578,22 @@ "slot_of_change": 620 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63298766811921, - "congestion_multiplier": 4726595255, - "prover_cost": 14566603488270, - "sequencer_cost": 2419079828487 + "congestion_cost": 86815574179872, + "congestion_multiplier": 4859692708, + "prover_cost": 18623486996307, + "sequencer_cost": 3869385045587 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 798217895, - "congestion_multiplier": 4726595255, - "prover_cost": 183689575, - "sequencer_cost": 30505378 + "congestion_cost": 912579792, + "congestion_multiplier": 4859692708, + "prover_cost": 195764620, + "sequencer_cost": 40673838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12610323, - "excess_mana": 1323985905, - "mana_used": 103539841 + "eth_per_fee_asset": 10511706, + "excess_mana": 1014752731, + "mana_used": 73692913 } }, { @@ -45601,21 +45601,21 @@ "blobs_needed": 1, "block_number": 623, "l1_block_number": 20975017, - "mana_spent": 95592257, - "size_in_fields": 3315, + "mana_spent": 79100138, + "size_in_fields": 2595, "slot_number": 623, "timestamp": 1729044251 }, "fee_header": { - "eth_per_fee_asset": 12532907, - "excess_mana": 1326452973, - "mana_used": 95592257 + "eth_per_fee_asset": 10540741, + "excess_mana": 1024732681, + "mana_used": 79100138 }, "oracle_input": { - "fee_asset_price_modifier": 39 + "fee_asset_price_modifier": 77 }, "outputs": { - "eth_per_fee_asset_at_execution": 12484219, + "eth_per_fee_asset_at_execution": 10460198, "l1_fee_oracle_output": { "base_fee": 10168459328, "blob_fee": 1 @@ -45632,22 +45632,22 @@ "slot_of_change": 625 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63836429655712, - "congestion_multiplier": 4720666417, - "prover_cost": 14713741804754, - "sequencer_cost": 2443515128981 + "congestion_cost": 89194355307615, + "congestion_multiplier": 4946018873, + "prover_cost": 18715192580485, + "sequencer_cost": 3888438631850 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 796947968, - "congestion_multiplier": 4720666417, - "prover_cost": 183689575, - "sequencer_cost": 30505378 + "congestion_cost": 932990617, + "congestion_multiplier": 4946018873, + "prover_cost": 195764620, + "sequencer_cost": 40673838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12484219, - "excess_mana": 1327525746, - "mana_used": 98927227 + "eth_per_fee_asset": 10460198, + "excess_mana": 1013445644, + "mana_used": 86287037 } }, { @@ -45655,21 +45655,21 @@ "blobs_needed": 1, "block_number": 624, "l1_block_number": 20975020, - "mana_spent": 86526771, - "size_in_fields": 3300, + "mana_spent": 72665675, + "size_in_fields": 2355, "slot_number": 624, "timestamp": 1729044287 }, "fee_header": { - "eth_per_fee_asset": 12501574, - "excess_mana": 1322045230, - "mana_used": 86526771 + "eth_per_fee_asset": 10537578, + "excess_mana": 1028832819, + "mana_used": 72665675 }, "oracle_input": { - "fee_asset_price_modifier": -25 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 12532907, + "eth_per_fee_asset_at_execution": 10540741, "l1_fee_oracle_output": { "base_fee": 10168459328, "blob_fee": 1 @@ -45686,22 +45686,22 @@ "slot_of_change": 625 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63173441405095, - "congestion_multiplier": 4696384326, - "prover_cost": 14656581669361, - "sequencer_cost": 2434022529650 + "congestion_cost": 89224705359899, + "congestion_multiplier": 4977756065, + "prover_cost": 18572187666883, + "sequencer_cost": 3858726630320 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791746866, - "congestion_multiplier": 4696384326, - "prover_cost": 183689575, - "sequencer_cost": 30505378 + "congestion_cost": 940494510, + "congestion_multiplier": 4977756065, + "prover_cost": 195764620, + "sequencer_cost": 40673838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12532907, - "excess_mana": 1326452973, - "mana_used": 95592257 + "eth_per_fee_asset": 10540741, + "excess_mana": 1024732681, + "mana_used": 79100138 } }, { @@ -45709,21 +45709,21 @@ "blobs_needed": 1, "block_number": 625, "l1_block_number": 20975023, - "mana_spent": 107963681, - "size_in_fields": 3825, + "mana_spent": 66989621, + "size_in_fields": 2385, "slot_number": 625, "timestamp": 1729044323 }, "fee_header": { - "eth_per_fee_asset": 12626589, - "excess_mana": 1308572001, - "mana_used": 107963681 + "eth_per_fee_asset": 10473298, + "excess_mana": 1026498494, + "mana_used": 66989621 }, "oracle_input": { - "fee_asset_price_modifier": 100 + "fee_asset_price_modifier": -61 }, "outputs": { - "eth_per_fee_asset_at_execution": 12501574, + "eth_per_fee_asset_at_execution": 10537578, "l1_fee_oracle_output": { "base_fee": 11483323505, "blob_fee": 1 @@ -45740,22 +45740,22 @@ "slot_of_change": 625 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63335504233307, - "congestion_multiplier": 4622932492, - "prover_cost": 14726183279002, - "sequencer_cost": 2755650688466 + "congestion_cost": 91562952226784, + "congestion_multiplier": 4959662297, + "prover_cost": 18764930328393, + "sequencer_cost": 4358999288072 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 791793493, - "congestion_multiplier": 4622932492, - "prover_cost": 184100470, - "sequencer_cost": 34449971 + "congestion_cost": 964851751, + "congestion_multiplier": 4959662297, + "prover_cost": 197736917, + "sequencer_cost": 45933295 } }, "parent_fee_header": { - "eth_per_fee_asset": 12501574, - "excess_mana": 1322045230, - "mana_used": 86526771 + "eth_per_fee_asset": 10537578, + "excess_mana": 1028832819, + "mana_used": 72665675 } }, { @@ -45763,21 +45763,21 @@ "blobs_needed": 1, "block_number": 626, "l1_block_number": 20975026, - "mana_spent": 99745850, - "size_in_fields": 3345, + "mana_spent": 25586586, + "size_in_fields": 930, "slot_number": 626, "timestamp": 1729044359 }, "fee_header": { - "eth_per_fee_asset": 12621538, - "excess_mana": 1316535682, - "mana_used": 99745850 + "eth_per_fee_asset": 10454446, + "excess_mana": 1018488115, + "mana_used": 25586586 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12626589, + "eth_per_fee_asset_at_execution": 10473298, "l1_fee_oracle_output": { "base_fee": 11483323505, "blob_fee": 1 @@ -45794,22 +45794,22 @@ "slot_of_change": 625 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63457468442190, - "congestion_multiplier": 4666207994, - "prover_cost": 14580380338665, - "sequencer_cost": 2728367178183 + "congestion_cost": 90691947846801, + "congestion_multiplier": 4898071038, + "prover_cost": 18880100327519, + "sequencer_cost": 4385752701776 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 801251373, - "congestion_multiplier": 4666207994, - "prover_cost": 184100470, - "sequencer_cost": 34449971 + "congestion_cost": 949843796, + "congestion_multiplier": 4898071038, + "prover_cost": 197736917, + "sequencer_cost": 45933295 } }, "parent_fee_header": { - "eth_per_fee_asset": 12626589, - "excess_mana": 1308572001, - "mana_used": 107963681 + "eth_per_fee_asset": 10473298, + "excess_mana": 1026498494, + "mana_used": 66989621 } }, { @@ -45817,21 +45817,21 @@ "blobs_needed": 1, "block_number": 627, "l1_block_number": 20975029, - "mana_spent": 107710507, - "size_in_fields": 3735, + "mana_spent": 113648293, + "size_in_fields": 3810, "slot_number": 627, "timestamp": 1729044395 }, "fee_header": { - "eth_per_fee_asset": 12616489, - "excess_mana": 1316281532, - "mana_used": 107710507 + "eth_per_fee_asset": 10434582, + "excess_mana": 969074701, + "mana_used": 113648293 }, "oracle_input": { - "fee_asset_price_modifier": -4 + "fee_asset_price_modifier": -19 }, "outputs": { - "eth_per_fee_asset_at_execution": 12621538, + "eth_per_fee_asset_at_execution": 10454446, "l1_fee_oracle_output": { "base_fee": 11483323505, "blob_fee": 1 @@ -45848,22 +45848,22 @@ "slot_of_change": 625 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63458841149154, - "congestion_multiplier": 4664820678, - "prover_cost": 14586215245718, - "sequencer_cost": 2729459040571 + "congestion_cost": 82385853157595, + "congestion_multiplier": 4534689147, + "prover_cost": 18914145905006, + "sequencer_cost": 4393661318831 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 800948175, - "congestion_multiplier": 4664820678, - "prover_cost": 184100470, - "sequencer_cost": 34449971 + "congestion_cost": 861298453, + "congestion_multiplier": 4534689147, + "prover_cost": 197736917, + "sequencer_cost": 45933295 } }, "parent_fee_header": { - "eth_per_fee_asset": 12621538, - "excess_mana": 1316535682, - "mana_used": 99745850 + "eth_per_fee_asset": 10454446, + "excess_mana": 1018488115, + "mana_used": 25586586 } }, { @@ -45871,21 +45871,21 @@ "blobs_needed": 1, "block_number": 628, "l1_block_number": 20975032, - "mana_spent": 108902372, - "size_in_fields": 3495, + "mana_spent": 85263051, + "size_in_fields": 3180, "slot_number": 628, "timestamp": 1729044431 }, "fee_header": { - "eth_per_fee_asset": 12635413, - "excess_mana": 1323992039, - "mana_used": 108902372 + "eth_per_fee_asset": 10378235, + "excess_mana": 1007722994, + "mana_used": 85263051 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -54 }, "outputs": { - "eth_per_fee_asset_at_execution": 12616489, + "eth_per_fee_asset_at_execution": 10434582, "l1_fee_oracle_output": { "base_fee": 11483323505, "blob_fee": 1 @@ -45902,22 +45902,22 @@ "slot_of_change": 630 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64216517051614, - "congestion_multiplier": 4707093785, - "prover_cost": 14592052511599, - "sequencer_cost": 2730551344356 + "congestion_cost": 89123625076693, + "congestion_multiplier": 4816501685, + "prover_cost": 18950152195843, + "sequencer_cost": 4402025399772 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 810186981, - "congestion_multiplier": 4707093785, - "prover_cost": 184100470, - "sequencer_cost": 34449971 + "congestion_cost": 929967774, + "congestion_multiplier": 4816501685, + "prover_cost": 197736917, + "sequencer_cost": 45933295 } }, "parent_fee_header": { - "eth_per_fee_asset": 12616489, - "excess_mana": 1316281532, - "mana_used": 107710507 + "eth_per_fee_asset": 10434582, + "excess_mana": 969074701, + "mana_used": 113648293 } }, { @@ -45925,21 +45925,21 @@ "blobs_needed": 1, "block_number": 629, "l1_block_number": 20975035, - "mana_spent": 89715408, - "size_in_fields": 3330, + "mana_spent": 85244365, + "size_in_fields": 3045, "slot_number": 629, "timestamp": 1729044467 }, "fee_header": { - "eth_per_fee_asset": 12663210, - "excess_mana": 1332894411, - "mana_used": 89715408 + "eth_per_fee_asset": 10423899, + "excess_mana": 1017986045, + "mana_used": 85244365 }, "oracle_input": { - "fee_asset_price_modifier": 22 + "fee_asset_price_modifier": 44 }, "outputs": { - "eth_per_fee_asset_at_execution": 12635413, + "eth_per_fee_asset_at_execution": 10378235, "l1_fee_oracle_output": { "base_fee": 11483323505, "blob_fee": 1 @@ -45956,22 +45956,22 @@ "slot_of_change": 630 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64972793212221, - "congestion_multiplier": 4756378037, - "prover_cost": 14570198061591, - "sequencer_cost": 2726461810153 + "congestion_cost": 91432634450849, + "congestion_multiplier": 4894236227, + "prover_cost": 19053039076491, + "sequencer_cost": 4425925506602 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 820958076, - "congestion_multiplier": 4756378037, - "prover_cost": 184100470, - "sequencer_cost": 34449971 + "congestion_cost": 948909367, + "congestion_multiplier": 4894236227, + "prover_cost": 197736917, + "sequencer_cost": 45933295 } }, "parent_fee_header": { - "eth_per_fee_asset": 12635413, - "excess_mana": 1323992039, - "mana_used": 108902372 + "eth_per_fee_asset": 10378235, + "excess_mana": 1007722994, + "mana_used": 85263051 } }, { @@ -45979,21 +45979,21 @@ "blobs_needed": 1, "block_number": 630, "l1_block_number": 20975038, - "mana_spent": 102887254, - "size_in_fields": 3615, + "mana_spent": 65695850, + "size_in_fields": 2625, "slot_number": 630, "timestamp": 1729044503 }, "fee_header": { - "eth_per_fee_asset": 12578366, - "excess_mana": 1322609819, - "mana_used": 102887254 + "eth_per_fee_asset": 10366567, + "excess_mana": 1028230410, + "mana_used": 65695850 }, "oracle_input": { - "fee_asset_price_modifier": -67 + "fee_asset_price_modifier": -55 }, "outputs": { - "eth_per_fee_asset_at_execution": 12663210, + "eth_per_fee_asset_at_execution": 10423899, "l1_fee_oracle_output": { "base_fee": 11370133915, "blob_fee": 1 @@ -46010,22 +46010,22 @@ "slot_of_change": 630 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 63738780609340, - "congestion_multiplier": 4699487637, - "prover_cost": 14535421745356, - "sequencer_cost": 2693661559747 + "congestion_cost": 92637881468346, + "congestion_multiplier": 4973080376, + "prover_cost": 18953285330183, + "sequencer_cost": 4363102136735 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 807137564, - "congestion_multiplier": 4699487637, - "prover_cost": 184065098, - "sequencer_cost": 34110402 + "congestion_cost": 965647920, + "congestion_multiplier": 4973080376, + "prover_cost": 197567132, + "sequencer_cost": 45480536 } }, "parent_fee_header": { - "eth_per_fee_asset": 12663210, - "excess_mana": 1332894411, - "mana_used": 89715408 + "eth_per_fee_asset": 10423899, + "excess_mana": 1017986045, + "mana_used": 85244365 } }, { @@ -46033,21 +46033,21 @@ "blobs_needed": 1, "block_number": 631, "l1_block_number": 20975041, - "mana_spent": 102128203, - "size_in_fields": 3645, + "mana_spent": 69971737, + "size_in_fields": 2625, "slot_number": 631, "timestamp": 1729044539 }, "fee_header": { - "eth_per_fee_asset": 12515474, - "excess_mana": 1325497073, - "mana_used": 102128203 + "eth_per_fee_asset": 10310587, + "excess_mana": 1018926260, + "mana_used": 69971737 }, "oracle_input": { - "fee_asset_price_modifier": -50 + "fee_asset_price_modifier": -54 }, "outputs": { - "eth_per_fee_asset_at_execution": 12578366, + "eth_per_fee_asset_at_execution": 10366567, "l1_fee_oracle_output": { "base_fee": 11370133915, "blob_fee": 1 @@ -46064,22 +46064,22 @@ "slot_of_change": 630 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64444540570691, - "congestion_multiplier": 4715389760, - "prover_cost": 14633466540885, - "sequencer_cost": 2711830932572 + "congestion_cost": 91470111850915, + "congestion_multiplier": 4901420044, + "prover_cost": 19058105928414, + "sequencer_cost": 4387232147345 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 810607018, - "congestion_multiplier": 4715389760, - "prover_cost": 184065098, - "sequencer_cost": 34110402 + "congestion_cost": 948231043, + "congestion_multiplier": 4901420044, + "prover_cost": 197567132, + "sequencer_cost": 45480536 } }, "parent_fee_header": { - "eth_per_fee_asset": 12578366, - "excess_mana": 1322609819, - "mana_used": 102887254 + "eth_per_fee_asset": 10366567, + "excess_mana": 1028230410, + "mana_used": 65695850 } }, { @@ -46087,21 +46087,21 @@ "blobs_needed": 1, "block_number": 632, "l1_block_number": 20975044, - "mana_spent": 91665931, - "size_in_fields": 3345, + "mana_spent": 73439500, + "size_in_fields": 2940, "slot_number": 632, "timestamp": 1729044575 }, "fee_header": { - "eth_per_fee_asset": 12485436, - "excess_mana": 1327625276, - "mana_used": 91665931 + "eth_per_fee_asset": 10307493, + "excess_mana": 1013897997, + "mana_used": 73439500 }, "oracle_input": { - "fee_asset_price_modifier": -24 + "fee_asset_price_modifier": -3 }, "outputs": { - "eth_per_fee_asset_at_execution": 12515474, + "eth_per_fee_asset_at_execution": 10310587, "l1_fee_oracle_output": { "base_fee": 11370133915, "blob_fee": 1 @@ -46118,22 +46118,22 @@ "slot_of_change": 630 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64973318309798, - "congestion_multiplier": 4727145699, - "prover_cost": 14707001748396, - "sequencer_cost": 2725458260710 + "congestion_cost": 91063981032312, + "congestion_multiplier": 4863123261, + "prover_cost": 19161579452266, + "sequencer_cost": 4411052057463 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 813171876, - "congestion_multiplier": 4727145699, - "prover_cost": 184065098, - "sequencer_cost": 34110402 + "congestion_cost": 938923099, + "congestion_multiplier": 4863123261, + "prover_cost": 197567132, + "sequencer_cost": 45480536 } }, "parent_fee_header": { - "eth_per_fee_asset": 12515474, - "excess_mana": 1325497073, - "mana_used": 102128203 + "eth_per_fee_asset": 10310587, + "excess_mana": 1018926260, + "mana_used": 69971737 } }, { @@ -46141,21 +46141,21 @@ "blobs_needed": 1, "block_number": 633, "l1_block_number": 20975047, - "mana_spent": 105297353, - "size_in_fields": 3540, + "mana_spent": 71602276, + "size_in_fields": 2640, "slot_number": 633, "timestamp": 1729044611 }, "fee_header": { - "eth_per_fee_asset": 12379309, - "excess_mana": 1319291207, - "mana_used": 105297353 + "eth_per_fee_asset": 10296154, + "excess_mana": 1012337497, + "mana_used": 71602276 }, "oracle_input": { - "fee_asset_price_modifier": -85 + "fee_asset_price_modifier": -11 }, "outputs": { - "eth_per_fee_asset_at_execution": 12485436, + "eth_per_fee_asset_at_execution": 10307493, "l1_fee_oracle_output": { "base_fee": 11370133915, "blob_fee": 1 @@ -46172,22 +46172,22 @@ "slot_of_change": 635 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 64328087701543, - "congestion_multiplier": 4681275958, - "prover_cost": 14742384487014, - "sequencer_cost": 2732015285650 + "congestion_cost": 90812502419357, + "congestion_multiplier": 4851298969, + "prover_cost": 19167331183247, + "sequencer_cost": 4412376122885 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 803164222, - "congestion_multiplier": 4681275958, - "prover_cost": 184065098, - "sequencer_cost": 34110402 + "congestion_cost": 936049233, + "congestion_multiplier": 4851298969, + "prover_cost": 197567132, + "sequencer_cost": 45480536 } }, "parent_fee_header": { - "eth_per_fee_asset": 12485436, - "excess_mana": 1327625276, - "mana_used": 91665931 + "eth_per_fee_asset": 10307493, + "excess_mana": 1013897997, + "mana_used": 73439500 } }, { @@ -46195,21 +46195,21 @@ "blobs_needed": 1, "block_number": 634, "l1_block_number": 20975050, - "mana_spent": 103426976, - "size_in_fields": 3675, + "mana_spent": 89150896, + "size_in_fields": 2970, "slot_number": 634, "timestamp": 1729044647 }, "fee_header": { - "eth_per_fee_asset": 12412733, - "excess_mana": 1324588560, - "mana_used": 103426976 + "eth_per_fee_asset": 10277620, + "excess_mana": 1008939773, + "mana_used": 89150896 }, "oracle_input": { - "fee_asset_price_modifier": 27 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12379309, + "eth_per_fee_asset_at_execution": 10296154, "l1_fee_oracle_output": { "base_fee": 11370133915, "blob_fee": 1 @@ -46226,22 +46226,22 @@ "slot_of_change": 635 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65392506479966, - "congestion_multiplier": 4710380152, - "prover_cost": 14868769977388, - "sequencer_cost": 2755436672597 + "congestion_cost": 90307120794814, + "congestion_multiplier": 4825652932, + "prover_cost": 19188439877648, + "sequencer_cost": 4417235406542 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 809514044, - "congestion_multiplier": 4710380152, - "prover_cost": 184065098, - "sequencer_cost": 34110402 + "congestion_cost": 929816023, + "congestion_multiplier": 4825652932, + "prover_cost": 197567132, + "sequencer_cost": 45480536 } }, "parent_fee_header": { - "eth_per_fee_asset": 12379309, - "excess_mana": 1319291207, - "mana_used": 105297353 + "eth_per_fee_asset": 10296154, + "excess_mana": 1012337497, + "mana_used": 71602276 } }, { @@ -46249,21 +46249,21 @@ "blobs_needed": 1, "block_number": 635, "l1_block_number": 20975053, - "mana_spent": 101355924, - "size_in_fields": 3600, + "mana_spent": 69669852, + "size_in_fields": 2610, "slot_number": 635, "timestamp": 1729044683 }, "fee_header": { - "eth_per_fee_asset": 12338256, - "excess_mana": 1328015536, - "mana_used": 101355924 + "eth_per_fee_asset": 10299203, + "excess_mana": 1023090669, + "mana_used": 69669852 }, "oracle_input": { - "fee_asset_price_modifier": -60 + "fee_asset_price_modifier": 21 }, "outputs": { - "eth_per_fee_asset_at_execution": 12412733, + "eth_per_fee_asset_at_execution": 10277620, "l1_fee_oracle_output": { "base_fee": 11441574067, "blob_fee": 1 @@ -46280,22 +46280,22 @@ "slot_of_change": 635 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65620151984257, - "congestion_multiplier": 4729304627, - "prover_cost": 14830531116718, - "sequencer_cost": 2765283278067 + "congestion_cost": 93167567783203, + "congestion_multiplier": 4933365666, + "prover_cost": 19233469713806, + "sequencer_cost": 4453005365056 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 814525426, - "congestion_multiplier": 4729304627, - "prover_cost": 184087423, - "sequencer_cost": 34324723 + "congestion_cost": 957540858, + "congestion_multiplier": 4933365666, + "prover_cost": 197674293, + "sequencer_cost": 45766297 } }, "parent_fee_header": { - "eth_per_fee_asset": 12412733, - "excess_mana": 1324588560, - "mana_used": 103426976 + "eth_per_fee_asset": 10277620, + "excess_mana": 1008939773, + "mana_used": 89150896 } }, { @@ -46303,21 +46303,21 @@ "blobs_needed": 1, "block_number": 636, "l1_block_number": 20975056, - "mana_spent": 99632617, - "size_in_fields": 3360, + "mana_spent": 70520337, + "size_in_fields": 2775, "slot_number": 636, "timestamp": 1729044719 }, "fee_header": { - "eth_per_fee_asset": 12297539, - "excess_mana": 1329371460, - "mana_used": 99632617 + "eth_per_fee_asset": 10239467, + "excess_mana": 1017760521, + "mana_used": 70520337 }, "oracle_input": { - "fee_asset_price_modifier": -33 + "fee_asset_price_modifier": -58 }, "outputs": { - "eth_per_fee_asset_at_execution": 12338256, + "eth_per_fee_asset_at_execution": 10299203, "l1_fee_oracle_output": { "base_fee": 11441574067, "blob_fee": 1 @@ -46334,22 +46334,22 @@ "slot_of_change": 635 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66149171406397, - "congestion_multiplier": 4736813297, - "prover_cost": 14920052153238, - "sequencer_cost": 2781975264576 + "congestion_cost": 92006737123252, + "congestion_multiplier": 4892514653, + "prover_cost": 19193164072988, + "sequencer_cost": 4443673651253 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 816165411, - "congestion_multiplier": 4736813297, - "prover_cost": 184087423, - "sequencer_cost": 34324723 + "congestion_cost": 947596063, + "congestion_multiplier": 4892514653, + "prover_cost": 197674293, + "sequencer_cost": 45766297 } }, "parent_fee_header": { - "eth_per_fee_asset": 12338256, - "excess_mana": 1328015536, - "mana_used": 101355924 + "eth_per_fee_asset": 10299203, + "excess_mana": 1023090669, + "mana_used": 69669852 } }, { @@ -46357,21 +46357,21 @@ "blobs_needed": 1, "block_number": 637, "l1_block_number": 20975059, - "mana_spent": 99476628, - "size_in_fields": 3465, + "mana_spent": 81022291, + "size_in_fields": 2925, "slot_number": 637, "timestamp": 1729044755 }, "fee_header": { - "eth_per_fee_asset": 12354107, - "excess_mana": 1329004077, - "mana_used": 99476628 + "eth_per_fee_asset": 10226155, + "excess_mana": 1013280858, + "mana_used": 81022291 }, "oracle_input": { - "fee_asset_price_modifier": 46 + "fee_asset_price_modifier": -13 }, "outputs": { - "eth_per_fee_asset_at_execution": 12297539, + "eth_per_fee_asset_at_execution": 10239467, "l1_fee_oracle_output": { "base_fee": 11441574067, "blob_fee": 1 @@ -46388,22 +46388,22 @@ "slot_of_change": 635 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66332036515599, - "congestion_multiplier": 4734777672, - "prover_cost": 14969452261953, - "sequencer_cost": 2791186350375 + "congestion_cost": 91733464935236, + "congestion_multiplier": 4858443606, + "prover_cost": 19305135023142, + "sequencer_cost": 4469597587453 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815720806, - "congestion_multiplier": 4734777672, - "prover_cost": 184087423, - "sequencer_cost": 34324723 + "congestion_cost": 939301787, + "congestion_multiplier": 4858443606, + "prover_cost": 197674293, + "sequencer_cost": 45766297 } }, "parent_fee_header": { - "eth_per_fee_asset": 12297539, - "excess_mana": 1329371460, - "mana_used": 99632617 + "eth_per_fee_asset": 10239467, + "excess_mana": 1017760521, + "mana_used": 70520337 } }, { @@ -46411,21 +46411,21 @@ "blobs_needed": 1, "block_number": 638, "l1_block_number": 20975062, - "mana_spent": 113045570, - "size_in_fields": 3780, + "mana_spent": 70669432, + "size_in_fields": 2610, "slot_number": 638, "timestamp": 1729044791 }, "fee_header": { - "eth_per_fee_asset": 12409700, - "excess_mana": 1328480705, - "mana_used": 113045570 + "eth_per_fee_asset": 10161730, + "excess_mana": 1019303149, + "mana_used": 70669432 }, "oracle_input": { - "fee_asset_price_modifier": 45 + "fee_asset_price_modifier": -63 }, "outputs": { - "eth_per_fee_asset_at_execution": 12354107, + "eth_per_fee_asset_at_execution": 10226155, "l1_fee_oracle_output": { "base_fee": 11441574067, "blob_fee": 1 @@ -46442,22 +46442,22 @@ "slot_of_change": 640 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65977067626175, - "congestion_multiplier": 4731879240, - "prover_cost": 14900908904222, - "sequencer_cost": 2778405837023 + "congestion_cost": 92944586112767, + "congestion_multiplier": 4904302666, + "prover_cost": 19330265676592, + "sequencer_cost": 4475415931013 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815087753, - "congestion_multiplier": 4731879240, - "prover_cost": 184087423, - "sequencer_cost": 34324723 + "congestion_cost": 950465744, + "congestion_multiplier": 4904302666, + "prover_cost": 197674293, + "sequencer_cost": 45766297 } }, "parent_fee_header": { - "eth_per_fee_asset": 12354107, - "excess_mana": 1329004077, - "mana_used": 99476628 + "eth_per_fee_asset": 10226155, + "excess_mana": 1013280858, + "mana_used": 81022291 } }, { @@ -46465,21 +46465,21 @@ "blobs_needed": 1, "block_number": 639, "l1_block_number": 20975065, - "mana_spent": 90767891, - "size_in_fields": 3405, + "mana_spent": 86030381, + "size_in_fields": 2985, "slot_number": 639, "timestamp": 1729044827 }, "fee_header": { - "eth_per_fee_asset": 12511459, - "excess_mana": 1341526275, - "mana_used": 90767891 + "eth_per_fee_asset": 10122099, + "excess_mana": 1014972581, + "mana_used": 86030381 }, "oracle_input": { - "fee_asset_price_modifier": 82 + "fee_asset_price_modifier": -39 }, "outputs": { - "eth_per_fee_asset_at_execution": 12409700, + "eth_per_fee_asset_at_execution": 10161730, "l1_fee_oracle_output": { "base_fee": 11441574067, "blob_fee": 1 @@ -46496,22 +46496,22 @@ "slot_of_change": 640 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66962407713322, - "congestion_multiplier": 4804657418, - "prover_cost": 14834155781365, - "sequencer_cost": 2765959128747 + "congestion_cost": 92742797830685, + "congestion_multiplier": 4871282399, + "prover_cost": 19452818860569, + "sequencer_cost": 4503789905853 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 830983391, - "congestion_multiplier": 4804657418, - "prover_cost": 184087423, - "sequencer_cost": 34324723 + "congestion_cost": 942427271, + "congestion_multiplier": 4871282399, + "prover_cost": 197674293, + "sequencer_cost": 45766297 } }, "parent_fee_header": { - "eth_per_fee_asset": 12409700, - "excess_mana": 1328480705, - "mana_used": 113045570 + "eth_per_fee_asset": 10161730, + "excess_mana": 1019303149, + "mana_used": 70669432 } }, { @@ -46519,21 +46519,21 @@ "blobs_needed": 1, "block_number": 640, "l1_block_number": 20975068, - "mana_spent": 97102014, - "size_in_fields": 3405, + "mana_spent": 82531530, + "size_in_fields": 2970, "slot_number": 640, "timestamp": 1729044863 }, "fee_header": { - "eth_per_fee_asset": 12412618, - "excess_mana": 1332294166, - "mana_used": 97102014 + "eth_per_fee_asset": 10187892, + "excess_mana": 1026002962, + "mana_used": 82531530 }, "oracle_input": { - "fee_asset_price_modifier": -79 + "fee_asset_price_modifier": 65 }, "outputs": { - "eth_per_fee_asset_at_execution": 12511459, + "eth_per_fee_asset_at_execution": 10122099, "l1_fee_oracle_output": { "base_fee": 15967259051, "blob_fee": 1 @@ -46550,22 +46550,22 @@ "slot_of_change": 640 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70013603129739, - "congestion_multiplier": 4753038869, - "prover_cost": 14826544210392, - "sequencer_cost": 3828632456055 + "congestion_cost": 104867099106619, + "congestion_multiplier": 4955829811, + "prover_cost": 20199646338176, + "sequencer_cost": 6309860929043 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 875972325, - "congestion_multiplier": 4753038869, - "prover_cost": 185501700, - "sequencer_cost": 47901778 + "congestion_cost": 1061475159, + "congestion_multiplier": 4955829811, + "prover_cost": 204462820, + "sequencer_cost": 63869037 } }, "parent_fee_header": { - "eth_per_fee_asset": 12511459, - "excess_mana": 1341526275, - "mana_used": 90767891 + "eth_per_fee_asset": 10122099, + "excess_mana": 1014972581, + "mana_used": 86030381 } }, { @@ -46573,21 +46573,21 @@ "blobs_needed": 1, "block_number": 641, "l1_block_number": 20975071, - "mana_spent": 106868982, - "size_in_fields": 3480, + "mana_spent": 79438323, + "size_in_fields": 2745, "slot_number": 641, "timestamp": 1729044899 }, "fee_header": { - "eth_per_fee_asset": 12418824, - "excess_mana": 1329396180, - "mana_used": 106868982 + "eth_per_fee_asset": 10186873, + "excess_mana": 1033534492, + "mana_used": 79438323 }, "oracle_input": { - "fee_asset_price_modifier": 5 + "fee_asset_price_modifier": -1 }, "outputs": { - "eth_per_fee_asset_at_execution": 12412618, + "eth_per_fee_asset_at_execution": 10187892, "l1_fee_oracle_output": { "base_fee": 15967259051, "blob_fee": 1 @@ -46604,22 +46604,22 @@ "slot_of_change": 640 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70268592491931, - "congestion_multiplier": 4736950299, - "prover_cost": 14944607173121, - "sequencer_cost": 3859119647443 + "congestion_cost": 105732516206493, + "congestion_multiplier": 5014400185, + "prover_cost": 20069197828168, + "sequencer_cost": 6269112098951 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 872217196, - "congestion_multiplier": 4736950299, - "prover_cost": 185501700, - "sequencer_cost": 47901778 + "congestion_cost": 1077191456, + "congestion_multiplier": 5014400185, + "prover_cost": 204462820, + "sequencer_cost": 63869037 } }, "parent_fee_header": { - "eth_per_fee_asset": 12412618, - "excess_mana": 1332294166, - "mana_used": 97102014 + "eth_per_fee_asset": 10187892, + "excess_mana": 1026002962, + "mana_used": 82531530 } }, { @@ -46627,21 +46627,21 @@ "blobs_needed": 1, "block_number": 642, "l1_block_number": 20975074, - "mana_spent": 97947721, - "size_in_fields": 3495, + "mana_spent": 50121915, + "size_in_fields": 2070, "slot_number": 642, "timestamp": 1729044935 }, "fee_header": { - "eth_per_fee_asset": 12384051, - "excess_mana": 1336265162, - "mana_used": 97947721 + "eth_per_fee_asset": 10274480, + "excess_mana": 1037972815, + "mana_used": 50121915 }, "oracle_input": { - "fee_asset_price_modifier": -28 + "fee_asset_price_modifier": 86 }, "outputs": { - "eth_per_fee_asset_at_execution": 12418824, + "eth_per_fee_asset_at_execution": 10186873, "l1_fee_oracle_output": { "base_fee": 15967259051, "blob_fee": 1 @@ -46658,22 +46658,22 @@ "slot_of_change": 640 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70951850915997, - "congestion_multiplier": 4775173177, - "prover_cost": 14937138975478, - "sequencer_cost": 3857191147890 + "congestion_cost": 106660787270049, + "congestion_multiplier": 5049239278, + "prover_cost": 20071205364002, + "sequencer_cost": 6269739202600 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 881138549, - "congestion_multiplier": 4775173177, - "prover_cost": 185501700, - "sequencer_cost": 47901778 + "congestion_cost": 1086539894, + "congestion_multiplier": 5049239278, + "prover_cost": 204462820, + "sequencer_cost": 63869037 } }, "parent_fee_header": { - "eth_per_fee_asset": 12418824, - "excess_mana": 1329396180, - "mana_used": 106868982 + "eth_per_fee_asset": 10186873, + "excess_mana": 1033534492, + "mana_used": 79438323 } }, { @@ -46681,21 +46681,21 @@ "blobs_needed": 1, "block_number": 643, "l1_block_number": 20975077, - "mana_spent": 74593239, - "size_in_fields": 2940, + "mana_spent": 103313933, + "size_in_fields": 3345, "slot_number": 643, "timestamp": 1729044971 }, "fee_header": { - "eth_per_fee_asset": 12402627, - "excess_mana": 1334212883, - "mana_used": 74593239 + "eth_per_fee_asset": 10268315, + "excess_mana": 1013094730, + "mana_used": 103313933 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": -6 }, "outputs": { - "eth_per_fee_asset_at_execution": 12384051, + "eth_per_fee_asset_at_execution": 10274480, "l1_fee_oracle_output": { "base_fee": 15967259051, "blob_fee": 1 @@ -46712,22 +46712,22 @@ "slot_of_change": 645 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 70935234278348, - "congestion_multiplier": 4763720946, - "prover_cost": 14979080754755, - "sequencer_cost": 3868021699847 + "congestion_cost": 100731604616487, + "congestion_multiplier": 4857033114, + "prover_cost": 19900065015456, + "sequencer_cost": 6216279266688 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 878465559, - "congestion_multiplier": 4763720946, - "prover_cost": 185501700, - "sequencer_cost": 47901778 + "congestion_cost": 1034964857, + "congestion_multiplier": 4857033114, + "prover_cost": 204462820, + "sequencer_cost": 63869037 } }, "parent_fee_header": { - "eth_per_fee_asset": 12384051, - "excess_mana": 1336265162, - "mana_used": 97947721 + "eth_per_fee_asset": 10274480, + "excess_mana": 1037972815, + "mana_used": 50121915 } }, { @@ -46735,21 +46735,21 @@ "blobs_needed": 1, "block_number": 644, "l1_block_number": 20975080, - "mana_spent": 122746813, - "size_in_fields": 3945, + "mana_spent": 58072772, + "size_in_fields": 2160, "slot_number": 644, "timestamp": 1729045007 }, "fee_header": { - "eth_per_fee_asset": 12392704, - "excess_mana": 1308806122, - "mana_used": 122746813 + "eth_per_fee_asset": 10268315, + "excess_mana": 1041408663, + "mana_used": 58072772 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": 0 }, "outputs": { - "eth_per_fee_asset_at_execution": 12402627, + "eth_per_fee_asset_at_execution": 10268315, "l1_fee_oracle_output": { "base_fee": 15967259051, "blob_fee": 1 @@ -46766,22 +46766,22 @@ "slot_of_change": 645 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68203344984898, - "congestion_multiplier": 4624198987, - "prover_cost": 14956645878329, - "sequencer_cost": 3862228381133 + "congestion_cost": 106523942730624, + "congestion_multiplier": 5076375470, + "prover_cost": 19912012827811, + "sequencer_cost": 6220011462446 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 845900648, - "congestion_multiplier": 4624198987, - "prover_cost": 185501700, - "sequencer_cost": 47901778 + "congestion_cost": 1093821399, + "congestion_multiplier": 5076375470, + "prover_cost": 204462820, + "sequencer_cost": 63869037 } }, "parent_fee_header": { - "eth_per_fee_asset": 12402627, - "excess_mana": 1334212883, - "mana_used": 74593239 + "eth_per_fee_asset": 10268315, + "excess_mana": 1013094730, + "mana_used": 103313933 } }, { @@ -46789,21 +46789,21 @@ "blobs_needed": 1, "block_number": 645, "l1_block_number": 20975083, - "mana_spent": 91441359, - "size_in_fields": 3195, + "mana_spent": 84463089, + "size_in_fields": 3000, "slot_number": 645, "timestamp": 1729045043 }, "fee_header": { - "eth_per_fee_asset": 12372875, - "excess_mana": 1331552935, - "mana_used": 91441359 + "eth_per_fee_asset": 10297066, + "excess_mana": 1024481435, + "mana_used": 84463089 }, "oracle_input": { - "fee_asset_price_modifier": -16 + "fee_asset_price_modifier": 28 }, "outputs": { - "eth_per_fee_asset_at_execution": 12392704, + "eth_per_fee_asset_at_execution": 10268315, "l1_fee_oracle_output": { "base_fee": 19703233680, "blob_fee": 1 @@ -46820,22 +46820,22 @@ "slot_of_change": 645 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74350607744686, - "congestion_multiplier": 4748918629, - "prover_cost": 15062829871512, - "sequencer_cost": 4769717892076 + "congestion_cost": 110959287185873, + "congestion_multiplier": 4944080691, + "prover_cost": 20457765660676, + "sequencer_cost": 7675352285161 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 921405074, - "congestion_multiplier": 4748918629, - "prover_cost": 186669192, - "sequencer_cost": 59109702 + "congestion_cost": 1139364913, + "congestion_multiplier": 4944080691, + "prover_cost": 210066782, + "sequencer_cost": 78812935 } }, "parent_fee_header": { - "eth_per_fee_asset": 12392704, - "excess_mana": 1308806122, - "mana_used": 122746813 + "eth_per_fee_asset": 10268315, + "excess_mana": 1041408663, + "mana_used": 58072772 } }, { @@ -46843,21 +46843,21 @@ "blobs_needed": 1, "block_number": 646, "l1_block_number": 20975086, - "mana_spent": 84033310, - "size_in_fields": 2835, + "mana_spent": 79699042, + "size_in_fields": 2745, "slot_number": 646, "timestamp": 1729045079 }, "fee_header": { - "eth_per_fee_asset": 12438451, - "excess_mana": 1322994294, - "mana_used": 84033310 + "eth_per_fee_asset": 10330016, + "excess_mana": 1033944524, + "mana_used": 79699042 }, "oracle_input": { - "fee_asset_price_modifier": 53 + "fee_asset_price_modifier": 32 }, "outputs": { - "eth_per_fee_asset_at_execution": 12372875, + "eth_per_fee_asset_at_execution": 10297066, "l1_fee_oracle_output": { "base_fee": 19703233680, "blob_fee": 1 @@ -46874,22 +46874,22 @@ "slot_of_change": 645 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73529852358486, - "congestion_multiplier": 4701602110, - "prover_cost": 15086969843307, - "sequencer_cost": 4777361930837 + "congestion_cost": 112712267261374, + "congestion_multiplier": 5017608671, + "prover_cost": 20400644416575, + "sequencer_cost": 7653921515119 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 909775672, - "congestion_multiplier": 4701602110, - "prover_cost": 186669192, - "sequencer_cost": 59109702 + "congestion_cost": 1160605655, + "congestion_multiplier": 5017608671, + "prover_cost": 210066782, + "sequencer_cost": 78812935 } }, "parent_fee_header": { - "eth_per_fee_asset": 12372875, - "excess_mana": 1331552935, - "mana_used": 91441359 + "eth_per_fee_asset": 10297066, + "excess_mana": 1024481435, + "mana_used": 84463089 } }, { @@ -46897,21 +46897,21 @@ "blobs_needed": 1, "block_number": 647, "l1_block_number": 20975089, - "mana_spent": 103241919, - "size_in_fields": 3765, + "mana_spent": 62548066, + "size_in_fields": 2280, "slot_number": 647, "timestamp": 1729045115 }, "fee_header": { - "eth_per_fee_asset": 12314066, - "excess_mana": 1307027604, - "mana_used": 103241919 + "eth_per_fee_asset": 10381666, + "excess_mana": 1038643566, + "mana_used": 62548066 }, "oracle_input": { - "fee_asset_price_modifier": -100 + "fee_asset_price_modifier": 50 }, "outputs": { - "eth_per_fee_asset_at_execution": 12438451, + "eth_per_fee_asset_at_execution": 10330016, "l1_fee_oracle_output": { "base_fee": 19703233680, "blob_fee": 1 @@ -46928,22 +46928,22 @@ "slot_of_change": 645 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71422808917284, - "congestion_multiplier": 4614586652, - "prover_cost": 15007430748411, - "sequencer_cost": 4752175491949 + "congestion_cost": 113385125056922, + "congestion_multiplier": 5054525423, + "prover_cost": 20335571793887, + "sequencer_cost": 7629507543842 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 888389109, - "congestion_multiplier": 4614586652, - "prover_cost": 186669192, - "sequencer_cost": 59109702 + "congestion_cost": 1171270156, + "congestion_multiplier": 5054525423, + "prover_cost": 210066782, + "sequencer_cost": 78812935 } }, "parent_fee_header": { - "eth_per_fee_asset": 12438451, - "excess_mana": 1322994294, - "mana_used": 84033310 + "eth_per_fee_asset": 10330016, + "excess_mana": 1033944524, + "mana_used": 79699042 } }, { @@ -46951,21 +46951,21 @@ "blobs_needed": 1, "block_number": 648, "l1_block_number": 20975092, - "mana_spent": 101951480, - "size_in_fields": 3495, + "mana_spent": 70436537, + "size_in_fields": 2625, "slot_number": 648, "timestamp": 1729045151 }, "fee_header": { - "eth_per_fee_asset": 12351008, - "excess_mana": 1310269523, - "mana_used": 101951480 + "eth_per_fee_asset": 10343253, + "excess_mana": 1026191632, + "mana_used": 70436537 }, "oracle_input": { - "fee_asset_price_modifier": 30 + "fee_asset_price_modifier": -37 }, "outputs": { - "eth_per_fee_asset_at_execution": 12314066, + "eth_per_fee_asset_at_execution": 10381666, "l1_fee_oracle_output": { "base_fee": 19703233680, "blob_fee": 1 @@ -46982,22 +46982,22 @@ "slot_of_change": 650 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72494270292201, - "congestion_multiplier": 4632123226, - "prover_cost": 15159021561197, - "sequencer_cost": 4800177455603 + "congestion_cost": 110115315306812, + "congestion_multiplier": 4957288651, + "prover_cost": 20234399950837, + "sequencer_cost": 7591549853367 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 892699229, - "congestion_multiplier": 4632123226, - "prover_cost": 186669192, - "sequencer_cost": 59109702 + "congestion_cost": 1143180425, + "congestion_multiplier": 4957288651, + "prover_cost": 210066782, + "sequencer_cost": 78812935 } }, "parent_fee_header": { - "eth_per_fee_asset": 12314066, - "excess_mana": 1307027604, - "mana_used": 103241919 + "eth_per_fee_asset": 10381666, + "excess_mana": 1038643566, + "mana_used": 62548066 } }, { @@ -47005,21 +47005,21 @@ "blobs_needed": 1, "block_number": 649, "l1_block_number": 20975095, - "mana_spent": 7703597, - "size_in_fields": 300, + "mana_spent": 83721428, + "size_in_fields": 3015, "slot_number": 649, "timestamp": 1729045187 }, "fee_header": { - "eth_per_fee_asset": 12285547, - "excess_mana": 1312221003, - "mana_used": 7703597 + "eth_per_fee_asset": 10375317, + "excess_mana": 1021628169, + "mana_used": 83721428 }, "oracle_input": { - "fee_asset_price_modifier": -53 + "fee_asset_price_modifier": 31 }, "outputs": { - "eth_per_fee_asset_at_execution": 12351008, + "eth_per_fee_asset_at_execution": 10343253, "l1_fee_oracle_output": { "base_fee": 19703233680, "blob_fee": 1 @@ -47036,44 +47036,44 @@ "slot_of_change": 650 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72488140886963, - "congestion_multiplier": 4642711519, - "prover_cost": 15113680761927, - "sequencer_cost": 4785820072338 + "congestion_cost": 109542112911673, + "congestion_multiplier": 4922123023, + "prover_cost": 20309546909469, + "sequencer_cost": 7619743517828 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 895301608, - "congestion_multiplier": 4642711519, - "prover_cost": 186669192, - "sequencer_cost": 59109702 + "congestion_cost": 1133021788, + "congestion_multiplier": 4922123023, + "prover_cost": 210066782, + "sequencer_cost": 78812935 } }, "parent_fee_header": { - "eth_per_fee_asset": 12351008, - "excess_mana": 1310269523, - "mana_used": 101951480 + "eth_per_fee_asset": 10343253, + "excess_mana": 1026191632, + "mana_used": 70436537 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 650, "l1_block_number": 20975098, - "mana_spent": 171522336, - "size_in_fields": 6300, + "mana_spent": 69055134, + "size_in_fields": 2535, "slot_number": 650, "timestamp": 1729045223 }, "fee_header": { - "eth_per_fee_asset": 12238861, - "excess_mana": 1219924600, - "mana_used": 171522336 + "eth_per_fee_asset": 10356641, + "excess_mana": 1030349597, + "mana_used": 69055134 }, "oracle_input": { - "fee_asset_price_modifier": -38 + "fee_asset_price_modifier": -18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12285547, + "eth_per_fee_asset_at_execution": 10375317, "l1_fee_oracle_output": { "base_fee": 17815416281, "blob_fee": 1 @@ -47090,22 +47090,22 @@ "slot_of_change": 650 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 61754879127483, - "congestion_multiplier": 4167481027, - "prover_cost": 15146191618493, - "sequencer_cost": 4350335316776 + "congestion_cost": 107088401058012, + "congestion_multiplier": 4989548246, + "prover_cost": 19973852943482, + "sequencer_cost": 6868384455145 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 758692470, - "congestion_multiplier": 4167481027, - "prover_cost": 186079249, - "sequencer_cost": 53446249 + "congestion_cost": 1111076108, + "congestion_multiplier": 4989548246, + "prover_cost": 207235056, + "sequencer_cost": 71261666 } }, "parent_fee_header": { - "eth_per_fee_asset": 12285547, - "excess_mana": 1312221003, - "mana_used": 7703597 + "eth_per_fee_asset": 10375317, + "excess_mana": 1021628169, + "mana_used": 83721428 } }, { @@ -47113,21 +47113,21 @@ "blobs_needed": 1, "block_number": 651, "l1_block_number": 20975101, - "mana_spent": 116204735, - "size_in_fields": 4050, + "mana_spent": 66947529, + "size_in_fields": 2640, "slot_number": 651, "timestamp": 1729045259 }, "fee_header": { - "eth_per_fee_asset": 12134830, - "excess_mana": 1291446936, - "mana_used": 116204735 + "eth_per_fee_asset": 10375282, + "excess_mana": 1024404731, + "mana_used": 66947529 }, "oracle_input": { - "fee_asset_price_modifier": -85 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12238861, + "eth_per_fee_asset_at_execution": 10356641, "l1_fee_oracle_output": { "base_fee": 17815416281, "blob_fee": 1 @@ -47144,22 +47144,22 @@ "slot_of_change": 650 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69109296281738, - "congestion_multiplier": 4531227691, - "prover_cost": 15203967836550, - "sequencer_cost": 4366929978207 + "congestion_cost": 106042953019227, + "congestion_multiplier": 4943489127, + "prover_cost": 20009871540397, + "sequencer_cost": 6880770126145 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 845819071, - "congestion_multiplier": 4531227691, - "prover_cost": 186079249, - "sequencer_cost": 53446249 + "congestion_cost": 1098248795, + "congestion_multiplier": 4943489127, + "prover_cost": 207235056, + "sequencer_cost": 71261666 } }, "parent_fee_header": { - "eth_per_fee_asset": 12238861, - "excess_mana": 1219924600, - "mana_used": 171522336 + "eth_per_fee_asset": 10356641, + "excess_mana": 1030349597, + "mana_used": 69055134 } }, { @@ -47167,21 +47167,21 @@ "blobs_needed": 1, "block_number": 652, "l1_block_number": 20975104, - "mana_spent": 108491449, - "size_in_fields": 3630, + "mana_spent": 79323152, + "size_in_fields": 2715, "slot_number": 652, "timestamp": 1729045295 }, "fee_header": { - "eth_per_fee_asset": 12076582, - "excess_mana": 1307651671, - "mana_used": 108491449 + "eth_per_fee_asset": 10393957, + "excess_mana": 1016352260, + "mana_used": 79323152 }, "oracle_input": { - "fee_asset_price_modifier": -48 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12134830, + "eth_per_fee_asset_at_execution": 10375282, "l1_fee_oracle_output": { "base_fee": 17815416281, "blob_fee": 1 @@ -47198,22 +47198,22 @@ "slot_of_change": 650 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 71413692157204, - "congestion_multiplier": 4617957262, - "prover_cost": 15334310328205, - "sequencer_cost": 4404367345897 + "congestion_cost": 104195961998913, + "congestion_multiplier": 4881778148, + "prover_cost": 19973920323323, + "sequencer_cost": 6868407624969 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 866593014, - "congestion_multiplier": 4617957262, - "prover_cost": 186079249, - "sequencer_cost": 53446249 + "congestion_cost": 1081062489, + "congestion_multiplier": 4881778148, + "prover_cost": 207235056, + "sequencer_cost": 71261666 } }, "parent_fee_header": { - "eth_per_fee_asset": 12134830, - "excess_mana": 1291446936, - "mana_used": 116204735 + "eth_per_fee_asset": 10375282, + "excess_mana": 1024404731, + "mana_used": 66947529 } }, { @@ -47221,21 +47221,21 @@ "blobs_needed": 1, "block_number": 653, "l1_block_number": 20975107, - "mana_spent": 104912884, - "size_in_fields": 3630, + "mana_spent": 78076045, + "size_in_fields": 2880, "slot_number": 653, "timestamp": 1729045331 }, "fee_header": { - "eth_per_fee_asset": 12052428, - "excess_mana": 1316143120, - "mana_used": 104912884 + "eth_per_fee_asset": 10416823, + "excess_mana": 1020675412, + "mana_used": 78076045 }, "oracle_input": { - "fee_asset_price_modifier": -20 + "fee_asset_price_modifier": 22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12076582, + "eth_per_fee_asset_at_execution": 10393957, "l1_fee_oracle_output": { "base_fee": 17815416281, "blob_fee": 1 @@ -47252,22 +47252,22 @@ "slot_of_change": 655 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72672637589014, - "congestion_multiplier": 4664065308, - "prover_cost": 15408271065439, - "sequencer_cost": 4425610574251 + "congestion_cost": 104893882474211, + "congestion_multiplier": 4914812701, + "prover_cost": 19938032839659, + "sequencer_cost": 6856067039724 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 877637067, - "congestion_multiplier": 4664065308, - "prover_cost": 186079249, - "sequencer_cost": 53446249 + "congestion_cost": 1090262504, + "congestion_multiplier": 4914812701, + "prover_cost": 207235056, + "sequencer_cost": 71261666 } }, "parent_fee_header": { - "eth_per_fee_asset": 12076582, - "excess_mana": 1307651671, - "mana_used": 108491449 + "eth_per_fee_asset": 10393957, + "excess_mana": 1016352260, + "mana_used": 79323152 } }, { @@ -47275,21 +47275,21 @@ "blobs_needed": 1, "block_number": 654, "l1_block_number": 20975110, - "mana_spent": 99303799, - "size_in_fields": 3705, + "mana_spent": 78535933, + "size_in_fields": 2565, "slot_number": 654, "timestamp": 1729045367 }, "fee_header": { - "eth_per_fee_asset": 12042786, - "excess_mana": 1321056004, - "mana_used": 99303799 + "eth_per_fee_asset": 10481407, + "excess_mana": 1023751457, + "mana_used": 78535933 }, "oracle_input": { - "fee_asset_price_modifier": -8 + "fee_asset_price_modifier": 62 }, "outputs": { - "eth_per_fee_asset_at_execution": 12052428, + "eth_per_fee_asset_at_execution": 10416823, "l1_fee_oracle_output": { "base_fee": 17815416281, "blob_fee": 1 @@ -47306,22 +47306,22 @@ "slot_of_change": 655 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73352613431916, - "congestion_multiplier": 4690951901, - "prover_cost": 15439150435083, - "sequencer_cost": 4434479840909 + "congestion_cost": 105295679690440, + "congestion_multiplier": 4938453746, + "prover_cost": 19894266802844, + "sequencer_cost": 6841017266013 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 884077092, - "congestion_multiplier": 4690951901, - "prover_cost": 186079249, - "sequencer_cost": 53446249 + "congestion_cost": 1096846458, + "congestion_multiplier": 4938453746, + "prover_cost": 207235056, + "sequencer_cost": 71261666 } }, "parent_fee_header": { - "eth_per_fee_asset": 12052428, - "excess_mana": 1316143120, - "mana_used": 104912884 + "eth_per_fee_asset": 10416823, + "excess_mana": 1020675412, + "mana_used": 78076045 } }, { @@ -47329,21 +47329,21 @@ "blobs_needed": 1, "block_number": 655, "l1_block_number": 20975113, - "mana_spent": 94419464, - "size_in_fields": 3270, + "mana_spent": 80333369, + "size_in_fields": 2835, "slot_number": 655, "timestamp": 1729045403 }, "fee_header": { - "eth_per_fee_asset": 11952465, - "excess_mana": 1320359803, - "mana_used": 94419464 + "eth_per_fee_asset": 10456251, + "excess_mana": 1027287390, + "mana_used": 80333369 }, "oracle_input": { - "fee_asset_price_modifier": -75 + "fee_asset_price_modifier": -24 }, "outputs": { - "eth_per_fee_asset_at_execution": 12042786, + "eth_per_fee_asset_at_execution": 10481407, "l1_fee_oracle_output": { "base_fee": 16645519796, "blob_fee": 1 @@ -47360,22 +47360,22 @@ "slot_of_change": 655 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72148882326731, - "congestion_multiplier": 4687132418, - "prover_cost": 15421153875856, - "sequencer_cost": 4146595314407 + "congestion_cost": 102938128153978, + "congestion_multiplier": 4965769800, + "prover_cost": 19604258378670, + "sequencer_cost": 6352399062455 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 868873550, - "congestion_multiplier": 4687132418, - "prover_cost": 185713656, - "sequencer_cost": 49936560 + "congestion_cost": 1078936417, + "congestion_multiplier": 4965769800, + "prover_cost": 205480211, + "sequencer_cost": 66582080 } }, "parent_fee_header": { - "eth_per_fee_asset": 12042786, - "excess_mana": 1321056004, - "mana_used": 99303799 + "eth_per_fee_asset": 10481407, + "excess_mana": 1023751457, + "mana_used": 78535933 } }, { @@ -47383,21 +47383,21 @@ "blobs_needed": 1, "block_number": 656, "l1_block_number": 20975116, - "mana_spent": 104488770, - "size_in_fields": 3855, + "mana_spent": 73838331, + "size_in_fields": 2280, "slot_number": 656, "timestamp": 1729045439 }, "fee_header": { - "eth_per_fee_asset": 11946488, - "excess_mana": 1314779267, - "mana_used": 104488770 + "eth_per_fee_asset": 10416517, + "excess_mana": 1032620759, + "mana_used": 73838331 }, "oracle_input": { - "fee_asset_price_modifier": -5 + "fee_asset_price_modifier": -38 }, "outputs": { - "eth_per_fee_asset_at_execution": 11952465, + "eth_per_fee_asset_at_execution": 10456251, "l1_fee_oracle_output": { "base_fee": 16645519796, "blob_fee": 1 @@ -47414,22 +47414,22 @@ "slot_of_change": 655 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72092690168932, - "congestion_multiplier": 4656628757, - "prover_cost": 15537686661288, - "sequencer_cost": 4177929824518 + "congestion_cost": 104265256448033, + "congestion_multiplier": 5007257633, + "prover_cost": 19651422962208, + "sequencer_cost": 6367681877568 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 861685356, - "congestion_multiplier": 4656628757, - "prover_cost": 185713656, - "sequencer_cost": 49936560 + "congestion_cost": 1090223692, + "congestion_multiplier": 5007257633, + "prover_cost": 205480211, + "sequencer_cost": 66582080 } }, "parent_fee_header": { - "eth_per_fee_asset": 11952465, - "excess_mana": 1320359803, - "mana_used": 94419464 + "eth_per_fee_asset": 10456251, + "excess_mana": 1027287390, + "mana_used": 80333369 } }, { @@ -47437,21 +47437,21 @@ "blobs_needed": 1, "block_number": 657, "l1_block_number": 20975119, - "mana_spent": 115600844, - "size_in_fields": 4050, + "mana_spent": 76248472, + "size_in_fields": 2580, "slot_number": 657, "timestamp": 1729045475 }, "fee_header": { - "eth_per_fee_asset": 11901091, - "excess_mana": 1319268037, - "mana_used": 115600844 + "eth_per_fee_asset": 10497765, + "excess_mana": 1031459090, + "mana_used": 76248472 }, "oracle_input": { - "fee_asset_price_modifier": -38 + "fee_asset_price_modifier": 78 }, "outputs": { - "eth_per_fee_asset_at_execution": 11946488, + "eth_per_fee_asset_at_execution": 10416517, "l1_fee_oracle_output": { "base_fee": 16645519796, "blob_fee": 1 @@ -47468,22 +47468,22 @@ "slot_of_change": 655 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 72612433796443, - "congestion_multiplier": 4681149055, - "prover_cost": 15545460389698, - "sequencer_cost": 4180020102980 + "congestion_cost": 104426190443505, + "congestion_multiplier": 4998191679, + "prover_cost": 19726383684681, + "sequencer_cost": 6391971519847 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 867463569, - "congestion_multiplier": 4681149055, - "prover_cost": 185713656, - "sequencer_cost": 49936560 + "congestion_cost": 1087757188, + "congestion_multiplier": 4998191679, + "prover_cost": 205480211, + "sequencer_cost": 66582080 } }, "parent_fee_header": { - "eth_per_fee_asset": 11946488, - "excess_mana": 1314779267, - "mana_used": 104488770 + "eth_per_fee_asset": 10416517, + "excess_mana": 1032620759, + "mana_used": 73838331 } }, { @@ -47491,21 +47491,21 @@ "blobs_needed": 1, "block_number": 658, "l1_block_number": 20975122, - "mana_spent": 93292373, - "size_in_fields": 3300, + "mana_spent": 68980576, + "size_in_fields": 2475, "slot_number": 658, "timestamp": 1729045511 }, "fee_header": { - "eth_per_fee_asset": 11945125, - "excess_mana": 1334868881, - "mana_used": 93292373 + "eth_per_fee_asset": 10519810, + "excess_mana": 1032707562, + "mana_used": 68980576 }, "oracle_input": { - "fee_asset_price_modifier": 37 + "fee_asset_price_modifier": 21 }, "outputs": { - "eth_per_fee_asset_at_execution": 11901091, + "eth_per_fee_asset_at_execution": 10497765, "l1_fee_oracle_output": { "base_fee": 16645519796, "blob_fee": 1 @@ -47522,22 +47522,22 @@ "slot_of_change": 660 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 74596822929932, - "congestion_multiplier": 4767378590, - "prover_cost": 15604758925044, - "sequencer_cost": 4195964890950 + "congestion_cost": 103870507198438, + "congestion_multiplier": 5007935725, + "prover_cost": 19573710308814, + "sequencer_cost": 6342500522731 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 887783578, - "congestion_multiplier": 4767378590, - "prover_cost": 185713656, - "sequencer_cost": 49936560 + "congestion_cost": 1090408175, + "congestion_multiplier": 5007935725, + "prover_cost": 205480211, + "sequencer_cost": 66582080 } }, "parent_fee_header": { - "eth_per_fee_asset": 11901091, - "excess_mana": 1319268037, - "mana_used": 115600844 + "eth_per_fee_asset": 10497765, + "excess_mana": 1031459090, + "mana_used": 76248472 } }, { @@ -47545,21 +47545,21 @@ "blobs_needed": 1, "block_number": 659, "l1_block_number": 20975125, - "mana_spent": 92212911, - "size_in_fields": 3165, + "mana_spent": 86469424, + "size_in_fields": 2580, "slot_number": 659, "timestamp": 1729045547 }, "fee_header": { - "eth_per_fee_asset": 12014406, - "excess_mana": 1328161254, - "mana_used": 92212911 + "eth_per_fee_asset": 10509290, + "excess_mana": 1026688138, + "mana_used": 86469424 }, "oracle_input": { - "fee_asset_price_modifier": 58 + "fee_asset_price_modifier": -10 }, "outputs": { - "eth_per_fee_asset_at_execution": 11945125, + "eth_per_fee_asset_at_execution": 10519810, "l1_fee_oracle_output": { "base_fee": 16645519796, "blob_fee": 1 @@ -47576,22 +47576,22 @@ "slot_of_change": 660 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 73586627264261, - "congestion_multiplier": 4730110995, - "prover_cost": 15547234206424, - "sequencer_cost": 4180497064703 + "congestion_cost": 102442349148892, + "congestion_multiplier": 4961129803, + "prover_cost": 19532692225430, + "sequencer_cost": 6329209367850 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 879001461, - "congestion_multiplier": 4730110995, - "prover_cost": 185713656, - "sequencer_cost": 49936560 + "congestion_cost": 1077674049, + "congestion_multiplier": 4961129803, + "prover_cost": 205480211, + "sequencer_cost": 66582080 } }, "parent_fee_header": { - "eth_per_fee_asset": 11945125, - "excess_mana": 1334868881, - "mana_used": 93292373 + "eth_per_fee_asset": 10519810, + "excess_mana": 1032707562, + "mana_used": 68980576 } }, { @@ -47599,21 +47599,21 @@ "blobs_needed": 1, "block_number": 660, "l1_block_number": 20975128, - "mana_spent": 105098720, - "size_in_fields": 3420, + "mana_spent": 65383402, + "size_in_fields": 2415, "slot_number": 660, "timestamp": 1729045583 }, "fee_header": { - "eth_per_fee_asset": 12051650, - "excess_mana": 1320374165, - "mana_used": 105098720 + "eth_per_fee_asset": 10524003, + "excess_mana": 1038157562, + "mana_used": 65383402 }, "oracle_input": { - "fee_asset_price_modifier": 31 + "fee_asset_price_modifier": 14 }, "outputs": { - "eth_per_fee_asset_at_execution": 12014406, + "eth_per_fee_asset_at_execution": 10509290, "l1_fee_oracle_output": { "base_fee": 13041964028, "blob_fee": 1 @@ -47630,22 +47630,22 @@ "slot_of_change": 660 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68657467460314, - "congestion_multiplier": 4687211179, - "prover_cost": 15363851113406, - "sequencer_cost": 3256581557174 + "congestion_cost": 97224294980917, + "congestion_multiplier": 5050694705, + "prover_cost": 19037906271499, + "sequencer_cost": 4963975397006 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 824878689, - "congestion_multiplier": 4687211179, - "prover_cost": 184587545, - "sequencer_cost": 39125893 + "congestion_cost": 1021758311, + "congestion_multiplier": 5050694705, + "prover_cost": 200074878, + "sequencer_cost": 52167857 } }, "parent_fee_header": { - "eth_per_fee_asset": 12014406, - "excess_mana": 1328161254, - "mana_used": 92212911 + "eth_per_fee_asset": 10509290, + "excess_mana": 1026688138, + "mana_used": 86469424 } }, { @@ -47653,21 +47653,21 @@ "blobs_needed": 1, "block_number": 661, "l1_block_number": 20975131, - "mana_spent": 103548517, - "size_in_fields": 3555, + "mana_spent": 69155588, + "size_in_fields": 2400, "slot_number": 661, "timestamp": 1729045619 }, "fee_header": { - "eth_per_fee_asset": 11993802, - "excess_mana": 1325472885, - "mana_used": 103548517 + "eth_per_fee_asset": 10500850, + "excess_mana": 1028540964, + "mana_used": 69155588 }, "oracle_input": { - "fee_asset_price_modifier": -48 + "fee_asset_price_modifier": -22 }, "outputs": { - "eth_per_fee_asset_at_execution": 12051650, + "eth_per_fee_asset_at_execution": 10524003, "l1_fee_oracle_output": { "base_fee": 13041964028, "blob_fee": 1 @@ -47684,22 +47684,22 @@ "slot_of_change": 660 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68965889566989, - "congestion_multiplier": 4715256317, - "prover_cost": 15316371202284, - "sequencer_cost": 3246517530795 + "congestion_cost": 95285846079672, + "congestion_multiplier": 4975490239, + "prover_cost": 19011290475687, + "sequencer_cost": 4957035550066 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 831152763, - "congestion_multiplier": 4715256317, - "prover_cost": 184587545, - "sequencer_cost": 39125893 + "congestion_cost": 1002788530, + "congestion_multiplier": 4975490239, + "prover_cost": 200074878, + "sequencer_cost": 52167857 } }, "parent_fee_header": { - "eth_per_fee_asset": 12051650, - "excess_mana": 1320374165, - "mana_used": 105098720 + "eth_per_fee_asset": 10524003, + "excess_mana": 1038157562, + "mana_used": 65383402 } }, { @@ -47707,21 +47707,21 @@ "blobs_needed": 1, "block_number": 662, "l1_block_number": 20975134, - "mana_spent": 89753708, - "size_in_fields": 3150, + "mana_spent": 82564842, + "size_in_fields": 2985, "slot_number": 662, "timestamp": 1729045655 }, "fee_header": { - "eth_per_fee_asset": 12034580, - "excess_mana": 1329021402, - "mana_used": 89753708 + "eth_per_fee_asset": 10463046, + "excess_mana": 1022696552, + "mana_used": 82564842 }, "oracle_input": { - "fee_asset_price_modifier": 34 + "fee_asset_price_modifier": -36 }, "outputs": { - "eth_per_fee_asset_at_execution": 11993802, + "eth_per_fee_asset_at_execution": 10500850, "l1_fee_oracle_output": { "base_fee": 13041964028, "blob_fee": 1 @@ -47738,22 +47738,22 @@ "slot_of_change": 660 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 69664433679996, - "congestion_multiplier": 4734873648, - "prover_cost": 15390244477940, - "sequencer_cost": 3262175997236 + "congestion_cost": 94411219948862, + "congestion_multiplier": 4930333454, + "prover_cost": 19053207883172, + "sequencer_cost": 4967965164725 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 835541424, - "congestion_multiplier": 4734873648, - "prover_cost": 184587545, - "sequencer_cost": 39125893 + "congestion_cost": 991398059, + "congestion_multiplier": 4930333454, + "prover_cost": 200074878, + "sequencer_cost": 52167857 } }, "parent_fee_header": { - "eth_per_fee_asset": 11993802, - "excess_mana": 1325472885, - "mana_used": 103548517 + "eth_per_fee_asset": 10500850, + "excess_mana": 1028540964, + "mana_used": 69155588 } }, { @@ -47761,21 +47761,21 @@ "blobs_needed": 1, "block_number": 663, "l1_block_number": 20975137, - "mana_spent": 90815991, - "size_in_fields": 3120, + "mana_spent": 66790748, + "size_in_fields": 2445, "slot_number": 663, "timestamp": 1729045691 }, "fee_header": { - "eth_per_fee_asset": 12068276, - "excess_mana": 1318775110, - "mana_used": 90815991 + "eth_per_fee_asset": 10508037, + "excess_mana": 1030261394, + "mana_used": 66790748 }, "oracle_input": { - "fee_asset_price_modifier": 28 + "fee_asset_price_modifier": 43 }, "outputs": { - "eth_per_fee_asset_at_execution": 12034580, + "eth_per_fee_asset_at_execution": 10463046, "l1_fee_oracle_output": { "base_fee": 13041964028, "blob_fee": 1 @@ -47792,22 +47792,22 @@ "slot_of_change": 665 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68379512870412, - "congestion_multiplier": 4678450100, - "prover_cost": 15338096136301, - "sequencer_cost": 3251122432192 + "congestion_cost": 96163334845322, + "congestion_multiplier": 4988861748, + "prover_cost": 19122048971208, + "sequencer_cost": 4985914904704 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 822918718, - "congestion_multiplier": 4678450100, - "prover_cost": 184587545, - "sequencer_cost": 39125893 + "congestion_cost": 1006161396, + "congestion_multiplier": 4988861748, + "prover_cost": 200074878, + "sequencer_cost": 52167857 } }, "parent_fee_header": { - "eth_per_fee_asset": 12034580, - "excess_mana": 1329021402, - "mana_used": 89753708 + "eth_per_fee_asset": 10463046, + "excess_mana": 1022696552, + "mana_used": 82564842 } }, { @@ -47815,21 +47815,21 @@ "blobs_needed": 1, "block_number": 664, "l1_block_number": 20975140, - "mana_spent": 110784201, - "size_in_fields": 3765, + "mana_spent": 65934184, + "size_in_fields": 2625, "slot_number": 664, "timestamp": 1729045727 }, "fee_header": { - "eth_per_fee_asset": 12187751, - "excess_mana": 1309591101, - "mana_used": 110784201 + "eth_per_fee_asset": 10526951, + "excess_mana": 1022052142, + "mana_used": 65934184 }, "oracle_input": { - "fee_asset_price_modifier": 99 + "fee_asset_price_modifier": 18 }, "outputs": { - "eth_per_fee_asset_at_execution": 12068276, + "eth_per_fee_asset_at_execution": 10508037, "l1_fee_oracle_output": { "base_fee": 13041964028, "blob_fee": 1 @@ -47846,22 +47846,22 @@ "slot_of_change": 665 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67261683276054, - "congestion_multiplier": 4628447919, - "prover_cost": 15295270426365, - "sequencer_cost": 3242044928373 + "congestion_cost": 94227730736008, + "congestion_multiplier": 4925379581, + "prover_cost": 19040176390700, + "sequencer_cost": 4964567311669 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 811732558, - "congestion_multiplier": 4628447919, - "prover_cost": 184587545, - "sequencer_cost": 39125893 + "congestion_cost": 990148481, + "congestion_multiplier": 4925379581, + "prover_cost": 200074878, + "sequencer_cost": 52167857 } }, "parent_fee_header": { - "eth_per_fee_asset": 12068276, - "excess_mana": 1318775110, - "mana_used": 90815991 + "eth_per_fee_asset": 10508037, + "excess_mana": 1030261394, + "mana_used": 66790748 } }, { @@ -47869,21 +47869,21 @@ "blobs_needed": 1, "block_number": 665, "l1_block_number": 20975143, - "mana_spent": 86939831, - "size_in_fields": 3030, + "mana_spent": 91384464, + "size_in_fields": 2820, "slot_number": 665, "timestamp": 1729045763 }, "fee_header": { - "eth_per_fee_asset": 12080498, - "excess_mana": 1320375302, - "mana_used": 86939831 + "eth_per_fee_asset": 10538530, + "excess_mana": 1012986326, + "mana_used": 91384464 }, "oracle_input": { - "fee_asset_price_modifier": -88 + "fee_asset_price_modifier": 11 }, "outputs": { - "eth_per_fee_asset_at_execution": 12187751, + "eth_per_fee_asset_at_execution": 10526951, "l1_fee_oracle_output": { "base_fee": 13298959497, "blob_fee": 1 @@ -47900,22 +47900,22 @@ "slot_of_change": 665 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67938621407674, - "congestion_multiplier": 4687217414, - "prover_cost": 15151922286565, - "sequencer_cost": 3273522654016 + "congestion_cost": 92918839272645, + "congestion_multiplier": 4856211810, + "prover_cost": 19042586120141, + "sequencer_cost": 5053299668632 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 828019001, - "congestion_multiplier": 4687217414, - "prover_cost": 184667856, - "sequencer_cost": 39896879 + "congestion_cost": 978152068, + "congestion_multiplier": 4856211810, + "prover_cost": 200460371, + "sequencer_cost": 53195838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12187751, - "excess_mana": 1309591101, - "mana_used": 110784201 + "eth_per_fee_asset": 10526951, + "excess_mana": 1022052142, + "mana_used": 65934184 } }, { @@ -47923,21 +47923,21 @@ "blobs_needed": 1, "block_number": 666, "l1_block_number": 20975146, - "mana_spent": 103073563, - "size_in_fields": 4035, + "mana_spent": 53064979, + "size_in_fields": 1755, "slot_number": 666, "timestamp": 1729045799 }, "fee_header": { - "eth_per_fee_asset": 12028551, - "excess_mana": 1307315133, - "mana_used": 103073563 + "eth_per_fee_asset": 10612299, + "excess_mana": 1029370790, + "mana_used": 53064979 }, "oracle_input": { - "fee_asset_price_modifier": -43 + "fee_asset_price_modifier": 70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12080498, + "eth_per_fee_asset_at_execution": 10538530, "l1_fee_oracle_output": { "base_fee": 13298959497, "blob_fee": 1 @@ -47954,22 +47954,22 @@ "slot_of_change": 665 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67220520544766, - "congestion_multiplier": 4616139302, - "prover_cost": 15286443986002, - "sequencer_cost": 3302585621885 + "congestion_cost": 95842837473538, + "congestion_multiplier": 4981935324, + "prover_cost": 19021663457807, + "sequencer_cost": 5047747456240 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 812057364, - "congestion_multiplier": 4616139302, - "prover_cost": 184667856, - "sequencer_cost": 39896879 + "congestion_cost": 1010042618, + "congestion_multiplier": 4981935324, + "prover_cost": 200460371, + "sequencer_cost": 53195838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12080498, - "excess_mana": 1320375302, - "mana_used": 86939831 + "eth_per_fee_asset": 10538530, + "excess_mana": 1012986326, + "mana_used": 91384464 } }, { @@ -47977,21 +47977,21 @@ "blobs_needed": 1, "block_number": 667, "l1_block_number": 20975149, - "mana_spent": 107046959, - "size_in_fields": 3660, + "mana_spent": 77412117, + "size_in_fields": 2895, "slot_number": 667, "timestamp": 1729045835 }, "fee_header": { - "eth_per_fee_asset": 12046593, - "excess_mana": 1310388696, - "mana_used": 107046959 + "eth_per_fee_asset": 10617605, + "excess_mana": 1007435769, + "mana_used": 77412117 }, "oracle_input": { - "fee_asset_price_modifier": 15 + "fee_asset_price_modifier": 5 }, "outputs": { - "eth_per_fee_asset_at_execution": 12028551, + "eth_per_fee_asset_at_execution": 10612299, "l1_fee_oracle_output": { "base_fee": 13298959497, "blob_fee": 1 @@ -48008,22 +48008,22 @@ "slot_of_change": 665 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 67821289447084, - "congestion_multiplier": 4632769139, - "prover_cost": 15352460657980, - "sequencer_cost": 3316848305337 + "congestion_cost": 91170824248356, + "congestion_multiplier": 4814344034, + "prover_cost": 18889438659805, + "sequencer_cost": 5012659179694 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 815791839, - "congestion_multiplier": 4632769139, - "prover_cost": 184667856, - "sequencer_cost": 39896879 + "congestion_cost": 967532047, + "congestion_multiplier": 4814344034, + "prover_cost": 200460371, + "sequencer_cost": 53195838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12028551, - "excess_mana": 1307315133, - "mana_used": 103073563 + "eth_per_fee_asset": 10612299, + "excess_mana": 1029370790, + "mana_used": 53064979 } }, { @@ -48031,21 +48031,21 @@ "blobs_needed": 1, "block_number": 668, "l1_block_number": 20975152, - "mana_spent": 10500090, - "size_in_fields": 405, + "mana_spent": 78582171, + "size_in_fields": 2685, "slot_number": 668, "timestamp": 1729045871 }, "fee_header": { - "eth_per_fee_asset": 11975518, - "excess_mana": 1317435655, - "mana_used": 10500090 + "eth_per_fee_asset": 10691928, + "excess_mana": 1009847886, + "mana_used": 78582171 }, "oracle_input": { - "fee_asset_price_modifier": -59 + "fee_asset_price_modifier": 70 }, "outputs": { - "eth_per_fee_asset_at_execution": 12046593, + "eth_per_fee_asset_at_execution": 10617605, "l1_fee_oracle_output": { "base_fee": 13298959497, "blob_fee": 1 @@ -48062,44 +48062,44 @@ "slot_of_change": 670 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68434699918890, - "congestion_multiplier": 4671123951, - "prover_cost": 15329467510026, - "sequencer_cost": 3311880711833 + "congestion_cost": 91558870008821, + "congestion_multiplier": 4832494068, + "prover_cost": 18879998926312, + "sequencer_cost": 5010154173187 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 824404977, - "congestion_multiplier": 4671123951, - "prover_cost": 184667856, - "sequencer_cost": 39896879 + "congestion_cost": 972135916, + "congestion_multiplier": 4832494068, + "prover_cost": 200460371, + "sequencer_cost": 53195838 } }, "parent_fee_header": { - "eth_per_fee_asset": 12046593, - "excess_mana": 1310388696, - "mana_used": 107046959 + "eth_per_fee_asset": 10617605, + "excess_mana": 1007435769, + "mana_used": 77412117 } }, { "block_header": { - "blobs_needed": 2, + "blobs_needed": 1, "block_number": 669, "l1_block_number": 20975155, - "mana_spent": 167195802, - "size_in_fields": 6060, + "mana_spent": 84364546, + "size_in_fields": 2835, "slot_number": 669, "timestamp": 1729045907 }, "fee_header": { - "eth_per_fee_asset": 11907257, - "excess_mana": 1227935745, - "mana_used": 167195802 + "eth_per_fee_asset": 10738972, + "excess_mana": 1013430057, + "mana_used": 84364546 }, "oracle_input": { - "fee_asset_price_modifier": -57 + "fee_asset_price_modifier": 44 }, "outputs": { - "eth_per_fee_asset_at_execution": 11975518, + "eth_per_fee_asset_at_execution": 10691928, "l1_fee_oracle_output": { "base_fee": 13298959497, "blob_fee": 1 @@ -48116,22 +48116,22 @@ "slot_of_change": 670 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 60132489884780, - "congestion_multiplier": 4206726630, - "prover_cost": 15420448284576, - "sequencer_cost": 3331536807010 + "congestion_cost": 91564874548351, + "congestion_multiplier": 4859574542, + "prover_cost": 18748758035034, + "sequencer_cost": 4975326994346 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 720117715, - "congestion_multiplier": 4206726630, - "prover_cost": 184667856, - "sequencer_cost": 39896879 + "congestion_cost": 979005046, + "congestion_multiplier": 4859574542, + "prover_cost": 200460371, + "sequencer_cost": 53195838 } }, "parent_fee_header": { - "eth_per_fee_asset": 11975518, - "excess_mana": 1317435655, - "mana_used": 10500090 + "eth_per_fee_asset": 10691928, + "excess_mana": 1009847886, + "mana_used": 78582171 } }, { @@ -48139,21 +48139,21 @@ "blobs_needed": 1, "block_number": 670, "l1_block_number": 20975158, - "mana_spent": 112423051, - "size_in_fields": 4005, + "mana_spent": 87662832, + "size_in_fields": 2925, "slot_number": 670, "timestamp": 1729045943 }, "fee_header": { - "eth_per_fee_asset": 11946550, - "excess_mana": 1295131547, - "mana_used": 112423051 + "eth_per_fee_asset": 10752932, + "excess_mana": 1022794603, + "mana_used": 87662832 }, "oracle_input": { - "fee_asset_price_modifier": 33 + "fee_asset_price_modifier": 13 }, "outputs": { - "eth_per_fee_asset_at_execution": 11907257, + "eth_per_fee_asset_at_execution": 10738972, "l1_fee_oracle_output": { "base_fee": 12233966044, "blob_fee": 1 @@ -48170,22 +48170,22 @@ "slot_of_change": 670 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 65914329219568, - "congestion_multiplier": 4550803957, - "prover_cost": 15480899253288, - "sequencer_cost": 3082313500079 + "congestion_cost": 90708737391252, + "congestion_multiplier": 4931087654, + "prover_cost": 18517869401280, + "sequencer_cost": 4556848178765 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 784858858, - "congestion_multiplier": 4550803957, - "prover_cost": 184335046, - "sequencer_cost": 36701899 + "congestion_cost": 974118591, + "congestion_multiplier": 4931087654, + "prover_cost": 198862881, + "sequencer_cost": 48935865 } }, "parent_fee_header": { - "eth_per_fee_asset": 11907257, - "excess_mana": 1227935745, - "mana_used": 167195802 + "eth_per_fee_asset": 10738972, + "excess_mana": 1013430057, + "mana_used": 84364546 } }, { @@ -48193,21 +48193,21 @@ "blobs_needed": 1, "block_number": 671, "l1_block_number": 20975161, - "mana_spent": 114371801, - "size_in_fields": 4080, + "mana_spent": 66035948, + "size_in_fields": 2400, "slot_number": 671, "timestamp": 1729045979 }, "fee_header": { - "eth_per_fee_asset": 11953717, - "excess_mana": 1307554598, - "mana_used": 114371801 + "eth_per_fee_asset": 10649703, + "excess_mana": 1035457435, + "mana_used": 66035948 }, "oracle_input": { - "fee_asset_price_modifier": 6 + "fee_asset_price_modifier": -96 }, "outputs": { - "eth_per_fee_asset_at_execution": 11946550, + "eth_per_fee_asset_at_execution": 10752932, "l1_fee_oracle_output": { "base_fee": 12233966044, "blob_fee": 1 @@ -48224,22 +48224,22 @@ "slot_of_change": 670 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 66930310005818, - "congestion_multiplier": 4617432805, - "prover_cost": 15429981542789, - "sequencer_cost": 3072175565331 + "congestion_cost": 92858055272739, + "congestion_multiplier": 5029464922, + "prover_cost": 18493828566944, + "sequencer_cost": 4550932248061 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 799586295, - "congestion_multiplier": 4617432805, - "prover_cost": 184335046, - "sequencer_cost": 36701899 + "congestion_cost": 998496354, + "congestion_multiplier": 5029464922, + "prover_cost": 198862881, + "sequencer_cost": 48935865 } }, "parent_fee_header": { - "eth_per_fee_asset": 11946550, - "excess_mana": 1295131547, - "mana_used": 112423051 + "eth_per_fee_asset": 10752932, + "excess_mana": 1022794603, + "mana_used": 87662832 } }, { @@ -48247,21 +48247,21 @@ "blobs_needed": 1, "block_number": 672, "l1_block_number": 20975164, - "mana_spent": 99902945, - "size_in_fields": 3555, + "mana_spent": 87009616, + "size_in_fields": 2970, "slot_number": 672, "timestamp": 1729046015 }, "fee_header": { - "eth_per_fee_asset": 11936981, - "excess_mana": 1321926399, - "mana_used": 99902945 + "eth_per_fee_asset": 10666742, + "excess_mana": 1026493383, + "mana_used": 87009616 }, "oracle_input": { - "fee_asset_price_modifier": -14 + "fee_asset_price_modifier": 16 }, "outputs": { - "eth_per_fee_asset_at_execution": 11953717, + "eth_per_fee_asset_at_execution": 10649703, "l1_fee_oracle_output": { "base_fee": 12233966044, "blob_fee": 1 @@ -48278,22 +48278,22 @@ "slot_of_change": 670 }, "mana_base_fee_components_in_fee_asset": { - "congestion_cost": 68338005910631, - "congestion_multiplier": 4695731422, - "prover_cost": 15420730305060, - "sequencer_cost": 3070333604184 + "congestion_cost": 92133043710234, + "congestion_multiplier": 4959622753, + "prover_cost": 18673091728474, + "sequencer_cost": 4595045044919 }, "mana_base_fee_components_in_wei": { - "congestion_cost": 816893183, - "congestion_multiplier": 4695731422, - "prover_cost": 184335046, - "sequencer_cost": 36701899 + "congestion_cost": 981189552, + "congestion_multiplier": 4959622753, + "prover_cost": 198862881, + "sequencer_cost": 48935865 } }, "parent_fee_header": { - "eth_per_fee_asset": 11953717, - "excess_mana": 1307554598, - "mana_used": 114371801 + "eth_per_fee_asset": 10649703, + "excess_mana": 1035457435, + "mana_used": 66035948 } } ], diff --git a/l1-contracts/test/harnesses/TestConstants.sol b/l1-contracts/test/harnesses/TestConstants.sol index 548b0ab2d4df..201478967eb7 100644 --- a/l1-contracts/test/harnesses/TestConstants.sol +++ b/l1-contracts/test/harnesses/TestConstants.sol @@ -38,7 +38,7 @@ library TestConstants { uint256 internal constant AZTEC_SLASH_AMOUNT_SMALL = 20e18; uint256 internal constant AZTEC_SLASH_AMOUNT_MEDIUM = 40e18; uint256 internal constant AZTEC_SLASH_AMOUNT_LARGE = 60e18; - uint256 internal constant AZTEC_MANA_TARGET = 100_000_000; + uint256 internal constant AZTEC_MANA_TARGET = 75_000_000; uint256 internal constant AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN = 4; uint256 internal constant AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT = 2; uint256 internal constant AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE = 0; diff --git a/l1-contracts/test/slashing/TallySlashingProposer.t.sol b/l1-contracts/test/slashing/TallySlashingProposer.t.sol index 7f23ed2cbb87..38330fab1245 100644 --- a/l1-contracts/test/slashing/TallySlashingProposer.t.sol +++ b/l1-contracts/test/slashing/TallySlashingProposer.t.sol @@ -605,9 +605,8 @@ contract TallySlashingProposerTest is TestBase { function test_getVotesRevertsForOutOfRangeRound() public { // Test that getVotes reverts for rounds outside the valid roundabout range. - // Before the range check was added to _getRoundVotes, getVotes would silently - // return whatever stale data was at the storage slot - potentially data from - // a completely different round that mapped to the same circular index. + // getVotes routes through _getRoundData for range validation before loading + // vote slots, so out-of-range round reads should always revert. _jumpToSlashRound(10); SlashRound baseRound = slashingProposer.getCurrentRound(); @@ -670,6 +669,47 @@ contract TallySlashingProposerTest is TestBase { assertEq(result, emptyVote, "getVotes should return empty bytes for stale round"); } + function test_getVotesReturnsEmptyForUnwrittenIndexInCurrentRound() public { + // Populate two vote indices in a base round. + _jumpToSlashRound(10); + SlashRound baseRound = slashingProposer.getCurrentRound(); + + uint8[] memory firstVote = new uint8[](COMMITTEE_SIZE * ROUND_SIZE_IN_EPOCHS); + firstVote[0] = 3; + _castVote(firstVote); + + timeCheater.cheat__progressSlot(); + + uint8[] memory secondVote = new uint8[](COMMITTEE_SIZE * ROUND_SIZE_IN_EPOCHS); + secondVote[1] = 2; + secondVote[2] = 1; + _castVote(secondVote); + + bytes memory secondVoteData = _createVoteData(secondVote); + assertEq(slashingProposer.getVotes(baseRound, 1), secondVoteData, "Base round index 1 should be populated"); + + // Jump to a round that maps to the same circular slot and cast only one vote. + uint256 roundaboutSize = slashingProposer.ROUNDABOUT_SIZE(); + SlashRound overlappingRound = SlashRound.wrap(SlashRound.unwrap(baseRound) + roundaboutSize); + _jumpToSlashRound(SlashRound.unwrap(overlappingRound)); + + uint8[] memory overlappingVote = new uint8[](COMMITTEE_SIZE * ROUND_SIZE_IN_EPOCHS); + overlappingVote[0] = 1; + _castVote(overlappingVote); + + (, uint256 voteCount) = slashingProposer.getRound(overlappingRound); + assertEq(voteCount, 1, "Overlapping round should have exactly one vote"); + + // Reading index 1 must return empty bytes, not stale bytes from baseRound index 1. + uint256 expectedLength = COMMITTEE_SIZE * ROUND_SIZE_IN_EPOCHS / 4; + bytes memory emptyVote = new bytes(expectedLength); + assertEq( + slashingProposer.getVotes(overlappingRound, 1), + emptyVote, + "getVotes should return empty bytes for unwritten vote index" + ); + } + function test_getVotesRevertsForFutureRound() public { // getVotes should revert when asked about a round in the future _jumpToSlashRound(10); diff --git a/noir-projects/aztec-nr/aztec/src/context/private_context.nr b/noir-projects/aztec-nr/aztec/src/context/private_context.nr index eb7bdd736079..e866cdfa5de1 100644 --- a/noir-projects/aztec-nr/aztec/src/context/private_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/private_context.nr @@ -187,7 +187,7 @@ impl PrivateContext { is_fee_payer: false, args_hash, return_hash: 0, - expiration_timestamp: inputs.anchor_block_header.global_variables.timestamp + MAX_TX_LIFETIME, + expiration_timestamp: inputs.anchor_block_header.timestamp() + MAX_TX_LIFETIME, note_hash_read_requests: BoundedVec::new(), nullifier_read_requests: BoundedVec::new(), key_validation_requests_and_separators: BoundedVec::new(), diff --git a/noir-projects/aztec-nr/aztec/src/context/public_context.nr b/noir-projects/aztec-nr/aztec/src/context/public_context.nr index 91d132c53c38..a084674ba3df 100644 --- a/noir-projects/aztec-nr/aztec/src/context/public_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/public_context.nr @@ -158,15 +158,15 @@ impl PublicContext { /// /// ## Public vs Private /// - /// In general, it is unsafe to check for nullifier non-existence in private, as that will not consider the + /// In general, one should not attempt to prove nullifier non-existence in private, as that will not consider the /// possibility of the nullifier having been emitted in any transaction between the anchor block and the inclusion /// block. Private functions instead prove existence via /// [`crate::context::PrivateContext::assert_nullifier_exists`] /// and 'prove' non-existence by _emitting_ the nullifer, which would cause the transaction to fail if the /// nullifier existed. /// - /// This is not the case in public functions, which do have access to the tip of the blockchain and so can reliably - /// prove whether a nullifier exists or not. + /// This is not the case in public functions, which **do** have access to the tip of the blockchain and so can + /// reliably prove whether a nullifier exists or not. /// /// ## Safety /// @@ -175,7 +175,11 @@ impl PublicContext { /// existence of a nullifier emitted from a private function implies that all other side-effects of said private /// execution have been completed, more concretely that any enqueued public calls have been executed. /// - /// This is because all private transaction effects are committed _before_ enqueued public functions are run (in + /// For example, if a function in contract `A` privately emits nullifier `X` and then enqueues public function `Y`, + /// then it is **unsafe** for a contract `B` to infer that `Y` has alredy executed simply because `X` exists. + /// + /// This is because **all** private transaction effects are committed _before_ enqueued public functions are run + /// (in /// order to not reveal detailed timing information about the transaction), so it is possible to observe a /// nullifier that was emitted alongside the enqueuing of a public call **before** said call has been completed. /// diff --git a/noir-projects/aztec-nr/aztec/src/context/utility_context.nr b/noir-projects/aztec-nr/aztec/src/context/utility_context.nr index 859c3a331bc8..ce4891633a39 100644 --- a/noir-projects/aztec-nr/aztec/src/context/utility_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/utility_context.nr @@ -25,11 +25,11 @@ impl UtilityContext { } pub fn block_number(self) -> u32 { - self.block_header.global_variables.block_number + self.block_header.block_number() } pub fn timestamp(self) -> u64 { - self.block_header.global_variables.timestamp + self.block_header.timestamp() } pub fn this_address(self) -> AztecAddress { @@ -37,11 +37,11 @@ impl UtilityContext { } pub fn version(self) -> Field { - self.block_header.global_variables.version + self.block_header.version() } pub fn chain_id(self) -> Field { - self.block_header.global_variables.chain_id + self.block_header.chain_id() } pub unconstrained fn raw_storage_read(self: Self, storage_slot: Field) -> [Field; N] { diff --git a/noir-projects/aztec-nr/aztec/src/contract_self.nr b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr similarity index 70% rename from noir-projects/aztec-nr/aztec/src/contract_self.nr rename to noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr index 69de9b4e2f6a..6065428f97c1 100644 --- a/noir-projects/aztec-nr/aztec/src/contract_self.nr +++ b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr @@ -1,32 +1,23 @@ -//! The `self` contract value. +//! The `self` contract value for private execution contexts. use crate::{ - context::{ - calls::{PrivateCall, PrivateStaticCall, PublicCall, PublicStaticCall}, - PrivateContext, - PublicContext, - UtilityContext, - }, - event::{ - event_emission::{emit_event_in_private, emit_event_in_public}, - event_interface::EventInterface, - EventMessage, - }, + context::{calls::{PrivateCall, PrivateStaticCall, PublicCall, PublicStaticCall}, PrivateContext}, + event::{event_emission::emit_event_in_private, event_interface::EventInterface, EventMessage}, }; use crate::protocol::{address::AztecAddress, traits::{Deserialize, Serialize}}; -/// Core interface for interacting with aztec-nr contract features. +/// Core interface for interacting with aztec-nr contract features in private execution contexts. /// /// This struct is automatically injected into every [`external`](crate::macros::functions::external) and -/// [`internal`](crate::macros::functions::internal) contract function by the Aztec macro system and is accessible -/// through the `self` variable. +/// [`internal`](crate::macros::functions::internal) contract function marked with `"private"` by the Aztec macro +/// system and is accessible through the `self` variable. /// /// ## Usage in Contract Functions /// /// Once injected, you can use `self` to: /// - Access storage: `self.storage.balances.at(owner).read()` /// - Call contracts: `self.call(Token::at(address).transfer(recipient, amount))` -/// - Emit events: `self.emit(event).deliver_to(recipient, delivery_mode)` (private) or `self.emit(event)` (public) +/// - Emit events: `self.emit(event).deliver_to(recipient, delivery_mode)` /// - Get the contract address: `self.address` /// - Get the caller: `self.msg_sender()` /// - Access low-level Aztec.nr APIs through the context: `self.context` @@ -49,14 +40,14 @@ use crate::protocol::{address::AztecAddress, traits::{Deserialize, Serialize}}; /// /// ## Type Parameters /// -/// - `Context`: The execution context type - either `&mut PrivateContext`, `PublicContext`, or `UtilityContext` /// - `Storage`: The contract's storage struct (defined with [`storage`](crate::macros::storage::storage), or `()` if /// the contract has no storage /// - `CallSelf`: Macro-generated type for calling contract's own non-view functions /// - `EnqueueSelf`: Macro-generated type for enqueuing calls to the contract's own non-view functions /// - `CallSelfStatic`: Macro-generated type for calling contract's own view functions /// - `EnqueueSelfStatic`: Macro-generated type for enqueuing calls to the contract's own view functions -pub struct ContractSelf { +/// - `CallInternal`: Macro-generated type for calling internal functions +pub struct ContractSelfPrivate { /// The address of this contract pub address: AztecAddress, @@ -64,10 +55,8 @@ pub struct ContractSelf ContractSelf<&mut PrivateContext, Storage, CallSelf, EnqueueSelf, CallSelfStatic, EnqueueSelfStatic, CallInternal> { - /// Creates a new `ContractSelf` instance for a private function. +impl ContractSelfPrivate { + /// Creates a new `ContractSelfPrivate` instance for a private function. /// /// This constructor is called automatically by the macro system and should not be called directly. - pub fn new_private( + pub fn new( context: &mut PrivateContext, storage: Storage, call_self: CallSelf, @@ -335,8 +304,8 @@ impl ContractSelf { - /// Creates a new `ContractSelf` instance for a public function. - /// - /// This constructor is called automatically by the macro system and should not be called directly. - pub fn new_public( - context: PublicContext, - storage: Storage, - call_self: CallSelf, - call_self_static: CallSelfStatic, - internal: CallInternal, - ) -> Self { - Self { - context, - storage, - address: context.this_address(), - call_self, - enqueue_self: (), - call_self_static, - enqueue_self_static: (), - internal, - } - } - - /// The address of the contract address that made this function call. - /// - /// This is similar to Solidity's `msg.sender` value. - /// - /// ## Incognito Calls - /// - /// Contracts can call public functions from private ones hiding their identity (see - /// [`enqueue_incognito`](ContractSelf::enqueue_incognito)). This function reverts when executed in such a context. - /// - /// If you need to handle these cases, use [`PublicContext::maybe_msg_sender`]. - pub fn msg_sender(self: Self) -> AztecAddress { - self.context.maybe_msg_sender().unwrap() - } - - /// Emits an event publicly. - /// - /// Public events are emitted as plaintext and are therefore visible to everyone. This is is the same as Solidity - /// events on EVM chains. - /// - /// Unlike private events, they don't require delivery of an event message. - /// - /// # Example - /// ```noir - /// #[event] - /// struct Update { value: Field } - /// - /// #[external("public")] - /// fn publish_update(value: Field) { - /// self.emit(Update { value }); - /// } - /// ``` - /// - /// # Cost - /// - /// Public event emission is achieved by emitting public transaction logs. A total of `N+1` fields are emitted, - /// where `N` is the serialization length of the event. - pub fn emit(&mut self, event: Event) - where - Event: EventInterface + Serialize, - { - emit_event_in_public(self.context, event); - } - - /// Makes a public contract call. - /// - /// Will revert if the called function reverts or runs out of gas. - /// - /// # Arguments - /// * `call` - The object representing the public function to invoke. - /// - /// # Returns - /// * `T` - Whatever data the called function has returned. - /// - /// # Example - /// ```noir - /// self.call(Token::at(address).transfer_in_public(recipient, amount)); - /// ``` - /// - pub unconstrained fn call(self, call: PublicCall) -> T - where - T: Deserialize, - { - call.call(self.context) - } - - /// Makes a public read-only contract call. - /// - /// This is similar to Solidity's `staticcall`. The called function cannot modify state or emit events. Any nested - /// calls are constrained to also be static calls. - /// - /// Will revert if the called function reverts or runs out of gas. - /// - /// # Arguments - /// * `call` - The object representing the read-only public function to invoke. - /// - /// # Returns - /// * `T` - Whatever data the called function has returned. - /// - /// # Example - /// ```noir - /// self.view(Token::at(address).balance_of_public(recipient)); - /// ``` - /// - pub unconstrained fn view(self, call: PublicStaticCall) -> T - where - T: Deserialize, - { - call.view(self.context) - } -} - -// Implementation for `ContractSelf` in utility execution contexts. -// -// This implementation is used when an external or internal contract function is marked with "utility". -impl ContractSelf { - /// Creates a new `ContractSelf` instance for a utility function. - /// - /// This constructor is called automatically by the macro system and should not be called directly. - pub fn new_utility(context: UtilityContext, storage: Storage) -> Self { - Self { - context, - storage, - address: context.this_address(), - call_self: (), - enqueue_self: (), - call_self_static: (), - enqueue_self_static: (), - internal: (), - } - } -} diff --git a/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_public.nr b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_public.nr new file mode 100644 index 000000000000..ab5026bffaa9 --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_public.nr @@ -0,0 +1,174 @@ +//! The `self` contract value for public execution contexts. + +use crate::{ + context::{calls::{PublicCall, PublicStaticCall}, PublicContext}, + event::{event_emission::emit_event_in_public, event_interface::EventInterface}, +}; +use crate::protocol::{address::AztecAddress, traits::{Deserialize, Serialize}}; + +/// Core interface for interacting with aztec-nr contract features in public execution contexts. +/// +/// This struct is automatically injected into every [`external`](crate::macros::functions::external) and +/// [`internal`](crate::macros::functions::internal) contract function marked with `"public"` by the Aztec macro +/// system and is accessible through the `self` variable. +/// +/// ## Type Parameters +/// +/// - `Storage`: The contract's storage struct (defined with [`storage`](crate::macros::storage::storage), or `()` if +/// the contract has no storage +/// - `CallSelf`: Macro-generated type for calling contract's own non-view functions +/// - `CallSelfStatic`: Macro-generated type for calling contract's own view functions +/// - `CallInternal`: Macro-generated type for calling internal functions +pub struct ContractSelfPublic { + /// The address of this contract + pub address: AztecAddress, + + /// The contract's storage instance, representing the struct to which the + /// [`storage`](crate::macros::storage::storage) macro was applied in your contract. If the contract has no + /// storage, the type of this will be `()`. + /// + /// This storage instance is specialized for the current execution context (public) and + /// provides access to the contract's state variables. + /// + /// ## Developer Note + /// + /// If you've arrived here while trying to access your contract's storage while the `Storage` generic type is set + /// to unit type `()`, it means you haven't yet defined a Storage struct using the + /// [`storage`](crate::macros::storage::storage) macro in your contract. For guidance on setting this up, please + /// refer to our docs: https://docs.aztec.network/developers/docs/guides/smart_contracts/storage + pub storage: Storage, + + /// The public execution context. + pub context: PublicContext, + + /// Provides type-safe methods for calling this contract's own non-view functions. + /// + /// Example API: + /// ```noir + /// self.call_self.some_public_function(args) + /// ``` + pub call_self: CallSelf, + + /// Provides type-safe methods for calling this contract's own view functions. + /// + /// Example API: + /// ```noir + /// self.call_self_static.some_view_function(args) + /// ``` + pub call_self_static: CallSelfStatic, + + /// Provides type-safe methods for calling internal functions. + /// + /// Example API: + /// ```noir + /// self.internal.some_internal_function(args) + /// ``` + pub internal: CallInternal, +} + +impl ContractSelfPublic { + /// Creates a new `ContractSelfPublic` instance for a public function. + /// + /// This constructor is called automatically by the macro system and should not be called directly. + pub fn new( + context: PublicContext, + storage: Storage, + call_self: CallSelf, + call_self_static: CallSelfStatic, + internal: CallInternal, + ) -> Self { + Self { context, storage, address: context.this_address(), call_self, call_self_static, internal } + } + + /// The address of the contract address that made this function call. + /// + /// This is similar to Solidity's `msg.sender` value. + /// + /// ## Incognito Calls + /// + /// Contracts can call public functions from private ones hiding their identity (see + /// + /// [`ContractSelfPrivate::enqueue_incognito`](crate::contract_self::ContractSelfPrivate::enqueue_incognito)). + /// This function reverts when executed in such a context. + /// + /// If you need to handle these cases, use [`PublicContext::maybe_msg_sender`]. + pub fn msg_sender(self: Self) -> AztecAddress { + self.context.maybe_msg_sender().unwrap() + } + + /// Emits an event publicly. + /// + /// Public events are emitted as plaintext and are therefore visible to everyone. This is is the same as Solidity + /// events on EVM chains. + /// + /// Unlike private events, they don't require delivery of an event message. + /// + /// # Example + /// ```noir + /// #[event] + /// struct Update { value: Field } + /// + /// #[external("public")] + /// fn publish_update(value: Field) { + /// self.emit(Update { value }); + /// } + /// ``` + /// + /// # Cost + /// + /// Public event emission is achieved by emitting public transaction logs. A total of `N+1` fields are emitted, + /// where `N` is the serialization length of the event. + pub fn emit(&mut self, event: Event) + where + Event: EventInterface + Serialize, + { + emit_event_in_public(self.context, event); + } + + /// Makes a public contract call. + /// + /// Will revert if the called function reverts or runs out of gas. + /// + /// # Arguments + /// * `call` - The object representing the public function to invoke. + /// + /// # Returns + /// * `T` - Whatever data the called function has returned. + /// + /// # Example + /// ```noir + /// self.call(Token::at(address).transfer_in_public(recipient, amount)); + /// ``` + /// + pub unconstrained fn call(self, call: PublicCall) -> T + where + T: Deserialize, + { + call.call(self.context) + } + + /// Makes a public read-only contract call. + /// + /// This is similar to Solidity's `staticcall`. The called function cannot modify state or emit events. Any nested + /// calls are constrained to also be static calls. + /// + /// Will revert if the called function reverts or runs out of gas. + /// + /// # Arguments + /// * `call` - The object representing the read-only public function to invoke. + /// + /// # Returns + /// * `T` - Whatever data the called function has returned. + /// + /// # Example + /// ```noir + /// self.view(Token::at(address).balance_of_public(recipient)); + /// ``` + /// + pub unconstrained fn view(self, call: PublicStaticCall) -> T + where + T: Deserialize, + { + call.view(self.context) + } +} diff --git a/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_utility.nr b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_utility.nr new file mode 100644 index 000000000000..39cc1da0d3ac --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_utility.nr @@ -0,0 +1,45 @@ +//! The `self` contract value for utility execution contexts. + +use crate::context::UtilityContext; +use crate::protocol::address::AztecAddress; + +/// Core interface for interacting with aztec-nr contract features in utility execution contexts. +/// +/// This struct is automatically injected into every [`external`](crate::macros::functions::external) contract function +/// marked with `"utility"` by the Aztec macro system and is accessible through the `self` variable. +/// +/// ## Type Parameters +/// +/// - `Storage`: The contract's storage struct (defined with [`storage`](crate::macros::storage::storage), or `()` if +/// the contract has no storage +pub struct ContractSelfUtility { + /// The address of this contract + pub address: AztecAddress, + + /// The contract's storage instance, representing the struct to which the + /// [`storage`](crate::macros::storage::storage) macro was applied in your contract. If the contract has no + /// storage, the type of this will be `()`. + /// + /// This storage instance is specialized for the current execution context (utility) and + /// provides access to the contract's state variables. + /// + /// ## Developer Note + /// + /// If you've arrived here while trying to access your contract's storage while the `Storage` generic type is set + /// to unit type `()`, it means you haven't yet defined a Storage struct using the + /// [`storage`](crate::macros::storage::storage) macro in your contract. For guidance on setting this up, please + /// refer to our docs: https://docs.aztec.network/developers/docs/guides/smart_contracts/storage + pub storage: Storage, + + /// The utility execution context. + pub context: UtilityContext, +} + +impl ContractSelfUtility { + /// Creates a new `ContractSelfUtility` instance for a utility function. + /// + /// This constructor is called automatically by the macro system and should not be called directly. + pub fn new(context: UtilityContext, storage: Storage) -> Self { + Self { context, storage, address: context.this_address() } + } +} diff --git a/noir-projects/aztec-nr/aztec/src/contract_self/mod.nr b/noir-projects/aztec-nr/aztec/src/contract_self/mod.nr new file mode 100644 index 000000000000..e97c764a38e8 --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/contract_self/mod.nr @@ -0,0 +1,7 @@ +pub mod contract_self_private; +pub mod contract_self_public; +pub mod contract_self_utility; + +pub use contract_self_private::ContractSelfPrivate; +pub use contract_self_public::ContractSelfPublic; +pub use contract_self_utility::ContractSelfUtility; diff --git a/noir-projects/aztec-nr/aztec/src/event/event_emission.nr b/noir-projects/aztec-nr/aztec/src/event/event_emission.nr index 89141b717278..845c2f366f6c 100644 --- a/noir-projects/aztec-nr/aztec/src/event/event_emission.nr +++ b/noir-projects/aztec-nr/aztec/src/event/event_emission.nr @@ -11,7 +11,7 @@ pub struct NewEvent { pub(crate) randomness: Field, } -/// Equivalent to `self.emit(event)`: see [`crate::contract_self::ContractSelf::emit`]. +/// Equivalent to `self.emit(event)`: see [`crate::contract_self::ContractSelfPrivate::emit`]. pub fn emit_event_in_private(context: &mut PrivateContext, event: Event) -> EventMessage where Event: EventInterface + Serialize, @@ -34,7 +34,7 @@ where EventMessage::new(NewEvent { event, randomness }, context) } -/// Equivalent to `self.emit(event)`: see [`crate::contract_self::ContractSelf::emit`]. +/// Equivalent to `self.emit(event)`: see [`crate::contract_self::ContractSelfPublic::emit`]. pub fn emit_event_in_public(context: PublicContext, event: Event) where Event: EventInterface + Serialize, diff --git a/noir-projects/aztec-nr/aztec/src/keys/ephemeral.nr b/noir-projects/aztec-nr/aztec/src/keys/ephemeral.nr index e8d59d42be8c..0e24bb42a526 100644 --- a/noir-projects/aztec-nr/aztec/src/keys/ephemeral.nr +++ b/noir-projects/aztec-nr/aztec/src/keys/ephemeral.nr @@ -2,8 +2,9 @@ use std::embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul}; use crate::protocol::{point::Point, scalar::Scalar}; -use crate::oracle::random::random; +use crate::{oracle::random::random, utils::point::get_sign_of_point}; +/// Generates a random ephemeral key pair. pub fn generate_ephemeral_key_pair() -> (Scalar, Point) { // @todo Need to draw randomness from the full domain of Fq not only Fr @@ -20,3 +21,56 @@ pub fn generate_ephemeral_key_pair() -> (Scalar, Point) { (eph_sk, eph_pk) } + +/// Generates a random ephemeral key pair with a positive y-coordinate. +/// +/// Unlike [`generate_ephemeral_key_pair`], the y-coordinate of the public key is guaranteed to be a positive value +/// (i.e. [`crate::utils::point::get_sign_of_point`] will return `true`). +/// +/// This is useful as it means it is possible to just broadcast the x-coordinate as a single `Field` and then +/// reconstruct the original public key using [`crate::utils::point::point_from_x_coord_and_sign`] with `sign: true`. +pub fn generate_positive_ephemeral_key_pair() -> (Scalar, Point) { + // Safety: we use the randomness to preserve the privacy of both the sender and recipient via encryption, so a + // malicious sender could use non-random values to reveal the plaintext. But they already know it themselves + // anyway, and so the recipient already trusts them to not disclose this information. We can therefore assume that + // the sender will cooperate in the random value generation. + let eph_sk = unsafe { generate_secret_key_for_positive_public_key() }; + let eph_pk = fixed_base_scalar_mul(eph_sk); + + assert(get_sign_of_point(eph_pk), "Got an ephemeral public key with a negative y coordinate"); + + (eph_sk, eph_pk) +} + +unconstrained fn generate_secret_key_for_positive_public_key() -> EmbeddedCurveScalar { + let mut sk = std::mem::zeroed(); + + loop { + // We simply produce random secret keys until we find one that has results in a positive public key. About half + // of all public keys fulfill this condition, so this should only take a few iterations at most. + + // @todo Need to draw randomness from the full domain of Fq not only Fr + sk = EmbeddedCurveScalar::from_field(random()); + let pk = fixed_base_scalar_mul(sk); + if get_sign_of_point(pk) { + break; + } + } + + sk +} + +mod test { + use crate::utils::point::get_sign_of_point; + use super::generate_positive_ephemeral_key_pair; + + #[test] + fn generate_positive_ephemeral_key_pair_produces_positive_keys() { + // About half of random points are negative, so testing just a couple gives us high confidence that + // `generate_positive_ephemeral_key_pair` is indeed producing positive ones. + for _ in 0..10 { + let (_, pk) = generate_positive_ephemeral_key_pair(); + assert(get_sign_of_point(pk)); + } + } +} diff --git a/noir-projects/aztec-nr/aztec/src/lib.nr b/noir-projects/aztec-nr/aztec/src/lib.nr index d0118d08a9b7..d0cce41274d4 100644 --- a/noir-projects/aztec-nr/aztec/src/lib.nr +++ b/noir-projects/aztec-nr/aztec/src/lib.nr @@ -28,8 +28,7 @@ //! [`TestEnvironment`](crate::test::helpers::test_environment::TestEnvironment) and [mocks](crate::test::mocks). pub mod context; -mod contract_self; -pub use contract_self::ContractSelf; +pub mod contract_self; pub mod publish_contract_instance; pub mod hash; pub mod history; diff --git a/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr index dfcd4eec59d5..75ab13d794ee 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr @@ -220,7 +220,7 @@ pub comptime fn only_self(f: FunctionDefinition) { /// ## Guarantees /// /// [`view`] functions can *only* be called in a static execution context, which is typically achieved by calling the -/// [`crate::contract_self::ContractSelf::view`] method on `self`. +/// [`crate::contract_self::ContractSelfPublic::view`] method on `self`. /// /// No compile time checks are performed on whether a function can be made [`view`]. If a function marked as view /// attempts to modify state, that will result in *runtime* failures. diff --git a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/private.nr b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/private.nr index 035d0106284c..88c0f8590d4d 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/private.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/private.nr @@ -34,9 +34,9 @@ pub(crate) comptime fn generate_private_external(f: FunctionDefinition) -> Quote let storage = Storage::init(&mut context); } } else { - // Contract does not have Storage defined, so we set storage to the unit type `()`. ContractSelf requires a - // storage struct in its constructor. Using an Option type would lead to worse developer experience and higher - // constraint counts so we use the unit type `()` instead. + // Contract does not have Storage defined, so we set storage to the unit type `()`. ContractSelfPrivate + // requires a storage struct in its constructor. Using an Option type would lead to worse developer experience + // and higher constraint counts so we use the unit type `()` instead. quote { let storage = (); } @@ -55,7 +55,7 @@ pub(crate) comptime fn generate_private_external(f: FunctionDefinition) -> Quote let call_self_static: CallSelfStatic<&mut aztec::context::PrivateContext> = CallSelfStatic { address: self_address, context: &mut context }; let enqueue_self_static: EnqueueSelfStatic<&mut aztec::context::PrivateContext> = EnqueueSelfStatic { address: self_address, context: &mut context }; let internal: CallInternal<&mut aztec::context::PrivateContext> = CallInternal { context: &mut context }; - aztec::ContractSelf::new_private(&mut context, storage, call_self, enqueue_self, call_self_static, enqueue_self_static, internal) + aztec::contract_self::ContractSelfPrivate::new(&mut context, storage, call_self, enqueue_self, call_self_static, enqueue_self_static, internal) }; }; diff --git a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/public.nr b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/public.nr index 8a575ab661b8..d481fd0a9666 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/public.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/public.nr @@ -33,9 +33,9 @@ pub(crate) comptime fn generate_public_external(f: FunctionDefinition) -> Quoted let storage = Storage::init(context); } } else { - // Contract does not have Storage defined, so we set storage to the unit type `()`. ContractSelf requires a - // storage struct in its constructor. Using an Option type would lead to worse developer experience and higher - // constraint counts so we use the unit type `()` instead. + // Contract does not have Storage defined, so we set storage to the unit type `()`. ContractSelfPublic requires + // a storage struct in its constructor. Using an Option type would lead to worse developer experience and + // higher constraint counts so we use the unit type `()` instead. quote { let storage = (); } @@ -55,7 +55,7 @@ pub(crate) comptime fn generate_public_external(f: FunctionDefinition) -> Quoted let call_self: CallSelf = CallSelf { address: self_address, context }; let call_self_static: CallSelfStatic = CallSelfStatic { address: self_address, context }; let internal: CallInternal = CallInternal { context }; - aztec::ContractSelf::new_public(context, storage, call_self, call_self_static, internal) + aztec::contract_self::ContractSelfPublic::new(context, storage, call_self, call_self_static, internal) }; }; diff --git a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/utility.nr b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/utility.nr index f7f4da0a6904..f50bbc1249d7 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/utility.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/external/utility.nr @@ -7,7 +7,8 @@ pub(crate) comptime fn generate_utility_external(f: FunctionDefinition) -> Quote let storage = Storage::init(context); } } else { - // Contract does not have Storage defined, so we set storage to the unit type `()`. ContractSelf requires a + // Contract does not have Storage defined, so we set storage to the unit type `()`. ContractSelfUtility + // requires a // storage struct in its constructor. Using an Option type would lead to worse developer experience and higher // constraint counts so we use the unit type `()` instead. quote { @@ -21,7 +22,7 @@ pub(crate) comptime fn generate_utility_external(f: FunctionDefinition) -> Quote let mut self = { let context = aztec::context::UtilityContext::new(); $storage_init - aztec::ContractSelf::new_utility(context, storage) + aztec::contract_self::ContractSelfUtility::new(context, storage) }; }; diff --git a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/internal.nr b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/internal.nr index 9aabae9e6a6c..443daa28f564 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/internal.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/internals_functions_generation/internal.nr @@ -42,7 +42,7 @@ pub(crate) comptime fn generate_private_internal(f: FunctionDefinition) -> Quote let call_self_static: CallSelfStatic<&mut aztec::context::PrivateContext> = CallSelfStatic { address: self_address, context }; let enqueue_self_static: EnqueueSelfStatic<&mut aztec::context::PrivateContext> = EnqueueSelfStatic { address: self_address, context }; let internal: CallInternal<&mut aztec::context::PrivateContext> = CallInternal { context }; - aztec::ContractSelf::new_private(context, storage, call_self, enqueue_self, call_self_static, enqueue_self_static, internal) + aztec::contract_self::ContractSelfPrivate::new(context, storage, call_self, enqueue_self, call_self_static, enqueue_self_static, internal) }; $body @@ -92,7 +92,7 @@ pub(crate) comptime fn generate_public_internal(f: FunctionDefinition) -> Quoted let call_self: CallSelf = CallSelf { address: self_address, context }; let call_self_static: CallSelfStatic = CallSelfStatic { address: self_address, context }; let internal: CallInternal = CallInternal { context }; - aztec::ContractSelf::new_public(context, storage, call_self, call_self_static, internal) + aztec::contract_self::ContractSelfPublic::new(context, storage, call_self, call_self_static, internal) }; $body diff --git a/noir-projects/aztec-nr/aztec/src/macros/storage.nr b/noir-projects/aztec-nr/aztec/src/macros/storage.nr index b9ebe14382a5..a7d9d114f22c 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/storage.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/storage.nr @@ -5,7 +5,9 @@ use std::meta::unquote; /// generating a `storage_layout()` getter on the contract struct. pub comptime mut global STORAGE_LAYOUT_NAME: CHashMap = CHashMap::new(); -/// This function +/// Declares the contract's storage. +/// +/// This function: /// - marks the contract as having storage, so that `macros::utils::module_has_storage` will return true, /// - marks the struct `s` as the one describing the storage layout of a contract, /// - generates an `impl` block for the storage struct with an `init` function (call to `init` is then injected at the diff --git a/noir-projects/aztec-nr/aztec/src/messages/encoding.nr b/noir-projects/aztec-nr/aztec/src/messages/encoding.nr index d810aac2abf2..dc484086cf8a 100644 --- a/noir-projects/aztec-nr/aztec/src/messages/encoding.nr +++ b/noir-projects/aztec-nr/aztec/src/messages/encoding.nr @@ -9,20 +9,22 @@ use crate::utils::array; // fields, so MESSAGE_CIPHERTEXT_LEN is the size of the message in fields. pub global MESSAGE_CIPHERTEXT_LEN: u32 = PRIVATE_LOG_CIPHERTEXT_LEN; -// TODO(#12750): The global variables below should not be here as they are AES128 specific. ciphertext_length (2) + 14 -// bytes pkcs#7 AES padding. +// TODO(#12750): The global variables below should not be here as they are AES128 specific. +// The header plaintext is 2 bytes (ciphertext length), padded to the 16-byte AES block size by PKCS#7. pub(crate) global HEADER_CIPHERTEXT_SIZE_IN_BYTES: u32 = 16; +// AES PKCS#7 always adds at least one byte of padding. Since each plaintext field is 32 bytes (a multiple of the +// 16-byte AES block size), a full 16-byte padding block is always appended. +pub(crate) global AES128_PKCS7_EXPANSION_IN_BYTES: u32 = 16; pub global EPH_PK_X_SIZE_IN_FIELDS: u32 = 1; -pub global EPH_PK_SIGN_BYTE_SIZE_IN_BYTES: u32 = 1; -// (17 - 1) * 31 - 16 - 1 = 479 Note: We multiply by 31 because ciphertext bytes are stored in fields using +// (15 - 1) * 31 - 16 - 16 = 402. Note: We multiply by 31 because ciphertext bytes are stored in fields using // bytes_to_fields, which packs 31 bytes per field (since a Field is ~254 bits and can safely store 31 whole bytes). -global MESSAGE_PLAINTEXT_SIZE_IN_BYTES: u32 = (MESSAGE_CIPHERTEXT_LEN - EPH_PK_X_SIZE_IN_FIELDS) * 31 +pub(crate) global MESSAGE_PLAINTEXT_SIZE_IN_BYTES: u32 = (MESSAGE_CIPHERTEXT_LEN - EPH_PK_X_SIZE_IN_FIELDS) * 31 - HEADER_CIPHERTEXT_SIZE_IN_BYTES - - EPH_PK_SIGN_BYTE_SIZE_IN_BYTES; + - AES128_PKCS7_EXPANSION_IN_BYTES; // The plaintext bytes represent Field values that were originally serialized using fields_to_bytes, which converts -// each Field to 32 bytes. To convert the plaintext bytes back to fields, we divide by 32. 479 / 32 = 14 +// each Field to 32 bytes. To convert the plaintext bytes back to fields, we divide by 32. 402 / 32 = 12 pub global MESSAGE_PLAINTEXT_LEN: u32 = MESSAGE_PLAINTEXT_SIZE_IN_BYTES / 32; pub global MESSAGE_EXPANDED_METADATA_LEN: u32 = 1; @@ -244,4 +246,27 @@ mod tests { assert_eq(original_msg_type, unpacked_msg_type); assert_eq(original_msg_metadata, unpacked_msg_metadata); } + + #[test] + unconstrained fn encode_decode_max_size_message() { + let msg_type_id: u64 = 42; + let msg_metadata: u64 = 99; + let mut msg_content = [0; MAX_MESSAGE_CONTENT_LEN]; + for i in 0..MAX_MESSAGE_CONTENT_LEN { + msg_content[i] = i as Field; + } + + let encoded = encode_message(msg_type_id, msg_metadata, msg_content); + let (decoded_type_id, decoded_metadata, decoded_content) = decode_message(BoundedVec::from_array(encoded)); + + assert_eq(decoded_type_id, msg_type_id); + assert_eq(decoded_metadata, msg_metadata); + assert_eq(decoded_content, BoundedVec::from_array(msg_content)); + } + + #[test(should_fail_with = "Invalid message content: it must have a length of at most MAX_MESSAGE_CONTENT_LEN")] + fn encode_oversized_message_fails() { + let msg_content = [0; MAX_MESSAGE_CONTENT_LEN + 1]; + let _ = encode_message(0, 0, msg_content); + } } diff --git a/noir-projects/aztec-nr/aztec/src/messages/encryption/aes128.nr b/noir-projects/aztec-nr/aztec/src/messages/encryption/aes128.nr index 97f32377be8f..e4b6a07b1a84 100644 --- a/noir-projects/aztec-nr/aztec/src/messages/encryption/aes128.nr +++ b/noir-projects/aztec-nr/aztec/src/messages/encryption/aes128.nr @@ -7,11 +7,11 @@ use crate::protocol::{ }; use crate::{ - keys::{ecdh_shared_secret::derive_ecdh_shared_secret, ephemeral::generate_ephemeral_key_pair}, + keys::{ecdh_shared_secret::derive_ecdh_shared_secret, ephemeral::generate_positive_ephemeral_key_pair}, messages::{ encoding::{ - EPH_PK_SIGN_BYTE_SIZE_IN_BYTES, EPH_PK_X_SIZE_IN_FIELDS, HEADER_CIPHERTEXT_SIZE_IN_BYTES, - MESSAGE_CIPHERTEXT_LEN, MESSAGE_PLAINTEXT_LEN, + EPH_PK_X_SIZE_IN_FIELDS, HEADER_CIPHERTEXT_SIZE_IN_BYTES, MESSAGE_CIPHERTEXT_LEN, MESSAGE_PLAINTEXT_LEN, + MESSAGE_PLAINTEXT_SIZE_IN_BYTES, }, encryption::message_encryption::MessageEncryption, logs::arithmetic_generics_utils::{ @@ -25,7 +25,7 @@ use crate::{ bytes_to_fields::{bytes_from_fields, bytes_to_fields}, fields_to_bytes::{fields_from_bytes, fields_to_bytes}, }, - point::{get_sign_of_point, point_from_x_coord_and_sign}, + point::point_from_x_coord_and_sign, random::get_random_bytes, }, }; @@ -150,20 +150,102 @@ pub fn derive_aes_symmetric_key_and_iv_from_ecdh_shared_secret_using_poseidon2_u pub struct AES128 {} impl MessageEncryption for AES128 { + + /// AES128-CBC encryption for Aztec protocol messages. + /// + /// ## Overview + /// + /// The plaintext is an array of up to `MESSAGE_PLAINTEXT_LEN` (12) fields. The output is always exactly + /// `MESSAGE_CIPHERTEXT_LEN` (15) fields, regardless of plaintext size. Unused trailing fields are filled with + /// random data so that all encrypted messages are indistinguishable by size. + /// + /// ## PKCS#7 Padding + /// + /// AES operates on 16-byte blocks, so the plaintext must be padded to a multiple of 16. PKCS#7 padding always + /// adds at least 1 byte (so the receiver can always detect and strip it), which means: + /// - 1 B plaintext -> 15 B padding -> 16 B total + /// - 15 B plaintext -> 1 B padding -> 16 B total + /// - 16 B plaintext -> 16 B padding -> 32 B total (full extra block) + /// + /// In general: if the plaintext is already a multiple of 16, a full 16-byte padding block is appended. + /// + /// ## Encryption Steps + /// + /// **1. Body encryption.** The plaintext fields are serialized to bytes (32 bytes per field) and AES-128-CBC + /// encrypted. Since 32 is a multiple of 16, PKCS#7 always adds a full 16-byte padding block (see above): + /// + /// ```text + /// +---------------------------------------------+ + /// | body ct | + /// | PlaintextLen*32 + 16 B | + /// +-------------------------------+--------------+ + /// | encrypted plaintext fields | PKCS#7 (16B) | + /// | (serialized at 32 B each) | | + /// +-------------------------------+--------------+ + /// ``` + /// + /// **2. Header encryption.** The byte length of `body_ct` is stored as a 2-byte big-endian integer. This 2-byte + /// header plaintext is then AES-encrypted; PKCS#7 pads the remaining 14 bytes to fill one 16-byte AES block, + /// producing a 16-byte header ciphertext: + /// + /// ```text + /// +---------------------------+ + /// | header ct | + /// | 16 B | + /// +--------+------------------+ + /// | body ct| PKCS#7 (14B) | + /// | length | | + /// | (2 B) | | + /// +--------+------------------+ + /// ``` + /// + /// ## Wire Format + /// + /// Messages are transmitted as fields, not bytes. A field is ~254 bits and can safely store 31 whole bytes, so + /// we need to pack our byte data into 31-byte chunks. This packing drives the wire format. + /// + /// **Step 1 -- Assemble bytes.** The ciphertexts are laid out in a byte array, padded with random bytes to a + /// multiple of 31 so it divides evenly into fields: + /// + /// ```text + /// +------------+-------------------------+---------+ + /// | header ct | body ct | byte pad| + /// | 16 B | PlaintextLen*32 + 16 B | (random)| + /// +------------+-------------------------+---------+ + /// |<-------- padded to a multiple of 31 B -------->| + /// ``` + /// + /// **Step 2 -- Pack into fields.** The byte array is split into 31-byte chunks, each stored in one field. The + /// ephemeral public key x-coordinate is prepended as its own field. Any remaining fields (up to 15 total) are + /// filled with random data so that all messages are the same size: + /// + /// ```text + /// +----------+-------------------------+-------------------+ + /// | eph_pk.x | message-byte fields | random field pad | + /// | | (packed 31 B per field) | (fills to 15) | + /// +----------+-------------------------+-------------------+ + /// |<---------- MESSAGE_CIPHERTEXT_LEN = 15 fields ------->| + /// ``` + /// + /// ## Key Derivation + /// + /// Two (key, IV) pairs are derived from the ECDH shared secret via Poseidon2 hashing with different domain + /// separators: one pair for the body ciphertext and one for the header ciphertext. fn encrypt( plaintext: [Field; PlaintextLen], recipient: AztecAddress, ) -> [Field; MESSAGE_CIPHERTEXT_LEN] { + std::static_assert( + PlaintextLen <= MESSAGE_PLAINTEXT_LEN, + "Plaintext length exceeds MESSAGE_PLAINTEXT_LEN", + ); + // AES 128 operates on bytes, not fields, so we need to convert the fields to bytes. (This process is then // reversed when processing the message in `process_message_ciphertext`) let plaintext_bytes = fields_to_bytes(plaintext); - // ***************************************************************************** Compute the shared secret - // ***************************************************************************** - - let (eph_sk, eph_pk) = generate_ephemeral_key_pair(); - - let eph_pk_sign_byte: u8 = get_sign_of_point(eph_pk) as u8; + // Derive ECDH shared secret with recipient using a fresh ephemeral keypair. + let (eph_sk, eph_pk) = generate_positive_ephemeral_key_pair(); // (not to be confused with the tagging shared secret) TODO (#17158): Currently we unwrap the Option returned // by derive_ecdh_shared_secret. We need to handle the case where the ephemeral public key is invalid to @@ -189,15 +271,7 @@ impl MessageEncryption for AES128 { ); // TODO: also use this shared secret for deriving note randomness. - // ***************************************************************************** Convert the plaintext into - // whatever format the encryption function expects - // ***************************************************************************** - - // Already done for this strategy: AES expects bytes. - - // ***************************************************************************** Encrypt the plaintext - // ***************************************************************************** - + // AES128-CBC encrypt the plaintext bytes. // It is safe to call the `unsafe` function here, because we know the `shared_secret` was derived using an // AztecAddress (the recipient). See the block comment at the start of this unsafe target function for more // info. @@ -209,22 +283,15 @@ impl MessageEncryption for AES128 { let ciphertext_bytes = aes128_encrypt(plaintext_bytes, body_iv, body_sym_key); - // |full_pt| = |pt_length| + |pt| - // |pt_aes_padding| = 16 - (|full_pt| % 16) - // or... since a % b is the same as a - b * (a // b) (integer division), so: - // |pt_aes_padding| = 16 - (|full_pt| - 16 * (|full_pt| // 16)) - // |ct| = |full_pt| + |pt_aes_padding| - // = |full_pt| + 16 - (|full_pt| - 16 * (|full_pt| // 16)) = 16 + 16 * (|full_pt| // 16) = 16 * (1 + - // |full_pt| // 16) + // Each plaintext field is 32 bytes (a multiple of the 16-byte AES block + // size), so PKCS#7 always appends a full 16-byte padding block: + // |ciphertext| = PlaintextLen*32 + 16 = 16 * (1 + PlaintextLen*32 / 16) std::static_assert( ciphertext_bytes.len() == 16 * (1 + (PlaintextLen * 32) / 16), "unexpected ciphertext length", ); - // ***************************************************************************** Compute the header ciphertext - // ***************************************************************************** - - // Header contains only the length of the ciphertext stored in 2 bytes. + // Encrypt a 2-byte header containing the body ciphertext length. let mut header_plaintext: [u8; 2] = [0 as u8; 2]; let ciphertext_bytes_length = ciphertext_bytes.len(); header_plaintext[0] = (ciphertext_bytes_length >> 8) as u8; @@ -233,16 +300,14 @@ impl MessageEncryption for AES128 { // Note: the aes128_encrypt builtin fn automatically appends bytes to the input, according to pkcs#7; hence why // the output `header_ciphertext_bytes` is 16 bytes larger than the input in this case. let header_ciphertext_bytes = aes128_encrypt(header_plaintext, header_iv, header_sym_key); - // I recall that converting a slice to an array incurs constraints, so I'll check the length this way instead: + // Verify expected header ciphertext size at compile time. std::static_assert( header_ciphertext_bytes.len() == HEADER_CIPHERTEXT_SIZE_IN_BYTES, "unexpected ciphertext header length", ); - // ***************************************************************************** Prepend / append more bytes of - // data to the ciphertext, before converting back to fields. - // ***************************************************************************** - + // Assemble the message byte array: + // [header_ct (16B)] [body_ct] [padding to mult of 31] let mut message_bytes_padding_to_mult_31 = get_arr_of_size__message_bytes_padding__from_PT::(); // Safety: this randomness won't be constrained to be random. It's in the interest of the executor of this fn @@ -256,8 +321,7 @@ impl MessageEncryption for AES128 { "Unexpected error: message_bytes.len() should be divisible by 31, by construction.", ); - message_bytes[0] = eph_pk_sign_byte; - let mut offset = 1; + let mut offset = 0; for i in 0..header_ciphertext_bytes.len() { message_bytes[offset + i] = header_ciphertext_bytes[i]; } @@ -279,23 +343,18 @@ impl MessageEncryption for AES128 { // computation used to obtain the offset computes the expected value (which we _can_ do in a static check), and // then add a cheap runtime check to also validate that the offset matches this. std::static_assert( - 1 + header_ciphertext_bytes.len() + ciphertext_bytes.len() + message_bytes_padding_to_mult_31.len() + header_ciphertext_bytes.len() + ciphertext_bytes.len() + message_bytes_padding_to_mult_31.len() == message_bytes.len(), "unexpected message length", ); assert(offset == message_bytes.len(), "unexpected encrypted message length"); - // ***************************************************************************** Convert bytes back to fields - // ***************************************************************************** - + // Pack message bytes into fields (31 bytes per field) and prepend eph_pk.x. // TODO(#12749): As Mike pointed out, we need to make messages produced by different encryption schemes // indistinguishable from each other and for this reason the output here and in the last for-loop of this // function should cover a full field. let message_bytes_as_fields = bytes_to_fields(message_bytes); - // ***************************************************************************** Prepend / append fields, to - // create the final message ***************************************************************************** - let mut ciphertext: [Field; MESSAGE_CIPHERTEXT_LEN] = [0; MESSAGE_CIPHERTEXT_LEN]; ciphertext[0] = eph_pk.x; @@ -334,12 +393,10 @@ impl MessageEncryption for AES128 { // Convert the ciphertext represented as fields to a byte representation (its original format) let ciphertext_without_eph_pk_x = bytes_from_fields(ciphertext_without_eph_pk_x_fields); - // First byte of the ciphertext represents the ephemeral public key sign - let eph_pk_sign_bool = ciphertext_without_eph_pk_x.get(0) != 0; - - // With the sign and the x-coordinate of the ephemeral public key, we can reconstruct the point. This may fail - // however, as not all x-coordinates are on the curve. In that case, we simply return `Option::none`. - point_from_x_coord_and_sign(eph_pk_x, eph_pk_sign_bool).map(|eph_pk| { + // With the x-coordinate of the ephemeral public key we can reconstruct the point as we know that the + // y-coordinate must be positive. This may fail however, as not all x-coordinates are on the curve. In that + // case, we simply return `Option::none`. + point_from_x_coord_and_sign(eph_pk_x, true).map(|eph_pk| { // Derive shared secret let ciphertext_shared_secret = get_shared_secret(recipient, eph_pk); @@ -351,7 +408,7 @@ impl MessageEncryption for AES128 { let (header_sym_key, header_iv) = pairs[1]; // Extract the header ciphertext - let header_start = EPH_PK_SIGN_BYTE_SIZE_IN_BYTES; // Skip eph_pk_sign byte + let header_start = 0; let header_ciphertext: [u8; HEADER_CIPHERTEXT_SIZE_IN_BYTES] = array::subarray(ciphertext_without_eph_pk_x.storage(), header_start); // We need to convert the array to a BoundedVec because the oracle expects a BoundedVec as it's designed to @@ -368,16 +425,16 @@ impl MessageEncryption for AES128 { // Extract and decrypt main ciphertext let ciphertext_start = header_start + HEADER_CIPHERTEXT_SIZE_IN_BYTES; - let ciphertext_with_padding: [u8; (MESSAGE_CIPHERTEXT_LEN - EPH_PK_X_SIZE_IN_FIELDS) * 31 - HEADER_CIPHERTEXT_SIZE_IN_BYTES - EPH_PK_SIGN_BYTE_SIZE_IN_BYTES] = + let ciphertext_with_padding: [u8; MESSAGE_PLAINTEXT_SIZE_IN_BYTES] = array::subarray(ciphertext_without_eph_pk_x.storage(), ciphertext_start); - let ciphertext: BoundedVec = + let ciphertext: BoundedVec = BoundedVec::from_parts(ciphertext_with_padding, ciphertext_length); // Decrypt main ciphertext and return it let plaintext_bytes = aes128_decrypt_oracle(ciphertext, body_iv, body_sym_key); - // Each field of the original note message was serialized to 32 bytes so we convert the bytes back to - // fields. + // Each field of the original message was serialized to 32 bytes so we convert + // the bytes back to fields. fields_from_bytes(plaintext_bytes) }) } @@ -489,6 +546,48 @@ mod test { let _ = AES128::encrypt([1, 2, 3, 4], invalid_address); } + // Documents the PKCS#7 padding behavior that `encrypt` relies on (see its static_assert). + #[test] + fn pkcs7_padding_always_adds_at_least_one_byte() { + let key = [0 as u8; 16]; + let iv = [0 as u8; 16]; + + // 1 byte input + 15 bytes padding = 16 bytes + assert_eq(std::aes128::aes128_encrypt([0; 1], iv, key).len(), 16); + + // 15 bytes input + 1 byte padding = 16 bytes + assert_eq(std::aes128::aes128_encrypt([0; 15], iv, key).len(), 16); + + // 16 bytes input (block-aligned) + full 16-byte padding block = 32 bytes + assert_eq(std::aes128::aes128_encrypt([0; 16], iv, key).len(), 32); + } + + #[test] + unconstrained fn encrypt_decrypt_max_size_plaintext() { + let mut env = TestEnvironment::new(); + let recipient = env.create_light_account(); + + env.private_context(|_| { + let mut plaintext = [0; MESSAGE_PLAINTEXT_LEN]; + for i in 0..MESSAGE_PLAINTEXT_LEN { + plaintext[i] = i as Field; + } + let ciphertext = AES128::encrypt(plaintext, recipient); + + assert_eq( + AES128::decrypt(BoundedVec::from_array(ciphertext), recipient).unwrap(), + BoundedVec::from_array(plaintext), + ); + }); + } + + #[test(should_fail_with = "Plaintext length exceeds MESSAGE_PLAINTEXT_LEN")] + unconstrained fn encrypt_oversized_plaintext() { + let address = AztecAddress { inner: 3 }; + let plaintext: [Field; MESSAGE_PLAINTEXT_LEN + 1] = [0; MESSAGE_PLAINTEXT_LEN + 1]; + let _ = AES128::encrypt(plaintext, address); + } + #[test] unconstrained fn random_address_point_produces_valid_points() { // About half of random addresses are invalid, so testing just a couple gives us high confidence that diff --git a/noir-projects/aztec-nr/aztec/src/messages/logs/arithmetic_generics_utils.nr b/noir-projects/aztec-nr/aztec/src/messages/logs/arithmetic_generics_utils.nr index f9b304e80cd4..6bd7e79a12e4 100644 --- a/noir-projects/aztec-nr/aztec/src/messages/logs/arithmetic_generics_utils.nr +++ b/noir-projects/aztec-nr/aztec/src/messages/logs/arithmetic_generics_utils.nr @@ -31,16 +31,16 @@ fn get_arr_of_size__ciphertext( [0; FullPt + PtAesPadding] } -// Ok, so we have the following bytes: eph_pk_sign, header_ciphertext, ciphertext: Let mbwop = 1 + +// Ok, so we have the following bytes: header_ciphertext, ciphertext: Let mbwop = // HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| // aka message bytes without padding fn get_arr_of_size__message_bytes_without_padding( _ct: [u8; Ct], -) -> [u8; 1 + HEADER_CIPHERTEXT_SIZE_IN_BYTES + Ct] { - [0; 1 + HEADER_CIPHERTEXT_SIZE_IN_BYTES + Ct] +) -> [u8; HEADER_CIPHERTEXT_SIZE_IN_BYTES + Ct] { + [0; HEADER_CIPHERTEXT_SIZE_IN_BYTES + Ct] } // Recall: -// mbwop := 1 + HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| // aka message bytes without padding +// mbwop := HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| // aka message bytes without padding // We now want to pad b to the next multiple of 31, so as to "fill" fields. Let p be that padding. p = 31 * ceil(mbwop // / 31) - mbwop // = 31 * ((mbwop + 30) // 31) - mbwop @@ -51,16 +51,16 @@ fn get_arr_of_size__message_bytes_padding( [0; (31 * ((Mbwop + 30) / 31)) - Mbwop] } -// |message_bytes| = 1 + HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| + p // aka message bytes (with +// |message_bytes| = HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| + p // aka message bytes (with // padding) Recall: -// mbwop := 1 + HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| p is the padding +// mbwop := HEADER_CIPHERTEXT_SIZE_IN_BYTES + |ct| p is the padding fn get_arr_of_size__message_bytes(_mbwop: [u8; MBWOP], _p: [u8; P]) -> [u8; MBWOP + P] { [0; MBWOP + P] } // The return type is pasted from the LSP's expectation, because it was too difficult to match its weird way of doing // algebra. It doesn't know all rules of arithmetic. Pt is the plaintext length. -pub(crate) fn get_arr_of_size__message_bytes_padding__from_PT() -> [u8; ((((((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES + 1) + 30) / 31) * 31) - ((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES + 1))] { +pub(crate) fn get_arr_of_size__message_bytes_padding__from_PT() -> [u8; ((((((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES) + 30) / 31) * 31) - ((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES))] { let full_pt = get_arr_of_size__full_plaintext::(); let pt_aes_padding = get_arr_of_size__plaintext_aes_padding(full_pt); let ct = get_arr_of_size__ciphertext(full_pt, pt_aes_padding); @@ -71,7 +71,7 @@ pub(crate) fn get_arr_of_size__message_bytes_padding__from_PT() -> // The return type is pasted from the LSP's expectation, because it was too difficult to match its weird way of doing // algebra. It doesn't know all rules of arithmetic. -pub(crate) fn get_arr_of_size__message_bytes__from_PT() -> [u8; (((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES + 1) + ((((((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES + 1) + 30) / 31) * 31) - ((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES + 1)))] { +pub(crate) fn get_arr_of_size__message_bytes__from_PT() -> [u8; (((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES) + ((((((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES) + 30) / 31) * 31) - ((Pt + (16 - (Pt % 16))) + HEADER_CIPHERTEXT_SIZE_IN_BYTES)))] { let full_pt = get_arr_of_size__full_plaintext::(); let pt_aes_padding = get_arr_of_size__plaintext_aes_padding(full_pt); let ct = get_arr_of_size__ciphertext(full_pt, pt_aes_padding); diff --git a/noir-projects/aztec-nr/aztec/src/messages/logs/note.nr b/noir-projects/aztec-nr/aztec/src/messages/logs/note.nr index 6b7380b2a197..84a72a48e534 100644 --- a/noir-projects/aztec-nr/aztec/src/messages/logs/note.nr +++ b/noir-projects/aztec-nr/aztec/src/messages/logs/note.nr @@ -89,7 +89,7 @@ mod test { use crate::{ messages::{ encoding::decode_message, - logs::note::{decode_private_note_message, encode_private_note_message}, + logs::note::{decode_private_note_message, encode_private_note_message, MAX_NOTE_PACKED_LEN}, msg_type::PRIVATE_NOTE_MSG_TYPE_ID, }, note::note_interface::NoteType, @@ -121,4 +121,55 @@ mod test { assert_eq(randomness, RANDOMNESS); assert_eq(packed_note, BoundedVec::from_array(note.pack())); } + + #[derive(Packable)] + struct MaxSizeNote { + data: [Field; MAX_NOTE_PACKED_LEN], + } + + impl NoteType for MaxSizeNote { + fn get_id() -> Field { + 0 + } + } + + #[test] + unconstrained fn encode_decode_max_size_note() { + let mut data = [0; MAX_NOTE_PACKED_LEN]; + for i in 0..MAX_NOTE_PACKED_LEN { + data[i] = i as Field; + } + let note = MaxSizeNote { data }; + + let encoded = encode_private_note_message(note, OWNER, STORAGE_SLOT, RANDOMNESS); + let (msg_type_id, msg_metadata, msg_content) = decode_message(BoundedVec::from_array(encoded)); + + assert_eq(msg_type_id, PRIVATE_NOTE_MSG_TYPE_ID); + + let (note_type_id, owner, storage_slot, randomness, packed_note) = + decode_private_note_message(msg_metadata, msg_content); + + assert_eq(note_type_id, MaxSizeNote::get_id()); + assert_eq(owner, OWNER); + assert_eq(storage_slot, STORAGE_SLOT); + assert_eq(randomness, RANDOMNESS); + assert_eq(packed_note, BoundedVec::from_array(data)); + } + + #[derive(Packable)] + struct OversizedNote { + data: [Field; MAX_NOTE_PACKED_LEN + 1], + } + + impl NoteType for OversizedNote { + fn get_id() -> Field { + 0 + } + } + + #[test(should_fail_with = "Invalid message content: it must have a length of at most MAX_MESSAGE_CONTENT_LEN")] + fn encode_oversized_note_fails() { + let note = OversizedNote { data: [0; MAX_NOTE_PACKED_LEN + 1] }; + let _ = encode_private_note_message(note, OWNER, STORAGE_SLOT, RANDOMNESS); + } } diff --git a/noir-projects/aztec-nr/aztec/src/messages/processing/event_validation_request.nr b/noir-projects/aztec-nr/aztec/src/messages/processing/event_validation_request.nr index f7ed86b32672..8e757e1fbf1c 100644 --- a/noir-projects/aztec-nr/aztec/src/messages/processing/event_validation_request.nr +++ b/noir-projects/aztec-nr/aztec/src/messages/processing/event_validation_request.nr @@ -42,7 +42,7 @@ mod test { 3, // randomness 4, // serialized_event[0] 5, // serialized_event[1] - 0, 0, 0, 0, 0, 0, 0, 0, 0, // serialized_event padding + 0, 0, 0, 0, 0, 0, 0, 0, // serialized_event padding 2, // bounded_vec_len 6, // event_commitment 7, // tx_hash diff --git a/noir-projects/aztec-nr/aztec/src/messages/processing/note_validation_request.nr b/noir-projects/aztec-nr/aztec/src/messages/processing/note_validation_request.nr index 060fb61eb3a6..00d0e1ef4738 100644 --- a/noir-projects/aztec-nr/aztec/src/messages/processing/note_validation_request.nr +++ b/noir-projects/aztec-nr/aztec/src/messages/processing/note_validation_request.nr @@ -55,7 +55,6 @@ mod test { 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000, - 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000000000000000000000000000006, 0x0000000000000000000000000000000000000000000000000000000000000007, diff --git a/noir-projects/aztec-nr/aztec/src/oracle/block_header.nr b/noir-projects/aztec-nr/aztec/src/oracle/block_header.nr index b64cc518a72e..99fd5edcbc77 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/block_header.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/block_header.nr @@ -11,7 +11,7 @@ unconstrained fn get_block_header_at_internal(block_number: u32) -> BlockHeader pub fn get_block_header_at(block_number: u32, context: PrivateContext) -> BlockHeader { let anchor_block_header = context.anchor_block_header; - let anchor_block_number = anchor_block_header.global_variables.block_number; + let anchor_block_number = anchor_block_header.block_number(); if (block_number == anchor_block_number) { // If the block number we want to prove against is the same as the block number in the historical header we @@ -68,7 +68,7 @@ fn constrain_get_block_header_at_internal( // 4) Check that the header hint has the same block number as the block number we are looking for, ensuring we are // actually grabbing the header we specify assert_eq( - header_hint.global_variables.block_number, + header_hint.block_number(), block_number, "Block number provided is not the same as the block number from the header hint", ); @@ -91,7 +91,7 @@ mod test { env.private_context(|context| { let anchor_block_header = context.anchor_block_header; - let target_block_number = anchor_block_header.global_variables.block_number - 2; + let target_block_number = anchor_block_header.block_number() - 2; let bad_header = get_block_header_at_internal(target_block_number); // We pass in a different block number than the header received diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr index 1f7ac771c3da..78cd64900a7b 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable.nr @@ -166,6 +166,34 @@ impl DelayedPublicMutable { + /// paused: DelayedPublicMutable, + /// fee: DelayedPublicMutable, + /// } + /// + /// // Good: both `paused` and `fee` are retrieved in a single historical public storage read + /// #[derive(Packable)] + /// struct Config { + /// paused: bool, + /// fee: Field, + /// } + /// + /// #[storage] + /// struct Storage { + /// config: DelayedPublicMutable, + /// } + /// ``` pub fn get_current_value(self) -> T where T: Packable, @@ -202,12 +230,10 @@ where let header = self.context.get_anchor_block_header(); let address = self.context.this_address(); - let anchor_block_timestamp = header.global_variables.timestamp; - let values: DelayedPublicMutableValues = WithHash::historical_public_storage_read(header, address, self.storage_slot); - (values.svc, values.sdc, anchor_block_timestamp) + (values.svc, values.sdc, header.timestamp()) } } diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable/test.nr b/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable/test.nr index 1c10fd0e376e..8a190319d3fc 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable/test.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/delayed_public_mutable/test.nr @@ -230,7 +230,7 @@ unconstrained fn get_current_value_in_private_initial() { assert_eq(state_var.get_current_value(), zeroed()); assert_eq( context.expiration_timestamp, - context.get_anchor_block_header().global_variables.timestamp + TEST_INITIAL_DELAY - 1, + context.get_anchor_block_header().timestamp() + TEST_INITIAL_DELAY - 1, ); }); } @@ -271,7 +271,7 @@ unconstrained fn get_current_value_in_private_immediately_before_change() { env.private_context(|context| { // Make sure we're at a block with the expected timestamp - assert_eq(context.get_anchor_block_header().global_variables.timestamp, timestamp_of_change - 1); + assert_eq(context.get_anchor_block_header().timestamp(), timestamp_of_change - 1); let state_var = in_private(context); @@ -298,14 +298,14 @@ unconstrained fn get_current_value_in_private_at_change() { env.private_context(|context| { // Make sure we're at a block with the expected timestamp - assert_eq(context.get_anchor_block_header().global_variables.timestamp, timestamp_of_change); + assert_eq(context.get_anchor_block_header().timestamp(), timestamp_of_change); let state_var = in_private(context); assert_eq(state_var.get_current_value(), new_value); assert_eq( context.expiration_timestamp, - context.get_anchor_block_header().global_variables.timestamp + TEST_INITIAL_DELAY - 1, + context.get_anchor_block_header().timestamp() + TEST_INITIAL_DELAY - 1, ); }); } @@ -326,14 +326,14 @@ unconstrained fn get_current_value_in_private_after_change() { env.private_context(|context| { // Make sure we're at a block with the expected timestamp - assert_eq(context.get_anchor_block_header().global_variables.timestamp, timestamp_of_change + 10); + assert_eq(context.get_anchor_block_header().timestamp(), timestamp_of_change + 10); let state_var = in_private(context); assert_eq(state_var.get_current_value(), new_value); assert_eq( context.expiration_timestamp, - context.get_anchor_block_header().global_variables.timestamp + TEST_INITIAL_DELAY - 1, + context.get_anchor_block_header().timestamp() + TEST_INITIAL_DELAY - 1, ); }); } @@ -356,7 +356,7 @@ unconstrained fn get_current_value_in_private_with_non_initial_delay() { env.private_context(|context| { // Make sure we're at a block with the expected timestamp - assert_eq(context.get_anchor_block_header().global_variables.timestamp, anchor_block_timestamp); + assert_eq(context.get_anchor_block_header().timestamp(), anchor_block_timestamp); let state_var = in_private(context); diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr b/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr index 404011c407fe..f050e2aa8f0b 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/mod.nr @@ -7,6 +7,62 @@ //! Due to Aztec contracts being able to store both public and private state, there are many more different types of //! state variables, each with their nuance and use cases. Understanding these is key to understanding how a contract //! works. +//! +//! ## Packing for Efficient Access +//! +//! Because all state variables are fully independent, when a contract reads or writes one of them all others are left +//! untouched. This is good for isolation, but in some cases users may want to group variables together for more +//! efficient access, for example to access multiple values in a single storage read or write. +//! +//! The pattern to follow is to **group related values in a `struct`**, just like in Solidity. How values are packed +//! inside this `struct` is governed by the [`crate::protocol::traits::Packable`] trait, which must be `#[derive]`'d or +//! manually implemented - see the [`Packable`](crate::protocol::traits::Packable)'s docs on how to do this. +//! +//! ```noir +//! // Inefficient reads and writes - each bool is assigned a distinct storage slot, so reading or writing both +//! requires +//! // executing `SLOAD` or `SSTORE` twice. +//! #[storage] +//! struct Storage { +//! a: PublicMutable, +//! b: PublicMutable, +//! } +//! +//! // By storing the booleans in a single struct and implementing the Packable trait with tight packing, we can now +//! // read and write both values in a single `SLOAD` or `SSTORE` opcode. +//! struct TwoBooleans { +//! a: bool, +//! b: bool, +//! } +//! +//! impl aztec::protocol::traits::Packable for TwoBooleans { +//! let N: u32 = 1; +//! +//! fn pack(self) -> [Field; Self::N] { +//! [(self.a as Field) * 2.pow_32(1) + (self.b as Field)] +//! } +//! +//! fn unpack(packed: [Field; Self::N]) -> Self { +//! let b = (packed[0] as u1) != 0; +//! let a = (((packed[0] - b as Field) / 2.pow_32(1)) as u1) != 0; +//! +//! Self { a, b } +//! } +//! } +//! +//! #[storage] +//! struct Storage { +//! a_and_b: PublicMutable, +//! } +//! ``` +//! +//! Note that private state variables and public ones that can be read from private (like +//! [`PublicImmutable`](crate::state_vars::PublicImmutable) and +//! [`DelayedPublicMutable`](crate::state_vars::DelayedPublicMutable)) benefit from packing multiple values in the same +//! `struct` even if there is no need for tight packing (e.g. if all values are `Field`s), since they often work by +//! reading the _hash_ of the entire value. Many values in the same `struct` will result in a single hash, and +//! therefore +//! a single read. mod state_variable; pub use state_variable::StateVariable; diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr index 723d48135594..2db7c2f325e4 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr @@ -30,7 +30,7 @@ mod test; /// Unlike [`PublicMutable`](crate::state_vars::PublicMutable) it is **also** possible to read a `PublicImmutable` from /// a /// private contract function, though it is not possible to initialize one. A common pattern is to have these functions -/// [enqueue a public self calls](crate::contract_self::ContractSelf::enqueue_self) in which the initialization +/// [enqueue a public self calls](crate::contract_self::ContractSelfPrivate::enqueue) in which the initialization /// operation is performed. /// /// For a mutable (with restrictions) variant which also can be read from private functions see @@ -287,11 +287,10 @@ impl PublicImmutable { /// ## Cost /// /// A nullifier existence request is pushed to the context, which will be verified by the kernel circuit. - /// Additionally, a historical public storage read at the anchor block is performed for a single storage slot, - /// **regardless of `T`'s packed length**. This is because [`PublicImmutable::initialize`] stores not just the - /// value - /// but also its hash: this function obtains the preimage from an oracle and proves that it matches the hash from - /// public storage. + /// Additionally, a historical public storage read at the anchor block (which is on the order of 4k gates) is + /// performed for a single storage slot, **regardless of `T`'s packed length**. This is because + /// [`PublicImmutable::initialize`] stores not just the value but also its hash: this function obtains the preimage + /// from an oracle and proves that it matches the hash from public storage. /// /// Because of this reason it is convenient to group together all of a contract's public immutable values that are /// read privately in a single type `T`: diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr index 5500059ef84b..c7f53d505d9d 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr @@ -15,7 +15,8 @@ use crate::state_vars::StateVariable; /// A value stored in a `PublicMutable` can be read and written from public contract functions. /// /// It is not possible to read or write a `PublicMutable` from private contract functions. A common pattern is to have -/// these functions [enqueue a public self calls](crate::contract_self::ContractSelf::enqueue_self) in which the +/// these functions [enqueue a public self +/// calls](crate::contract_self::ContractSelfPrivate::enqueue) in which the /// required operation is performed. /// /// For an immutable variant which can be read from private functions, see diff --git a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr index dd2cf8a241dc..7d27bfc02aa6 100644 --- a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr +++ b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr @@ -550,14 +550,14 @@ impl TestEnvironment { /// ```noir /// let caller = env.create_light_account(); /// let contract_addr = env.deploy("SampleContract").without_initializer(); - /// let return_value = env.simulate_utility(SampleContract::at(contract_addr).sample_utility_function()); + /// let return_value = env.execute_utility(SampleContract::at(contract_addr).sample_utility_function()); /// ``` - pub unconstrained fn simulate_utility(_self: Self, call: UtilityCall) -> T + pub unconstrained fn execute_utility(_self: Self, call: UtilityCall) -> T where T: Deserialize, { let serialized_return_values = - txe_oracles::simulate_utility_function(call.target_contract, call.selector, call.args); + txe_oracles::execute_utility_function(call.target_contract, call.selector, call.args); T::deserialize(serialized_return_values) } diff --git a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/private_context.nr b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/private_context.nr index 095124c6b762..5d31ca1768a3 100644 --- a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/private_context.nr +++ b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/private_context.nr @@ -24,14 +24,14 @@ unconstrained fn opts_sets_contract_address_and_anchor_block_number() { }); env.private_context_opts(PrivateContextOptions::new().at_anchor_block_number(anchor_block_number), |context| { - assert_eq(context.get_anchor_block_header().global_variables.block_number, anchor_block_number); + assert_eq(context.get_anchor_block_header().block_number(), anchor_block_number); }); env.private_context_opts( PrivateContextOptions::new().at_contract_address(contract_address).at_anchor_block_number(anchor_block_number), |context| { assert_eq(context.this_address(), contract_address); - assert_eq(context.get_anchor_block_header().global_variables.block_number, anchor_block_number); + assert_eq(context.get_anchor_block_header().block_number(), anchor_block_number); }, ); } @@ -42,19 +42,15 @@ unconstrained fn uses_last_block_number() { let last_block_number = env.last_block_number(); - env.private_context(|context| { - assert_eq(last_block_number, context.get_anchor_block_header().global_variables.block_number); - }); + env.private_context(|context| { assert_eq(last_block_number, context.get_anchor_block_header().block_number()); }); } #[test] unconstrained fn advances_block_number() { let env = TestEnvironment::new(); - let first_block_number = - env.private_context(|context| context.get_anchor_block_header().global_variables.block_number); - let second_block_number = - env.private_context(|context| context.get_anchor_block_header().global_variables.block_number); + let first_block_number = env.private_context(|context| context.get_anchor_block_header().block_number()); + let second_block_number = env.private_context(|context| context.get_anchor_block_header().block_number()); assert_eq(second_block_number, first_block_number + 1); } diff --git a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/time.nr b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/time.nr index db1237105ded..514e2f175098 100644 --- a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/time.nr +++ b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment/test/time.nr @@ -50,9 +50,7 @@ unconstrained fn set_next_block_timestamp_sets_next_private_context_inclusion_bl // Note that for private_context what is set is the timestamp of the block that'll be created with the effects // collected there - NOT the timestamp of the anchor block in the context, which corresponds to the last block's // timestamp. - env.private_context(|context| { - assert_eq(context.get_anchor_block_header().global_variables.timestamp, last_block_timestamp); - }); + env.private_context(|context| { assert_eq(context.get_anchor_block_header().timestamp(), last_block_timestamp); }); assert_eq(env.last_block_timestamp(), expected_next_block_timestamp); } diff --git a/noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr b/noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr index 74a5cedf307d..f9fe915c9c46 100644 --- a/noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr +++ b/noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr @@ -55,12 +55,12 @@ pub unconstrained fn public_call_new_flow( public_call_new_flow_oracle(from, contract_address, calldata, is_static_call) } -pub unconstrained fn simulate_utility_function( +pub unconstrained fn execute_utility_function( contract_address: AztecAddress, function_selector: FunctionSelector, args: [Field; M], ) -> [Field; N] { - simulate_utility_function_oracle(contract_address, function_selector, args) + execute_utility_function_oracle(contract_address, function_selector, args) } #[oracle(txeGetNextBlockNumber)] @@ -145,8 +145,8 @@ unconstrained fn public_call_new_flow_oracle( is_static_call: bool, ) -> [Field; N] {} -#[oracle(txeSimulateUtilityFunction)] -unconstrained fn simulate_utility_function_oracle( +#[oracle(txeExecuteUtilityFunction)] +unconstrained fn execute_utility_function_oracle( contract_address: AztecAddress, function_selector: FunctionSelector, args: [Field; M], diff --git a/noir-projects/bootstrap.sh b/noir-projects/bootstrap.sh index 1de289dfa151..9bd80aeea54a 100755 --- a/noir-projects/bootstrap.sh +++ b/noir-projects/bootstrap.sh @@ -38,6 +38,13 @@ function format { parallel -k ./{}/bootstrap.sh format ::: noir-protocol-circuits noir-contracts aztec-nr } +function pin-build { + echo_header "noir-projects pin-build" + parallel --tag --line-buffered --halt now,fail=1 './{}/bootstrap.sh pin-build' ::: \ + mock-protocol-circuits \ + noir-protocol-circuits +} + case "$cmd" in "") build diff --git a/noir-projects/mock-protocol-circuits/pinned-build.tar.gz b/noir-projects/mock-protocol-circuits/pinned-build.tar.gz new file mode 100644 index 000000000000..05ce20597ab3 Binary files /dev/null and b/noir-projects/mock-protocol-circuits/pinned-build.tar.gz differ diff --git a/noir-projects/noir-contracts/Nargo.toml b/noir-projects/noir-contracts/Nargo.toml index 41842163ae57..43817825a1a2 100644 --- a/noir-projects/noir-contracts/Nargo.toml +++ b/noir-projects/noir-contracts/Nargo.toml @@ -36,6 +36,7 @@ members = [ "contracts/protocol_interface/contract_instance_registry_interface", "contracts/protocol_interface/fee_juice_interface", "contracts/test/generic_proxy_contract", + "contracts/test/abi_types_contract", "contracts/test/auth_wit_test_contract", "contracts/test/avm_gadgets_test_contract", "contracts/test/avm_initializer_test_contract", diff --git a/noir-projects/noir-contracts/bootstrap.sh b/noir-projects/noir-contracts/bootstrap.sh index fe6b671029c3..51a319d8da8a 100755 --- a/noir-projects/noir-contracts/bootstrap.sh +++ b/noir-projects/noir-contracts/bootstrap.sh @@ -213,6 +213,13 @@ function build { rm -rf target mkdir -p $tmp_dir local contracts=$(grep -oP "(?<=$folder_name/)[^\"]+" Nargo.toml) + + # If pinned protocol contracts exist, extract them and skip their compilation. + if [ -f pinned-protocol-contracts.tar.gz ]; then + echo_stderr "Using pinned-protocol-contracts.tar.gz for protocol contracts." + tar xzf pinned-protocol-contracts.tar.gz -C target + contracts=$(echo "$contracts" | grep -v "^protocol/") + fi else local contracts="$@" fi @@ -247,7 +254,7 @@ function test { # Starting txe servers with incrementing port numbers. # Base port is below the Linux ephemeral range (32768-60999) to avoid conflicts. local txe_base_port=14730 - export NUM_TXES=8 + export NUM_TXES=1 trap 'kill $(jobs -p) &>/dev/null || true' EXIT for i in $(seq 0 $((NUM_TXES-1))); do check_port $((txe_base_port + i)) || echo "WARNING: port $((txe_base_port + i)) is in use, TXE $i may fail to start" @@ -276,6 +283,18 @@ function format { $NARGO fmt } +function pin-protocol-contracts { + # Force a real build by removing any existing pinned archive. + rm -f pinned-protocol-contracts.tar.gz + local protocol_contracts=$(grep -oP '(?<=contracts/)[^"]+' Nargo.toml | grep "^protocol/") + build $protocol_contracts + # Create the pinned tarball from the built protocol contract artifacts. + local protocol_artifacts=$(jq -r '.[]' protocol_contracts.json | sed 's/$/.json/') + echo_stderr "Creating pinned-protocol-contracts.tar.gz..." + (cd target && tar czf ../pinned-protocol-contracts.tar.gz $protocol_artifacts) + echo_stderr "Done. pinned-protocol-contracts.tar.gz created. Commit it to pin these artifacts." +} + case "$cmd" in "clean-keys") for artifact in target/*.json; do @@ -290,6 +309,9 @@ case "$cmd" in "compile") VERBOSE=${VERBOSE:-1} build "$@" ;; + "pin-protocol-contracts") + pin-protocol-contracts + ;; *) default_cmd_handler "$@" ;; diff --git a/noir-projects/noir-contracts/contracts/app/amm_contract/src/test/test.nr b/noir-projects/noir-contracts/contracts/app/amm_contract/src/test/test.nr index 57971f5a7105..e97677d73e3a 100644 --- a/noir-projects/noir-contracts/contracts/app/amm_contract/src/test/test.nr +++ b/noir-projects/noir-contracts/contracts/app/amm_contract/src/test/test.nr @@ -76,9 +76,9 @@ unconstrained fn add_liquidity_twice_and_remove_liquidity() { ); // Liquidity provider 2 should have 0 token0 and the refund amount of token1 - assert_eq(env.simulate_utility(token0.balance_of_private(liquidity_provider_2)), 0); + assert_eq(env.execute_utility(token0.balance_of_private(liquidity_provider_2)), 0); assert_eq( - env.simulate_utility(token1.balance_of_private(liquidity_provider_2)), + env.execute_utility(token1.balance_of_private(liquidity_provider_2)), expected_refund_amount1, ); @@ -86,7 +86,7 @@ unconstrained fn add_liquidity_twice_and_remove_liquidity() { let expected_liquidity_tokens = (expected_amount_0_in * initial_liquidity_token_supply) / initial_amount0; assert_eq( - env.simulate_utility(liquidity_token.balance_of_private(liquidity_provider_2)), + env.execute_utility(liquidity_token.balance_of_private(liquidity_provider_2)), expected_liquidity_tokens, ); @@ -111,17 +111,17 @@ unconstrained fn add_liquidity_twice_and_remove_liquidity() { let expected_token1_back = (liquidity_to_remove * initial_amount1) / initial_liquidity_token_supply; assert_eq( - env.simulate_utility(token0.balance_of_private(liquidity_provider_1)), + env.execute_utility(token0.balance_of_private(liquidity_provider_1)), expected_token0_back, ); assert_eq( - env.simulate_utility(token1.balance_of_private(liquidity_provider_1)), + env.execute_utility(token1.balance_of_private(liquidity_provider_1)), expected_token1_back, ); // Check remaining liquidity tokens assert_eq( - env.simulate_utility(liquidity_token.balance_of_private(liquidity_provider_1)), + env.execute_utility(liquidity_token.balance_of_private(liquidity_provider_1)), // The expected remaining liquidity is the other half of the initial liquidity. AMM::INITIAL_LIQUIDITY / 2, ); @@ -182,9 +182,9 @@ unconstrained fn swap_exact_tokens_for_tokens() { ); // Verify swap occurred - all of input tokens should be spent and hence the swapper should have 0 token0 balance. - assert_eq(env.simulate_utility(token0.balance_of_private(swapper)), 0); + assert_eq(env.execute_utility(token0.balance_of_private(swapper)), 0); // The exact amount out depends on the AMM formula, but should be > amount_out_min - assert(env.simulate_utility(token1.balance_of_private(swapper)) >= amount_out_min); + assert(env.execute_utility(token1.balance_of_private(swapper)) >= amount_out_min); } #[test] @@ -243,9 +243,9 @@ unconstrained fn swap_tokens_for_exact_tokens() { ); // Verify swap occurred - should get exact amount out - assert_eq(env.simulate_utility(token1.balance_of_private(swapper)), amount_out); + assert_eq(env.execute_utility(token1.balance_of_private(swapper)), amount_out); // Should have some token0 change returned - let swapper_token0_balance = env.simulate_utility(token0.balance_of_private(swapper)); + let swapper_token0_balance = env.execute_utility(token0.balance_of_private(swapper)); assert(swapper_token0_balance > 0); assert(swapper_token0_balance < amount_in_max); } diff --git a/noir-projects/noir-contracts/contracts/app/auth_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/auth_contract/src/main.nr index 06639df1a95f..836d8b4af942 100644 --- a/noir-projects/noir-contracts/contracts/app/auth_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/auth_contract/src/main.nr @@ -13,8 +13,8 @@ pub contract Auth { }; // docs:start:delayed_public_mutable_storage - // Authorizing a new address has a certain delay before it goes into effect. Set to 180 seconds which is 5 slots. - pub(crate) global CHANGE_AUTHORIZED_DELAY: u64 = 180; + // Authorizing a new address has a certain delay before it goes into effect. Set to 360 seconds which is 5 slots. + pub(crate) global CHANGE_AUTHORIZED_DELAY: u64 = 360; #[storage] struct Storage { diff --git a/noir-projects/noir-contracts/contracts/app/nft_contract/src/test/utils.nr b/noir-projects/noir-contracts/contracts/app/nft_contract/src/test/utils.nr index ab1244debcc3..0d2ef11d9077 100644 --- a/noir-projects/noir-contracts/contracts/app/nft_contract/src/test/utils.nr +++ b/noir-projects/noir-contracts/contracts/app/nft_contract/src/test/utils.nr @@ -72,7 +72,7 @@ pub unconstrained fn assert_owns_private_nft( token_id: Field, ) { let (private_nfts, _) = - env.simulate_utility(NFT::at(nft_contract_address).get_private_nfts(owner, 0)); + env.execute_utility(NFT::at(nft_contract_address).get_private_nfts(owner, 0)); let mut nft_found = false; for obtained_token_id in private_nfts { diff --git a/noir-projects/noir-contracts/contracts/app/orderbook_contract/src/test/test.nr b/noir-projects/noir-contracts/contracts/app/orderbook_contract/src/test/test.nr index b2334e056e66..b3786a5bd95b 100644 --- a/noir-projects/noir-contracts/contracts/app/orderbook_contract/src/test/test.nr +++ b/noir-projects/noir-contracts/contracts/app/orderbook_contract/src/test/test.nr @@ -45,7 +45,7 @@ unconstrained fn full_flow() { ); // Get order and verify it's active - let (order, is_fulfilled) = env.simulate_utility(orderbook.get_order(order_id)); + let (order, is_fulfilled) = env.execute_utility(orderbook.get_order(order_id)); assert_eq(order.bid_amount, BID_AMOUNT); assert_eq(order.ask_amount, ASK_AMOUNT); @@ -54,7 +54,7 @@ unconstrained fn full_flow() { // Verify that all maker's tokens were transferred to orderbook's public balance assert_eq(env.view_public(token0.balance_of_public(orderbook_address)), BID_AMOUNT); - assert_eq(env.simulate_utility(token0.balance_of_private(maker)), 0); + assert_eq(env.execute_utility(token0.balance_of_private(maker)), 0); // ORDER FULFILLMENT @@ -72,13 +72,13 @@ unconstrained fn full_flow() { env.call_private(taker, orderbook.fulfill_order(order_id, FULFILL_ORDER_AUTHWIT_NONCE)); // Verify final balances - assert_eq(env.simulate_utility(token0.balance_of_private(maker)), 0); - assert_eq(env.simulate_utility(token1.balance_of_private(maker)), ASK_AMOUNT); - assert_eq(env.simulate_utility(token0.balance_of_private(taker)), BID_AMOUNT); - assert_eq(env.simulate_utility(token1.balance_of_private(taker)), 0); + assert_eq(env.execute_utility(token0.balance_of_private(maker)), 0); + assert_eq(env.execute_utility(token1.balance_of_private(maker)), ASK_AMOUNT); + assert_eq(env.execute_utility(token0.balance_of_private(taker)), BID_AMOUNT); + assert_eq(env.execute_utility(token1.balance_of_private(taker)), 0); // Get order and verify it's fulfilled - let (order, is_fulfilled) = env.simulate_utility(orderbook.get_order(order_id)); + let (order, is_fulfilled) = env.execute_utility(orderbook.get_order(order_id)); assert_eq(order.bid_amount, BID_AMOUNT); assert_eq(order.ask_amount, ASK_AMOUNT); diff --git a/noir-projects/noir-contracts/contracts/app/token_contract/src/test/utils.nr b/noir-projects/noir-contracts/contracts/app/token_contract/src/test/utils.nr index b3e4fd7b0abc..67edae1007d3 100644 --- a/noir-projects/noir-contracts/contracts/app/token_contract/src/test/utils.nr +++ b/noir-projects/noir-contracts/contracts/app/token_contract/src/test/utils.nr @@ -81,7 +81,7 @@ pub unconstrained fn check_private_balance( address_amount: u128, ) { assert_eq( - env.simulate_utility(Token::at(token_contract_address).balance_of_private(address)), + env.execute_utility(Token::at(token_contract_address).balance_of_private(address)), address_amount, ); } diff --git a/noir-projects/noir-contracts/contracts/test/abi_types_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/test/abi_types_contract/Nargo.toml new file mode 100644 index 000000000000..9986f5273493 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/test/abi_types_contract/Nargo.toml @@ -0,0 +1,8 @@ +[package] +name = "abi_types_contract" +authors = [""] +compiler_version = ">=0.25.0" +type = "contract" + +[dependencies] +aztec = { path = "../../../../aztec-nr/aztec" } diff --git a/noir-projects/noir-contracts/contracts/test/abi_types_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/abi_types_contract/src/main.nr new file mode 100644 index 000000000000..2952925403c6 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/test/abi_types_contract/src/main.nr @@ -0,0 +1,52 @@ +// A contract used for testing that different types are supported as types on external functions (both public, private +// and utility). + +mod test; + +use aztec::macros::aztec; + +#[aztec] +pub contract AbiTypes { + use aztec::{macros::functions::external, protocol::traits::{Deserialize, Serialize}}; + + #[derive(Serialize, Deserialize, Eq)] + pub struct CustomStruct { + pub w: Field, + pub x: bool, + pub y: u64, + pub z: i64, + } + + #[external("public")] + fn return_public_parameters( + a: bool, + b: Field, + c: u64, + d: i64, + e: CustomStruct, + ) -> (bool, Field, u64, i64, CustomStruct) { + (a, b, c, d, e) + } + + #[external("private")] + fn return_private_parameters( + a: bool, + b: Field, + c: u64, + d: i64, + e: CustomStruct, + ) -> (bool, Field, u64, i64, CustomStruct) { + (a, b, c, d, e) + } + + #[external("utility")] + unconstrained fn return_utility_parameters( + a: bool, + b: Field, + c: u64, + d: i64, + e: CustomStruct, + ) -> (bool, Field, u64, i64, CustomStruct) { + (a, b, c, d, e) + } +} diff --git a/noir-projects/noir-contracts/contracts/test/abi_types_contract/src/test.nr b/noir-projects/noir-contracts/contracts/test/abi_types_contract/src/test.nr new file mode 100644 index 000000000000..2e725716aae7 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/test/abi_types_contract/src/test.nr @@ -0,0 +1,124 @@ +use crate::AbiTypes; +use crate::AbiTypes::CustomStruct; +use aztec::{protocol::constants::MAX_FIELD_VALUE, test::helpers::test_environment::TestEnvironment}; + +global U64_MAX: u64 = (2.pow_32(64) - 1) as u64; + +global I64_MAX: i64 = (2.pow_32(63) - 1) as i64; +global I64_MIN: i64 = -I64_MAX - 1; + +#[test] +unconstrained fn pass_public_parameters() { + let mut env = TestEnvironment::new(); + let sender = env.create_light_account(); + + let abi_types = AbiTypes::at(env.deploy("AbiTypes").without_initializer()); + + let min_range_return_values = env.call_public( + sender, + abi_types.return_public_parameters( + false, + 0, + 0, + I64_MIN, + CustomStruct { w: 0, x: false, y: 0, z: I64_MIN }, + ), + ); + assert_eq( + min_range_return_values, + (false, 0, 0, I64_MIN, CustomStruct { w: 0, x: false, y: 0, z: I64_MIN }), + ); + + let max_range_return_values = env.call_public( + sender, + abi_types.return_public_parameters( + true, + MAX_FIELD_VALUE, + U64_MAX, + I64_MAX, + CustomStruct { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ), + ); + assert_eq( + max_range_return_values, + ( + true, MAX_FIELD_VALUE, U64_MAX, I64_MAX, + CustomStruct { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ), + ); +} + +#[test] +unconstrained fn pass_private_parameters() { + let mut env = TestEnvironment::new(); + let sender = env.create_light_account(); + + let abi_types = AbiTypes::at(env.deploy("AbiTypes").without_initializer()); + + let min_range_return_values = env.call_private( + sender, + abi_types.return_private_parameters( + false, + 0, + 0, + I64_MIN, + CustomStruct { w: 0, x: false, y: 0, z: I64_MIN }, + ), + ); + assert_eq( + min_range_return_values, + (false, 0, 0, I64_MIN, CustomStruct { w: 0, x: false, y: 0, z: I64_MIN }), + ); + + let max_range_return_values = env.call_private( + sender, + abi_types.return_private_parameters( + true, + MAX_FIELD_VALUE, + U64_MAX, + I64_MAX, + CustomStruct { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ), + ); + assert_eq( + max_range_return_values, + ( + true, MAX_FIELD_VALUE, U64_MAX, I64_MAX, + CustomStruct { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ), + ); +} + +#[test] +unconstrained fn pass_utility_parameters() { + let mut env = TestEnvironment::new(); + + let abi_types = AbiTypes::at(env.deploy("AbiTypes").without_initializer()); + + let min_range_return_values = env.execute_utility(abi_types.return_utility_parameters( + false, + 0, + 0, + I64_MIN, + CustomStruct { w: 0, x: false, y: 0, z: I64_MIN }, + )); + assert_eq( + min_range_return_values, + (false, 0, 0, I64_MIN, CustomStruct { w: 0, x: false, y: 0, z: I64_MIN }), + ); + + let max_range_return_values = env.execute_utility(abi_types.return_utility_parameters( + true, + MAX_FIELD_VALUE, + U64_MAX, + I64_MAX, + CustomStruct { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + )); + assert_eq( + max_range_return_values, + ( + true, MAX_FIELD_VALUE, U64_MAX, I64_MAX, + CustomStruct { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ), + ); +} diff --git a/noir-projects/noir-contracts/contracts/test/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/counter_contract/src/main.nr index ef220deef8b1..6a735d3af490 100644 --- a/noir-projects/noir-contracts/contracts/test/counter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/counter_contract/src/main.nr @@ -110,7 +110,7 @@ pub contract Counter { // Read the stored value in the note let initial_counter = - env.simulate_utility(Counter::at(contract_address).get_counter(owner)); + env.execute_utility(Counter::at(contract_address).get_counter(owner)); assert( initial_counter == initial_value, f"Expected {initial_value} but got {initial_counter}", @@ -120,7 +120,7 @@ pub contract Counter { env.call_private(owner, Counter::at(contract_address).increment(owner)); let incremented_counter = - env.simulate_utility(Counter::at(contract_address).get_counter(owner)); + env.execute_utility(Counter::at(contract_address).get_counter(owner)); let expected_current_value = initial_value + 1; assert( expected_current_value == incremented_counter, @@ -135,21 +135,21 @@ pub contract Counter { // Checking that the note was discovered from private logs let initial_note_value = - env.simulate_utility(Counter::at(contract_address).get_counter(owner)); + env.execute_utility(Counter::at(contract_address).get_counter(owner)); assert(initial_note_value == initial_value); env.call_private(owner, Counter::at(contract_address).increment_twice(owner)); - assert_eq(env.simulate_utility(Counter::at(contract_address).get_counter(owner)), 7); + assert_eq(env.execute_utility(Counter::at(contract_address).get_counter(owner)), 7); let _ = env.call_private( owner, Counter::at(contract_address).increment_and_decrement(owner), ); - assert_eq(env.simulate_utility(Counter::at(contract_address).get_counter(owner)), 7); + assert_eq(env.execute_utility(Counter::at(contract_address).get_counter(owner)), 7); env.call_private(owner, Counter::at(contract_address).decrement(owner)); - assert_eq(env.simulate_utility(Counter::at(contract_address).get_counter(owner)), 6); + assert_eq(env.execute_utility(Counter::at(contract_address).get_counter(owner)), 6); } } } diff --git a/noir-projects/noir-contracts/contracts/test/test_contract/src/test/note_delivery.nr b/noir-projects/noir-contracts/contracts/test/test_contract/src/test/note_delivery.nr index 6f7e3265937c..3d57d7bc51c2 100644 --- a/noir-projects/noir-contracts/contracts/test/test_contract/src/test/note_delivery.nr +++ b/noir-projects/noir-contracts/contracts/test/test_contract/src/test/note_delivery.nr @@ -47,7 +47,7 @@ unconstrained fn create_note_private_only_tx_and_read_in_utility() { test_contract.call_create_note(VALUE, recipient, STORAGE_SLOT, make_tx_hybrid), ); - let retrieved = env.simulate_utility(test_contract.call_view_notes( + let retrieved = env.execute_utility(test_contract.call_view_notes( recipient, STORAGE_SLOT, ACTIVE_OR_NULLIFIED, @@ -85,7 +85,7 @@ unconstrained fn create_note_hybrid_tx_and_read_in_utility() { test_contract.call_create_note(VALUE, recipient, STORAGE_SLOT, make_tx_hybrid), ); - let retrieved = env.simulate_utility(test_contract.call_view_notes( + let retrieved = env.execute_utility(test_contract.call_view_notes( recipient, STORAGE_SLOT, ACTIVE_OR_NULLIFIED, @@ -121,7 +121,7 @@ unconstrained fn create_partial_note_in_one_tx_and_read_in_utility() { test_contract.call_create_and_complete_partial_note(recipient, STORAGE_SLOT, VALUE), ); - let retrieved = env.simulate_utility(test_contract.call_view_notes( + let retrieved = env.execute_utility(test_contract.call_view_notes( recipient, STORAGE_SLOT, ACTIVE_OR_NULLIFIED, @@ -157,7 +157,7 @@ unconstrained fn create_partial_note_in_two_txs_and_read_in_utility() { env.call_public(sender, test_contract.call_complete_partial_note(partial_note, VALUE)); - let retrieved = env.simulate_utility(test_contract.call_view_notes( + let retrieved = env.execute_utility(test_contract.call_view_notes( recipient, STORAGE_SLOT, ACTIVE_OR_NULLIFIED, diff --git a/noir-projects/noir-protocol-circuits/bootstrap.sh b/noir-projects/noir-protocol-circuits/bootstrap.sh index 8de829b93502..e220700c5cdb 100755 --- a/noir-projects/noir-protocol-circuits/bootstrap.sh +++ b/noir-projects/noir-protocol-circuits/bootstrap.sh @@ -150,6 +150,15 @@ export -f hex_to_fields_json compile function build { set -eu + # If pinned-build.tar.gz exists, use it instead of compiling. + if [ -f pinned-build.tar.gz ]; then + echo_stderr "Using pinned-build.tar.gz instead of compiling." + rm -rf target + mkdir -p target + tar xzf pinned-build.tar.gz -C target + return + fi + if [[ -z NOIR_PROTOCOL_CIRCUITS_SKIP_CHECK_WARNINGS ]]; then echo_stderr "Checking libraries for warnings..." parallel -v --line-buffer --tag $NARGO --program-dir {} check ::: \ @@ -244,6 +253,15 @@ function bench { bench_cmds | STRICT_SCHEDULING=1 parallelize } +function pin-build { + # Force a real build by removing any existing pinned archive. + rm -f pinned-build.tar.gz + build + echo_stderr "Creating pinned-build.tar.gz from target..." + tar czf pinned-build.tar.gz -C target . + echo_stderr "Done. pinned-build.tar.gz created. Commit it to pin these artifacts." +} + case "$cmd" in "clean-keys") rm -rf $key_dir diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/gas_meter.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/gas_meter.nr index d598d9c99a5b..306af3f510a2 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/gas_meter.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/gas_meter.nr @@ -89,5 +89,11 @@ pub fn meter_gas_used(public_inputs: PrivateKernelCircuitPublicInputs, is_for_pu let metered_da_gas = metered_da_fields * DA_GAS_PER_FIELD; - Gas::tx_overhead() + Gas::new(metered_da_gas, metered_l2_gas) + teardown_gas + let overhead = if is_for_public { + Gas::public_tx_overhead() + } else { + Gas::private_tx_overhead() + }; + + overhead + Gas::new(metered_da_gas, metered_l2_gas) + teardown_gas } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail/meter_gas_used_tests.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail/meter_gas_used_tests.nr index 619b3e5af792..b88e87604e8e 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail/meter_gas_used_tests.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail/meter_gas_used_tests.nr @@ -12,7 +12,7 @@ use types::{ /// A minimum (private) tx initialized in the TestBuilder contains a protocol nullifier, which must exist in every tx. fn get_minimum_private_tx_gas_used() -> Gas { let nullifier_gas_used = Gas { da_gas: DA_GAS_PER_FIELD, l2_gas: L2_GAS_PER_NULLIFIER }; - Gas::tx_overhead() + nullifier_gas_used + Gas::private_tx_overhead() + nullifier_gas_used } #[test] @@ -100,7 +100,7 @@ fn full_side_effects() { let mut builder = TestBuilder::new(); // Fill the tx with side effects and compute the expected gas used. - let mut expected_gas_used = Gas::tx_overhead(); + let mut expected_gas_used = Gas::private_tx_overhead(); // Note hashes. builder.previous_kernel.append_siloed_note_hashes(MAX_NOTE_HASHES_PER_TX); expected_gas_used += Gas { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail_to_public/meter_gas_used_tests.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail_to_public/meter_gas_used_tests.nr index fda045e1726b..a3ae3df2822a 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail_to_public/meter_gas_used_tests.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_tail_to_public/meter_gas_used_tests.nr @@ -17,7 +17,7 @@ fn get_minimum_public_tx_gas_used() -> Gas { let nullifier_gas_used = Gas { da_gas: DA_GAS_PER_FIELD, l2_gas: AVM_EMITNULLIFIER_BASE_L2_GAS }; let public_call_gas_used = Gas { da_gas: 0, l2_gas: FIXED_AVM_STARTUP_L2_GAS }; - Gas::tx_overhead() + nullifier_gas_used + public_call_gas_used + Gas::public_tx_overhead() + nullifier_gas_used + public_call_gas_used } #[test] @@ -236,7 +236,8 @@ fn full_side_effects() { + MAX_PRIVATE_LOGS_PER_TX * L2_GAS_PER_PRIVATE_LOG + MAX_CONTRACT_CLASS_LOGS_PER_TX * L2_GAS_PER_CONTRACT_CLASS_LOG + MAX_ENQUEUED_CALLS_PER_TX * FIXED_AVM_STARTUP_L2_GAS; - let expected_gas_used = Gas::tx_overhead() + Gas::new(da_gas, l2_gas) + teardown_gas_limits; + let expected_gas_used = + Gas::public_tx_overhead() + Gas::new(da_gas, l2_gas) + teardown_gas_limits; let public_inputs = builder.execute(); assert_eq(public_inputs.gas_used, expected_gas_used); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/components/private_tail_validator.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/components/private_tail_validator.nr index f696642ceff4..a34fcc865938 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/components/private_tail_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/components/private_tail_validator.nr @@ -8,8 +8,8 @@ use types::{ log_hash::LogHash, tx_constant_data::TxConstantData, }, constants::{ - ARCHIVE_HEIGHT, AVM_MAX_PROCESSABLE_L2_GAS, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, - MAX_CONTRACT_CLASS_LOGS_PER_TX, + ARCHIVE_HEIGHT, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, MAX_CONTRACT_CLASS_LOGS_PER_TX, + MAX_PROCESSABLE_L2_GAS, }, hash::compute_contract_class_log_hash, merkle_tree::{check_membership, MembershipWitness}, @@ -101,10 +101,9 @@ pub fn validate_tx_constant_data( ); // Ensure that the l2 gas limit is within the max processable l2 gas. - // The constant is prefixed with `AVM_` but it applies to both private-only and public-inclusive txs. // TODO: This should be moved to the private kernels once they are not used for gas estimation anymore. assert( - tx_gas_settings.gas_limits.l2_gas <= AVM_MAX_PROCESSABLE_L2_GAS, + tx_gas_settings.gas_limits.l2_gas <= MAX_PROCESSABLE_L2_GAS, "l2 gas limit exceeds max processable l2 gas", ); } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/private_tx_base/validate_private_tail_tests.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/private_tx_base/validate_private_tail_tests.nr index 8c478c970435..33c0831bdb81 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/private_tx_base/validate_private_tail_tests.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/private_tx_base/validate_private_tail_tests.nr @@ -1,5 +1,5 @@ use super::TestBuilder; -use types::{constants::AVM_MAX_PROCESSABLE_L2_GAS, tests::fixture_builder::FixtureBuilder}; +use types::{constants::MAX_PROCESSABLE_L2_GAS, tests::fixture_builder::FixtureBuilder}; #[test(should_fail_with = "Membership check failed: anchor block header hash not found in archive tree")] unconstrained fn anchor_block_header_not_in_archive() { @@ -62,7 +62,7 @@ unconstrained fn gas_settings_l2_gas_limit_exceeds_max_processable_l2_gas() { let mut builder = TestBuilder::new(); builder.private_tail.constants.tx_context.gas_settings.gas_limits.l2_gas = - AVM_MAX_PROCESSABLE_L2_GAS + 1; + MAX_PROCESSABLE_L2_GAS + 1; builder.execute_and_fail(); } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/public_tx_base/validate_private_tail_to_public_tests.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/public_tx_base/validate_private_tail_to_public_tests.nr index cf5c99f91b3d..e3b8791540cf 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/public_tx_base/validate_private_tail_to_public_tests.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tx_base/tests/public_tx_base/validate_private_tail_to_public_tests.nr @@ -1,5 +1,5 @@ use super::TestBuilder; -use types::{constants::AVM_MAX_PROCESSABLE_L2_GAS, tests::fixture_builder::FixtureBuilder}; +use types::{constants::MAX_PROCESSABLE_L2_GAS, tests::fixture_builder::FixtureBuilder}; #[test(should_fail_with = "Membership check failed: anchor block header hash not found in archive tree")] unconstrained fn anchor_block_header_not_in_archive() { @@ -53,7 +53,7 @@ unconstrained fn gas_settings_l2_gas_limit_exceeds_max_processable_l2_gas() { let mut builder = TestBuilder::new(); builder.private_tail.constants.tx_context.gas_settings.gas_limits.l2_gas = - AVM_MAX_PROCESSABLE_L2_GAS + 1; + MAX_PROCESSABLE_L2_GAS + 1; builder.execute_and_fail(); } diff --git a/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr b/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr index 73ca1c17f3d1..7d533d01f1a3 100644 --- a/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr +++ b/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr @@ -796,3 +796,31 @@ where mod impls { use crate::serialization::{Deserialize, Serialize}; } + +#[test] +unconstrained fn bounded_vec_serialization() { + // Test empty BoundedVec + let empty_vec: BoundedVec = BoundedVec::from_array([]); + let serialized = empty_vec.serialize(); + let deserialized = BoundedVec::::deserialize(serialized); + assert_eq(empty_vec, deserialized); + assert_eq(deserialized.len(), 0); + + // Test partially filled BoundedVec + let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]); + let serialized = partial_vec.serialize(); + let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); + assert_eq(partial_vec, deserialized); + assert_eq(deserialized.len(), 1); + assert_eq(deserialized.get(0), [1, 2]); + + // Test full BoundedVec + let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]); + let serialized = full_vec.serialize(); + let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); + assert_eq(full_vec, deserialized); + assert_eq(deserialized.len(), 3); + assert_eq(deserialized.get(0), [1, 2]); + assert_eq(deserialized.get(1), [3, 4]); + assert_eq(deserialized.get(2), [5, 6]); +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/block_header.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/block_header.nr index 82a08efecd29..a23f002a14b2 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/block_header.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/block_header.nr @@ -28,6 +28,24 @@ pub struct BlockHeader { } // docs:end:block-header +impl BlockHeader { + pub fn chain_id(self) -> Field { + self.global_variables.chain_id + } + + pub fn version(self) -> Field { + self.global_variables.version + } + + pub fn block_number(self) -> u32 { + self.global_variables.block_number + } + + pub fn timestamp(self) -> u64 { + self.global_variables.timestamp + } +} + impl Empty for BlockHeader { fn empty() -> Self { Self { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr index 8b85a81a6e39..aa878684297d 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr @@ -1,6 +1,6 @@ use crate::{ abis::gas_fees::GasFees, - constants::{FIXED_DA_GAS, FIXED_L2_GAS}, + constants::{PRIVATE_TX_L2_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD, TX_DA_GAS_OVERHEAD}, traits::{Deserialize, Empty, Serialize}, }; use std::{meta::derive, ops::{Add, Sub}}; @@ -16,8 +16,12 @@ impl Gas { Self { da_gas, l2_gas } } - pub fn tx_overhead() -> Self { - Self { da_gas: FIXED_DA_GAS, l2_gas: FIXED_L2_GAS } + pub fn private_tx_overhead() -> Self { + Self { da_gas: TX_DA_GAS_OVERHEAD, l2_gas: PRIVATE_TX_L2_GAS_OVERHEAD } + } + + pub fn public_tx_overhead() -> Self { + Self { da_gas: TX_DA_GAS_OVERHEAD, l2_gas: PUBLIC_TX_L2_GAS_OVERHEAD } } pub fn compute_fee(self, fees: GasFees) -> Field { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index c0ba749b920a..51748193cdfb 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -1032,21 +1032,22 @@ pub global AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED: u32 = 16400; pub global AVM_V2_VERIFICATION_KEY_LENGTH_IN_FIELDS_PADDED: u32 = 1000; // GAS DEFAULTS -// The maximum amount of l2 gas that the AVM can process safely. -pub global AVM_MAX_PROCESSABLE_L2_GAS: u32 = 6_000_000; // Arbitrary. - pub global DA_BYTES_PER_FIELD: u32 = 32; pub global DA_GAS_PER_BYTE: u32 = 1; // Arbitrary. pub global DA_GAS_PER_FIELD: u32 = DA_BYTES_PER_FIELD * DA_GAS_PER_BYTE; // A tx always emits 3 fields: tx_start_marker, tx_hash, and tx_fee. -pub global FIXED_DA_GAS: u32 = 3 * DA_GAS_PER_FIELD; -// TODO: take into account the cost of executing and proving the rollup circuits (if they can be attributed to this tx... eg the tx base rollup, half a tx merge). -// We need a test suite to demonstrate these measurements -// pays for fixed tx costs like validation, and updating state roots -pub global FIXED_L2_GAS: u32 = 512; +pub global TX_DA_GAS_OVERHEAD: u32 = 3 * DA_GAS_PER_FIELD; +// Computed taking into account simulation time metrics. +pub global PUBLIC_TX_L2_GAS_OVERHEAD: u32 = 540000; +pub global PRIVATE_TX_L2_GAS_OVERHEAD: u32 = 440000; // base cost for a single public call pub global FIXED_AVM_STARTUP_L2_GAS: u32 = 20_000; +// The maximum amount of l2 gas that the AVM can process safely. +pub global AVM_MAX_PROCESSABLE_L2_GAS: u32 = 6_000_000; // Arbitrary. +// The following limit assumes that a private only tx will always be cheaper than a tx with a full public component. +pub global MAX_PROCESSABLE_L2_GAS: u32 = PUBLIC_TX_L2_GAS_OVERHEAD + AVM_MAX_PROCESSABLE_L2_GAS; + pub global MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT: u32 = BLOBS_PER_CHECKPOINT * FIELDS_PER_BLOB * DA_GAS_PER_FIELD; @@ -1054,9 +1055,9 @@ pub global MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT: u32 = // Since we split in teardown and total, teardown has the theoretical maximum and total is that times 2. // After gas estimation, we tune it down to the actual amount necessary. // TODO: this is a wallet concern; it should not be part of the protocol -pub global GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT: u32 = AVM_MAX_PROCESSABLE_L2_GAS; +pub global GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT: u32 = MAX_PROCESSABLE_L2_GAS; pub global GAS_ESTIMATION_L2_GAS_LIMIT: u32 = - GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT + AVM_MAX_PROCESSABLE_L2_GAS; + GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT + MAX_PROCESSABLE_L2_GAS; pub global GAS_ESTIMATION_TEARDOWN_DA_GAS_LIMIT: u32 = MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT; pub global GAS_ESTIMATION_DA_GAS_LIMIT: u32 = @@ -1065,7 +1066,7 @@ pub global GAS_ESTIMATION_DA_GAS_LIMIT: u32 = // Default gas limits. Users should use gas estimation, or they will overpay gas fees. // TODO: consider moving to typescript pub global DEFAULT_TEARDOWN_L2_GAS_LIMIT: u32 = 1_000_000; // Arbitrary default number. -pub global DEFAULT_L2_GAS_LIMIT: u32 = AVM_MAX_PROCESSABLE_L2_GAS; // Arbitrary default number. +pub global DEFAULT_L2_GAS_LIMIT: u32 = MAX_PROCESSABLE_L2_GAS; // Arbitrary default number. pub global DEFAULT_TEARDOWN_DA_GAS_LIMIT: u32 = MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT / 2; // Arbitrary default number. pub global DEFAULT_DA_GAS_LIMIT: u32 = MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT; // Arbitrary default number. @@ -1089,14 +1090,12 @@ pub global AVM_ADDRESSING_INDIRECT_L2_GAS: u32 = 3; // One mem access pub global AVM_ADDRESSING_RELATIVE_L2_GAS: u32 = 3; // One range check // Base L2 GAS -// TODO: Decide what the following constants should be. -pub global L2_GAS_PER_NOTE_HASH: u32 = 0; -pub global L2_GAS_PER_NULLIFIER: u32 = 0; -// Gas for writing message to L1 portal -pub global L2_GAS_PER_L2_TO_L1_MSG: u32 = 200; // TODO: Update and explain this. -// Zero gas because we don't have to hash and validate the private logs -pub global L2_GAS_PER_PRIVATE_LOG: u32 = 0; -pub global L2_GAS_PER_CONTRACT_CLASS_LOG: u32 = 0; // TODO: this should be nonzero, because the sequencer is doing work to hash this, as part of tx validation +// Based on simulation time metrics +pub global L2_GAS_PER_NOTE_HASH: u32 = 9200; // Bounded by long term storage requirements. +pub global L2_GAS_PER_NULLIFIER: u32 = 16000; +pub global L2_GAS_PER_L2_TO_L1_MSG: u32 = 5200; +pub global L2_GAS_PER_PRIVATE_LOG: u32 = 2500; +pub global L2_GAS_PER_CONTRACT_CLASS_LOG: u32 = 73000; // Note: magic numbers here are derived from each op's AVM circuit trace area // https://docs.google.com/spreadsheets/d/1FPyLfJFPOfZTmZC-T6b_4yB5dSrOAofz3dufte23_TA/edit?usp=sharing // Some have a "SLOW_SIM_MUL" multiplier because they are slower to simulate and their trace-area-derived gas cost @@ -1136,7 +1135,7 @@ pub global AVM_EMITNULLIFIER_BASE_L2_GAS: u32 = (516 + L2_GAS_DISTRIBUTED_STORAG pub global AVM_L1TOL2MSGEXISTS_BASE_L2_GAS: u32 = 108 * 5; // SLOW_SIM_MUL = 4 (+1 for slow proving) pub global AVM_GETCONTRACTINSTANCE_BASE_L2_GAS: u32 = 1527 * 4; // SLOW_SIM_MUL = 4 pub global AVM_EMITPUBLICLOG_BASE_L2_GAS: u32 = 15; -pub global AVM_SENDL2TOL1MSG_BASE_L2_GAS: u32 = (39 + L2_GAS_PER_L2_TO_L1_MSG) * 2; // SLOW_SIM_MUL = 2 +pub global AVM_SENDL2TOL1MSG_BASE_L2_GAS: u32 = 39 + L2_GAS_PER_L2_TO_L1_MSG; // See PR https://github.com/AztecProtocol/aztec-packages/pull/15495 on why we need this buffer. pub global AVM_CALL_BASE_L2_GAS: u32 = 3312 * 3; // SLOW_SIM_MUL = 3 pub global AVM_STATICCALL_BASE_L2_GAS: u32 = 3312 * 3; // SLOW_SIM_MUL = 3 diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr deleted file mode 100644 index 988bd650d4d9..000000000000 --- a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr +++ /dev/null @@ -1,344 +0,0 @@ -use crate::meta::derive_packable; -use crate::utils::field::field_from_bytes; - -pub use serde::serialization::{Deserialize, Serialize}; - -// Trait: is_empty -// -// The general is_empty trait checks if a data type is is empty, -// and it defines empty for the basic data types as 0. -// -// If a Field is equal to zero, then it is regarded as zero. -// We will go with this definition for now, however it can be problematic -// if a value can actually be zero. In a future refactor, we can -// use the optional type for safety. Doing it now would lead to a worse devex -// and would make it harder to sync up with the cpp code. -// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty. -pub trait Empty: Eq { - fn empty() -> Self; - - fn is_empty(self) -> bool { - self.eq(Self::empty()) - } - - // Requires this Noir fix: https://github.com/noir-lang/noir/issues/9002 - // fn assert_not_empty(self, msg: str) { // This msg version was failing with weird compiler errors. - // // We provide a default impl but it's likely inefficient. - // // The reason we include this function is because there's a lot of - // // opportunity for optimisation on a per-struct basis. - // // You only need to show one element is not empty to know that the whole thing - // // is not empty. - // // If you know an element of your struct which should always be nonempty, - // // you can write an impl that solely checks that that element is nonempty. - // assert(!self.is_empty(), msg); - // } - - // This default impl is overwritten by types like arrays, because there's a much - // more efficient approach. - fn assert_empty(self, msg: str) { - assert(self.is_empty(), msg); - } -} - -impl Empty for Field { - #[inline_always] - fn empty() -> Self { - 0 - } -} - -impl Empty for bool { - #[inline_always] - fn empty() -> Self { - false - } -} - -impl Empty for u1 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u8 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u16 { - fn empty() -> Self { - 0 - } -} -impl Empty for u32 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u64 { - #[inline_always] - fn empty() -> Self { - 0 - } -} -impl Empty for u128 { - #[inline_always] - fn empty() -> Self { - 0 - } -} - -impl Empty for [T; N] -where - T: Empty, -{ - #[inline_always] - fn empty() -> Self { - [T::empty(); N] - } - - fn is_empty(self) -> bool { - self.all(|elem| elem.is_empty()) - } - - fn assert_empty(self, msg: str) -> () { - self.for_each(|elem| elem.assert_empty(msg)) - } -} - -impl Empty for [T] -where - T: Empty, -{ - #[inline_always] - fn empty() -> Self { - [T::empty()] - } - - fn is_empty(self) -> bool { - self.all(|elem| elem.is_empty()) - } - - fn assert_empty(self, msg: str) -> () { - self.for_each(|elem| elem.assert_empty(msg)) - } -} -impl Empty for (A, B) -where - A: Empty, - B: Empty, -{ - #[inline_always] - fn empty() -> Self { - (A::empty(), B::empty()) - } -} - -impl Empty for Option -where - T: Eq, -{ - #[inline_always] - fn empty() -> Self { - Option::none() - } -} - -// pub fn is_empty(item: T) -> bool -// where -// T: Empty, -// { -// item.eq(T::empty()) -// } - -// pub fn is_empty_array(array: [T; N]) -> bool -// where -// T: Empty, -// { -// array.all(|elem| is_empty(elem)) -// } - -// pub fn assert_empty(item: T) -> () -// where -// T: Empty, -// { -// assert(item.eq(T::empty())) -// } - -// pub fn assert_empty_array(array: [T; N]) -> () -// where -// T: Empty, -// { -// // A cheaper option than `is_empty_array` for if you don't need to gracefully -// // handle a bool result. -// // Avoids the `&` operator of `is_empty_array`'s `.all()` call. -// for i in 0..N { -// assert(is_empty(array[i])); -// } -// } - -pub trait Hash { - fn hash(self) -> Field; -} - -pub trait ToField { - fn to_field(self) -> Field; -} - -impl ToField for Field { - #[inline_always] - fn to_field(self) -> Field { - self - } -} - -impl ToField for bool { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u1 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u8 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u16 { - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u32 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u64 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for u128 { - #[inline_always] - fn to_field(self) -> Field { - self as Field - } -} -impl ToField for str { - #[inline_always] - fn to_field(self) -> Field { - assert(N < 32, "String doesn't fit in a field, consider using Serialize instead"); - field_from_bytes(self.as_bytes(), true) - } -} - -pub trait FromField { - fn from_field(value: Field) -> Self; -} - -impl FromField for Field { - #[inline_always] - fn from_field(value: Field) -> Self { - value - } -} - -impl FromField for bool { - #[inline_always] - fn from_field(value: Field) -> Self { - value != 0 - } -} -impl FromField for u1 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u1 - } -} -impl FromField for u8 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u8 - } -} -impl FromField for u16 { - fn from_field(value: Field) -> Self { - value as u16 - } -} -impl FromField for u32 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u32 - } -} -impl FromField for u64 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u64 - } -} -impl FromField for u128 { - #[inline_always] - fn from_field(value: Field) -> Self { - value as u128 - } -} - -/// Trait for efficiently packing and unpacking Noir types into and from arrays of Fields. -/// -/// The `Packable` trait allows types to be serialized and deserialized with a focus on minimizing the size of -/// the resulting Field array. This trait is used when storage efficiency is critical (e.g. when storing data -/// in the contract's public storage). -/// -/// # Associated Constants -/// * `N` - The length of the Field array, known at compile time -#[derive_via(derive_packable)] -pub trait Packable { - let N: u32; - - /// Packs the current value into a compact array of `Field` elements. - fn pack(self) -> [Field; N]; - - /// Unpacks a compact array of `Field` elements into the original value. - fn unpack(fields: [Field; N]) -> Self; -} - -#[test] -unconstrained fn bounded_vec_serialization() { - // Test empty BoundedVec - let empty_vec: BoundedVec = BoundedVec::from_array([]); - let serialized = empty_vec.serialize(); - let deserialized = BoundedVec::::deserialize(serialized); - assert_eq(empty_vec, deserialized); - assert_eq(deserialized.len(), 0); - - // Test partially filled BoundedVec - let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]); - let serialized = partial_vec.serialize(); - let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); - assert_eq(partial_vec, deserialized); - assert_eq(deserialized.len(), 1); - assert_eq(deserialized.get(0), [1, 2]); - - // Test full BoundedVec - let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]); - let serialized = full_vec.serialize(); - let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized); - assert_eq(full_vec, deserialized); - assert_eq(deserialized.len(), 3); - assert_eq(deserialized.get(0), [1, 2]); - assert_eq(deserialized.get(1), [3, 4]); - assert_eq(deserialized.get(2), [5, 6]); -} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr new file mode 100644 index 000000000000..3aa3601b8a5c --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/empty.nr @@ -0,0 +1,175 @@ +// Trait: is_empty +// +// The general is_empty trait checks if a data type is empty, +// and it defines empty for the basic data types as 0. +// +// If a Field is equal to zero, then it is regarded as zero. +// We will go with this definition for now, however it can be problematic +// if a value can actually be zero. In a future refactor, we can +// use the optional type for safety. Doing it now would lead to a worse devex +// and would make it harder to sync up with the cpp code. +// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty. +pub trait Empty: Eq { + fn empty() -> Self; + + fn is_empty(self) -> bool { + self.eq(Self::empty()) + } + + // Requires this Noir fix: https://github.com/noir-lang/noir/issues/9002 + // fn assert_not_empty(self, msg: str) { // This msg version was failing with weird compiler errors. + // // We provide a default impl but it's likely inefficient. + // // The reason we include this function is because there's a lot of + // // opportunity for optimisation on a per-struct basis. + // // You only need to show one element is not empty to know that the whole thing + // // is not empty. + // // If you know an element of your struct which should always be nonempty, + // // you can write an impl that solely checks that that element is nonempty. + // assert(!self.is_empty(), msg); + // } + + // This default impl is overwritten by types like arrays, because there's a much + // more efficient approach. + fn assert_empty(self, msg: str) { + assert(self.is_empty(), msg); + } +} + +impl Empty for Field { + #[inline_always] + fn empty() -> Self { + 0 + } +} + +impl Empty for bool { + #[inline_always] + fn empty() -> Self { + false + } +} + +impl Empty for u1 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u8 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u16 { + fn empty() -> Self { + 0 + } +} +impl Empty for u32 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u64 { + #[inline_always] + fn empty() -> Self { + 0 + } +} +impl Empty for u128 { + #[inline_always] + fn empty() -> Self { + 0 + } +} + +impl Empty for [T; N] +where + T: Empty, +{ + #[inline_always] + fn empty() -> Self { + [T::empty(); N] + } + + fn is_empty(self) -> bool { + self.all(|elem| elem.is_empty()) + } + + fn assert_empty(self, msg: str) -> () { + self.for_each(|elem| elem.assert_empty(msg)) + } +} + +impl Empty for [T] +where + T: Empty, +{ + #[inline_always] + fn empty() -> Self { + [T::empty()] + } + + fn is_empty(self) -> bool { + self.all(|elem| elem.is_empty()) + } + + fn assert_empty(self, msg: str) -> () { + self.for_each(|elem| elem.assert_empty(msg)) + } +} +impl Empty for (A, B) +where + A: Empty, + B: Empty, +{ + #[inline_always] + fn empty() -> Self { + (A::empty(), B::empty()) + } +} + +impl Empty for Option +where + T: Eq, +{ + #[inline_always] + fn empty() -> Self { + Option::none() + } +} + +// pub fn is_empty(item: T) -> bool +// where +// T: Empty, +// { +// item.eq(T::empty()) +// } + +// pub fn is_empty_array(array: [T; N]) -> bool +// where +// T: Empty, +// { +// array.all(|elem| is_empty(elem)) +// } + +// pub fn assert_empty(item: T) -> () +// where +// T: Empty, +// { +// assert(item.eq(T::empty())) +// } + +// pub fn assert_empty_array(array: [T; N]) -> () +// where +// T: Empty, +// { +// // A cheaper option than `is_empty_array` for if you don't need to gracefully +// // handle a bool result. +// // Avoids the `&` operator of `is_empty_array`'s `.all()` call. +// for i in 0..N { +// assert(is_empty(array[i])); +// } +// } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr new file mode 100644 index 000000000000..0cfa123fef8d --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/from_field.nr @@ -0,0 +1,52 @@ +pub trait FromField { + fn from_field(value: Field) -> Self; +} + +impl FromField for Field { + #[inline_always] + fn from_field(value: Field) -> Self { + value + } +} + +impl FromField for bool { + #[inline_always] + fn from_field(value: Field) -> Self { + value != 0 + } +} +impl FromField for u1 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u1 + } +} +impl FromField for u8 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u8 + } +} +impl FromField for u16 { + fn from_field(value: Field) -> Self { + value as u16 + } +} +impl FromField for u32 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u32 + } +} +impl FromField for u64 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u64 + } +} +impl FromField for u128 { + #[inline_always] + fn from_field(value: Field) -> Self { + value as u128 + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr new file mode 100644 index 000000000000..1a9476f012c9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/hash.nr @@ -0,0 +1,3 @@ +pub trait Hash { + fn hash(self) -> Field; +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr new file mode 100644 index 000000000000..b71fd4c56af7 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/mod.nr @@ -0,0 +1,16 @@ +mod empty; +pub use empty::Empty; + +mod from_field; +pub use from_field::FromField; + +mod hash; +pub use hash::Hash; + +mod packable; +pub use packable::Packable; + +mod to_field; +pub use to_field::ToField; + +pub use serde::serialization::{Deserialize, Serialize}; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr new file mode 100644 index 000000000000..2ffc97c22dd9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/packable.nr @@ -0,0 +1,129 @@ +use crate::meta::derive_packable; + +/// Space-efficient value packing and unpacking. +/// +/// Like [`Serialize`](crate::traits::Serialize) and [`Deserialize`](crate::traits::Deserialize), this trait is used to +/// convert to a from `Field` array representations. `Packable` is used instead of those whenever _the length_ of the +/// resulting array needs to be minimized, for example in order to reduce the number of amount storage access +/// operations, or the number of values that will be hashed together. +/// +/// The associated constant `N` is the length of the `Field` array. +/// +/// ## Automatic Derivation +/// +/// The `#[derive]` macro can be used on any type that holds primitive values, or types that themselves also derive +/// `Packable`. The resulting implementation does not attempt to tightly-pack values at all, and instead simply assigns +/// a full `Field` to each value. This makes it suitable for types that are composed solely of `Field`-sized elements. +/// +/// ```noir +/// #[derive(Packable)] +/// struct FieldGrouping { +/// a: Field, +/// b: Field, +/// c: Field, +/// } +/// +/// #[derive(Packable)] +/// struct NestedStructs { +/// fg: FieldGrouping, +/// x: Field, +/// } +/// +/// // Inefficient: there are gains to be had by manually implementing the trait instead of using `derive` +/// #[derive(Packable)] +/// struct SubFieldGrouping { +/// a: bool, +/// b: u32, +/// c: u64, +/// } +/// ``` +/// +/// ## Manual Implementation +/// +/// If a type holds at least two elements smaller than a `Field`, then manually implementing `Packable` can result in +/// reduced costs (assuming the sub-`Field` elements are small enough to be packed together). +/// +/// The nature of cost reduction will depend on what the value is used for. For public storage, it will typically +/// decrease both L2 gas (in the form of fewer `SLOAD` and `SSTORE` opcodes) and DA costs (due to there being fewer +/// slots accessed). For notes, it will typically decrease proving times (due to fewer hash operations). +/// +/// Note that packing and unpacking must also be runtime efficient for the previously mentioned gains to not be offset +/// by this overhead. Bit-packing by multiplying and dividing by powers of 2 is often a good strategy, as this maps well +/// to both AVM opcodes (for public contract functions) and proving backend primitives (for private contract functions). +/// +/// ```noir +/// struct TwoBooleans { +/// a: bool, +/// b: bool, +/// } +/// +/// impl Packable for TwoBooleans { +/// let N: u32 = 1; +/// +/// fn pack(self) -> [Field; Self::N] { +/// // a in bit 1, b in bit 0 +/// [(self.a as Field) * 2.pow_32(1) + (self.b as Field)] +/// } +/// +/// fn unpack(packed: [Field; Self::N]) -> Self { +/// let b = (packed[0] as u1) != 0; +/// let a = (((packed[0] - b as Field) / 2.pow_32(1)) as u1) != 0; +/// +/// Self { a, b } +/// } +/// } +/// ``` +#[derive_via(derive_packable)] +pub trait Packable { + let N: u32; + + /// Packs the value into a compact `Field` array. + /// + /// The original value can be reconstructed by calling [`Packable::unpack`]. + fn pack(self) -> [Field; N]; + + /// Unpacks the value from a compact `Field` array. + /// + /// `packed` must be the value returned by [`Packable::pack`]. + fn unpack(packed: [Field; N]) -> Self; +} + +mod test { + use super::Packable; + + #[derive(Eq)] + struct TwoBooleans { + a: bool, + b: bool, + } + + impl Packable for TwoBooleans { + let N: u32 = 1; + + fn pack(self) -> [Field; Self::N] { + [(self.a as Field) * 2.pow_32(1) + (self.b as Field)] + } + + fn unpack(packed: [Field; Self::N]) -> Self { + let b = (packed[0] as u1) != 0; + let a = (((packed[0] - b as Field) / 2.pow_32(1)) as u1) != 0; + + Self { a, b } + } + } + + #[test] + fn pack_unpack_docs_example() { + let x = TwoBooleans { a: false, b: false }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + + let x = TwoBooleans { a: false, b: true }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + + let x = TwoBooleans { a: true, b: false }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + + let x = TwoBooleans { a: true, b: true }; + assert_eq(TwoBooleans::unpack(x.pack()), x); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr new file mode 100644 index 000000000000..c1ddfaa3c593 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr @@ -0,0 +1,61 @@ +use crate::utils::field::field_from_bytes; + +pub trait ToField { + fn to_field(self) -> Field; +} + +impl ToField for Field { + #[inline_always] + fn to_field(self) -> Field { + self + } +} + +impl ToField for bool { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u1 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u8 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u16 { + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u32 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u64 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for u128 { + #[inline_always] + fn to_field(self) -> Field { + self as Field + } +} +impl ToField for str { + #[inline_always] + fn to_field(self) -> Field { + assert(N < 32, "String doesn't fit in a field, consider using Serialize instead"); + field_from_bytes(self.as_bytes(), true) + } +} diff --git a/noir-projects/noir-protocol-circuits/pinned-build.tar.gz b/noir-projects/noir-protocol-circuits/pinned-build.tar.gz new file mode 100644 index 000000000000..c80339ffaf96 Binary files /dev/null and b/noir-projects/noir-protocol-circuits/pinned-build.tar.gz differ diff --git a/playground/src/utils/networks.ts b/playground/src/utils/networks.ts index a221f5b6830a..5a02eb870e00 100644 --- a/playground/src/utils/networks.ts +++ b/playground/src/utils/networks.ts @@ -19,14 +19,14 @@ export type Network = { export const NETWORKS: Network[] = [ { - nodeURL: 'https://next.devnet.aztec-labs.com', + nodeURL: 'https://v4-devnet-2.aztec-labs.com/', name: 'Aztec Devnet', description: 'Public development network', chainId: 11155111, - version: 1647720761, + version: 615022430, hasTestAccounts: false, hasSponsoredFPC: true, - nodeVersion: '3.0.0-devnet', + nodeVersion: '4.0.0-devnet.2-patch.1', }, { nodeURL: 'http://localhost:8080', diff --git a/release-image/Dockerfile b/release-image/Dockerfile index 48c6c06a9572..4a4c329b3ff7 100644 --- a/release-image/Dockerfile +++ b/release-image/Dockerfile @@ -7,6 +7,7 @@ ARG BUILD_METADATA="" ENV BUILD_METADATA=$BUILD_METADATA # Provide paths to bb and acvm for use in yarn-project, also create default working directories for each +ENV UV_THREADPOOL_SIZE=8 ENV BB_WORKING_DIRECTORY=/usr/src/bb ENV BB_BINARY_PATH=/usr/src/barretenberg/cpp/build/bin/bb-avm ENV ACVM_WORKING_DIRECTORY=/usr/src/acvm diff --git a/release-image/Dockerfile.base b/release-image/Dockerfile.base index 8e61fcb0babe..6ffdf0dee01e 100644 --- a/release-image/Dockerfile.base +++ b/release-image/Dockerfile.base @@ -23,7 +23,8 @@ RUN apt update && apt install -y \ netcat-openbsd \ parallel \ curl \ - gnupg && \ + gnupg \ + libtcmalloc-minimal4t64 && \ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ apt update && apt install nodejs && \ @@ -33,6 +34,8 @@ COPY --from=build /opt/foundry/bin/anvil /opt/foundry/bin/anvil COPY --from=build /opt/foundry/bin/forge /opt/foundry/bin/forge COPY --from=build /opt/foundry/bin/cast /opt/foundry/bin/cast ENV PATH="/opt/foundry/bin:$PATH" FOUNDRY_DISABLE_NIGHTLY_WARNING="1" +# Use tcmalloc for reduced memory fragmentation and improved allocation performance. +ENV LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4" # Copy in production dependencies. COPY --from=build /usr/src/yarn-project/node_modules /usr/src/yarn-project/node_modules # We install a symlink to yarn-project's node_modules at a location that all portalled packages can find as they diff --git a/release-image/bootstrap.sh b/release-image/bootstrap.sh index 7f71871d0099..65bbbcec3ba3 100755 --- a/release-image/bootstrap.sh +++ b/release-image/bootstrap.sh @@ -160,8 +160,12 @@ function push_pr { echo $DOCKERHUB_PASSWORD | docker login -u ${DOCKERHUB_USERNAME:-aztecprotocolci} --password-stdin docker tag aztecprotocol/aztec:$COMMIT_HASH aztecprotocol/aztecdev:$COMMIT_HASH do_or_dryrun docker push aztecprotocol/aztecdev:$COMMIT_HASH - docker tag aztecprotocol/aztec-prover-agent:$COMMIT_HASH aztecprotocol/aztec-prover-agent-dev:$COMMIT_HASH - do_or_dryrun docker push aztecprotocol/aztec-prover-agent-dev:$COMMIT_HASH + # Best-effort: push prover-agent image if available. + if docker tag aztecprotocol/aztec-prover-agent:$COMMIT_HASH aztecprotocol/aztec-prover-agent-dev:$COMMIT_HASH 2>/dev/null; then + do_or_dryrun docker push aztecprotocol/aztec-prover-agent-dev:$COMMIT_HASH || echo "Warning: failed to push prover-agent-dev image, continuing." + else + echo "Warning: prover-agent image not found locally, skipping push." + fi } case "$cmd" in diff --git a/scripts/dedupe_release_notes.py b/scripts/dedupe_release_notes.py index 13799f5ee841..ed41f0ed1507 100755 --- a/scripts/dedupe_release_notes.py +++ b/scripts/dedupe_release_notes.py @@ -75,7 +75,7 @@ def deduplicate_release_notes(input_file, output_file=None): if output_file is None: output_file = input_file - with open(input_file, 'r', encoding='utf-8') as f: + with open(input_file, 'r', encoding='utf-8', errors='replace') as f: lines = f.readlines() original_count = len(lines) diff --git a/spartan/aztec-node/templates/_pod-template.yaml b/spartan/aztec-node/templates/_pod-template.yaml index 709a71b3c9cf..250e4e6d49f9 100644 --- a/spartan/aztec-node/templates/_pod-template.yaml +++ b/spartan/aztec-node/templates/_pod-template.yaml @@ -193,8 +193,8 @@ spec: {{- if .Values.node.adminApiKeyHash }} - name: AZTEC_ADMIN_API_KEY_HASH value: {{ .Values.node.adminApiKeyHash | quote }} - {{- else if .Values.node.noAdminApiKey }} - - name: AZTEC_NO_ADMIN_API_KEY + {{- else if .Values.node.disableAdminApiKey }} + - name: AZTEC_DISABLE_ADMIN_API_KEY value: "true" {{- end }} - name: LOG_LEVEL diff --git a/spartan/aztec-node/values.yaml b/spartan/aztec-node/values.yaml index 97d0661e1c3b..d522e4541616 100644 --- a/spartan/aztec-node/values.yaml +++ b/spartan/aztec-node/values.yaml @@ -106,7 +106,7 @@ node: # -- Disable admin API key authentication. # Set to false in production to enable API key auth. - noAdminApiKey: true + disableAdminApiKey: true # the address that will receive block or proof rewards coinbase: diff --git a/spartan/aztec-validator/values.yaml b/spartan/aztec-validator/values.yaml index b5112c561d8a..05639db89a9d 100644 --- a/spartan/aztec-validator/values.yaml +++ b/spartan/aztec-validator/values.yaml @@ -26,7 +26,7 @@ validator: node: # Set to false in production to enable API key auth. - noAdminApiKey: true + disableAdminApiKey: true configMap: envEnabled: true secret: diff --git a/spartan/environments/network-defaults.yml b/spartan/environments/network-defaults.yml index 9291bc82795c..d2b29994c7ca 100644 --- a/spartan/environments/network-defaults.yml +++ b/spartan/environments/network-defaults.yml @@ -40,7 +40,7 @@ l1-contracts: &l1-contracts-defaults # How many seconds an L1 slot lasts (Ethereum consensus layer). ETHEREUM_SLOT_DURATION: 12 # How many seconds an L2 slot lasts (must be multiple of L1 slot duration). - AZTEC_SLOT_DURATION: 36 + AZTEC_SLOT_DURATION: 72 # How many L2 slots in an epoch. AZTEC_EPOCH_DURATION: 32 @@ -52,7 +52,7 @@ l1-contracts: &l1-contracts-defaults # How many epochs to lag for validator set selection. AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2 # How many epochs to lag for RANDAO selection. - AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 2 + AZTEC_LAG_IN_EPOCHS_FOR_RANDAO: 1 # Minimum stake to become a validator (in wei, 100 TST). AZTEC_ACTIVATION_THRESHOLD: 100e18 # Minimum stake before forced ejection (in wei, 50 TST). @@ -138,9 +138,9 @@ slasher: &slasher # Penalty for attesting to a descendant of an invalid block. SLASH_ATTEST_DESCENDANT_OF_INVALID_PENALTY: 10e18 # Penalty for proposing two different block or checkpoint proposal for the same position. - SLASH_DUPLICATE_PROPOSAL_PENALTY: 10e18 + SLASH_DUPLICATE_PROPOSAL_PENALTY: 0 # Penalty for signing attestations for different proposals at the same slot. - SLASH_DUPLICATE_ATTESTATION_PENALTY: 10e18 + SLASH_DUPLICATE_ATTESTATION_PENALTY: 0 # Penalty for unknown offenses. SLASH_UNKNOWN_PENALTY: 10e18 # Penalty for broadcasting an invalid block. @@ -171,8 +171,13 @@ _prodlike: &prodlike #--------------------------------------------------------------------------- # Minimum transactions to include in a block. SEQ_MIN_TX_PER_BLOCK: 0 + # Maximum transactions to include in a block # Build checkpoint even if block is empty. SEQ_BUILD_CHECKPOINT_IF_EMPTY: true + # 6 second block times + SEQ_BLOCK_DURATION_MS: 6000 + # Time allocated for publishing to L1 + SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT: 36 # 3 Ethereum slots #--------------------------------------------------------------------------- # Database Map Sizes (in KB) @@ -216,7 +221,7 @@ networks: SPONSORED_FPC: true # Fund sponsored FPC with fee juice TRANSACTIONS_DISABLED: false # Sequencer - SEQ_MAX_TX_PER_BLOCK: 32 + SEQ_MAX_TX_PER_BLOCK: 18 # Prover PROVER_REAL_PROOFS: false # Use mock proofs PXE_PROVER_ENABLED: false # Disable PXE proving @@ -260,7 +265,11 @@ networks: AZTEC_SLASHING_QUORUM: 33 AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 100 AZTEC_GOVERNANCE_PROPOSER_QUORUM: 60 - AZTEC_MANA_TARGET: 150000000 + AZTEC_MANA_TARGET: 75000000 + AZTEC_PROVING_COST_PER_MANA: 25000000 + AZTEC_SLASH_AMOUNT_SMALL: 100000e18 + AZTEC_SLASH_AMOUNT_MEDIUM: 100000e18 + AZTEC_SLASH_AMOUNT_LARGE: 100000e18 # Network identity L1_CHAIN_ID: 11155111 # Sepolia # Genesis state @@ -268,7 +277,8 @@ networks: SPONSORED_FPC: true TRANSACTIONS_DISABLED: false # Sequencer - SEQ_MAX_TX_PER_BLOCK: 8 + # Gives ~0.1 TPS @ 72s slot time, 36s publish time, 6s block time - max 4 blocks per slot + SEQ_MAX_TX_PER_BLOCK: 2 # Prover PROVER_REAL_PROOFS: true # P2P @@ -291,10 +301,9 @@ networks: <<: *prodlike # L1 contract overrides - production parameters AZTEC_SLOT_DURATION: 72 - AZTEC_TARGET_COMMITTEE_SIZE: 24 AZTEC_ACTIVATION_THRESHOLD: 200000e18 AZTEC_EJECTION_THRESHOLD: 100000e18 - AZTEC_LOCAL_EJECTION_THRESHOLD: 196000e18 + AZTEC_LOCAL_EJECTION_THRESHOLD: 190000e18 AZTEC_SLASH_AMOUNT_SMALL: 2000e18 AZTEC_SLASH_AMOUNT_MEDIUM: 2000e18 AZTEC_SLASH_AMOUNT_LARGE: 2000e18 @@ -304,10 +313,15 @@ networks: AZTEC_SLASHING_QUORUM: 65 AZTEC_GOVERNANCE_PROPOSER_QUORUM: 600 AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE: 1000 - AZTEC_MANA_TARGET: 0 - AZTEC_PROVING_COST_PER_MANA: 0 + AZTEC_MANA_TARGET: 75000000 + AZTEC_PROVING_COST_PER_MANA: 25000000 AZTEC_EXIT_DELAY_SECONDS: 345600 # 4 days AZTEC_SLASHING_DISABLE_DURATION: 259200 # 3 days + AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE: 500 + AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE: 500 + AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN: 1 + AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT: 400 + AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE: 4 # Network identity L1_CHAIN_ID: 1 # Ethereum mainnet # Genesis state - no test accounts, no sponsored FPC diff --git a/spartan/environments/next-net.env b/spartan/environments/next-net.env index 33708eed55db..b2ef9110eb44 100644 --- a/spartan/environments/next-net.env +++ b/spartan/environments/next-net.env @@ -24,11 +24,17 @@ TX_COLLECTION_FILE_STORE_URLS="https://aztec-labs-snapshots.com/${TX_FILE_STORE_ R2_ACCESS_KEY_ID=REPLACE_WITH_GCP_SECRET R2_SECRET_ACCESS_KEY=REPLACE_WITH_GCP_SECRET PROVER_FAILED_PROOF_STORE=gs://aztec-develop/next-net/failed-proofs +L1_TX_FAILED_STORE=gs://aztec-develop/next-net/failed-l1-txs TEST_ACCOUNTS=true SPONSORED_FPC=true + SEQ_MIN_TX_PER_BLOCK=0 -SEQ_MAX_TX_PER_BLOCK=8 -AZTEC_EPOCH_DURATION=32 +# Gives ~0.1 TPS @ 72s slot time, 36s publish time, 6s block time - max 4 blocks per slot +SEQ_MAX_TX_PER_BLOCK=2 + +# Build checkpoint even if block is empty. +SEQ_BUILD_CHECKPOINT_IF_EMPTY=true +SEQ_BLOCK_DURATION_MS=6000 AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET=2 AZTEC_LAG_IN_EPOCHS_FOR_RANDAO=2 @@ -60,3 +66,12 @@ RPC_INGRESS_SSL_CERT_NAMES='["nextnet-rpc-cert"]' VALIDATOR_HA_REPLICAS=1 VALIDATOR_RESOURCE_PROFILE="prod-spot" + +REAL_VERIFIER=true +AZTEC_SLOT_DURATION=72 +AZTEC_EPOCH_DURATION=32 +AZTEC_TARGET_COMMITTEE_SIZE=48 +AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET=2 +AZTEC_LAG_IN_EPOCHS_FOR_RANDAO=2 +AZTEC_PROOF_SUBMISSION_EPOCHS=1 + diff --git a/spartan/environments/staging-public.env b/spartan/environments/staging-public.env index 16825e314652..33d66c685ec1 100644 --- a/spartan/environments/staging-public.env +++ b/spartan/environments/staging-public.env @@ -14,17 +14,24 @@ ROLLUP_DEPLOYMENT_PRIVATE_KEY=REPLACE_WITH_GCP_SECRET OTEL_COLLECTOR_ENDPOINT=REPLACE_WITH_GCP_SECRET VERIFY_CONTRACTS=true ETHERSCAN_API_KEY=REPLACE_WITH_GCP_SECRET -DEPLOY_INTERNAL_BOOTNODE=false +DEPLOY_INTERNAL_BOOTNODE=true SNAPSHOT_BUCKET_DIRECTORY=${SNAPSHOT_BUCKET_DIRECTORY:-staging-public} BLOB_BUCKET_DIRECTORY=${BLOB_BUCKET_DIRECTORY:-staging-public/blobs} +TX_FILE_STORE_ENABLED=true +TX_FILE_STORE_BUCKET_DIRECTORY=${TX_FILE_STORE_BUCKET_DIRECTORY:-staging-public/txs} +TX_COLLECTION_FILE_STORE_URLS="https://aztec-labs-snapshots.com/${TX_FILE_STORE_BUCKET_DIRECTORY}" R2_ACCESS_KEY_ID=REPLACE_WITH_GCP_SECRET R2_SECRET_ACCESS_KEY=REPLACE_WITH_GCP_SECRET -PROVER_FAILED_PROOF_STORE=gs://aztec-develop/staging-public/failed-proofs TEST_ACCOUNTS=false SPONSORED_FPC=true + SEQ_MIN_TX_PER_BLOCK=0 -SEQ_MAX_TX_PER_BLOCK=1 -PROVER_REPLICAS=4 +# Gives ~0.1 TPS @ 72s slot time, 36s publish time, 6s block time - max 4 blocks per slot +SEQ_MAX_TX_PER_BLOCK=2 + +# Build checkpoint even if block is empty. +SEQ_BUILD_CHECKPOINT_IF_EMPTY=true +SEQ_BLOCK_DURATION_MS=6000 CREATE_ROLLUP_CONTRACTS=false P2P_TX_POOL_DELETE_TXS_AFTER_REORG=true @@ -33,7 +40,11 @@ VALIDATOR_REPLICAS=5 VALIDATORS_PER_NODE=16 PUBLISHERS_PER_VALIDATOR_KEY=2 VALIDATOR_PUBLISHER_MNEMONIC_START_INDEX=5000 +VALIDATOR_HA_REPLICAS=1 +VALIDATOR_RESOURCE_PROFILE="prod-spot" +PROVER_FAILED_PROOF_STORE=gs://aztec-develop/staging-public/failed-proofs +PROVER_REPLICAS=4 PUBLISHERS_PER_PROVER=2 PROVER_PUBLISHER_MNEMONIC_START_INDEX=8000 diff --git a/spartan/environments/testnet.env b/spartan/environments/testnet.env index d57eefe37a96..8702a5335d4e 100644 --- a/spartan/environments/testnet.env +++ b/spartan/environments/testnet.env @@ -2,38 +2,8 @@ CREATE_ETH_DEVNET=false GCP_REGION=us-west1-a CLUSTER=aztec-gke-public NAMESPACE=${NAMESPACE:-testnet} -TEST_ACCOUNTS=false -SPONSORED_FPC=true -SEQ_MIN_TX_PER_BLOCK=0 -SEQ_MAX_TX_PER_BLOCK=8 NETWORK=testnet -REAL_VERIFIER=true -AZTEC_ENTRY_QUEUE_BOOTSTRAP_VALIDATOR_SET_SIZE=48 -AZTEC_ENTRY_QUEUE_BOOTSTRAP_FLUSH_SIZE=48 -AZTEC_ENTRY_QUEUE_FLUSH_SIZE_MIN=10 -AZTEC_ENTRY_QUEUE_FLUSH_SIZE_QUOTIENT=400 -AZTEC_ENTRY_QUEUE_MAX_FLUSH_SIZE=10 -AZTEC_SLOT_DURATION=72 -AZTEC_EPOCH_DURATION=32 -AZTEC_TARGET_COMMITTEE_SIZE=48 -AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET=2 -AZTEC_LAG_IN_EPOCHS_FOR_RANDAO=2 -AZTEC_PROOF_SUBMISSION_EPOCHS=1 -AZTEC_LOCAL_EJECTION_THRESHOLD=199000e18 -AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS=2 -AZTEC_SLASHING_QUORUM=33 -AZTEC_SLASHING_OFFSET_IN_ROUNDS=2 -AZTEC_SLASHING_LIFETIME_IN_ROUNDS=5 -AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS=2 -AZTEC_SLASHING_VETOER=\"0xdfe19Da6a717b7088621d8bBB66be59F2d78e924\" -AZTEC_MANA_TARGET=150000000 -AZTEC_ACTIVATION_THRESHOLD=200000e18 -AZTEC_EJECTION_THRESHOLD=100000e18 -AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE=100 -AZTEC_GOVERNANCE_PROPOSER_QUORUM=60 - - ETHEREUM_CHAIN_ID=11155111 ETHEREUM_RPC_URLS=REPLACE_WITH_GCP_SECRET ETHEREUM_CONSENSUS_HOST_URLS=REPLACE_WITH_GCP_SECRET @@ -48,6 +18,9 @@ ETHERSCAN_API_KEY=REPLACE_WITH_GCP_SECRET SNAPSHOT_BUCKET_DIRECTORY=${SNAPSHOT_BUCKET_DIRECTORY:-testnet} BLOB_BUCKET_DIRECTORY=${BLOB_BUCKET_DIRECTORY:-testnet/blobs} +TX_FILE_STORE_ENABLED=true +TX_FILE_STORE_BUCKET_DIRECTORY=${TX_FILE_STORE_BUCKET_DIRECTORY:-testnet/txs} +TX_COLLECTION_FILE_STORE_URLS="https://aztec-labs-snapshots.com/${TX_FILE_STORE_BUCKET_DIRECTORY}" R2_ACCESS_KEY_ID=REPLACE_WITH_GCP_SECRET R2_SECRET_ACCESS_KEY=REPLACE_WITH_GCP_SECRET DEPLOY_INTERNAL_BOOTNODE=false diff --git a/spartan/scripts/deploy_network.sh b/spartan/scripts/deploy_network.sh index ad40060dee94..f94f71d7dfed 100755 --- a/spartan/scripts/deploy_network.sh +++ b/spartan/scripts/deploy_network.sh @@ -17,6 +17,18 @@ k8s_denoise() { "${SCRIPT_DIR}/k8s_enriched_denoise" "${NAMESPACE}" "$1" } +tf_str() { + local value="${1:-}" + local default_value="${2:-null}" + if [[ -n "$value" ]]; then + value="${value//\\/\\\\}" # escape backslashes first + value="${value//\"/\\\"}" # then escape double quotes + echo "\"${value}\"" + else + echo "$default_value" + fi +} + # We want to separate out these logs. export DENOISE=1 ######################## @@ -97,6 +109,7 @@ SEQ_MIN_TX_PER_BLOCK=${SEQ_MIN_TX_PER_BLOCK:-0} SEQ_MAX_TX_PER_BLOCK=${SEQ_MAX_TX_PER_BLOCK:-8} SEQ_BLOCK_DURATION_MS=${SEQ_BLOCK_DURATION_MS:-} SEQ_BUILD_CHECKPOINT_IF_EMPTY=${SEQ_BUILD_CHECKPOINT_IF_EMPTY:-} +SEQ_ENFORCE_TIME_TABLE=${SEQ_ENFORCE_TIME_TABLE:-} SEQ_SKIP_CHECKPOINT_PUBLISH_PERCENT=${SEQ_SKIP_CHECKPOINT_PUBLISH_PERCENT:-0} PROVER_REPLICAS=${PROVER_REPLICAS:-4} PROVER_AGENTS_PER_PROVER=${PROVER_AGENTS_PER_PROVER:-1} @@ -357,13 +370,6 @@ ROLLUP_CONTRACTS_START=$(date +%s) DEPLOY_ROLLUP_CONTRACTS_DIR="${SCRIPT_DIR}/../terraform/deploy-rollup-contracts" "${SCRIPT_DIR}/override_terraform_backend.sh" "${DEPLOY_ROLLUP_CONTRACTS_DIR}" "${CLUSTER}" "${BASE_STATE_PATH}/deploy-rollup-contracts" -# Handle NETWORK variable - needs quotes for string values, null for unset -if [[ -n "${NETWORK:-}" ]]; then - NETWORK_TF="\"${NETWORK}\"" -else - NETWORK_TF=null -fi - # Handle ETHERSCAN_API_KEY - only set when deploying or redeploying contracts if [[ "${VERIFY_CONTRACTS:-}" == "true" && ("${CREATE_ROLLUP_CONTRACTS}" == "true" || "${REDEPLOY_ROLLUP_CONTRACTS}" == "true") ]]; then ETHERSCAN_API_KEY_TF="\"${ETHERSCAN_API_KEY:-}\"" @@ -409,7 +415,7 @@ AZTEC_MANA_TARGET = ${AZTEC_MANA_TARGET:-null} AZTEC_PROVING_COST_PER_MANA = ${AZTEC_PROVING_COST_PER_MANA:-null} AZTEC_EXIT_DELAY_SECONDS = ${AZTEC_EXIT_DELAY_SECONDS:-null} ETHERSCAN_API_KEY = ${ETHERSCAN_API_KEY_TF} -NETWORK = ${NETWORK_TF} +NETWORK = $(tf_str "${NETWORK:-}") JOB_NAME = "deploy-rollup-contracts" JOB_BACKOFF_LIMIT = 3 JOB_TTL_SECONDS_AFTER_FINISHED = 3600 @@ -508,6 +514,7 @@ SEQ_MIN_TX_PER_BLOCK = ${SEQ_MIN_TX_PER_BLOCK} SEQ_MAX_TX_PER_BLOCK = ${SEQ_MAX_TX_PER_BLOCK} SEQ_BLOCK_DURATION_MS = ${SEQ_BLOCK_DURATION_MS:-null} SEQ_BUILD_CHECKPOINT_IF_EMPTY = ${SEQ_BUILD_CHECKPOINT_IF_EMPTY:-null} +SEQ_ENFORCE_TIME_TABLE = ${SEQ_ENFORCE_TIME_TABLE:-null} SEQ_SKIP_CHECKPOINT_PUBLISH_PERCENT = ${SEQ_SKIP_CHECKPOINT_PUBLISH_PERCENT} PROVER_MNEMONIC = "${LABS_INFRA_MNEMONIC}" PROVER_PUBLISHER_MNEMONIC_START_INDEX = ${PROVER_PUBLISHER_MNEMONIC_START_INDEX} @@ -531,7 +538,7 @@ OTEL_COLLECTOR_ENDPOINT = "${OTEL_COLLECTOR_ENDPOINT}" DEPLOY_INTERNAL_BOOTNODE = ${DEPLOY_INTERNAL_BOOTNODE:-true} PROVER_REAL_PROOFS = ${PROVER_REAL_PROOFS} TRANSACTIONS_DISABLED = ${TRANSACTIONS_DISABLED:-null} -NETWORK = ${NETWORK_TF} +NETWORK = $(tf_str "${NETWORK:-}") STORE_SNAPSHOT_URL = ${STORE_SNAPSHOT_URL_TF} BOT_RESOURCE_PROFILE = "${BOT_RESOURCE_PROFILE}" BOT_MNEMONIC = "${LABS_INFRA_MNEMONIC}" @@ -594,8 +601,8 @@ DEBUG_P2P_INSTRUMENT_MESSAGES = ${DEBUG_P2P_INSTRUMENT_MESSAGES:-false} PROVER_AGENT_INCLUDE_METRICS = "${PROVER_AGENT_INCLUDE_METRICS-null}" FULL_NODE_INCLUDE_METRICS = "${FULL_NODE_INCLUDE_METRICS-null}" -LOG_LEVEL = "${LOG_LEVEL}" -FISHERMAN_LOG_LEVEL = "${FISHERMAN_LOG_LEVEL}" +LOG_LEVEL = $(tf_str "$LOG_LEVEL") +FISHERMAN_LOG_LEVEL = $(tf_str "$FISHERMAN_LOG_LEVEL") WS_NUM_HISTORIC_CHECKPOINTS = ${WS_NUM_HISTORIC_CHECKPOINTS:-null} diff --git a/spartan/terraform/deploy-aztec-infra/main.tf b/spartan/terraform/deploy-aztec-infra/main.tf index 338cef6dffeb..488f7e3200a8 100644 --- a/spartan/terraform/deploy-aztec-infra/main.tf +++ b/spartan/terraform/deploy-aztec-infra/main.tf @@ -113,11 +113,20 @@ locals { "global.testAccounts" = var.TEST_ACCOUNTS } + common_inline_values = yamlencode({ + global = merge( + length(var.L1_CONSENSUS_HOST_API_KEYS) > 0 ? { + l1ConsensusHostApiKeys = join(",", var.L1_CONSENSUS_HOST_API_KEYS) + } : {}, + length(var.L1_CONSENSUS_HOST_API_KEY_HEADERS) > 0 ? { + l1ConsensusHostApiKeyHeaders = join(",", var.L1_CONSENSUS_HOST_API_KEY_HEADERS) + } : {} + ) + }) + common_list_settings = { - "global.l1ExecutionUrls" = var.L1_RPC_URLS - "global.l1ConsensusUrls" = var.L1_CONSENSUS_HOST_URLS - "global.l1ConsensusHostApiKeys" = var.L1_CONSENSUS_HOST_API_KEYS - "global.l1ConsensusHostApiKeyHeaders" = var.L1_CONSENSUS_HOST_API_KEY_HEADERS + "global.l1ExecutionUrls" = var.L1_RPC_URLS + "global.l1ConsensusUrls" = var.L1_CONSENSUS_HOST_URLS } # Generate a set of _external_ host ports to use for P2P @@ -148,6 +157,9 @@ locals { service = { p2p = { publicIP = var.P2P_PUBLIC_IP } } + node = { + logLevel = var.LOG_LEVEL + } # spread validator pods to different nodes to avoid having two validators with the same attester keys on the same physical node topologySpreadConstraints = [{ maxSkew = 1 @@ -202,6 +214,7 @@ locals { "validator.node.env.SEQ_MAX_TX_PER_BLOCK" = var.SEQ_MAX_TX_PER_BLOCK "validator.node.env.SEQ_BLOCK_DURATION_MS" = var.SEQ_BLOCK_DURATION_MS "validator.node.env.SEQ_BUILD_CHECKPOINT_IF_EMPTY" = var.SEQ_BUILD_CHECKPOINT_IF_EMPTY + "validator.node.env.SEQ_ENFORCE_TIME_TABLE" = var.SEQ_ENFORCE_TIME_TABLE "validator.node.env.P2P_TX_POOL_DELETE_TXS_AFTER_REORG" = var.P2P_TX_POOL_DELETE_TXS_AFTER_REORG "validator.node.env.L1_PRIORITY_FEE_BUMP_PERCENTAGE" = var.VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE "validator.node.env.L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE" = var.VALIDATOR_L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE @@ -209,7 +222,6 @@ locals { "validator.node.env.P2P_MAX_TX_POOL_SIZE" = var.P2P_MAX_TX_POOL_SIZE "validator.node.env.PROVER_TEST_VERIFICATION_DELAY_MS" = var.PROVER_TEST_VERIFICATION_DELAY_MS "validator.node.env.DEBUG_P2P_INSTRUMENT_MESSAGES" = var.DEBUG_P2P_INSTRUMENT_MESSAGES - "validator.node.logLevel" = var.LOG_LEVEL "validator.node.secret.envEnabled" = true "validator.node.secret.mnemonic" = var.VALIDATOR_MNEMONIC "validator.node.secret.mnemonicIndex" = var.VALIDATOR_MNEMONIC_START_INDEX @@ -305,6 +317,19 @@ locals { service = { p2p = { publicIP = var.P2P_PUBLIC_IP } } + node = { + logLevel = var.LOG_LEVEL + } + } + broker = { + node = { + logLevel = var.LOG_LEVEL + } + } + agent = { + node = { + logLevel = var.LOG_LEVEL + } } })], local.is_kind ? [yamlencode({ agent = { @@ -318,7 +343,6 @@ locals { "node.mnemonic" = var.PROVER_MNEMONIC "node.mnemonicStartIndex" = var.PROVER_PUBLISHER_MNEMONIC_START_INDEX "node.node.proverRealProofs" = var.PROVER_REAL_PROOFS - "node.node.logLevel" = var.LOG_LEVEL "node.node.env.PROVER_FAILED_PROOF_STORE" = var.PROVER_FAILED_PROOF_STORE "node.node.env.PROVER_PROOF_STORE" = var.PROVER_PROOF_STORE "node.node.env.DEBUG_FORCE_TX_PROOF_VERIFICATION" = var.DEBUG_FORCE_TX_PROOF_VERIFICATION @@ -332,7 +356,6 @@ locals { "node.node.secret.mnemonic" = var.PROVER_MNEMONIC "node.node.secret.mnemonicIndex" = var.PROVER_PUBLISHER_MNEMONIC_START_INDEX "broker.node.proverRealProofs" = var.PROVER_REAL_PROOFS - "broker.node.logLevel" = var.LOG_LEVEL "broker.node.env.BOOTSTRAP_NODES" = "asdf" "broker.node.env.PROVER_BROKER_DEBUG_REPLAY_ENABLED" = var.PROVER_BROKER_DEBUG_REPLAY_ENABLED "agent.node.image.repository" = local.prover_agent_image.repository @@ -347,7 +370,6 @@ locals { "agent.node.env.PROVER_AGENT_PROOF_TYPES" = join(",", var.PROVER_AGENT_PROOF_TYPES) "agent.node.env.PROVER_PROOF_STORE" = var.PROVER_PROOF_STORE "agent.node.otelIncludeMetrics" = var.PROVER_AGENT_INCLUDE_METRICS - "agent.node.logLevel" = var.LOG_LEVEL "node.node.env.L1_PRIORITY_FEE_BUMP_PERCENTAGE" = var.PROVER_L1_PRIORITY_FEE_BUMP_PERCENTAGE "node.node.env.L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE" = var.PROVER_L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE "node.node.env.P2P_MAX_TX_POOL_SIZE" = var.P2P_MAX_TX_POOL_SIZE @@ -382,7 +404,7 @@ locals { "rpc.yaml", "rpc-resources-${var.RPC_RESOURCE_PROFILE}.yaml" ] - inline_values = var.RPC_INGRESS_ENABLED ? [yamlencode({ + inline_values = concat(var.RPC_INGRESS_ENABLED ? [yamlencode({ service = { p2p = { publicIP = var.P2P_PUBLIC_IP } rpc = { @@ -413,7 +435,11 @@ locals { type = local.is_kind ? "ClusterIP" : "LoadBalancer" } } - })] + })], var.FISHERMAN_MODE ? [yamlencode({ + node = { + logLevel = var.FISHERMAN_LOG_LEVEL + } + })] : []) custom_settings = merge({ "replicaCount" = var.RPC_REPLICAS @@ -449,7 +475,6 @@ locals { "node.secret.mnemonic" = var.FISHERMAN_MNEMONIC "node.secret.mnemonicIndex" = var.FISHERMAN_MNEMONIC_START_INDEX "node.env.KEY_INDEX_START" = var.FISHERMAN_MNEMONIC_START_INDEX - "node.logLevel" = var.FISHERMAN_LOG_LEVEL "node.env.VALIDATORS_PER_NODE" = "1" "node.preStartScript" = "source /scripts/get-private-key.sh" } : {} @@ -672,6 +697,7 @@ resource "helm_release" "releases" { values = concat( [for v in each.value.values : file("./values/${v}")], + [local.common_inline_values], lookup(each.value, "inline_values", []) ) diff --git a/spartan/terraform/deploy-aztec-infra/variables.tf b/spartan/terraform/deploy-aztec-infra/variables.tf index 358e2b0ec335..a03fa5550cc6 100644 --- a/spartan/terraform/deploy-aztec-infra/variables.tf +++ b/spartan/terraform/deploy-aztec-infra/variables.tf @@ -343,6 +343,13 @@ variable "SEQ_MAX_TX_PER_BLOCK" { default = "8" } +variable "SEQ_ENFORCE_TIME_TABLE" { + description = "Whether to enforce the time table when building blocks" + type = string + nullable = true + default = null +} + variable "SEQ_SKIP_CHECKPOINT_PUBLISH_PERCENT" { description = "Percentage probability of skipping checkpoint publishing" type = string diff --git a/yarn-project/CLAUDE.md b/yarn-project/CLAUDE.md index 1d493ac162e1..8adc4f69a2d3 100644 --- a/yarn-project/CLAUDE.md +++ b/yarn-project/CLAUDE.md @@ -110,6 +110,10 @@ LOG_LEVEL='info; debug:sequencer,archiver' yarn workspace @aztec/ **IMPORTANT**: These commands are run from the root of `yarn-project`, NOT the git root. +### Style + +- **Line width**: 120 characters (`printWidth: 120` in `.prettierrc.json`). Wrap comments and code at 120, not 80. + ### Format ```bash diff --git a/yarn-project/archiver/src/archiver-store.test.ts b/yarn-project/archiver/src/archiver-store.test.ts index d5cd45f3a3fa..950b90008ea8 100644 --- a/yarn-project/archiver/src/archiver-store.test.ts +++ b/yarn-project/archiver/src/archiver-store.test.ts @@ -432,4 +432,116 @@ describe('Archiver Store', () => { expect(result).toEqual([]); }); }); + + describe('rollbackTo', () => { + beforeEach(() => { + publicClient.getBlock.mockImplementation( + (args: { blockNumber?: bigint } = {}) => + Promise.resolve({ number: args.blockNumber ?? 0n, hash: `0x${'0'.repeat(64)}` }) as any, + ); + }); + + it('rejects rollback to a block that is not at a checkpoint boundary', async () => { + const genesisArchive = new AppendOnlyTreeSnapshot(new Fr(GENESIS_ARCHIVE_ROOT), 1); + // Checkpoint 1: 3 blocks (1, 2, 3). Checkpoint 2: 3 blocks (4, 5, 6). + const testCheckpoints = await makeChainedCheckpoints(2, { + previousArchive: genesisArchive, + blocksPerCheckpoint: 3, + }); + await archiverStore.addCheckpoints(testCheckpoints); + + // Block 1 is not at a checkpoint boundary (checkpoint 1 ends at block 3) + await expect(archiver.rollbackTo(BlockNumber(1))).rejects.toThrow( + /not at a checkpoint boundary.*Use block 3 to roll back to this checkpoint.*or block 0 to roll back to the previous one/, + ); + + // Block 2 is also not at a checkpoint boundary + await expect(archiver.rollbackTo(BlockNumber(2))).rejects.toThrow( + /not at a checkpoint boundary.*Use block 3 to roll back to this checkpoint.*or block 0 to roll back to the previous one/, + ); + }); + + it('allows rollback to the last block of a checkpoint and updates sync points', async () => { + const genesisArchive = new AppendOnlyTreeSnapshot(new Fr(GENESIS_ARCHIVE_ROOT), 1); + // Checkpoint 1: 3 blocks (1, 2, 3), L1 block 10. Checkpoint 2: 3 blocks (4, 5, 6), L1 block 20. + const testCheckpoints = await makeChainedCheckpoints(2, { + previousArchive: genesisArchive, + blocksPerCheckpoint: 3, + }); + await archiverStore.addCheckpoints(testCheckpoints); + + // Block 3 is the last block of checkpoint 1 — should succeed + await archiver.rollbackTo(BlockNumber(3)); + + expect(await archiver.getSynchedCheckpointNumber()).toEqual(CheckpointNumber(1)); + + // Verify sync points are set to checkpoint 1's L1 block number (10) + const synchPoint = await archiverStore.getSynchPoint(); + expect(synchPoint.blocksSynchedTo).toEqual(10n); + expect(synchPoint.messagesSynchedTo?.l1BlockNumber).toEqual(10n); + }); + + it('includes correct boundary info in error for mid-checkpoint rollback', async () => { + const genesisArchive = new AppendOnlyTreeSnapshot(new Fr(GENESIS_ARCHIVE_ROOT), 1); + // Checkpoint 1: 2 blocks (1, 2). Checkpoint 2: 3 blocks (3, 4, 5). + const checkpoints1 = await makeChainedCheckpoints(1, { + previousArchive: genesisArchive, + blocksPerCheckpoint: 2, + }); + const checkpoints2 = await makeChainedCheckpoints(1, { + previousArchive: checkpoints1[0].checkpoint.blocks.at(-1)!.archive, + startCheckpointNumber: CheckpointNumber(2), + startBlockNumber: 3, + startL1BlockNumber: 20, + blocksPerCheckpoint: 3, + }); + await archiverStore.addCheckpoints([...checkpoints1, ...checkpoints2]); + + // Block 3 is the first of checkpoint 2 (spans 3-5) + // Should suggest block 5 (end of this checkpoint) or block 2 (end of previous) + await expect(archiver.rollbackTo(BlockNumber(3))).rejects.toThrow( + /Checkpoint 2 spans blocks 3 to 5.*Use block 5 to roll back to this checkpoint.*or block 2 to roll back to the previous one/, + ); + }); + + it('rolls back proven checkpoint number when target is before proven block', async () => { + const genesisArchive = new AppendOnlyTreeSnapshot(new Fr(GENESIS_ARCHIVE_ROOT), 1); + // Checkpoint 1: blocks 1-2, Checkpoint 2: blocks 3-4, Checkpoint 3: blocks 5-6 + const testCheckpoints = await makeChainedCheckpoints(3, { + previousArchive: genesisArchive, + blocksPerCheckpoint: 2, + }); + await archiverStore.addCheckpoints(testCheckpoints); + + // Mark checkpoint 2 as proven + await archiverStore.setProvenCheckpointNumber(CheckpointNumber(2)); + expect(await archiver.getProvenCheckpointNumber()).toEqual(CheckpointNumber(2)); + + // Roll back to block 2 (end of checkpoint 1), which is before proven block 4 + await archiver.rollbackTo(BlockNumber(2)); + + expect(await archiver.getSynchedCheckpointNumber()).toEqual(CheckpointNumber(1)); + expect(await archiver.getProvenCheckpointNumber()).toEqual(CheckpointNumber(1)); + }); + + it('preserves proven checkpoint number when target is after proven block', async () => { + const genesisArchive = new AppendOnlyTreeSnapshot(new Fr(GENESIS_ARCHIVE_ROOT), 1); + // Checkpoint 1: blocks 1-2, Checkpoint 2: blocks 3-4, Checkpoint 3: blocks 5-6 + const testCheckpoints = await makeChainedCheckpoints(3, { + previousArchive: genesisArchive, + blocksPerCheckpoint: 2, + }); + await archiverStore.addCheckpoints(testCheckpoints); + + // Mark checkpoint 1 as proven + await archiverStore.setProvenCheckpointNumber(CheckpointNumber(1)); + expect(await archiver.getProvenCheckpointNumber()).toEqual(CheckpointNumber(1)); + + // Roll back to block 4 (end of checkpoint 2), which is after proven block 2 + await archiver.rollbackTo(BlockNumber(4)); + + expect(await archiver.getSynchedCheckpointNumber()).toEqual(CheckpointNumber(2)); + expect(await archiver.getProvenCheckpointNumber()).toEqual(CheckpointNumber(1)); + }); + }); }); diff --git a/yarn-project/archiver/src/archiver-sync.test.ts b/yarn-project/archiver/src/archiver-sync.test.ts index bbe5f3aa236e..1779d1362a3e 100644 --- a/yarn-project/archiver/src/archiver-sync.test.ts +++ b/yarn-project/archiver/src/archiver-sync.test.ts @@ -126,7 +126,6 @@ describe('Archiver Sync', () => { publicClient, rollupContract, inboxContract, - contractAddresses, archiverStore, config, blobClient, diff --git a/yarn-project/archiver/src/archiver.ts b/yarn-project/archiver/src/archiver.ts index 4aec6f3c9e69..de82a0482186 100644 --- a/yarn-project/archiver/src/archiver.ts +++ b/yarn-project/archiver/src/archiver.ts @@ -399,7 +399,6 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra } public async rollbackTo(targetL2BlockNumber: BlockNumber): Promise { - // TODO(pw/mbps): This still assumes 1 block per checkpoint const currentBlocks = await this.getL2Tips(); const currentL2Block = currentBlocks.proposed.number; const currentProvenBlock = currentBlocks.proven.block.number; @@ -411,8 +410,25 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra if (!targetL2Block) { throw new Error(`Target L2 block ${targetL2BlockNumber} not found`); } - const targetL1BlockNumber = targetL2Block.l1.blockNumber; const targetCheckpointNumber = targetL2Block.checkpointNumber; + + // Rollback operates at checkpoint granularity: the target block must be the last block of its checkpoint. + const checkpointData = await this.store.getCheckpointData(targetCheckpointNumber); + if (checkpointData) { + const lastBlockInCheckpoint = BlockNumber(checkpointData.startBlock + checkpointData.blockCount - 1); + if (targetL2BlockNumber !== lastBlockInCheckpoint) { + const previousCheckpointBoundary = + checkpointData.startBlock > 1 ? BlockNumber(checkpointData.startBlock - 1) : BlockNumber(0); + throw new Error( + `Target L2 block ${targetL2BlockNumber} is not at a checkpoint boundary. ` + + `Checkpoint ${targetCheckpointNumber} spans blocks ${checkpointData.startBlock} to ${lastBlockInCheckpoint}. ` + + `Use block ${lastBlockInCheckpoint} to roll back to this checkpoint, ` + + `or block ${previousCheckpointBoundary} to roll back to the previous one.`, + ); + } + } + + const targetL1BlockNumber = targetL2Block.l1.blockNumber; const targetL1Block = await this.publicClient.getBlock({ blockNumber: targetL1BlockNumber, includeTransactions: false, @@ -431,13 +447,14 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra await this.store.setCheckpointSynchedL1BlockNumber(targetL1BlockNumber); await this.store.setMessageSynchedL1Block({ l1BlockNumber: targetL1BlockNumber, l1BlockHash: targetL1BlockHash }); if (targetL2BlockNumber < currentProvenBlock) { - this.log.info(`Clearing proven L2 block number`); - await this.updater.setProvenCheckpointNumber(CheckpointNumber.ZERO); + this.log.info(`Rolling back proven L2 checkpoint to ${targetCheckpointNumber}`); + await this.updater.setProvenCheckpointNumber(targetCheckpointNumber); } // TODO(palla/reorg): Set the finalized block when we add support for it. + // const currentFinalizedBlock = currentBlocks.finalized.block.number; // if (targetL2BlockNumber < currentFinalizedBlock) { - // this.log.info(`Clearing finalized L2 block number`); - // await this.store.setFinalizedL2BlockNumber(0); + // this.log.info(`Rolling back finalized L2 checkpoint to ${targetCheckpointNumber}`); + // await this.updater.setFinalizedCheckpointNumber(targetCheckpointNumber); // } } } diff --git a/yarn-project/archiver/src/factory.ts b/yarn-project/archiver/src/factory.ts index dc0ca5552d85..ca4d60f8a780 100644 --- a/yarn-project/archiver/src/factory.ts +++ b/yarn-project/archiver/src/factory.ts @@ -138,7 +138,6 @@ export async function createArchiver( debugClient, rollup, inbox, - { ...config.l1Contracts, slashingProposerAddress }, archiverStore, archiverConfig, deps.blobClient, diff --git a/yarn-project/archiver/src/l1/README.md b/yarn-project/archiver/src/l1/README.md index c1cb4ecdab8c..2076d0e61bbc 100644 --- a/yarn-project/archiver/src/l1/README.md +++ b/yarn-project/archiver/src/l1/README.md @@ -5,29 +5,27 @@ Modules and classes to handle data retrieval from L1 for the archiver. ## Calldata Retriever The sequencer publisher bundles multiple operations into a single multicall3 transaction for gas -efficiency. A typical transaction includes: +efficiency. The archiver needs to extract the `propose` calldata from these bundled transactions +to reconstruct L2 blocks. -1. Attestation invalidations (if needed): `invalidateBadAttestation`, `invalidateInsufficientAttestations` -2. Block proposal: `propose` (exactly one per transaction to the rollup contract) -3. Governance and slashing (if needed): votes, payload creation/execution +The retriever uses hash matching against `attestationsHash` and `payloadDigest` from the +`CheckpointProposed` L1 event to verify it has found the correct propose calldata. These hashes +are always required. -The archiver needs to extract the `propose` calldata from these bundled transactions to reconstruct -L2 blocks. This class needs to handle scenarios where the transaction was submitted via multicall3, -as well as alternative ways for submitting the `propose` call that other clients might use. +### Multicall3 Decoding with Hash Matching -### Multicall3 Validation and Decoding - -First attempt to decode the transaction as a multicall3 `aggregate3` call with validation: +First attempt to decode the transaction as a multicall3 `aggregate3` call: - Check if transaction is to multicall3 address (`0xcA11bde05977b3631167028862bE2a173976CA11`) - Decode as `aggregate3(Call3[] calldata calls)` -- Allow calls to known addresses and methods (rollup, governance, slashing contracts, etc.) -- Find the single `propose` call to the rollup contract -- Verify exactly one `propose` call exists -- Extract and return the propose calldata +- Find all calls matching the rollup contract address and the `propose` function selector +- Verify each candidate by computing `attestationsHash` (keccak256 of ABI-encoded attestations) + and `payloadDigest` (keccak256 of the consensus payload signing hash) and comparing against + expected values from the `CheckpointProposed` event +- Return the verified candidate (if multiple verify, return the first with a warning) -This step handles the common case efficiently without requiring expensive trace or debug RPC calls. -Any validation failure triggers fallback to the next step. +This approach works regardless of what other calls are in the multicall3 bundle, because hash +matching identifies the correct propose call without needing an allowlist. ### Direct Propose Call @@ -35,64 +33,23 @@ Second attempt to decode the transaction as a direct `propose` call to the rollu - Check if transaction is to the rollup address - Decode as `propose` function call -- Verify the function is indeed `propose` +- Verify against expected hashes - Return the transaction input as the propose calldata -This handles scenarios where clients submit transactions directly to the rollup contract without -using multicall3 for bundling. Any validation failure triggers fallback to the next step. - ### Spire Proposer Call -Given existing attempts to route the call via the Spire proposer, we also check if the tx is `to` the -proposer known address, and if so, we try decoding it as either a multicall3 or a direct call to the -rollup contract. - -Similar as with the multicall3 check, we check that there are no other calls in the Spire proposer, so -we are absolutely sure that the only call is the successful one to the rollup. Any extraneous call would -imply an unexpected path to calling `propose` in the rollup contract, and since we cannot verify if the -calldata arguments we extracted are the correct ones (see the section below), we cannot know for sure which -one is the call that succeeded, so we don't know which calldata to process. - -Furthermore, since the Spire proposer is upgradeable, we check if the implementation has not changed in -order to decode. As usual, any validation failure triggers fallback to the next step. - -### Verifying Multicall3 Arguments - -**This is NOT implemented for simplicity's sake** - -If the checks above don't hold, such as when there are multiple calls to `propose`, then we cannot -reliably extract the `propose` calldata from the multicall3 arguments alone. We can try a best-effort -where we try all `propose` calls we see and validate them against on-chain data. Note that we can use these -same strategies if we were to obtain the calldata from another source. - -#### TempBlockLog Verification - -Read the stored `TempBlockLog` for the L2 block number from L1 and verify it matches our decoded header hash, -since the `TempBlockLog` stores the hash of the proposed block header, the payload commitment, and the attestations. - -However, `TempBlockLog` is only stored temporarily and deleted after proven, so this method only works for recent -blocks, not for historical data syncing. - -#### Archive Verification - -Verify that the archive root in the decoded propose is correct with regard to the block header. This requires -hashing the block header we have retrieved, inserting it into the archive tree, and checking the resulting root -against the one we got from L1. - -However, this requires that the archive keeps a reference to world-state, which is not the case in the current -system. - -#### Emit Commitments in Rollup Contract - -Modify rollup contract to emit commitments to the block header in the `L2BlockProposed` event, allowing us to easily -verify the calldata we obtained vs the emitted event. +Given existing attempts to route the call via the Spire proposer, we also check if the tx is +`to` the proposer known address. If so, we extract all wrapped calls and try each as either +a multicall3 or direct propose call, using hash matching to find and verify the correct one. -However, modifying the rollup contract is out of scope for this change. But we can implement this approach in `v2`. +Since the Spire proposer is upgradeable, we check that the implementation has not changed in +order to decode. Any validation failure triggers fallback to the next step. ### Debug and Trace Transaction Fallback -Last, we use L1 node's trace/debug RPC methods to definitively identify the one successful `propose` call within the tx. -We can then extract the exact calldata that hit the `propose` function in the rollup contract. +Last, we use L1 node's trace/debug RPC methods to definitively identify the one successful +`propose` call within the tx. We can then extract the exact calldata that hit the `propose` +function in the rollup contract. -This approach requires access to a debug-enabled L1 node, which may be more resource-intensive, so we only -use it as a fallback when the first step fails, which should be rare in practice. \ No newline at end of file +This approach requires access to a debug-enabled L1 node, which may be more resource-intensive, +so we only use it as a fallback when earlier steps fail, which should be rare in practice. diff --git a/yarn-project/archiver/src/l1/bin/retrieve-calldata.ts b/yarn-project/archiver/src/l1/bin/retrieve-calldata.ts index 6be4953275e4..e81e02e86547 100644 --- a/yarn-project/archiver/src/l1/bin/retrieve-calldata.ts +++ b/yarn-project/archiver/src/l1/bin/retrieve-calldata.ts @@ -5,7 +5,7 @@ import { EthAddress } from '@aztec/foundation/eth-address'; import { createLogger } from '@aztec/foundation/log'; import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi'; -import { type Hex, createPublicClient, getAbiItem, http, toEventSelector } from 'viem'; +import { type Hex, createPublicClient, decodeEventLog, getAbiItem, http, toEventSelector } from 'viem'; import { mainnet } from 'viem/chains'; import { CalldataRetriever } from '../calldata_retriever.js'; @@ -89,14 +89,6 @@ async function main() { logger.info(`Transaction found in block ${tx.blockNumber}`); - // For simplicity, use zero addresses for optional contract addresses - // In production, these would be fetched from the rollup contract or configuration - const slashingProposerAddress = EthAddress.ZERO; - const governanceProposerAddress = EthAddress.ZERO; - const slashFactoryAddress = undefined; - - logger.info('Using zero addresses for governance/slashing (can be configured if needed)'); - // Create CalldataRetriever const retriever = new CalldataRetriever( publicClient as unknown as ViemPublicClient, @@ -104,46 +96,67 @@ async function main() { targetCommitteeSize, undefined, logger, - { - rollupAddress, - governanceProposerAddress, - slashingProposerAddress, - slashFactoryAddress, - }, + rollupAddress, ); - // Extract checkpoint number from transaction logs - logger.info('Decoding transaction to extract checkpoint number...'); + // Extract checkpoint number and hashes from transaction logs + logger.info('Decoding transaction to extract checkpoint number and hashes...'); const receipt = await publicClient.getTransactionReceipt({ hash: txHash }); - // Look for CheckpointProposed event (emitted when a checkpoint is proposed to the rollup) - // Event signature: CheckpointProposed(uint256 indexed checkpointNumber, bytes32 indexed archive, bytes32[], bytes32, bytes32) - // Hash: keccak256("CheckpointProposed(uint256,bytes32,bytes32[],bytes32,bytes32)") - const checkpointProposedEvent = receipt.logs.find(log => { + // Look for CheckpointProposed event + const checkpointProposedEventAbi = getAbiItem({ abi: RollupAbi, name: 'CheckpointProposed' }); + const checkpointProposedLog = receipt.logs.find(log => { try { return ( log.address.toLowerCase() === rollupAddress.toString().toLowerCase() && - log.topics[0] === toEventSelector(getAbiItem({ abi: RollupAbi, name: 'CheckpointProposed' })) + log.topics[0] === toEventSelector(checkpointProposedEventAbi) ); } catch { return false; } }); - if (!checkpointProposedEvent || checkpointProposedEvent.topics[1] === undefined) { + if (!checkpointProposedLog || checkpointProposedLog.topics[1] === undefined) { throw new Error(`Checkpoint proposed event not found`); } - const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(checkpointProposedEvent.topics[1])); + const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(checkpointProposedLog.topics[1])); + + // Decode the full event to extract attestationsHash and payloadDigest + const decodedEvent = decodeEventLog({ + abi: RollupAbi, + data: checkpointProposedLog.data, + topics: checkpointProposedLog.topics, + }); + + const eventArgs = decodedEvent.args as { + checkpointNumber: bigint; + archive: Hex; + versionedBlobHashes: Hex[]; + attestationsHash: Hex; + payloadDigest: Hex; + }; + + if (!eventArgs.attestationsHash || !eventArgs.payloadDigest) { + throw new Error(`CheckpointProposed event missing attestationsHash or payloadDigest`); + } + + const expectedHashes = { + attestationsHash: eventArgs.attestationsHash, + payloadDigest: eventArgs.payloadDigest, + }; + + logger.info(`Checkpoint Number: ${checkpointNumber}`); + logger.info(`Attestations Hash: ${expectedHashes.attestationsHash}`); + logger.info(`Payload Digest: ${expectedHashes.payloadDigest}`); logger.info(''); logger.info('Retrieving checkpoint from rollup transaction...'); logger.info(''); - // For this script, we don't have blob hashes or expected hashes, so pass empty arrays/objects - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, expectedHashes); - logger.info(' Successfully retrieved block header!'); + logger.info(' Successfully retrieved block header!'); logger.info(''); logger.info('Block Header Details:'); logger.info('===================='); diff --git a/yarn-project/archiver/src/l1/calldata_retriever.test.ts b/yarn-project/archiver/src/l1/calldata_retriever.test.ts index 45f0a81d9db1..0d1c78ef707c 100644 --- a/yarn-project/archiver/src/l1/calldata_retriever.test.ts +++ b/yarn-project/archiver/src/l1/calldata_retriever.test.ts @@ -32,7 +32,7 @@ import { EIP1967_IMPLEMENTATION_SLOT, SPIRE_PROPOSER_ADDRESS, SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION, - getCallFromSpireProposer, + getCallsFromSpireProposer, verifyProxyImplementation, } from './spire_proposer.js'; @@ -40,25 +40,35 @@ import { * Test class that exposes protected methods for testing */ class TestCalldataRetriever extends CalldataRetriever { - public override tryDecodeMulticall3(tx: Transaction): Hex | undefined { - return super.tryDecodeMulticall3(tx); + public override tryDecodeMulticall3( + tx: Transaction, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + checkpointNumber: CheckpointNumber, + blockHash: Hex, + ) { + return super.tryDecodeMulticall3(tx, expectedHashes, checkpointNumber, blockHash); } - public override tryDecodeDirectPropose(tx: Transaction): Hex | undefined { - return super.tryDecodeDirectPropose(tx); + public override tryDecodeDirectPropose( + tx: Transaction, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + checkpointNumber: CheckpointNumber, + blockHash: Hex, + ) { + return super.tryDecodeDirectPropose(tx, expectedHashes, checkpointNumber, blockHash); } public override async extractCalldataViaTrace(txHash: Hex): Promise { return await super.extractCalldataViaTrace(txHash); } - public override decodeAndBuildCheckpoint( + public override tryDecodeAndVerifyPropose( proposeCalldata: Hex, - blockHash: Hex, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, checkpointNumber: CheckpointNumber, - expectedHashes: { attestationsHash?: Hex; payloadDigest?: Hex }, + blockHash: Hex, ) { - return super.decodeAndBuildCheckpoint(proposeCalldata, blockHash, checkpointNumber, expectedHashes); + return super.tryDecodeAndVerifyPropose(proposeCalldata, expectedHashes, checkpointNumber, blockHash); } } @@ -72,10 +82,8 @@ describe('CalldataRetriever', () => { const TARGET_COMMITTEE_SIZE = 5; const rollupAddress = EthAddress.random(); - const governanceProposerAddress = EthAddress.random(); - const slashFactoryAddress = EthAddress.random(); - const slashingProposerAddress = EthAddress.random(); const blockHash = Buffer32.random().toString(); + const checkpointNumber = CheckpointNumber(42); beforeEach(() => { txHash = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'; @@ -84,12 +92,14 @@ describe('CalldataRetriever', () => { logger = createLogger('test:calldata_retriever'); instrumentation = mock(); - retriever = new TestCalldataRetriever(publicClient, debugClient, TARGET_COMMITTEE_SIZE, instrumentation, logger, { + retriever = new TestCalldataRetriever( + publicClient, + debugClient, + TARGET_COMMITTEE_SIZE, + instrumentation, + logger, rollupAddress, - governanceProposerAddress, - slashFactoryAddress, - slashingProposerAddress, - }); + ); }); function makeViemHeader(): ViemHeader { @@ -136,6 +146,19 @@ describe('CalldataRetriever', () => { }); } + /** + * Sets up mocks for the hash computation methods to return specific test hashes. + * This allows us to test validation logic without recomputing hashes (which would duplicate production logic). + */ + function mockHashComputation( + attestationsHash: Hex = '0x1111111111111111111111111111111111111111111111111111111111111111', + payloadDigest: Hex = '0x2222222222222222222222222222222222222222222222222222222222222222', + ): { attestationsHash: Hex; payloadDigest: Hex } { + jest.spyOn(retriever as any, 'computeAttestationsHash').mockReturnValue(attestationsHash); + jest.spyOn(retriever as any, 'computePayloadDigest').mockReturnValue(payloadDigest); + return { attestationsHash, payloadDigest }; + } + function makeMulticall3Transaction(calls: { target: Hex; callData: Hex }[]): Transaction { const multicall3Data = encodeFunctionData({ abi: multicall3Abi, @@ -151,15 +174,14 @@ describe('CalldataRetriever', () => { } describe('getCheckpointFromRollupTx', () => { - const checkpointNumber = CheckpointNumber(42); - it('should successfully decode valid multicall3 transaction', async () => { const proposeCalldata = makeProposeCalldata(); const tx = makeMulticall3Transaction([{ target: rollupAddress.toString(), callData: proposeCalldata }]); + const hashes = mockHashComputation(); publicClient.getTransaction.mockResolvedValue(tx); - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); expect(result.checkpointNumber).toBe(checkpointNumber); expect(result.header).toBeInstanceOf(CheckpointHeader); @@ -171,6 +193,7 @@ describe('CalldataRetriever', () => { it('should fall back to direct propose when multicall3 decoding fails', async () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); // Transaction that's not multicall3 but is a direct propose call const tx = { @@ -182,7 +205,7 @@ describe('CalldataRetriever', () => { publicClient.getTransaction.mockResolvedValue(tx); - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); expect(result.checkpointNumber).toBe(checkpointNumber); expect(result.header).toBeInstanceOf(CheckpointHeader); @@ -191,6 +214,7 @@ describe('CalldataRetriever', () => { it('should fall back to trace when both multicall3 and direct propose fail', async () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); // Transaction that's neither multicall3 nor direct propose (wrong address) const wrongAddress = EthAddress.random(); @@ -224,7 +248,7 @@ describe('CalldataRetriever', () => { }, ]); - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); expect(result.checkpointNumber).toBe(checkpointNumber); expect(debugClient.request).toHaveBeenCalledWith({ method: 'trace_transaction', params: [txHash] }); @@ -233,6 +257,7 @@ describe('CalldataRetriever', () => { it('should throw when tracing fails', async () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); // Transaction that's neither multicall3 nor direct propose (wrong address) const wrongAddress = EthAddress.random(); @@ -248,20 +273,21 @@ describe('CalldataRetriever', () => { // Mock both trace methods to fail debugClient.request.mockRejectedValue(new Error(`Method not available`)); - await expect(retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {})).rejects.toThrow( + await expect(retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes)).rejects.toThrow( 'Failed to trace transaction', ); }); it('should throw when transaction retrieval fails', async () => { + const hashes = mockHashComputation(); publicClient.getTransaction.mockRejectedValue(new Error('Transaction not found')); - await expect(retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {})).rejects.toThrow( + await expect(retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes)).rejects.toThrow( 'Transaction not found', ); }); - it('should validate attestationsHash when provided', async () => { + it('should validate attestationsHash', async () => { const attestations = makeViemCommitteeAttestations(); const proposeCalldata = makeProposeCalldata(undefined, attestations); const tx = makeMulticall3Transaction([{ target: rollupAddress.toString(), callData: proposeCalldata }]); @@ -289,8 +315,14 @@ describe('CalldataRetriever', () => { ), ); + // Mock only payloadDigest computation; use real attestationsHash + jest + .spyOn(retriever as any, 'computePayloadDigest') + .mockReturnValue('0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, { attestationsHash: expectedAttestationsHash, + payloadDigest: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex, }); expect(result.checkpointNumber).toBe(checkpointNumber); @@ -301,34 +333,23 @@ describe('CalldataRetriever', () => { const attestations = makeViemCommitteeAttestations(); const proposeCalldata = makeProposeCalldata(undefined, attestations); const tx = makeMulticall3Transaction([{ target: rollupAddress.toString(), callData: proposeCalldata }]); + const hashes = mockHashComputation(); publicClient.getTransaction.mockResolvedValue(tx); - // Use a different (wrong) attestationsHash + // Use a different (wrong) attestationsHash — hash mismatch causes tryDecodeMulticall3 to + // return undefined, falling through to trace which fails in tests const wrongAttestationsHash = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex; await expect( retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, { attestationsHash: wrongAttestationsHash, + payloadDigest: hashes.payloadDigest, }), - ).rejects.toThrow('Attestations hash mismatch'); - }); - - it('should work with empty expectedHashes for backwards compatibility', async () => { - const proposeCalldata = makeProposeCalldata(); - const tx = makeMulticall3Transaction([{ target: rollupAddress.toString(), callData: proposeCalldata }]); - - publicClient.getTransaction.mockResolvedValue(tx); - - // Call with empty expectedHashes (simulating old event format without hash fields) - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); - - expect(result.checkpointNumber).toBe(checkpointNumber); - expect(result.header).toBeInstanceOf(CheckpointHeader); - // Should succeed without validation when hashes are not provided + ).rejects.toThrow('Failed to trace'); }); - it('should validate payloadDigest when provided', async () => { + it('should validate payloadDigest', async () => { const header = makeViemHeader(); const attestations = makeViemCommitteeAttestations(); const archiveRoot = Fr.random(); @@ -362,7 +383,13 @@ describe('CalldataRetriever', () => { const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation); const expectedPayloadDigest = keccak256(payloadToSign); + // Mock only attestationsHash computation; use real payloadDigest + jest + .spyOn(retriever as any, 'computeAttestationsHash') + .mockReturnValue('0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, { + attestationsHash: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex, payloadDigest: expectedPayloadDigest, }); @@ -373,132 +400,180 @@ describe('CalldataRetriever', () => { it('should throw when payloadDigest does not match', async () => { const proposeCalldata = makeProposeCalldata(); const tx = makeMulticall3Transaction([{ target: rollupAddress.toString(), callData: proposeCalldata }]); + const hashes = mockHashComputation(); publicClient.getTransaction.mockResolvedValue(tx); - // Use a different (wrong) payloadDigest + // Use a different (wrong) payloadDigest — hash mismatch causes tryDecodeMulticall3 to + // return undefined, falling through to trace which fails in tests const wrongPayloadDigest = '0x0000000000000000000000000000000000000000000000000000000000000002' as Hex; await expect( retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, { + attestationsHash: hashes.attestationsHash, payloadDigest: wrongPayloadDigest, }), - ).rejects.toThrow('Payload digest mismatch'); + ).rejects.toThrow('Failed to trace'); }); }); + describe('tryDecodeMulticall3', () => { - it('should decode simple multicall3 with single propose call', () => { + it('should decode multicall3 with single verified propose call', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = makeMulticall3Transaction([{ target: rollupAddress.toString() as Hex, callData: proposeCalldata }]); - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); - expect(result).toBe(proposeCalldata); + expect(result).toBeDefined(); + expect(result!.header).toBeInstanceOf(CheckpointHeader); + expect(result!.archiveRoot).toBeInstanceOf(Fr); + expect(result!.checkpointNumber).toBe(checkpointNumber); }); - it('should decode multicall3 with propose and other rollup calls', () => { + it('should decode multicall3 with propose and other calls (hash matching ignores non-propose)', () => { const proposeCalldata = makeProposeCalldata(); - // Use the actual selector for these functions + const hashes = mockHashComputation(); const invalidateBadSelector = toFunctionSelector( RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateBadAttestation')!, ); - const invalidateBadCalldata = (invalidateBadSelector + '0'.repeat(120)) as Hex; // Minimal valid calldata + const invalidateBadCalldata = (invalidateBadSelector + '0'.repeat(120)) as Hex; const tx = makeMulticall3Transaction([ { target: rollupAddress.toString() as Hex, callData: invalidateBadCalldata }, { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, ]); - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); - expect(result).toBe(proposeCalldata); + expect(result).toBeDefined(); + expect(result!.header).toBeInstanceOf(CheckpointHeader); }); - it('should decode multicall3 with mixed valid calls', () => { + it('should decode multicall3 with unknown calls when propose is hash-verified', () => { const proposeCalldata = makeProposeCalldata(); - const invalidateBadSelector = toFunctionSelector( - RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateBadAttestation')!, - ); - const invalidateBadCalldata = (invalidateBadSelector + '0'.repeat(120)) as Hex; + const hashes = mockHashComputation(); + const unknownAddress = EthAddress.random(); const tx = makeMulticall3Transaction([ - { target: rollupAddress.toString() as Hex, callData: invalidateBadCalldata }, + { target: unknownAddress.toString() as Hex, callData: '0x12345678' as Hex }, { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, ]); - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); + expect(result).toBeDefined(); + expect(result!.header).toBeInstanceOf(CheckpointHeader); + }); + + it('should return first when multiple propose candidates all verify (with warning)', () => { + const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); - expect(result).toBe(proposeCalldata); + // Same calldata twice -> both verify + const tx = makeMulticall3Transaction([ + { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, + { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, + ]); + + const warnSpy = jest.spyOn(logger, 'warn'); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); + expect(result).toBeDefined(); + expect(result!.header).toBeInstanceOf(CheckpointHeader); + expect(warnSpy).toHaveBeenCalledWith( + expect.stringContaining('Multiple propose candidates verified'), + expect.any(Object), + ); + warnSpy.mockRestore(); + }); + + it('should return the verified candidate when only one of multiple candidates verifies', () => { + const proposeCalldata1 = makeProposeCalldata(); + const proposeCalldata2 = makeProposeCalldata(); + + const hashes = mockHashComputation(); + + // Mock tryDecodeAndVerifyPropose to be selective - only first calldata verifies + jest.spyOn(retriever, 'tryDecodeAndVerifyPropose').mockImplementation((calldata, _hashes) => { + if (calldata === proposeCalldata1) { + return { + checkpointNumber, + archiveRoot: Fr.random(), + header: CheckpointHeader.random(), + attestations: [], + blockHash, + feeAssetPriceModifier: 0n, + }; + } + return undefined; + }); + + const tx = makeMulticall3Transaction([ + { target: rollupAddress.toString() as Hex, callData: proposeCalldata1 }, + { target: rollupAddress.toString() as Hex, callData: proposeCalldata2 }, + ]); + + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); + expect(result).toBeDefined(); + expect(result!.checkpointNumber).toBe(checkpointNumber); }); it('should return undefined when not to multicall3 address', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = { input: proposeCalldata, to: rollupAddress.toString() as Hex, hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); it('should return undefined when to is null', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = { input: proposeCalldata, to: null, hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); it('should return undefined when not multicall3 aggregate3', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = { input: proposeCalldata, to: MULTI_CALL_3_ADDRESS as Hex, hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); - it('should return undefined when call to unknown address', () => { + it('should return undefined when propose call to wrong address', () => { const proposeCalldata = makeProposeCalldata(); - const unknownAddress = EthAddress.random(); + const hashes = mockHashComputation(); + const wrongRollupAddress = EthAddress.random(); const tx = makeMulticall3Transaction([ - { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, - { target: unknownAddress.toString() as Hex, callData: '0x12345678' as Hex }, + { target: wrongRollupAddress.toString() as Hex, callData: proposeCalldata }, ]); - const result = retriever.tryDecodeMulticall3(tx); - - expect(result).toBeUndefined(); - }); - - it('should return undefined when unknown function selector on rollup', () => { - const proposeCalldata = makeProposeCalldata(); - const invalidCalldata = '0x99999999' as Hex; // Unknown selector - - const tx = makeMulticall3Transaction([ - { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, - { target: rollupAddress.toString() as Hex, callData: invalidCalldata }, - ]); - - const result = retriever.tryDecodeMulticall3(tx); - + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); it('should return undefined when no propose calls found', () => { + const hashes = mockHashComputation(); const invalidateBadSelector = toFunctionSelector( RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateBadAttestation')!, ); @@ -508,49 +583,53 @@ describe('CalldataRetriever', () => { { target: rollupAddress.toString() as Hex, callData: invalidateBadCalldata }, ]); - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); - it('should return undefined when multiple propose calls', () => { - const proposeCalldata1 = makeProposeCalldata(); - const proposeCalldata2 = makeProposeCalldata(); - - const tx = makeMulticall3Transaction([ - { target: rollupAddress.toString() as Hex, callData: proposeCalldata1 }, - { target: rollupAddress.toString() as Hex, callData: proposeCalldata2 }, - ]); + it('should return undefined when empty calls array', () => { + const hashes = mockHashComputation(); + const tx = makeMulticall3Transaction([]); - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); - it('should return undefined when calldata too short', () => { - const tx = makeMulticall3Transaction([{ target: rollupAddress.toString() as Hex, callData: '0x123' as Hex }]); - - const result = retriever.tryDecodeMulticall3(tx); - - expect(result).toBeUndefined(); - }); + it('should return undefined when hashes do not match', () => { + const proposeCalldata = makeProposeCalldata(); - it('should return undefined when empty calls array', () => { - const tx = makeMulticall3Transaction([]); + // Mock to return different hashes than expected + mockHashComputation( + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex, + '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex, + ); - const result = retriever.tryDecodeMulticall3(tx); + const tx = makeMulticall3Transaction([{ target: rollupAddress.toString() as Hex, callData: proposeCalldata }]); + // Pass different hashes - validation will fail + const result = retriever.tryDecodeMulticall3( + tx, + { + attestationsHash: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex, + payloadDigest: '0x0000000000000000000000000000000000000000000000000000000000000002' as Hex, + }, + checkpointNumber, + blockHash as Hex, + ); expect(result).toBeUndefined(); }); it('should return undefined when decoding throws exception', () => { + const hashes = mockHashComputation(); const tx = { input: '0xinvalid' as Hex, to: MULTI_CALL_3_ADDRESS as Hex, hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeMulticall3(tx); + const result = retriever.tryDecodeMulticall3(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); @@ -559,6 +638,7 @@ describe('CalldataRetriever', () => { describe('tryDecodeDirectPropose', () => { it('should decode direct propose call to rollup', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = { input: proposeCalldata, to: rollupAddress.toString() as Hex, @@ -566,13 +646,17 @@ describe('CalldataRetriever', () => { blockHash: Buffer32.random().toString() as Hex, } as Transaction; - const result = retriever.tryDecodeDirectPropose(tx); + const result = retriever.tryDecodeDirectPropose(tx, hashes, checkpointNumber, blockHash as Hex); - expect(result).toBe(proposeCalldata); + expect(result).toBeDefined(); + expect(result!.header).toBeInstanceOf(CheckpointHeader); + expect(result!.archiveRoot).toBeInstanceOf(Fr); + expect(result!.checkpointNumber).toBe(checkpointNumber); }); it('should return undefined when not to rollup address', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const wrongAddress = EthAddress.random(); const tx = { input: proposeCalldata, @@ -580,25 +664,27 @@ describe('CalldataRetriever', () => { hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeDirectPropose(tx); + const result = retriever.tryDecodeDirectPropose(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); it('should return undefined when to is null', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = { input: proposeCalldata, to: null, hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeDirectPropose(tx); + const result = retriever.tryDecodeDirectPropose(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); it('should return undefined when function is not propose', () => { + const hashes = mockHashComputation(); const invalidateBadSelector = toFunctionSelector( RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateBadAttestation')!, ); @@ -610,26 +696,55 @@ describe('CalldataRetriever', () => { hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeDirectPropose(tx); + const result = retriever.tryDecodeDirectPropose(tx, hashes, checkpointNumber, blockHash as Hex); expect(result).toBeUndefined(); }); it('should return undefined when input cannot be decoded', () => { + const hashes = mockHashComputation(); const tx = { input: '0xinvalid' as Hex, to: rollupAddress.toString() as Hex, hash: '0x123' as Hex, } as Transaction; - const result = retriever.tryDecodeDirectPropose(tx); + const result = retriever.tryDecodeDirectPropose(tx, hashes, checkpointNumber, blockHash as Hex); + + expect(result).toBeUndefined(); + }); + + it('should return undefined when hashes do not match', () => { + const proposeCalldata = makeProposeCalldata(); + + // Mock to return different hashes than expected + mockHashComputation( + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex, + '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex, + ); + + const tx = { + input: proposeCalldata, + to: rollupAddress.toString() as Hex, + hash: '0x123' as Hex, + } as Transaction; + + const result = retriever.tryDecodeDirectPropose( + tx, + { + attestationsHash: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex, + payloadDigest: '0x0000000000000000000000000000000000000000000000000000000000000002' as Hex, + }, + checkpointNumber, + blockHash as Hex, + ); expect(result).toBeUndefined(); }); }); describe('tryDecodeSpireProposer', () => { - function makeSpireProposerMulticallTransaction(call: { target: Hex; data: Hex }): Transaction { + function makeSpireProposerMulticallTransaction(calls: { target: Hex; data: Hex }[]): Transaction { const spireMulticallData = encodeFunctionData({ abi: [ { @@ -655,15 +770,13 @@ describe('CalldataRetriever', () => { ] as const, functionName: 'multicall', args: [ - [ - { - proposer: EthAddress.random().toString() as Hex, - target: call.target, - data: call.data, - value: 0n, - gasLimit: 1000000n, - }, - ], + calls.map(call => ({ + proposer: EthAddress.random().toString() as Hex, + target: call.target, + data: call.data, + value: 0n, + gasLimit: 1000000n, + })), ], }); @@ -677,21 +790,21 @@ describe('CalldataRetriever', () => { it('should decode Spire Proposer with direct propose call', async () => { const proposeCalldata = makeProposeCalldata(); - const tx = makeSpireProposerMulticallTransaction({ - target: rollupAddress.toString() as Hex, - data: proposeCalldata, - }); + const tx = makeSpireProposerMulticallTransaction([ + { target: rollupAddress.toString() as Hex, data: proposeCalldata }, + ]); // Mock the proxy implementation verification publicClient.getStorageAt.mockResolvedValue( ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeDefined(); - expect(result?.to.toLowerCase()).toBe(rollupAddress.toString().toLowerCase()); - expect(result?.data).toBe(proposeCalldata); + expect(result).toHaveLength(1); + expect(result![0].to.toLowerCase()).toBe(rollupAddress.toString().toLowerCase()); + expect(result![0].data).toBe(proposeCalldata); expect(publicClient.getStorageAt).toHaveBeenCalledWith({ address: SPIRE_PROPOSER_ADDRESS, slot: EIP1967_IMPLEMENTATION_SLOT, @@ -706,21 +819,37 @@ describe('CalldataRetriever', () => { args: [[{ target: rollupAddress.toString() as Hex, allowFailure: false, callData: proposeCalldata }]], }); - const tx = makeSpireProposerMulticallTransaction({ - target: MULTI_CALL_3_ADDRESS as Hex, - data: multicall3Data, - }); + const tx = makeSpireProposerMulticallTransaction([{ target: MULTI_CALL_3_ADDRESS as Hex, data: multicall3Data }]); // Mock the proxy implementation verification publicClient.getStorageAt.mockResolvedValue( ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeDefined(); - expect(result?.to).toBe(MULTI_CALL_3_ADDRESS); - expect(result?.data).toBe(multicall3Data); + expect(result).toHaveLength(1); + expect(result![0].to).toBe(MULTI_CALL_3_ADDRESS); + expect(result![0].data).toBe(multicall3Data); + }); + + it('should return all calls when Spire Proposer contains multiple calls', async () => { + const proposeCalldata = makeProposeCalldata(); + const tx = makeSpireProposerMulticallTransaction([ + { target: rollupAddress.toString() as Hex, data: proposeCalldata }, + { target: rollupAddress.toString() as Hex, data: proposeCalldata }, + ]); + + // Mock the proxy implementation verification + publicClient.getStorageAt.mockResolvedValue( + ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, + ); + + const result = await getCallsFromSpireProposer(tx, publicClient, logger); + + expect(result).toBeDefined(); + expect(result).toHaveLength(2); }); it('should return undefined when not to Spire Proposer address', async () => { @@ -731,7 +860,7 @@ describe('CalldataRetriever', () => { hash: txHash, } as Transaction; - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); expect(publicClient.getStorageAt).not.toHaveBeenCalled(); @@ -739,135 +868,36 @@ describe('CalldataRetriever', () => { it('should return undefined when proxy implementation verification fails', async () => { const proposeCalldata = makeProposeCalldata(); - const tx = makeSpireProposerMulticallTransaction({ - target: rollupAddress.toString() as Hex, - data: proposeCalldata, - }); + const tx = makeSpireProposerMulticallTransaction([ + { target: rollupAddress.toString() as Hex, data: proposeCalldata }, + ]); // Mock the proxy pointing to wrong implementation publicClient.getStorageAt.mockResolvedValue('0x000000000000000000000000wrongimplementation0000000000' as Hex); - const result = await getCallFromSpireProposer(tx, publicClient, logger); - - expect(result).toBeUndefined(); - }); - - it('should return undefined when Spire Proposer contains multiple calls', async () => { - const proposeCalldata = makeProposeCalldata(); - const spireMulticallData = encodeFunctionData({ - abi: [ - { - inputs: [ - { - components: [ - { internalType: 'address', name: 'proposer', type: 'address' }, - { internalType: 'address', name: 'target', type: 'address' }, - { internalType: 'bytes', name: 'data', type: 'bytes' }, - { internalType: 'uint256', name: 'value', type: 'uint256' }, - { internalType: 'uint256', name: 'gasLimit', type: 'uint256' }, - ], - internalType: 'struct IProposerMulticall.Call[]', - name: '_calls', - type: 'tuple[]', - }, - ], - name: 'multicall', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - ] as const, - functionName: 'multicall', - args: [ - [ - { - proposer: EthAddress.random().toString() as Hex, - target: rollupAddress.toString() as Hex, - data: proposeCalldata, - value: 0n, - gasLimit: 1000000n, - }, - { - proposer: EthAddress.random().toString() as Hex, - target: rollupAddress.toString() as Hex, - data: proposeCalldata, - value: 0n, - gasLimit: 1000000n, - }, - ], - ], - }); - - const tx = { - input: spireMulticallData, - blockHash, - to: SPIRE_PROPOSER_ADDRESS as Hex, - hash: txHash, - } as Transaction; - - // Mock the proxy implementation verification - publicClient.getStorageAt.mockResolvedValue( - ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, - ); - - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); }); it('should extract call even if target is unknown (validation happens in next step)', async () => { const unknownAddress = EthAddress.random(); - const tx = makeSpireProposerMulticallTransaction({ - target: unknownAddress.toString() as Hex, - data: '0x12345678' as Hex, - }); + const tx = makeSpireProposerMulticallTransaction([ + { target: unknownAddress.toString() as Hex, data: '0x12345678' as Hex }, + ]); // Mock the proxy implementation verification publicClient.getStorageAt.mockResolvedValue( ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); // Spire proposer should successfully extract the call, even if target is unknown - // The validation of the target happens in the next step (tryDecodeMulticall3 or tryDecodeDirectPropose) expect(result).toBeDefined(); - expect(result?.to.toLowerCase()).toBe(unknownAddress.toString().toLowerCase()); - expect(result?.data).toBe('0x12345678'); - }); - - it('should extract multicall3 call (validation of inner calls happens in next step)', async () => { - const proposeCalldata = makeProposeCalldata(); - const invalidCalldata = '0x99999999' as Hex; // Unknown selector - - const multicall3Data = encodeFunctionData({ - abi: multicall3Abi, - functionName: 'aggregate3', - args: [ - [ - { target: rollupAddress.toString() as Hex, allowFailure: false, callData: proposeCalldata }, - { target: rollupAddress.toString() as Hex, allowFailure: false, callData: invalidCalldata }, - ], - ], - }); - - const tx = makeSpireProposerMulticallTransaction({ - target: MULTI_CALL_3_ADDRESS as Hex, - data: multicall3Data, - }); - - // Mock the proxy implementation verification - publicClient.getStorageAt.mockResolvedValue( - ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, - ); - - const result = await getCallFromSpireProposer(tx, publicClient, logger); - - // Spire proposer should successfully extract the multicall3 call - // Validation of the inner calls happens in tryDecodeMulticall3 - expect(result).toBeDefined(); - expect(result?.to).toBe(MULTI_CALL_3_ADDRESS); - expect(result?.data).toBe(multicall3Data); + expect(result).toHaveLength(1); + expect(result![0].to.toLowerCase()).toBe(unknownAddress.toString().toLowerCase()); + expect(result![0].data).toBe('0x12345678'); }); }); @@ -1102,57 +1132,103 @@ describe('CalldataRetriever', () => { }); }); - describe('decodeAndBuildCheckpoint', () => { - const blockHash = Fr.random().toString() as Hex; - const checkpointNumber = CheckpointNumber(42); - - it('should correctly decode propose calldata and build checkpoint', () => { + describe('tryDecodeAndVerifyPropose', () => { + it('should decode and verify propose calldata successfully', () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); - const result = retriever.decodeAndBuildCheckpoint(proposeCalldata, blockHash, checkpointNumber, {}); + const result = retriever.tryDecodeAndVerifyPropose(proposeCalldata, hashes, checkpointNumber, blockHash as Hex); - expect(result.checkpointNumber).toBe(checkpointNumber); - expect(result.header).toBeInstanceOf(CheckpointHeader); - expect(result.archiveRoot).toBeInstanceOf(Fr); - expect(Array.isArray(result.attestations)).toBe(true); - expect(result.blockHash).toBe(blockHash); + expect(result).toBeDefined(); + expect(result!.checkpointNumber).toBe(checkpointNumber); + expect(result!.header).toBeInstanceOf(CheckpointHeader); + expect(result!.archiveRoot).toBeInstanceOf(Fr); + expect(Array.isArray(result!.attestations)).toBe(true); + expect(result!.blockHash).toBe(blockHash); }); it('should handle attestations correctly', () => { const attestations = makeViemCommitteeAttestations(); const proposeCalldata = makeProposeCalldata(undefined, attestations); + const hashes = mockHashComputation(); - const result = retriever.decodeAndBuildCheckpoint(proposeCalldata, blockHash, checkpointNumber, {}); + const result = retriever.tryDecodeAndVerifyPropose(proposeCalldata, hashes, checkpointNumber, blockHash as Hex); - expect(result.attestations).toHaveLength(TARGET_COMMITTEE_SIZE); + expect(result).toBeDefined(); + expect(result!.attestations).toHaveLength(TARGET_COMMITTEE_SIZE); }); - it('should throw when calldata is not for propose function', () => { + it('should return undefined when calldata is not for propose function', () => { const invalidateBadSelector = toFunctionSelector( RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateBadAttestation')!, ); const invalidCalldata = (invalidateBadSelector + '0'.repeat(120)) as Hex; + const hashes = mockHashComputation(); + + const result = retriever.tryDecodeAndVerifyPropose(invalidCalldata, hashes, checkpointNumber, blockHash as Hex); - expect(() => retriever.decodeAndBuildCheckpoint(invalidCalldata, blockHash, checkpointNumber, {})).toThrow(); + expect(result).toBeUndefined(); }); - it('should throw when calldata is malformed', () => { + it('should return undefined when calldata is malformed', () => { const malformedCalldata = '0xinvalid' as Hex; + const hashes = mockHashComputation(); + + const result = retriever.tryDecodeAndVerifyPropose(malformedCalldata, hashes, checkpointNumber, blockHash as Hex); + + expect(result).toBeUndefined(); + }); + + it('should return undefined when attestationsHash does not match', () => { + const proposeCalldata = makeProposeCalldata(); + mockHashComputation( + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex, + '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex, + ); + + const result = retriever.tryDecodeAndVerifyPropose( + proposeCalldata, + { + attestationsHash: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex, + payloadDigest: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex, + }, + checkpointNumber, + blockHash as Hex, + ); - expect(() => retriever.decodeAndBuildCheckpoint(malformedCalldata, blockHash, checkpointNumber, {})).toThrow(); + expect(result).toBeUndefined(); + }); + + it('should return undefined when payloadDigest does not match', () => { + const proposeCalldata = makeProposeCalldata(); + mockHashComputation( + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex, + '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as Hex, + ); + + const result = retriever.tryDecodeAndVerifyPropose( + proposeCalldata, + { + attestationsHash: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex, + payloadDigest: '0x0000000000000000000000000000000000000000000000000000000000000002' as Hex, + }, + checkpointNumber, + blockHash as Hex, + ); + + expect(result).toBeUndefined(); }); }); describe('integration', () => { - const checkpointNumber = CheckpointNumber(42); - it('should complete full flow from tx hash to checkpoint via multicall3', async () => { const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); const tx = makeMulticall3Transaction([{ target: rollupAddress.toString() as Hex, callData: proposeCalldata }]); publicClient.getTransaction.mockResolvedValue(tx); - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); expect(result).toBeDefined(); expect(result.checkpointNumber).toBe(checkpointNumber); @@ -1174,6 +1250,7 @@ describe('CalldataRetriever', () => { const SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION = '0x7d38d47e7c82195e6e607d3b0f1c20c615c7bf42'; const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation(); // Create Spire Proposer multicall transaction const spireMulticallData = encodeFunctionData({ @@ -1225,7 +1302,7 @@ describe('CalldataRetriever', () => { ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {}); + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); expect(result).toBeDefined(); expect(result.checkpointNumber).toBe(checkpointNumber); @@ -1244,5 +1321,141 @@ describe('CalldataRetriever', () => { // Verify instrumentation was called with Spire Proposer address expect(instrumentation.recordBlockProposalTxTarget).toHaveBeenCalledWith(SPIRE_PROPOSER_ADDRESS, false); }); + + it('should succeed via hash matching when multicall3 has unknown calls', async () => { + const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation( + '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890' as Hex, + '0x0fedcba987654321fedcba987654321fedcba987654321fedcba987654321fed' as Hex, + ); + const unknownAddress = EthAddress.random(); + + const tx = makeMulticall3Transaction([ + { target: unknownAddress.toString() as Hex, callData: '0x12345678' as Hex }, + { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, + ]); + + publicClient.getTransaction.mockResolvedValue(tx); + + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); + + expect(result.checkpointNumber).toBe(checkpointNumber); + expect(result.header).toBeInstanceOf(CheckpointHeader); + expect(result.archiveRoot).toBeInstanceOf(Fr); + expect(instrumentation.recordBlockProposalTxTarget).toHaveBeenCalledWith(MULTI_CALL_3_ADDRESS, false); + }); + + it('should succeed via Spire-wrapped multicall3 with unknown calls', async () => { + const proposeCalldata = makeProposeCalldata(); + const hashes = mockHashComputation( + '0x9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba' as Hex, + '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' as Hex, + ); + const unknownAddress = EthAddress.random(); + + const multicall3Data = encodeFunctionData({ + abi: multicall3Abi, + functionName: 'aggregate3', + args: [ + [ + { target: unknownAddress.toString() as Hex, allowFailure: false, callData: '0x12345678' as Hex }, + { target: rollupAddress.toString() as Hex, allowFailure: false, callData: proposeCalldata }, + ], + ], + }); + + const spireMulticallData = encodeFunctionData({ + abi: [ + { + inputs: [ + { + components: [ + { internalType: 'address', name: 'proposer', type: 'address' }, + { internalType: 'address', name: 'target', type: 'address' }, + { internalType: 'bytes', name: 'data', type: 'bytes' }, + { internalType: 'uint256', name: 'value', type: 'uint256' }, + { internalType: 'uint256', name: 'gasLimit', type: 'uint256' }, + ], + internalType: 'struct IProposerMulticall.Call[]', + name: '_calls', + type: 'tuple[]', + }, + ], + name: 'multicall', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + ] as const, + functionName: 'multicall', + args: [ + [ + { + proposer: EthAddress.random().toString() as Hex, + target: MULTI_CALL_3_ADDRESS as Hex, + data: multicall3Data, + value: 0n, + gasLimit: 1000000n, + }, + ], + ], + }); + + const tx = { + input: spireMulticallData, + blockHash, + to: SPIRE_PROPOSER_ADDRESS as Hex, + hash: txHash, + } as Transaction; + + publicClient.getTransaction.mockResolvedValue(tx); + publicClient.getStorageAt.mockResolvedValue( + ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, + ); + + const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, hashes); + + expect(result.checkpointNumber).toBe(checkpointNumber); + expect(result.header).toBeInstanceOf(CheckpointHeader); + expect(instrumentation.recordBlockProposalTxTarget).toHaveBeenCalledWith(SPIRE_PROPOSER_ADDRESS, false); + }); + + it('should fall back to trace with wrong hashes and final decode throws mismatch', async () => { + const proposeCalldata = makeProposeCalldata(); + const wrongHashes = { + attestationsHash: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex, + payloadDigest: '0x0000000000000000000000000000000000000000000000000000000000000002' as Hex, + }; + const unknownAddress = EthAddress.random(); + + const tx = makeMulticall3Transaction([ + { target: unknownAddress.toString() as Hex, callData: '0x12345678' as Hex }, + { target: rollupAddress.toString() as Hex, callData: proposeCalldata }, + ]); + + publicClient.getTransaction.mockResolvedValue(tx); + + // Mock trace to return the propose calldata (trace succeeds but final hash validation fails) + debugClient.request.mockResolvedValueOnce([ + { + type: 'call', + action: { + from: EthAddress.random().toString(), + to: rollupAddress.toString(), + callType: 'call', + input: proposeCalldata, + value: '0x0', + gas: '0x5208', + }, + result: { output: '0x', gasUsed: '0x5208' }, + subtraces: 0, + traceAddress: [], + }, + ]); + + await expect(retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, wrongHashes)).rejects.toThrow( + /hash mismatch/i, + ); + }); }); }); diff --git a/yarn-project/archiver/src/l1/calldata_retriever.ts b/yarn-project/archiver/src/l1/calldata_retriever.ts index f023bfbac865..e21f499b9e90 100644 --- a/yarn-project/archiver/src/l1/calldata_retriever.ts +++ b/yarn-project/archiver/src/l1/calldata_retriever.ts @@ -3,15 +3,8 @@ import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/ty import { CheckpointNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import { EthAddress } from '@aztec/foundation/eth-address'; -import type { ViemSignature } from '@aztec/foundation/eth-signature'; import type { Logger } from '@aztec/foundation/log'; -import { - EmpireSlashingProposerAbi, - GovernanceProposerAbi, - RollupAbi, - SlashFactoryAbi, - TallySlashingProposerAbi, -} from '@aztec/l1-artifacts'; +import { RollupAbi } from '@aztec/l1-artifacts'; import { CommitteeAttestation } from '@aztec/stdlib/block'; import { ConsensusPayload, SignatureDomainSeparator } from '@aztec/stdlib/p2p'; import { CheckpointHeader } from '@aztec/stdlib/rollup'; @@ -30,13 +23,24 @@ import { import type { ArchiverInstrumentation } from '../modules/instrumentation.js'; import { getSuccessfulCallsFromDebug } from './debug_tx.js'; -import { getCallFromSpireProposer } from './spire_proposer.js'; +import { getCallsFromSpireProposer } from './spire_proposer.js'; import { getSuccessfulCallsFromTrace } from './trace_tx.js'; import type { CallInfo } from './types.js'; +/** Decoded checkpoint data from a propose calldata. */ +type CheckpointData = { + checkpointNumber: CheckpointNumber; + archiveRoot: Fr; + header: CheckpointHeader; + attestations: CommitteeAttestation[]; + blockHash: string; + feeAssetPriceModifier: bigint; +}; + /** * Extracts calldata to the `propose` method of the rollup contract from an L1 transaction - * in order to reconstruct an L2 block header. + * in order to reconstruct an L2 block header. Uses hash matching against expected hashes + * from the CheckpointProposed event to verify the correct propose calldata. */ export class CalldataRetriever { /** Tx hashes we've already logged for trace+debug failure (log once per tx per process). */ @@ -47,27 +51,14 @@ export class CalldataRetriever { CalldataRetriever.traceFailureWarnedTxHashes.clear(); } - /** Pre-computed valid contract calls for validation */ - private readonly validContractCalls: ValidContractCall[]; - - private readonly rollupAddress: EthAddress; - constructor( private readonly publicClient: ViemPublicClient, private readonly debugClient: ViemPublicDebugClient, private readonly targetCommitteeSize: number, private readonly instrumentation: ArchiverInstrumentation | undefined, private readonly logger: Logger, - contractAddresses: { - rollupAddress: EthAddress; - governanceProposerAddress: EthAddress; - slashingProposerAddress: EthAddress; - slashFactoryAddress?: EthAddress; - }, - ) { - this.rollupAddress = contractAddresses.rollupAddress; - this.validContractCalls = computeValidContractCalls(contractAddresses); - } + private readonly rollupAddress: EthAddress, + ) {} /** * Gets checkpoint header and metadata from the calldata of an L1 transaction. @@ -75,7 +66,7 @@ export class CalldataRetriever { * @param txHash - Hash of the tx that published it. * @param blobHashes - Blob hashes for the checkpoint. * @param checkpointNumber - Checkpoint number. - * @param expectedHashes - Optional expected hashes from the CheckpointProposed event for validation + * @param expectedHashes - Expected hashes from the CheckpointProposed event for validation * @returns Checkpoint header and metadata from the calldata, deserialized */ async getCheckpointFromRollupTx( @@ -83,51 +74,43 @@ export class CalldataRetriever { _blobHashes: Buffer[], checkpointNumber: CheckpointNumber, expectedHashes: { - attestationsHash?: Hex; - payloadDigest?: Hex; + attestationsHash: Hex; + payloadDigest: Hex; }, - ): Promise<{ - checkpointNumber: CheckpointNumber; - archiveRoot: Fr; - header: CheckpointHeader; - attestations: CommitteeAttestation[]; - blockHash: string; - feeAssetPriceModifier: bigint; - }> { - this.logger.trace(`Fetching checkpoint ${checkpointNumber} from rollup tx ${txHash}`, { - willValidateHashes: !!expectedHashes.attestationsHash || !!expectedHashes.payloadDigest, - hasAttestationsHash: !!expectedHashes.attestationsHash, - hasPayloadDigest: !!expectedHashes.payloadDigest, - }); + ): Promise { + this.logger.trace(`Fetching checkpoint ${checkpointNumber} from rollup tx ${txHash}`); const tx = await this.publicClient.getTransaction({ hash: txHash }); - const proposeCalldata = await this.getProposeCallData(tx, checkpointNumber); - return this.decodeAndBuildCheckpoint(proposeCalldata, tx.blockHash!, checkpointNumber, expectedHashes); + return this.getCheckpointFromTx(tx, checkpointNumber, expectedHashes); } - /** Gets rollup propose calldata from a transaction */ - protected async getProposeCallData(tx: Transaction, checkpointNumber: CheckpointNumber): Promise { - // Try to decode as multicall3 with validation - const proposeCalldata = this.tryDecodeMulticall3(tx); - if (proposeCalldata) { + /** Gets checkpoint data from a transaction by trying decode strategies then falling back to trace. */ + protected async getCheckpointFromTx( + tx: Transaction, + checkpointNumber: CheckpointNumber, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + ): Promise { + // Try to decode as multicall3 with hash-verified matching + const multicall3Result = this.tryDecodeMulticall3(tx, expectedHashes, checkpointNumber, tx.blockHash!); + if (multicall3Result) { this.logger.trace(`Decoded propose calldata from multicall3 for tx ${tx.hash}`); this.instrumentation?.recordBlockProposalTxTarget(tx.to!, false); - return proposeCalldata; + return multicall3Result; } // Try to decode as direct propose call - const directProposeCalldata = this.tryDecodeDirectPropose(tx); - if (directProposeCalldata) { + const directResult = this.tryDecodeDirectPropose(tx, expectedHashes, checkpointNumber, tx.blockHash!); + if (directResult) { this.logger.trace(`Decoded propose calldata from direct call for tx ${tx.hash}`); this.instrumentation?.recordBlockProposalTxTarget(tx.to!, false); - return directProposeCalldata; + return directResult; } // Try to decode as Spire Proposer multicall wrapper - const spireProposeCalldata = await this.tryDecodeSpireProposer(tx); - if (spireProposeCalldata) { + const spireResult = await this.tryDecodeSpireProposer(tx, expectedHashes, checkpointNumber, tx.blockHash!); + if (spireResult) { this.logger.trace(`Decoded propose calldata from Spire Proposer for tx ${tx.hash}`); this.instrumentation?.recordBlockProposalTxTarget(tx.to!, false); - return spireProposeCalldata; + return spireResult; } // Fall back to trace-based extraction @@ -135,52 +118,82 @@ export class CalldataRetriever { `Failed to decode multicall3, direct propose, or Spire proposer for L1 tx ${tx.hash}, falling back to trace for checkpoint ${checkpointNumber}`, ); this.instrumentation?.recordBlockProposalTxTarget(tx.to ?? EthAddress.ZERO.toString(), true); - return await this.extractCalldataViaTrace(tx.hash); + const tracedCalldata = await this.extractCalldataViaTrace(tx.hash); + const tracedResult = this.tryDecodeAndVerifyPropose( + tracedCalldata, + expectedHashes, + checkpointNumber, + tx.blockHash!, + ); + if (!tracedResult) { + throw new Error(`Hash mismatch for traced propose calldata in tx ${tx.hash} for checkpoint ${checkpointNumber}`); + } + return tracedResult; } /** * Attempts to decode a transaction as a Spire Proposer multicall wrapper. - * If successful, extracts the wrapped call and validates it as either multicall3 or direct propose. + * If successful, iterates all wrapped calls and validates each as either multicall3 + * or direct propose, verifying against expected hashes. * @param tx - The transaction to decode - * @returns The propose calldata if successfully decoded and validated, undefined otherwise + * @param expectedHashes - Expected hashes for hash-verified matching + * @param checkpointNumber - The checkpoint number + * @param blockHash - The L1 block hash + * @returns The checkpoint data if successfully decoded and validated, undefined otherwise */ - protected async tryDecodeSpireProposer(tx: Transaction): Promise { - // Try to decode as Spire Proposer multicall (extracts the wrapped call) - const spireWrappedCall = await getCallFromSpireProposer(tx, this.publicClient, this.logger); - if (!spireWrappedCall) { + protected async tryDecodeSpireProposer( + tx: Transaction, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + checkpointNumber: CheckpointNumber, + blockHash: Hex, + ): Promise { + // Try to decode as Spire Proposer multicall (extracts all wrapped calls) + const spireWrappedCalls = await getCallsFromSpireProposer(tx, this.publicClient, this.logger); + if (!spireWrappedCalls) { return undefined; } - this.logger.trace(`Decoded Spire Proposer wrapping for tx ${tx.hash}, inner call to ${spireWrappedCall.to}`); + this.logger.trace(`Decoded Spire Proposer wrapping for tx ${tx.hash}, ${spireWrappedCalls.length} inner call(s)`); - // Now try to decode the wrapped call as either multicall3 or direct propose - const wrappedTx = { to: spireWrappedCall.to, input: spireWrappedCall.data, hash: tx.hash }; + // Try each wrapped call as either multicall3 or direct propose + for (const spireWrappedCall of spireWrappedCalls) { + const wrappedTx = { to: spireWrappedCall.to, input: spireWrappedCall.data, hash: tx.hash }; - const multicall3Calldata = this.tryDecodeMulticall3(wrappedTx); - if (multicall3Calldata) { - this.logger.trace(`Decoded propose calldata from Spire Proposer to multicall3 for tx ${tx.hash}`); - return multicall3Calldata; - } + const multicall3Result = this.tryDecodeMulticall3(wrappedTx, expectedHashes, checkpointNumber, blockHash); + if (multicall3Result) { + this.logger.trace(`Decoded propose calldata from Spire Proposer to multicall3 for tx ${tx.hash}`); + return multicall3Result; + } - const directProposeCalldata = this.tryDecodeDirectPropose(wrappedTx); - if (directProposeCalldata) { - this.logger.trace(`Decoded propose calldata from Spire Proposer to direct propose for tx ${tx.hash}`); - return directProposeCalldata; + const directResult = this.tryDecodeDirectPropose(wrappedTx, expectedHashes, checkpointNumber, blockHash); + if (directResult) { + this.logger.trace(`Decoded propose calldata from Spire Proposer to direct propose for tx ${tx.hash}`); + return directResult; + } } this.logger.warn( - `Spire Proposer wrapped call could not be decoded as multicall3 or direct propose for tx ${tx.hash}`, + `Spire Proposer wrapped calls could not be decoded as multicall3 or direct propose for tx ${tx.hash}`, ); return undefined; } /** * Attempts to decode transaction input as multicall3 and extract propose calldata. - * Returns undefined if validation fails. + * Finds all calls matching the rollup address and propose selector, then decodes + * and verifies each candidate against expected hashes from the CheckpointProposed event. * @param tx - The transaction-like object with to, input, and hash - * @returns The propose calldata if successfully validated, undefined otherwise + * @param expectedHashes - Expected hashes from CheckpointProposed event + * @param checkpointNumber - The checkpoint number + * @param blockHash - The L1 block hash + * @returns The checkpoint data if successfully validated, undefined otherwise */ - protected tryDecodeMulticall3(tx: { to: Hex | null | undefined; input: Hex; hash: Hex }): Hex | undefined { + protected tryDecodeMulticall3( + tx: { to: Hex | null | undefined; input: Hex; hash: Hex }, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + checkpointNumber: CheckpointNumber, + blockHash: Hex, + ): CheckpointData | undefined { const txHash = tx.hash; try { @@ -209,59 +222,54 @@ export class CalldataRetriever { const [calls] = multicall3Args; - // Validate all calls and find propose calls + // Find all calls matching rollup address + propose selector const rollupAddressLower = this.rollupAddress.toString().toLowerCase(); - const proposeCalls: Hex[] = []; + const proposeSelectorLower = PROPOSE_SELECTOR.toLowerCase(); + const candidates: Hex[] = []; - for (let i = 0; i < calls.length; i++) { - const addr = calls[i].target.toLowerCase(); - const callData = calls[i].callData; + for (const call of calls) { + const addr = call.target.toLowerCase(); + const callData = call.callData; - // Extract function selector (first 4 bytes) if (callData.length < 10) { - // "0x" + 8 hex chars = 10 chars minimum for a valid function call - this.logger.warn(`Invalid calldata length at index ${i} (${callData.length})`, { txHash }); - return undefined; + continue; } - const functionSelector = callData.slice(0, 10) as Hex; - - // Validate this call is allowed by searching through valid calls - const validCall = this.validContractCalls.find( - vc => vc.address === addr && vc.functionSelector === functionSelector, - ); - if (!validCall) { - this.logger.warn(`Invalid contract call detected in multicall3`, { - index: i, - targetAddress: addr, - functionSelector, - validCalls: this.validContractCalls.map(c => ({ address: c.address, selector: c.functionSelector })), - txHash, - }); - return undefined; + const selector = callData.slice(0, 10).toLowerCase(); + if (addr === rollupAddressLower && selector === proposeSelectorLower) { + candidates.push(callData); } + } - this.logger.trace(`Valid call found to ${addr}`, { validCall }); + if (candidates.length === 0) { + this.logger.debug(`No propose candidates found in multicall3`, { txHash }); + return undefined; + } - // Collect propose calls specifically - if (addr === rollupAddressLower && validCall.functionName === 'propose') { - proposeCalls.push(callData); + // Decode, verify, and build for each candidate + const verified: CheckpointData[] = []; + for (const candidate of candidates) { + const result = this.tryDecodeAndVerifyPropose(candidate, expectedHashes, checkpointNumber, blockHash); + if (result) { + verified.push(result); } } - // Validate exactly ONE propose call - if (proposeCalls.length === 0) { - this.logger.warn(`No propose calls found in multicall3`, { txHash }); - return undefined; + if (verified.length === 1) { + this.logger.trace(`Verified single propose candidate via hash matching`, { txHash }); + return verified[0]; } - if (proposeCalls.length > 1) { - this.logger.warn(`Multiple propose calls found in multicall3 (${proposeCalls.length})`, { txHash }); - return undefined; + if (verified.length > 1) { + this.logger.warn( + `Multiple propose candidates verified (${verified.length}), returning first (identical data)`, + { txHash }, + ); + return verified[0]; } - // Successfully extracted single propose call - return proposeCalls[0]; + this.logger.debug(`No candidates verified against expected hashes`, { txHash }); + return undefined; } catch (err) { // Any decoding error triggers fallback to trace this.logger.warn(`Failed to decode multicall3: ${err}`, { txHash }); @@ -271,11 +279,19 @@ export class CalldataRetriever { /** * Attempts to decode transaction as a direct propose call to the rollup contract. - * Returns undefined if validation fails. + * Decodes, verifies hashes, and builds checkpoint data in a single pass. * @param tx - The transaction-like object with to, input, and hash - * @returns The propose calldata if successfully validated, undefined otherwise + * @param expectedHashes - Expected hashes from CheckpointProposed event + * @param checkpointNumber - The checkpoint number + * @param blockHash - The L1 block hash + * @returns The checkpoint data if successfully validated, undefined otherwise */ - protected tryDecodeDirectPropose(tx: { to: Hex | null | undefined; input: Hex; hash: Hex }): Hex | undefined { + protected tryDecodeDirectPropose( + tx: { to: Hex | null | undefined; input: Hex; hash: Hex }, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + checkpointNumber: CheckpointNumber, + blockHash: Hex, + ): CheckpointData | undefined { const txHash = tx.hash; try { // Check if transaction is to the rollup address @@ -284,18 +300,16 @@ export class CalldataRetriever { return undefined; } - // Try to decode as propose call + // Validate it's a propose call before full decode+verify const { functionName } = decodeFunctionData({ abi: RollupAbi, data: tx.input }); - - // If not propose, return undefined if (functionName !== 'propose') { this.logger.warn(`Transaction to rollup is not propose (got ${functionName})`, { txHash }); return undefined; } - // Successfully validated direct propose call + // Decode, verify hashes, and build checkpoint data this.logger.trace(`Validated direct propose call to rollup`, { txHash }); - return tx.input; + return this.tryDecodeAndVerifyPropose(tx.input, expectedHashes, checkpointNumber, blockHash); } catch (err) { // Any decoding error means it's not a valid propose call this.logger.warn(`Failed to decode as direct propose: ${err}`, { txHash }); @@ -363,10 +377,102 @@ export class CalldataRetriever { return calls[0].input; } + /** + * Decodes propose calldata, verifies against expected hashes, and builds checkpoint data. + * Returns undefined on decode errors or hash mismatches (soft failure for try-based callers). + * @param proposeCalldata - The propose function calldata + * @param expectedHashes - Expected hashes from the CheckpointProposed event + * @param checkpointNumber - The checkpoint number + * @param blockHash - The L1 block hash + * @returns The decoded checkpoint data, or undefined on failure + */ + protected tryDecodeAndVerifyPropose( + proposeCalldata: Hex, + expectedHashes: { attestationsHash: Hex; payloadDigest: Hex }, + checkpointNumber: CheckpointNumber, + blockHash: Hex, + ): CheckpointData | undefined { + try { + const { functionName, args } = decodeFunctionData({ abi: RollupAbi, data: proposeCalldata }); + if (functionName !== 'propose') { + return undefined; + } + + const [decodedArgs, packedAttestations] = args! as readonly [ + { archive: Hex; oracleInput: { feeAssetPriceModifier: bigint }; header: ViemHeader }, + ViemCommitteeAttestations, + ...unknown[], + ]; + + // Verify attestationsHash + const computedAttestationsHash = this.computeAttestationsHash(packedAttestations); + if ( + !Buffer.from(hexToBytes(computedAttestationsHash)).equals( + Buffer.from(hexToBytes(expectedHashes.attestationsHash)), + ) + ) { + this.logger.warn(`Attestations hash mismatch during verification`, { + computed: computedAttestationsHash, + expected: expectedHashes.attestationsHash, + }); + return undefined; + } + + // Verify payloadDigest + const header = CheckpointHeader.fromViem(decodedArgs.header); + const archiveRoot = new Fr(Buffer.from(hexToBytes(decodedArgs.archive))); + const feeAssetPriceModifier = decodedArgs.oracleInput.feeAssetPriceModifier; + const computedPayloadDigest = this.computePayloadDigest(header, archiveRoot, feeAssetPriceModifier); + if ( + !Buffer.from(hexToBytes(computedPayloadDigest)).equals(Buffer.from(hexToBytes(expectedHashes.payloadDigest))) + ) { + this.logger.warn(`Payload digest mismatch during verification`, { + computed: computedPayloadDigest, + expected: expectedHashes.payloadDigest, + }); + return undefined; + } + + const attestations = CommitteeAttestation.fromPacked(packedAttestations, this.targetCommitteeSize); + + this.logger.trace(`Validated and decoded propose calldata for checkpoint ${checkpointNumber}`, { + checkpointNumber, + archive: decodedArgs.archive, + header: decodedArgs.header, + l1BlockHash: blockHash, + attestations, + packedAttestations, + targetCommitteeSize: this.targetCommitteeSize, + }); + + return { + checkpointNumber, + archiveRoot, + header, + attestations, + blockHash, + feeAssetPriceModifier, + }; + } catch { + return undefined; + } + } + + /** Computes the keccak256 hash of ABI-encoded CommitteeAttestations. */ + private computeAttestationsHash(packedAttestations: ViemCommitteeAttestations): Hex { + return keccak256(encodeAbiParameters([this.getCommitteeAttestationsStructDef()], [packedAttestations])); + } + + /** Computes the keccak256 payload digest from the checkpoint header, archive root, and fee asset price modifier. */ + private computePayloadDigest(header: CheckpointHeader, archiveRoot: Fr, feeAssetPriceModifier: bigint): Hex { + const consensusPayload = new ConsensusPayload(header, archiveRoot, feeAssetPriceModifier); + const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation); + return keccak256(payloadToSign); + } + /** * Extracts the CommitteeAttestations struct definition from RollupAbi. * Finds the _attestations parameter by name in the propose function. - * Lazy-loaded to avoid issues during module initialization. */ private getCommitteeAttestationsStructDef(): AbiParameter { const proposeFunction = RollupAbi.find(item => item.type === 'function' && item.name === 'propose') as @@ -399,265 +505,7 @@ export class CalldataRetriever { components: tupleParam.components || [], } as AbiParameter; } - - /** - * Decodes propose calldata and builds the checkpoint header structure. - * @param proposeCalldata - The propose function calldata - * @param blockHash - The L1 block hash containing this transaction - * @param checkpointNumber - The checkpoint number - * @param expectedHashes - Optional expected hashes from the CheckpointProposed event for validation - * @returns The decoded checkpoint header and metadata - */ - protected decodeAndBuildCheckpoint( - proposeCalldata: Hex, - blockHash: Hex, - checkpointNumber: CheckpointNumber, - expectedHashes: { - attestationsHash?: Hex; - payloadDigest?: Hex; - }, - ): { - checkpointNumber: CheckpointNumber; - archiveRoot: Fr; - header: CheckpointHeader; - attestations: CommitteeAttestation[]; - blockHash: string; - feeAssetPriceModifier: bigint; - } { - const { functionName: rollupFunctionName, args: rollupArgs } = decodeFunctionData({ - abi: RollupAbi, - data: proposeCalldata, - }); - - if (rollupFunctionName !== 'propose') { - throw new Error(`Unexpected rollup method called ${rollupFunctionName}`); - } - - const [decodedArgs, packedAttestations, _signers, _attestationsAndSignersSignature, _blobInput] = - rollupArgs! as readonly [ - { - archive: Hex; - oracleInput: { feeAssetPriceModifier: bigint }; - header: ViemHeader; - }, - ViemCommitteeAttestations, - Hex[], - ViemSignature, - Hex, - ]; - - const attestations = CommitteeAttestation.fromPacked(packedAttestations, this.targetCommitteeSize); - const header = CheckpointHeader.fromViem(decodedArgs.header); - const archiveRoot = new Fr(Buffer.from(hexToBytes(decodedArgs.archive))); - - // Validate attestationsHash if provided (skip for backwards compatibility with older events) - if (expectedHashes.attestationsHash) { - // Compute attestationsHash: keccak256(abi.encode(CommitteeAttestations)) - const computedAttestationsHash = keccak256( - encodeAbiParameters([this.getCommitteeAttestationsStructDef()], [packedAttestations]), - ); - - // Compare as buffers to avoid case-sensitivity and string comparison issues - const computedBuffer = Buffer.from(hexToBytes(computedAttestationsHash)); - const expectedBuffer = Buffer.from(hexToBytes(expectedHashes.attestationsHash)); - - if (!computedBuffer.equals(expectedBuffer)) { - throw new Error( - `Attestations hash mismatch for checkpoint ${checkpointNumber}: ` + - `computed=${computedAttestationsHash}, expected=${expectedHashes.attestationsHash}`, - ); - } - - this.logger.trace(`Validated attestationsHash for checkpoint ${checkpointNumber}`, { - computedAttestationsHash, - expectedAttestationsHash: expectedHashes.attestationsHash, - }); - } - - // Validate payloadDigest if provided (skip for backwards compatibility with older events) - if (expectedHashes.payloadDigest) { - // Use ConsensusPayload to compute the digest - this ensures we match the exact logic - // used by the network for signing and verification - const feeAssetPriceModifier = decodedArgs.oracleInput.feeAssetPriceModifier; - const consensusPayload = new ConsensusPayload(header, archiveRoot, feeAssetPriceModifier); - const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation); - const computedPayloadDigest = keccak256(payloadToSign); - - // Compare as buffers to avoid case-sensitivity and string comparison issues - const computedBuffer = Buffer.from(hexToBytes(computedPayloadDigest)); - const expectedBuffer = Buffer.from(hexToBytes(expectedHashes.payloadDigest)); - - if (!computedBuffer.equals(expectedBuffer)) { - throw new Error( - `Payload digest mismatch for checkpoint ${checkpointNumber}: ` + - `computed=${computedPayloadDigest}, expected=${expectedHashes.payloadDigest}`, - ); - } - - this.logger.trace(`Validated payloadDigest for checkpoint ${checkpointNumber}`, { - computedPayloadDigest, - expectedPayloadDigest: expectedHashes.payloadDigest, - }); - } - - this.logger.trace(`Decoded propose calldata`, { - checkpointNumber, - archive: decodedArgs.archive, - header: decodedArgs.header, - l1BlockHash: blockHash, - attestations, - packedAttestations, - targetCommitteeSize: this.targetCommitteeSize, - }); - - return { - checkpointNumber, - archiveRoot, - header, - attestations, - blockHash, - feeAssetPriceModifier: decodedArgs.oracleInput.feeAssetPriceModifier, - }; - } } -/** - * Pre-computed function selectors for all valid contract calls. - * These are computed once at module load time from the ABIs. - * Based on analysis of sequencer-client/src/publisher/sequencer-publisher.ts - */ - -// Rollup contract function selectors (always valid) +/** Function selector for the `propose` method of the rollup contract. */ const PROPOSE_SELECTOR = toFunctionSelector(RollupAbi.find(x => x.type === 'function' && x.name === 'propose')!); -const INVALIDATE_BAD_ATTESTATION_SELECTOR = toFunctionSelector( - RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateBadAttestation')!, -); -const INVALIDATE_INSUFFICIENT_ATTESTATIONS_SELECTOR = toFunctionSelector( - RollupAbi.find(x => x.type === 'function' && x.name === 'invalidateInsufficientAttestations')!, -); - -// Governance proposer function selectors -const GOVERNANCE_SIGNAL_WITH_SIG_SELECTOR = toFunctionSelector( - GovernanceProposerAbi.find(x => x.type === 'function' && x.name === 'signalWithSig')!, -); - -// Slash factory function selectors -const CREATE_SLASH_PAYLOAD_SELECTOR = toFunctionSelector( - SlashFactoryAbi.find(x => x.type === 'function' && x.name === 'createSlashPayload')!, -); - -// Empire slashing proposer function selectors -const EMPIRE_SIGNAL_WITH_SIG_SELECTOR = toFunctionSelector( - EmpireSlashingProposerAbi.find(x => x.type === 'function' && x.name === 'signalWithSig')!, -); -const EMPIRE_SUBMIT_ROUND_WINNER_SELECTOR = toFunctionSelector( - EmpireSlashingProposerAbi.find(x => x.type === 'function' && x.name === 'submitRoundWinner')!, -); - -// Tally slashing proposer function selectors -const TALLY_VOTE_SELECTOR = toFunctionSelector( - TallySlashingProposerAbi.find(x => x.type === 'function' && x.name === 'vote')!, -); -const TALLY_EXECUTE_ROUND_SELECTOR = toFunctionSelector( - TallySlashingProposerAbi.find(x => x.type === 'function' && x.name === 'executeRound')!, -); - -/** - * Defines a valid contract call that can appear in a sequencer publisher transaction - */ -interface ValidContractCall { - /** Contract address (lowercase for comparison) */ - address: string; - /** Function selector (4 bytes) */ - functionSelector: Hex; - /** Human-readable function name for logging */ - functionName: string; -} - -/** - * All valid contract calls that the sequencer publisher can make. - * Builds the list of valid (address, selector) pairs for validation. - * - * Alternatively, if we are absolutely sure that no code path from any of these - * contracts can eventually land on another call to `propose`, we can remove the - * function selectors. - */ -function computeValidContractCalls(addresses: { - rollupAddress: EthAddress; - governanceProposerAddress?: EthAddress; - slashFactoryAddress?: EthAddress; - slashingProposerAddress?: EthAddress; -}): ValidContractCall[] { - const { rollupAddress, governanceProposerAddress, slashFactoryAddress, slashingProposerAddress } = addresses; - const calls: ValidContractCall[] = []; - - // Rollup contract calls (always present) - calls.push( - { - address: rollupAddress.toString().toLowerCase(), - functionSelector: PROPOSE_SELECTOR, - functionName: 'propose', - }, - { - address: rollupAddress.toString().toLowerCase(), - functionSelector: INVALIDATE_BAD_ATTESTATION_SELECTOR, - functionName: 'invalidateBadAttestation', - }, - { - address: rollupAddress.toString().toLowerCase(), - functionSelector: INVALIDATE_INSUFFICIENT_ATTESTATIONS_SELECTOR, - functionName: 'invalidateInsufficientAttestations', - }, - ); - - // Governance proposer calls (optional) - if (governanceProposerAddress && !governanceProposerAddress.isZero()) { - calls.push({ - address: governanceProposerAddress.toString().toLowerCase(), - functionSelector: GOVERNANCE_SIGNAL_WITH_SIG_SELECTOR, - functionName: 'signalWithSig', - }); - } - - // Slash factory calls (optional) - if (slashFactoryAddress && !slashFactoryAddress.isZero()) { - calls.push({ - address: slashFactoryAddress.toString().toLowerCase(), - functionSelector: CREATE_SLASH_PAYLOAD_SELECTOR, - functionName: 'createSlashPayload', - }); - } - - // Slashing proposer calls (optional, can be either Empire or Tally) - if (slashingProposerAddress && !slashingProposerAddress.isZero()) { - // Empire calls - calls.push( - { - address: slashingProposerAddress.toString().toLowerCase(), - functionSelector: EMPIRE_SIGNAL_WITH_SIG_SELECTOR, - functionName: 'signalWithSig (empire)', - }, - { - address: slashingProposerAddress.toString().toLowerCase(), - functionSelector: EMPIRE_SUBMIT_ROUND_WINNER_SELECTOR, - functionName: 'submitRoundWinner', - }, - ); - - // Tally calls - calls.push( - { - address: slashingProposerAddress.toString().toLowerCase(), - functionSelector: TALLY_VOTE_SELECTOR, - functionName: 'vote', - }, - { - address: slashingProposerAddress.toString().toLowerCase(), - functionSelector: TALLY_EXECUTE_ROUND_SELECTOR, - functionName: 'executeRound', - }, - ); - } - - return calls; -} diff --git a/yarn-project/archiver/src/l1/data_retrieval.ts b/yarn-project/archiver/src/l1/data_retrieval.ts index 54b6dd62207d..4f5a529f1aae 100644 --- a/yarn-project/archiver/src/l1/data_retrieval.ts +++ b/yarn-project/archiver/src/l1/data_retrieval.ts @@ -157,11 +157,6 @@ export async function retrieveCheckpointsFromRollup( blobClient: BlobClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, - contractAddresses: { - governanceProposerAddress: EthAddress; - slashFactoryAddress?: EthAddress; - slashingProposerAddress: EthAddress; - }, instrumentation: ArchiverInstrumentation, logger: Logger = createLogger('archiver'), isHistoricalSync: boolean = false, @@ -205,7 +200,6 @@ export async function retrieveCheckpointsFromRollup( blobClient, checkpointProposedLogs, rollupConstants, - contractAddresses, instrumentation, logger, isHistoricalSync, @@ -226,7 +220,6 @@ export async function retrieveCheckpointsFromRollup( * @param blobClient - The blob client client for fetching blob data. * @param logs - CheckpointProposed logs. * @param rollupConstants - The rollup constants (chainId, version, targetCommitteeSize). - * @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress). * @param instrumentation - The archiver instrumentation instance. * @param logger - The logger instance. * @param isHistoricalSync - Whether this is a historical sync. @@ -239,11 +232,6 @@ async function processCheckpointProposedLogs( blobClient: BlobClientInterface, logs: CheckpointProposedLog[], { chainId, version, targetCommitteeSize }: { chainId: Fr; version: Fr; targetCommitteeSize: number }, - contractAddresses: { - governanceProposerAddress: EthAddress; - slashFactoryAddress?: EthAddress; - slashingProposerAddress: EthAddress; - }, instrumentation: ArchiverInstrumentation, logger: Logger, isHistoricalSync: boolean, @@ -255,7 +243,7 @@ async function processCheckpointProposedLogs( targetCommitteeSize, instrumentation, logger, - { ...contractAddresses, rollupAddress: EthAddress.fromString(rollup.address) }, + EthAddress.fromString(rollup.address), ); await asyncPool(10, logs, async log => { @@ -266,10 +254,9 @@ async function processCheckpointProposedLogs( // The value from the event and contract will match only if the checkpoint is in the chain. if (archive.equals(archiveFromChain)) { - // Build expected hashes object (fields may be undefined for backwards compatibility with older events) const expectedHashes = { - attestationsHash: log.args.attestationsHash?.toString(), - payloadDigest: log.args.payloadDigest?.toString(), + attestationsHash: log.args.attestationsHash.toString() as Hex, + payloadDigest: log.args.payloadDigest.toString() as Hex, }; const checkpoint = await calldataRetriever.getCheckpointFromRollupTx( diff --git a/yarn-project/archiver/src/l1/spire_proposer.test.ts b/yarn-project/archiver/src/l1/spire_proposer.test.ts index ed9148a950ee..3d1c85056222 100644 --- a/yarn-project/archiver/src/l1/spire_proposer.test.ts +++ b/yarn-project/archiver/src/l1/spire_proposer.test.ts @@ -9,7 +9,7 @@ import { SPIRE_PROPOSER_ADDRESS, SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION, SpireProposerAbi, - getCallFromSpireProposer, + getCallsFromSpireProposer, verifyProxyImplementation, } from './spire_proposer.js'; @@ -102,21 +102,19 @@ describe('Spire Proposer', () => { }); }); - describe('getCallFromSpireProposer', () => { - function makeSpireProposerMulticallTransaction(call: { target: Hex; data: Hex }): Transaction { + describe('getCallsFromSpireProposer', () => { + function makeSpireProposerMulticallTransaction(...calls: { target: Hex; data: Hex }[]): Transaction { const spireMulticallData = encodeFunctionData({ abi: SpireProposerAbi, functionName: 'multicall', args: [ - [ - { - proposer: EthAddress.random().toString() as Hex, - target: call.target, - data: call.data, - value: 0n, - gasLimit: 1000000n, - }, - ], + calls.map(call => ({ + proposer: EthAddress.random().toString() as Hex, + target: call.target, + data: call.data, + value: 0n, + gasLimit: 1000000n, + })), ], }); @@ -143,11 +141,12 @@ describe('Spire Proposer', () => { data: calldata, }); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeDefined(); - expect(result?.to.toLowerCase()).toBe(targetAddress.toLowerCase()); - expect(result?.data).toBe(calldata); + expect(result).toHaveLength(1); + expect(result![0].to.toLowerCase()).toBe(targetAddress.toLowerCase()); + expect(result![0].data).toBe(calldata); expect(publicClient.getStorageAt).toHaveBeenCalledWith({ address: SPIRE_PROPOSER_ADDRESS, slot: EIP1967_IMPLEMENTATION_SLOT, @@ -161,11 +160,12 @@ describe('Spire Proposer', () => { data: '0xabcdef' as Hex, }); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeDefined(); - expect(result?.to.toLowerCase()).toBe(unknownAddress.toLowerCase()); - expect(result?.data).toBe('0xabcdef'); + expect(result).toHaveLength(1); + expect(result![0].to.toLowerCase()).toBe(unknownAddress.toLowerCase()); + expect(result![0].data).toBe('0xabcdef'); }); it('should preserve exact calldata bytes', async () => { @@ -176,10 +176,11 @@ describe('Spire Proposer', () => { data: complexCalldata, }); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeDefined(); - expect(result?.data).toBe(complexCalldata); + expect(result).toHaveLength(1); + expect(result![0].data).toBe(complexCalldata); }); }); @@ -191,7 +192,7 @@ describe('Spire Proposer', () => { hash: txHash, } as Transaction; - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); expect(publicClient.getStorageAt).not.toHaveBeenCalled(); @@ -204,7 +205,7 @@ describe('Spire Proposer', () => { hash: txHash, } as Transaction; - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); expect(publicClient.getStorageAt).not.toHaveBeenCalled(); @@ -217,7 +218,7 @@ describe('Spire Proposer', () => { hash: txHash, } as unknown as Transaction; - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); }); @@ -231,7 +232,7 @@ describe('Spire Proposer', () => { // Mock the proxy pointing to wrong implementation publicClient.getStorageAt.mockResolvedValue('0x00000000000000000000000000000000000000000000000000bad' as Hex); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); }); @@ -250,12 +251,12 @@ describe('Spire Proposer', () => { ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); }); - it('should return undefined when Spire Proposer contains zero calls', async () => { + it('should return empty array when Spire Proposer contains zero calls', async () => { const spireMulticallData = encodeFunctionData({ abi: SpireProposerAbi, functionName: 'multicall', @@ -272,48 +273,30 @@ describe('Spire Proposer', () => { ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); - expect(result).toBeUndefined(); + expect(result).toBeDefined(); + expect(result).toHaveLength(0); }); - it('should return undefined when Spire Proposer contains multiple calls', async () => { - const spireMulticallData = encodeFunctionData({ - abi: SpireProposerAbi, - functionName: 'multicall', - args: [ - [ - { - proposer: EthAddress.random().toString() as Hex, - target: EthAddress.random().toString() as Hex, - data: '0x12345678' as Hex, - value: 0n, - gasLimit: 1000000n, - }, - { - proposer: EthAddress.random().toString() as Hex, - target: EthAddress.random().toString() as Hex, - data: '0xabcdef' as Hex, - value: 0n, - gasLimit: 1000000n, - }, - ], - ], - }); - - const tx = { - input: spireMulticallData, - to: SPIRE_PROPOSER_ADDRESS as Hex, - hash: txHash, - } as Transaction; + it('should return all calls when Spire Proposer contains multiple calls', async () => { + const target1 = EthAddress.random().toString() as Hex; + const target2 = EthAddress.random().toString() as Hex; + const tx = makeSpireProposerMulticallTransaction( + { target: target1, data: '0x12345678' as Hex }, + { target: target2, data: '0xabcdef' as Hex }, + ); publicClient.getStorageAt.mockResolvedValue( ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); - expect(result).toBeUndefined(); + expect(result).toBeDefined(); + expect(result).toHaveLength(2); + expect(result![0].to.toLowerCase()).toBe(target1.toLowerCase()); + expect(result![1].to.toLowerCase()).toBe(target2.toLowerCase()); }); it('should return undefined when decoding throws exception', async () => { @@ -327,7 +310,7 @@ describe('Spire Proposer', () => { ('0x000000000000000000000000' + SPIRE_PROPOSER_EXPECTED_IMPLEMENTATION.slice(2)) as Hex, ); - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeUndefined(); }); @@ -366,11 +349,11 @@ describe('Spire Proposer', () => { hash: txHash, } as Transaction; - const result = await getCallFromSpireProposer(tx, publicClient, logger); + const result = await getCallsFromSpireProposer(tx, publicClient, logger); expect(result).toBeDefined(); - expect(result?.to.toLowerCase()).toBe(targetAddress.toLowerCase()); - expect(result?.data).toBe(calldata); + expect(result![0].to.toLowerCase()).toBe(targetAddress.toLowerCase()); + expect(result![0].data).toBe(calldata); }); }); }); diff --git a/yarn-project/archiver/src/l1/spire_proposer.ts b/yarn-project/archiver/src/l1/spire_proposer.ts index b328fa5a7fdb..3b7e64ebfd2a 100644 --- a/yarn-project/archiver/src/l1/spire_proposer.ts +++ b/yarn-project/archiver/src/l1/spire_proposer.ts @@ -87,17 +87,17 @@ export async function verifyProxyImplementation( /** * Attempts to decode transaction as a Spire Proposer Multicall. * Spire Proposer is a proxy contract that wraps multiple calls. - * Returns the target address and calldata of the wrapped call if validation succeeds and there is a single call. + * Returns all wrapped calls if validation succeeds (caller handles hash matching to find the propose call). * @param tx - The transaction to decode * @param publicClient - The viem public client for proxy verification * @param logger - Logger instance - * @returns Object with 'to' and 'data' of the wrapped call, or undefined if validation fails + * @returns Array of wrapped calls with 'to' and 'data', or undefined if not a valid Spire Proposer tx */ -export async function getCallFromSpireProposer( +export async function getCallsFromSpireProposer( tx: Transaction, publicClient: { getStorageAt: (params: { address: Hex; slot: Hex }) => Promise }, logger: Logger, -): Promise<{ to: Hex; data: Hex } | undefined> { +): Promise<{ to: Hex; data: Hex }[] | undefined> { const txHash = tx.hash; try { @@ -141,17 +141,9 @@ export async function getCallFromSpireProposer( const [calls] = spireArgs; - // Validate exactly ONE call (see ./README.md for rationale) - if (calls.length !== 1) { - logger.warn(`Spire Proposer multicall must contain exactly one call (got ${calls.length})`, { txHash }); - return undefined; - } - - const call = calls[0]; - - // Successfully extracted the single wrapped call - logger.trace(`Decoded Spire Proposer with single call to ${call.target}`, { txHash }); - return { to: call.target, data: call.data }; + // Return all wrapped calls (hash matching in the caller determines which is the propose call) + logger.trace(`Decoded Spire Proposer with ${calls.length} call(s)`, { txHash }); + return calls.map(call => ({ to: call.target, data: call.data })); } catch (err) { // Any decoding error triggers fallback to trace logger.warn(`Failed to decode Spire Proposer: ${err}`, { txHash }); diff --git a/yarn-project/archiver/src/modules/l1_synchronizer.ts b/yarn-project/archiver/src/modules/l1_synchronizer.ts index 22b1ed5aba29..ae4bca9dc898 100644 --- a/yarn-project/archiver/src/modules/l1_synchronizer.ts +++ b/yarn-project/archiver/src/modules/l1_synchronizer.ts @@ -1,7 +1,6 @@ import type { BlobClientInterface } from '@aztec/blob-client/client'; import { EpochCache } from '@aztec/epoch-cache'; import { InboxContract, RollupContract } from '@aztec/ethereum/contracts'; -import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses'; import type { L1BlockId } from '@aztec/ethereum/l1-types'; import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types'; import { maxBigint } from '@aztec/foundation/bigint'; @@ -9,7 +8,6 @@ import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/br import { Buffer32 } from '@aztec/foundation/buffer'; import { pick } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/curves/bn254'; -import { EthAddress } from '@aztec/foundation/eth-address'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { count } from '@aztec/foundation/string'; import { DateProvider, Timer, elapsed } from '@aztec/foundation/timer'; @@ -61,10 +59,6 @@ export class ArchiverL1Synchronizer implements Traceable { private readonly debugClient: ViemPublicDebugClient, private readonly rollup: RollupContract, private readonly inbox: InboxContract, - private readonly l1Addresses: Pick< - L1ContractAddresses, - 'registryAddress' | 'governanceProposerAddress' | 'slashFactoryAddress' - > & { slashingProposerAddress: EthAddress }, private readonly store: KVArchiverDataStore, private config: { batchSize: number; @@ -708,7 +702,6 @@ export class ArchiverL1Synchronizer implements Traceable { this.blobClient, searchStartBlock, // TODO(palla/reorg): If the L2 reorg was due to an L1 reorg, we need to start search earlier searchEndBlock, - this.l1Addresses, this.instrumentation, this.log, !initialSyncComplete, // isHistoricalSync diff --git a/yarn-project/archiver/src/test/fake_l1_state.ts b/yarn-project/archiver/src/test/fake_l1_state.ts index e55a234b544b..b05fd2f8e505 100644 --- a/yarn-project/archiver/src/test/fake_l1_state.ts +++ b/yarn-project/archiver/src/test/fake_l1_state.ts @@ -14,6 +14,7 @@ import { CommitteeAttestation, CommitteeAttestationsAndSigners, L2Block } from ' import { Checkpoint } from '@aztec/stdlib/checkpoint'; import { getSlotAtTimestamp } from '@aztec/stdlib/epoch-helpers'; import { InboxLeaf } from '@aztec/stdlib/messaging'; +import { ConsensusPayload, SignatureDomainSeparator } from '@aztec/stdlib/p2p'; import { makeAndSignCommitteeAttestationsAndSigners, makeCheckpointAttestationFromCheckpoint, @@ -22,7 +23,16 @@ import { import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { type FormattedBlock, type Transaction, encodeFunctionData, multicall3Abi, toHex } from 'viem'; +import { + type AbiParameter, + type FormattedBlock, + type Transaction, + encodeAbiParameters, + encodeFunctionData, + keccak256, + multicall3Abi, + toHex, +} from 'viem'; import { updateRollingHash } from '../structs/inbox_message.js'; @@ -87,6 +97,10 @@ type CheckpointData = { blobHashes: `0x${string}`[]; blobs: Blob[]; signers: Secp256k1Signer[]; + /** Hash of the packed attestations, matching what the L1 event emits. */ + attestationsHash: Buffer32; + /** Payload digest, matching what the L1 event emits. */ + payloadDigest: Buffer32; /** If true, archiveAt will ignore it */ pruned?: boolean; }; @@ -194,8 +208,8 @@ export class FakeL1State { // Store the messages internally so they match the checkpoint's inHash this.addMessages(checkpointNumber, messagesL1BlockNumber, messages); - // Create the transaction and blobs - const tx = await this.makeRollupTx(checkpoint, signers); + // Create the transaction, blobs, and event hashes + const { tx, attestationsHash, payloadDigest } = await this.makeRollupTx(checkpoint, signers); const blobHashes = await this.makeVersionedBlobHashes(checkpoint); const blobs = await this.makeBlobsFromCheckpoint(checkpoint); @@ -208,6 +222,8 @@ export class FakeL1State { blobHashes, blobs, signers, + attestationsHash, + payloadDigest, }); // Update last archive for auto-chaining @@ -510,10 +526,8 @@ export class FakeL1State { checkpointNumber: cpData.checkpointNumber, archive: cpData.checkpoint.archive.root, versionedBlobHashes: cpData.blobHashes.map(h => Buffer.from(h.slice(2), 'hex')), - // These are intentionally undefined to skip hash validation in the archiver - // (validation is skipped when these fields are falsy) - payloadDigest: undefined, - attestationsHash: undefined, + attestationsHash: cpData.attestationsHash, + payloadDigest: cpData.payloadDigest, }, })); } @@ -539,7 +553,10 @@ export class FakeL1State { })); } - private async makeRollupTx(checkpoint: Checkpoint, signers: Secp256k1Signer[]): Promise { + private async makeRollupTx( + checkpoint: Checkpoint, + signers: Secp256k1Signer[], + ): Promise<{ tx: Transaction; attestationsHash: Buffer32; payloadDigest: Buffer32 }> { const attestations = signers .map(signer => makeCheckpointAttestationFromCheckpoint(checkpoint, signer)) .map(attestation => CommitteeAttestation.fromSignature(attestation.signature)) @@ -557,6 +574,8 @@ export class FakeL1State { signers[0], ); + const packedAttestations = attestationsAndSigners.getPackedAttestations(); + const rollupInput = encodeFunctionData({ abi: RollupAbi, functionName: 'propose', @@ -566,7 +585,7 @@ export class FakeL1State { archive, oracleInput: { feeAssetPriceModifier: 0n }, }, - attestationsAndSigners.getPackedAttestations(), + packedAttestations, attestationsAndSigners.getSigners().map(signer => signer.toString()), attestationsAndSignersSignature.toViemSignature(), blobInput, @@ -587,12 +606,43 @@ export class FakeL1State { ], }); - return { + // Compute attestationsHash (same logic as CalldataRetriever) + const attestationsHash = Buffer32.fromString( + keccak256(encodeAbiParameters([this.getCommitteeAttestationsStructDef()], [packedAttestations])), + ); + + // Compute payloadDigest (same logic as CalldataRetriever) + const consensusPayload = ConsensusPayload.fromCheckpoint(checkpoint); + const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation); + const payloadDigest = Buffer32.fromString(keccak256(payloadToSign)); + + const tx = { input: multiCallInput, hash: archive, blockHash: archive, to: MULTI_CALL_3_ADDRESS as `0x${string}`, } as Transaction; + + return { tx, attestationsHash, payloadDigest }; + } + + /** Extracts the CommitteeAttestations struct definition from RollupAbi for hash computation. */ + private getCommitteeAttestationsStructDef(): AbiParameter { + const proposeFunction = RollupAbi.find(item => item.type === 'function' && item.name === 'propose') as + | { type: 'function'; name: string; inputs: readonly AbiParameter[] } + | undefined; + + if (!proposeFunction) { + throw new Error('propose function not found in RollupAbi'); + } + + const attestationsParam = proposeFunction.inputs.find(param => param.name === '_attestations'); + if (!attestationsParam) { + throw new Error('_attestations parameter not found in propose function'); + } + + const tupleParam = attestationsParam as unknown as { type: 'tuple'; components?: readonly AbiParameter[] }; + return { type: 'tuple', components: tupleParam.components || [] } as AbiParameter; } private async makeVersionedBlobHashes(checkpoint: Checkpoint): Promise<`0x${string}`[]> { diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index 0706015744ca..4670222c1125 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -20,7 +20,13 @@ import { MembershipWitness, SiblingPath } from '@aztec/foundation/trees'; import { type KeyStore, KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore'; import { trySnapshotSync, uploadSnapshot } from '@aztec/node-lib/actions'; import { createForwarderL1TxUtilsFromSigners, createL1TxUtilsFromSigners } from '@aztec/node-lib/factories'; -import { type P2P, type P2PClientDeps, createP2PClient, getDefaultAllowedSetupFunctions } from '@aztec/p2p'; +import { + type P2P, + type P2PClientDeps, + createP2PClient, + createTxValidatorForAcceptingTxsOverRPC, + getDefaultAllowedSetupFunctions, +} from '@aztec/p2p'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { type ProverNode, type ProverNodeDeps, createProverNode } from '@aztec/prover-node'; import { createKeyStoreForProver } from '@aztec/prover-node/config'; @@ -70,9 +76,9 @@ import { type WorldStateSynchronizer, tryStop, } from '@aztec/stdlib/interfaces/server'; -import type { LogFilter, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs'; +import type { DebugLogStore, LogFilter, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs'; +import { InMemoryDebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs'; import { InboxLeaf, type L1ToL2MessageSource } from '@aztec/stdlib/messaging'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import type { Offense, SlashPayloadRound } from '@aztec/stdlib/slashing'; import type { NullifierLeafPreimage, PublicDataTreeLeaf, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees'; import { MerkleTreeId, NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees'; @@ -104,7 +110,6 @@ import { ValidatorClient, createBlockProposalHandler, createValidatorClient, - createValidatorForAcceptingTxs, } from '@aztec/validator-client'; import { createWorldStateSynchronizer } from '@aztec/world-state'; @@ -151,12 +156,20 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { private blobClient?: BlobClientInterface, private validatorClient?: ValidatorClient, private keyStoreManager?: KeystoreManager, + private debugLogStore: DebugLogStore = new NullDebugLogStore(), ) { this.metrics = new NodeMetrics(telemetry, 'AztecNodeService'); this.tracer = telemetry.getTracer('AztecNodeService'); this.log.info(`Aztec Node version: ${this.packageVersion}`); this.log.info(`Aztec Node started on chain 0x${l1ChainId.toString(16)}`, config.l1Contracts); + + // A defensive check that protects us against introducing a bug in the complex `createAndSync` function. We must + // never have debugLogStore enabled when not in test mode because then we would be accumulating debug logs in + // memory which could be a DoS vector on the sequencer (since no fees are paid for debug logs). + if (debugLogStore.isEnabled && config.realProofs) { + throw new Error('debugLogStore should never be enabled when realProofs are set'); + } } public async getWorldStateSyncStatus(): Promise { @@ -180,7 +193,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { logger?: Logger; publisher?: SequencerPublisher; dateProvider?: DateProvider; - p2pClientDeps?: P2PClientDeps; + p2pClientDeps?: P2PClientDeps; proverNodeDeps?: Partial; } = {}, options: { @@ -296,14 +309,28 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { config.realProofs || config.debugForceTxProofVerification ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier(config.proverTestVerificationDelayMs); + + let debugLogStore: DebugLogStore; if (!config.realProofs) { log.warn(`Aztec node is accepting fake proofs`); + + debugLogStore = new InMemoryDebugLogStore(); + log.info( + 'Aztec node started in test mode (realProofs set to false) hence debug logs from public functions will be collected and served', + ); + } else { + debugLogStore = new NullDebugLogStore(); } + const proofVerifier = new QueuedIVCVerifier(config, circuitVerifier); + const proverOnly = config.enableProverNode && config.disableValidator; + if (proverOnly) { + log.info('Starting in prover-only mode: skipping validator, sequencer, sentinel, and slasher subsystems'); + } + // create the tx pool and the p2p client, which will need the l2 block source const p2pClient = await createP2PClient( - P2PClientType.Full, config, archiver, proofVerifier, @@ -318,7 +345,10 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { // We should really not be modifying the config object config.txPublicSetupAllowList = config.txPublicSetupAllowList ?? (await getDefaultAllowedSetupFunctions()); - // Create FullNodeCheckpointsBuilder for validator and non-validator block proposal handling + // We'll accumulate sentinel watchers here + const watchers: Watcher[] = []; + + // Create FullNodeCheckpointsBuilder for block proposal handling and tx validation const validatorCheckpointsBuilder = new FullNodeCheckpointsBuilder( { ...config, l1GenesisTime, slotDuration: Number(slotDuration) }, worldStateSynchronizer, @@ -327,47 +357,48 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { telemetry, ); - // We'll accumulate sentinel watchers here - const watchers: Watcher[] = []; + let validatorClient: ValidatorClient | undefined; - // Create validator client if required - const validatorClient = await createValidatorClient(config, { - checkpointsBuilder: validatorCheckpointsBuilder, - worldState: worldStateSynchronizer, - p2pClient, - telemetry, - dateProvider, - epochCache, - blockSource: archiver, - l1ToL2MessageSource: archiver, - keyStoreManager, - blobClient, - }); - - // If we have a validator client, register it as a source of offenses for the slasher, - // and have it register callbacks on the p2p client *before* we start it, otherwise messages - // like attestations or auths will fail. - if (validatorClient) { - watchers.push(validatorClient); - if (!options.dontStartSequencer) { - await validatorClient.registerHandlers(); - } - } - - // If there's no validator client but alwaysReexecuteBlockProposals is enabled, - // create a BlockProposalHandler to reexecute block proposals for monitoring - if (!validatorClient && config.alwaysReexecuteBlockProposals) { - log.info('Setting up block proposal reexecution for monitoring'); - createBlockProposalHandler(config, { + if (!proverOnly) { + // Create validator client if required + validatorClient = await createValidatorClient(config, { checkpointsBuilder: validatorCheckpointsBuilder, worldState: worldStateSynchronizer, + p2pClient, + telemetry, + dateProvider, epochCache, blockSource: archiver, l1ToL2MessageSource: archiver, - p2pClient, - dateProvider, - telemetry, - }).registerForReexecution(p2pClient); + keyStoreManager, + blobClient, + }); + + // If we have a validator client, register it as a source of offenses for the slasher, + // and have it register callbacks on the p2p client *before* we start it, otherwise messages + // like attestations or auths will fail. + if (validatorClient) { + watchers.push(validatorClient); + if (!options.dontStartSequencer) { + await validatorClient.registerHandlers(); + } + } + + // If there's no validator client but alwaysReexecuteBlockProposals is enabled, + // create a BlockProposalHandler to reexecute block proposals for monitoring + if (!validatorClient && config.alwaysReexecuteBlockProposals) { + log.info('Setting up block proposal reexecution for monitoring'); + createBlockProposalHandler(config, { + checkpointsBuilder: validatorCheckpointsBuilder, + worldState: worldStateSynchronizer, + epochCache, + blockSource: archiver, + l1ToL2MessageSource: archiver, + p2pClient, + dateProvider, + telemetry, + }).registerForReexecution(p2pClient); + } } // Start world state and wait for it to sync to the archiver. @@ -376,29 +407,33 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { // Start p2p. Note that it depends on world state to be running. await p2pClient.start(); - const validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config); - if (validatorsSentinel && config.slashInactivityPenalty > 0n) { - watchers.push(validatorsSentinel); - } - + let validatorsSentinel: Awaited> | undefined; let epochPruneWatcher: EpochPruneWatcher | undefined; - if (config.slashPrunePenalty > 0n || config.slashDataWithholdingPenalty > 0n) { - epochPruneWatcher = new EpochPruneWatcher( - archiver, - archiver, - epochCache, - p2pClient.getTxProvider(), - validatorCheckpointsBuilder, - config, - ); - watchers.push(epochPruneWatcher); - } - - // We assume we want to slash for invalid attestations unless all max penalties are set to 0 let attestationsBlockWatcher: AttestationsBlockWatcher | undefined; - if (config.slashProposeInvalidAttestationsPenalty > 0n || config.slashAttestDescendantOfInvalidPenalty > 0n) { - attestationsBlockWatcher = new AttestationsBlockWatcher(archiver, epochCache, config); - watchers.push(attestationsBlockWatcher); + + if (!proverOnly) { + validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config); + if (validatorsSentinel && config.slashInactivityPenalty > 0n) { + watchers.push(validatorsSentinel); + } + + if (config.slashPrunePenalty > 0n || config.slashDataWithholdingPenalty > 0n) { + epochPruneWatcher = new EpochPruneWatcher( + archiver, + archiver, + epochCache, + p2pClient.getTxProvider(), + validatorCheckpointsBuilder, + config, + ); + watchers.push(epochPruneWatcher); + } + + // We assume we want to slash for invalid attestations unless all max penalties are set to 0 + if (config.slashProposeInvalidAttestationsPenalty > 0n || config.slashAttestDescendantOfInvalidPenalty > 0n) { + attestationsBlockWatcher = new AttestationsBlockWatcher(archiver, epochCache, config); + watchers.push(attestationsBlockWatcher); + } } // Start p2p-related services once the archiver has completed sync @@ -457,6 +492,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { archiver, dateProvider, telemetry, + debugLogStore, ); sequencer = await SequencerClient.new(config, { @@ -538,6 +574,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { blobClient, validatorClient, keyStoreManager, + debugLogStore, ); return node; @@ -831,18 +868,22 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { // Then get the actual tx from the archiver, which tracks every tx in a mined block. const settledTxReceipt = await this.blockSource.getSettledTxReceipt(txHash); + let receipt: TxReceipt; if (settledTxReceipt) { - // If the archiver has the receipt then return it. - return settledTxReceipt; + receipt = settledTxReceipt; } else if (isKnownToPool) { // If the tx is in the pool but not in the archiver, it's pending. // This handles race conditions between archiver and p2p, where the archiver // has pruned the block in which a tx was mined, but p2p has not caught up yet. - return new TxReceipt(txHash, TxStatus.PENDING, undefined, undefined); + receipt = new TxReceipt(txHash, TxStatus.PENDING, undefined, undefined); } else { // Otherwise, if we don't know the tx, we consider it dropped. - return new TxReceipt(txHash, TxStatus.DROPPED, undefined, 'Tx dropped by P2P node'); + receipt = new TxReceipt(txHash, TxStatus.DROPPED, undefined, 'Tx dropped by P2P node'); } + + this.debugLogStore.decorateReceiptWithLogs(txHash.toString(), receipt); + + return receipt; } public getTxEffect(txHash: TxHash): Promise { @@ -1236,7 +1277,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { const processor = publicProcessorFactory.create(merkleTreeFork, newGlobalVariables, config); // REFACTOR: Consider merging ProcessReturnValues into ProcessedTx - const [processedTxs, failedTxs, _usedTxs, returns] = await processor.process([tx]); + const [processedTxs, failedTxs, _usedTxs, returns, _blobFields, debugLogs] = await processor.process([tx]); // REFACTOR: Consider returning the error rather than throwing if (failedTxs.length) { this.log.warn(`Simulated tx ${txHash} fails: ${failedTxs[0].error}`, { txHash }); @@ -1250,6 +1291,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { processedTx.txEffect, returns, processedTx.gasUsed, + debugLogs, ); } finally { await merkleTreeFork.close(); @@ -1266,7 +1308,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, Traceable { // We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field) const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot(); const blockNumber = BlockNumber((await this.blockSource.getBlockNumber()) + 1); - const validator = createValidatorForAcceptingTxs( + const validator = createTxValidatorForAcceptingTxsOverRPC( db, this.contractDataSource, verifier, diff --git a/yarn-project/aztec.js/package.json b/yarn-project/aztec.js/package.json index 96f53c190ef5..ec59ec3baae6 100644 --- a/yarn-project/aztec.js/package.json +++ b/yarn-project/aztec.js/package.json @@ -101,7 +101,7 @@ "@aztec/l1-artifacts": "workspace:^", "@aztec/protocol-contracts": "workspace:^", "@aztec/stdlib": "workspace:^", - "axios": "^1.12.0", + "axios": "^1.13.5", "tslib": "^2.4.0", "viem": "npm:@aztec/viem@2.38.2", "zod": "^3.23.8" diff --git a/yarn-project/aztec.js/src/api/wallet.ts b/yarn-project/aztec.js/src/api/wallet.ts index 548d70675600..ae7d39b316f7 100644 --- a/yarn-project/aztec.js/src/api/wallet.ts +++ b/yarn-project/aztec.js/src/api/wallet.ts @@ -1,7 +1,7 @@ export { type Aliased, type SimulateOptions, - type SimulateUtilityOptions, + type ExecuteUtilityOptions, type ProfileOptions, type SendOptions, type BatchableMethods, diff --git a/yarn-project/aztec.js/src/contract/batch_call.test.ts b/yarn-project/aztec.js/src/contract/batch_call.test.ts index 52126be476e3..976884e68745 100644 --- a/yarn-project/aztec.js/src/contract/batch_call.test.ts +++ b/yarn-project/aztec.js/src/contract/batch_call.test.ts @@ -1,7 +1,7 @@ import { Fr } from '@aztec/foundation/curves/bn254'; import { FunctionCall, FunctionSelector, FunctionType } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; -import { ExecutionPayload, TxSimulationResult, UtilitySimulationResult } from '@aztec/stdlib/tx'; +import { ExecutionPayload, TxSimulationResult, UtilityExecutionResult } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -107,8 +107,8 @@ describe('BatchCall', () => { batchCall = new BatchCall(wallet, [utilityPayload1, privatePayload, utilityPayload2, publicPayload]); // Mock utility simulation results - const utilityResult1 = UtilitySimulationResult.random(); - const utilityResult2 = UtilitySimulationResult.random(); + const utilityResult1 = UtilityExecutionResult.random(); + const utilityResult2 = UtilityExecutionResult.random(); // Mock tx simulation result const privateReturnValues = [Fr.random(), Fr.random()]; @@ -122,8 +122,8 @@ describe('BatchCall', () => { // Mock wallet.batch to return both utility results and simulateTx result wallet.batch.mockResolvedValue([ - { name: 'simulateUtility', result: utilityResult1 }, - { name: 'simulateUtility', result: utilityResult2 }, + { name: 'executeUtility', result: utilityResult1 }, + { name: 'executeUtility', result: utilityResult2 }, { name: 'simulateTx', result: txSimResult }, ] as any); @@ -133,14 +133,14 @@ describe('BatchCall', () => { expect(wallet.batch).toHaveBeenCalledTimes(1); expect(wallet.batch).toHaveBeenCalledWith([ { - name: 'simulateUtility', + name: 'executeUtility', args: [ expect.objectContaining({ name: 'getBalance', to: contractAddress1 }), expect.objectContaining({ scope: expect.any(AztecAddress) }), ], }, { - name: 'simulateUtility', + name: 'executeUtility', args: [ expect.objectContaining({ name: 'checkPermission', to: contractAddress3 }), expect.objectContaining({ scope: expect.any(AztecAddress) }), @@ -160,9 +160,9 @@ describe('BatchCall', () => { }, ]); - // Verify wallet.simulateTx/simulateUtility were NOT called directly + // Verify wallet.simulateTx/executeUtility were NOT called directly expect(wallet.simulateTx).not.toHaveBeenCalled(); - expect(wallet.simulateUtility).not.toHaveBeenCalled(); + expect(wallet.executeUtility).not.toHaveBeenCalled(); expect(results).toHaveLength(4); // First utility - decoded from Fr[] to bigint (single field returns the value directly, not as array) @@ -184,13 +184,13 @@ describe('BatchCall', () => { batchCall = new BatchCall(wallet, [utilityPayload1, utilityPayload2]); - // Mock utility simulation results - const utilityResult1 = UtilitySimulationResult.random(); - const utilityResult2 = UtilitySimulationResult.random(); + // Mock utility execution results + const utilityResult1 = UtilityExecutionResult.random(); + const utilityResult2 = UtilityExecutionResult.random(); wallet.batch.mockResolvedValue([ - { name: 'simulateUtility', result: utilityResult1 }, - { name: 'simulateUtility', result: utilityResult2 }, + { name: 'executeUtility', result: utilityResult1 }, + { name: 'executeUtility', result: utilityResult2 }, ] as any); const results = await batchCall.simulate({ from: await AztecAddress.random() }); @@ -198,14 +198,14 @@ describe('BatchCall', () => { expect(wallet.batch).toHaveBeenCalledTimes(1); expect(wallet.batch).toHaveBeenCalledWith([ { - name: 'simulateUtility', + name: 'executeUtility', args: [ expect.objectContaining({ name: 'view1', to: contractAddress1 }), expect.objectContaining({ scope: expect.any(AztecAddress) }), ], }, { - name: 'simulateUtility', + name: 'executeUtility', args: [ expect.objectContaining({ name: 'view2', to: contractAddress2 }), expect.objectContaining({ scope: expect.any(AztecAddress) }), diff --git a/yarn-project/aztec.js/src/contract/batch_call.ts b/yarn-project/aztec.js/src/contract/batch_call.ts index 6f90e80856e1..cd112be6f59b 100644 --- a/yarn-project/aztec.js/src/contract/batch_call.ts +++ b/yarn-project/aztec.js/src/contract/batch_call.ts @@ -1,10 +1,5 @@ import { type FunctionCall, FunctionType, decodeFromAbi } from '@aztec/stdlib/abi'; -import { - ExecutionPayload, - TxSimulationResult, - UtilitySimulationResult, - mergeExecutionPayloads, -} from '@aztec/stdlib/tx'; +import { ExecutionPayload, TxSimulationResult, UtilityExecutionResult, mergeExecutionPayloads } from '@aztec/stdlib/tx'; import type { BatchedMethod, Wallet } from '../wallet/wallet.js'; import { BaseContractInteraction } from './base_contract_interaction.js'; @@ -42,9 +37,9 @@ export class BatchCall extends BaseContractInteraction { } /** - * Simulates the batch, supporting private, public and utility functions. Although this is a single + * Simulates/executes the batch, supporting private, public and utility functions. Although this is a single * interaction with the wallet, private and public functions will be grouped into a single ExecutionPayload - * that the wallet will simulate as a single transaction. Utility function calls will simply be executed + * that the wallet will simulate as a single transaction. Utility function calls will be executed * one by one. * @param options - An optional object containing additional configuration for the interaction. * @returns The results of all the interactions that make up the batch @@ -81,7 +76,7 @@ export class BatchCall extends BaseContractInteraction { // Add utility calls to batch for (const [call] of utility) { batchRequests.push({ - name: 'simulateUtility' as const, + name: 'executeUtility' as const, args: [call, { scope: options.from, authWitnesses: options.authWitnesses }], }); } @@ -111,8 +106,8 @@ export class BatchCall extends BaseContractInteraction { for (let i = 0; i < utility.length; i++) { const [call, resultIndex] = utility[i]; const wrappedResult = batchResults[i]; - if (wrappedResult.name === 'simulateUtility') { - const rawReturnValues = (wrappedResult.result as UtilitySimulationResult).result; + if (wrappedResult.name === 'executeUtility') { + const rawReturnValues = (wrappedResult.result as UtilityExecutionResult).result; results[resultIndex] = rawReturnValues ? decodeFromAbi(call.returnTypes, rawReturnValues) : []; } } diff --git a/yarn-project/aztec.js/src/contract/contract.test.ts b/yarn-project/aztec.js/src/contract/contract.test.ts index 3abac1754238..28005f6ecbfc 100644 --- a/yarn-project/aztec.js/src/contract/contract.test.ts +++ b/yarn-project/aztec.js/src/contract/contract.test.ts @@ -11,7 +11,7 @@ import type { TxHash, TxReceipt, TxSimulationResult, - UtilitySimulationResult, + UtilityExecutionResult, } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -31,7 +31,7 @@ describe('Contract Class', () => { const _mockTxHash = { type: 'TxHash' } as any as TxHash; const mockTxReceipt = { type: 'TxReceipt' } as any as TxReceipt; const mockTxSimulationResult = { type: 'TxSimulationResult', result: 1n } as any as TxSimulationResult; - const mockUtilityResultValue = { result: [new Fr(42)] } as any as UtilitySimulationResult; + const mockUtilityResultValue = { result: [new Fr(42)] } as any as UtilityExecutionResult; const defaultArtifact: ContractArtifact = { name: 'FooContract', @@ -137,7 +137,7 @@ describe('Contract Class', () => { account.createTxExecutionRequest.mockResolvedValue(mockTxRequest); wallet.registerContract.mockResolvedValue(contractInstance); wallet.sendTx.mockResolvedValue(mockTxReceipt); - wallet.simulateUtility.mockResolvedValue(mockUtilityResultValue); + wallet.executeUtility.mockResolvedValue(mockUtilityResultValue); }); it('should create and send a contract method tx', async () => { @@ -153,8 +153,8 @@ describe('Contract Class', () => { it('should call view on a utility function', async () => { const fooContract = Contract.at(contractAddress, defaultArtifact, wallet); const result = await fooContract.methods.qux(123n).simulate({ from: account.getAddress() }); - expect(wallet.simulateUtility).toHaveBeenCalledTimes(1); - expect(wallet.simulateUtility).toHaveBeenCalledWith( + expect(wallet.executeUtility).toHaveBeenCalledTimes(1); + expect(wallet.executeUtility).toHaveBeenCalledWith( expect.objectContaining({ name: 'qux', to: contractAddress }), expect.objectContaining({ scope: account.getAddress() }), ); diff --git a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts index d7e56e071598..a087d85f0525 100644 --- a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts +++ b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts @@ -111,7 +111,7 @@ export class ContractFunctionInteraction extends BaseContractInteraction { // docs:end:simulate if (this.functionDao.functionType == FunctionType.UTILITY) { const call = await this.getFunctionCall(); - const utilityResult = await this.wallet.simulateUtility(call, { + const utilityResult = await this.wallet.executeUtility(call, { scope: options.from, authWitnesses: options.authWitnesses, }); diff --git a/yarn-project/aztec.js/src/contract/deploy_method.ts b/yarn-project/aztec.js/src/contract/deploy_method.ts index 5c4d9544aa2e..4fc50d66265a 100644 --- a/yarn-project/aztec.js/src/contract/deploy_method.ts +++ b/yarn-project/aztec.js/src/contract/deploy_method.ts @@ -9,7 +9,14 @@ import { getContractInstanceFromInstantiationParams, } from '@aztec/stdlib/contract'; import type { PublicKeys } from '@aztec/stdlib/keys'; -import { type Capsule, TxHash, type TxProfileResult, type TxReceipt, collectOffchainEffects } from '@aztec/stdlib/tx'; +import { + type Capsule, + HashedValues, + TxHash, + type TxProfileResult, + type TxReceipt, + collectOffchainEffects, +} from '@aztec/stdlib/tx'; import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx'; import { publishContractClass } from '../deployment/publish_class.js'; @@ -164,6 +171,7 @@ export class DeployMethod extends constructorNameOrArtifact?: string | FunctionArtifact, authWitnesses: AuthWitness[] = [], capsules: Capsule[] = [], + private extraHashedArgs: HashedValues[] = [], ) { super(wallet, authWitnesses, capsules); this.constructorArtifact = getInitializer(artifact, constructorNameOrArtifact); @@ -174,20 +182,29 @@ export class DeployMethod extends * @param options - Configuration options. * @returns The execution payload for this operation */ - public async request(options?: RequestDeployOptions): Promise { + public async request(options: RequestDeployOptions = {}): Promise { const publication = await this.getPublicationExecutionPayload(options); if (!options?.skipRegistration) { await this.wallet.registerContract(await this.getInstance(options), this.artifact); } - + const { authWitnesses, capsules } = options; + + // Propagates the included authwitnesses, capsules, and extraHashedArgs + // potentially baked into the interaction + const initialExecutionPayload = new ExecutionPayload( + [], + this.authWitnesses.concat(authWitnesses ?? []), + this.capsules.concat(capsules ?? []), + this.extraHashedArgs, + ); const initialization = await this.getInitializationExecutionPayload(options); const feeExecutionPayload = options?.fee?.paymentMethod ? await options.fee.paymentMethod.getExecutionPayload() : undefined; const finalExecutionPayload = feeExecutionPayload - ? mergeExecutionPayloads([feeExecutionPayload, publication, initialization]) - : mergeExecutionPayloads([publication, initialization]); + ? mergeExecutionPayloads([initialExecutionPayload, feeExecutionPayload, publication, initialization]) + : mergeExecutionPayloads([initialExecutionPayload, publication, initialization]); if (!finalExecutionPayload.calls.length) { throw new Error(`No transactions are needed to publish or initialize contract ${this.artifact.name}`); } diff --git a/yarn-project/aztec.js/src/contract/get_gas_limits.test.ts b/yarn-project/aztec.js/src/contract/get_gas_limits.test.ts index 1fcdc12d2c9c..bf4edcc7c9ab 100644 --- a/yarn-project/aztec.js/src/contract/get_gas_limits.test.ts +++ b/yarn-project/aztec.js/src/contract/get_gas_limits.test.ts @@ -1,4 +1,4 @@ -import { AVM_MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; +import { MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; import { Gas } from '@aztec/stdlib/gas'; import { mockSimulatedTx, mockTxForRollup } from '@aztec/stdlib/testing'; import type { TxSimulationResult } from '@aztec/stdlib/tx'; @@ -50,19 +50,19 @@ describe('getGasLimits', () => { it('should fail if gas exceeds max processable gas', () => { // Consumes all of processable gas txSimulationResult.publicOutput!.gasUsed = { - totalGas: Gas.from({ daGas: 140, l2Gas: AVM_MAX_PROCESSABLE_L2_GAS }), - billedGas: Gas.from({ daGas: 150, l2Gas: AVM_MAX_PROCESSABLE_L2_GAS }), - teardownGas: Gas.from({ daGas: 10, l2Gas: AVM_MAX_PROCESSABLE_L2_GAS * 0.2 }), - publicGas: Gas.from({ daGas: 50, l2Gas: AVM_MAX_PROCESSABLE_L2_GAS }), + totalGas: Gas.from({ daGas: 140, l2Gas: MAX_PROCESSABLE_L2_GAS }), + billedGas: Gas.from({ daGas: 150, l2Gas: MAX_PROCESSABLE_L2_GAS }), + teardownGas: Gas.from({ daGas: 10, l2Gas: MAX_PROCESSABLE_L2_GAS * 0.2 }), + publicGas: Gas.from({ daGas: 50, l2Gas: MAX_PROCESSABLE_L2_GAS }), }; // Does not fail without padding since it's at the limit expect(getGasLimits(txSimulationResult, 0)).toEqual({ - gasLimits: Gas.from({ daGas: 140, l2Gas: AVM_MAX_PROCESSABLE_L2_GAS }), - teardownGasLimits: Gas.from({ daGas: 10, l2Gas: AVM_MAX_PROCESSABLE_L2_GAS * 0.2 }), + gasLimits: Gas.from({ daGas: 140, l2Gas: MAX_PROCESSABLE_L2_GAS }), + teardownGasLimits: Gas.from({ daGas: 10, l2Gas: Math.ceil(MAX_PROCESSABLE_L2_GAS * 0.2) }), }); // Fails with padding since it's over the limit expect(() => getGasLimits(txSimulationResult, 0.1)).toThrow( - 'Transaction consumes more gas than the AVM maximum processable gas', + 'Transaction consumes more l2 gas than the maximum processable gas', ); }); }); diff --git a/yarn-project/aztec.js/src/contract/get_gas_limits.ts b/yarn-project/aztec.js/src/contract/get_gas_limits.ts index d840011cce9f..d54a786c113b 100644 --- a/yarn-project/aztec.js/src/contract/get_gas_limits.ts +++ b/yarn-project/aztec.js/src/contract/get_gas_limits.ts @@ -1,4 +1,4 @@ -import { AVM_MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; +import { MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; import { Gas } from '@aztec/stdlib/gas'; import type { TxSimulationResult } from '@aztec/stdlib/tx'; @@ -23,8 +23,8 @@ export function getGasLimits( const gasLimits = simulationResult.gasUsed.totalGas.mul(1 + pad); const teardownGasLimits = simulationResult.gasUsed.teardownGas.mul(1 + pad); - if (gasLimits.l2Gas > AVM_MAX_PROCESSABLE_L2_GAS) { - throw new Error('Transaction consumes more gas than the AVM maximum processable gas'); + if (gasLimits.l2Gas > MAX_PROCESSABLE_L2_GAS) { + throw new Error('Transaction consumes more l2 gas than the maximum processable gas'); } return { gasLimits, diff --git a/yarn-project/aztec.js/src/wallet/capabilities.ts b/yarn-project/aztec.js/src/wallet/capabilities.ts index eb5516679477..54a6a3c2b42d 100644 --- a/yarn-project/aztec.js/src/wallet/capabilities.ts +++ b/yarn-project/aztec.js/src/wallet/capabilities.ts @@ -180,11 +180,11 @@ export interface ContractClassesCapability { export interface GrantedContractClassesCapability extends ContractClassesCapability {} /** - * Transaction simulation capability - for simulating transactions and utilities. + * Transaction simulation capability - for simulating transactions and executing utilities. * * Maps to wallet methods: * - simulateTx (when transactions scope specified) - * - simulateUtility (when utilities scope specified) + * - executeUtility (when utilities scope specified) * - profileTx (when transactions scope specified) * * @example @@ -200,7 +200,7 @@ export interface GrantedContractClassesCapability extends ContractClassesCapabil * \} * * @example - * // Simulate any transaction and utility call + * // Simulate any transaction and execute any utility call * \{ * type: 'simulation', * transactions: \{ scope: '*' \}, @@ -221,7 +221,7 @@ export interface SimulationCapability { scope: '*' | ContractFunctionPattern[]; }; - /** Utility simulation scope (unconstrained calls). Maps to: simulateUtility */ + /** Utility execution scope (unconstrained calls). Maps to: executeUtility */ utilities?: { /** * Which contracts/functions to allow: diff --git a/yarn-project/aztec.js/src/wallet/wallet.test.ts b/yarn-project/aztec.js/src/wallet/wallet.test.ts index 4d6d51e21fbe..bcee66440e18 100644 --- a/yarn-project/aztec.js/src/wallet/wallet.test.ts +++ b/yarn-project/aztec.js/src/wallet/wallet.test.ts @@ -15,7 +15,7 @@ import { TxProfileResult, TxReceipt, TxSimulationResult, - UtilitySimulationResult, + UtilityExecutionResult, } from '@aztec/stdlib/tx'; import { type InteractionWaitOptions, NO_WAIT, type SendReturn } from '../contract/interaction_options.js'; @@ -163,7 +163,7 @@ describe('WalletSchema', () => { expect(result).toBeInstanceOf(TxSimulationResult); }); - it('simulateUtility', async () => { + it('executeUtility', async () => { const call = FunctionCall.from({ name: 'testFunction', to: await AztecAddress.random(), @@ -174,11 +174,11 @@ describe('WalletSchema', () => { args: [Fr.random()], returnTypes: [], }); - const result = await context.client.simulateUtility(call, { + const result = await context.client.executeUtility(call, { scope: await AztecAddress.random(), authWitnesses: [AuthWitness.random()], }); - expect(result).toBeInstanceOf(UtilitySimulationResult); + expect(result).toBeInstanceOf(UtilityExecutionResult); }); it('profileTx', async () => { @@ -325,7 +325,7 @@ describe('WalletSchema', () => { { name: 'getAccounts', args: [] }, { name: 'registerContract', args: [mockInstance, mockArtifact, undefined] }, { name: 'simulateTx', args: [exec, simulateOpts] }, - { name: 'simulateUtility', args: [call, { scope: address3, authWitnesses: [AuthWitness.random()] }] }, + { name: 'executeUtility', args: [call, { scope: address3, authWitnesses: [AuthWitness.random()] }] }, { name: 'profileTx', args: [exec, profileOpts] }, { name: 'sendTx', args: [exec, opts] }, { name: 'createAuthWit', args: [address1, { consumer: await AztecAddress.random(), innerHash: Fr.random() }] }, @@ -351,7 +351,7 @@ describe('WalletSchema', () => { result: expect.objectContaining({ address: expect.any(AztecAddress) }), }); expect(results[8]).toEqual({ name: 'simulateTx', result: expect.any(TxSimulationResult) }); - expect(results[9]).toEqual({ name: 'simulateUtility', result: expect.any(UtilitySimulationResult) }); + expect(results[9]).toEqual({ name: 'executeUtility', result: expect.any(UtilityExecutionResult) }); expect(results[10]).toEqual({ name: 'profileTx', result: expect.any(TxProfileResult) }); expect(results[11]).toEqual({ name: 'sendTx', result: expect.any(TxReceipt) }); expect(results[12]).toEqual({ name: 'createAuthWit', result: expect.any(AuthWitness) }); @@ -430,11 +430,11 @@ class MockWallet implements Wallet { return Promise.resolve(TxSimulationResult.random()); } - simulateUtility( + executeUtility( _call: any, _opts: { scope: AztecAddress; authWitnesses?: AuthWitness[] }, - ): Promise { - return Promise.resolve(UtilitySimulationResult.random()); + ): Promise { + return Promise.resolve(UtilityExecutionResult.random()); } profileTx(_exec: ExecutionPayload, _opts: ProfileOptions): Promise { diff --git a/yarn-project/aztec.js/src/wallet/wallet.ts b/yarn-project/aztec.js/src/wallet/wallet.ts index 84cf35592761..9918542d297e 100644 --- a/yarn-project/aztec.js/src/wallet/wallet.ts +++ b/yarn-project/aztec.js/src/wallet/wallet.ts @@ -22,7 +22,7 @@ import { TxProfileResult, TxReceipt, TxSimulationResult, - UtilitySimulationResult, + UtilityExecutionResult, inTxSchema, } from '@aztec/stdlib/tx'; @@ -226,10 +226,10 @@ export type ContractClassMetadata = { }; /** - * Options for simulating a utility function call. + * Options for executing a utility function call. */ -export type SimulateUtilityOptions = { - /** The scope for the utility simulation (determines which notes and keys are visible). */ +export type ExecuteUtilityOptions = { + /** The scope for the utility execution (determines which notes and keys are visible). */ scope: AztecAddress; /** Optional auth witnesses to use during execution. */ authWitnesses?: AuthWitness[]; @@ -255,7 +255,7 @@ export type Wallet = { secretKey?: Fr, ): Promise; simulateTx(exec: ExecutionPayload, opts: SimulateOptions): Promise; - simulateUtility(call: FunctionCall, opts: SimulateUtilityOptions): Promise; + executeUtility(call: FunctionCall, opts: ExecuteUtilityOptions): Promise; profileTx(exec: ExecutionPayload, opts: ProfileOptions): Promise; sendTx( exec: ExecutionPayload, @@ -518,7 +518,7 @@ const WalletMethodSchemas = { .args(ContractInstanceWithAddressSchema, optional(ContractArtifactSchema), optional(schemas.Fr)) .returns(ContractInstanceWithAddressSchema), simulateTx: z.function().args(ExecutionPayloadSchema, SimulateOptionsSchema).returns(TxSimulationResult.schema), - simulateUtility: z + executeUtility: z .function() .args( FunctionCall.schema, @@ -527,7 +527,7 @@ const WalletMethodSchemas = { authWitnesses: optional(z.array(AuthWitness.schema)), }), ) - .returns(UtilitySimulationResult.schema), + .returns(UtilityExecutionResult.schema), profileTx: z.function().args(ExecutionPayloadSchema, ProfileOptionsSchema).returns(TxProfileResult.schema), sendTx: z .function() diff --git a/yarn-project/aztec/bootstrap.sh b/yarn-project/aztec/bootstrap.sh new file mode 100755 index 000000000000..c27fba277781 --- /dev/null +++ b/yarn-project/aztec/bootstrap.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +source $(git rev-parse --show-toplevel)/ci3/source_bootstrap + +repo_root=$(git rev-parse --show-toplevel) +export NARGO=${NARGO:-$repo_root/noir/noir-repo/target/release/nargo} +export BB=${BB:-$repo_root/barretenberg/cpp/build/bin/bb} +export PROFILER_PATH=${PROFILER_PATH:-$repo_root/noir/noir-repo/target/release/noir-profiler} + +hash=$(../bootstrap.sh hash) + +function test_cmds { + # All CLI tests share test/mixed-workspace/target so they must run sequentially + # in a single jest invocation (--runInBand is set by run_test.sh). + echo "$hash:ISOLATE=1:NAME=aztec/cli NARGO=$NARGO BB=$BB PROFILER_PATH=$PROFILER_PATH yarn-project/scripts/run_test.sh aztec/src/cli" +} + +case "$cmd" in + "") + ;; + *) + default_cmd_handler "$@" + ;; +esac diff --git a/yarn-project/aztec/scripts/aztec.sh b/yarn-project/aztec/scripts/aztec.sh index 93016cf41334..0a7e9003882e 100755 --- a/yarn-project/aztec/scripts/aztec.sh +++ b/yarn-project/aztec/scripts/aztec.sh @@ -21,13 +21,13 @@ function aztec { case $cmd in test) - export LOG_LEVEL="${LOG_LEVEL:-error}" + export LOG_LEVEL="${LOG_LEVEL:-"error;trace:contract_log"}" aztec start --txe --port 8081 & server_pid=$! trap 'kill $server_pid &>/dev/null || true' EXIT while ! nc -z 127.0.0.1 8081 &>/dev/null; do sleep 0.2; done export NARGO_FOREIGN_CALL_TIMEOUT=300000 - nargo test --silence-warnings --oracle-resolver http://127.0.0.1:8081 "$@" + nargo test --silence-warnings --oracle-resolver http://127.0.0.1:8081 --test-threads 16 "$@" ;; start) if [ "${1:-}" == "--local-network" ]; then @@ -54,9 +54,13 @@ case $cmd in aztec start "$@" ;; - compile|new|init|flamegraph) + new|init) $script_dir/${cmd}.sh "$@" ;; + flamegraph) + echo "Warning: 'aztec flamegraph' is deprecated. Use 'aztec profile flamegraph' instead." >&2 + aztec profile flamegraph "$@" + ;; *) aztec $cmd "$@" ;; diff --git a/yarn-project/aztec/scripts/compile.sh b/yarn-project/aztec/scripts/compile.sh deleted file mode 100755 index 7bec1e29d17f..000000000000 --- a/yarn-project/aztec/scripts/compile.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -NARGO=${NARGO:-nargo} -BB=${BB:-bb} - -# If help is requested, show Aztec-specific info then run nargo compile help and then exit in order to not trigger -# transpilation -for arg in "$@"; do - if [ "$arg" == "--help" ] || [ "$arg" == "-h" ]; then - cat << 'EOF' -Aztec Compile - Compile Aztec Noir contracts - -This command compiles Aztec Noir contracts using nargo and then automatically -postprocesses them to generate Aztec specific artifacts including: -- Transpiled contract artifacts -- Verification keys - -The compiled contracts will be placed in the target/ directory by default. - ---- -Underlying nargo compile options: - -EOF - nargo compile --help - exit 0 - fi -done - -# Run nargo compile. -$NARGO compile "$@" - -echo "Postprocessing contract..." -$BB aztec_process - -# Strip internal prefixes from all compiled contract JSONs in target directory -# TODO: This should be part of bb aztec_process! -for json in target/*.json; do - temp_file="${json}.tmp" - jq '.functions |= map(.name |= sub("^__aztec_nr_internals__"; ""))' "$json" > "$temp_file" - mv "$temp_file" "$json" -done - -echo "Compilation complete!" diff --git a/yarn-project/aztec/scripts/extract_function.js b/yarn-project/aztec/scripts/extract_function.js deleted file mode 100644 index c73c8ba9aa58..000000000000 --- a/yarn-project/aztec/scripts/extract_function.js +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env node -import fs from 'fs/promises'; -import path from 'path'; - -// Simple script to extract a contract function as a separate Noir artifact. -// We need to use this since the transpiling that we do on public functions make the contract artifacts -// unreadable by noir tooling, since they are no longer following the noir artifact format. -async function main() { - let [contractArtifactPath, functionName] = process.argv.slice(2); - if (!contractArtifactPath || !functionName) { - console.log('Usage: node extractFunctionAsNoirArtifact.js '); - return; - } - - const contractArtifact = JSON.parse(await fs.readFile(contractArtifactPath, 'utf8')); - const func = contractArtifact.functions.find(f => f.name === functionName); - if (!func) { - console.error(`Function ${functionName} not found in ${contractArtifactPath}`); - return; - } - - const artifact = { - noir_version: contractArtifact.noir_version, - hash: 0, - abi: func.abi, - bytecode: func.bytecode, - debug_symbols: func.debug_symbols, - file_map: contractArtifact.file_map, - expression_width: { - Bounded: { - width: 4, - }, - }, - }; - - const outputDir = path.dirname(contractArtifactPath); - const outputName = path.basename(contractArtifactPath, '.json') + `-${functionName}.json`; - - const outPath = path.join(outputDir, outputName); - - await fs.writeFile(outPath, JSON.stringify(artifact, null, 2)); -} - -main().catch(err => { - console.error(err); - process.exit(1); -}); diff --git a/yarn-project/aztec/scripts/flamegraph.sh b/yarn-project/aztec/scripts/flamegraph.sh deleted file mode 100755 index 48763ef0d793..000000000000 --- a/yarn-project/aztec/scripts/flamegraph.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -set -eu - -# If first arg is -h or --help, print usage. -if [ $# -lt 2 ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]; then - cat << 'EOF' -Aztec Flamegraph - Generate a gate count flamegraph for an aztec contract function. - -Usage: aztec flamegraph - -Options: - -h, --help Print help - -Will output an svg at /--flamegraph.svg. -You can open it in your browser to view it. - -EOF - exit 0 -fi - -cleanup() { - set +e - if [ -f "$function_artifact" ]; then - rm -f "$function_artifact" - fi -} - -trap cleanup EXIT - -# Get the directory of the script -script_dir=$(realpath $(dirname $0)) - -PROFILER=${PROFILER_PATH:-noir-profiler} -BB=${BB:-bb} - -# first console arg is contract name in camel case or path to contract artifact -contract=$1 - -# second console arg is the contract function -function=$2 - -if [ ! -f "$contract" ]; then - echo "Error: Contract artifact not found at: $contract" - exit 1 -fi -artifact_path=$contract -function_artifact="${artifact_path%%.json}-${function}.json" -output_dir=$(dirname "$artifact_path") - -# Extract artifact for the specific function. -node $script_dir/extract_function.js "$artifact_path" $function - -# Generate the flamegraph -$PROFILER gates --artifact-path "$function_artifact" --backend-path "$BB" --backend-gates-command "gates" --output "$output_dir" --scheme chonk --include_gates_per_opcode - -# Save as $artifact_name-$function-flamegraph.svg -output_file="${function_artifact%%.json}-flamegraph.svg" -mv "$output_dir/__aztec_nr_internals__${function}_gates.svg" "$output_file" -echo "Flamegraph generated at: $output_file" diff --git a/yarn-project/aztec/src/bin/index.ts b/yarn-project/aztec/src/bin/index.ts index d06b298d9add..c1565d92576f 100644 --- a/yarn-project/aztec/src/bin/index.ts +++ b/yarn-project/aztec/src/bin/index.ts @@ -14,7 +14,9 @@ import { createConsoleLogger, createLogger } from '@aztec/foundation/log'; import { Command } from 'commander'; +import { injectCompileCommand } from '../cli/cmds/compile.js'; import { injectMigrateCommand } from '../cli/cmds/migrate_ha_db.js'; +import { injectProfileCommand } from '../cli/cmds/profile.js'; import { injectAztecCommands } from '../cli/index.js'; import { getCliVersion } from '../cli/release_version.js'; @@ -47,7 +49,7 @@ async function main() { const cliVersion = getCliVersion(); let program = new Command('aztec'); - program.description('Aztec command line interface').version(cliVersion); + program.description('Aztec command line interface').version(cliVersion).enablePositionalOptions(); program = injectAztecCommands(program, userLog, debugLogger); program = injectBuilderCommands(program); program = injectContractCommands(program, userLog, debugLogger); @@ -56,6 +58,8 @@ async function main() { program = injectAztecNodeCommands(program, userLog, debugLogger); program = injectMiscCommands(program, userLog); program = injectValidatorKeysCommands(program, userLog); + program = injectCompileCommand(program, userLog); + program = injectProfileCommand(program, userLog); program = injectMigrateCommand(program, userLog); await program.parseAsync(process.argv); diff --git a/yarn-project/aztec/src/cli/admin_api_key_store.test.ts b/yarn-project/aztec/src/cli/admin_api_key_store.test.ts index c91e05c44865..439b791b7329 100644 --- a/yarn-project/aztec/src/cli/admin_api_key_store.test.ts +++ b/yarn-project/aztec/src/cli/admin_api_key_store.test.ts @@ -22,9 +22,9 @@ describe('resolveAdminApiKey', () => { } }); - describe('opt-out (noAdminApiKey = true)', () => { + describe('opt-out (disableAdminApiKey = true)', () => { it('returns undefined when auth is disabled', async () => { - const result = await resolveAdminApiKey({ noAdminApiKey: true }, log); + const result = await resolveAdminApiKey({ disableAdminApiKey: true }, log); expect(result).toBeUndefined(); }); }); diff --git a/yarn-project/aztec/src/cli/admin_api_key_store.ts b/yarn-project/aztec/src/cli/admin_api_key_store.ts index 6d0ea07c9c81..9c2d0a3c36fb 100644 --- a/yarn-project/aztec/src/cli/admin_api_key_store.ts +++ b/yarn-project/aztec/src/cli/admin_api_key_store.ts @@ -28,7 +28,7 @@ export interface ResolveAdminApiKeyOptions { /** SHA-256 hex hash of a pre-generated API key. When set, the node uses this hash directly. */ adminApiKeyHash?: string; /** If true, disable admin API key auth entirely. */ - noAdminApiKey?: boolean; + disableAdminApiKey?: boolean; /** If true, force-generate a new key even if one is already persisted. */ resetAdminApiKey?: boolean; /** Root data directory for persistent storage. */ @@ -39,7 +39,7 @@ export interface ResolveAdminApiKeyOptions { * Resolves the admin API key for the admin RPC endpoint. * * Strategy: - * 1. If opt-out flag is set (`noAdminApiKey`), return undefined (no auth). + * 1. If opt-out flag is set (`disableAdminApiKey`), return undefined (no auth). * 2. If a pre-generated hash is provided (`adminApiKeyHash`), use it directly. * 3. If a data directory exists, look for a persisted hash file * at `/admin/api_key_hash`: @@ -58,8 +58,8 @@ export async function resolveAdminApiKey( log: Logger, ): Promise { // Operator explicitly opted out of admin auth - if (options.noAdminApiKey) { - log.warn('Admin API key authentication is DISABLED (--no-admin-api-key / AZTEC_NO_ADMIN_API_KEY)'); + if (options.disableAdminApiKey) { + log.warn('Admin API key authentication is DISABLED (--disable-admin-api-key / AZTEC_DISABLE_ADMIN_API_KEY)'); return undefined; } diff --git a/yarn-project/aztec/src/cli/aztec_start_action.ts b/yarn-project/aztec/src/cli/aztec_start_action.ts index 9ffad783f0f1..3b966865084e 100644 --- a/yarn-project/aztec/src/cli/aztec_start_action.ts +++ b/yarn-project/aztec/src/cli/aztec_start_action.ts @@ -37,11 +37,11 @@ export async function aztecStart(options: any, userLog: LogFn, debugLogger: Logg l1RpcUrls: options.l1RpcUrls, testAccounts: localNetwork.testAccounts, realProofs: false, - // Setting the epoch duration to 4 by default for local network. This allows the epoch to be "proven" faster, so + // Setting the epoch duration to 2 by default for local network. This allows the epoch to be "proven" faster, so // the users can consume out hash without having to wait for a long time. // Note: We are not proving anything in the local network (realProofs == false). But in `createLocalNetwork`, // the EpochTestSettler will set the out hash to the outbox when an epoch is complete. - aztecEpochDuration: 4, + aztecEpochDuration: 2, }, userLog, ); @@ -109,7 +109,7 @@ export async function aztecStart(options: any, userLog: LogFn, debugLogger: Logg const apiKeyResolution = await resolveAdminApiKey( { adminApiKeyHash: options.adminApiKeyHash, - noAdminApiKey: options.noAdminApiKey, + disableAdminApiKey: options.disableAdminApiKey, resetAdminApiKey: options.resetAdminApiKey, dataDirectory: options.dataDirectory, }, @@ -148,7 +148,7 @@ export async function aztecStart(options: any, userLog: LogFn, debugLogger: Logg userLog(' The key hash has been persisted — on next restart, the same key will be used.'); } userLog(''); - userLog(' To disable admin auth: --no-admin-api-key or AZTEC_NO_ADMIN_API_KEY=true'); + userLog(' To disable admin auth: --disable-admin-api-key or AZTEC_DISABLE_ADMIN_API_KEY=true'); userLog(separator); userLog(''); } diff --git a/yarn-project/aztec/src/cli/aztec_start_options.ts b/yarn-project/aztec/src/cli/aztec_start_options.ts index 31337c92a92a..616613c7fb51 100644 --- a/yarn-project/aztec/src/cli/aztec_start_options.ts +++ b/yarn-project/aztec/src/cli/aztec_start_options.ts @@ -150,12 +150,13 @@ export const aztecStartOptions: { [key: string]: AztecStartOption[] } = { env: 'AZTEC_ADMIN_API_KEY_HASH', }, { - flag: '--no-admin-api-key', + flag: '--disable-admin-api-key', description: 'Disable API key authentication on the admin RPC endpoint. By default, a key is auto-generated, displayed once, and its hash is persisted.', defaultValue: false, - env: 'AZTEC_NO_ADMIN_API_KEY', - parseVal: val => val === 'true' || val === '1', + env: 'AZTEC_DISABLE_ADMIN_API_KEY', + // undefined means the flag was passed without a value (boolean toggle), treat as true. + parseVal: val => val === undefined || val === 'true' || val === '1', }, { flag: '--reset-admin-api-key', diff --git a/yarn-project/aztec/src/cli/cli.ts b/yarn-project/aztec/src/cli/cli.ts index f086b852da31..1c79cf24f294 100644 --- a/yarn-project/aztec/src/cli/cli.ts +++ b/yarn-project/aztec/src/cli/cli.ts @@ -39,7 +39,6 @@ Additional commands: init [folder] [options] creates a new Aztec Noir project. new [options] creates a new Aztec Noir project in a new directory. - compile [options] compiles Aztec Noir contracts. test [options] starts a TXE and runs "nargo test" using it as the oracle resolver. `, ); diff --git a/yarn-project/aztec/src/cli/cmds/compile.test.ts b/yarn-project/aztec/src/cli/cmds/compile.test.ts new file mode 100644 index 000000000000..8a0af802b005 --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/compile.test.ts @@ -0,0 +1,82 @@ +import { afterAll, beforeAll, describe, expect, it } from '@jest/globals'; +import { execFileSync } from 'child_process'; +import { existsSync, readFileSync, rmSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), '../../..'); +const CLI = join(PACKAGE_ROOT, 'dest/bin/index.js'); +const WORKSPACE = join(PACKAGE_ROOT, 'test/mixed-workspace'); +const TARGET = join(WORKSPACE, 'target'); +const CODEGEN_OUT = join(WORKSPACE, 'codegen-output'); + +// Compiles a mixed workspace containing both a contract and a plain circuit, +// then runs codegen. Validates that: +// - Contract artifacts have a functions array and are transpiled +// - Program (circuit) artifacts do not have functions and are not transpiled +// - Codegen produces TypeScript only for contracts, not circuits +describe('aztec compile integration', () => { + beforeAll(() => { + cleanupArtifacts(); + runCompile(); + runCodegen(); + }, 120_000); + + afterAll(() => { + cleanupArtifacts(); + }); + + it('contract artifact has functions array', () => { + const artifact = JSON.parse(readFileSync(join(TARGET, 'simple_contract-SimpleContract.json'), 'utf-8')); + expect(Array.isArray(artifact.functions)).toBe(true); + expect(artifact.functions.length).toBeGreaterThan(0); + }); + + it('program artifact does not have functions', () => { + const artifact = JSON.parse(readFileSync(join(TARGET, 'simple_circuit.json'), 'utf-8')); + expect(artifact.functions).toBeUndefined(); + }); + + it('contract artifact was transpiled', () => { + const artifact = JSON.parse(readFileSync(join(TARGET, 'simple_contract-SimpleContract.json'), 'utf-8')); + expect(artifact.transpiled).toBe(true); + }); + + it('program artifact was not transpiled', () => { + const artifact = JSON.parse(readFileSync(join(TARGET, 'simple_circuit.json'), 'utf-8')); + expect(artifact.transpiled).toBeFalsy(); + }); + + it('codegen produced TypeScript for contract', () => { + expect(existsSync(join(CODEGEN_OUT, 'SimpleContract.ts'))).toBe(true); + }); + + it('codegen did not produce TypeScript for circuit', () => { + expect(existsSync(join(CODEGEN_OUT, 'SimpleCircuit.ts'))).toBe(false); + }); +}); + +function cleanupArtifacts() { + rmSync(TARGET, { recursive: true, force: true }); + rmSync(CODEGEN_OUT, { recursive: true, force: true }); + rmSync(join(WORKSPACE, 'codegenCache.json'), { force: true }); +} + +function runCompile() { + try { + execFileSync('node', [CLI, 'compile'], { cwd: WORKSPACE, stdio: 'pipe' }); + } catch (e: any) { + throw new Error(`compile failed:\n${e.stderr?.toString() ?? e.message}`); + } +} + +function runCodegen() { + try { + execFileSync('node', [CLI, 'codegen', 'target', '-o', 'codegen-output', '-f'], { + cwd: WORKSPACE, + stdio: 'pipe', + }); + } catch (e: any) { + throw new Error(`codegen failed:\n${e.stderr?.toString() ?? e.message}`); + } +} diff --git a/yarn-project/aztec/src/cli/cmds/compile.ts b/yarn-project/aztec/src/cli/cmds/compile.ts new file mode 100644 index 000000000000..9737eeb9b312 --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/compile.ts @@ -0,0 +1,80 @@ +import type { LogFn } from '@aztec/foundation/log'; + +import { execFileSync } from 'child_process'; +import type { Command } from 'commander'; +import { readFile, writeFile } from 'fs/promises'; + +import { readArtifactFiles } from './utils/artifacts.js'; +import { run } from './utils/spawn.js'; + +/** Returns paths to contract artifacts in the target directory. */ +async function collectContractArtifacts(): Promise { + let files; + try { + files = await readArtifactFiles('target'); + } catch (err: any) { + if (err?.message?.includes('does not exist')) { + return []; + } + throw err; + } + return files.filter(f => Array.isArray(f.content.functions)).map(f => f.filePath); +} + +/** Strips the `__aztec_nr_internals__` prefix from function names in contract artifacts. */ +async function stripInternalPrefixes(artifactPaths: string[]): Promise { + for (const path of artifactPaths) { + const artifact = JSON.parse(await readFile(path, 'utf-8')); + for (const fn of artifact.functions) { + if (typeof fn.name === 'string') { + fn.name = fn.name.replace(/^__aztec_nr_internals__/, ''); + } + } + await writeFile(path, JSON.stringify(artifact, null, 2) + '\n'); + } +} + +/** Compiles Aztec Noir contracts and postprocesses artifacts. */ +async function compileAztecContract(nargoArgs: string[], log: LogFn): Promise { + const nargo = process.env.NARGO ?? 'nargo'; + const bb = process.env.BB ?? 'bb'; + + await run(nargo, ['compile', ...nargoArgs]); + + const artifacts = await collectContractArtifacts(); + + if (artifacts.length > 0) { + log('Postprocessing contracts...'); + const bbArgs = artifacts.flatMap(a => ['-i', a]); + await run(bb, ['aztec_process', ...bbArgs]); + + // TODO: This should be part of bb aztec_process! + await stripInternalPrefixes(artifacts); + } + + log('Compilation complete!'); +} + +export function injectCompileCommand(program: Command, log: LogFn): Command { + program + .command('compile') + .argument('[nargo-args...]') + .passThroughOptions() + .allowUnknownOption() + .description( + 'Compile Aztec Noir contracts using nargo and postprocess them to generate transpiled artifacts and verification keys. All options are forwarded to nargo compile.', + ) + .addHelpText('after', () => { + // Show nargo's own compile options so users see all available flags in one place. + const nargo = process.env.NARGO ?? 'nargo'; + try { + const output = execFileSync(nargo, ['compile', '--help'], { encoding: 'utf-8' }); + return `\nUnderlying nargo compile options:\n\n${output}`; + } catch { + return '\n(Run "nargo compile --help" to see available nargo options)'; + } + }) + .action((nargoArgs: string[]) => compileAztecContract(nargoArgs, log)); + + return program; +} diff --git a/yarn-project/aztec/src/cli/cmds/profile.ts b/yarn-project/aztec/src/cli/cmds/profile.ts new file mode 100644 index 000000000000..d7248025074a --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/profile.ts @@ -0,0 +1,25 @@ +import type { LogFn } from '@aztec/foundation/log'; + +import type { Command } from 'commander'; + +import { profileFlamegraph } from './profile_flamegraph.js'; +import { profileGates } from './profile_gates.js'; + +export function injectProfileCommand(program: Command, log: LogFn): Command { + const profile = program.command('profile').description('Profile compiled Aztec artifacts.'); + + profile + .command('gates') + .argument('[target-dir]', 'Path to the compiled artifacts directory', './target') + .description('Display gate counts for all compiled Aztec artifacts in a target directory.') + .action((targetDir: string) => profileGates(targetDir, log)); + + profile + .command('flamegraph') + .argument('', 'Path to the compiled contract artifact JSON') + .argument('', 'Name of the contract function to profile') + .description('Generate a gate count flamegraph SVG for a contract function.') + .action((artifactPath: string, functionName: string) => profileFlamegraph(artifactPath, functionName, log)); + + return program; +} diff --git a/yarn-project/aztec/src/cli/cmds/profile_flamegraph.test.ts b/yarn-project/aztec/src/cli/cmds/profile_flamegraph.test.ts new file mode 100644 index 000000000000..4a91bf417717 --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/profile_flamegraph.test.ts @@ -0,0 +1,51 @@ +import { afterAll, beforeAll, describe, expect, it } from '@jest/globals'; +import { execFileSync } from 'child_process'; +import { existsSync, readFileSync, rmSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), '../../..'); +const CLI = join(PACKAGE_ROOT, 'dest/bin/index.js'); +const WORKSPACE = join(PACKAGE_ROOT, 'test/mixed-workspace'); +const TARGET = join(WORKSPACE, 'target'); +const CONTRACT_ARTIFACT = join(TARGET, 'simple_contract-SimpleContract.json'); + +describe('aztec profile flamegraph', () => { + const svgPath = join(TARGET, 'simple_contract-SimpleContract-private_function-flamegraph.svg'); + + beforeAll(() => { + rmSync(TARGET, { recursive: true, force: true }); + runCompile(); + runFlamegraph(CONTRACT_ARTIFACT, 'private_function'); + }, 300_000); + + afterAll(() => { + rmSync(TARGET, { recursive: true, force: true }); + }); + + it('generates a valid flamegraph SVG', () => { + expect(existsSync(svgPath)).toBe(true); + const content = readFileSync(svgPath, 'utf-8'); + expect(content).toContain(''); + }); +}); + +function runCompile() { + try { + execFileSync('node', [CLI, 'compile'], { cwd: WORKSPACE, stdio: 'pipe' }); + } catch (e: any) { + throw new Error(`compile failed:\n${e.stderr?.toString() ?? e.message}`); + } +} + +function runFlamegraph(artifactPath: string, functionName: string) { + try { + execFileSync('node', [CLI, 'profile', 'flamegraph', artifactPath, functionName], { + encoding: 'utf-8', + stdio: 'pipe', + }); + } catch (e: any) { + throw new Error(`profile flamegraph failed:\n${e.stderr?.toString() ?? e.message}`); + } +} diff --git a/yarn-project/aztec/src/cli/cmds/profile_flamegraph.ts b/yarn-project/aztec/src/cli/cmds/profile_flamegraph.ts new file mode 100644 index 000000000000..78b4743d715e --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/profile_flamegraph.ts @@ -0,0 +1,63 @@ +import type { LogFn } from '@aztec/foundation/log'; + +import { readFile, rename, rm, writeFile } from 'fs/promises'; +import { basename, dirname, join } from 'path'; + +import { makeFunctionArtifact } from './profile_utils.js'; +import type { CompiledArtifact } from './utils/artifacts.js'; +import { run } from './utils/spawn.js'; + +/** Generates a gate count flamegraph SVG for a single contract function. */ +export async function profileFlamegraph(artifactPath: string, functionName: string, log: LogFn): Promise { + const raw = await readFile(artifactPath, 'utf-8'); + const artifact: CompiledArtifact = JSON.parse(raw); + + if (!Array.isArray(artifact.functions)) { + throw new Error(`${artifactPath} does not appear to be a contract artifact (no functions array)`); + } + + const func = artifact.functions.find(f => f.name === functionName); + if (!func) { + const available = artifact.functions.map(f => f.name).join(', '); + throw new Error(`Function "${functionName}" not found in artifact. Available: ${available}`); + } + if (func.is_unconstrained) { + throw new Error(`Function "${functionName}" is unconstrained and cannot be profiled`); + } + + const outputDir = dirname(artifactPath); + const contractName = basename(artifactPath, '.json'); + const functionArtifact = join(outputDir, `${contractName}-${functionName}.json`); + + try { + await writeFile(functionArtifact, makeFunctionArtifact(artifact, func)); + + const profiler = process.env.PROFILER_PATH ?? 'noir-profiler'; + const bb = process.env.BB ?? 'bb'; + + await run(profiler, [ + 'gates', + '--artifact-path', + functionArtifact, + '--backend-path', + bb, + '--backend-gates-command', + 'gates', + '--output', + outputDir, + '--scheme', + 'chonk', + '--include_gates_per_opcode', + ]); + + // noir-profiler names the SVG using the internal function name which + // retains the __aztec_nr_internals__ prefix in the bytecode metadata. + const srcSvg = join(outputDir, `__aztec_nr_internals__${functionName}_gates.svg`); + const destSvg = join(outputDir, `${contractName}-${functionName}-flamegraph.svg`); + await rename(srcSvg, destSvg); + + log(`Flamegraph written to ${destSvg}`); + } finally { + await rm(functionArtifact, { force: true }); + } +} diff --git a/yarn-project/aztec/src/cli/cmds/profile_gates.test.ts b/yarn-project/aztec/src/cli/cmds/profile_gates.test.ts new file mode 100644 index 000000000000..d933dc232f0f --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/profile_gates.test.ts @@ -0,0 +1,58 @@ +import { afterAll, beforeAll, describe, expect, it } from '@jest/globals'; +import { execFileSync } from 'child_process'; +import { rmSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), '../../..'); +const CLI = join(PACKAGE_ROOT, 'dest/bin/index.js'); +const WORKSPACE = join(PACKAGE_ROOT, 'test/mixed-workspace'); +const TARGET = join(WORKSPACE, 'target'); + +describe('aztec profile gates', () => { + let gatesOutput: string; + + beforeAll(() => { + rmSync(TARGET, { recursive: true, force: true }); + runCompile(); + gatesOutput = runProfile('gates'); + }, 300_000); + + afterAll(() => { + rmSync(TARGET, { recursive: true, force: true }); + }); + + it('prints gate counts for both contract functions', () => { + expect(gatesOutput).toContain('simple_contract-SimpleContract::private_function'); + expect(gatesOutput).toContain('simple_contract-SimpleContract::another_private_function'); + }); + + it('prints gate counts for both plain circuits', () => { + expect(gatesOutput).toContain('simple_circuit'); + expect(gatesOutput).toContain('simple_circuit_2'); + }); + + it('gate counts are positive integers', () => { + const counts = [...gatesOutput.matchAll(/(\d[\d,]*)\s*$/gm)].map(m => parseInt(m[1].replace(/,/g, ''), 10)); + expect(counts.length).toBeGreaterThanOrEqual(4); + for (const count of counts) { + expect(count).toBeGreaterThan(0); + } + }); +}); + +function runCompile() { + try { + execFileSync('node', [CLI, 'compile'], { cwd: WORKSPACE, stdio: 'pipe' }); + } catch (e: any) { + throw new Error(`compile failed:\n${e.stderr?.toString() ?? e.message}`); + } +} + +function runProfile(subcommand: string) { + try { + return execFileSync('node', [CLI, 'profile', subcommand, TARGET], { encoding: 'utf-8', stdio: 'pipe' }); + } catch (e: any) { + throw new Error(`profile ${subcommand} failed:\n${e.stderr?.toString() ?? e.message}`); + } +} diff --git a/yarn-project/aztec/src/cli/cmds/profile_gates.ts b/yarn-project/aztec/src/cli/cmds/profile_gates.ts new file mode 100644 index 000000000000..19770ba91f1e --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/profile_gates.ts @@ -0,0 +1,67 @@ +import { asyncPool } from '@aztec/foundation/async-pool'; +import type { LogFn } from '@aztec/foundation/log'; + +import { execFile as execFileCb } from 'child_process'; +import { rm } from 'fs/promises'; +import { promisify } from 'util'; + +import { MAX_CONCURRENT, discoverArtifacts } from './profile_utils.js'; + +const execFile = promisify(execFileCb); + +interface GateCountResult { + name: string; + gateCount: number; +} + +/** Parses circuit_size from bb gates JSON output: { "functions": [{ "circuit_size": N }] } */ +function parseGateCount(stdout: string): number { + const parsed = JSON.parse(stdout); + const size = parsed?.functions?.[0]?.circuit_size; + if (typeof size !== 'number') { + throw new Error('Failed to parse circuit_size from bb gates output'); + } + return size; +} + +/** Runs bb gates on a single artifact file and returns the gate count. */ +async function getGateCount(bb: string, artifactPath: string): Promise { + const { stdout } = await execFile(bb, ['gates', '--scheme', 'chonk', '-b', artifactPath]); + return parseGateCount(stdout); +} + +/** Profiles all compiled artifacts in a target directory and prints gate counts. */ +export async function profileGates(targetDir: string, log: LogFn): Promise { + const bb = process.env.BB ?? 'bb'; + const { artifacts, tmpDir } = await discoverArtifacts(targetDir); + + if (artifacts.length === 0) { + log('No artifacts found in target directory.'); + return; + } + + try { + const results: GateCountResult[] = await asyncPool(MAX_CONCURRENT, artifacts, async artifact => ({ + name: artifact.name, + gateCount: await getGateCount(bb, artifact.filePath), + })); + results.sort((a, b) => a.name.localeCompare(b.name)); + + if (results.length === 0) { + log('No constrained circuits found.'); + return; + } + + const maxNameLen = Math.max(...results.map(r => r.name.length)); + log(''); + log('Gate counts:'); + log('-'.repeat(maxNameLen + 16)); + for (const { name, gateCount } of results) { + log(`${name.padEnd(maxNameLen)} ${gateCount.toLocaleString().padStart(12)}`); + } + log('-'.repeat(maxNameLen + 16)); + log(`Total: ${results.length} circuit(s)`); + } finally { + await rm(tmpDir, { recursive: true, force: true }); + } +} diff --git a/yarn-project/aztec/src/cli/cmds/profile_utils.ts b/yarn-project/aztec/src/cli/cmds/profile_utils.ts new file mode 100644 index 000000000000..e604419bc631 --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/profile_utils.ts @@ -0,0 +1,58 @@ +import { mkdtemp, writeFile } from 'fs/promises'; +import { tmpdir } from 'os'; +import { join } from 'path'; + +import type { CompiledArtifact, ContractFunction } from './utils/artifacts.js'; +import { readArtifactFiles } from './utils/artifacts.js'; + +export const MAX_CONCURRENT = 4; + +export interface DiscoveredArtifact { + name: string; + filePath: string; + type: 'contract-function' | 'program'; +} + +/** + * Reads a target directory and returns a list of discovered artifacts with temp files + * created for contract functions. Caller must clean up tmpDir when done. + */ +export async function discoverArtifacts( + targetDir: string, +): Promise<{ artifacts: DiscoveredArtifact[]; tmpDir: string }> { + const files = await readArtifactFiles(targetDir); + const tmpDir = await mkdtemp(join(tmpdir(), 'aztec-profile-')); + const artifacts: DiscoveredArtifact[] = []; + + for (const file of files) { + if (Array.isArray(file.content.functions)) { + for (const func of file.content.functions) { + if (!func.bytecode || func.is_unconstrained) { + continue; + } + const name = `${file.name}::${func.name}`; + const tmpPath = join(tmpDir, `${file.name}-${func.name}.json`); + await writeFile(tmpPath, makeFunctionArtifact(file.content, func)); + artifacts.push({ name, filePath: tmpPath, type: 'contract-function' }); + } + } else if (file.content.bytecode) { + artifacts.push({ name: file.name, filePath: file.filePath, type: 'program' }); + } + } + + return { artifacts, tmpDir }; +} + +/** Extracts a contract function as a standalone program artifact JSON string. */ +export function makeFunctionArtifact(artifact: CompiledArtifact, func: ContractFunction) { + /* eslint-disable camelcase */ + return JSON.stringify({ + noir_version: artifact.noir_version, + hash: 0, + abi: func.abi, + bytecode: func.bytecode, + debug_symbols: func.debug_symbols, + file_map: artifact.file_map, + }); + /* eslint-enable camelcase */ +} diff --git a/yarn-project/aztec/src/cli/cmds/start_node.ts b/yarn-project/aztec/src/cli/cmds/start_node.ts index abed355ce4f6..a034cf3a6f5a 100644 --- a/yarn-project/aztec/src/cli/cmds/start_node.ts +++ b/yarn-project/aztec/src/cli/cmds/start_node.ts @@ -4,10 +4,14 @@ import { Fr } from '@aztec/aztec.js/fields'; import { getSponsoredFPCAddress } from '@aztec/cli/cli-utils'; import { getL1Config } from '@aztec/cli/config'; import { getPublicClient } from '@aztec/ethereum/client'; +import { RegistryContract, RollupContract } from '@aztec/ethereum/contracts'; import { SecretValue } from '@aztec/foundation/config'; +import { EthAddress } from '@aztec/foundation/eth-address'; import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server'; +import { startHttpRpcServer } from '@aztec/foundation/json-rpc/server'; import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici'; import type { LogFn } from '@aztec/foundation/log'; +import { sleep } from '@aztec/foundation/sleep'; import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker'; import { type CliPXEOptions, type PXEConfig, allPxeConfigMappings } from '@aztec/pxe/config'; import { AztecNodeAdminApiSchema, AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client'; @@ -21,6 +25,8 @@ import { import { EmbeddedWallet } from '@aztec/wallets/embedded'; import { getGenesisValues } from '@aztec/world-state/testing'; +import Koa from 'koa'; + import { createAztecNode } from '../../local-network/index.js'; import { extractNamespacedOptions, @@ -31,6 +37,72 @@ import { import { getVersions } from '../versioning.js'; import { startProverBroker } from './start_prover_broker.js'; +const ROLLUP_POLL_INTERVAL_MS = 600_000; + +/** + * Waits until the canonical rollup's genesis archive root matches the expected local genesis root. + * If the rollup is not yet compatible (e.g. during L1 contract upgrades), enters standby mode: + * starts a lightweight HTTP server for K8s liveness probes and polls until a compatible rollup appears. + */ +async function waitForCompatibleRollup( + publicClient: ReturnType, + registryAddress: EthAddress, + rollupVersion: number | 'canonical', + expectedGenesisRoot: Fr, + port: number | undefined, + userLog: LogFn, +): Promise { + const registry = new RegistryContract(publicClient, registryAddress); + const rollupAddress = await registry.getRollupAddress(rollupVersion); + const rollup = new RollupContract(publicClient, rollupAddress.toString()); + + let l1GenesisRoot: Fr; + try { + l1GenesisRoot = await rollup.getGenesisArchiveTreeRoot(); + } catch (err: any) { + throw new Error( + `Could not retrieve genesis archive root from canonical rollup at ${rollupAddress}: ${err.message}`, + ); + } + + if (l1GenesisRoot.equals(expectedGenesisRoot)) { + return; + } + + userLog( + `Genesis root mismatch: expected ${expectedGenesisRoot}, got ${l1GenesisRoot} from rollup at ${rollupAddress}. ` + + `Entering standby mode. Will poll every ${ROLLUP_POLL_INTERVAL_MS / 1000}s for a compatible rollup...`, + ); + + const standbyServer = await startHttpRpcServer({ getApp: () => new Koa(), isHealthy: () => true }, { port }); + userLog(`Standby status server listening on port ${standbyServer.port}`); + + try { + while (true) { + await sleep(ROLLUP_POLL_INTERVAL_MS); + + const currentRollupAddress = await registry.getRollupAddress(rollupVersion); + const currentRollup = new RollupContract(publicClient, currentRollupAddress.toString()); + + try { + l1GenesisRoot = await currentRollup.getGenesisArchiveTreeRoot(); + } catch { + userLog(`Failed to fetch genesis root from rollup at ${currentRollupAddress}. Retrying...`); + continue; + } + + if (l1GenesisRoot.equals(expectedGenesisRoot)) { + userLog(`Compatible rollup found at ${currentRollupAddress}. Exiting standby mode.`); + return; + } + + userLog(`Still waiting. Rollup at ${currentRollupAddress} has genesis root ${l1GenesisRoot}.`); + } + } finally { + await new Promise((resolve, reject) => standbyServer.close(err => (err ? reject(err) : resolve()))); + } +} + export async function startNode( options: any, signalHandlers: (() => Promise)[], @@ -96,6 +168,20 @@ export async function startNode( if (!nodeConfig.l1Contracts.registryAddress || nodeConfig.l1Contracts.registryAddress.isZero()) { throw new Error('L1 registry address is required to start Aztec Node'); } + + // Wait for a compatible rollup before proceeding with full L1 config fetch. + // This prevents crashes when the canonical rollup hasn't been upgraded yet. + const publicClient = getPublicClient(nodeConfig); + const rollupVersion: number | 'canonical' = nodeConfig.rollupVersion ?? 'canonical'; + await waitForCompatibleRollup( + publicClient, + nodeConfig.l1Contracts.registryAddress, + rollupVersion, + genesisArchiveRoot, + options.port, + userLog, + ); + const { addresses, config } = await getL1Config( nodeConfig.l1Contracts.registryAddress, nodeConfig.l1RpcUrls, diff --git a/yarn-project/aztec/src/cli/cmds/utils/artifacts.ts b/yarn-project/aztec/src/cli/cmds/utils/artifacts.ts new file mode 100644 index 000000000000..104bbed25145 --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/utils/artifacts.ts @@ -0,0 +1,44 @@ +import { readFile, readdir } from 'fs/promises'; +import { join } from 'path'; + +export interface CompiledArtifact { + noir_version: string; + file_map: unknown; + functions: ContractFunction[]; + bytecode?: string; +} + +export interface ContractFunction { + name: string; + abi: unknown; + bytecode: string; + debug_symbols: unknown; + is_unconstrained?: boolean; +} + +export interface ArtifactFile { + name: string; + filePath: string; + content: CompiledArtifact; +} + +/** Reads all JSON artifact files from a target directory and returns their parsed contents. */ +export async function readArtifactFiles(targetDir: string): Promise { + let entries: string[]; + try { + entries = (await readdir(targetDir)).filter(f => f.endsWith('.json')); + } catch (err: any) { + if (err?.code === 'ENOENT') { + throw new Error(`Target directory '${targetDir}' does not exist. Compile first with 'aztec compile'.`); + } + throw err; + } + + const artifacts: ArtifactFile[] = []; + for (const file of entries) { + const filePath = join(targetDir, file); + const content = JSON.parse(await readFile(filePath, 'utf-8')) as CompiledArtifact; + artifacts.push({ name: file.replace('.json', ''), filePath, content }); + } + return artifacts; +} diff --git a/yarn-project/aztec/src/cli/cmds/utils/spawn.ts b/yarn-project/aztec/src/cli/cmds/utils/spawn.ts new file mode 100644 index 000000000000..53514e06d931 --- /dev/null +++ b/yarn-project/aztec/src/cli/cmds/utils/spawn.ts @@ -0,0 +1,16 @@ +import { spawn } from 'child_process'; + +/** Spawns a command with inherited stdio and rejects on non-zero exit. */ +export function run(cmd: string, args: string[]): Promise { + return new Promise((resolve, reject) => { + const child = spawn(cmd, args, { stdio: 'inherit' }); + child.on('error', reject); + child.on('close', code => { + if (code !== 0) { + reject(new Error(`${cmd} exited with code ${code}`)); + } else { + resolve(); + } + }); + }); +} diff --git a/yarn-project/aztec/src/local-network/local-network.ts b/yarn-project/aztec/src/local-network/local-network.ts index 9c700ce483b7..1b3882881359 100644 --- a/yarn-project/aztec/src/local-network/local-network.ts +++ b/yarn-project/aztec/src/local-network/local-network.ts @@ -18,6 +18,7 @@ import type { LogFn } from '@aztec/foundation/log'; import { DateProvider, TestDateProvider } from '@aztec/foundation/timer'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree'; import { protocolContractsHash } from '@aztec/protocol-contracts'; +import { SequencerState } from '@aztec/sequencer-client'; import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server'; import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees'; import { @@ -181,6 +182,21 @@ export async function createLocalNetwork(config: Partial = { const blobClient = createBlobClient(); const node = await createAztecNode(aztecNodeConfig, { telemetry, blobClient, dateProvider }, { prefilledPublicData }); + // Now that the node is up, let the watcher check for pending txs so it can skip unfilled slots faster when + // transactions are waiting in the mempool. Also let it check if the sequencer is actively building, to avoid + // warping time out from under an in-progress block. + watcher?.setGetPendingTxCount(() => node.getPendingTxCount()); + const sequencer = node.getSequencer()?.getSequencer(); + if (sequencer) { + const idleStates: Set = new Set([ + SequencerState.STOPPED, + SequencerState.STOPPING, + SequencerState.IDLE, + SequencerState.SYNCHRONIZING, + ]); + watcher?.setIsSequencerBuilding(() => !idleStates.has(sequencer.getState())); + } + let epochTestSettler: EpochTestSettler | undefined; if (!aztecNodeConfig.p2pEnabled) { epochTestSettler = new EpochTestSettler( diff --git a/yarn-project/aztec/src/mainnet_compatibility.test.ts b/yarn-project/aztec/src/mainnet_compatibility.test.ts index dca7d1fcc9d5..d05246bea08c 100644 --- a/yarn-project/aztec/src/mainnet_compatibility.test.ts +++ b/yarn-project/aztec/src/mainnet_compatibility.test.ts @@ -9,12 +9,12 @@ import { getGenesisValues } from '@aztec/world-state/testing'; */ describe('Mainnet compatibility', () => { it('has expected VK tree root', () => { - const expectedRoots = [Fr.fromHexString('0x0f485d750a6264d399c416e01909e4dd18fa0dbaad882fe2b87c7847aeaab564')]; + const expectedRoots = [Fr.fromHexString('0x2d0b15497929f5150c4c383993555456e60d27121f4ac2cb9ef880319f5f9a6f')]; expect(expectedRoots).toContainEqual(getVKTreeRoot()); }); it('has expected Protocol Contracts tree root', () => { expect(protocolContractsHash).toEqual( - Fr.fromHexString('0x2348b12e0edd63c38dbb849b6c788c4975ed3f1f3706fcb5e17431e805da672d'), + Fr.fromHexString('0x2672340d9a0107a7b81e6d10d25b854debe613f3272e8738e8df0ca2ff297141'), ); }); it('has expected Genesis tree roots', async () => { @@ -25,7 +25,7 @@ describe('Mainnet compatibility', () => { /* initial public data leaves */ [], ); expect(genesisArchiveRoot).toEqual( - Fr.fromHexString('0x1f8c805403d88ee809d3cb3e52eeba0a104f69968cdb844a9cbdf1e9e00b3a95'), + Fr.fromHexString('0x15684c8c3d2106918d3860f777e50555b7166adff47df13cc652e2e5a50bf5c7'), ); }); }); diff --git a/yarn-project/aztec/src/testing/anvil_test_watcher.ts b/yarn-project/aztec/src/testing/anvil_test_watcher.ts index bd04679a75bc..44ef6662a9c8 100644 --- a/yarn-project/aztec/src/testing/anvil_test_watcher.ts +++ b/yarn-project/aztec/src/testing/anvil_test_watcher.ts @@ -31,6 +31,15 @@ export class AnvilTestWatcher { private isMarkingAsProven = true; + // Optional callback to check if there are pending txs in the mempool. + private getPendingTxCount?: () => Promise; + + // Optional callback to check if the sequencer is actively building a block. + private isSequencerBuilding?: () => boolean; + + // Tracks when we first observed the current unfilled slot with pending txs (real wall time). + private unfilledSlotFirstSeen?: { slot: number; realTime: number }; + constructor( private cheatcodes: EthCheatCodes, rollupAddress: EthAddress, @@ -59,6 +68,16 @@ export class AnvilTestWatcher { this.isLocalNetwork = isLocalNetwork; } + /** Sets a callback to check for pending txs, used to skip unfilled slots faster when txs are waiting. */ + setGetPendingTxCount(fn: () => Promise) { + this.getPendingTxCount = fn; + } + + /** Sets a callback to check if the sequencer is actively building, to avoid warping while it works. */ + setIsSequencerBuilding(fn: () => boolean) { + this.isSequencerBuilding = fn; + } + async start() { if (this.filledRunningPromise) { throw new Error('Watcher already watching for filled slot'); @@ -131,15 +150,8 @@ export class AnvilTestWatcher { const nextSlotTimestamp = Number(await this.rollup.read.getTimestampForSlot([BigInt(nextSlot)])); if (BigInt(currentSlot) === checkpointLog.slotNumber) { - // We should jump to the next slot - try { - await this.cheatcodes.warp(nextSlotTimestamp, { - resetBlockInterval: true, - }); - } catch (e) { - this.logger.error(`Failed to warp to timestamp ${nextSlotTimestamp}: ${e}`); - } - + // The current slot has been filled, we should jump to the next slot. + await this.warpToTimestamp(nextSlotTimestamp); this.logger.info(`Slot ${currentSlot} was filled, jumped to next slot`); return; } @@ -149,18 +161,50 @@ export class AnvilTestWatcher { return; } - const currentTimestamp = this.dateProvider?.now() ?? Date.now(); - if (currentTimestamp > nextSlotTimestamp * 1000) { - try { - await this.cheatcodes.warp(nextSlotTimestamp, { resetBlockInterval: true }); - } catch (e) { - this.logger.error(`Failed to warp to timestamp ${nextSlotTimestamp}: ${e}`); + // If there are pending txs and the sequencer missed them, warp quickly (after a 2s real-time debounce) so the + // sequencer can retry in the next slot. Without this, we'd have to wait a full real-time slot duration (~36s) for + // the dateProvider to catch up to the next slot timestamp. We skip the warp if the sequencer is actively building + // to avoid invalidating its in-progress work. + if (this.getPendingTxCount) { + const pendingTxs = await this.getPendingTxCount(); + if (pendingTxs > 0) { + if (this.isSequencerBuilding?.()) { + this.unfilledSlotFirstSeen = undefined; + return; + } + + const realNow = Date.now(); + if (!this.unfilledSlotFirstSeen || this.unfilledSlotFirstSeen.slot !== currentSlot) { + this.unfilledSlotFirstSeen = { slot: currentSlot, realTime: realNow }; + return; + } + + if (realNow - this.unfilledSlotFirstSeen.realTime > 2000) { + await this.warpToTimestamp(nextSlotTimestamp); + this.unfilledSlotFirstSeen = undefined; + this.logger.info(`Slot ${currentSlot} was missed with pending txs, jumped to next slot`); + } + + return; } + } + // Fallback: warp when the dateProvider time has passed the next slot timestamp. + const currentTimestamp = this.dateProvider?.now() ?? Date.now(); + if (currentTimestamp > nextSlotTimestamp * 1000) { + await this.warpToTimestamp(nextSlotTimestamp); this.logger.info(`Slot ${currentSlot} was missed, jumped to next slot`); } } catch { this.logger.error('mineIfSlotFilled failed'); } } + + private async warpToTimestamp(timestamp: number) { + try { + await this.cheatcodes.warp(timestamp, { resetBlockInterval: true }); + } catch (e) { + this.logger.error(`Failed to warp to timestamp ${timestamp}: ${e}`); + } + } } diff --git a/yarn-project/aztec/src/testnet_compatibility.test.ts b/yarn-project/aztec/src/testnet_compatibility.test.ts index 4368637d98fd..5514289a570c 100644 --- a/yarn-project/aztec/src/testnet_compatibility.test.ts +++ b/yarn-project/aztec/src/testnet_compatibility.test.ts @@ -11,12 +11,12 @@ import { getGenesisValues } from '@aztec/world-state/testing'; */ describe('Testnet compatibility', () => { it('has expected VK tree root', () => { - const expectedRoots = [Fr.fromHexString('0x0c7576d33473911a15b9b490f1d9ba378355e17b956d974bf89d604b6b1b0b0f')]; + const expectedRoots = [Fr.fromHexString('0x2d0b15497929f5150c4c383993555456e60d27121f4ac2cb9ef880319f5f9a6f')]; expect(expectedRoots).toContainEqual(getVKTreeRoot()); }); it('has expected Protocol Contracts hash', () => { expect(protocolContractsHash).toEqual( - Fr.fromHexString('0x20b49b5e2004b516f057509123ae1a4a2120605005351776051867e3caab413e'), + Fr.fromHexString('0x2672340d9a0107a7b81e6d10d25b854debe613f3272e8738e8df0ca2ff297141'), ); }); it('has expected Genesis tree roots', async () => { @@ -26,7 +26,7 @@ describe('Testnet compatibility', () => { const { genesisArchiveRoot } = await getGenesisValues(initialFundedAccounts); expect(genesisArchiveRoot).toEqual( - Fr.fromHexString('0x204ce64a69ce23a572afdbb50a156a58b2ee1c37ea92a278f96147f3aec93dfc'), + Fr.fromHexString('0x2727683df35594b1f073a681532520056ca8a775398c8b5a94574c67ef1ce6de'), ); }); }); diff --git a/yarn-project/aztec/test/mixed-workspace/.gitignore b/yarn-project/aztec/test/mixed-workspace/.gitignore new file mode 100644 index 000000000000..8515795b7b4d --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/.gitignore @@ -0,0 +1,3 @@ +target/ +codegen-output/ +codegenCache.json diff --git a/yarn-project/aztec/test/mixed-workspace/Nargo.toml b/yarn-project/aztec/test/mixed-workspace/Nargo.toml new file mode 100644 index 000000000000..774733593fd3 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/Nargo.toml @@ -0,0 +1,2 @@ +[workspace] +members = ["simple_contract", "simple_circuit", "simple_circuit_2"] diff --git a/yarn-project/aztec/test/mixed-workspace/README.md b/yarn-project/aztec/test/mixed-workspace/README.md new file mode 100644 index 000000000000..83f385759655 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/README.md @@ -0,0 +1,26 @@ +# Mixed Workspace Test + +Regression test for `aztec compile` and `aztec codegen` in Nargo workspaces that +contain both Aztec contracts and plain Noir circuits. + +## Problem + +Both `aztec compile` and `aztec codegen` assumed every `.json` in `target/` is a +contract artifact. When a workspace also contains `type = "bin"` packages, the +resulting program artifacts lack `functions`/`name` fields, causing: + +- `bb aztec_process` to fail trying to transpile a program artifact +- The jq postprocessing step to fail on missing `.functions` +- `codegen` to crash calling `loadContractArtifact()` on a program artifact + +## What the test checks + +`yarn-project/aztec/src/cli/cmds/compile.test.ts` runs compile and codegen on +this workspace and verifies: + +1. Compilation succeeds without errors +2. Both artifacts exist in `target/` +3. The contract artifact was postprocessed (has `transpiled` field) +4. The program artifact was not modified (no `transpiled` field) +5. Codegen generates a TypeScript wrapper only for the contract +6. No TypeScript wrapper is generated for the program artifact diff --git a/yarn-project/aztec/test/mixed-workspace/simple_circuit/Nargo.toml b/yarn-project/aztec/test/mixed-workspace/simple_circuit/Nargo.toml new file mode 100644 index 000000000000..a74e4a284148 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/simple_circuit/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "simple_circuit" +authors = [""] +compiler_version = ">=0.25.0" +type = "bin" + +[dependencies] diff --git a/yarn-project/aztec/test/mixed-workspace/simple_circuit/src/main.nr b/yarn-project/aztec/test/mixed-workspace/simple_circuit/src/main.nr new file mode 100644 index 000000000000..e149eb109fca --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/simple_circuit/src/main.nr @@ -0,0 +1,3 @@ +fn main(x: Field) { + assert(x != 0); +} diff --git a/yarn-project/aztec/test/mixed-workspace/simple_circuit_2/Nargo.toml b/yarn-project/aztec/test/mixed-workspace/simple_circuit_2/Nargo.toml new file mode 100644 index 000000000000..94ba379302a1 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/simple_circuit_2/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "simple_circuit_2" +authors = [""] +compiler_version = ">=0.25.0" +type = "bin" + +[dependencies] diff --git a/yarn-project/aztec/test/mixed-workspace/simple_circuit_2/src/main.nr b/yarn-project/aztec/test/mixed-workspace/simple_circuit_2/src/main.nr new file mode 100644 index 000000000000..a51a0a7f9cf0 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/simple_circuit_2/src/main.nr @@ -0,0 +1,3 @@ +fn main(x: Field, y: Field) { + assert(x != y); +} diff --git a/yarn-project/aztec/test/mixed-workspace/simple_contract/Nargo.toml b/yarn-project/aztec/test/mixed-workspace/simple_contract/Nargo.toml new file mode 100644 index 000000000000..681c51353ea5 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/simple_contract/Nargo.toml @@ -0,0 +1,8 @@ +[package] +name = "simple_contract" +authors = [""] +compiler_version = ">=0.25.0" +type = "contract" + +[dependencies] +aztec = { path = "../../../../../noir-projects/aztec-nr/aztec" } diff --git a/yarn-project/aztec/test/mixed-workspace/simple_contract/src/main.nr b/yarn-project/aztec/test/mixed-workspace/simple_contract/src/main.nr new file mode 100644 index 000000000000..478d776dad92 --- /dev/null +++ b/yarn-project/aztec/test/mixed-workspace/simple_contract/src/main.nr @@ -0,0 +1,16 @@ +use aztec::macros::aztec; + +#[aztec] +pub contract SimpleContract { + use aztec::macros::functions::external; + + #[external("private")] + fn private_function() -> Field { + 0 + } + + #[external("private")] + fn another_private_function(x: Field) -> Field { + x + } +} diff --git a/yarn-project/bb-prover/src/bb/execute.ts b/yarn-project/bb-prover/src/bb/execute.ts index 06af043b4737..a2d5d2e1df73 100644 --- a/yarn-project/bb-prover/src/bb/execute.ts +++ b/yarn-project/bb-prover/src/bb/execute.ts @@ -52,6 +52,8 @@ type BBExecResult = { signal: string | undefined; }; +export const DEFAULT_BB_VERIFY_CONCURRENCY = 4; + /** * Invokes the Barretenberg binary with the provided command and args * @param pathToBB - The path to the BB binary @@ -398,7 +400,14 @@ export async function verifyProof( '--disable_zk', ...getArgs(ultraHonkFlavor), ]; - return await verifyProofInternal(pathToBB, `verify`, args, logger); + + let concurrency = DEFAULT_BB_VERIFY_CONCURRENCY; + + if (process.env.VERIFY_HARDWARE_CONCURRENCY) { + concurrency = parseInt(process.env.VERIFY_HARDWARE_CONCURRENCY, 10); + } + + return await verifyProofInternal(pathToBB, `verify`, args, logger, concurrency); } export async function verifyAvmProof( diff --git a/yarn-project/bb-prover/src/prover/client/bb_private_kernel_prover.ts b/yarn-project/bb-prover/src/prover/client/bb_private_kernel_prover.ts index 049815bd6567..70f691a6508c 100644 --- a/yarn-project/bb-prover/src/prover/client/bb_private_kernel_prover.ts +++ b/yarn-project/bb-prover/src/prover/client/bb_private_kernel_prover.ts @@ -278,7 +278,7 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver { this.log.info(`Generating ClientIVC proof...`); const barretenberg = await Barretenberg.initSingleton({ ...this.options, - logger: this.options.logger?.[(process.env.LOG_LEVEL as LogLevel) || 'verbose'], + logger: this.options.logger?.verbose, }); const backend = new AztecClientBackend( executionSteps.map(step => ungzip(step.bytecode)), diff --git a/yarn-project/bootstrap.sh b/yarn-project/bootstrap.sh index acacda5639f8..a7992576d9e5 100755 --- a/yarn-project/bootstrap.sh +++ b/yarn-project/bootstrap.sh @@ -221,6 +221,9 @@ function test_cmds { # Uses mocha for browser tests, so we have to treat it differently. echo "$hash:ISOLATE=1 cd yarn-project/kv-store && yarn test" + # Aztec CLI tests + aztec/bootstrap.sh test_cmds + if [[ "${TARGET_BRANCH:-}" =~ ^v[0-9]+$ ]]; then echo "$hash yarn-project/scripts/run_test.sh aztec/src/testnet_compatibility.test.ts" echo "$hash yarn-project/scripts/run_test.sh aztec/src/mainnet_compatibility.test.ts" diff --git a/yarn-project/builder/src/contract-interface-gen/codegen.ts b/yarn-project/builder/src/contract-interface-gen/codegen.ts index 5321c5070d22..1137b81a6a6c 100644 --- a/yarn-project/builder/src/contract-interface-gen/codegen.ts +++ b/yarn-project/builder/src/contract-interface-gen/codegen.ts @@ -50,6 +50,12 @@ async function generateFromNoirAbi(outputPath: string, noirAbiPath: string, opts const file = await readFile(noirAbiPath, 'utf8'); const contract = JSON.parse(file); + + if (!Array.isArray(contract.functions)) { + console.log(`${fileName} is not a contract artifact. Skipping.`); + return; + } + const aztecAbi = loadContractArtifact(contract); await mkdir(outputPath, { recursive: true }); diff --git a/yarn-project/constants/src/constants.gen.ts b/yarn-project/constants/src/constants.gen.ts index ddc691f25053..6d63cc576b67 100644 --- a/yarn-project/constants/src/constants.gen.ts +++ b/yarn-project/constants/src/constants.gen.ts @@ -385,20 +385,22 @@ export const AVM_NUM_PUBLIC_INPUT_COLUMNS = 4; export const AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH = 18740; export const AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED = 16400; export const AVM_V2_VERIFICATION_KEY_LENGTH_IN_FIELDS_PADDED = 1000; -export const AVM_MAX_PROCESSABLE_L2_GAS = 6000000; export const DA_BYTES_PER_FIELD = 32; export const DA_GAS_PER_BYTE = 1; export const DA_GAS_PER_FIELD = 32; -export const FIXED_DA_GAS = 96; -export const FIXED_L2_GAS = 512; +export const TX_DA_GAS_OVERHEAD = 96; +export const PUBLIC_TX_L2_GAS_OVERHEAD = 540000; +export const PRIVATE_TX_L2_GAS_OVERHEAD = 440000; export const FIXED_AVM_STARTUP_L2_GAS = 20000; +export const AVM_MAX_PROCESSABLE_L2_GAS = 6000000; +export const MAX_PROCESSABLE_L2_GAS = 6540000; export const MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT = 786432; -export const GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT = 6000000; -export const GAS_ESTIMATION_L2_GAS_LIMIT = 12000000; +export const GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT = 6540000; +export const GAS_ESTIMATION_L2_GAS_LIMIT = 13080000; export const GAS_ESTIMATION_TEARDOWN_DA_GAS_LIMIT = 786432; export const GAS_ESTIMATION_DA_GAS_LIMIT = 1572864; export const DEFAULT_TEARDOWN_L2_GAS_LIMIT = 1000000; -export const DEFAULT_L2_GAS_LIMIT = 6000000; +export const DEFAULT_L2_GAS_LIMIT = 6540000; export const DEFAULT_TEARDOWN_DA_GAS_LIMIT = 393216; export const DEFAULT_DA_GAS_LIMIT = 786432; export const L2_GAS_DISTRIBUTED_STORAGE_PREMIUM = 1024; @@ -408,11 +410,11 @@ export const AVM_MAX_REGISTERS = 6; export const AVM_ADDRESSING_BASE_RESOLUTION_L2_GAS = 3; export const AVM_ADDRESSING_INDIRECT_L2_GAS = 3; export const AVM_ADDRESSING_RELATIVE_L2_GAS = 3; -export const L2_GAS_PER_NOTE_HASH = 0; -export const L2_GAS_PER_NULLIFIER = 0; -export const L2_GAS_PER_L2_TO_L1_MSG = 200; -export const L2_GAS_PER_PRIVATE_LOG = 0; -export const L2_GAS_PER_CONTRACT_CLASS_LOG = 0; +export const L2_GAS_PER_NOTE_HASH = 9200; +export const L2_GAS_PER_NULLIFIER = 16000; +export const L2_GAS_PER_L2_TO_L1_MSG = 5200; +export const L2_GAS_PER_PRIVATE_LOG = 2500; +export const L2_GAS_PER_CONTRACT_CLASS_LOG = 73000; export const AVM_ADD_BASE_L2_GAS = 12; export const AVM_SUB_BASE_L2_GAS = 12; export const AVM_MUL_BASE_L2_GAS = 27; @@ -448,7 +450,7 @@ export const AVM_EMITNULLIFIER_BASE_L2_GAS = 30800; export const AVM_L1TOL2MSGEXISTS_BASE_L2_GAS = 540; export const AVM_GETCONTRACTINSTANCE_BASE_L2_GAS = 6108; export const AVM_EMITPUBLICLOG_BASE_L2_GAS = 15; -export const AVM_SENDL2TOL1MSG_BASE_L2_GAS = 478; +export const AVM_SENDL2TOL1MSG_BASE_L2_GAS = 5239; export const AVM_CALL_BASE_L2_GAS = 9936; export const AVM_STATICCALL_BASE_L2_GAS = 9936; export const AVM_RETURN_BASE_L2_GAS = 9; diff --git a/yarn-project/constants/src/scripts/constants.in.ts b/yarn-project/constants/src/scripts/constants.in.ts index c43076c728a8..f1893cd88c32 100644 --- a/yarn-project/constants/src/scripts/constants.in.ts +++ b/yarn-project/constants/src/scripts/constants.in.ts @@ -28,6 +28,7 @@ const CPP_CONSTANTS = [ 'CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS', 'MULTI_CALL_ENTRYPOINT_ADDRESS', 'FEE_JUICE_ADDRESS', + 'TX_DA_GAS_OVERHEAD', 'PUBLIC_CHECKS_ADDRESS', 'FEE_JUICE_BALANCES_SLOT', 'UPDATED_CLASS_IDS_SLOT', @@ -44,6 +45,7 @@ const CPP_CONSTANTS = [ 'MAX_NOTE_HASHES_PER_TX', 'MAX_NULLIFIERS_PER_TX', 'MAX_L2_TO_L1_MSGS_PER_TX', + 'MAX_PROCESSABLE_L2_GAS', 'MAX_PUBLIC_LOGS_PER_TX', 'MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX', 'MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS', @@ -111,6 +113,7 @@ const CPP_CONSTANTS = [ 'FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH', 'PUBLIC_LOGS_LENGTH', 'PUBLIC_LOG_HEADER_LENGTH', + 'PUBLIC_TX_L2_GAS_OVERHEAD', 'MAX_PROTOCOL_CONTRACTS', 'DEFAULT_MAX_DEBUG_LOG_MEMORY_READS', ]; @@ -621,7 +624,11 @@ function evaluateExpressions(expressions: [string, string][]): { [key: string]: // We split the expression into terms... .split(/\s+/) // ...and then we convert each term to a BigInt if it is a number. - .map(term => (isNaN(+term) ? term : `BigInt('${term}')`)) + .map(term => { + // Remove underscores from numeric literals (e.g., 6_000_000 -> 6000000) + const termWithoutUnderscores = term.replace(/_/g, ''); + return isNaN(+termWithoutUnderscores) ? term : `BigInt('${termWithoutUnderscores}')`; + }) // .. also, we convert the known bigints to BigInts. .map(term => (knownBigInts.includes(term) ? `BigInt(${term})` : term)) // We join the terms back together. diff --git a/yarn-project/end-to-end/src/composed/ha/e2e_ha_full.test.ts b/yarn-project/end-to-end/src/composed/ha/e2e_ha_full.test.ts index 1ce73ebffd1c..78db818d3e80 100644 --- a/yarn-project/end-to-end/src/composed/ha/e2e_ha_full.test.ts +++ b/yarn-project/end-to-end/src/composed/ha/e2e_ha_full.test.ts @@ -341,9 +341,13 @@ describe('HA Full Setup', () => { logger.info(`Found ${checkpointProposalDuties.length} checkpoint proposal duty`); // Check attestation duties + // All validators attest (tracked in DB), but the checkpoint posted to L1 is trimmed to quorum. const attestationDuties = allDuties.filter(d => d.dutyType === 'ATTESTATION'); - expect(attestationDuties.length).toBe(attestations.length); - logger.info(`Found ${attestationDuties.length} attestation duties`); + expect(attestationDuties.length).toBe(VALIDATOR_COUNT); + expect(attestations.length).toBe(quorum); + logger.info( + `Found ${attestationDuties.length} attestation duties, ${attestations.length} in checkpoint (quorum: ${quorum})`, + ); // Verify no duplicate attestations per validator (HA protection ensures 1 per validator address) const dutiesByValidator = verifyNoDuplicateAttestations(attestationDuties, logger); @@ -361,8 +365,8 @@ describe('HA Full Setup', () => { const p2pAttestations = await p2p.getCheckpointAttestationsForSlot(slot); const p2pAttestationsWithSignatures = p2pAttestations.filter(a => !a.signature.isEmpty()); - // Extract validator addresses from P2P attestations using getSender() - expect(p2pAttestationsWithSignatures.length).toBe(attestations.length); + // P2P pool has attestations from all committee members; checkpoint on L1 is trimmed to quorum + expect(p2pAttestationsWithSignatures.length).toBe(COMMITTEE_SIZE); const p2pValidatorAddresses = new Map(); for (const attestation of p2pAttestationsWithSignatures) { const sender = attestation.getSender(); @@ -662,13 +666,14 @@ describe('HA Full Setup', () => { (info: AttestationInfo) => info.status === 'recovered-from-signature' && info.address !== undefined, ); - // Verify checkpoint has at least quorum attestations + // Verify checkpoint has exactly quorum attestations (trimmed to minimum required) const checkpointValidatorAddresses = new Set(validAttestations.map(info => info.address!.toString())); - expect(checkpointValidatorAddresses.size).toBeGreaterThanOrEqual(quorum); + expect(checkpointValidatorAddresses.size).toBe(quorum); - // Verify checkpoint attestations match database records (each validator in DB should appear in checkpoint) - for (const validatorAddress of dutiesByValidator.keys()) { - expect(checkpointValidatorAddresses.has(validatorAddress)).toBe(true); + // Verify every validator in the checkpoint has a corresponding DB duty record + // (checkpoint is trimmed to quorum, so it's a subset of DB records) + for (const validatorAddress of checkpointValidatorAddresses) { + expect(dutiesByValidator.has(validatorAddress)).toBe(true); } } }); diff --git a/yarn-project/end-to-end/src/e2e_abi_types.test.ts b/yarn-project/end-to-end/src/e2e_abi_types.test.ts new file mode 100644 index 000000000000..d970d9c105b2 --- /dev/null +++ b/yarn-project/end-to-end/src/e2e_abi_types.test.ts @@ -0,0 +1,111 @@ +import { AztecAddress } from '@aztec/aztec.js/addresses'; +import type { Wallet } from '@aztec/aztec.js/wallet'; +import { MAX_FIELD_VALUE } from '@aztec/constants'; +import { AbiTypesContract } from '@aztec/noir-test-contracts.js/AbiTypes'; + +import { jest } from '@jest/globals'; + +import { setup } from './fixtures/utils.js'; + +const TIMEOUT = 120_000; + +const U64_MAX = 2n ** 64n - 1n; +const I64_MAX = 2n ** 63n - 1n; +const I64_MIN = -(2n ** 63n); + +// Tests that different types are supported to be passed to contract functions and received as return values. This +// mirrors the Noir tests for the AbiTypes contract to make sure that these values can also be passed from TS. +describe('AbiTypes', () => { + let abiTypesContract: AbiTypesContract; + jest.setTimeout(TIMEOUT); + + let wallet: Wallet; + let defaultAccountAddress: AztecAddress; + let teardown: () => Promise; + + beforeAll(async () => { + ({ + teardown, + wallet, + accounts: [defaultAccountAddress], + } = await setup(1)); + abiTypesContract = await AbiTypesContract.deploy(wallet).send({ from: defaultAccountAddress }); + }); + + afterAll(() => teardown()); + + it('passes public parameters', async () => { + const minResult = await abiTypesContract.methods + .return_public_parameters(false, 0n, 0n, I64_MIN, { w: 0n, x: false, y: 0n, z: I64_MIN }) + .simulate({ from: defaultAccountAddress }); + + expect(minResult).toEqual([false, 0n, 0n, I64_MIN, { w: 0n, x: false, y: 0n, z: I64_MIN }]); + + const maxResult = await abiTypesContract.methods + .return_public_parameters(true, MAX_FIELD_VALUE, U64_MAX, I64_MAX, { + w: MAX_FIELD_VALUE, + x: true, + y: U64_MAX, + z: I64_MAX, + }) + .simulate({ from: defaultAccountAddress }); + + expect(maxResult).toEqual([ + true, + MAX_FIELD_VALUE, + U64_MAX, + I64_MAX, + { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ]); + }); + + it('passes private parameters', async () => { + const minResult = await abiTypesContract.methods + .return_private_parameters(false, 0n, 0n, I64_MIN, { w: 0n, x: false, y: 0n, z: I64_MIN }) + .simulate({ from: defaultAccountAddress }); + + expect(minResult).toEqual([false, 0n, 0n, I64_MIN, { w: 0n, x: false, y: 0n, z: I64_MIN }]); + + const maxResult = await abiTypesContract.methods + .return_private_parameters(true, MAX_FIELD_VALUE, U64_MAX, I64_MAX, { + w: MAX_FIELD_VALUE, + x: true, + y: U64_MAX, + z: I64_MAX, + }) + .simulate({ from: defaultAccountAddress }); + + expect(maxResult).toEqual([ + true, + MAX_FIELD_VALUE, + U64_MAX, + I64_MAX, + { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ]); + }); + + it('passes utility parameters', async () => { + const minResult = await abiTypesContract.methods + .return_utility_parameters(false, 0n, 0n, I64_MIN, { w: 0n, x: false, y: 0n, z: I64_MIN }) + .simulate({ from: defaultAccountAddress }); + + expect(minResult).toEqual([false, 0n, 0n, I64_MIN, { w: 0n, x: false, y: 0n, z: I64_MIN }]); + + const maxResult = await abiTypesContract.methods + .return_utility_parameters(true, MAX_FIELD_VALUE, U64_MAX, I64_MAX, { + w: MAX_FIELD_VALUE, + x: true, + y: U64_MAX, + z: I64_MAX, + }) + .simulate({ from: defaultAccountAddress }); + + expect(maxResult).toEqual([ + true, + MAX_FIELD_VALUE, + U64_MAX, + I64_MAX, + { w: MAX_FIELD_VALUE, x: true, y: U64_MAX, z: I64_MAX }, + ]); + }); +}); diff --git a/yarn-project/end-to-end/src/e2e_bot.test.ts b/yarn-project/end-to-end/src/e2e_bot.test.ts index 233293f72314..9ed66d5b27f6 100644 --- a/yarn-project/end-to-end/src/e2e_bot.test.ts +++ b/yarn-project/end-to-end/src/e2e_bot.test.ts @@ -13,7 +13,7 @@ import { SupportedTokenContracts, getBotDefaultConfig, } from '@aztec/bot'; -import { AVM_MAX_PROCESSABLE_L2_GAS, MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT } from '@aztec/constants'; +import { MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; import { SecretValue } from '@aztec/foundation/config'; import { bufferToHex } from '@aztec/foundation/string'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; @@ -73,7 +73,7 @@ describe('e2e_bot', () => { }); it('sends token transfers with hardcoded gas and no simulation', async () => { - bot.updateConfig({ daGasLimit: MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, l2GasLimit: AVM_MAX_PROCESSABLE_L2_GAS }); + bot.updateConfig({ daGasLimit: MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, l2GasLimit: MAX_PROCESSABLE_L2_GAS }); const { recipient: recipientBefore } = await bot.getBalances(); await bot.run(); diff --git a/yarn-project/end-to-end/src/e2e_contract_updates.test.ts b/yarn-project/end-to-end/src/e2e_contract_updates.test.ts index 8c8fd078c7de..10bf16f3e987 100644 --- a/yarn-project/end-to-end/src/e2e_contract_updates.test.ts +++ b/yarn-project/end-to-end/src/e2e_contract_updates.test.ts @@ -157,14 +157,16 @@ describe('e2e_contract_updates', () => { ); // Increases the delay so it should happen immediately - await contract.methods.set_update_delay(BigInt(MINIMUM_UPDATE_DELAY) + 1n).send({ from: defaultAccountAddress }); + await contract.methods + .set_update_delay(BigInt(DEFAULT_TEST_UPDATE_DELAY) + 1n) + .send({ from: defaultAccountAddress }); expect(await contract.methods.get_update_delay().simulate({ from: defaultAccountAddress })).toEqual( - BigInt(MINIMUM_UPDATE_DELAY) + 1n, + BigInt(DEFAULT_TEST_UPDATE_DELAY) + 1n, ); await contract.methods.update_to(updatedContractClassId).send({ from: defaultAccountAddress }); - await cheatCodes.warpL2TimeAtLeastBy(sequencer, aztecNode, BigInt(MINIMUM_UPDATE_DELAY) + 1n); + await cheatCodes.warpL2TimeAtLeastBy(sequencer, aztecNode, BigInt(DEFAULT_TEST_UPDATE_DELAY) + 1n); // Should be updated now await wallet.registerContract(instance, UpdatedContract.artifact); diff --git a/yarn-project/end-to-end/src/e2e_epochs/epochs_long_proving_time.test.ts b/yarn-project/end-to-end/src/e2e_epochs/epochs_long_proving_time.test.ts index ddf522d2c102..63d442847e40 100644 --- a/yarn-project/end-to-end/src/e2e_epochs/epochs_long_proving_time.test.ts +++ b/yarn-project/end-to-end/src/e2e_epochs/epochs_long_proving_time.test.ts @@ -24,7 +24,12 @@ describe('e2e_epochs/epochs_long_proving_time', () => { const { aztecSlotDuration } = EpochsTestContext.getSlotDurations({ aztecEpochDuration }); const epochDurationInSeconds = aztecSlotDuration * aztecEpochDuration; const proverTestDelayMs = (epochDurationInSeconds * 1000 * 3) / 4; - test = await EpochsTestContext.setup({ aztecEpochDuration, aztecProofSubmissionEpochs: 8, proverTestDelayMs }); + test = await EpochsTestContext.setup({ + aztecEpochDuration, + aztecProofSubmissionEpochs: 1000, // Effectively don't re-org + proverTestDelayMs, + proverNodeMaxPendingJobs: 1, // We test for only a single job at once + }); ({ logger, monitor, L1_BLOCK_TIME_IN_S } = test); logger.warn(`Initialized with prover delay set to ${proverTestDelayMs}ms (epoch is ${epochDurationInSeconds}s)`); }); @@ -34,7 +39,7 @@ describe('e2e_epochs/epochs_long_proving_time', () => { await test.teardown(); }); - it.skip('generates proof over multiple epochs', async () => { + it('generates proof over multiple epochs', async () => { const targetProvenEpochs = process.env.TARGET_PROVEN_EPOCHS ? parseInt(process.env.TARGET_PROVEN_EPOCHS) : 1; const targetProvenBlockNumber = targetProvenEpochs * test.epochDuration; logger.info(`Waiting for ${targetProvenEpochs} epochs to be proven at ${targetProvenBlockNumber} L2 blocks`); diff --git a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts index 22c893fad26b..d810c896ffc1 100644 --- a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts @@ -275,7 +275,7 @@ export class FeesTest { // @todo @lherskind As we deal with #13601 // Right now the value is from `FeeLib.sol` - const L1_GAS_PER_EPOCH_VERIFIED = 1000000n; + const L1_GAS_PER_EPOCH_VERIFIED = 3600000n; // We round up const mulDiv = (a: bigint, b: bigint, c: bigint) => (a * b) / c + ((a * b) % c > 0n ? 1n : 0n); diff --git a/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts b/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts index ed470053f9b0..bdb752da9f00 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts @@ -25,6 +25,7 @@ import type { BootstrapNode } from '@aztec/p2p/bootstrap'; import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers'; import { tryStop } from '@aztec/stdlib/interfaces/server'; import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts'; +import { TopicType } from '@aztec/stdlib/p2p'; import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees'; import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport'; import { getGenesisValues } from '@aztec/world-state/testing'; @@ -431,6 +432,27 @@ export class P2PNetworkTest { ); this.logger.warn('All nodes connected to P2P mesh'); + + // Wait for GossipSub mesh to form for the tx topic. + // We only require at least 1 mesh peer per node because GossipSub + // stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers. + this.logger.warn('Waiting for GossipSub mesh to form for tx topic...'); + await Promise.all( + nodes.map(async (node, index) => { + const p2p = node.getP2P(); + await retryUntil( + async () => { + const meshPeers = await p2p.getGossipMeshPeerCount(TopicType.tx); + this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for tx topic`); + return meshPeers >= 1 ? true : undefined; + }, + `Node ${index} to have gossip mesh peers for tx topic`, + timeoutSeconds, + checkIntervalSeconds, + ); + }), + ); + this.logger.warn('All nodes have gossip mesh peers for tx topic'); } async teardown() { diff --git a/yarn-project/end-to-end/src/e2e_state_vars.test.ts b/yarn-project/end-to-end/src/e2e_state_vars.test.ts index 104c9f18a72e..c5b8d6f0635b 100644 --- a/yarn-project/end-to-end/src/e2e_state_vars.test.ts +++ b/yarn-project/end-to-end/src/e2e_state_vars.test.ts @@ -314,7 +314,7 @@ describe('e2e_state_vars', () => { from: defaultAccountAddress, }); - if (aztecSlotDuration !== 36) { + if (aztecSlotDuration !== 72) { throw new Error( 'Aztec slot duration changed and this will break this test. Update CHANGE_AUTHORIZED_DELAY constant in the Auth contract to be 5 slots again.', ); diff --git a/yarn-project/end-to-end/src/fixtures/setup.ts b/yarn-project/end-to-end/src/fixtures/setup.ts index 6def0cbc67f6..abfd4da901e0 100644 --- a/yarn-project/end-to-end/src/fixtures/setup.ts +++ b/yarn-project/end-to-end/src/fixtures/setup.ts @@ -49,7 +49,6 @@ import type { SequencerClient } from '@aztec/sequencer-client'; import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract'; import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client'; import { tryStop } from '@aztec/stdlib/interfaces/server'; -import type { P2PClientType } from '@aztec/stdlib/p2p'; import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees'; import { type TelemetryClient, @@ -456,7 +455,7 @@ export async function setup( } let mockGossipSubNetwork: MockGossipSubNetwork | undefined; - let p2pClientDeps: P2PClientDeps | undefined = undefined; + let p2pClientDeps: P2PClientDeps | undefined = undefined; if (opts.mockGossipSubNetwork) { mockGossipSubNetwork = new MockGossipSubNetwork(); @@ -503,7 +502,7 @@ export async function setup( const proverNodePrivateKeyHex: Hex = `0x${proverNodePrivateKey!.toString('hex')}`; const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex')); - const p2pClientDeps: Partial> = { + const p2pClientDeps: Partial = { p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork!), rpcTxProviders: [aztecNodeService], }; @@ -719,7 +718,7 @@ export function createAndSyncProverNode( deps: { telemetry?: TelemetryClient; dateProvider: DateProvider; - p2pClientDeps?: P2PClientDeps; + p2pClientDeps?: P2PClientDeps; }, options: { prefilledPublicData: PublicDataTreeLeaf[]; dontStart?: boolean }, ): Promise<{ proverNode: AztecNodeService }> { diff --git a/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts b/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts index 6092f1af2605..bdd7ea3e7fd0 100644 --- a/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts +++ b/yarn-project/end-to-end/src/spartan/slash_inactivity.test.ts @@ -38,7 +38,7 @@ describe('slash inactivity test', () => { let client: ViemPublicClient; let rollup: RollupContract; - let slashSettings: TallySlasherSettings; + let slashSettings: Omit; let constants: Omit; let monitor: ChainMonitor; let offlineValidator: EthAddress; diff --git a/yarn-project/end-to-end/src/test-wallet/wallet_worker_script.ts b/yarn-project/end-to-end/src/test-wallet/wallet_worker_script.ts index 820c1c402e95..a532bbabdbd1 100644 --- a/yarn-project/end-to-end/src/test-wallet/wallet_worker_script.ts +++ b/yarn-project/end-to-end/src/test-wallet/wallet_worker_script.ts @@ -1,43 +1,60 @@ import { createAztecNodeClient } from '@aztec/aztec.js/node'; +import type { SendOptions } from '@aztec/aztec.js/wallet'; import { jsonStringify } from '@aztec/foundation/json-rpc'; -import type { ApiSchema } from '@aztec/foundation/schemas'; +import { createLogger } from '@aztec/foundation/log'; +import type { ApiSchema, Fr } from '@aztec/foundation/schemas'; import { parseWithOptionals, schemaHasMethod } from '@aztec/foundation/schemas'; import { NodeListener, TransportServer } from '@aztec/foundation/transport'; +import { ExecutionPayload, Tx } from '@aztec/stdlib/tx'; import { workerData } from 'worker_threads'; import { TestWallet } from './test_wallet.js'; import { WorkerWalletSchema } from './worker_wallet_schema.js'; -const { nodeUrl, pxeConfig } = workerData as { nodeUrl: string; pxeConfig?: Record }; +const logger = createLogger('e2e:test-wallet:worker'); -const node = createAztecNodeClient(nodeUrl); -const wallet = await TestWallet.create(node, pxeConfig); +try { + const { nodeUrl, pxeConfig } = workerData as { nodeUrl: string; pxeConfig?: Record }; -/** Handlers for methods that need custom implementation (not direct wallet passthrough). */ -const handlers: Record Promise> = { - proveTx: async (exec, opts) => { - const provenTx = await wallet.proveTx(exec, opts); - // ProvenTx has non-serializable fields (node proxy, etc.) — extract only Tx-compatible fields - const { data, chonkProof, contractClassLogFields, publicFunctionCalldata } = provenTx; - return { data, chonkProof, contractClassLogFields, publicFunctionCalldata }; - }, - registerAccount: async (secret, salt) => { - const manager = await wallet.createSchnorrAccount(secret, salt); - return manager.address; - }, -}; + logger.info('Initializing worker wallet', { nodeUrl }); + const node = createAztecNodeClient(nodeUrl); + const wallet = await TestWallet.create(node, pxeConfig); + logger.info('Worker wallet initialized'); -const schema = WorkerWalletSchema as ApiSchema; -const listener = new NodeListener(); -const server = new TransportServer<{ fn: string; args: string }>(listener, async msg => { - if (!schemaHasMethod(schema, msg.fn)) { - throw new Error(`Unknown method: ${msg.fn}`); - } - const jsonParams = JSON.parse(msg.args) as unknown[]; - const args = await parseWithOptionals(jsonParams, schema[msg.fn].parameters()); - const handler = handlers[msg.fn]; - const result = handler ? await handler(...args) : await (wallet as any)[msg.fn](...args); - return jsonStringify(result); -}); -server.start(); + const customMethods = { + proveTx: async (exec: ExecutionPayload, opts: Omit) => { + const provenTx = await wallet.proveTx(exec, opts); + return new Tx( + provenTx.getTxHash(), + provenTx.data, + provenTx.chonkProof, + provenTx.contractClassLogFields, + provenTx.publicFunctionCalldata, + ); + }, + registerAccount: async (secret: Fr, salt: Fr) => { + const manager = await wallet.createSchnorrAccount(secret, salt); + return manager.address; + }, + }; + + const schema = WorkerWalletSchema as ApiSchema; + const listener = new NodeListener(); + const server = new TransportServer<{ fn: string; args: string }>(listener, async msg => { + if (!schemaHasMethod(schema, msg.fn)) { + throw new Error(`Unknown method: ${msg.fn}`); + } + const jsonParams = JSON.parse(msg.args) as unknown[]; + const args: any[] = await parseWithOptionals(jsonParams, schema[msg.fn].parameters()); + // we have to erase the fn type in order to be able to spread ...args + const handler: ((...args: any[]) => Promise) | undefined = + msg.fn in customMethods ? customMethods[msg.fn as keyof typeof customMethods] : undefined; + const result = handler ? await handler(...args) : await (wallet as any)[msg.fn](...args); + return jsonStringify(result); + }); + server.start(); +} catch (err: unknown) { + logger.error('Worker wallet initialization failed', { error: err instanceof Error ? err.stack : String(err) }); + process.exit(1); +} diff --git a/yarn-project/end-to-end/src/test-wallet/worker_wallet.ts b/yarn-project/end-to-end/src/test-wallet/worker_wallet.ts index d5f8b34c591b..3857b3d2fe95 100644 --- a/yarn-project/end-to-end/src/test-wallet/worker_wallet.ts +++ b/yarn-project/end-to-end/src/test-wallet/worker_wallet.ts @@ -7,26 +7,29 @@ import type { BatchedMethod, ContractClassMetadata, ContractMetadata, + ExecuteUtilityOptions, PrivateEvent, PrivateEventFilter, ProfileOptions, SendOptions, SimulateOptions, - SimulateUtilityOptions, Wallet, WalletCapabilities, } from '@aztec/aztec.js/wallet'; import type { ChainInfo } from '@aztec/entrypoints/interfaces'; import type { Fr } from '@aztec/foundation/curves/bn254'; import { jsonStringify } from '@aztec/foundation/json-rpc'; +import { createLogger } from '@aztec/foundation/log'; +import { promiseWithResolvers } from '@aztec/foundation/promise'; import type { ApiSchema } from '@aztec/foundation/schemas'; +import { sleep } from '@aztec/foundation/sleep'; import { NodeConnector, TransportClient } from '@aztec/foundation/transport'; import type { PXEConfig } from '@aztec/pxe/config'; import type { ContractArtifact, EventMetadataDefinition, FunctionCall } from '@aztec/stdlib/abi'; import type { AuthWitness } from '@aztec/stdlib/auth-witness'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract'; -import type { ExecutionPayload, TxProfileResult, TxSimulationResult, UtilitySimulationResult } from '@aztec/stdlib/tx'; +import type { ExecutionPayload, TxProfileResult, TxSimulationResult, UtilityExecutionResult } from '@aztec/stdlib/tx'; import { Tx } from '@aztec/stdlib/tx'; import { Worker } from 'worker_threads'; @@ -35,6 +38,10 @@ import { WorkerWalletSchema } from './worker_wallet_schema.js'; type WorkerMsg = { fn: string; args: string }; +const log = createLogger('e2e:test-wallet:worker-wallet'); + +const WORKER_READY_TIMEOUT_MS = 120_000; + /** * Wallet implementation that offloads all work to a worker thread. * Implements the Wallet interface by proxying calls over a transport layer @@ -53,8 +60,18 @@ export class WorkerWallet implements Wallet { * @returns A WorkerWallet ready to use. */ static async create(nodeUrl: string, pxeConfig?: Partial): Promise { - const worker = new Worker(new URL('./wallet_worker_script.js', import.meta.url), { + // replace stc/ with dest/ so the wallet works in Jest tests + const workerUrl = new URL('./wallet_worker_script.js', import.meta.url); + workerUrl.pathname = workerUrl.pathname.replace('/src/', '/dest/'); + // remove JEST_WORKER_ID so the worker uses pino-pretty transport instead of Jest's raw output. + const { JEST_WORKER_ID: _, ...parentEnv } = process.env; + const worker = new Worker(workerUrl, { workerData: { nodeUrl, pxeConfig }, + env: { + ...parentEnv, + ...(process.stderr.isTTY || process.env.FORCE_COLOR ? { FORCE_COLOR: '1' } : {}), + LOG_LEVEL: process.env.WORKER_LOG_LEVEL ?? 'warn', + }, }); const connector = new NodeConnector(worker); @@ -62,8 +79,39 @@ export class WorkerWallet implements Wallet { await client.open(); const wallet = new WorkerWallet(worker, client); - // Warmup / readiness check — blocks until the worker has finished creating the TestWallet. - await wallet.getChainInfo(); + + const { promise: workerDied, reject: rejectWorkerDied } = promiseWithResolvers(); + // reject if the worker exits or errors before the warmup completes. + const onError = (err: Error): void => { + worker.off('exit', onExit!); + rejectWorkerDied(new Error(`Worker wallet thread error: ${err.message}`)); + }; + + const onExit = (code: number): void => { + worker.off('error', onError!); + rejectWorkerDied(new Error(`Worker wallet thread exited with code ${code} before becoming ready`)); + }; + + worker.once('error', onError); + worker.once('exit', onExit); + + const timeout = sleep(WORKER_READY_TIMEOUT_MS).then(() => { + throw new Error(`Worker wallet creation timed out after ${WORKER_READY_TIMEOUT_MS / 1000}s`); + }); + + try { + // wait for worker wallet to start + await Promise.race([wallet.getChainInfo(), workerDied, timeout]); + } catch (err) { + log.error('Worker wallet creation failed, cleaning up', { error: String(err) }); + client.close(); + await worker.terminate(); + throw err; + } finally { + worker.off('error', onError); + worker.off('exit', onExit); + } + return wallet; } @@ -121,8 +169,8 @@ export class WorkerWallet implements Wallet { return this.call('simulateTx', exec, opts); } - simulateUtility(call: FunctionCall, opts: SimulateUtilityOptions): Promise { - return this.call('simulateUtility', call, opts); + executeUtility(call: FunctionCall, opts: ExecuteUtilityOptions): Promise { + return this.call('executeUtility', call, opts); } profileTx(exec: ExecutionPayload, opts: ProfileOptions): Promise { diff --git a/yarn-project/ethereum/src/contracts/registry.ts b/yarn-project/ethereum/src/contracts/registry.ts index 89156ec13c7a..a4bf15f16bb8 100644 --- a/yarn-project/ethereum/src/contracts/registry.ts +++ b/yarn-project/ethereum/src/contracts/registry.ts @@ -3,7 +3,7 @@ import { createLogger } from '@aztec/foundation/log'; import { RegistryAbi } from '@aztec/l1-artifacts/RegistryAbi'; import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi'; -import { type GetContractReturnType, type Hex, getContract } from 'viem'; +import { type GetContractReturnType, type Hex, getAbiItem, getContract } from 'viem'; import type { L1ContractAddresses } from '../l1_contract_addresses.js'; import type { ViemClient } from '../types.js'; @@ -128,4 +128,34 @@ export class RegistryContract { public async getRewardDistributor(): Promise { return EthAddress.fromString(await this.registry.read.getRewardDistributor()); } + + /** Returns the L1 timestamp at which the given rollup was registered via addRollup(). */ + public async getCanonicalRollupRegistrationTimestamp( + rollupAddress: EthAddress, + fromBlock?: bigint, + ): Promise { + const event = getAbiItem({ abi: RegistryAbi, name: 'CanonicalRollupUpdated' }); + const start = fromBlock ?? 0n; + const latestBlock = await this.client.getBlockNumber(); + const chunkSize = 1_000n; + + for (let from = start; from <= latestBlock; from += chunkSize) { + const to = from + chunkSize - 1n > latestBlock ? latestBlock : from + chunkSize - 1n; + const logs = await this.client.getLogs({ + address: this.address.toString(), + fromBlock: from, + toBlock: to, + strict: true, + event, + args: { instance: rollupAddress.toString() }, + }); + + if (logs.length > 0) { + const block = await this.client.getBlock({ blockNumber: logs[0].blockNumber }); + return block.timestamp; + } + } + + return undefined; + } } diff --git a/yarn-project/ethereum/src/contracts/rollup.ts b/yarn-project/ethereum/src/contracts/rollup.ts index 30a1ba33ef84..40e10d287284 100644 --- a/yarn-project/ethereum/src/contracts/rollup.ts +++ b/yarn-project/ethereum/src/contracts/rollup.ts @@ -193,10 +193,10 @@ export type CheckpointProposedArgs = { checkpointNumber: CheckpointNumber; archive: Fr; versionedBlobHashes: Buffer[]; - /** Hash of attestations. Undefined for older events (backwards compatibility). */ - attestationsHash?: Buffer32; - /** Digest of the payload. Undefined for older events (backwards compatibility). */ - payloadDigest?: Buffer32; + /** Hash of attestations emitted in the CheckpointProposed event. */ + attestationsHash: Buffer32; + /** Digest of the payload emitted in the CheckpointProposed event. */ + payloadDigest: Buffer32; }; /** Log type for CheckpointProposed events. */ @@ -1060,8 +1060,22 @@ export class RollupContract { checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber!), archive: Fr.fromString(log.args.archive!), versionedBlobHashes: log.args.versionedBlobHashes!.map(h => Buffer.from(h.slice(2), 'hex')), - attestationsHash: log.args.attestationsHash ? Buffer32.fromString(log.args.attestationsHash) : undefined, - payloadDigest: log.args.payloadDigest ? Buffer32.fromString(log.args.payloadDigest) : undefined, + attestationsHash: (() => { + if (!log.args.attestationsHash) { + throw new Error( + `CheckpointProposed event missing attestationsHash for checkpoint ${log.args.checkpointNumber}`, + ); + } + return Buffer32.fromString(log.args.attestationsHash); + })(), + payloadDigest: (() => { + if (!log.args.payloadDigest) { + throw new Error( + `CheckpointProposed event missing payloadDigest for checkpoint ${log.args.checkpointNumber}`, + ); + } + return Buffer32.fromString(log.args.payloadDigest); + })(), }, })); } diff --git a/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.test.ts b/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.test.ts index 8670113a7ed7..593dd1831a3d 100644 --- a/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.test.ts +++ b/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.test.ts @@ -138,6 +138,54 @@ describe('L1TxUtils', () => { await gasUtils.waitMonitoringStopped(1); }); + it('recovery send reuses nonce after sendRawTransaction fails', async () => { + // Send a successful tx first to advance the chain nonce + await gasUtils.sendAndMonitorTransaction(request); + + const expectedNonce = await l1Client.getTransactionCount({ + blockTag: 'pending', + address: l1Client.account.address, + }); + + // Next send fails at sendRawTransaction (e.g. network error / 429) + const originalSendRawTransaction = l1Client.sendRawTransaction.bind(l1Client); + using _sendSpy = jest + .spyOn(l1Client, 'sendRawTransaction') + .mockImplementationOnce(() => Promise.reject(new Error('network error'))) + .mockImplementation(originalSendRawTransaction); + + await expect(gasUtils.sendTransaction(request)).rejects.toThrow('network error'); + + // Recovery send should reuse the same nonce (not skip ahead) + const { txHash, state: recoveryState } = await gasUtils.sendTransaction(request); + + expect(recoveryState.nonce).toBe(expectedNonce); + expect((await l1Client.getTransaction({ hash: txHash })).nonce).toBe(expectedNonce); + }, 30_000); + + it('bumps nonce when getTransactionCount returns a stale value after a successful send', async () => { + // Send a successful tx first to advance the chain nonce + await gasUtils.sendAndMonitorTransaction(request); + + const expectedNonce = await l1Client.getTransactionCount({ + blockTag: 'pending', + address: l1Client.account.address, + }); + + // Simulate a stale fallback RPC node that returns the pre-send nonce + const originalGetTransactionCount = l1Client.getTransactionCount.bind(l1Client); + using _spy = jest + .spyOn(l1Client, 'getTransactionCount') + .mockImplementationOnce(() => Promise.resolve(expectedNonce - 1)) // stale: one behind + .mockImplementation(originalGetTransactionCount); + + // Despite the stale count, the send should use lastSentNonce+1 = expectedNonce + const { txHash, state } = await gasUtils.sendTransaction(request); + + expect(state.nonce).toBe(expectedNonce); + expect((await l1Client.getTransaction({ hash: txHash })).nonce).toBe(expectedNonce); + }, 30_000); + // Regression for TMNT-312 it('speed-up of blob tx sets non-zero maxFeePerBlobGas', async () => { await cheatCodes.setAutomine(false); @@ -919,6 +967,8 @@ describe('L1TxUtils', () => { }); it('does not consume nonce when transaction times out before sending', async () => { + // first send a transaction to advance the nonce + await gasUtils.sendAndMonitorTransaction(request); // Get the expected nonce before any transaction const expectedNonce = await l1Client.getTransactionCount({ address: l1Client.account.address }); diff --git a/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.ts b/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.ts index 5c5c0f776db2..f6292311fc7e 100644 --- a/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.ts +++ b/yarn-project/ethereum/src/l1_tx_utils/l1_tx_utils.ts @@ -14,16 +14,13 @@ import { type Abi, type BlockOverrides, type Hex, - type NonceManager, type PrepareTransactionRequestRequest, type StateOverride, type TransactionReceipt, type TransactionSerializable, - createNonceManager, formatGwei, serializeTransaction, } from 'viem'; -import { jsonRpc } from 'viem/nonce'; import type { ViemClient } from '../types.js'; import { formatViemError } from '../utils.js'; @@ -47,8 +44,9 @@ import { const MAX_L1_TX_STATES = 32; export class L1TxUtils extends ReadOnlyL1TxUtils { - protected nonceManager: NonceManager; protected txs: L1TxState[] = []; + /** Last nonce successfully sent to the chain. Used as a lower bound when a fallback RPC node returns a stale count. */ + private lastSentNonce: number | undefined; /** Tx delayer for testing. Only set when enableDelayer config is true. */ public delayer?: Delayer; /** KZG instance for blob operations. */ @@ -68,7 +66,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { delayer?: Delayer, ) { super(client, logger, dateProvider, config, debugMaxGasLimit); - this.nonceManager = createNonceManager({ source: jsonRpc() }); this.kzg = kzg; // Set up delayer: use provided one or create new @@ -110,6 +107,11 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { this.metrics?.recordMinedTx(l1TxState, new Date(l1Timestamp)); } else if (newState === TxUtilsState.NOT_MINED) { this.metrics?.recordDroppedTx(l1TxState); + // The tx was dropped: the chain nonce reverted to l1TxState.nonce, so our lower bound is + // no longer valid. Clear it so the next send fetches the real nonce from the chain. + if (this.lastSentNonce === l1TxState.nonce) { + this.lastSentNonce = undefined; + } } // Update state in the store @@ -244,9 +246,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { throw new InterruptError(`Transaction sending is interrupted`); } - // Check timeout before consuming nonce to avoid leaking a nonce that was never sent. - // A leaked nonce creates a gap (e.g. nonce 107 consumed but unsent), so all subsequent - // transactions (108, 109, ...) can never be mined since the chain expects 107 first. const now = new Date(await this.getL1Timestamp()); if (gasConfig.txTimeoutAt && now > gasConfig.txTimeoutAt) { throw new TimeoutError( @@ -254,11 +253,11 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { ); } - const nonce = await this.nonceManager.consume({ - client: this.client, - address: account, - chainId: this.client.chain.id, - }); + const chainNonce = await this.client.getTransactionCount({ address: account, blockTag: 'pending' }); + // If a fallback RPC node returns a stale count (lower than what we last sent), use our + // local lower bound to avoid sending a duplicate of an already-pending transaction. + const nonce = + this.lastSentNonce !== undefined && chainNonce <= this.lastSentNonce ? this.lastSentNonce + 1 : chainNonce; const baseState = { request, gasLimit, blobInputs, gasPrice, nonce }; const txData = this.makeTxData(baseState, { isCancelTx: false }); @@ -266,6 +265,8 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { // Send the new tx const signedRequest = await this.prepareSignedTransaction(txData); const txHash = await this.client.sendRawTransaction({ serializedTransaction: signedRequest }); + // Update after tx is sent successfully + this.lastSentNonce = nonce; // Create the new state for monitoring const l1TxState: L1TxState = { @@ -449,7 +450,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { { nonce, account, pendingNonce, timePassed }, ); await this.updateState(state, TxUtilsState.NOT_MINED); - this.nonceManager.reset({ address: account, chainId: this.client.chain.id }); throw new DroppedTransactionError(nonce, account); } @@ -541,12 +541,7 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { // Oh no, the transaction has timed out! if (isCancelTx || !gasConfig.cancelTxOnTimeout) { - // If this was already a cancellation tx, or we are configured to not cancel txs, we just mark it as NOT_MINED - // and reset the nonce manager, so the next tx that comes along can reuse the nonce if/when this tx gets dropped. - // This is the nastiest scenario for us, since the new tx could acquire the next nonce, but then this tx is dropped, - // and the new tx would never get mined. Eventually, the new tx would also drop. await this.updateState(state, TxUtilsState.NOT_MINED); - this.nonceManager.reset({ address: account, chainId: this.client.chain.id }); } else { // Otherwise we fire the cancellation without awaiting to avoid blocking the caller, // and monitor it in the background so we can speed it up as needed. @@ -685,7 +680,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { { nonce, account }, ); await this.updateState(state, TxUtilsState.NOT_MINED); - this.nonceManager.reset({ address: account, chainId: this.client.chain.id }); return; } @@ -697,7 +691,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils { { nonce, account, currentNonce }, ); await this.updateState(state, TxUtilsState.NOT_MINED); - this.nonceManager.reset({ address: account, chainId: this.client.chain.id }); return; } diff --git a/yarn-project/foundation/src/config/config.test.ts b/yarn-project/foundation/src/config/config.test.ts index c21021c8d067..a4e0f7ad17b2 100644 --- a/yarn-project/foundation/src/config/config.test.ts +++ b/yarn-project/foundation/src/config/config.test.ts @@ -1,6 +1,6 @@ import { jest } from '@jest/globals'; -import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from './index.js'; +import { type ConfigMappingsType, bigintConfigHelper, getConfigFromMappings, numberConfigHelper } from './index.js'; describe('Config', () => { describe('getConfigFromMappings', () => { @@ -131,4 +131,37 @@ describe('Config', () => { }); }); }); + + describe('bigintConfigHelper', () => { + it('parses plain integer strings', () => { + const { parseEnv } = bigintConfigHelper(); + expect(parseEnv!('123')).toBe(123n); + expect(parseEnv!('0')).toBe(0n); + expect(parseEnv!('200000000000000000000000')).toBe(200000000000000000000000n); + }); + + it('parses scientific notation', () => { + const { parseEnv } = bigintConfigHelper(); + expect(parseEnv!('1e+23')).toBe(100000000000000000000000n); + expect(parseEnv!('2E+23')).toBe(200000000000000000000000n); + expect(parseEnv!('1e23')).toBe(100000000000000000000000n); + expect(parseEnv!('5e18')).toBe(5000000000000000000n); + }); + + it('parses scientific notation with decimal mantissa', () => { + const { parseEnv } = bigintConfigHelper(); + expect(parseEnv!('1.5e10')).toBe(15000000000n); + expect(parseEnv!('2.5e5')).toBe(250000n); + }); + + it('returns default value for empty string', () => { + const { parseEnv } = bigintConfigHelper(42n); + expect(parseEnv!('')).toBe(42n); + }); + + it('throws for non-integer scientific notation results', () => { + const { parseEnv } = bigintConfigHelper(); + expect(() => parseEnv!('1e-3')).toThrow(); + }); + }); }); diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index ef1f14bd63b3..9eb0ef616f8c 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -13,7 +13,7 @@ export type EnvVar = | 'ARCHIVER_BATCH_SIZE' | 'AZTEC_ADMIN_PORT' | 'AZTEC_ADMIN_API_KEY_HASH' - | 'AZTEC_NO_ADMIN_API_KEY' + | 'AZTEC_DISABLE_ADMIN_API_KEY' | 'AZTEC_RESET_ADMIN_API_KEY' | 'AZTEC_NODE_ADMIN_URL' | 'AZTEC_NODE_URL' @@ -216,6 +216,7 @@ export type EnvVar = | 'SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT' | 'SEQ_ATTESTATION_PROPAGATION_TIME' | 'SEQ_BLOCK_DURATION_MS' + | 'SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT' | 'SEQ_BUILD_CHECKPOINT_IF_EMPTY' | 'SEQ_SECONDS_BEFORE_INVALIDATING_BLOCK_AS_COMMITTEE_MEMBER' | 'SEQ_SECONDS_BEFORE_INVALIDATING_BLOCK_AS_NON_COMMITTEE_MEMBER' diff --git a/yarn-project/foundation/src/config/index.ts b/yarn-project/foundation/src/config/index.ts index 7ed7d3ef6ceb..8962dea3b1b0 100644 --- a/yarn-project/foundation/src/config/index.ts +++ b/yarn-project/foundation/src/config/index.ts @@ -177,6 +177,21 @@ export function bigintConfigHelper(defaultVal?: bigint): Pick { beforeAll(async () => { - await BarretenbergSync.initSingleton({ threads: 1 }); + await Barretenberg.initSingleton({ threads: 1 }); }); it('test vectors from cpp should match', async () => { diff --git a/yarn-project/foundation/src/crypto/poseidon/index.ts b/yarn-project/foundation/src/crypto/poseidon/index.ts index 4aba9a4a2029..601a1a000b65 100644 --- a/yarn-project/foundation/src/crypto/poseidon/index.ts +++ b/yarn-project/foundation/src/crypto/poseidon/index.ts @@ -1,4 +1,4 @@ -import { BarretenbergSync } from '@aztec/bb.js'; +import { Barretenberg } from '@aztec/bb.js'; import { Fr } from '../../curves/bn254/field.js'; import { type Fieldable, serializeToFields } from '../../serialize/serialize.js'; @@ -10,9 +10,9 @@ import { type Fieldable, serializeToFields } from '../../serialize/serialize.js' */ export async function poseidon2Hash(input: Fieldable[]): Promise { const inputFields = serializeToFields(input); - await BarretenbergSync.initSingleton(); - const api = BarretenbergSync.getSingleton(); - const response = api.poseidon2Hash({ + await Barretenberg.initSingleton(); + const api = Barretenberg.getSingleton(); + const response = await api.poseidon2Hash({ inputs: inputFields.map(i => i.toBuffer()), }); return Fr.fromBuffer(Buffer.from(response.hash)); @@ -27,9 +27,9 @@ export async function poseidon2Hash(input: Fieldable[]): Promise { export async function poseidon2HashWithSeparator(input: Fieldable[], separator: number): Promise { const inputFields = serializeToFields(input); inputFields.unshift(new Fr(separator)); - await BarretenbergSync.initSingleton(); - const api = BarretenbergSync.getSingleton(); - const response = api.poseidon2Hash({ + await Barretenberg.initSingleton(); + const api = Barretenberg.getSingleton(); + const response = await api.poseidon2Hash({ inputs: inputFields.map(i => i.toBuffer()), }); return Fr.fromBuffer(Buffer.from(response.hash)); @@ -44,9 +44,9 @@ export async function poseidon2Permutation(input: Fieldable[]): Promise { const inputFields = serializeToFields(input); // We'd like this assertion but it's not possible to use it in the browser. // assert(input.length === 4, 'Input state must be of size 4'); - await BarretenbergSync.initSingleton(); - const api = BarretenbergSync.getSingleton(); - const response = api.poseidon2Permutation({ + await Barretenberg.initSingleton(); + const api = Barretenberg.getSingleton(); + const response = await api.poseidon2Permutation({ inputs: inputFields.map(i => i.toBuffer()), }); // We'd like this assertion but it's not possible to use it in the browser. @@ -65,9 +65,9 @@ export async function poseidon2HashBytes(input: Buffer): Promise { inputFields.push(Fr.fromBuffer(fieldBytes)); } - await BarretenbergSync.initSingleton(); - const api = BarretenbergSync.getSingleton(); - const response = api.poseidon2Hash({ + await Barretenberg.initSingleton(); + const api = Barretenberg.getSingleton(); + const response = await api.poseidon2Hash({ inputs: inputFields.map(i => i.toBuffer()), }); diff --git a/yarn-project/foundation/src/curves/bn254/field.ts b/yarn-project/foundation/src/curves/bn254/field.ts index a5f81149ea42..80d228b470ac 100644 --- a/yarn-project/foundation/src/curves/bn254/field.ts +++ b/yarn-project/foundation/src/curves/bn254/field.ts @@ -118,14 +118,18 @@ abstract class BaseField { } cmp(rhs: BaseField): -1 | 0 | 1 { - const rhsBigInt = rhs.asBigInt; - return this.asBigInt === rhsBigInt ? 0 : this.asBigInt < rhsBigInt ? -1 : 1; + return BaseField.cmpAsBigInt(this.asBigInt, rhs.asBigInt); } static cmp(lhs: BaseField, rhs: BaseField): -1 | 0 | 1 { return lhs.cmp(rhs); } + // Actual bigint comparison. Arguments must have been validated previously. + static cmpAsBigInt(lhs: bigint, rhs: bigint): -1 | 0 | 1 { + return lhs === rhs ? 0 : lhs < rhs ? -1 : 1; + } + isZero(): boolean { return this.asBigInt === 0n; } diff --git a/yarn-project/foundation/src/log/bigint-utils.ts b/yarn-project/foundation/src/log/bigint-utils.ts index 6cc94101ac2f..c9083ec1bfd0 100644 --- a/yarn-project/foundation/src/log/bigint-utils.ts +++ b/yarn-project/foundation/src/log/bigint-utils.ts @@ -11,6 +11,9 @@ export function convertBigintsToStrings(obj: unknown): unknown { } if (obj !== null && typeof obj === 'object') { + if (typeof (obj as any).toJSON === 'function') { + return convertBigintsToStrings((obj as any).toJSON()); + } const result: Record = {}; for (const key in obj) { result[key] = convertBigintsToStrings((obj as Record)[key]); diff --git a/yarn-project/foundation/src/log/pino-logger.test.ts b/yarn-project/foundation/src/log/pino-logger.test.ts index 9881535d4f58..22afc9e6a293 100644 --- a/yarn-project/foundation/src/log/pino-logger.test.ts +++ b/yarn-project/foundation/src/log/pino-logger.test.ts @@ -273,6 +273,35 @@ describe('pino-logger', () => { }); }); + it('serializes objects with toJSON() instead of dumping raw properties', () => { + const testLogger = createLogger('tojson-test'); + capturingStream.clear(); + + // Simulate an EthAddress-like object with an internal buffer and a toJSON method + const addressLike = { + buffer: Buffer.from('1234567890abcdef1234567890abcdef12345678', 'hex'), + toJSON() { + return '0x1234567890abcdef1234567890abcdef12345678'; + }, + }; + + testLogger.info('address logging test', { + validator: addressLike, + nested: { addr: addressLike }, + array: [addressLike], + plainString: 'hello', + }); + + const entries = capturingStream.getJsonLines(); + expect(entries).toHaveLength(1); + expect(entries[0]).toMatchObject({ + validator: '0x1234567890abcdef1234567890abcdef12345678', + nested: { addr: '0x1234567890abcdef1234567890abcdef12345678' }, + array: ['0x1234567890abcdef1234567890abcdef12345678'], + plainString: 'hello', + }); + }); + it('returns bindings via getBindings', () => { const testLogger = createLogger('bindings-test', { actor: 'main', instanceId: 'id-123' }); const bindings = testLogger.getBindings(); diff --git a/yarn-project/foundation/src/transport/transport_client.ts b/yarn-project/foundation/src/transport/transport_client.ts index e1aa0260e811..fb2b98f86ddf 100644 --- a/yarn-project/foundation/src/transport/transport_client.ts +++ b/yarn-project/foundation/src/transport/transport_client.ts @@ -91,7 +91,7 @@ export class TransportClient extends EventEmitter { } const msgId = this.msgId++; const msg = { msgId, payload }; - log.debug(format(`->`, msg)); + log.trace(format(`->`, msg)); return new Promise((resolve, reject) => { this.pendingRequests.push({ resolve, reject, msgId }); this.socket!.send(msg, transfer).catch(reject); @@ -111,7 +111,7 @@ export class TransportClient extends EventEmitter { this.close(); return; } - log.debug(format(`<-`, msg)); + log.trace(format(`<-`, msg)); if (isEventMessage(msg)) { this.emit('event_msg', msg.payload); return; diff --git a/yarn-project/node-lib/src/actions/snapshot-sync.ts b/yarn-project/node-lib/src/actions/snapshot-sync.ts index 6d7274b3c2b1..d60760bf6aa1 100644 --- a/yarn-project/node-lib/src/actions/snapshot-sync.ts +++ b/yarn-project/node-lib/src/actions/snapshot-sync.ts @@ -82,7 +82,11 @@ export async function trySnapshotSync(config: SnapshotSyncConfig, log: Logger) { } const currentL1BlockNumber = await getPublicClient(config).getBlockNumber(); - if (archiverL1BlockNumber && currentL1BlockNumber - archiverL1BlockNumber < minL1BlocksToTriggerReplace) { + if ( + archiverL1BlockNumber && + currentL1BlockNumber >= archiverL1BlockNumber && + currentL1BlockNumber - archiverL1BlockNumber < minL1BlocksToTriggerReplace + ) { log.verbose( `Skipping snapshot sync as archiver is less than ${ currentL1BlockNumber - archiverL1BlockNumber diff --git a/yarn-project/p2p/src/client/factory.ts b/yarn-project/p2p/src/client/factory.ts index 08d1dd209343..c6b431ca5a12 100644 --- a/yarn-project/p2p/src/client/factory.ts +++ b/yarn-project/p2p/src/client/factory.ts @@ -1,15 +1,14 @@ import type { EpochCacheInterface } from '@aztec/epoch-cache'; +import { BlockNumber } from '@aztec/foundation/branded-types'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { DateProvider } from '@aztec/foundation/timer'; import type { AztecAsyncKVStore } from '@aztec/kv-store'; import type { DataStoreConfig } from '@aztec/kv-store/config'; import { AztecLMDBStoreV2, createStore } from '@aztec/kv-store/lmdb-v2'; -import type { BlockHash, L2BlockSource } from '@aztec/stdlib/block'; +import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ChainConfig } from '@aztec/stdlib/config'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { AztecNode, ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType } from '@aztec/stdlib/p2p'; -import { MerkleTreeId } from '@aztec/stdlib/trees'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; import { P2PClient } from '../client/p2p_client.js'; @@ -17,11 +16,8 @@ import type { P2PConfig } from '../config.js'; import { AttestationPool, type AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js'; import type { MemPools } from '../mem_pools/interface.js'; import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js'; -import type { TxMetaData } from '../mem_pools/tx_pool_v2/tx_metadata.js'; import { AztecKVTxPoolV2 } from '../mem_pools/tx_pool_v2/tx_pool_v2.js'; -import { AggregateTxValidator } from '../msg_validators/tx_validator/aggregate_tx_validator.js'; -import { BlockHeaderTxValidator } from '../msg_validators/tx_validator/block_header_validator.js'; -import { DoubleSpendTxValidator } from '../msg_validators/tx_validator/double_spend_validator.js'; +import { createTxValidatorForTransactionsEnteringPendingTxPool } from '../msg_validators/index.js'; import { DummyP2PService } from '../services/dummy_service.js'; import { LibP2PService } from '../services/index.js'; import { createFileStoreTxSources } from '../services/tx_collection/file_store_tx_source.js'; @@ -30,14 +26,14 @@ import { NodeRpcTxSource, type TxSource, createNodeRpcTxSources } from '../servi import { TxFileStore } from '../services/tx_file_store/tx_file_store.js'; import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js'; -export type P2PClientDeps = { +export type P2PClientDeps = { txPool?: TxPoolV2; store?: AztecAsyncKVStore; attestationPool?: AttestationPoolApi; logger?: Logger; txCollectionNodeSources?: TxSource[]; rpcTxProviders?: AztecNode[]; - p2pServiceFactory?: (...args: Parameters<(typeof LibP2PService)['new']>) => Promise>; + p2pServiceFactory?: (...args: Parameters<(typeof LibP2PService)['new']>) => Promise; }; export const P2P_STORE_NAME = 'p2p'; @@ -45,8 +41,7 @@ export const P2P_ARCHIVE_STORE_NAME = 'p2p-archive'; export const P2P_PEER_STORE_NAME = 'p2p-peers'; export const P2P_ATTESTATION_STORE_NAME = 'p2p-attestation'; -export async function createP2PClient( - clientType: T, +export async function createP2PClient( inputConfig: P2PConfig & DataStoreConfig & ChainConfig, archiver: L2BlockSource & ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, @@ -55,7 +50,7 @@ export async function createP2PClient( packageVersion: string, dateProvider: DateProvider = new DateProvider(), telemetry: TelemetryClient = getTelemetryClient(), - deps: P2PClientDeps = {}, + deps: P2PClientDeps = {}, ) { const config = await configureP2PClientAddresses({ ...inputConfig, @@ -80,32 +75,6 @@ export async function createP2PClient( const rollupAddress = inputConfig.l1Contracts.rollupAddress.toString().toLowerCase().replace(/^0x/, ''); const txFileStoreBasePath = `aztec-${inputConfig.l1ChainId}-${inputConfig.rollupVersion}-0x${rollupAddress}`; - /** Validator factory for pool re-validation (double-spend + block header only). */ - const createPoolTxValidator = async () => { - await worldStateSynchronizer.syncImmediate(); - return new AggregateTxValidator( - new DoubleSpendTxValidator( - { - nullifiersExist: async (nullifiers: Buffer[]) => { - const merkleTree = worldStateSynchronizer.getCommitted(); - const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers); - return indices.map(index => index !== undefined); - }, - }, - bindings, - ), - new BlockHeaderTxValidator( - { - getArchiveIndices: (archives: BlockHash[]) => { - const merkleTree = worldStateSynchronizer.getCommitted(); - return merkleTree.findLeafIndices(MerkleTreeId.ARCHIVE, archives); - }, - }, - bindings, - ), - ); - }; - const txPool = deps.txPool ?? new AztecKVTxPoolV2( @@ -114,7 +83,16 @@ export async function createP2PClient( { l2BlockSource: archiver, worldStateSynchronizer, - createTxValidator: createPoolTxValidator, + createTxValidator: async () => { + // We accept transactions if they are not expired by the next slot and block number (checked based on the ExpirationTimestamp field) + const currentBlockNumber = await archiver.getBlockNumber(); + const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot(); + return createTxValidatorForTransactionsEnteringPendingTxPool( + worldStateSynchronizer, + nextSlotTimestamp, + BlockNumber(currentBlockNumber + 1), + ); + }, }, telemetry, { @@ -130,9 +108,8 @@ export async function createP2PClient( attestationPool: deps.attestationPool ?? new AttestationPool(attestationStore, telemetry), }; - const p2pService = await createP2PService( + const p2pService = await createP2PService( config, - clientType, archiver, proofVerifier, worldStateSynchronizer, @@ -190,7 +167,6 @@ export async function createP2PClient( ); return new P2PClient( - clientType, store, archiver, mempools, @@ -204,9 +180,8 @@ export async function createP2PClient( ); } -async function createP2PService( +async function createP2PService( config: P2PConfig & DataStoreConfig, - clientType: T, archiver: L2BlockSource & ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, @@ -214,7 +189,7 @@ async function createP2PService( store: AztecAsyncKVStore, peerStore: AztecLMDBStoreV2, mempools: MemPools, - p2pServiceFactory: P2PClientDeps['p2pServiceFactory'], + p2pServiceFactory: P2PClientDeps['p2pServiceFactory'], packageVersion: string, logger: Logger, telemetry: TelemetryClient, @@ -230,7 +205,7 @@ async function createP2PService( const peerIdPrivateKey = await getPeerIdPrivateKey(config, store, logger); const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey.getValue()); - const p2pService = await (p2pServiceFactory ?? LibP2PService.new)(clientType, config, peerId, { + const p2pService = await (p2pServiceFactory ?? LibP2PService.new)(config, peerId, { packageVersion, mempools, l2BlockSource: archiver, diff --git a/yarn-project/p2p/src/client/interface.ts b/yarn-project/p2p/src/client/interface.ts index 9585dd6b89e8..3ba683362f39 100644 --- a/yarn-project/p2p/src/client/interface.ts +++ b/yarn-project/p2p/src/client/interface.ts @@ -1,7 +1,7 @@ import type { SlotNumber } from '@aztec/foundation/branded-types'; import type { EthAddress, L2BlockId } from '@aztec/stdlib/block'; -import type { ITxProvider, P2PApiFull } from '@aztec/stdlib/interfaces/server'; -import type { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PClientType } from '@aztec/stdlib/p2p'; +import type { ITxProvider, P2PClient } from '@aztec/stdlib/interfaces/server'; +import type { BlockProposal, CheckpointAttestation, CheckpointProposal, TopicType } from '@aztec/stdlib/p2p'; import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx'; import type { PeerId } from '@libp2p/interface'; @@ -48,7 +48,7 @@ export interface P2PSyncState { /** * Interface of a P2P client. **/ -export type P2P = P2PApiFull & { +export type P2P = P2PClient & { /** * Broadcasts a block proposal to other peers. * @@ -134,14 +134,6 @@ export type P2P = P2PApiFull & */ hasTxsInPool(txHashes: TxHash[]): Promise; - /** - * Returns transactions in the transaction pool by hash, requesting from the network if not found. - * @param txHashes - Hashes of tx to return. - * @param pinnedPeerId - An optional peer id that will be used to request the tx from (in addition to other random peers). - * @returns An array of tx or undefined. - */ - getTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<(Tx | undefined)[]>; - /** * Returns an archived transaction from the transaction pool by its hash. * @param txHash - Hash of tx to return. @@ -218,8 +210,8 @@ export type P2P = P2PApiFull & updateP2PConfig(config: Partial): Promise; - /** Validates a set of txs. */ - validate(txs: Tx[]): Promise; + /** Validates a set of txs received in a block proposal. */ + validateTxsReceivedInBlockProposal(txs: Tx[]): Promise; /** Clears the db. */ clear(): Promise; @@ -237,4 +229,7 @@ export type P2P = P2PApiFull & /** If node running this P2P stack is validator, passes in validator address to P2P layer */ registerThisValidatorAddresses(address: EthAddress[]): void; + + /** Returns the number of peers in the GossipSub mesh for a given topic type. */ + getGossipMeshPeerCount(topicType: TopicType): Promise; }; diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 064e5a29d4b5..20a41e28ec11 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -7,9 +7,8 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { L2Block } from '@aztec/stdlib/block'; import { EmptyL1RollupConstants, type L1RollupConstants } from '@aztec/stdlib/epoch-helpers'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import { mockTx } from '@aztec/stdlib/testing'; -import { TxArray, TxHash, TxHashArray } from '@aztec/stdlib/tx'; +import { TxHash } from '@aztec/stdlib/tx'; import { expect, jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -19,7 +18,6 @@ import type { P2PService } from '../index.js'; import { type AttestationPool, createTestAttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js'; import type { MemPools } from '../mem_pools/interface.js'; import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js'; -import { ReqRespSubProtocol } from '../services/reqresp/interface.js'; import type { TxCollection } from '../services/tx_collection/tx_collection.js'; import { P2PClient } from './p2p_client.js'; @@ -63,17 +61,7 @@ describe('P2P Client', () => { }); const createClient = (config: Partial = {}) => - new P2PClient( - P2PClientType.Full, - kvStore, - blockSource, - mempools, - p2pService, - txCollection, - undefined, - epochCache, - config, - ); + new P2PClient(kvStore, blockSource, mempools, p2pService, txCollection, undefined, epochCache, config); const advanceToProvenBlock = async (blockNumber: BlockNumber) => { blockSource.setProvenBlockNumber(blockNumber); @@ -198,82 +186,6 @@ describe('P2P Client', () => { await client.stop(); }); - it('request transactions handles missing items', async () => { - const mockTx1 = await mockTx(); - const mockTx2 = await mockTx(); - const mockTx3 = await mockTx(); - - // None of the txs are in the pool - txPool.getTxByHash.mockResolvedValue(undefined); - - // P2P service will not return tx2 - p2pService.sendBatchRequest.mockResolvedValue([new TxArray(...[mockTx1, mockTx3])]); - - // Spy on the tx pool addPendingTxs method, it should not be called for the missing tx - const addTxsSpy = jest.spyOn(txPool, 'addPendingTxs'); - - await client.start(); - - // We query for all 3 txs via getTxsByHash which internally requests from the network - const txHashes = await Promise.all([mockTx1.getTxHash(), mockTx2.getTxHash(), mockTx3.getTxHash()]); - const results = await client.getTxsByHash(txHashes, undefined); - - // We should receive the found transactions (tx2 will be undefined) - expect(results).toEqual([mockTx1, undefined, mockTx3]); - - // P2P should have been called with the 3 tx hashes (all missing from pool) - expect(p2pService.sendBatchRequest).toHaveBeenCalledWith( - ReqRespSubProtocol.TX, - txHashes.map(hash => new TxHashArray(...[hash])), - undefined, - expect.anything(), - expect.anything(), - expect.anything(), - ); - - // Retrieved txs should have been added to the pool - expect(addTxsSpy).toHaveBeenCalledTimes(1); - expect(addTxsSpy).toHaveBeenCalledWith([mockTx1, mockTx3]); - - await client.stop(); - }); - - it('getTxsByHash handles missing items', async () => { - // We expect the node to fetch this item from their local p2p pool - const txInMempool = await mockTx(); - // We expect this transaction to be requested from the network - const txToBeRequested = await mockTx(); - // We expect this transaction to not be found - const txToNotBeFound = await mockTx(); - - txPool.getTxByHash.mockImplementation(txHash => - Promise.resolve(txHash === txInMempool.getTxHash() ? txInMempool : undefined), - ); - - const addTxsSpy = jest.spyOn(txPool, 'addPendingTxs'); - - p2pService.sendBatchRequest.mockResolvedValue([new TxArray(...[txToBeRequested])]); - - await client.start(); - - const query = await Promise.all([txInMempool.getTxHash(), txToBeRequested.getTxHash(), txToNotBeFound.getTxHash()]); - const results = await client.getTxsByHash(query, undefined); - - // We should return the resolved transactions (txToNotBeFound is undefined) - expect(results).toEqual([txInMempool, txToBeRequested, undefined]); - // We should add the found requested transactions to the pool - expect(addTxsSpy).toHaveBeenCalledWith([txToBeRequested]); - // The p2p service should have been called to request the missing txs - expect(p2pService.sendBatchRequest).toHaveBeenCalledWith( - ReqRespSubProtocol.TX, - expect.anything(), - undefined, - expect.anything(), - expect.anything(), - expect.anything(), - ); - }); - it('getPendingTxs respects pagination', async () => { const txs = await timesAsync(20, i => mockTx(i)); txPool.getPendingTxHashes.mockResolvedValue(await Promise.all(txs.map(tx => tx.getTxHash()))); diff --git a/yarn-project/p2p/src/client/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts index 6daad444646c..7996594ff9cb 100644 --- a/yarn-project/p2p/src/client/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -20,12 +20,7 @@ import { import type { ContractDataSource } from '@aztec/stdlib/contract'; import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers'; import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server'; -import { - type BlockProposal, - CheckpointAttestation, - type CheckpointProposal, - type P2PClientType, -} from '@aztec/stdlib/p2p'; +import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p'; import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx'; import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client'; @@ -43,7 +38,6 @@ import { type ReqRespSubProtocolHandler, type ReqRespSubProtocolValidators, } from '../services/reqresp/interface.js'; -import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js'; import type { DuplicateAttestationInfo, DuplicateProposalInfo, @@ -59,10 +53,7 @@ import { type P2P, P2PClientState, type P2PSyncState } from './interface.js'; /** * The P2P client implementation. */ -export class P2PClient - extends WithTracer - implements P2P, P2P -{ +export class P2PClient extends WithTracer implements P2P { /** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */ private runningPromise!: Promise; @@ -94,7 +85,6 @@ export class P2PClient private slotMonitor: RunningPromise | undefined; constructor( - _clientType: T, private store: AztecAsyncKVStore, private l2BlockSource: L2BlockSource & ContractDataSource, mempools: MemPools, @@ -167,6 +157,10 @@ export class P2PClient return Promise.resolve(this.p2pService.getPeers(includePending)); } + public getGossipMeshPeerCount(topicType: TopicType): Promise { + return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType)); + } + public getL2BlockHash(number: BlockNumber): Promise { return this.l2Tips.getL2BlockHash(number); } @@ -428,36 +422,6 @@ export class P2PClient this.p2pService.registerDuplicateAttestationCallback(callback); } - /** - * Uses the batched Request Response protocol to request a set of transactions from the network. - */ - private async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise { - const timeoutMs = 8000; // Longer timeout for now - const maxRetryAttempts = 10; // Keep retrying within the timeout - const requests = chunkTxHashesRequest(txHashes); - const maxPeers = Math.min(Math.ceil(requests.length / 3), 10); - - const txBatches = await this.p2pService.sendBatchRequest( - ReqRespSubProtocol.TX, - requests, - pinnedPeerId, - timeoutMs, - maxPeers, - maxRetryAttempts, - ); - - const txs = txBatches.flat(); - if (txs.length > 0) { - await this.txPool.addPendingTxs(txs); - } - - const txHashesStr = txHashes.map(tx => tx.toString()).join(', '); - this.log.debug(`Requested txs ${txHashesStr} (${txs.length} / ${txHashes.length}) from peers`); - - // We return all transactions, even the not found ones to the caller, such they can handle missing items themselves. - return txs; - } - public async getPendingTxs(limit?: number, after?: TxHash): Promise { if (limit !== undefined && limit <= 0) { throw new TypeError('limit must be greater than 0'); @@ -525,49 +489,6 @@ export class P2PClient return this.txPool.hasTxs(txHashes); } - /** - * Returns transactions in the transaction pool by hash. - * If a transaction is not in the pool, it will be requested from the network. - * @param txHashes - Hashes of the transactions to look for. - * @returns The txs found, or undefined if not found in the order requested. - */ - async getTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<(Tx | undefined)[]> { - const txs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash))); - const missingTxHashes = txs - .map((tx, index) => [tx, index] as const) - .filter(([tx, _index]) => !tx) - .map(([_tx, index]) => txHashes[index]); - - if (missingTxHashes.length === 0) { - return txs as Tx[]; - } - - const missingTxs = await this.requestTxsByHash(missingTxHashes, pinnedPeerId); - // TODO: optimize - // Merge the found txs in order - const mergingTxs = txHashes.map(txHash => { - // Is it in the txs list from the mempool? - for (const tx of txs) { - if (tx !== undefined && tx.getTxHash().equals(txHash)) { - return tx; - } - } - - // Is it in the fetched missing txs? - // Note: this is an O(n^2) operation, but we expect the number of missing txs to be small. - for (const tx of missingTxs) { - if (tx.getTxHash().equals(txHash)) { - return tx; - } - } - - // Otherwise return undefined - return undefined; - }); - - return mergingTxs; - } - /** * Returns an archived transaction in the transaction pool by its hash. * @param txHash - Hash of the archived transaction to look for. @@ -834,8 +755,8 @@ export class P2PClient this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`); } - public validate(txs: Tx[]): Promise { - return this.p2pService.validate(txs); + public validateTxsReceivedInBlockProposal(txs: Tx[]): Promise { + return this.p2pService.validateTxsReceivedInBlockProposal(txs); } /** diff --git a/yarn-project/p2p/src/client/test/p2p_client.integration_txs.test.ts b/yarn-project/p2p/src/client/test/p2p_client.integration_txs.test.ts deleted file mode 100644 index 5cacb81e4b97..000000000000 --- a/yarn-project/p2p/src/client/test/p2p_client.integration_txs.test.ts +++ /dev/null @@ -1,354 +0,0 @@ -import type { EpochCache } from '@aztec/epoch-cache'; -import { BlockNumber } from '@aztec/foundation/branded-types'; -import { times } from '@aztec/foundation/collection'; -import { type Logger, createLogger } from '@aztec/foundation/log'; -import { sleep } from '@aztec/foundation/sleep'; -import { emptyChainConfig } from '@aztec/stdlib/config'; -import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { PeerErrorSeverity } from '@aztec/stdlib/p2p'; -import { Tx, TxHash } from '@aztec/stdlib/tx'; - -import { describe, expect, it, jest } from '@jest/globals'; -import { type MockProxy, mock } from 'jest-mock-extended'; - -import type { P2PClient } from '../../client/p2p_client.js'; -import { type P2PConfig, getP2PDefaultConfig } from '../../config.js'; -import type { AttestationPool } from '../../mem_pools/attestation_pool/attestation_pool.js'; -import type { TxPoolV2 } from '../../mem_pools/tx_pool_v2/interfaces.js'; -import { ReqRespSubProtocol } from '../../services/reqresp/interface.js'; -import { chunkTxHashesRequest } from '../../services/reqresp/protocols/tx.js'; -import { makeAndStartTestP2PClients } from '../../test-helpers/make-test-p2p-clients.js'; -import { createMockTxWithMetadata } from '../../test-helpers/mock-tx-helpers.js'; - -/** Calls the protected requestTxsByHash method on a P2PClient for testing. */ -const requestTxsByHash = (client: P2PClient, txHashes: TxHash[], pinnedPeerId?: unknown): Promise => - ( - client as unknown as { requestTxsByHash(txHashes: TxHash[], pinnedPeerId: unknown): Promise } - ).requestTxsByHash(txHashes, pinnedPeerId); - -const TEST_TIMEOUT = 120000; -jest.setTimeout(TEST_TIMEOUT); - -const NUMBER_OF_PEERS = 2; - -describe('p2p client integration', () => { - let txPool: MockProxy; - let attestationPool: MockProxy; - let epochCache: MockProxy; - let worldState: MockProxy; - - let logger: Logger; - let p2pBaseConfig: P2PConfig; - - let clients: P2PClient[] = []; - - beforeEach(() => { - clients = []; - txPool = mock(); - attestationPool = mock(); - epochCache = mock(); - worldState = mock(); - - logger = createLogger('p2p:test:integration'); - p2pBaseConfig = { ...emptyChainConfig, ...getP2PDefaultConfig() }; - - //@ts-expect-error - we want to mock the getEpochAndSlotInNextL1Slot method, mocking ts is enough - epochCache.getEpochAndSlotInNextL1Slot.mockReturnValue({ ts: BigInt(0) }); - epochCache.getRegisteredValidators.mockResolvedValue([]); - epochCache.getL1Constants.mockReturnValue({ - l1StartBlock: 0n, - l1GenesisTime: 0n, - slotDuration: 24, - epochDuration: 16, - ethereumSlotDuration: 12, - proofSubmissionEpochs: 2, - targetCommitteeSize: 48, - }); - - txPool.isEmpty.mockResolvedValue(true); - txPool.hasTxs.mockResolvedValue([]); - txPool.addPendingTxs.mockResolvedValue({ accepted: [], ignored: [], rejected: [] }); - txPool.getTxsByHash.mockImplementation(() => { - return Promise.resolve([] as Tx[]); - }); - - attestationPool.isEmpty.mockResolvedValue(true); - - worldState.status.mockResolvedValue({ - state: mock(), - syncSummary: { - latestBlockNumber: BlockNumber.ZERO, - latestBlockHash: '', - finalizedBlockNumber: BlockNumber.ZERO, - treesAreSynched: false, - oldestHistoricBlockNumber: BlockNumber.ZERO, - }, - }); - logger.info(`Starting test ${expect.getState().currentTestName}`); - }); - - afterEach(async () => { - logger.info(`Tearing down state for ${expect.getState().currentTestName}`); - await shutdown(clients); - logger.info('Shut down p2p clients'); - - jest.restoreAllMocks(); - jest.resetAllMocks(); - jest.clearAllMocks(); - - clients = []; - }); - - // Shutdown all test clients - const shutdown = async (clients: P2PClient[]) => { - await Promise.all(clients.map(client => client.stop())); - await sleep(1000); - }; - - it('returns an empty array if unable to find a transaction from another peer', async () => { - // We want to create a set of nodes and request transaction from them - // Not using a before each as a the wind down is not working as expected - const config = { ...emptyChainConfig, ...getP2PDefaultConfig() }; - clients = ( - await makeAndStartTestP2PClients(NUMBER_OF_PEERS, { - p2pBaseConfig: config, - mockAttestationPool: attestationPool, - mockTxPool: txPool, - mockEpochCache: epochCache, - mockWorldState: worldState, - logger, - }) - ).map(x => x.client); - const [client1] = clients; - - await sleep(2000); - logger.info(`Finished waiting for clients to connect`); - - // Perform a get tx request from client 1 - const tx = await createMockTxWithMetadata(config); - const txHash = tx.getTxHash(); - - const requestedTxs = await requestTxsByHash(client1, [txHash], undefined); - expect(requestedTxs).toEqual([]); - }); - - it('can request a transaction from another peer', async () => { - // We want to create a set of nodes and request transaction from them - clients = ( - await makeAndStartTestP2PClients(NUMBER_OF_PEERS, { - p2pBaseConfig, - mockAttestationPool: attestationPool, - mockTxPool: txPool, - mockEpochCache: epochCache, - mockWorldState: worldState, - logger, - }) - ).map(x => x.client); - const [client1] = clients; - - // Give the nodes time to discover each other - await sleep(6000); - logger.info(`Finished waiting for clients to connect`); - - // Perform a get tx request from client 1 - const tx = await createMockTxWithMetadata(p2pBaseConfig); - const txHash = tx.getTxHash(); - // Mock the tx pool to return the tx we are looking for - txPool.getTxByHash.mockImplementationOnce(() => Promise.resolve(tx)); - - const requestedTxs = await requestTxsByHash(client1, [txHash], undefined); - expect(requestedTxs).toHaveLength(1); - const requestedTx = requestedTxs[0]; - - // Expect the tx to be the returned tx to be the same as the one we mocked - expect(requestedTx?.toBuffer()).toStrictEqual(tx.toBuffer()); - }); - - it('request batches of txs from another peer', async () => { - const txToRequestCount = 8; - const txBatchSize = 1; - - // We want to create a set of nodes and request transaction from them - clients = ( - await makeAndStartTestP2PClients(3, { - p2pBaseConfig, - mockAttestationPool: attestationPool, - mockTxPool: txPool, - mockEpochCache: epochCache, - mockWorldState: worldState, - logger, - }) - ).map(x => x.client); - const [client1] = clients; - - // Give the nodes time to discover each other - await sleep(6000); - logger.info(`Finished waiting for clients to connect`); - - // Perform a get tx request from client 1 - const txs = await Promise.all(times(txToRequestCount, i => createMockTxWithMetadata(p2pBaseConfig, i))); - const txHashes = await Promise.all(txs.map(tx => tx.getTxHash())); - - // Mock the tx pool to return the tx we are looking for - txPool.getTxByHash.mockImplementation((hash: TxHash) => Promise.resolve(txs.find(t => t.txHash?.equals(hash)))); - //@ts-expect-error - we want to spy on the sendBatchRequest method - const sendBatchSpy = jest.spyOn(client1.p2pService, 'sendBatchRequest'); - //@ts-expect-error - we want to spy on the sendRequestToPeer method - const sendRequestToPeerSpy = jest.spyOn(client1.p2pService.reqresp, 'sendRequestToPeer'); - - const resultingTxs = await requestTxsByHash(client1, txHashes, undefined); - expect(resultingTxs).toHaveLength(txs.length); - - // Expect the tx to be the returned tx to be the same as the one we mocked - resultingTxs.forEach((requestedTx: Tx, i: number) => { - expect(requestedTx.toBuffer()).toStrictEqual(txs[i].toBuffer()); - }); - - const request = chunkTxHashesRequest(txHashes, txBatchSize); - expect(request).toHaveLength(Math.ceil(txToRequestCount / txBatchSize)); - - expect(sendBatchSpy).toHaveBeenCalledWith( - ReqRespSubProtocol.TX, - request, - undefined, // pinnedPeer - expect.anything(), // timeoutMs - expect.anything(), // maxPeers - expect.anything(), // maxRetryAttempts - ); - - expect(sendRequestToPeerSpy).toHaveBeenCalledTimes(request.length); - }); - - it('request batches of txs from another peers', async () => { - const txToRequestCount = 8; - const txBatchSize = 1; - - // We want to create a set of nodes and request transaction from them - clients = ( - await makeAndStartTestP2PClients(3, { - p2pBaseConfig, - mockAttestationPool: attestationPool, - mockTxPool: txPool, - mockEpochCache: epochCache, - mockWorldState: worldState, - logger, - }) - ).map(x => x.client); - const [client1] = clients; - - // Give the nodes time to discover each other - await sleep(6000); - logger.info(`Finished waiting for clients to connect`); - - // Perform a get tx request from client 1 - const txs = await Promise.all(times(txToRequestCount, i => createMockTxWithMetadata(p2pBaseConfig, i))); - const txHashes = await Promise.all(txs.map(tx => tx.getTxHash())); - - // Mock the tx pool to return every other tx we are looking for - txPool.getTxByHash.mockImplementation((hash: TxHash) => { - const idx = txs.findIndex(t => t.txHash.equals(hash)); - return idx % 2 === 0 ? Promise.resolve(txs[idx]) : Promise.resolve(undefined); - }); - //@ts-expect-error - we want to spy on the sendBatchRequest method - const sendBatchSpy = jest.spyOn(client1.p2pService, 'sendBatchRequest'); - //@ts-expect-error - we want to spy on the sendRequestToPeer method - const sendRequestToPeerSpy = jest.spyOn(client1.p2pService.reqresp, 'sendRequestToPeer'); - - const resultingTxs = await requestTxsByHash(client1, txHashes, undefined); - expect(resultingTxs).toHaveLength(txs.length / 2); - - // Expect the tx to be the returned tx to be the same as the one we mocked - // Note we have only returned the half of the txs, so we expect the resulting txs to be every other tx - resultingTxs.forEach((requestedTx: Tx, i: number) => { - expect(requestedTx.toBuffer()).toStrictEqual(txs[2 * i].toBuffer()); - }); - - const request = chunkTxHashesRequest(txHashes, txBatchSize); - expect(request).toHaveLength(Math.ceil(txToRequestCount / txBatchSize)); - expect(request[0]).toHaveLength(txBatchSize); - - expect(sendBatchSpy).toHaveBeenCalledWith( - ReqRespSubProtocol.TX, - request, - undefined, // pinnedPeer - expect.anything(), // timeoutMs - expect.anything(), // maxPeers - expect.anything(), // maxRetryAttempts - ); - - expect(sendRequestToPeerSpy.mock.calls.length).toBeGreaterThanOrEqual(request.length); - }); - - it('will penalize peers that send invalid proofs', async () => { - // We want to create a set of nodes and request transaction from them - clients = ( - await makeAndStartTestP2PClients(NUMBER_OF_PEERS, { - p2pBaseConfig, - mockAttestationPool: attestationPool, - mockTxPool: txPool, - mockEpochCache: epochCache, - mockWorldState: worldState, - alwaysTrueVerifier: false, - logger, - }) - ).map(x => x.client); - const [client1, client2] = clients; - const client2PeerId = await client2.getEnr()!.peerId(); - - // Give the nodes time to discover each other - await sleep(6000); - logger.info(`Finished waiting for clients to connect`); - - const penalizePeerSpy = jest.spyOn((client1 as any).p2pService.peerManager, 'penalizePeer'); - - // Perform a get tx request from client 1 - const tx = await createMockTxWithMetadata(p2pBaseConfig); - const txHash = tx.getTxHash(); - - // Return the correct tx with an invalid proof -> active attack - txPool.getTxByHash.mockImplementationOnce(() => Promise.resolve(tx)); - - const requestedTxs = await requestTxsByHash(client1, [txHash], undefined); - // Even though we got a response, the proof was deemed invalid - expect(requestedTxs).toEqual([]); - - expect(penalizePeerSpy).toHaveBeenCalledWith(client2PeerId, PeerErrorSeverity.LowToleranceError); - }); - - it('will penalize peers that send the wrong transaction', async () => { - // We want to create a set of nodes and request transaction from them - clients = ( - await makeAndStartTestP2PClients(NUMBER_OF_PEERS, { - p2pBaseConfig, - mockAttestationPool: attestationPool, - mockTxPool: txPool, - mockEpochCache: epochCache, - mockWorldState: worldState, - alwaysTrueVerifier: true, - logger, - }) - ).map(x => x.client); - const [client1, client2] = clients; - const client2PeerId = (await client2.getEnr()?.peerId())!; - - // Give the nodes time to discover each other - await sleep(6000); - logger.info(`Finished waiting for clients to connect`); - - const penalizePeerSpy = jest.spyOn((client1 as any).p2pService.peerManager, 'penalizePeer'); - - // Perform a get tx request from client 1 - const tx = await createMockTxWithMetadata(p2pBaseConfig); - const txHash = tx.getTxHash(); - const tx2 = await createMockTxWithMetadata(p2pBaseConfig, 420); - - // Return an invalid tx - txPool.getTxByHash.mockImplementationOnce(() => Promise.resolve(tx2)); - - const requestedTxs = await requestTxsByHash(client1, [txHash], undefined); - // Even though we got a response, the proof was deemed invalid - expect(requestedTxs).toEqual([]); - - expect(penalizePeerSpy).toHaveBeenCalledWith(client2PeerId, PeerErrorSeverity.MidToleranceError); - }); -}); diff --git a/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts b/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts index 45fba6b2d92a..e1f054b98a02 100644 --- a/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +++ b/yarn-project/p2p/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts @@ -8,7 +8,7 @@ import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType, PeerErrorSeverity } from '@aztec/stdlib/p2p'; +import { PeerErrorSeverity } from '@aztec/stdlib/p2p'; import type { Tx, TxValidationResult } from '@aztec/stdlib/tx'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; @@ -20,8 +20,8 @@ import { BatchTxRequesterCollector, SendBatchRequestCollector } from '../../../s import type { IBatchRequestTxValidator } from '../../../services/reqresp/batch-tx-requester/tx_validator.js'; import { RateLimitStatus } from '../../../services/reqresp/rate-limiter/rate_limiter.js'; import { MissingTxsTracker } from '../../../services/tx_collection/missing_txs_tracker.js'; -import { AlwaysTrueCircuitVerifier } from '../../../test-helpers/index.js'; import { + AlwaysTrueCircuitVerifier, BENCHMARK_CONSTANTS, InMemoryAttestationPool, InMemoryTxPool, @@ -114,7 +114,6 @@ async function startClient(config: P2PConfig, clientIndex: number) { }; client = await createP2PClient( - P2PClientType.Full, config as P2PConfig & DataStoreConfig, l2BlockSource as L2BlockSource & ContractDataSource, proofVerifier as ClientProtocolCircuitVerifier, diff --git a/yarn-project/p2p/src/config.ts b/yarn-project/p2p/src/config.ts index ad47120b786b..039e433aa163 100644 --- a/yarn-project/p2p/src/config.ts +++ b/yarn-project/p2p/src/config.ts @@ -38,7 +38,7 @@ export interface P2PConfig ChainConfig, TxCollectionConfig, TxFileStoreConfig, - Pick { + Pick { /** A flag dictating whether the P2P subsystem should be enabled. */ p2pEnabled: boolean; diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/eviction_manager.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/eviction_manager.test.ts index 9ffb86919685..a1fda0cd2532 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/eviction_manager.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/eviction_manager.test.ts @@ -4,7 +4,7 @@ import { BlockHeader } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { type TxMetaData, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, stubTxMetaData } from '../tx_metadata.js'; import { EvictionManager } from './eviction_manager.js'; import { EvictionEvent, @@ -174,19 +174,7 @@ describe('EvictionManager', () => { let preAddRule: MockProxy; let poolAccess: MockProxy; - const createMeta = (txHash: string, priorityFee: bigint): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee, - feePayer: '0xfeepayer', - claimAmount: 0n, - feeLimit: 100n, - nullifiers: [`0x${txHash.slice(2)}null1`], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const createMeta = (txHash: string, priorityFee: bigint): TxMetaData => stubTxMetaData(txHash, { priorityFee }); beforeEach(() => { preAddRule = mock({ name: 'preAddRule' }); @@ -330,19 +318,7 @@ describe('EvictionManager', () => { const preAddRule2 = mock({ name: 'secondRule' }); const poolAccess = mock(); - const createMeta = (txHash: string, priorityFee: bigint): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee, - feePayer: '0xfeepayer', - claimAmount: 0n, - feeLimit: 100n, - nullifiers: [`0x${txHash.slice(2)}null1`], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const createMeta = (txHash: string, priorityFee: bigint): TxMetaData => stubTxMetaData(txHash, { priorityFee }); preAddRule1.check.mockRejectedValue(new Error('Rule failed')); preAddRule2.check.mockResolvedValue({ diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.test.ts index ae2b886818a9..7341a099f5da 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.test.ts @@ -7,7 +7,7 @@ import { BlockHeader, GlobalVariables } from '@aztec/stdlib/tx'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { type TxMetaData, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, stubTxMetaData } from '../tx_metadata.js'; import { FeePayerBalanceEvictionRule } from './fee_payer_balance_eviction_rule.js'; import type { EvictionContext, PoolOperations } from './interfaces.js'; import { EvictionEvent } from './interfaces.js'; @@ -33,19 +33,7 @@ describe('FeePayerBalanceEvictionRule', () => { claimAmount?: bigint; feePayer?: string; } = {}, - ): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee: opts.priorityFee ?? 100n, - feePayer: opts.feePayer ?? feePayer1, - claimAmount: opts.claimAmount ?? 0n, - feeLimit: opts.feeLimit ?? 100n, - nullifiers: [`0x${txHash.slice(2)}null1`], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + ) => stubTxMetaData(txHash, { feePayer: feePayer1, ...opts }); // Create mock pool operations const createPoolOps = (txsByFeePayer: Map): PoolOperations => { @@ -144,8 +132,8 @@ describe('FeePayerBalanceEvictionRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); // Low priority evicted - expect(deleteTxsMock).toHaveBeenCalledWith(['0x1111'], 'FeePayerBalanceEviction'); + expect(result.txsEvicted).toEqual([lowPriorityMeta.txHash]); // Low priority evicted + expect(deleteTxsMock).toHaveBeenCalledWith([lowPriorityMeta.txHash], 'FeePayerBalanceEviction'); }); it('evicts multiple low-priority txs when balance is insufficient', async () => { @@ -160,7 +148,7 @@ describe('FeePayerBalanceEvictionRule', () => { const context: EvictionContext = { event: EvictionEvent.TXS_ADDED, - newTxHashes: ['0x1111', '0x2222', '0x3333'], + newTxHashes: [lowMeta.txHash, medMeta.txHash, highMeta.txHash], feePayers: [feePayer1], }; @@ -168,9 +156,9 @@ describe('FeePayerBalanceEvictionRule', () => { expect(result.success).toBe(true); // Both low and medium priority should be evicted - expect(result.txsEvicted).toContain('0x1111'); - expect(result.txsEvicted).toContain('0x2222'); - expect(result.txsEvicted).not.toContain('0x3333'); + expect(result.txsEvicted).toContain(lowMeta.txHash); + expect(result.txsEvicted).toContain(medMeta.txHash); + expect(result.txsEvicted).not.toContain(highMeta.txHash); }); it('priority ordering is correct - highest priority gets funded first', async () => { @@ -186,15 +174,15 @@ describe('FeePayerBalanceEvictionRule', () => { const context: EvictionContext = { event: EvictionEvent.TXS_ADDED, - newTxHashes: ['0xaaaa', '0xbbbb', '0xcccc'], + newTxHashes: [tx10.txHash, tx50.txHash, tx100.txHash], feePayers: [feePayer1], }; const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0xaaaa']); // Only lowest priority evicted - expect(deleteTxsMock).toHaveBeenCalledWith(['0xaaaa'], 'FeePayerBalanceEviction'); + expect(result.txsEvicted).toEqual([tx10.txHash]); // Only lowest priority evicted + expect(deleteTxsMock).toHaveBeenCalledWith([tx10.txHash], 'FeePayerBalanceEviction'); }); it('considers claim amount when calculating available balance', async () => { @@ -249,7 +237,7 @@ describe('FeePayerBalanceEvictionRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x2222']); // Low priority evicted + expect(result.txsEvicted).toEqual([lowMeta.txHash]); // Low priority evicted }); it('handles zero balance', async () => { @@ -268,7 +256,7 @@ describe('FeePayerBalanceEvictionRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); + expect(result.txsEvicted).toEqual([meta.txHash]); }); it('handles empty fee payers list', async () => { @@ -347,7 +335,7 @@ describe('FeePayerBalanceEvictionRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); + expect(result.txsEvicted).toEqual([lowMeta.txHash]); }); }); @@ -376,7 +364,7 @@ describe('FeePayerBalanceEvictionRule', () => { await rule.evict(context, pool); - expect(mockWorldState.syncImmediate).toHaveBeenCalledWith(BlockNumber(3)); + expect(mockWorldState.syncImmediate).toHaveBeenCalledWith(); expect(mockWorldState.getSnapshot).toHaveBeenCalledWith(BlockNumber(3)); }); @@ -396,7 +384,7 @@ describe('FeePayerBalanceEvictionRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); + expect(result.txsEvicted).toEqual([meta.txHash]); }); }); @@ -474,7 +462,7 @@ describe('FeePayerBalanceEvictionRule', () => { const context: EvictionContext = { event: EvictionEvent.TXS_ADDED, - newTxHashes: ['0xaaaa', '0xbbbb', '0xcccc'], + newTxHashes: [tx1.txHash, tx2.txHash, tx3.txHash], feePayers: [feePayer1], }; @@ -482,10 +470,10 @@ describe('FeePayerBalanceEvictionRule', () => { expect(result.success).toBe(true); // tx1 (lowest priority) should be evicted - expect(result.txsEvicted).toEqual(['0xaaaa']); + expect(result.txsEvicted).toEqual([tx1.txHash]); // tx2 and tx3 should be kept - expect(result.txsEvicted).not.toContain('0xbbbb'); - expect(result.txsEvicted).not.toContain('0xcccc'); + expect(result.txsEvicted).not.toContain(tx2.txHash); + expect(result.txsEvicted).not.toContain(tx3.txHash); }); it('uses txHash as tiebreaker when priorities are equal', async () => { diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts index 969fd127b1d1..6bd67d2929d0 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts @@ -34,7 +34,7 @@ export class FeePayerBalanceEvictionRule implements EvictionRule { } if (context.event === EvictionEvent.CHAIN_PRUNED) { - await this.worldState.syncImmediate(context.blockNumber); + await this.worldState.syncImmediate(); const feePayers = pool.getPendingFeePayers(); return await this.evictForFeePayers(feePayers, this.worldState.getSnapshot(context.blockNumber), pool); } diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.test.ts index af21423f39e2..5b8fd070dd8f 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.test.ts @@ -1,4 +1,4 @@ -import { type TxMetaData, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, stubTxMetaData } from '../tx_metadata.js'; import { FeePayerBalancePreAddRule } from './fee_payer_balance_pre_add_rule.js'; import { type PreAddPoolAccess, TxPoolRejectionCode } from './interfaces.js'; @@ -14,19 +14,7 @@ describe('FeePayerBalancePreAddRule', () => { claimAmount?: bigint; feePayer?: string; } = {}, - ): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee: opts.priorityFee ?? 100n, - feePayer: opts.feePayer ?? '0xfeepayer', - claimAmount: opts.claimAmount ?? 0n, - feeLimit: opts.feeLimit ?? 100n, - nullifiers: [`0x${txHash.slice(2)}null1`], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + ) => stubTxMetaData(txHash, opts); // Mock pool access with configurable behavior const createPoolAccess = (balance: bigint, existingTxs: TxMetaData[] = []): PreAddPoolAccess => ({ @@ -127,7 +115,7 @@ describe('FeePayerBalancePreAddRule', () => { const result = await rule.check(incomingMeta, poolAccess); expect(result.shouldIgnore).toBe(false); - expect(result.txHashesToEvict).toContain('0x2222'); + expect(result.txHashesToEvict).toContain(existingMeta.txHash); }); it('evicts multiple lower-priority txs when high-priority tx is added', async () => { @@ -141,8 +129,8 @@ describe('FeePayerBalancePreAddRule', () => { const result = await rule.check(incomingMeta, poolAccess); expect(result.shouldIgnore).toBe(false); - expect(result.txHashesToEvict).toContain('0x2222'); - expect(result.txHashesToEvict).toContain('0x3333'); + expect(result.txHashesToEvict).toContain(existingMeta1.txHash); + expect(result.txHashesToEvict).toContain(existingMeta2.txHash); }); it('handles priority ordering correctly - highest priority gets funded first', async () => { @@ -157,9 +145,9 @@ describe('FeePayerBalancePreAddRule', () => { const result = await rule.check(incomingMeta, poolAccess); expect(result.shouldIgnore).toBe(false); - expect(result.txHashesToEvict).toContain('0x2222'); // Low priority evicted - expect(result.txHashesToEvict).not.toContain('0x4444'); // High priority kept - expect(result.txHashesToEvict).not.toContain('0x3333'); // Med priority kept + expect(result.txHashesToEvict).toContain(lowPriorityMeta.txHash); // Low priority evicted + expect(result.txHashesToEvict).not.toContain(highPriorityMeta.txHash); // High priority kept + expect(result.txHashesToEvict).not.toContain(medPriorityMeta.txHash); // Med priority kept }); }); @@ -245,7 +233,7 @@ describe('FeePayerBalancePreAddRule', () => { expect(result.shouldIgnore).toBe(false); expect(result.txHashesToEvict).toHaveLength(1); - expect(result.txHashesToEvict[0]).toEqual('0x2222'); + expect(result.txHashesToEvict[0]).toEqual(existingMeta.txHash); }); it('returns empty eviction list when no evictions needed', async () => { diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts index 0cdebb94948d..fee5bf80d4e5 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts @@ -35,6 +35,7 @@ export class FeePayerBalancePreAddRule implements PreAddRule { // Create combined list with incoming tx const allTxs: Array<{ txHash: string; + txHashBigInt: bigint; priorityFee: bigint; feeLimit: bigint; claimAmount: bigint; @@ -42,6 +43,7 @@ export class FeePayerBalancePreAddRule implements PreAddRule { }> = [ ...existingTxs.map(t => ({ txHash: t.txHash, + txHashBigInt: t.txHashBigInt, priorityFee: t.priorityFee, feeLimit: t.feeLimit, claimAmount: t.claimAmount, @@ -49,6 +51,7 @@ export class FeePayerBalancePreAddRule implements PreAddRule { })), { txHash: incomingMeta.txHash, + txHashBigInt: incomingMeta.txHashBigInt, priorityFee: incomingMeta.priorityFee, feeLimit: incomingMeta.feeLimit, claimAmount: incomingMeta.claimAmount, diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.test.ts index 8c16d90d9c00..73cc569a6111 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.test.ts @@ -3,7 +3,7 @@ import { BlockHeader } from '@aztec/stdlib/tx'; import { jest } from '@jest/globals'; -import { type TxMetaData, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, stubTxMetaData } from '../tx_metadata.js'; import type { EvictionContext, PoolOperations } from './interfaces.js'; import { EvictionEvent } from './interfaces.js'; import { InvalidTxsAfterMiningRule } from './invalid_txs_after_mining_rule.js'; @@ -24,23 +24,7 @@ describe('InvalidTxsAfterMiningRule', () => { nullifiers?: string[]; expirationTimestamp?: bigint; } = {}, - ): TxMetaData => { - const nullifiers = opts.nullifiers ?? [`0x${txHash.slice(2)}null1`]; - const expirationTimestamp = opts.expirationTimestamp ?? DEFAULT_EXPIRATION_TIMESTAMP; - return { - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee: 100n, - feePayer: '0xfeepayer', - claimAmount: 0n, - feeLimit: 100n, - nullifiers, - expirationTimestamp, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData({ expirationTimestamp }), - }; - }; + ) => stubTxMetaData(txHash, { expirationTimestamp: DEFAULT_EXPIRATION_TIMESTAMP, ...opts }); // Create mock pool operations const createPoolOps = (pendingTxs: TxMetaData[]): PoolOperations => { @@ -122,8 +106,8 @@ describe('InvalidTxsAfterMiningRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); // Only tx1 has duplicate nullifier - expect(deleteTxsMock).toHaveBeenCalledWith(['0x1111'], 'InvalidTxsAfterMining'); + expect(result.txsEvicted).toEqual([tx1.txHash]); // Only tx1 has duplicate nullifier + expect(deleteTxsMock).toHaveBeenCalledWith([tx1.txHash], 'InvalidTxsAfterMining'); }); it('evicts transactions with expired timestamps', async () => { @@ -142,8 +126,8 @@ describe('InvalidTxsAfterMiningRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); // Only tx1 is expired - expect(deleteTxsMock).toHaveBeenCalledWith(['0x1111'], 'InvalidTxsAfterMining'); + expect(result.txsEvicted).toEqual([tx1.txHash]); // Only tx1 is expired + expect(deleteTxsMock).toHaveBeenCalledWith([tx1.txHash], 'InvalidTxsAfterMining'); }); it('evicts transactions with timestamp equal to block timestamp', async () => { @@ -162,8 +146,8 @@ describe('InvalidTxsAfterMiningRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); // tx1 has timestamp <= block timestamp - expect(deleteTxsMock).toHaveBeenCalledWith(['0x1111'], 'InvalidTxsAfterMining'); + expect(result.txsEvicted).toEqual([tx1.txHash]); // tx1 has timestamp <= block timestamp + expect(deleteTxsMock).toHaveBeenCalledWith([tx1.txHash], 'InvalidTxsAfterMining'); }); it('handles transactions with both duplicate nullifiers and expired timestamps', async () => { @@ -182,8 +166,8 @@ describe('InvalidTxsAfterMiningRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); - expect(deleteTxsMock).toHaveBeenCalledWith(['0x1111'], 'InvalidTxsAfterMining'); + expect(result.txsEvicted).toEqual([tx1.txHash]); + expect(deleteTxsMock).toHaveBeenCalledWith([tx1.txHash], 'InvalidTxsAfterMining'); }); it('handles empty pending transactions list', async () => { @@ -222,7 +206,7 @@ describe('InvalidTxsAfterMiningRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toEqual(['0x1111']); + expect(result.txsEvicted).toEqual([tx1.txHash]); }); it('evicts all matching transactions when multiple share nullifiers with mined block', async () => { @@ -242,9 +226,9 @@ describe('InvalidTxsAfterMiningRule', () => { const result = await rule.evict(context, pool); expect(result.success).toBe(true); - expect(result.txsEvicted).toContain('0x1111'); - expect(result.txsEvicted).toContain('0x2222'); - expect(result.txsEvicted).not.toContain('0x3333'); + expect(result.txsEvicted).toContain(tx1.txHash); + expect(result.txsEvicted).toContain(tx2.txHash); + expect(result.txsEvicted).not.toContain(tx3.txHash); }); it('handles error from deleteTxs operation', async () => { diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.test.ts index 0d02b3431f88..c8ccb70890bc 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.test.ts @@ -7,7 +7,7 @@ import { BlockHeader } from '@aztec/stdlib/tx'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { type TxMetaData, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, stubTxMetaData } from '../tx_metadata.js'; import type { EvictionContext, PoolOperations } from './interfaces.js'; import { EvictionEvent } from './interfaces.js'; import { InvalidTxsAfterReorgRule } from './invalid_txs_after_reorg_rule.js'; @@ -21,19 +21,8 @@ describe('InvalidTxsAfterReorgRule', () => { let deleteTxsMock: jest.MockedFunction; // Helper to create TxMetaData for testing - const createMeta = (txHash: string, anchorBlockHeaderHash: string): TxMetaData => ({ - txHash, - anchorBlockHeaderHash, - priorityFee: 100n, - feePayer: '0xfeepayer', - claimAmount: 0n, - feeLimit: 100n, - nullifiers: [`0x${txHash.slice(2)}null1`], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const createMeta = (txHash: string, anchorBlockHeaderHash: string) => + stubTxMetaData(txHash, { anchorBlockHeaderHash }); // Create mock pool operations const createPoolOps = (pendingTxs: TxMetaData[]): PoolOperations => { @@ -134,10 +123,10 @@ describe('InvalidTxsAfterReorgRule', () => { expect(result.success).toBe(true); // Both txs reference pruned blocks (default mock returns undefined) - expect(result.txsEvicted).toContain('0x1111'); - expect(result.txsEvicted).toContain('0x2222'); + expect(result.txsEvicted).toContain(tx1.txHash); + expect(result.txsEvicted).toContain(tx2.txHash); // Ensure syncImmediate is called before accessing the world state snapshot - expect(worldState.syncImmediate).toHaveBeenCalledWith(BlockNumber(1)); + expect(worldState.syncImmediate).toHaveBeenCalledWith(); }); it('handles large number of transactions efficiently', async () => { @@ -201,9 +190,9 @@ describe('InvalidTxsAfterReorgRule', () => { expect(result.success).toBe(true); expect(result.txsEvicted).toHaveLength(3); - expect(result.txsEvicted).toContain('0x1111'); - expect(result.txsEvicted).toContain('0x2222'); - expect(result.txsEvicted).toContain('0x3333'); + expect(result.txsEvicted).toContain(tx1.txHash); + expect(result.txsEvicted).toContain(tx2.txHash); + expect(result.txsEvicted).toContain(tx3.txHash); // Only one unique block hash to look up expect(db.findLeafIndices).toHaveBeenCalledTimes(1); const calledHashes = db.findLeafIndices.mock.calls[0][1] as Fr[]; @@ -232,9 +221,9 @@ describe('InvalidTxsAfterReorgRule', () => { expect(result.success).toBe(true); expect(result.txsEvicted).toHaveLength(1); - expect(result.txsEvicted).toContain('0x2222'); - expect(result.txsEvicted).not.toContain('0x1111'); - expect(result.txsEvicted).not.toContain('0x3333'); + expect(result.txsEvicted).toContain(tx2.txHash); + expect(result.txsEvicted).not.toContain(tx1.txHash); + expect(result.txsEvicted).not.toContain(tx3.txHash); }); it('handles mix of shared and unique block hashes with some valid and some pruned', async () => { @@ -263,11 +252,11 @@ describe('InvalidTxsAfterReorgRule', () => { expect(result.success).toBe(true); expect(result.txsEvicted).toHaveLength(3); - expect(result.txsEvicted).toContain('0x3333'); - expect(result.txsEvicted).toContain('0x4444'); - expect(result.txsEvicted).toContain('0x5555'); - expect(result.txsEvicted).not.toContain('0x1111'); - expect(result.txsEvicted).not.toContain('0x2222'); + expect(result.txsEvicted).toContain(tx3.txHash); + expect(result.txsEvicted).toContain(tx4.txHash); + expect(result.txsEvicted).toContain(tx5.txHash); + expect(result.txsEvicted).not.toContain(tx1.txHash); + expect(result.txsEvicted).not.toContain(tx2.txHash); expect(db.findLeafIndices).toHaveBeenCalledTimes(1); const calledHashes = db.findLeafIndices.mock.calls[0][1] as Fr[]; expect(calledHashes).toHaveLength(3); diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts index 72462a8a687f..782d1beb5cb6 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts @@ -45,8 +45,8 @@ export class InvalidTxsAfterReorgRule implements EvictionRule { txsByBlockHash.get(blockHashStr)!.push(meta.txHash); } - // Ensure world state is synced to this block before accessing the snapshot - await this.worldState.syncImmediate(context.blockNumber); + // Sync without a block number to ensure the world state processes the prune event. + await this.worldState.syncImmediate(); const db = this.worldState.getSnapshot(context.blockNumber); // Check which blocks exist in the archive diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.test.ts index 93744abc603b..3915b1ca6652 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.test.ts @@ -43,7 +43,7 @@ describe('LowPriorityEvictionRule', () => { }); describe('evict method', () => { - describe('non-TXS_ADDED events', () => { + describe('BLOCK_MINED events', () => { it('returns empty result for BLOCK_MINED event', async () => { const context: EvictionContext = { event: EvictionEvent.BLOCK_MINED, @@ -60,8 +60,45 @@ describe('LowPriorityEvictionRule', () => { txsEvicted: [], }); }); + }); + + describe('CHAIN_PRUNED events', () => { + it('evicts transactions when pool is over limit', async () => { + rule.updateConfig({ maxPendingTxCount: 2 }); + pool = createPoolOps(4, ['0x3333', '0x4444']); + + const context: EvictionContext = { + event: EvictionEvent.CHAIN_PRUNED, + blockNumber: BlockNumber(1), + }; + + const result = await rule.evict(context, pool); + + expect(result.success).toBe(true); + expect(result.txsEvicted).toEqual(['0x3333', '0x4444']); + expect(deleteTxsMock).toHaveBeenCalledWith(['0x3333', '0x4444'], 'LowPriorityEviction'); + }); + + it('returns empty result when pool is under limit', async () => { + pool = createPoolOps(50); + + const context: EvictionContext = { + event: EvictionEvent.CHAIN_PRUNED, + blockNumber: BlockNumber(1), + }; + + const result = await rule.evict(context, pool); + + expect(result).toEqual({ + reason: 'low_priority', + success: true, + txsEvicted: [], + }); + }); + + it('returns empty result when maxPoolSize is 0', async () => { + rule.updateConfig({ maxPendingTxCount: 0 }); - it('returns empty result for CHAIN_PRUNED event', async () => { const context: EvictionContext = { event: EvictionEvent.CHAIN_PRUNED, blockNumber: BlockNumber(1), @@ -75,6 +112,23 @@ describe('LowPriorityEvictionRule', () => { txsEvicted: [], }); }); + + it('handles error from pool operations', async () => { + rule.updateConfig({ maxPendingTxCount: 1 }); + pool = createPoolOps(2, ['0x3333']); + deleteTxsMock.mockRejectedValue(new Error('Test error')); + + const context: EvictionContext = { + event: EvictionEvent.CHAIN_PRUNED, + blockNumber: BlockNumber(1), + }; + + const result = await rule.evict(context, pool); + + expect(result.success).toBe(false); + expect(result.txsEvicted).toEqual([]); + expect(result.error?.message).toContain('Failed to evict low priority txs'); + }); }); describe('TXS_ADDED events', () => { diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts index 047695aaf681..283c9fe3467b 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts @@ -5,7 +5,7 @@ import { EvictionEvent } from './interfaces.js'; /** * Eviction rule that removes low-priority transactions when the pool exceeds configured limits. - * Only triggers on TXS_ADDED events. + * Triggers on TXS_ADDED and CHAIN_PRUNED events. */ export class LowPriorityEvictionRule implements EvictionRule { public readonly name = 'LowPriorityEviction'; @@ -18,7 +18,7 @@ export class LowPriorityEvictionRule implements EvictionRule { } async evict(context: EvictionContext, pool: PoolOperations): Promise { - if (context.event !== EvictionEvent.TXS_ADDED) { + if (context.event !== EvictionEvent.TXS_ADDED && context.event !== EvictionEvent.CHAIN_PRUNED) { return { reason: 'low_priority', success: true, @@ -51,15 +51,19 @@ export class LowPriorityEvictionRule implements EvictionRule { this.log.info(`Evicting low priority txs. Pending tx count above limit: ${currentTxCount} > ${this.maxPoolSize}`); const numberToEvict = currentTxCount - this.maxPoolSize; const txsToEvict = pool.getLowestPriorityPending(numberToEvict); - const toEvictSet = new Set(txsToEvict); - const numNewTxsEvicted = context.newTxHashes.filter(newTxHash => toEvictSet.has(newTxHash)).length; if (txsToEvict.length > 0) { - this.log.info(`Evicted ${txsToEvict.length} low priority txs, including ${numNewTxsEvicted} newly added txs`); + if (context.event === EvictionEvent.TXS_ADDED) { + const toEvictSet = new Set(txsToEvict); + const numNewTxsEvicted = context.newTxHashes.filter(newTxHash => toEvictSet.has(newTxHash)).length; + this.log.info(`Evicted ${txsToEvict.length} low priority txs, including ${numNewTxsEvicted} newly added txs`); + } else { + this.log.info(`Evicted ${txsToEvict.length} low priority txs after chain prune`); + } await pool.deleteTxs(txsToEvict, this.name); } - this.log.debug(`Evicted ${txsToEvict.length} low priority txs, including ${numNewTxsEvicted} newly added txs`, { + this.log.debug(`Evicted ${txsToEvict.length} low priority txs`, { txHashes: txsToEvict, }); diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.test.ts index b7173ba8bdbe..fd66a0df4aee 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.test.ts @@ -1,4 +1,4 @@ -import { type TxMetaData, comparePriority, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, comparePriority, stubTxMetaData } from '../tx_metadata.js'; import { type PreAddContext, type PreAddPoolAccess, TxPoolRejectionCode } from './interfaces.js'; import { LowPriorityPreAddRule } from './low_priority_pre_add_rule.js'; @@ -6,19 +6,7 @@ describe('LowPriorityPreAddRule', () => { let rule: LowPriorityPreAddRule; // Helper to create TxMetaData for testing - const createMeta = (txHash: string, priorityFee: bigint): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee, - feePayer: '0xfeepayer', - claimAmount: 0n, - feeLimit: 100n, - nullifiers: [`0x${txHash.slice(2)}null1`], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const createMeta = (txHash: string, priorityFee: bigint) => stubTxMetaData(txHash, { priorityFee }); // Mock pool access with configurable behavior const createPoolAccess = (pendingCount: number, lowestPriorityTx?: TxMetaData): PreAddPoolAccess => ({ @@ -88,7 +76,7 @@ describe('LowPriorityPreAddRule', () => { const result = await rule.check(incomingMeta, poolAccess); expect(result.shouldIgnore).toBe(false); - expect(result.txHashesToEvict).toContain('0x2222'); + expect(result.txHashesToEvict).toContain(lowestPriorityMeta.txHash); expect(result.txHashesToEvict).toHaveLength(1); }); @@ -199,12 +187,12 @@ describe('LowPriorityPreAddRule', () => { // Without feeOnly const result1 = await rule.check(incomingMeta, poolAccess); expect(result1.shouldIgnore).toBe(false); - expect(result1.txHashesToEvict).toContain('0x2222'); + expect(result1.txHashesToEvict).toContain(lowestPriorityMeta.txHash); // With feeOnly const result2 = await rule.check(incomingMeta, poolAccess, { feeComparisonOnly: true }); expect(result2.shouldIgnore).toBe(false); - expect(result2.txHashesToEvict).toContain('0x2222'); + expect(result2.txHashesToEvict).toContain(lowestPriorityMeta.txHash); }); it('lower fee is always ignored regardless of feeOnly flag', async () => { diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.test.ts index f5f08c1ece36..5108966f9047 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.test.ts @@ -1,4 +1,4 @@ -import { type TxMetaData, stubTxMetaValidationData } from '../tx_metadata.js'; +import { type TxMetaData, stubTxMetaData } from '../tx_metadata.js'; import type { PreAddPoolAccess } from './interfaces.js'; import { NullifierConflictRule } from './nullifier_conflict_rule.js'; @@ -7,23 +7,8 @@ describe('NullifierConflictRule', () => { let rule: NullifierConflictRule; // Helper to create TxMetaData for testing - const createMeta = ( - txHash: string, - priorityFee: bigint, - nullifiers: string[] = [`0x${txHash.slice(2)}null1`], - ): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x1234', - priorityFee, - feePayer: '0xfeepayer', - claimAmount: 0n, - feeLimit: 1000n, - nullifiers, - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const createMeta = (txHash: string, priorityFee: bigint, nullifiers?: string[]) => + stubTxMetaData(txHash, { priorityFee, feeLimit: 1000n, ...(nullifiers ? { nullifiers } : {}) }); // Mock pool access with configurable behavior const createPoolAccess = ( diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/index.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/index.ts index 391e7edccab0..cee49474dcb3 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/index.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/index.ts @@ -7,6 +7,6 @@ export { type PoolReadAccess, DEFAULT_TX_POOL_V2_CONFIG, } from './interfaces.js'; -export { type TxMetaData, type TxState, buildTxMetaData, comparePriority } from './tx_metadata.js'; +export { type TxMetaData, type TxState, buildTxMetaData, comparePriority, stubTxMetaData } from './tx_metadata.js'; export { TxArchive } from './archive/index.js'; export { DeletedPool } from './deleted_pool.js'; diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/interfaces.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/interfaces.ts index 52eb176d7cb8..5bbf06a16676 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/interfaces.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/interfaces.ts @@ -107,12 +107,12 @@ export interface TxPoolV2 extends TypedEventEmitter { addPendingTxs(txs: Tx[], opts?: { source?: string; feeComparisonOnly?: boolean }): Promise; /** - * Checks if a transaction can be added without modifying the pool. - * Performs the same validation as addPendingTxs but doesn't persist changes. + * Checks if the pool would accept a transaction without modifying state. + * Used as a pre-check before expensive proof verification. * @param tx - Transaction to check - * @returns Result: 'accepted', 'ignored' (if already in pool or undesirable), or 'rejected' (if validation fails) + * @returns 'accepted' if the pool would accept, 'ignored' if already in pool or undesirable */ - canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'>; + canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'>; /** * Adds transactions as immediately protected for a given slot. diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.test.ts index 63417fa8559a..d139138d5489 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.test.ts @@ -1,13 +1,7 @@ import { mockTx } from '@aztec/stdlib/testing'; import { TxPoolRejectionCode } from './eviction/interfaces.js'; -import { - type TxMetaData, - buildTxMetaData, - checkNullifierConflict, - comparePriority, - stubTxMetaValidationData, -} from './tx_metadata.js'; +import { buildTxMetaData, checkNullifierConflict, comparePriority, stubTxMetaData } from './tx_metadata.js'; describe('TxMetaData', () => { describe('buildTxMetaData', () => { @@ -16,6 +10,7 @@ describe('TxMetaData', () => { const meta = await buildTxMetaData(tx); expect(meta.txHash).toBe(tx.getTxHash().toString()); + expect(meta.txHashBigInt).toBe(tx.getTxHash().toBigInt()); expect(meta.anchorBlockHeaderHash).toBe((await tx.data.constants.anchorBlockHeader.hash()).toString()); expect(meta.feePayer).toBe(tx.data.feePayer.toString()); expect(meta.expirationTimestamp).toBe(tx.data.expirationTimestamp); @@ -36,22 +31,39 @@ describe('TxMetaData', () => { expect(nullifier).toMatch(/^0x[0-9a-f]+$/i); } }); + + it('sets forPublic to truthy for public transactions', async () => { + const tx = await mockTx(1, { numberOfNonRevertiblePublicCallRequests: 1 }); + expect(tx.data.forPublic).toBeDefined(); + const meta = await buildTxMetaData(tx); + + expect(meta.data.forPublic).toBeTruthy(); + }); + + it('sets forPublic to falsy for private transactions', async () => { + const tx = await mockTx(1, { + numberOfNonRevertiblePublicCallRequests: 0, + numberOfRevertiblePublicCallRequests: 0, + hasPublicTeardownCallRequest: false, + }); + expect(tx.data.forPublic).not.toBeDefined(); + const meta = await buildTxMetaData(tx); + + expect(meta.data.forPublic).toBeFalsy(); + }); + + it('preserves gas limits in validation data', async () => { + const tx = await mockTx(1); + const meta = await buildTxMetaData(tx); + + expect(meta.data.constants.txContext.gasSettings.gasLimits).toEqual( + tx.data.constants.txContext.gasSettings.gasLimits, + ); + }); }); describe('comparePriority', () => { - const makeMeta = (fee: bigint, txHash = '0x1234'): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x5678', - priorityFee: fee, - feePayer: '0xabcd', - claimAmount: 0n, - feeLimit: 1000n, - nullifiers: [], - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const makeMeta = (fee: bigint, txHash = '0x1234') => stubTxMetaData(txHash, { priorityFee: fee, nullifiers: [] }); it('returns negative when first has lower priority fee', () => { expect(comparePriority(makeMeta(100n), makeMeta(200n))).toBe(-1); @@ -73,19 +85,8 @@ describe('TxMetaData', () => { }); describe('checkNullifierConflict', () => { - const makeMeta = (txHash: string, priorityFee: bigint, nullifiers: string[]): TxMetaData => ({ - txHash, - anchorBlockHeaderHash: '0x5678', - priorityFee, - feePayer: '0xabcd', - claimAmount: 0n, - feeLimit: 1000n, - nullifiers, - expirationTimestamp: 0n, - receivedAt: 0, - estimatedSizeBytes: 0, - data: stubTxMetaValidationData(), - }); + const makeMeta = (txHash: string, priorityFee: bigint, nullifiers: string[]) => + stubTxMetaData(txHash, { priorityFee, nullifiers }); it('returns no conflict when nullifiers do not overlap', () => { const incoming = makeMeta('0x1111', 100n, ['0xnull1', '0xnull2']); diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.ts index 1649075062a1..316f551bcc6c 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_metadata.ts @@ -2,7 +2,8 @@ import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { BlockHash, type L2BlockId } from '@aztec/stdlib/block'; -import type { Tx } from '@aztec/stdlib/tx'; +import { Gas } from '@aztec/stdlib/gas'; +import { type Tx, TxHash } from '@aztec/stdlib/tx'; import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js'; import { getTxPriorityFee } from '../tx_pool/priority.js'; @@ -12,6 +13,8 @@ import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js export type TxMetaValidationData = { getNonEmptyNullifiers(): Fr[]; expirationTimestamp: bigint; + /** Whether the tx has public calls. Used to select the correct L2 gas minimum. */ + forPublic?: unknown; constants: { anchorBlockHeader: { hash(): Promise; @@ -19,6 +22,9 @@ export type TxMetaValidationData = { blockNumber: BlockNumber; }; }; + txContext: { + gasSettings: { gasLimits: Gas }; + }; }; }; @@ -34,6 +40,9 @@ export type TxMetaData = { /** The transaction hash as hex string */ readonly txHash: string; + /** The transaction hash as bigint (for efficient Fr conversion in comparisons) */ + readonly txHashBigInt: bigint; + /** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */ minedL2BlockId?: L2BlockId; @@ -77,7 +86,9 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted'; * Fr values are captured in closures for zero-cost re-validation. */ export async function buildTxMetaData(tx: Tx): Promise { - const txHash = tx.getTxHash().toString(); + const txHashObj = tx.getTxHash(); + const txHash = txHashObj.toString(); + const txHashBigInt = txHashObj.toBigInt(); const nullifierFrs = tx.data.getNonEmptyNullifiers(); const nullifiers = nullifierFrs.map(n => n.toString()); const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash(); @@ -93,6 +104,7 @@ export async function buildTxMetaData(tx: Tx): Promise { return { txHash, + txHashBigInt, anchorBlockHeaderHash, priorityFee, feePayer, @@ -105,11 +117,15 @@ export async function buildTxMetaData(tx: Tx): Promise { data: { getNonEmptyNullifiers: () => nullifierFrs, expirationTimestamp, + forPublic: !!tx.data.forPublic, constants: { anchorBlockHeader: { hash: () => Promise.resolve(anchorBlockHeaderHashFr), globalVariables: { blockNumber: anchorBlockNumber }, }, + txContext: { + gasSettings: { gasLimits: tx.data.constants.txContext.gasSettings.gasLimits }, + }, }, }, }; @@ -124,11 +140,11 @@ const HEX_STRING_BYTES = 98; const BIGINT_BYTES = 32; const FR_BYTES = 80; // Fixed cost: object shell + txHash + anchorBlockHeaderHash + feePayer (3 hex strings) -// + priorityFee + claimAmount + feeLimit + includeByTimestamp (4 bigints) +// + txHashBigInt + priorityFee + claimAmount + feeLimit + includeByTimestamp (5 bigints) // + receivedAt (number, 8 bytes) + estimatedSizeBytes (number, 8 bytes) // + data closure object (~OBJECT_OVERHEAD + anchorBlockHeaderHashFr Fr + anchorBlockNumber number) const FIXED_METADATA_BYTES = - OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 4 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8; + OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 5 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8; /** Estimates the in-memory size of a TxMetaData object based on the number of nullifiers. */ function estimateTxMetaDataSize(nullifierCount: number): number { @@ -136,8 +152,13 @@ function estimateTxMetaDataSize(nullifierCount: number): number { return FIXED_METADATA_BYTES + nullifierCount * (HEX_STRING_BYTES + FR_BYTES); } +/** Converts a txHash bigint back to the canonical 0x-prefixed 64-char hex string. */ +export function txHashFromBigInt(value: bigint): string { + return TxHash.fromBigInt(value).toString(); +} + /** Minimal fields required for priority comparison. */ -type PriorityComparable = Pick; +type PriorityComparable = Pick; /** * Compares two priority fees in ascending order. @@ -152,10 +173,8 @@ export function compareFee(a: bigint, b: bigint): number { * Uses field element comparison for deterministic ordering. * Returns negative if a < b, positive if a > b, 0 if equal. */ -export function compareTxHash(a: string, b: string): number { - const fieldA = Fr.fromHexString(a); - const fieldB = Fr.fromHexString(b); - return fieldA.cmp(fieldB); +export function compareTxHash(a: bigint, b: bigint): number { + return Fr.cmpAsBigInt(a, b); } /** @@ -168,7 +187,7 @@ export function comparePriority(a: PriorityComparable, b: PriorityComparable): n if (feeComparison !== 0) { return feeComparison; } - return compareTxHash(a.txHash, b.txHash); + return compareTxHash(a.txHashBigInt, b.txHashBigInt); } /** @@ -237,6 +256,42 @@ export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigi hash: () => Promise.resolve(new BlockHash(Fr.ZERO)), globalVariables: { blockNumber: BlockNumber(0) }, }, + txContext: { + gasSettings: { gasLimits: Gas.empty() }, + }, }, }; } + +/** Creates a stub TxMetaData for tests. All fields have sensible defaults and can be overridden. */ +export function stubTxMetaData( + txHash: string, + overrides: { + priorityFee?: bigint; + feePayer?: string; + claimAmount?: bigint; + feeLimit?: bigint; + nullifiers?: string[]; + expirationTimestamp?: bigint; + anchorBlockHeaderHash?: string; + } = {}, +): TxMetaData { + const txHashBigInt = Fr.fromHexString(txHash).toBigInt(); + // Normalize to canonical zero-padded hex so txHashFromBigInt(txHashBigInt) === normalizedTxHash + const normalizedTxHash = txHashFromBigInt(txHashBigInt); + const expirationTimestamp = overrides.expirationTimestamp ?? 0n; + return { + txHash: normalizedTxHash, + txHashBigInt, + anchorBlockHeaderHash: overrides.anchorBlockHeaderHash ?? '0x1234', + priorityFee: overrides.priorityFee ?? 100n, + feePayer: overrides.feePayer ?? '0xfeepayer', + claimAmount: overrides.claimAmount ?? 0n, + feeLimit: overrides.feeLimit ?? 100n, + nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`], + expirationTimestamp, + receivedAt: 0, + estimatedSizeBytes: 0, + data: stubTxMetaValidationData({ expirationTimestamp }), + }; +} diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_indices.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_indices.ts index a9a368dce37c..42dd87db5cbf 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_indices.ts @@ -1,7 +1,7 @@ import { SlotNumber } from '@aztec/foundation/branded-types'; import type { L2BlockId } from '@aztec/stdlib/block'; -import { type TxMetaData, type TxState, compareFee, compareTxHash } from './tx_metadata.js'; +import { type TxMetaData, type TxState, compareFee, compareTxHash, txHashFromBigInt } from './tx_metadata.js'; /** * Manages in-memory indices for the transaction pool. @@ -22,8 +22,8 @@ export class TxPoolIndices { #nullifierToTxHash: Map = new Map(); /** Fee payer to txHashes index (pending txs only) */ #feePayerToTxHashes: Map> = new Map(); - /** Pending txHashes grouped by priority fee */ - #pendingByPriority: Map> = new Map(); + /** Pending txHash bigints grouped by priority fee */ + #pendingByPriority: Map> = new Map(); /** Protected transactions: txHash -> slotNumber */ #protectedTransactions: Map = new Map(); @@ -73,17 +73,17 @@ export class TxPoolIndices { * @param order - 'desc' for highest priority first, 'asc' for lowest priority first */ *iteratePendingByPriority(order: 'asc' | 'desc', filter?: (hash: string) => boolean): Generator { - // Use compareFee from tx_metadata, swap args for descending order const feeCompareFn = order === 'desc' ? (a: bigint, b: bigint) => compareFee(b, a) : compareFee; - const hashCompareFn = order === 'desc' ? (a: string, b: string) => compareTxHash(b, a) : compareTxHash; + const hashCompareFn = + order === 'desc' ? (a: bigint, b: bigint) => compareTxHash(b, a) : (a: bigint, b: bigint) => compareTxHash(a, b); const sortedFees = [...this.#pendingByPriority.keys()].sort(feeCompareFn); for (const fee of sortedFees) { const hashesAtFee = this.#pendingByPriority.get(fee)!; - // Use compareTxHash from tx_metadata, swap args for descending order const sortedHashes = [...hashesAtFee].sort(hashCompareFn); - for (const hash of sortedHashes) { + for (const hashBigInt of sortedHashes) { + const hash = txHashFromBigInt(hashBigInt); if (filter === undefined || filter(hash)) { yield hash; } @@ -265,8 +265,8 @@ export class TxPoolIndices { getPendingTxs(): TxMetaData[] { const result: TxMetaData[] = []; for (const hashSet of this.#pendingByPriority.values()) { - for (const txHash of hashSet) { - const meta = this.#metadata.get(txHash); + for (const txHashBigInt of hashSet) { + const meta = this.#metadata.get(txHashFromBigInt(txHashBigInt)); if (meta) { result.push(meta); } @@ -414,7 +414,7 @@ export class TxPoolIndices { prioritySet = new Set(); this.#pendingByPriority.set(meta.priorityFee, prioritySet); } - prioritySet.add(meta.txHash); + prioritySet.add(meta.txHashBigInt); } #removeFromPendingIndices(meta: TxMetaData): void { @@ -435,7 +435,7 @@ export class TxPoolIndices { // Remove from priority map const hashSet = this.#pendingByPriority.get(meta.priorityFee); if (hashSet) { - hashSet.delete(meta.txHash); + hashSet.delete(meta.txHashBigInt); if (hashSet.size === 0) { this.#pendingByPriority.delete(meta.priorityFee); } diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.test.ts index 83106caec308..f778f6bb3f14 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.test.ts @@ -1,3 +1,11 @@ +import { + DEFAULT_DA_GAS_LIMIT, + DEFAULT_TEARDOWN_DA_GAS_LIMIT, + MAX_PROCESSABLE_L2_GAS, + PRIVATE_TX_L2_GAS_OVERHEAD, + PUBLIC_TX_L2_GAS_OVERHEAD, + TX_DA_GAS_OVERHEAD, +} from '@aztec/constants'; import { BlockNumber, CheckpointNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types'; import { timesAsync } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/curves/bn254'; @@ -6,7 +14,7 @@ import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { RevertCode } from '@aztec/stdlib/avm'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { Body, L2Block, type L2BlockId, type L2BlockSource } from '@aztec/stdlib/block'; -import { GasFees, GasSettings } from '@aztec/stdlib/gas'; +import { Gas, GasFees, GasSettings } from '@aztec/stdlib/gas'; import type { MerkleTreeReadOperations, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; import { mockTx } from '@aztec/stdlib/testing'; import { @@ -19,6 +27,7 @@ import { BlockHeader, GlobalVariables, type Tx, TxEffect, TxHash, type TxValidat import { type MockProxy, mock } from 'jest-mock-extended'; +import { GasLimitsValidator } from '../../msg_validators/tx_validator/gas_validator.js'; import type { TxMetaData } from './tx_metadata.js'; import { AztecKVTxPoolV2 } from './tx_pool_v2.js'; @@ -553,16 +562,6 @@ describe('TxPoolV2', () => { expect(await rejectingPool.getPendingTxCount()).toBe(0); }); - it('canAddPendingTx returns rejected for transaction that fails validation', async () => { - const tx = await mockTx(1); - txsToReject.add(tx.getTxHash().toString()); - - const result = await rejectingPool.canAddPendingTx(tx); - - expect(result).toBe('rejected'); - expect(await rejectingPool.getPendingTxCount()).toBe(0); // State unchanged - }); - it('addPendingTxs handles batch with mixed accepted and rejected', async () => { const tx1 = await mockTx(1); const tx2 = await mockTx(2); @@ -644,6 +643,117 @@ describe('TxPoolV2', () => { }); }); + describe('gas limits validation', () => { + let gasPool: AztecKVTxPoolV2; + let gasStore: Awaited>; + let gasArchiveStore: Awaited>; + + beforeEach(async () => { + gasStore = await openTmpStore('p2p'); + gasArchiveStore = await openTmpStore('archive'); + gasPool = new AztecKVTxPoolV2(gasStore, gasArchiveStore, { + l2BlockSource: mockL2BlockSource, + worldStateSynchronizer: mockWorldState, + createTxValidator: () => Promise.resolve(new GasLimitsValidator()), + }); + await gasPool.start(); + }); + + afterEach(async () => { + await gasPool.stop(); + await gasStore.delete(); + await gasArchiveStore.delete(); + }); + + const makePublicTxWithGas = async (seed: number, gasLimits: Gas) => { + const tx = await mockTx(seed, { numberOfNonRevertiblePublicCallRequests: 1 }); + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits, + maxFeesPerGas: DEFAULT_MAX_FEES_PER_GAS, + }); + return tx; + }; + + const makePrivateTxWithGas = async (seed: number, gasLimits: Gas) => { + const tx = await mockTx(seed, { + numberOfNonRevertiblePublicCallRequests: 0, + numberOfRevertiblePublicCallRequests: 0, + hasPublicTeardownCallRequest: false, + }); + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits, + maxFeesPerGas: DEFAULT_MAX_FEES_PER_GAS, + }); + return tx; + }; + + it('accepts public tx at exactly the minimum gas limits', async () => { + const tx = await makePublicTxWithGas(1, new Gas(TX_DA_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD)); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(1); + expect(result.rejected).toHaveLength(0); + }); + + it('accepts private tx at exactly the minimum gas limits', async () => { + const tx = await makePrivateTxWithGas(1, new Gas(TX_DA_GAS_OVERHEAD, PRIVATE_TX_L2_GAS_OVERHEAD)); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(1); + expect(result.rejected).toHaveLength(0); + }); + + it('rejects public tx below the public L2 gas minimum', async () => { + const tx = await makePublicTxWithGas(1, new Gas(TX_DA_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD - 1)); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(0); + expect(toStrings(result.rejected)).toContain(hashOf(tx)); + }); + + it('rejects private tx below the private L2 gas minimum', async () => { + const tx = await makePrivateTxWithGas(1, new Gas(TX_DA_GAS_OVERHEAD, PRIVATE_TX_L2_GAS_OVERHEAD - 1)); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(0); + expect(toStrings(result.rejected)).toContain(hashOf(tx)); + }); + + it('rejects public tx at private L2 gas minimum (between the two thresholds)', async () => { + const tx = await makePublicTxWithGas(1, new Gas(TX_DA_GAS_OVERHEAD, PRIVATE_TX_L2_GAS_OVERHEAD)); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(0); + expect(toStrings(result.rejected)).toContain(hashOf(tx)); + }); + + it('rejects tx below DA gas minimum', async () => { + const tx = await makePublicTxWithGas(1, new Gas(TX_DA_GAS_OVERHEAD - 1, PUBLIC_TX_L2_GAS_OVERHEAD)); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(0); + expect(toStrings(result.rejected)).toContain(hashOf(tx)); + }); + + it('rejects public tx if L2 gas limit is too high', async () => { + const tx = await makePublicTxWithGas(1, new Gas(DEFAULT_DA_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS + 1)); + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(DEFAULT_DA_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS + 1), + maxFeesPerGas: DEFAULT_MAX_FEES_PER_GAS, + teardownGasLimits: new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, 1), + }); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(0); + expect(toStrings(result.rejected)).toContain(hashOf(tx)); + }); + + it('rejects private tx if L2 gas limit is too high', async () => { + const tx = await makePrivateTxWithGas(1, new Gas(DEFAULT_DA_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS + 1)); + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(DEFAULT_DA_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS + 1), + maxFeesPerGas: DEFAULT_MAX_FEES_PER_GAS, + teardownGasLimits: new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, 1), + }); + const result = await gasPool.addPendingTxs([tx]); + expect(result.accepted).toHaveLength(0); + expect(toStrings(result.rejected)).toContain(hashOf(tx)); + }); + }); + describe('addProtectedTxs', () => { it('adds new transactions as protected', async () => { const tx = await mockTx(1); @@ -1817,6 +1927,58 @@ describe('TxPoolV2', () => { expect(await pool.getTxStatus(txMined.getTxHash())).toBe('deleted'); expectRemovedTxs(txMined); // txMined deleted }); + + it('evicts low priority txs after chain prune when pool exceeds limit', async () => { + const txLow = await mockTxWithFee(1, 1); + const txMed = await mockTxWithFee(2, 5); + const txHigh = await mockTxWithFee(3, 10); + + // Add all 3 txs (no pool limit by default) + await pool.addPendingTxs([txLow, txMed, txHigh]); + expectAddedTxs(txLow, txMed, txHigh); + expect(await pool.getPendingTxCount()).toBe(3); + + // Mine all three + await pool.handleMinedBlock(makeBlock([txLow, txMed, txHigh], slot1Header)); + expectNoCallbacks(); + expect(await pool.getPendingTxCount()).toBe(0); + + // Now set pool limit to 2 + await pool.updateConfig({ maxPendingTxCount: 2 }); + + // Prune - all 3 txs return to pending, but pool limit is 2 + await pool.handlePrunedBlocks(block0Id); + + // Lowest priority tx should be evicted + const pending = toStrings(await pool.getPendingTxHashes()); + expect(pending).toHaveLength(2); + expect(pending).toContain(hashOf(txMed)); + expect(pending).toContain(hashOf(txHigh)); + expect(await pool.getTxStatus(txLow.getTxHash())).toBe('deleted'); + }); + + it('does not evict txs after chain prune when pool is within limit', async () => { + const tx1 = await mockTxWithFee(1, 1); + const tx2 = await mockTxWithFee(2, 2); + + await pool.addPendingTxs([tx1, tx2]); + expectAddedTxs(tx1, tx2); + expect(await pool.getPendingTxCount()).toBe(2); + + // Mine both + await pool.handleMinedBlock(makeBlock([tx1, tx2], slot1Header)); + expectNoCallbacks(); + + // Set limit to 3 (above what will be restored) + await pool.updateConfig({ maxPendingTxCount: 3 }); + + // Prune - both txs return to pending, under the limit + await pool.handlePrunedBlocks(block0Id); + + expect(await pool.getPendingTxCount()).toBe(2); + expect(await pool.getTxStatus(tx1.getTxHash())).toBe('pending'); + expect(await pool.getTxStatus(tx2.getTxHash())).toBe('pending'); + }); }); describe('validation during restore', () => { @@ -5107,4 +5269,121 @@ describe('TxPoolV2', () => { expect(await pool.getTxStatus(tx.getTxHash())).toBeUndefined(); }); }); + + describe('persistence consistency', () => { + it('pool state is consistent across restart when getTxEffect throws for a later tx in batch', async () => { + const testStore = await openTmpStore('p2p-comeback-gettxeffect'); + const testArchiveStore = await openTmpStore('archive-comeback-gettxeffect'); + + try { + const pool1 = new AztecKVTxPoolV2(testStore, testArchiveStore, { + l2BlockSource: mockL2BlockSource, + worldStateSynchronizer: mockWorldState, + createTxValidator: () => Promise.resolve(alwaysValidValidator), + }); + await pool1.start(); + + // Add tx1 (fee=5) with a nullifier + const tx1 = await mockPublicTx(1, 5); + await pool1.addPendingTxs([tx1]); + expect(await pool1.getTxStatus(tx1.getTxHash())).toBe('pending'); + + // Create tx2 (same nullifier as tx1, higher fee — will evict tx1) and tx3 (different nullifiers) + const tx2 = await mockPublicTx(2, 10); + setNullifier(tx2, 0, getNullifier(tx1, 0)); + const tx3 = await mockPublicTx(3, 1); + + // Mock getTxEffect to throw for tx3 (simulates L2BlockSource I/O failure) + const tx3HashStr = tx3.getTxHash().toString(); + mockL2BlockSource.getTxEffect.mockImplementation((txHash: TxHash) => { + if (txHash.toString() === tx3HashStr) { + throw new Error('Simulated L2BlockSource failure'); + } + return Promise.resolve(undefined); + }); + + // Batch fails because tx3's getMinedBlockId throws + await expect(pool1.addPendingTxs([tx2, tx3])).rejects.toThrow('Simulated L2BlockSource failure'); + + const statusBeforeRestart = await pool1.getTxStatus(tx1.getTxHash()); + + await pool1.stop(); + mockL2BlockSource.getTxEffect.mockResolvedValue(undefined); + + const pool2 = new AztecKVTxPoolV2(testStore, testArchiveStore, { + l2BlockSource: mockL2BlockSource, + worldStateSynchronizer: mockWorldState, + createTxValidator: () => Promise.resolve(alwaysValidValidator), + }); + await pool2.start(); + + const statusAfterRestart = await pool2.getTxStatus(tx1.getTxHash()); + expect(statusAfterRestart).toBe(statusBeforeRestart); + + await pool2.stop(); + } finally { + mockL2BlockSource.getTxEffect.mockResolvedValue(undefined); + await testStore.delete(); + await testArchiveStore.delete(); + } + }); + + it('pool state is consistent across restart when validateMeta throws for a later tx in batch', async () => { + const testStore = await openTmpStore('p2p-comeback-validatemeta'); + const testArchiveStore = await openTmpStore('archive-comeback-validatemeta'); + + try { + // Create a validator that throws (not rejects) for tx3 + let tx3HashStr = ''; + const throwingValidator: TxValidator = { + validateTx: (meta: TxMetaData) => { + if (meta.txHash === tx3HashStr) { + throw new Error('Simulated validator crash'); + } + return Promise.resolve({ result: 'valid' }); + }, + }; + + const pool1 = new AztecKVTxPoolV2(testStore, testArchiveStore, { + l2BlockSource: mockL2BlockSource, + worldStateSynchronizer: mockWorldState, + createTxValidator: () => Promise.resolve(throwingValidator), + }); + await pool1.start(); + + // Add tx1 (fee=5) with a nullifier + const tx1 = await mockPublicTx(1, 5); + await pool1.addPendingTxs([tx1]); + expect(await pool1.getTxStatus(tx1.getTxHash())).toBe('pending'); + + // Create tx2 (same nullifier as tx1, higher fee — will evict tx1) and tx3 (different nullifiers) + const tx2 = await mockPublicTx(2, 10); + setNullifier(tx2, 0, getNullifier(tx1, 0)); + const tx3 = await mockPublicTx(3, 1); + tx3HashStr = tx3.getTxHash().toString(); + + // Batch fails because tx3's validateMeta throws + await expect(pool1.addPendingTxs([tx2, tx3])).rejects.toThrow('Simulated validator crash'); + + const statusBeforeRestart = await pool1.getTxStatus(tx1.getTxHash()); + + await pool1.stop(); + + const pool2 = new AztecKVTxPoolV2(testStore, testArchiveStore, { + l2BlockSource: mockL2BlockSource, + worldStateSynchronizer: mockWorldState, + createTxValidator: () => Promise.resolve(alwaysValidValidator), + }); + await pool2.start(); + + const statusAfterRestart = await pool2.getTxStatus(tx1.getTxHash()); + expect(statusAfterRestart).toBe(statusBeforeRestart); + + await pool2.stop(); + } finally { + await testStore.delete(); + await testArchiveStore.delete(); + } + }); + }); }); diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.ts index c8ec01271baf..4f65a0d6b0ae 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2.ts @@ -74,7 +74,7 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte return this.#queue.put(() => this.#impl.addPendingTxs(txs, opts)); } - canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'> { + canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> { return this.#queue.put(() => this.#impl.canAddPendingTx(tx)); } diff --git a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts index c35a28455fd8..a1d565ccfd3a 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts @@ -187,6 +187,30 @@ export class TxPoolV2Impl { const errors = new Map(); const acceptedPending = new Set(); + // Phase 1: Pre-compute all throwable I/O outside the transaction. + // If any pre-computation throws, the entire call fails before mutations happen. + const precomputed = new Map(); + + const validator = await this.#createTxValidator(); + + for (const tx of txs) { + const txHash = tx.getTxHash(); + const txHashStr = txHash.toString(); + + const meta = await buildTxMetaData(tx); + const minedBlockId = await this.#getMinedBlockId(txHash); + + // Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction) + let isValid = true; + if (!minedBlockId) { + isValid = await this.#validateMeta(meta, validator); + } + + precomputed.set(txHashStr, { meta, minedBlockId, isValid }); + } + + // Phase 2: Apply mutations inside the transaction using only pre-computed results, + // in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception. const poolAccess = this.#createPreAddPoolAccess(); const preAddContext: PreAddContext | undefined = opts.feeComparisonOnly !== undefined ? { feeComparisonOnly: opts.feeComparisonOnly } : undefined; @@ -202,22 +226,25 @@ export class TxPoolV2Impl { continue; } - // Check mined status first (applies to all paths) - const minedBlockId = await this.#getMinedBlockId(txHash); + const { meta, minedBlockId, isValid } = precomputed.get(txHashStr)!; const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr); if (minedBlockId) { // Already mined - add directly (protection already set if pre-protected) - await this.#addTx(tx, { mined: minedBlockId }, opts); + await this.#addTx(tx, { mined: minedBlockId }, opts, meta); accepted.push(txHash); } else if (preProtectedSlot !== undefined) { // Pre-protected and not mined - add as protected (bypass validation) - await this.#addTx(tx, { protected: preProtectedSlot }, opts); + await this.#addTx(tx, { protected: preProtectedSlot }, opts, meta); accepted.push(txHash); + } else if (!isValid) { + // Failed pre-computed validation + rejected.push(txHash); } else { - // Regular pending tx - validate and run pre-add rules + // Regular pending tx - run pre-add rules using pre-computed metadata const result = await this.#tryAddRegularPendingTx( tx, + meta, opts, poolAccess, acceptedPending, @@ -227,13 +254,18 @@ export class TxPoolV2Impl { ); if (result.status === 'accepted') { acceptedPending.add(txHashStr); - } else if (result.status === 'rejected') { - rejected.push(txHash); } else { ignored.push(txHash); } } } + + // Run post-add eviction rules for pending txs (inside transaction for atomicity) + if (acceptedPending.size > 0) { + const feePayers = Array.from(acceptedPending).map(txHash => this.#indices.getMetadata(txHash)!.feePayer); + const uniqueFeePayers = new Set(feePayers); + await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [...uniqueFeePayers]); + } }); // Build final accepted list for pending txs (excludes intra-batch evictions) @@ -249,37 +281,24 @@ export class TxPoolV2Impl { this.#instrumentation.recordRejected(rejected.length); } - // Run post-add eviction rules for pending txs - if (acceptedPending.size > 0) { - const feePayers = Array.from(acceptedPending).map(txHash => this.#indices.getMetadata(txHash)!.feePayer); - const uniqueFeePayers = new Set(feePayers); - await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [...uniqueFeePayers]); - } - return { accepted, ignored, rejected, ...(errors.size > 0 ? { errors } : {}) }; } - /** Validates and adds a regular pending tx. Returns status. */ + /** Adds a validated pending tx, running pre-add rules and evicting conflicts. */ async #tryAddRegularPendingTx( tx: Tx, + precomputedMeta: TxMetaData, opts: { source?: string }, poolAccess: PreAddPoolAccess, acceptedPending: Set, ignored: TxHash[], errors: Map, preAddContext?: PreAddContext, - ): Promise<{ status: 'accepted' | 'ignored' | 'rejected' }> { - const txHash = tx.getTxHash(); - const txHashStr = txHash.toString(); - - // Build metadata and validate using metadata - const meta = await buildTxMetaData(tx); - if (!(await this.#validateMeta(meta))) { - return { status: 'rejected' }; - } + ): Promise<{ status: 'accepted' | 'ignored' }> { + const txHashStr = tx.getTxHash().toString(); // Run pre-add rules - const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess, preAddContext); + const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext); if (preAddResult.shouldIgnore) { this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`); @@ -317,11 +336,11 @@ export class TxPoolV2Impl { } // Add the transaction - await this.#addTx(tx, 'pending', opts); + await this.#addTx(tx, 'pending', opts, precomputedMeta); return { status: 'accepted' }; } - async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'> { + async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> { const txHashStr = tx.getTxHash().toString(); // Check if already in pool @@ -329,14 +348,8 @@ export class TxPoolV2Impl { return 'ignored'; } - // Build metadata and validate using metadata + // Build metadata and check pre-add rules const meta = await buildTxMetaData(tx); - const validationResult = await this.#validateMeta(meta, undefined, 'can add pending'); - if (validationResult !== true) { - return 'rejected'; - } - - // Use pre-add rules const poolAccess = this.#createPreAddPoolAccess(); const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess); @@ -379,33 +392,35 @@ export class TxPoolV2Impl { let softDeletedHits = 0; let missingPreviouslyEvicted = 0; - for (const txHash of txHashes) { - const txHashStr = txHash.toString(); + await this.#store.transactionAsync(async () => { + for (const txHash of txHashes) { + const txHashStr = txHash.toString(); - if (this.#indices.has(txHashStr)) { - // Update protection for existing tx - this.#indices.updateProtection(txHashStr, slotNumber); - } else if (this.#deletedPool.isSoftDeleted(txHashStr)) { - // Resurrect soft-deleted tx as protected - const buffer = await this.#txsDB.getAsync(txHashStr); - if (buffer) { - const tx = Tx.fromBuffer(buffer); - await this.#addTx(tx, { protected: slotNumber }); - softDeletedHits++; + if (this.#indices.has(txHashStr)) { + // Update protection for existing tx + this.#indices.updateProtection(txHashStr, slotNumber); + } else if (this.#deletedPool.isSoftDeleted(txHashStr)) { + // Resurrect soft-deleted tx as protected + const buffer = await this.#txsDB.getAsync(txHashStr); + if (buffer) { + const tx = Tx.fromBuffer(buffer); + await this.#addTx(tx, { protected: slotNumber }); + softDeletedHits++; + } else { + // Data missing despite soft-delete flag — treat as truly missing + this.#indices.setProtection(txHashStr, slotNumber); + missing.push(txHash); + } } else { - // Data missing despite soft-delete flag — treat as truly missing + // Truly missing — pre-record protection for tx we don't have yet this.#indices.setProtection(txHashStr, slotNumber); missing.push(txHash); - } - } else { - // Truly missing — pre-record protection for tx we don't have yet - this.#indices.setProtection(txHashStr, slotNumber); - missing.push(txHash); - if (this.#evictedTxHashes.has(txHashStr)) { - missingPreviouslyEvicted++; + if (this.#evictedTxHashes.has(txHashStr)) { + missingPreviouslyEvicted++; + } } } - } + }); // Record metrics if (softDeletedHits > 0) { @@ -466,56 +481,60 @@ export class TxPoolV2Impl { } } - // Step 4: Mark txs as mined (only those we have in the pool) - for (const meta of found) { - this.#indices.markAsMined(meta, blockId); - await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number); - } + await this.#store.transactionAsync(async () => { + // Step 4: Mark txs as mined (only those we have in the pool) + for (const meta of found) { + this.#indices.markAsMined(meta, blockId); + await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number); + } - // Step 5: Run eviction rules (remove pending txs with conflicting nullifiers/expired timestamps) - await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers); + // Step 5: Run post-event eviction rules (inside transaction for atomicity) + await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers); + }); this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`); } async prepareForSlot(slotNumber: SlotNumber): Promise { - // Step 0: Clean up slot-deleted txs from previous slots - await this.#deletedPool.cleanupSlotDeleted(slotNumber); + await this.#store.transactionAsync(async () => { + // Step 0: Clean up slot-deleted txs from previous slots + await this.#deletedPool.cleanupSlotDeleted(slotNumber); - // Step 1: Find expired protected txs - const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber); + // Step 1: Find expired protected txs + const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber); - // Step 2: Clear protection for all expired entries (including those without metadata) - this.#indices.clearProtection(expiredProtected); + // Step 2: Clear protection for all expired entries (including those without metadata) + this.#indices.clearProtection(expiredProtected); - // Step 3: Filter to only txs that have metadata and are not mined - const txsToRestore = this.#indices.filterRestorable(expiredProtected); - if (txsToRestore.length === 0) { - this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`); - return; - } + // Step 3: Filter to only txs that have metadata and are not mined + const txsToRestore = this.#indices.filterRestorable(expiredProtected); + if (txsToRestore.length === 0) { + this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`); + return; + } - this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`); + this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`); - // Step 4: Validate for pending pool - const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot'); + // Step 4: Validate for pending pool + const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot'); - // Step 5: Resolve nullifier conflicts and add winners to pending indices - const { added, toEvict } = this.#applyNullifierConflictResolution(valid); + // Step 5: Resolve nullifier conflicts and add winners to pending indices + const { added, toEvict } = this.#applyNullifierConflictResolution(valid); - // Step 6: Delete invalid txs and evict conflict losers - await this.#deleteTxsBatch(invalid); - await this.#evictTxs(toEvict, 'NullifierConflict'); + // Step 6: Delete invalid txs and evict conflict losers + await this.#deleteTxsBatch(invalid); + await this.#evictTxs(toEvict, 'NullifierConflict'); - // Step 7: Run eviction rules (enforce pool size limit) - if (added.length > 0) { - const feePayers = added.map(meta => meta.feePayer); - const uniqueFeePayers = new Set(feePayers); - await this.#evictionManager.evictAfterNewTxs( - added.map(m => m.txHash), - [...uniqueFeePayers], - ); - } + // Step 7: Run eviction rules (enforce pool size limit) + if (added.length > 0) { + const feePayers = added.map(meta => meta.feePayer); + const uniqueFeePayers = new Set(feePayers); + await this.#evictionManager.evictAfterNewTxs( + added.map(m => m.txHash), + [...uniqueFeePayers], + ); + } + }); } async handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise { @@ -528,57 +547,60 @@ export class TxPoolV2Impl { this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`); - // Step 2: Mark ALL un-mined txs with their original mined block number - // This ensures they get soft-deleted if removed later, and only hard-deleted - // when their original mined block is finalized - await this.#deletedPool.markFromPrunedBlock( - txsToUnmine.map(m => ({ - txHash: m.txHash, - minedAtBlock: BlockNumber(m.minedL2BlockId!.number), - })), - ); + await this.#store.transactionAsync(async () => { + // Step 2: Mark ALL un-mined txs with their original mined block number + // This ensures they get soft-deleted if removed later, and only hard-deleted + // when their original mined block is finalized + await this.#deletedPool.markFromPrunedBlock( + txsToUnmine.map(m => ({ + txHash: m.txHash, + minedAtBlock: BlockNumber(m.minedL2BlockId!.number), + })), + ); - // Step 3: Unmine - clear mined status from metadata - for (const meta of txsToUnmine) { - this.#indices.markAsUnmined(meta); - } + // Step 3: Unmine - clear mined status from metadata + for (const meta of txsToUnmine) { + this.#indices.markAsUnmined(meta); + } - // If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early - if (options?.deleteAllTxs) { - const allTxHashes = txsToUnmine.map(m => m.txHash); - await this.#deleteTxsBatch(allTxHashes); - this.#log.info( - `Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`, - ); - return; - } + // If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early + if (options?.deleteAllTxs) { + const allTxHashes = txsToUnmine.map(m => m.txHash); + await this.#deleteTxsBatch(allTxHashes); + this.#log.info( + `Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`, + ); + return; + } - // Step 4: Filter out protected txs (they'll be handled by prepareForSlot) - const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine); + // Step 4: Filter out protected txs (they'll be handled by prepareForSlot) + const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine); - // Step 5: Validate for pending pool - const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks'); + // Step 5: Validate for pending pool + const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks'); - // Step 6: Resolve nullifier conflicts and add winners to pending indices - const { toEvict } = this.#applyNullifierConflictResolution(valid); + // Step 6: Resolve nullifier conflicts and add winners to pending indices + const { toEvict } = this.#applyNullifierConflictResolution(valid); - // Step 7: Delete invalid txs and evict conflict losers - await this.#deleteTxsBatch(invalid); - await this.#evictTxs(toEvict, 'NullifierConflict'); + // Step 7: Delete invalid txs and evict conflict losers + await this.#deleteTxsBatch(invalid); + await this.#evictTxs(toEvict, 'NullifierConflict'); - this.#log.info( - `Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`, - { txHashesRestored: valid.map(m => m.txHash), txHashesInvalid: invalid, txHashesEvicted: toEvict }, - ); + this.#log.info( + `Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`, + { txHashesRestored: valid.map(m => m.txHash), txHashesInvalid: invalid, txHashesEvicted: toEvict }, + ); - // Step 8: Run eviction rules for ALL pending txs (not just restored ones) - // This handles cases like existing pending txs with invalid fee payer balances - await this.#evictionManager.evictAfterChainPrune(latestBlock.number); + // Step 8: Run eviction rules for ALL pending txs (not just restored ones) + // This handles cases like existing pending txs with invalid fee payer balances + await this.#evictionManager.evictAfterChainPrune(latestBlock.number); + }); } async handleFailedExecution(txHashes: TxHash[]): Promise { - // Delete failed txs - await this.#deleteTxsBatch(txHashes.map(h => h.toString())); + await this.#store.transactionAsync(async () => { + await this.#deleteTxsBatch(txHashes.map(h => h.toString())); + }); this.#log.info(`Deleted ${txHashes.length} failed txs`, { txHashes: txHashes.map(h => h.toString()) }); } @@ -589,27 +611,29 @@ export class TxPoolV2Impl { // Step 1: Find mined txs at or before finalized block const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber); - // Step 2: Collect mined txs for archiving (before deletion) - const txsToArchive: Tx[] = []; - if (this.#archive.isEnabled()) { - for (const txHashStr of minedTxsToFinalize) { - const buffer = await this.#txsDB.getAsync(txHashStr); - if (buffer) { - txsToArchive.push(Tx.fromBuffer(buffer)); + await this.#store.transactionAsync(async () => { + // Step 2: Collect mined txs for archiving (before deletion) + const txsToArchive: Tx[] = []; + if (this.#archive.isEnabled()) { + for (const txHashStr of minedTxsToFinalize) { + const buffer = await this.#txsDB.getAsync(txHashStr); + if (buffer) { + txsToArchive.push(Tx.fromBuffer(buffer)); + } } } - } - // Step 3: Delete mined txs from active pool - await this.#deleteTxsBatch(minedTxsToFinalize); + // Step 3: Delete mined txs from active pool + await this.#deleteTxsBatch(minedTxsToFinalize); - // Step 4: Finalize soft-deleted txs - await this.#deletedPool.finalizeBlock(blockNumber); + // Step 4: Finalize soft-deleted txs + await this.#deletedPool.finalizeBlock(blockNumber); - // Step 5: Archive mined txs - if (txsToArchive.length > 0) { - await this.#archive.archiveTxs(txsToArchive); - } + // Step 5: Archive mined txs + if (txsToArchive.length > 0) { + await this.#archive.archiveTxs(txsToArchive); + } + }); if (minedTxsToFinalize.length > 0) { this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, { @@ -754,9 +778,10 @@ export class TxPoolV2Impl { tx: Tx, state: 'pending' | { protected: SlotNumber } | { mined: L2BlockId }, opts: { source?: string } = {}, + precomputedMeta?: TxMetaData, ): Promise { const txHashStr = tx.getTxHash().toString(); - const meta = await buildTxMetaData(tx); + const meta = precomputedMeta ?? (await buildTxMetaData(tx)); meta.receivedAt = this.#dateProvider.now(); await this.#txsDB.set(txHashStr, tx.toBuffer()); diff --git a/yarn-project/p2p/src/msg_validators/proposal_validator/block_proposal_validator.ts b/yarn-project/p2p/src/msg_validators/proposal_validator/block_proposal_validator.ts index 5de0076aea39..a481256e9f37 100644 --- a/yarn-project/p2p/src/msg_validators/proposal_validator/block_proposal_validator.ts +++ b/yarn-project/p2p/src/msg_validators/proposal_validator/block_proposal_validator.ts @@ -4,7 +4,7 @@ import type { BlockProposal, P2PValidator } from '@aztec/stdlib/p2p'; import { ProposalValidator } from '../proposal_validator/proposal_validator.js'; export class BlockProposalValidator extends ProposalValidator implements P2PValidator { - constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) { + constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean; maxTxsPerBlock?: number }) { super(epochCache, opts, 'p2p:block_proposal_validator'); } } diff --git a/yarn-project/p2p/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts b/yarn-project/p2p/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts index 763912a04814..74804fe45d21 100644 --- a/yarn-project/p2p/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +++ b/yarn-project/p2p/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts @@ -7,7 +7,7 @@ export class CheckpointProposalValidator extends ProposalValidator implements P2PValidator { - constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) { + constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean; maxTxsPerBlock?: number }) { super(epochCache, opts, 'p2p:checkpoint_proposal_validator'); } } diff --git a/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator.ts b/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator.ts index f6fb7102e537..a926d1f3c144 100644 --- a/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator.ts +++ b/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator.ts @@ -9,10 +9,16 @@ export abstract class ProposalValidator this.maxTxsPerBlock) { + this.logger.warn( + `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when max is ${this.maxTxsPerBlock}`, + ); + return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError }; + } + // Embedded txs must be listed in txHashes const hashSet = new Set(proposal.txHashes.map(h => h.toString())); const missingTxHashes = diff --git a/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts b/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts index 6aa79230f8cd..e58a007a3de7 100644 --- a/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +++ b/yarn-project/p2p/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts @@ -1,4 +1,5 @@ import type { EpochCacheInterface } from '@aztec/epoch-cache'; +import { NoCommitteeError } from '@aztec/ethereum/contracts'; import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer'; import type { EthAddress } from '@aztec/foundation/eth-address'; import { @@ -9,12 +10,13 @@ import { } from '@aztec/stdlib/p2p'; import type { TxHash } from '@aztec/stdlib/tx'; +import { jest } from '@jest/globals'; import type { MockProxy } from 'jest-mock-extended'; export interface ProposalValidatorTestParams { validatorFactory: ( epochCache: EpochCacheInterface, - opts: { txsPermitted: boolean }, + opts: { txsPermitted: boolean; maxTxsPerBlock?: number }, ) => { validate: (proposal: TProposal) => Promise }; makeProposal: (options?: any) => Promise; makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any; @@ -105,6 +107,26 @@ export function sharedProposalValidatorTests { + const currentProposer = getSigner(); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + }); + + // Override getSender to return undefined (invalid signature) + jest.spyOn(mockProposal as any, 'getSender').mockReturnValue(undefined); + + mockGetProposer(getAddress(currentProposer), getAddress()); + const result = await validator.validate(mockProposal); + expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError }); + + // Should not try to resolve proposer if signature is invalid + expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled(); + }); + it('returns mid tolerance error if proposer is not current proposer for current slot', async () => { const currentProposer = getSigner(); const nextProposer = getSigner(); @@ -152,6 +174,34 @@ export function sharedProposalValidatorTests { + const currentProposer = getSigner(); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + }); + + epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(undefined); + const result = await validator.validate(mockProposal); + expect(result).toEqual({ result: 'accept' }); + }); + + it('returns low tolerance error when getProposerAttesterAddressInSlot throws NoCommitteeError', async () => { + const currentProposer = getSigner(); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + }); + + epochCache.getProposerAttesterAddressInSlot.mockRejectedValue(new NoCommitteeError()); + const result = await validator.validate(mockProposal); + expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.LowToleranceError }); + }); + it('returns undefined if proposal is valid for current slot and proposer', async () => { const currentProposer = getSigner(); const nextProposer = getSigner(); @@ -226,5 +276,98 @@ export function sharedProposalValidatorTests { + it('returns mid tolerance error if embedded txs are not listed in txHashes', async () => { + const currentProposer = getSigner(); + const txHashes = getTxHashes(2); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + txHashes, + }); + + // Create a fake tx whose hash is NOT in txHashes + const fakeTxHash = getTxHashes(1)[0]; + const fakeTx = { getTxHash: () => fakeTxHash, validateTxHash: () => Promise.resolve(true) }; + Object.defineProperty(mockProposal, 'txs', { get: () => [fakeTx], configurable: true }); + + mockGetProposer(getAddress(currentProposer), getAddress()); + const result = await validator.validate(mockProposal); + expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError }); + }); + + it('returns low tolerance error if embedded tx has invalid tx hash', async () => { + const currentProposer = getSigner(); + const txHashes = getTxHashes(2); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + txHashes, + }); + + // Create a fake tx whose hash IS in txHashes but validateTxHash returns false + const fakeTx = { getTxHash: () => txHashes[0], validateTxHash: () => Promise.resolve(false) }; + Object.defineProperty(mockProposal, 'txs', { get: () => [fakeTx], configurable: true }); + + mockGetProposer(getAddress(currentProposer), getAddress()); + const result = await validator.validate(mockProposal); + expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.LowToleranceError }); + }); + }); + + describe('maxTxsPerBlock validation', () => { + it('rejects proposal when txHashes exceed maxTxsPerBlock', async () => { + const validatorWithMaxTxs = validatorFactory(epochCache, { txsPermitted: true, maxTxsPerBlock: 2 }); + const currentProposer = getSigner(); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + txHashes: getTxHashes(3), + }); + + mockGetProposer(getAddress(currentProposer), getAddress()); + const result = await validatorWithMaxTxs.validate(mockProposal); + expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError }); + }); + + it('accepts proposal when txHashes count equals maxTxsPerBlock', async () => { + const validatorWithMaxTxs = validatorFactory(epochCache, { txsPermitted: true, maxTxsPerBlock: 2 }); + const currentProposer = getSigner(); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + txHashes: getTxHashes(2), + }); + + mockGetProposer(getAddress(currentProposer), getAddress()); + const result = await validatorWithMaxTxs.validate(mockProposal); + expect(result).toEqual({ result: 'accept' }); + }); + + it('accepts proposal when maxTxsPerBlock is not set (unlimited)', async () => { + // Default validator has no maxTxsPerBlock + const currentProposer = getSigner(); + const header = makeHeader(1, 100, 100); + const mockProposal = await makeProposal({ + blockHeader: header, + lastBlockHeader: header, + signer: currentProposer, + txHashes: getTxHashes(10), + }); + + mockGetProposer(getAddress(currentProposer), getAddress()); + const result = await validator.validate(mockProposal); + expect(result).toEqual({ result: 'accept' }); + }); + }); }); } diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/README.md b/yarn-project/p2p/src/msg_validators/tx_validator/README.md new file mode 100644 index 000000000000..91087c1559c5 --- /dev/null +++ b/yarn-project/p2p/src/msg_validators/tx_validator/README.md @@ -0,0 +1,115 @@ +# Transaction Validation + +This module defines the transaction validators and the factory functions that assemble them for each entry point into the system. + +## Validation Strategy + +Transactions enter the system through different paths. **Unsolicited** transactions (gossip and RPC) are fully validated before acceptance. **Solicited** transactions (req/resp and block proposals) are only checked for well-formedness because we must store them for block re-execution — they may ultimately be invalid, which is caught during block building and reported as part of block validation/attestation. + +When solicited transactions fail to be mined, they may be migrated to the pending pool. At that point, the pool runs the state-dependent checks that were skipped on initial receipt. + +## Entry Points + +### 1. Gossip (libp2p pubsub) + +**Factory**: `createFirstStageTxValidationsForGossipedTransactions` + `createSecondStageTxValidationsForGossipedTransactions` +**Called from**: `LibP2PService.handleGossipedTx()` in `libp2p_service.ts` + +Unsolicited transactions from any peer. Fully validated in two stages with a pool pre-check in between to avoid wasting CPU on proof verification for transactions the pool would reject: + +| Step | What runs | On failure | +|------|-----------|------------| +| **Stage 1** (fast) | TxPermitted, Data, Metadata, Timestamp, DoubleSpend, Gas, Phases, BlockHeader | Penalize peer, reject tx | +| **Pool pre-check** | `canAddPendingTx` — checks for duplicates, pool capacity | Ignore tx (no penalty) | +| **Stage 2** (slow) | Proof verification | Penalize peer, reject tx | +| **Pool add** | `addPendingTxs` | Accept, ignore, or reject | + +Each stage-1 and stage-2 validator is paired with a `PeerErrorSeverity`. If a validator fails, the sending peer is penalized with that severity. The `doubleSpendValidator` has special handling: its severity is determined by how recently the nullifier appeared (recent = high tolerance, old = low tolerance). + +### 2. JSON-RPC + +**Factory**: `createTxValidatorForAcceptingTxsOverRPC` +**Called from**: `AztecNodeService.isValidTx()` in `aztec-node/server.ts` + +Unsolicited transactions from a local wallet/PXE. Runs the full set of checks as a single aggregate validator: + +- TxPermitted, Size, Data, Metadata, Timestamp, DoubleSpend, Phases, BlockHeader +- Gas (optional — skipped when `skipFeeEnforcement` is set) +- Proof verification (optional — skipped for simulations when no verifier is provided) + +### 3. Req/resp and block proposals + +**Factories**: `createTxValidatorForReqResponseReceivedTxs`, `createTxValidatorForBlockProposalReceivedTxs` +**Called from**: `LibP2PService.validateRequestedTx()`, `LibP2PService.validateTxsReceivedInBlockProposal()`, and `BatchRequestTxValidator` in `batch-tx-requester/tx_validator.ts` + +Solicited transactions — we requested these from peers or received them as part of a block proposal we need to validate. We must accept them for re-execution even if they are invalid against the current state. Only well-formedness is checked: + +- Metadata, Size, Data, Proof + +State-dependent checks are deferred to either the block building validator (for txs included in blocks) or the pending pool migration validator (for unmined txs migrating to pending). + +### 4. Block building + +**Factory**: `createTxValidatorForBlockBuilding` +**Called from**: `CheckpointBuilder.makeBlockBuilderDeps()` in `validator-client/checkpoint_builder.ts` + +Transactions already in the pool, about to be sequenced into a block. Re-validates against the current state of the block being built. **This is where invalid txs that entered via req/resp or block proposals are caught** — their invalidity is reported as part of block validation/attestation. + +Runs: +- Timestamp, DoubleSpend, Phases, Gas, BlockHeader + +Does **not** run: +- Proof, Data — already verified on entry (by gossip, RPC, or req/resp validators) + +### 5. Pending pool migration + +**Factory**: `createTxValidatorForTransactionsEnteringPendingTxPool` +**Called from**: `TxPoolV2Impl` (injected as the `createTxValidator` factory via `TxPoolV2Dependencies`) + +When transactions that arrived via req/resp or block proposals fail to be mined, they may need to be included in our pending pool. These txs only had well-formedness checks on receipt, so the pool runs the state-dependent checks they missed before accepting them. + +This validator is invoked on **every** transaction potentially entering the pending pool: +- `addPendingTxs` — validating each tx before adding +- `prepareForSlot` — unprotecting txs back to pending after a slot ends +- `handlePrunedBlocks` — unmining txs from pruned blocks back to pending +- Startup hydration — revalidating persisted non-mined txs on node restart + +Runs: +- DoubleSpend, BlockHeader, GasLimits, Timestamp + +Operates on `TxMetaData` (pre-built by the pool) rather than full `Tx` objects. + +## Individual Validators + +| Validator | What it checks | Benchmarked verification duration | +|-----------|---------------|---------------| +| `TxPermittedValidator` | Whether the system is accepting transactions (controlled by config flag) | 1.56 us | +| `DataTxValidator` | Transaction data integrity — correct structure, non-empty fields | 4.10–18.18 ms | +| `SizeTxValidator` | Transaction does not exceed maximum size limits | 2.28 us | +| `MetadataTxValidator` | Chain ID, rollup version, protocol contracts hash, VK tree root | 4.18 us | +| `TimestampTxValidator` | Transaction has not expired (expiration timestamp vs next slot) | 1.56 us | +| `DoubleSpendTxValidator` | Nullifiers do not already exist in the nullifier tree | 106.08 us | +| `GasTxValidator` | Gas limits are within bounds (delegates to `GasLimitsValidator`), max fee per gas meets current block fees, and fee payer has sufficient FeeJuice balance | 1.02 ms | +| `GasLimitsValidator` | Gas limits are >= fixed minimums and <= AVM max processable L2 gas. Used standalone in pool migration; also called internally by `GasTxValidator` | 3–10 us | +| `PhasesTxValidator` | Public function calls in setup phase are on the allow list | 10.12–13.12 us | +| `BlockHeaderTxValidator` | Transaction's anchor block hash exists in the archive tree | 98.88 us | +| `TxProofValidator` | Client proof verifies correctly | ~250ms | + +## Validator Coverage by Entry Point + +| Validator | Gossip | RPC | Req/resp | Block building | Pool migration | +|-----------|--------|-----|----------|----------------|----------------| +| TxPermitted | Stage 1 | Yes | — | — | — | +| Data | Stage 1 | Yes | Yes | — | — | +| Size | — | Yes | Yes | — | — | +| Metadata | Stage 1 | Yes | Yes | — | — | +| Timestamp | Stage 1 | Yes | — | Yes | Yes | +| DoubleSpend | Stage 1 | Yes | — | Yes | Yes | +| Gas (balance + limits) | Stage 1 | Optional* | — | Yes | — | +| GasLimits (standalone) | — | — | — | — | Yes | +| Phases | Stage 1 | Yes | — | Yes | — | +| BlockHeader | Stage 1 | Yes | — | Yes | Yes | +| Proof | Stage 2 | Optional** | Yes | — | — | + +\* Gas balance check is skipped when `skipFeeEnforcement` is set (testing/dev). `GasTxValidator` internally delegates to `GasLimitsValidator` as its first step, so gas limits are checked wherever `GasTxValidator` runs. Pool migration uses `GasLimitsValidator` standalone because it doesn't need the balance or fee-per-gas checks. +\** Proof verification is skipped for simulations (no verifier provided). diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/aggregate_tx_validator.ts b/yarn-project/p2p/src/msg_validators/tx_validator/aggregate_tx_validator.ts index c7f9ef2b5d24..8b81492ef5d3 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/aggregate_tx_validator.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/aggregate_tx_validator.ts @@ -1,18 +1,18 @@ import type { TxValidationResult, TxValidator } from '@aztec/stdlib/tx'; export class AggregateTxValidator implements TxValidator { - #validators: TxValidator[]; + readonly validators: TxValidator[]; constructor(...validators: TxValidator[]) { if (validators.length === 0) { throw new Error('At least one validator must be provided'); } - this.#validators = validators; + this.validators = validators; } async validateTx(tx: T): Promise { const aggregate: { result: string; reason?: string[] } = { result: 'valid', reason: [] }; - for (const validator of this.#validators) { + for (const validator of this.validators) { const result = await validator.validateTx(tx); if (result.result === 'invalid') { aggregate.result = 'invalid'; diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/factory.test.ts b/yarn-project/p2p/src/msg_validators/tx_validator/factory.test.ts index d03af1db77fe..b52fb4ac740a 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/factory.test.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/factory.test.ts @@ -2,14 +2,43 @@ import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import { GasFees } from '@aztec/stdlib/gas'; -import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; +import type { + ClientProtocolCircuitVerifier, + MerkleTreeReadOperations, + WorldStateSynchronizer, +} from '@aztec/stdlib/interfaces/server'; +import { PeerErrorSeverity } from '@aztec/stdlib/p2p'; +import type { GlobalVariables } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { createTxMessageValidators } from './factory.js'; +import { AggregateTxValidator } from './aggregate_tx_validator.js'; +import { BlockHeaderTxValidator } from './block_header_validator.js'; +import { DataTxValidator } from './data_validator.js'; +import { DoubleSpendTxValidator } from './double_spend_validator.js'; +import { + createFirstStageTxValidationsForGossipedTransactions, + createSecondStageTxValidationsForGossipedTransactions, + createTxValidatorForAcceptingTxsOverRPC, + createTxValidatorForBlockBuilding, + createTxValidatorForBlockProposalReceivedTxs, + createTxValidatorForReqResponseReceivedTxs, + createTxValidatorForTransactionsEnteringPendingTxPool, +} from './factory.js'; +import { GasLimitsValidator, GasTxValidator } from './gas_validator.js'; +import { MetadataTxValidator } from './metadata_validator.js'; +import { PhasesTxValidator } from './phases_validator.js'; +import { SizeTxValidator } from './size_validator.js'; +import { TimestampTxValidator } from './timestamp_validator.js'; +import { TxPermittedValidator } from './tx_permitted_validator.js'; +import { TxProofValidator } from './tx_proof_validator.js'; -describe('GasTxValidator', () => { - // Mocks +/** Extract the constructor names from the validators inside an AggregateTxValidator. */ +function getValidatorNames(aggregate: AggregateTxValidator): string[] { + return aggregate.validators.map(v => v.constructor.name); +} + +describe('Validator factory functions', () => { let synchronizer: MockProxy; let contractSource: MockProxy; let proofVerifier: MockProxy; @@ -20,29 +49,268 @@ describe('GasTxValidator', () => { proofVerifier = mock(); }); - it('inserts tx proof validator last', () => { - const validators = createTxMessageValidators( - 0n, - BlockNumber(2), - synchronizer, - new GasFees(1, 1), - 1, - 2, - Fr.ZERO, - contractSource, - proofVerifier, - true, - ); - expect(Object.keys(validators[0])).toEqual([ - 'txsPermittedValidator', - 'dataValidator', - 'metadataValidator', - 'timestampValidator', - 'doubleSpendValidator', - 'gasValidator', - 'phasesValidator', - 'blockHeaderValidator', - ]); - expect(Object.keys(validators[1])).toEqual(['proofValidator']); + describe('createFirstStageTxValidationsForGossipedTransactions', () => { + it('returns the expected set of first-stage validator keys', () => { + const validators = createFirstStageTxValidationsForGossipedTransactions( + 0n, + BlockNumber(2), + synchronizer, + new GasFees(1, 1), + 1, + 2, + Fr.ZERO, + contractSource, + true, + ); + + expect(Object.keys(validators)).toEqual([ + 'timestampValidator', + 'txsPermittedValidator', + 'txSizeValidator', + 'metadataValidator', + 'phasesValidator', + 'blockHeaderValidator', + 'doubleSpendValidator', + 'gasValidator', + 'dataValidator', + ]); + }); + + it('does not include a proof validator', () => { + const validators = createFirstStageTxValidationsForGossipedTransactions( + 0n, + BlockNumber(2), + synchronizer, + new GasFees(1, 1), + 1, + 2, + Fr.ZERO, + contractSource, + true, + ); + + expect(Object.keys(validators)).not.toContain('proofValidator'); + }); + + it('assigns expected severities to each validator', () => { + const validators = createFirstStageTxValidationsForGossipedTransactions( + 0n, + BlockNumber(2), + synchronizer, + new GasFees(1, 1), + 1, + 2, + Fr.ZERO, + contractSource, + true, + ); + + // Timestamp and block header are high tolerance (more likely to be stale rather than malicious) + expect(validators.timestampValidator.severity).toBe(PeerErrorSeverity.HighToleranceError); + expect(validators.blockHeaderValidator.severity).toBe(PeerErrorSeverity.HighToleranceError); + + // Others are mid tolerance + expect(validators.txsPermittedValidator.severity).toBe(PeerErrorSeverity.MidToleranceError); + expect(validators.dataValidator.severity).toBe(PeerErrorSeverity.MidToleranceError); + expect(validators.metadataValidator.severity).toBe(PeerErrorSeverity.MidToleranceError); + expect(validators.doubleSpendValidator.severity).toBe(PeerErrorSeverity.MidToleranceError); + expect(validators.gasValidator.severity).toBe(PeerErrorSeverity.MidToleranceError); + expect(validators.phasesValidator.severity).toBe(PeerErrorSeverity.MidToleranceError); + }); + + it('each entry has a validator with a validateTx method', () => { + const validators = createFirstStageTxValidationsForGossipedTransactions( + 0n, + BlockNumber(2), + synchronizer, + new GasFees(1, 1), + 1, + 2, + Fr.ZERO, + contractSource, + true, + ); + + for (const [, entry] of Object.entries(validators)) { + expect(entry.validator).toBeDefined(); + expect(typeof entry.validator.validateTx).toBe('function'); + } + }); + }); + + describe('createSecondStageTxValidationsForGossipedTransactions', () => { + it('returns only the proof validator', () => { + const validators = createSecondStageTxValidationsForGossipedTransactions(proofVerifier); + + expect(Object.keys(validators)).toEqual(['proofValidator']); + }); + + it('assigns low tolerance severity to proof validator', () => { + const validators = createSecondStageTxValidationsForGossipedTransactions(proofVerifier); + + expect(validators.proofValidator.severity).toBe(PeerErrorSeverity.LowToleranceError); + }); + + it('proof validator has a validateTx method', () => { + const validators = createSecondStageTxValidationsForGossipedTransactions(proofVerifier); + + expect(typeof validators.proofValidator.validator.validateTx).toBe('function'); + }); + }); + + describe('createTxValidatorForReqResponseReceivedTxs', () => { + it('contains well-formedness validators only', () => { + const validator = createTxValidatorForReqResponseReceivedTxs(proofVerifier, { + l1ChainId: 1, + rollupVersion: 2, + }); + + const aggregate = validator as AggregateTxValidator; + expect(getValidatorNames(aggregate)).toEqual([ + MetadataTxValidator.name, + SizeTxValidator.name, + DataTxValidator.name, + TxProofValidator.name, + ]); + }); + }); + + describe('createTxValidatorForBlockProposalReceivedTxs', () => { + it('contains the same well-formedness validators as req/resp', () => { + const validator = createTxValidatorForBlockProposalReceivedTxs(proofVerifier, { + l1ChainId: 1, + rollupVersion: 2, + }); + + const aggregate = validator as AggregateTxValidator; + expect(getValidatorNames(aggregate)).toEqual([ + MetadataTxValidator.name, + SizeTxValidator.name, + DataTxValidator.name, + TxProofValidator.name, + ]); + }); + }); + + describe('createTxValidatorForAcceptingTxsOverRPC', () => { + let db: MockProxy; + + beforeEach(() => { + db = mock(); + }); + + it('contains the full set of validators with fee enforcement and proof verification', () => { + const validator = createTxValidatorForAcceptingTxsOverRPC(db, contractSource, proofVerifier, { + l1ChainId: 1, + rollupVersion: 2, + setupAllowList: [], + gasFees: new GasFees(1, 1), + timestamp: 100n, + blockNumber: BlockNumber(5), + txsPermitted: true, + }); + + const aggregate = validator as AggregateTxValidator; + expect(getValidatorNames(aggregate)).toEqual([ + TxPermittedValidator.name, + TimestampTxValidator.name, + SizeTxValidator.name, + MetadataTxValidator.name, + PhasesTxValidator.name, + BlockHeaderTxValidator.name, + DoubleSpendTxValidator.name, + DataTxValidator.name, + GasTxValidator.name, + TxProofValidator.name, + ]); + }); + + it('excludes gas validator when fee enforcement is skipped', () => { + const validator = createTxValidatorForAcceptingTxsOverRPC(db, contractSource, proofVerifier, { + l1ChainId: 1, + rollupVersion: 2, + setupAllowList: [], + gasFees: new GasFees(1, 1), + skipFeeEnforcement: true, + timestamp: 100n, + blockNumber: BlockNumber(5), + txsPermitted: true, + }); + + const aggregate = validator as AggregateTxValidator; + const names = getValidatorNames(aggregate); + expect(names).not.toContain(GasTxValidator.name); + expect(names).toContain(TxProofValidator.name); + }); + + it('excludes proof validator when no verifier is provided', () => { + const validator = createTxValidatorForAcceptingTxsOverRPC(db, contractSource, undefined, { + l1ChainId: 1, + rollupVersion: 2, + setupAllowList: [], + gasFees: new GasFees(1, 1), + timestamp: 100n, + blockNumber: BlockNumber(5), + txsPermitted: true, + }); + + const aggregate = validator as AggregateTxValidator; + const names = getValidatorNames(aggregate); + expect(names).not.toContain(TxProofValidator.name); + expect(names).toContain(GasTxValidator.name); + }); + }); + + describe('createTxValidatorForBlockBuilding', () => { + let db: MockProxy; + let globalVariables: MockProxy; + + beforeEach(() => { + db = mock(); + globalVariables = mock(); + globalVariables.timestamp = 100n; + globalVariables.blockNumber = BlockNumber(5); + globalVariables.gasFees = new GasFees(1, 1); + }); + + it('contains state-dependent validators only (no proof, no data)', () => { + const result = createTxValidatorForBlockBuilding(db, contractSource, globalVariables, []); + + const aggregate = result.preprocessValidator as AggregateTxValidator; + expect(getValidatorNames(aggregate)).toEqual([ + TimestampTxValidator.name, + PhasesTxValidator.name, + BlockHeaderTxValidator.name, + DoubleSpendTxValidator.name, + GasTxValidator.name, + ]); + }); + + it('returns a nullifierCache alongside the preprocessValidator', () => { + const result = createTxValidatorForBlockBuilding(db, contractSource, globalVariables, []); + + expect(result.nullifierCache).toBeDefined(); + expect(typeof result.nullifierCache!.addNullifiers).toBe('function'); + }); + }); + + describe('createTxValidatorForTransactionsEnteringPendingTxPool', () => { + it('contains the state-dependent checks missed by well-formedness validators', async () => { + const validator = await createTxValidatorForTransactionsEnteringPendingTxPool(synchronizer, 100n, BlockNumber(5)); + + const aggregate = validator as AggregateTxValidator; + expect(getValidatorNames(aggregate)).toEqual([ + GasLimitsValidator.name, + TimestampTxValidator.name, + DoubleSpendTxValidator.name, + BlockHeaderTxValidator.name, + ]); + }); + + it('syncs world state before creating the validator', async () => { + await createTxValidatorForTransactionsEnteringPendingTxPool(synchronizer, 100n, BlockNumber(5)); + + expect(synchronizer.syncImmediate).toHaveBeenCalled(); + }); }); }); diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/factory.ts b/yarn-project/p2p/src/msg_validators/tx_validator/factory.ts index 3b92c19f1a49..cf915d26421c 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/factory.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/factory.ts @@ -1,41 +1,91 @@ +/** + * Transaction validator factories for each tx entry point. + * + * Unsolicited transactions (gossip and RPC) are fully validated before acceptance. + * Transactions received via req/resp or block proposals are only checked for + * well-formedness because we must include them for block re-execution — they may + * ultimately be invalid, which is caught during block building and reported as + * part of block validation/attestation. See the README in this directory for the + * full validation strategy. + * + * 1. **Gossip** — full validation in two stages with a pool pre-check in between. + * Stage 1 (fast): metadata, data, timestamps, double-spend, gas, phases, block header. + * Pool pre-check: `canAddPendingTx` — skips proof verification if pool would reject. + * Stage 2 (slow): proof verification. + * Orchestrated by `handleGossipedTx` in `libp2p_service.ts`. + * + * 2. **JSON-RPC** — full validation including all state-dependent checks. + * Proof verification and fee enforcement are configurable for testing purposes. + * + * 3. **Req/resp & block proposals** — well-formedness checks only (metadata, size, + * data, proof). Stored for re-execution; validity against state is not checked here. + * + * 4. **Block building** — re-validates against current state immediately before + * sequencing. Catches invalid txs that entered via req/resp or block proposals. + * Proof and data checks are skipped since they were verified on entry. + * + * 5. **Pending pool migration** — when unmined txs (e.g. from req/resp or block + * proposals) are migrated to the pending pool, the pool runs the state-dependent + * checks they missed: double-spend, block header, gas limits, and timestamps. + * This runs on every tx potentially entering the pending pool. + */ import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import type { LoggerBindings } from '@aztec/foundation/log'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree'; import { ProtocolContractAddress, protocolContractsHash } from '@aztec/protocol-contracts'; +import type { BlockHash } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { GasFees } from '@aztec/stdlib/gas'; import type { AllowedElement, ClientProtocolCircuitVerifier, + MerkleTreeReadOperations, + PublicProcessorValidator, WorldStateSynchronizer, } from '@aztec/stdlib/interfaces/server'; import { PeerErrorSeverity } from '@aztec/stdlib/p2p'; -import { DatabasePublicStateSource, MerkleTreeId } from '@aztec/stdlib/trees'; -import type { Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx'; +import { DatabasePublicStateSource, MerkleTreeId, type PublicStateSource } from '@aztec/stdlib/trees'; +import type { GlobalVariables, Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx'; import type { UInt64 } from '@aztec/stdlib/types'; +import type { TxMetaData } from '../../mem_pools/tx_pool_v2/tx_metadata.js'; import { AggregateTxValidator } from './aggregate_tx_validator.js'; import { ArchiveCache } from './archive_cache.js'; -import { BlockHeaderTxValidator } from './block_header_validator.js'; +import { type ArchiveSource, BlockHeaderTxValidator } from './block_header_validator.js'; import { DataTxValidator } from './data_validator.js'; -import { DoubleSpendTxValidator } from './double_spend_validator.js'; -import { GasTxValidator } from './gas_validator.js'; +import { DoubleSpendTxValidator, type NullifierSource } from './double_spend_validator.js'; +import { GasLimitsValidator, GasTxValidator } from './gas_validator.js'; import { MetadataTxValidator } from './metadata_validator.js'; +import { NullifierCache } from './nullifier_cache.js'; import { PhasesTxValidator } from './phases_validator.js'; import { SizeTxValidator } from './size_validator.js'; import { TimestampTxValidator } from './timestamp_validator.js'; import { TxPermittedValidator } from './tx_permitted_validator.js'; import { TxProofValidator } from './tx_proof_validator.js'; -export interface MessageValidator { +/** + * A validator paired with a peer penalty severity. + * Used for gossip validation where each validator's failure triggers a peer penalization + * with the associated severity level. + */ +export interface TransactionValidator { validator: { validateTx(tx: Tx): Promise; }; severity: PeerErrorSeverity; } -export function createTxMessageValidators( +/** + * First stage of gossip validation — fast checks run before the pool pre-check. + * + * If any validator fails, the peer is penalized and the tx is rejected immediately, + * without consulting the pool or running proof verification. + * + * The `doubleSpendValidator` failure is special-cased by the caller (`handleGossipedTx`) + * to determine severity based on how recently the nullifier appeared. + */ +export function createFirstStageTxValidationsForGossipedTransactions( timestamp: UInt64, blockNumber: BlockNumber, worldStateSynchronizer: WorldStateSynchronizer, @@ -44,86 +94,106 @@ export function createTxMessageValidators( rollupVersion: number, protocolContractsHash: Fr, contractDataSource: ContractDataSource, - proofVerifier: ClientProtocolCircuitVerifier, txsPermitted: boolean, allowedInSetup: AllowedElement[] = [], bindings?: LoggerBindings, -): Record[] { +): Record { const merkleTree = worldStateSynchronizer.getCommitted(); - return [ - { - txsPermittedValidator: { - validator: new TxPermittedValidator(txsPermitted, bindings), - severity: PeerErrorSeverity.MidToleranceError, - }, - dataValidator: { - validator: new DataTxValidator(bindings), - severity: PeerErrorSeverity.HighToleranceError, - }, - metadataValidator: { - validator: new MetadataTxValidator( - { - l1ChainId: new Fr(l1ChainId), - rollupVersion: new Fr(rollupVersion), - protocolContractsHash, - vkTreeRoot: getVKTreeRoot(), - }, - bindings, - ), - severity: PeerErrorSeverity.HighToleranceError, - }, - timestampValidator: { - validator: new TimestampTxValidator( - { - timestamp, - blockNumber, - }, - bindings, - ), - severity: PeerErrorSeverity.MidToleranceError, - }, - doubleSpendValidator: { - validator: new DoubleSpendTxValidator( - { - nullifiersExist: async (nullifiers: Buffer[]) => { - const merkleTree = worldStateSynchronizer.getCommitted(); - const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers); - return indices.map(index => index !== undefined); - }, + return { + timestampValidator: { + validator: new TimestampTxValidator( + { + timestamp, + blockNumber, + }, + bindings, + ), + severity: PeerErrorSeverity.HighToleranceError, + }, + txsPermittedValidator: { + validator: new TxPermittedValidator(txsPermitted, bindings), + severity: PeerErrorSeverity.MidToleranceError, + }, + txSizeValidator: { + validator: new SizeTxValidator(bindings), + severity: PeerErrorSeverity.MidToleranceError, + }, + metadataValidator: { + validator: new MetadataTxValidator( + { + l1ChainId: new Fr(l1ChainId), + rollupVersion: new Fr(rollupVersion), + protocolContractsHash, + vkTreeRoot: getVKTreeRoot(), + }, + bindings, + ), + severity: PeerErrorSeverity.MidToleranceError, + }, + phasesValidator: { + validator: new PhasesTxValidator(contractDataSource, allowedInSetup, timestamp, bindings), + severity: PeerErrorSeverity.MidToleranceError, + }, + blockHeaderValidator: { + validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree), bindings), + severity: PeerErrorSeverity.HighToleranceError, + }, + doubleSpendValidator: { + validator: new DoubleSpendTxValidator( + { + nullifiersExist: async (nullifiers: Buffer[]) => { + const merkleTree = worldStateSynchronizer.getCommitted(); + const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers); + return indices.map(index => index !== undefined); }, - bindings, - ), - severity: PeerErrorSeverity.HighToleranceError, - }, - gasValidator: { - validator: new GasTxValidator( - new DatabasePublicStateSource(merkleTree), - ProtocolContractAddress.FeeJuice, - gasFees, - bindings, - ), - severity: PeerErrorSeverity.HighToleranceError, - }, - phasesValidator: { - validator: new PhasesTxValidator(contractDataSource, allowedInSetup, timestamp, bindings), - severity: PeerErrorSeverity.MidToleranceError, - }, - blockHeaderValidator: { - validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree), bindings), - severity: PeerErrorSeverity.HighToleranceError, - }, + }, + bindings, + ), + severity: PeerErrorSeverity.MidToleranceError, // This is handled specifically at the point of rejection by considering a recent window where it may have been valid }, - { - proofValidator: { - validator: new TxProofValidator(proofVerifier, bindings), - severity: PeerErrorSeverity.MidToleranceError, - }, + gasValidator: { + validator: new GasTxValidator( + new DatabasePublicStateSource(merkleTree), + ProtocolContractAddress.FeeJuice, + gasFees, + bindings, + ), + severity: PeerErrorSeverity.MidToleranceError, }, - ]; + dataValidator: { + validator: new DataTxValidator(bindings), + severity: PeerErrorSeverity.MidToleranceError, + }, + }; } -export function createTxReqRespValidator( +/** + * Second stage of gossip validation — expensive proof verification. + * + * Only runs after the first stage passes AND `canAddPendingTx` confirms the pool would + * accept the tx. This avoids wasting CPU on proof verification for txs the pool would reject + * (e.g., duplicates, insufficient balance, pool full). + */ +export function createSecondStageTxValidationsForGossipedTransactions( + proofVerifier: ClientProtocolCircuitVerifier, + bindings?: LoggerBindings, +): Record { + return { + proofValidator: { + validator: new TxProofValidator(proofVerifier, bindings), + severity: PeerErrorSeverity.LowToleranceError, + }, + }; +} + +/** + * Well-formedness checks only: metadata, size, data, and proof. + * Used for req/resp and block proposal txs. These txs must be accepted for block + * re-execution even though they may be invalid against current state — that is + * caught later by the block building validator. + */ +function createTxValidatorForMinimumTxIntegrityChecks( verifier: ClientProtocolCircuitVerifier, { l1ChainId, @@ -149,3 +219,209 @@ export function createTxReqRespValidator( new TxProofValidator(verifier, bindings), ); } + +/** + * Validators for txs received via req/resp or filestores. + * Checks well-formedness only — we must accept these for re-execution even if they + * are invalid against current state. State-dependent checks happen when the tx + * enters the pending pool or during block building. + */ +export function createTxValidatorForReqResponseReceivedTxs( + verifier: ClientProtocolCircuitVerifier, + { + l1ChainId, + rollupVersion, + }: { + l1ChainId: number; + rollupVersion: number; + }, + bindings?: LoggerBindings, +): TxValidator { + return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings); +} + +/** + * Validators for txs received in block proposals. + * Same as req/resp — well-formedness only. We must store these for block + * re-execution; their validity against state is checked during block building. + */ +export function createTxValidatorForBlockProposalReceivedTxs( + verifier: ClientProtocolCircuitVerifier, + { + l1ChainId, + rollupVersion, + }: { + l1ChainId: number; + rollupVersion: number; + }, + bindings?: LoggerBindings, +): TxValidator { + return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings); +} + +/** + * Validators for unsolicited txs received over JSON-RPC (from a local wallet/PXE). + * Full validation — all state-dependent checks are run. Proof verification is optional + * (can be skipped for testing purposes). Fee enforcement is also optional (skipped for testing/dev). + * Called from `AztecNodeService.isValidTx()`. + */ +export function createTxValidatorForAcceptingTxsOverRPC( + db: MerkleTreeReadOperations, + contractDataSource: ContractDataSource, + verifier: ClientProtocolCircuitVerifier | undefined, + { + l1ChainId, + rollupVersion, + setupAllowList, + gasFees, + skipFeeEnforcement, + timestamp, + blockNumber, + txsPermitted, + }: { + l1ChainId: number; + rollupVersion: number; + setupAllowList: AllowedElement[]; + gasFees: GasFees; + skipFeeEnforcement?: boolean; + timestamp: UInt64; + blockNumber: BlockNumber; + txsPermitted: boolean; + }, + bindings?: LoggerBindings, +): TxValidator { + const validators: TxValidator[] = [ + new TxPermittedValidator(txsPermitted, bindings), + new TimestampTxValidator( + { + timestamp, + blockNumber, + }, + bindings, + ), + new SizeTxValidator(bindings), + new MetadataTxValidator( + { + l1ChainId: new Fr(l1ChainId), + rollupVersion: new Fr(rollupVersion), + protocolContractsHash, + vkTreeRoot: getVKTreeRoot(), + }, + bindings, + ), + new PhasesTxValidator(contractDataSource, setupAllowList, timestamp, bindings), + new BlockHeaderTxValidator(new ArchiveCache(db), bindings), + new DoubleSpendTxValidator(new NullifierCache(db), bindings), + new DataTxValidator(bindings), + ]; + + if (!skipFeeEnforcement) { + validators.push( + new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings), + ); + } + + if (verifier) { + validators.push(new TxProofValidator(verifier, bindings)); + } + + return new AggregateTxValidator(...validators); +} + +/** + * Validators for txs about to be included in a block by the sequencer. + * Re-validates against current state. This is where invalid txs that entered via + * req/resp or block proposals are caught — their invalidity is reported as part + * of block validation/attestation. Proof and data checks are omitted since they + * were already verified on entry. + * Called from `CheckpointBuilder.makeBlockBuilderDeps()`. + */ +export function createTxValidatorForBlockBuilding( + db: MerkleTreeReadOperations, + contractDataSource: ContractDataSource, + globalVariables: GlobalVariables, + setupAllowList: AllowedElement[], + bindings?: LoggerBindings, +): PublicProcessorValidator { + const nullifierCache = new NullifierCache(db); + const archiveCache = new ArchiveCache(db); + const publicStateSource = new DatabasePublicStateSource(db); + + return { + preprocessValidator: createTxValidatorForValidatingAgainstCurrentState( + nullifierCache, + archiveCache, + publicStateSource, + contractDataSource, + globalVariables, + setupAllowList, + bindings, + ), + nullifierCache, + }; +} + +function createTxValidatorForValidatingAgainstCurrentState( + nullifierSource: NullifierSource, + archiveSource: ArchiveSource, + publicStateSource: PublicStateSource, + contractDataSource: ContractDataSource, + globalVariables: GlobalVariables, + setupAllowList: AllowedElement[], + bindings?: LoggerBindings, +): TxValidator { + // We don't include the TxProofValidator nor the DataTxValidator here because they are already checked by the time we get to block building. + return new AggregateTxValidator( + new TimestampTxValidator( + { + timestamp: globalVariables.timestamp, + blockNumber: globalVariables.blockNumber, + }, + bindings, + ), + new PhasesTxValidator(contractDataSource, setupAllowList, globalVariables.timestamp, bindings), + new BlockHeaderTxValidator(archiveSource, bindings), + new DoubleSpendTxValidator(nullifierSource, bindings), + new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, globalVariables.gasFees, bindings), + ); +} + +/** + * Validators for txs migrating to the pending pool. + * + * Txs that arrived via req/resp or block proposals only had well-formedness checks + * on receipt. When they fail to be mined and are migrated to the pending pool, we + * run the state-dependent checks they missed: double-spend, block header, gas limits, + * and timestamp expiry. This is run on EVERY tx potentially entering the pending pool + * — called inside `TxPoolV2Impl` during `addPendingTxs`, `prepareForSlot` (unprotect), + * `handlePrunedBlocks` (unmine), and startup hydration. + * + * Operates on `TxMetaData` rather than full `Tx` since metadata is pre-built by the pool. + * Injected into `TxPoolV2` as the `createTxValidator` factory in `TxPoolV2Dependencies`. + */ +export async function createTxValidatorForTransactionsEnteringPendingTxPool( + worldStateSynchronizer: WorldStateSynchronizer, + timestamp: bigint, + blockNumber: BlockNumber, + bindings?: LoggerBindings, +): Promise> { + await worldStateSynchronizer.syncImmediate(); + const merkleTree = worldStateSynchronizer.getCommitted(); + const nullifierSource: NullifierSource = { + nullifiersExist: async (nullifiers: Buffer[]) => { + const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers); + return indices.map(index => index !== undefined); + }, + }; + const archiveSource: ArchiveSource = { + getArchiveIndices: (archives: BlockHash[]) => { + return merkleTree.findLeafIndices(MerkleTreeId.ARCHIVE, archives); + }, + }; + return new AggregateTxValidator( + new GasLimitsValidator(bindings), + new TimestampTxValidator({ timestamp, blockNumber }, bindings), + new DoubleSpendTxValidator(nullifierSource, bindings), + new BlockHeaderTxValidator(archiveSource, bindings), + ); +} diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.test.ts b/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.test.ts index 0330c20c496e..d616b5547802 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.test.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.test.ts @@ -1,9 +1,10 @@ import { - AVM_MAX_PROCESSABLE_L2_GAS, DEFAULT_DA_GAS_LIMIT, DEFAULT_TEARDOWN_DA_GAS_LIMIT, - FIXED_DA_GAS, - FIXED_L2_GAS, + MAX_PROCESSABLE_L2_GAS, + PRIVATE_TX_L2_GAS_OVERHEAD, + PUBLIC_TX_L2_GAS_OVERHEAD, + TX_DA_GAS_OVERHEAD, } from '@aztec/constants'; import { Fr } from '@aztec/foundation/curves/bn254'; import type { Writeable } from '@aztec/foundation/types'; @@ -22,6 +23,7 @@ import { type Tx, } from '@aztec/stdlib/tx'; +import assert from 'assert'; import { type MockProxy, mock, mockFn } from 'jest-mock-extended'; import { GasTxValidator } from './gas_validator.js'; @@ -111,28 +113,101 @@ describe('GasTxValidator', () => { await expectInvalid(tx, TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE); }); - it('rejects txs if the DA gas limit is not above the minimum amount', async () => { - tx.data.constants.txContext.gasSettings = GasSettings.default({ - gasLimits: new Gas(1, FIXED_L2_GAS), - maxFeesPerGas: gasFees.clone(), + const makePrivateTx = async () => { + const privateTx = await mockTx(1, { + numberOfNonRevertiblePublicCallRequests: 0, + numberOfRevertiblePublicCallRequests: 0, + hasPublicTeardownCallRequest: false, }); - await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); - }); + assert(!privateTx.data.forPublic); + privateTx.data.feePayer = payer; + privateTx.data.constants.txContext.gasSettings = GasSettings.default({ maxFeesPerGas: gasFees.clone() }); + return privateTx; + }; - it('rejects txs if the L2 gas limit is not above the minimum amount', async () => { - tx.data.constants.txContext.gasSettings = GasSettings.default({ - gasLimits: new Gas(FIXED_DA_GAS, 1), - maxFeesPerGas: gasFees.clone(), + describe('gas limits', () => { + it('accepts public tx at exactly the minimum gas limits', async () => { + assert(!!tx.data.forPublic); + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(TX_DA_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD), + maxFeesPerGas: gasFees.clone(), + }); + mockBalance(tx.data.constants.txContext.gasSettings.getFeeLimit().toBigInt()); + await expectValid(tx); + }); + + it('accepts private tx at exactly the minimum gas limits', async () => { + const privateTx = await makePrivateTx(); + privateTx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(TX_DA_GAS_OVERHEAD, PRIVATE_TX_L2_GAS_OVERHEAD), + maxFeesPerGas: gasFees.clone(), + }); + mockBalance(privateTx.data.constants.txContext.gasSettings.getFeeLimit().toBigInt()); + await expectValid(privateTx); + }); + + it('rejects public tx below the public L2 gas minimum', async () => { + assert(!!tx.data.forPublic); + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(TX_DA_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD - 1), + maxFeesPerGas: gasFees.clone(), + }); + await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); + }); + + it('rejects private tx below the private L2 gas minimum', async () => { + const privateTx = await makePrivateTx(); + privateTx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(TX_DA_GAS_OVERHEAD, PRIVATE_TX_L2_GAS_OVERHEAD - 1), + maxFeesPerGas: gasFees.clone(), + }); + await expectInvalid(privateTx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); + }); + + it('rejects public tx at private L2 gas minimum (between the two thresholds)', async () => { + assert(!!tx.data.forPublic); + // PRIVATE_TX_L2_GAS_OVERHEAD is enough for a private tx but not for a public tx. + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(TX_DA_GAS_OVERHEAD, PRIVATE_TX_L2_GAS_OVERHEAD), + maxFeesPerGas: gasFees.clone(), + }); + await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); + }); + + it('rejects tx below DA gas minimum', async () => { + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(TX_DA_GAS_OVERHEAD - 1, PUBLIC_TX_L2_GAS_OVERHEAD), + maxFeesPerGas: gasFees.clone(), + }); + await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); + }); + + it('rejects tx below both DA and L2 gas minimums', async () => { + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(1, 1), + maxFeesPerGas: gasFees.clone(), + }); + await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); }); - await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); - }); - it('rejects txs if the DA and L2 gas limits are not above the minimum amount', async () => { - tx.data.constants.txContext.gasSettings = GasSettings.default({ - gasLimits: new Gas(1, 1), - maxFeesPerGas: gasFees.clone(), + it('rejects public tx if L2 gas limit is too high', async () => { + tx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(DEFAULT_DA_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS + 1), + maxFeesPerGas: gasFees.clone(), + teardownGasLimits: new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, 1), + }); + await expectInvalid(tx, TX_ERROR_GAS_LIMIT_TOO_HIGH); + }); + + it('rejects private tx if L2 gas limit is too high', async () => { + const privateTx = await makePrivateTx(); + privateTx.data.constants.txContext.gasSettings = GasSettings.default({ + gasLimits: new Gas(DEFAULT_DA_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS + 1), + maxFeesPerGas: gasFees.clone(), + teardownGasLimits: new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, 1), + }); + await expectInvalid(privateTx, TX_ERROR_GAS_LIMIT_TOO_HIGH); }); - await expectInvalid(tx, TX_ERROR_INSUFFICIENT_GAS_LIMIT); }); it('skips txs with not enough fee per da gas', async () => { @@ -144,13 +219,4 @@ describe('GasTxValidator', () => { gasFees.feePerL2Gas = gasFees.feePerL2Gas + 1n; await expectSkipped(tx, TX_ERROR_INSUFFICIENT_FEE_PER_GAS); }); - - it('rejects txs if the l2 gas limit is too high', async () => { - tx.data.constants.txContext.gasSettings = GasSettings.default({ - gasLimits: new Gas(DEFAULT_DA_GAS_LIMIT, AVM_MAX_PROCESSABLE_L2_GAS + 1), - maxFeesPerGas: gasFees.clone(), - teardownGasLimits: new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, 1), - }); - await expectInvalid(tx, TX_ERROR_GAS_LIMIT_TOO_HIGH); - }); }); diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.ts b/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.ts index 2b07bd66cd0b..8ace5ceabbc6 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/gas_validator.ts @@ -1,4 +1,9 @@ -import { AVM_MAX_PROCESSABLE_L2_GAS, FIXED_DA_GAS, FIXED_L2_GAS } from '@aztec/constants'; +import { + MAX_PROCESSABLE_L2_GAS, + PRIVATE_TX_L2_GAS_OVERHEAD, + PUBLIC_TX_L2_GAS_OVERHEAD, + TX_DA_GAS_OVERHEAD, +} from '@aztec/constants'; import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log'; import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; @@ -16,6 +21,86 @@ import { import { getFeePayerClaimAmount, getTxFeeLimit } from './fee_payer_balance.js'; +/** Structural interface for types that carry gas limit data, used by {@link GasLimitsValidator}. */ +export interface HasGasLimitData { + txHash: { toString(): string }; + data: { + // We just need to know whether there is something here or not + forPublic?: unknown; + constants: { + txContext: { + gasSettings: { gasLimits: Gas }; + }; + }; + }; +} + +/** + * Validates that a transaction's gas limits are within acceptable bounds. + * + * Rejects transactions whose gas limits fall below the fixed minimums (FIXED_DA_GAS, + * FIXED_L2_GAS) or exceed the AVM's maximum processable L2 gas. This is a cheap, + * stateless check that operates on gas settings alone. + * + * Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData} + * (used during pending pool migration). + * + * Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}. + */ +export class GasLimitsValidator implements TxValidator { + #log: Logger; + + constructor(bindings?: LoggerBindings) { + this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings); + } + + validateTx(tx: T): Promise { + return Promise.resolve(this.validateGasLimit(tx)); + } + + /** Checks gas limits are >= fixed minimums and <= AVM max processable L2 gas. */ + validateGasLimit(tx: T): TxValidationResult { + const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits; + const minGasLimits = new Gas( + TX_DA_GAS_OVERHEAD, + tx.data.forPublic ? PUBLIC_TX_L2_GAS_OVERHEAD : PRIVATE_TX_L2_GAS_OVERHEAD, + ); + + if (minGasLimits.gtAny(gasLimits)) { + this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, { + gasLimits, + minGasLimits, + }); + return { result: 'invalid', reason: [TX_ERROR_INSUFFICIENT_GAS_LIMIT] }; + } + + if (gasLimits.l2Gas > MAX_PROCESSABLE_L2_GAS) { + this.#log.verbose(`Rejecting transaction due to the gas limit(s) being higher than the maximum processable gas`, { + gasLimits, + minGasLimits, + }); + return { result: 'invalid', reason: [TX_ERROR_GAS_LIMIT_TOO_HIGH] }; + } + + return { result: 'valid' }; + } +} + +/** + * Validates that a transaction can pay its gas fees. + * + * Runs three checks in order: + * 1. **Gas limits** (delegates to {@link GasLimitsValidator}) — rejects if limits are + * out of bounds. + * 2. **Max fee per gas** — skips (not rejects) the tx if its maxFeesPerGas is below + * the current block's gas fees. We skip rather than reject because the tx may + * become eligible in a later block with lower fees. + * 3. **Fee payer balance** — reads the fee payer's FeeJuice balance from public state, + * adds any pending claim from a setup-phase `_increase_public_balance` call, and + * rejects if the total is less than the tx's fee limit (gasLimits * maxFeePerGas). + * + * Used by: gossip (stage 1), RPC, and block building validators. + */ export class GasTxValidator implements TxValidator { #log: Logger; #publicDataSource: PublicStateSource; @@ -26,7 +111,7 @@ export class GasTxValidator implements TxValidator { publicDataSource: PublicStateSource, feeJuiceAddress: AztecAddress, gasFees: GasFees, - bindings?: LoggerBindings, + private bindings?: LoggerBindings, ) { this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings); this.#publicDataSource = publicDataSource; @@ -35,7 +120,7 @@ export class GasTxValidator implements TxValidator { } async validateTx(tx: Tx): Promise { - const gasLimitValidation = this.#validateGasLimit(tx); + const gasLimitValidation = new GasLimitsValidator(this.bindings).validateGasLimit(tx); if (gasLimitValidation.result === 'invalid') { return Promise.resolve(gasLimitValidation); } @@ -69,31 +154,9 @@ export class GasTxValidator implements TxValidator { } /** - * Check whether the tx's gas limit is above the minimum amount. + * Checks the fee payer has enough FeeJuice balance to cover the tx's fee limit. + * Accounts for any pending claim from a setup-phase `_increase_public_balance` call. */ - #validateGasLimit(tx: Tx): TxValidationResult { - const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits; - const minGasLimits = new Gas(FIXED_DA_GAS, FIXED_L2_GAS); - - if (minGasLimits.gtAny(gasLimits)) { - this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, { - gasLimits, - minGasLimits, - }); - return { result: 'invalid', reason: [TX_ERROR_INSUFFICIENT_GAS_LIMIT] }; - } - - if (gasLimits.l2Gas > AVM_MAX_PROCESSABLE_L2_GAS) { - this.#log.verbose(`Rejecting transaction due to the gas limit(s) being higher than the maximum processable gas`, { - gasLimits, - minGasLimits, - }); - return { result: 'invalid', reason: [TX_ERROR_GAS_LIMIT_TOO_HIGH] }; - } - - return { result: 'valid' }; - } - public async validateTxFee(tx: Tx): Promise { const feePayer = tx.data.feePayer; diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/index.ts b/yarn-project/p2p/src/msg_validators/tx_validator/index.ts index 12322d2fe779..dcdd4fb050e9 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/index.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/index.ts @@ -12,3 +12,4 @@ export * from './archive_cache.js'; export * from './tx_permitted_validator.js'; export * from './timestamp_validator.js'; export * from './size_validator.js'; +export * from './factory.js'; diff --git a/yarn-project/validator-client/src/tx_validator/nullifier_cache.test.ts b/yarn-project/p2p/src/msg_validators/tx_validator/nullifier_cache.test.ts similarity index 100% rename from yarn-project/validator-client/src/tx_validator/nullifier_cache.test.ts rename to yarn-project/p2p/src/msg_validators/tx_validator/nullifier_cache.test.ts diff --git a/yarn-project/validator-client/src/tx_validator/nullifier_cache.ts b/yarn-project/p2p/src/msg_validators/tx_validator/nullifier_cache.ts similarity index 100% rename from yarn-project/validator-client/src/tx_validator/nullifier_cache.ts rename to yarn-project/p2p/src/msg_validators/tx_validator/nullifier_cache.ts diff --git a/yarn-project/p2p/src/services/dummy_service.ts b/yarn-project/p2p/src/services/dummy_service.ts index 44e6c4367512..73f4c4d21abd 100644 --- a/yarn-project/p2p/src/services/dummy_service.ts +++ b/yarn-project/p2p/src/services/dummy_service.ts @@ -1,6 +1,6 @@ import type { EthAddress } from '@aztec/foundation/eth-address'; import type { PeerInfo } from '@aztec/stdlib/interfaces/server'; -import type { Gossipable, PeerErrorSeverity } from '@aztec/stdlib/p2p'; +import type { Gossipable, PeerErrorSeverity, TopicType } from '@aztec/stdlib/p2p'; import { Tx, TxHash } from '@aztec/stdlib/tx'; import type { PeerId } from '@libp2p/interface'; @@ -44,6 +44,10 @@ export class DummyP2PService implements P2PService { return []; } + getGossipMeshPeerCount(_topicType: TopicType): number { + return 0; + } + /** * Starts the dummy implementation. * @returns A resolved promise. @@ -137,14 +141,10 @@ export class DummyP2PService implements P2PService { return undefined; } - validate(_txs: Tx[]): Promise { + validateTxsReceivedInBlockProposal(_txs: Tx[]): Promise { return Promise.resolve(); } - validatePropagatedTx(_tx: Tx, _peerId: PeerId): Promise { - return Promise.resolve(true); - } - addReqRespSubProtocol( _subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler, diff --git a/yarn-project/p2p/src/services/encoding.bench.test.ts b/yarn-project/p2p/src/services/encoding.bench.test.ts new file mode 100644 index 000000000000..06da50451304 --- /dev/null +++ b/yarn-project/p2p/src/services/encoding.bench.test.ts @@ -0,0 +1,129 @@ +import { asyncPool } from '@aztec/foundation/async-pool'; +import { randomBytes } from '@aztec/foundation/crypto/random'; +import { sha256 } from '@aztec/foundation/crypto/sha256'; +import { MAX_L2_BLOCK_SIZE_KB, MAX_MESSAGE_SIZE_KB, MAX_TX_SIZE_KB } from '@aztec/stdlib/p2p'; + +import { createHash } from 'node:crypto'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { type RecordableHistogram, createHistogram } from 'node:perf_hooks'; + +const HASH_COUNT = 20; +const TOPIC = '/aztec/tx/0.1.0'; + +const MESSAGE_SIZES_KB = [1, 64, MAX_TX_SIZE_KB, MAX_L2_BLOCK_SIZE_KB, MAX_MESSAGE_SIZE_KB] as const; + +type SizeKb = (typeof MESSAGE_SIZES_KB)[number]; + +const CONCURRENCY_LEVELS = [1, 4] as const; +type CaseKey = `${SizeKb}-${(typeof CONCURRENCY_LEVELS)[number]}`; + +const NS_PER_MS = 1e6; + +const CASES = MESSAGE_SIZES_KB.flatMap(s => CONCURRENCY_LEVELS.map(c => [s, c] as const)); + +describe('P2P Message ID: Benchmarks', () => { + let hashJsHistograms: Record; + let nodeCryptoHistograms: Record; + let subtleHistograms: Record; + + let messageData: Record; + + beforeAll(() => { + const allKeys = CASES.map(([s, c]) => `${s}-${c}` as CaseKey); + hashJsHistograms = Object.fromEntries(allKeys.map(k => [k, { h: createHistogram(), total: 0 }])) as any; + nodeCryptoHistograms = Object.fromEntries(allKeys.map(k => [k, { h: createHistogram(), total: 0 }])) as any; + subtleHistograms = Object.fromEntries(allKeys.map(k => [k, { h: createHistogram(), total: 0 }])) as any; + + messageData = Object.fromEntries(MESSAGE_SIZES_KB.map(sizeKb => [sizeKb, randomBytes(sizeKb * 1024)])) as any; + }); + + afterAll(async () => { + const implementations = [ + { key: 'hash.js', label: 'hashJs.sha256 x' + HASH_COUNT, histograms: hashJsHistograms }, + { key: 'node-crypto', label: 'crypto.createHash x' + HASH_COUNT, histograms: nodeCryptoHistograms }, + { key: 'web-crypto', label: 'globalThis.crypto.subtle.digest x' + HASH_COUNT, histograms: subtleHistograms }, + ]; + + const data: { name: string; value: number; unit: string }[] = []; + for (const [sizeKb, concurrency] of CASES) { + const key: CaseKey = `${sizeKb}-${concurrency}`; + for (const impl of implementations) { + const { h, total } = impl.histograms[key]; + data.push({ name: `MsgId/${impl.key}/x${concurrency}/${sizeKb}kb/avg`, value: h.mean, unit: 'ms' }); + data.push({ name: `MsgId/${impl.key}/x${concurrency}/${sizeKb}kb/p50`, value: h.percentile(50), unit: 'ms' }); + data.push({ name: `MsgId/${impl.key}/x${concurrency}/${sizeKb}kb/p99`, value: h.percentile(99), unit: 'ms' }); + data.push({ name: `MsgId/${impl.key}/x${concurrency}/${sizeKb}kb/sum`, value: total, unit: 'ms' }); + } + } + + if (process.env.BENCH_OUTPUT) { + await fs.mkdir(path.dirname(process.env.BENCH_OUTPUT), { recursive: true }); + await fs.writeFile(process.env.BENCH_OUTPUT, JSON.stringify(data, null, 2)); + } else if (process.env.BENCH_OUTPUT_MD) { + await fs.mkdir(path.dirname(process.env.BENCH_OUTPUT_MD), { recursive: true }); + await using f = await fs.open(process.env.BENCH_OUTPUT_MD, 'w'); + await f.write('| Function | CONCURRENCY | Size (KB) | Avg (ms) | P50 (ms) | P99 (ms) | TOTAL (ms) |\n'); + await f.write('|----------|---|-----------|----------|----------|----------|------------|\n'); + for (const [sizeKb, concurrency] of CASES) { + const key: CaseKey = `${sizeKb}-${concurrency}`; + for (const impl of implementations) { + const { h, total } = impl.histograms[key]; + await f.write( + `| ${impl.label} | ${concurrency} | ${sizeKb} | ${h.mean} | ${h.percentile(50)} | ${h.percentile(99)} | ${total} |\n`, + ); + } + } + } + }); + + it.each(CASES)('hash.js sha256: %d KB x%d', async (sizeKb, concurrency) => { + const data = messageData[sizeKb as SizeKb]; + const key: CaseKey = `${sizeKb}-${concurrency}`; + const res = hashJsHistograms[key]; + + const testStart = process.hrtime.bigint(); + await asyncPool(concurrency, Array(HASH_COUNT), () => { + const start = process.hrtime.bigint(); + sha256(Buffer.concat([Buffer.from(TOPIC), data])).subarray(0, 20); + const elapsed = Number(process.hrtime.bigint() - start) / NS_PER_MS; + res.h.record(Math.trunc(Math.max(1, elapsed))); + return Promise.resolve(); + }); + res.total = Number(process.hrtime.bigint() - testStart) / NS_PER_MS; + }); + + it.each(CASES)('node:crypto createHash: %d KB x%d', async (sizeKb, concurrency) => { + const data = messageData[sizeKb as SizeKb]; + const key: CaseKey = `${sizeKb}-${concurrency}`; + const res = nodeCryptoHistograms[key]; + + const testStart = process.hrtime.bigint(); + await asyncPool(concurrency, Array(HASH_COUNT), () => { + const start = process.hrtime.bigint(); + createHash('sha256').update(TOPIC).update(data).digest().subarray(0, 20); + const elapsed = Number(process.hrtime.bigint() - start) / NS_PER_MS; + res.h.record(Math.trunc(Math.max(1, elapsed))); + return Promise.resolve(); + }); + res.total = Number(process.hrtime.bigint() - testStart) / NS_PER_MS; + }); + + it.each(CASES)('crypto.subtle.digest parallel: %d KB x%d', async (sizeKb, concurrency) => { + const data = messageData[sizeKb as SizeKb]; + const concat = Buffer.concat([Buffer.from(TOPIC), data]); + const key: CaseKey = `${sizeKb}-${concurrency}`; + const res = subtleHistograms[key]; + + const testStart = process.hrtime.bigint(); + + await asyncPool(concurrency, Array(HASH_COUNT), async () => { + const start = process.hrtime.bigint(); + await crypto.subtle.digest('SHA-256', concat).then(buf => Buffer.from(buf).subarray(0, 20)); + const elapsed = Number(process.hrtime.bigint() - start) / NS_PER_MS; + res.h.record(Math.trunc(Math.max(1, elapsed))); + }); + + res.total = Number(process.hrtime.bigint() - testStart) / NS_PER_MS; + }); +}); diff --git a/yarn-project/p2p/src/services/encoding.ts b/yarn-project/p2p/src/services/encoding.ts index 9a4d610c4fa5..0aea0032d158 100644 --- a/yarn-project/p2p/src/services/encoding.ts +++ b/yarn-project/p2p/src/services/encoding.ts @@ -1,11 +1,11 @@ // Taken from lodestar: https://github.com/ChainSafe/lodestar -import { sha256 } from '@aztec/foundation/crypto/sha256'; import { createLogger } from '@aztec/foundation/log'; import { MAX_TX_SIZE_KB, TopicType, getTopicFromString } from '@aztec/stdlib/p2p'; import type { RPC } from '@chainsafe/libp2p-gossipsub/message'; import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types'; import type { Message } from '@libp2p/interface'; +import { webcrypto } from 'node:crypto'; import { compressSync, uncompressSync } from 'snappy'; import xxhashFactory from 'xxhash-wasm'; @@ -44,11 +44,10 @@ export function msgIdToStrFn(msgId: Uint8Array): string { * @param message - The libp2p message * @returns The message identifier */ -export function getMsgIdFn(message: Message) { - const { topic } = message; - - const vec = [Buffer.from(topic), message.data]; - return sha256(Buffer.concat(vec)).subarray(0, 20); +export async function getMsgIdFn({ topic, data }: Message): Promise { + const buffer = Buffer.concat([Buffer.from(topic), data]); + const hash = await webcrypto.subtle.digest('SHA-256', buffer); + return Buffer.from(hash.slice(0, 20)); } const DefaultMaxSizesKb: Record = { diff --git a/yarn-project/p2p/src/services/gossipsub/README.md b/yarn-project/p2p/src/services/gossipsub/README.md index e7d132544b62..5736bc70d5ef 100644 --- a/yarn-project/p2p/src/services/gossipsub/README.md +++ b/yarn-project/p2p/src/services/gossipsub/README.md @@ -40,7 +40,7 @@ We configure all parameters (P1-P4) with values calculated dynamically from netw | P3b: meshFailurePenalty | -34 per topic | Sticky penalty after pruning | | P4: invalidMessageDeliveries | -20 per message | Attack detection | -**Important:** P1 and P2 are only enabled on topics with P3 enabled (block_proposal, checkpoint_proposal, checkpoint_attestation). The tx topic has all scoring disabled except P4, to prevent free positive score accumulation that would offset penalties from other topics. +**Important:** P1 and P2 are only enabled on topics with P3 enabled. By default, P3 is enabled for checkpoint_proposal and checkpoint_attestation (2 topics). Block proposal scoring is controlled by `expectedBlockProposalsPerSlot` (current default: `0`, including when env var is unset, so disabled) - see [Block Proposals](#block-proposals-block_proposal) for details. The tx topic has all scoring disabled except P4, to prevent free positive score accumulation that would offset penalties from other topics. ## Exponential Decay @@ -217,7 +217,21 @@ Transactions are submitted unpredictably by users, so we cannot set meaningful d ### Block Proposals (block_proposal) -In Multi-Block-Per-Slot (MBPS) mode, N-1 block proposals are gossiped per slot (the last block is bundled with the checkpoint). In single-block mode, this is 0. +Block proposal scoring is controlled by the `expectedBlockProposalsPerSlot` config (`SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT` env var): + +| Config Value | Behavior | +|-------------|----------| +| `0` (current default) | Block proposal P3 scoring is **disabled** | +| Positive number | Uses the provided value as expected proposals per slot | +| `undefined` | Falls back to `blocksPerSlot - 1` (MBPS mode: N-1, single block: 0) | + +**Current behavior note:** In the current implementation, if `SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT` is not set, config mapping applies `0` by default (scoring disabled). The `undefined` fallback above is currently reachable only if the value is explicitly provided as `undefined` in code. + +**Future intent:** Once throughput is stable, we may change env parsing/defaults so an unset env var resolves to `undefined` again (re-enabling automatic fallback to `blocksPerSlot - 1`). + +**Why disabled by default?** In MBPS mode, gossipsub expects N-1 block proposals per slot. When transaction throughput is low (as expected at launch), fewer blocks are actually built, causing peers to be incorrectly penalized for under-delivering block proposals. The default of 0 disables this scoring. Set to a positive value when throughput increases and block production is consistent. + +In MBPS mode (when enabled), N-1 block proposals are gossiped per slot (the last block is bundled with the checkpoint). In single-block mode, this is 0. ### Checkpoint Proposals (checkpoint_proposal) @@ -241,6 +255,7 @@ The scoring parameters depend on: | `targetCommitteeSize` | L1RollupConstants | 48 | | `heartbeatInterval` | P2PConfig.gossipsubInterval | 700ms | | `blockDurationMs` | P2PConfig.blockDurationMs | undefined (single block) | +| `expectedBlockProposalsPerSlot` | P2PConfig.expectedBlockProposalsPerSlot | 0 (disabled; current unset-env behavior) | ## Invalid Message Handling (P4) @@ -320,9 +335,9 @@ Conversely, if topic scores are low, a peer slightly above the disconnect thresh Topic scores provide **burst response** to attacks, while app score provides **stable baseline**: -- P1 (time in mesh): Max +8 per topic (+24 across 3 topics) -- P2 (first deliveries): Max +25 per topic (+75 across 3 topics, but decays fast) -- P3 (under-delivery): Max -34 per topic (-102 across 3 topics in MBPS; -68 in single-block mode) +- P1 (time in mesh): Max +8 per topic (+16 default, +24 with block proposal scoring enabled) +- P2 (first deliveries): Max +25 per topic (+50 default, +75 with block proposal scoring, but decays fast) +- P3 (under-delivery): Max -34 per topic (-68 default with 2 topics, -102 with block proposal scoring enabled) - P4 (invalid messages): -20 per invalid message, can spike to -2000+ during attacks Example attack scenario: @@ -373,21 +388,21 @@ When a peer is pruned from the mesh: 3. **P3b captures the penalty**: The P3 deficit at prune time becomes P3b, which decays slowly After pruning, the peer's score consists mainly of P3b: -- **Total P3b across 3 topics: -102** (max) +- **Total P3b: -68** (default, 2 topics) or **-102** (with block proposal scoring enabled, 3 topics) - **Recovery time**: P3b decays to ~1% over one decay window (2-5 slots = 2-6 minutes) - **Grafting eligibility**: Peer can be grafted when score ≥ 0, but asymptotic decay means recovery is slow ### Why Non-Contributors Aren't Disconnected -With P3b capped at -102 total after pruning (MBPS mode). In single-block mode, the cap is -68: +With P3b capped at -68 (default, 2 topics) or -102 (with block proposal scoring, 3 topics) after pruning: | Threshold | Value | P3b Score | Triggered? | |-----------|-------|-----------|------------| -| gossipThreshold | -500 | -102 (MBPS) / -68 (single) | No | -| publishThreshold | -1000 | -102 (MBPS) / -68 (single) | No | -| graylistThreshold | -2000 | -102 (MBPS) / -68 (single) | No | +| gossipThreshold | -500 | -68 (default) / -102 (block scoring on) | No | +| publishThreshold | -1000 | -68 (default) / -102 (block scoring on) | No | +| graylistThreshold | -2000 | -68 (default) / -102 (block scoring on) | No | -**A score of -102 (MBPS) or -68 (single-block) is well above -500**, so non-contributing peers: +**A score of -68 or -102 is well above -500**, so non-contributing peers: - Are pruned from mesh (good - stops them slowing propagation) - Still receive gossip (can recover by reconnecting/restarting) - Are NOT disconnected unless they also have application-level penalties @@ -547,7 +562,7 @@ What happens when a peer experiences a network outage and stops delivering messa While the peer is disconnected: 1. **P3 penalty accumulates**: The message delivery counter decays toward 0, causing increasing P3 penalty -2. **Max P3 penalty reached**: Once counter drops below threshold, penalty hits -34 per topic (-102 total in MBPS; -68 single-block) +2. **Max P3 penalty reached**: Once counter drops below threshold, penalty hits -34 per topic (-68 default, -102 with block proposal scoring) 3. **Mesh pruning**: Topic score goes negative → peer is pruned from mesh 4. **P3b captures penalty**: The P3 deficit at prune time becomes P3b (sticky penalty) @@ -569,13 +584,13 @@ Note: If the peer just joined the mesh, P3 penalties only start after During a network outage, the peer: - **Does NOT send invalid messages** → No P4 penalty - **Does NOT violate protocols** → No application-level penalty -- **Only accumulates topic-level penalties** → Max -102 (P3b, MBPS) or -68 (single-block) +- **Only accumulates topic-level penalties** → Max -68 (default) or -102 (with block proposal scoring) This is the crucial difference from malicious behavior: | Scenario | App Score | Topic Score | Total | Threshold Hit | |----------|-----------|-------------|-------|---------------| -| Network outage | 0 | -102 (MBPS) / -68 (single) | -102 / -68 | None | +| Network outage | 0 | -68 (default) / -102 (block scoring on) | -68 / -102 | None | | Validation failure | -50 | -20 | -520 | gossipThreshold | | Malicious peer | -100 | -2000+ | -2100+ | graylistThreshold | diff --git a/yarn-project/p2p/src/services/gossipsub/topic_score_params.test.ts b/yarn-project/p2p/src/services/gossipsub/topic_score_params.test.ts index fed55b4535ff..d644397a7ba2 100644 --- a/yarn-project/p2p/src/services/gossipsub/topic_score_params.test.ts +++ b/yarn-project/p2p/src/services/gossipsub/topic_score_params.test.ts @@ -12,6 +12,7 @@ import { createAllTopicScoreParams, createTopicScoreParamsForTopic, getDecayWindowSlots, + getEffectiveBlockProposalsPerSlot, getExpectedMessagesPerSlot, } from './topic_score_params.js'; @@ -148,18 +149,47 @@ describe('Topic Score Params', () => { }); }); + describe('getEffectiveBlockProposalsPerSlot', () => { + it('returns undefined when override is 0 (disabled)', () => { + expect(getEffectiveBlockProposalsPerSlot(5, 0)).toBeUndefined(); + }); + + it('returns override value when positive', () => { + expect(getEffectiveBlockProposalsPerSlot(5, 3)).toBe(3); + expect(getEffectiveBlockProposalsPerSlot(1, 7)).toBe(7); + }); + + it('falls back to blocksPerSlot - 1 when override is undefined', () => { + expect(getEffectiveBlockProposalsPerSlot(5, undefined)).toBe(4); + expect(getEffectiveBlockProposalsPerSlot(3, undefined)).toBe(2); + }); + + it('returns undefined when override is undefined and single block mode', () => { + expect(getEffectiveBlockProposalsPerSlot(1, undefined)).toBeUndefined(); + }); + }); + describe('getExpectedMessagesPerSlot', () => { it('returns undefined for tx topic (unpredictable)', () => { expect(getExpectedMessagesPerSlot(TopicType.tx, 48, 5)).toBeUndefined(); }); - it('returns N-1 for block_proposal in MBPS mode', () => { + it('returns N-1 for block_proposal when override is undefined (fallback)', () => { expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 5)).toBe(4); expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 3)).toBe(2); }); - it('returns 0 for block_proposal in single block mode', () => { - expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 1)).toBe(0); + it('returns undefined for block_proposal in single block mode without override', () => { + expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 1)).toBeUndefined(); + }); + + it('returns undefined for block_proposal when override is 0 (disabled)', () => { + expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 5, 0)).toBeUndefined(); + }); + + it('returns override value for block_proposal when positive', () => { + expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 1, 3)).toBe(3); + expect(getExpectedMessagesPerSlot(TopicType.block_proposal, 48, 5, 7)).toBe(7); }); it('returns 1 for checkpoint_proposal', () => { @@ -207,10 +237,35 @@ describe('Topic Score Params', () => { expect(params.meshFailurePenaltyWeight).toBe(0); }); - it('enables P3/P3b for block_proposal in MBPS mode', () => { + it('disables P3/P3b for block_proposal in MBPS mode when expectedBlockProposalsPerSlot is 0', () => { + const factory = new TopicScoreParamsFactory({ + ...standardParams, + blockDurationMs: 10000, + expectedBlockProposalsPerSlot: 0, + }); + const params = factory.createForTopic(TopicType.block_proposal); + + expect(params.meshMessageDeliveriesWeight).toBe(0); + expect(params.meshFailurePenaltyWeight).toBe(0); + }); + + it('enables P3/P3b for block_proposal when expectedBlockProposalsPerSlot is positive', () => { + const factory = new TopicScoreParamsFactory({ + ...standardParams, + blockDurationMs: 10000, + expectedBlockProposalsPerSlot: 3, + }); + const params = factory.createForTopic(TopicType.block_proposal); + + expect(params.meshMessageDeliveriesWeight).toBeLessThan(0); + expect(params.meshFailurePenaltyWeight).toBeLessThan(0); + }); + + it('falls back to blocksPerSlot - 1 for block_proposal when expectedBlockProposalsPerSlot is undefined', () => { const factory = new TopicScoreParamsFactory({ ...standardParams, blockDurationMs: 10000 }); const params = factory.createForTopic(TopicType.block_proposal); + // MBPS mode with no override: falls back to blocksPerSlot - 1 > 0, so P3 is enabled expect(params.meshMessageDeliveriesWeight).toBeLessThan(0); expect(params.meshFailurePenaltyWeight).toBeLessThan(0); }); @@ -447,33 +502,42 @@ describe('Topic Score Params', () => { expect(Math.abs(maxP3)).toBeGreaterThan(maxP1 + maxP2); }); - it('total P3b across all topics is approximately -102', () => { - const factory = new TopicScoreParamsFactory(standardParams); + it('total P3b is -102 when block proposal scoring is enabled (3 topics)', () => { + const factory = new TopicScoreParamsFactory({ + ...standardParams, + blockDurationMs: 4000, + expectedBlockProposalsPerSlot: 3, + }); - // Topics with P3 enabled: checkpoint_proposal, checkpoint_attestation, block_proposal (in MBPS) - const mbpsParams = { ...standardParams, blockDurationMs: 4000 }; - const mbpsFactory = new TopicScoreParamsFactory(mbpsParams); + expect(factory.numP3EnabledTopics).toBe(3); + expect(factory.totalMaxP3bPenalty).toBeCloseTo(-102, 0); const checkpointParams = factory.createForTopic(TopicType.checkpoint_proposal); const attestationParams = factory.createForTopic(TopicType.checkpoint_attestation); - const blockParams = mbpsFactory.createForTopic(TopicType.block_proposal); + const blockParams = factory.createForTopic(TopicType.block_proposal); - // Calculate max P3 for each topic const p3Checkpoint = checkpointParams.meshMessageDeliveriesThreshold ** 2 * checkpointParams.meshMessageDeliveriesWeight; const p3Attestation = attestationParams.meshMessageDeliveriesThreshold ** 2 * attestationParams.meshMessageDeliveriesWeight; const p3Block = blockParams.meshMessageDeliveriesThreshold ** 2 * blockParams.meshMessageDeliveriesWeight; - // Each should be approximately -34 expect(p3Checkpoint).toBeCloseTo(-34, 0); expect(p3Attestation).toBeCloseTo(-34, 0); expect(p3Block).toBeCloseTo(-34, 0); - - // Total should be approximately -102 expect(p3Checkpoint + p3Attestation + p3Block).toBeCloseTo(-102, 0); }); + it('total P3b is -68 when block proposal scoring is disabled (2 topics)', () => { + const factory = new TopicScoreParamsFactory({ + ...standardParams, + expectedBlockProposalsPerSlot: 0, + }); + + expect(factory.numP3EnabledTopics).toBe(2); + expect(factory.totalMaxP3bPenalty).toBeCloseTo(-68, 0); + }); + it('non-contributing peer has negative topic score and gets pruned', () => { const factory = new TopicScoreParamsFactory(standardParams); const params = factory.createForTopic(TopicType.checkpoint_proposal); diff --git a/yarn-project/p2p/src/services/gossipsub/topic_score_params.ts b/yarn-project/p2p/src/services/gossipsub/topic_score_params.ts index aca68a536843..b7fce0e87b46 100644 --- a/yarn-project/p2p/src/services/gossipsub/topic_score_params.ts +++ b/yarn-project/p2p/src/services/gossipsub/topic_score_params.ts @@ -15,6 +15,8 @@ export type TopicScoringNetworkParams = { targetCommitteeSize: number; /** Duration per block in milliseconds when building multiple blocks per slot. If undefined, single block mode. */ blockDurationMs?: number; + /** Expected number of block proposals per slot for scoring override. 0 disables scoring, undefined falls back to blocksPerSlot - 1. */ + expectedBlockProposalsPerSlot?: number; }; /** @@ -89,18 +91,41 @@ export function computeThreshold(convergence: number, conservativeFactor: number return convergence * conservativeFactor; } +/** + * Determines the effective expected block proposals per slot for scoring. + * Returns undefined if scoring should be disabled, or a positive number if enabled. + * + * @param blocksPerSlot - Number of blocks per slot from timetable + * @param expectedBlockProposalsPerSlot - Config override. 0 disables scoring, undefined falls back to blocksPerSlot - 1. + * @returns Positive number of expected block proposals, or undefined if scoring is disabled + */ +export function getEffectiveBlockProposalsPerSlot( + blocksPerSlot: number, + expectedBlockProposalsPerSlot?: number, +): number | undefined { + if (expectedBlockProposalsPerSlot !== undefined) { + return expectedBlockProposalsPerSlot > 0 ? expectedBlockProposalsPerSlot : undefined; + } + // Fallback: In MBPS mode, N-1 block proposals per slot (last one bundled with checkpoint) + // In single block mode (blocksPerSlot=1), this is 0 → disabled + const fallback = Math.max(0, blocksPerSlot - 1); + return fallback > 0 ? fallback : undefined; +} + /** * Gets the expected messages per slot for a given topic type. * * @param topicType - The topic type * @param targetCommitteeSize - Target committee size * @param blocksPerSlot - Number of blocks per slot + * @param expectedBlockProposalsPerSlot - Override for block proposals. 0 disables scoring, undefined falls back to blocksPerSlot - 1. * @returns Expected messages per slot, or undefined if unpredictable */ export function getExpectedMessagesPerSlot( topicType: TopicType, targetCommitteeSize: number, blocksPerSlot: number, + expectedBlockProposalsPerSlot?: number, ): number | undefined { switch (topicType) { case TopicType.tx: @@ -108,9 +133,7 @@ export function getExpectedMessagesPerSlot( return undefined; case TopicType.block_proposal: - // In MBPS mode, N-1 block proposals per slot (last one bundled with checkpoint) - // In single block mode (blocksPerSlot=1), this is 0 - return Math.max(0, blocksPerSlot - 1); + return getEffectiveBlockProposalsPerSlot(blocksPerSlot, expectedBlockProposalsPerSlot); case TopicType.checkpoint_proposal: // Exactly 1 checkpoint proposal per slot @@ -190,10 +213,12 @@ const P2_DECAY_WINDOW_SLOTS = 2; // |P3| > 8 + 25 = 33 // // We set P3 max = -34 per topic (slightly more than P1+P2) to ensure pruning. -// With 3 topics having P3 enabled, total P3b after pruning = -102. +// The number of P3-enabled topics depends on config: by default 2 (checkpoint_proposal + +// checkpoint_attestation), or 3 if block proposal scoring is enabled via +// expectedBlockProposalsPerSlot. Total P3b after pruning = -68 (2 topics) or -102 (3 topics). // -// With appSpecificWeight=10, ~20 HighTolerance errors (-40 app score) plus max P3b (-102) -// would cross gossipThreshold (-500). This keeps non-contributors from being disconnected +// With appSpecificWeight=10, ~20 HighTolerance errors (-40 app score) plus max P3b (-68 or -102) +// would not cross gossipThreshold (-500). This keeps non-contributors from being disconnected // unless they also accrue app-level penalties. // // The weight formula ensures max penalty equals MAX_P3_PENALTY_PER_TOPIC: @@ -203,12 +228,6 @@ const P2_DECAY_WINDOW_SLOTS = 2; /** Maximum P3 penalty per topic (must exceed P1 + P2 to cause pruning) */ export const MAX_P3_PENALTY_PER_TOPIC = -(MAX_P1_SCORE + MAX_P2_SCORE + 1); // -34 -/** Number of topics with P3 enabled in MBPS mode (block_proposal + checkpoint_proposal + checkpoint_attestation) */ -export const NUM_P3_ENABLED_TOPICS = 3; - -/** Total maximum P3b penalty across all topics after pruning in MBPS mode */ -export const TOTAL_MAX_P3B_PENALTY = MAX_P3_PENALTY_PER_TOPIC * NUM_P3_ENABLED_TOPICS; // -102 - /** * Factory class for creating gossipsub topic scoring parameters. * Computes shared values once and reuses them across all topics. @@ -384,6 +403,18 @@ export class TopicScoreParamsFactory { }); } + /** Number of topics with P3 enabled, computed from config. Always 2 (checkpoint_proposal + checkpoint_attestation) plus optionally block_proposal. */ + get numP3EnabledTopics(): number { + const blockProposalP3Enabled = + getEffectiveBlockProposalsPerSlot(this.blocksPerSlot, this.params.expectedBlockProposalsPerSlot) !== undefined; + return blockProposalP3Enabled ? 3 : 2; + } + + /** Total maximum P3b penalty across all topics after pruning, computed from config */ + get totalMaxP3bPenalty(): number { + return MAX_P3_PENALTY_PER_TOPIC * this.numP3EnabledTopics; + } + /** * Creates topic score parameters for a specific topic type. * @@ -391,7 +422,12 @@ export class TopicScoreParamsFactory { * @returns TopicScoreParams for the topic */ createForTopic(topicType: TopicType): ReturnType { - const expectedPerSlot = getExpectedMessagesPerSlot(topicType, this.params.targetCommitteeSize, this.blocksPerSlot); + const expectedPerSlot = getExpectedMessagesPerSlot( + topicType, + this.params.targetCommitteeSize, + this.blocksPerSlot, + this.params.expectedBlockProposalsPerSlot, + ); // For unpredictable topics (tx) or topics with 0 expected messages, disable P3/P3b if (expectedPerSlot === undefined || expectedPerSlot === 0) { diff --git a/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts b/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts index c11b78877d81..a0e812112a30 100644 --- a/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts +++ b/yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts @@ -9,7 +9,7 @@ import { openTmpStore } from '@aztec/kv-store/lmdb'; import { L2Block, type L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server'; -import { BlockProposal, P2PClientType, PeerErrorSeverity } from '@aztec/stdlib/p2p'; +import { BlockProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p'; import { makeBlockHeader, makeBlockProposal, @@ -34,6 +34,7 @@ import { } from '../../mem_pools/attestation_pool/attestation_pool.js'; import type { MemPools } from '../../mem_pools/interface.js'; import type { TxPoolV2 } from '../../mem_pools/tx_pool_v2/interfaces.js'; +import type { TransactionValidator } from '../../msg_validators/tx_validator/factory.js'; import type { PubSubLibp2p } from '../../util.js'; import type { PeerManagerInterface } from '../peer-manager/interface.js'; import type { ReqRespInterface } from '../reqresp/interface.js'; @@ -149,13 +150,25 @@ describe('LibP2PService', () => { }, } as any; + const txArchiver = mock(); + txArchiver.getBlockNumber.mockResolvedValue(BlockNumber(1)); + + const txEpochCache = mock(); + txEpochCache.getEpochAndSlotInNextL1Slot.mockReturnValue({ + epoch: 0n, + slot: 1n, + ts: 100n, + } as any); + txService = createTestLibP2PService({ peerManager: txPeerManager, node: txNode, txPool, + archiver: txArchiver, + epochCache: txEpochCache, }); - // Make validatePropagatedTx pass by default - txService.validatePropagatedTxMock.mockResolvedValue(true); + // By default, canAddPendingTx returns 'accepted' so the flow proceeds to pool add + txPool.canAddPendingTx.mockResolvedValue('accepted'); }); it('should propagate (Accept) when pool accepts the transaction', async () => { @@ -209,13 +222,94 @@ describe('LibP2PService', () => { it('should NOT propagate (Reject) when gossip validation fails', async () => { const tx = await mockTx(); - txService.validatePropagatedTxMock.mockResolvedValue(false); + txService.firstStageValidationPasses = false; + + await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); + + expect(txReportSpy).toHaveBeenCalledWith('test-msg-id', MOCK_PEER_ID, TopicValidatorResult.Reject); + expect(txPool.addPendingTxs).not.toHaveBeenCalled(); + }); + + it('should Ignore and skip proof verification when canAddPendingTx returns ignored', async () => { + const tx = await mockTx(); + + txPool.canAddPendingTx.mockResolvedValue('ignored'); + + await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); + + expect(txReportSpy).toHaveBeenCalledWith('test-msg-id', MOCK_PEER_ID, TopicValidatorResult.Ignore); + // Pool pre-check was called + expect(txPool.canAddPendingTx).toHaveBeenCalled(); + // addPendingTxs should NOT be called — we short-circuited before it + expect(txPool.addPendingTxs).not.toHaveBeenCalled(); + }); + + it('should not call canAddPendingTx when first-stage validation fails', async () => { + const tx = await mockTx(); + + txService.firstStageValidationPasses = false; + + await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); + + expect(txPool.canAddPendingTx).not.toHaveBeenCalled(); + expect(txPool.addPendingTxs).not.toHaveBeenCalled(); + }); + + it('should Reject and penalize peer when second-stage (proof) validation fails', async () => { + const tx = await mockTx(); + + txService.secondStageValidationPasses = false; await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); expect(txReportSpy).toHaveBeenCalledWith('test-msg-id', MOCK_PEER_ID, TopicValidatorResult.Reject); + expect(txPeerManager.penalizePeer).toHaveBeenCalledWith(txPeerId, PeerErrorSeverity.LowToleranceError); + // canAddPendingTx was called (first stage passed), but addPendingTxs was NOT (second stage failed) + expect(txPool.canAddPendingTx).toHaveBeenCalled(); expect(txPool.addPendingTxs).not.toHaveBeenCalled(); }); + + it('should penalize peer with the severity from the failing first-stage validator', async () => { + const tx = await mockTx(); + + txService.firstStageValidationPasses = false; + txService.firstStageSeverity = PeerErrorSeverity.MidToleranceError; + + await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); + + expect(txPeerManager.penalizePeer).toHaveBeenCalledWith(txPeerId, PeerErrorSeverity.MidToleranceError); + }); + + it('should not penalize peer when canAddPendingTx returns ignored', async () => { + const tx = await mockTx(); + + txPool.canAddPendingTx.mockResolvedValue('ignored'); + + await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); + + expect(txPeerManager.penalizePeer).not.toHaveBeenCalled(); + }); + + it('should call addPendingTxs only after both validation stages pass and pool pre-check accepts', async () => { + const tx = await mockTx(); + const txHash = tx.getTxHash(); + + txPool.canAddPendingTx.mockResolvedValue('accepted'); + txPool.addPendingTxs.mockResolvedValue({ + accepted: [txHash], + ignored: [], + rejected: [], + }); + + await txService.handleGossipedTx(tx.toBuffer(), 'test-msg-id', txPeerId); + + // Verify the full happy path: canAddPendingTx → addPendingTxs → Accept + expect(txPool.canAddPendingTx).toHaveBeenCalled(); + expect(txPool.addPendingTxs).toHaveBeenCalledWith(expect.arrayContaining([expect.objectContaining({})]), { + source: 'gossip', + }); + expect(txReportSpy).toHaveBeenCalledWith('test-msg-id', MOCK_PEER_ID, TopicValidatorResult.Accept); + }); }); describe('validateRequestedBlock', () => { @@ -976,8 +1070,17 @@ class TestLibP2PService extends LibP2PService { /** Mocked validateRequestedTx for testing. */ public validateRequestedTxMock: jest.Mock; - /** Mocked validatePropagatedTx for testing gossip tx handling. */ - public validatePropagatedTxMock: jest.Mock<(tx: Tx, peerId: PeerId) => Promise>; + /** Controls whether first-stage gossip validation passes. Set to false to simulate first-stage failure. */ + public firstStageValidationPasses = true; + + /** Controls whether second-stage gossip validation passes. Set to false to simulate proof verification failure. */ + public secondStageValidationPasses = true; + + /** Controls the name of the failing first-stage validator (e.g., 'doubleSpendValidator' to trigger special handling). */ + public firstStageFailingValidatorName = 'failingValidator'; + + /** Controls the severity returned by the failing first-stage validator. */ + public firstStageSeverity: PeerErrorSeverity = PeerErrorSeverity.LowToleranceError; /** Stub validator returned by createRequestedTxValidator. */ private stubValidator: TxValidator; @@ -1015,7 +1118,6 @@ class TestLibP2PService extends LibP2PService { }); super( - P2PClientType.Full, mockConfig, node, mockPeerDiscoveryService, @@ -1032,7 +1134,6 @@ class TestLibP2PService extends LibP2PService { this.testEpochCache = epochCache; this.validateRequestedTxMock = jest.fn(() => Promise.resolve()); - this.validatePropagatedTxMock = jest.fn(() => Promise.resolve(true)); this.stubValidator = { validateTx: () => Promise.resolve({ result: 'valid' as const }), }; @@ -1048,9 +1149,30 @@ class TestLibP2PService extends LibP2PService { return super.handleGossipedTx(payloadData, msgId, source); } - /** Override to use the mock for validatePropagatedTx. */ - protected override validatePropagatedTx(tx: Tx, peerId: PeerId): Promise { - return this.validatePropagatedTxMock(tx, peerId); + /** Override to use test flag for first-stage validators. Returns a failing validator when firstStageValidationPasses is false. */ + protected override createFirstStageMessageValidators(): Promise> { + if (this.firstStageValidationPasses) { + return Promise.resolve({}); + } + return Promise.resolve({ + [this.firstStageFailingValidatorName]: { + validator: { validateTx: () => Promise.resolve({ result: 'invalid' as const, reason: ['Test failure'] }) }, + severity: this.firstStageSeverity, + }, + }); + } + + /** Override to use test flag for second-stage validators. Returns a failing validator when secondStageValidationPasses is false. */ + protected override createSecondStageMessageValidators(): Record { + if (this.secondStageValidationPasses) { + return {}; + } + return { + proofValidator: { + validator: { validateTx: () => Promise.resolve({ result: 'invalid' as const, reason: ['Proof failure'] }) }, + severity: PeerErrorSeverity.LowToleranceError, + }, + }; } /** Exposes the protected validateRequestedBlock for testing. */ diff --git a/yarn-project/p2p/src/services/libp2p/libp2p_service.ts b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts index b27818562789..8da82a7d195b 100644 --- a/yarn-project/p2p/src/services/libp2p/libp2p_service.ts +++ b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts @@ -16,13 +16,12 @@ import { CheckpointProposal, type CheckpointProposalCore, type Gossipable, - P2PClientType, P2PMessage, type ValidationResult as P2PValidationResult, PeerErrorSeverity, TopicType, createTopicString, - getTopicsForClientAndConfig, + getTopicsForConfig, metricsTopicStrToLabels, } from '@aztec/stdlib/p2p'; import { MerkleTreeId } from '@aztec/stdlib/trees'; @@ -69,9 +68,11 @@ import { } from '../../msg_validators/index.js'; import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js'; import { - type MessageValidator, - createTxMessageValidators, - createTxReqRespValidator, + type TransactionValidator, + createFirstStageTxValidationsForGossipedTransactions, + createSecondStageTxValidationsForGossipedTransactions, + createTxValidatorForBlockProposalReceivedTxs, + createTxValidatorForReqResponseReceivedTxs, } from '../../msg_validators/tx_validator/factory.js'; import { GossipSubEvent } from '../../types/index.js'; import { type PubSubLibp2p, convertToMultiaddr } from '../../util.js'; @@ -87,6 +88,9 @@ import { PeerScoring } from '../peer-manager/peer_scoring.js'; import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js'; import type { P2PReqRespConfig } from '../reqresp/config.js'; import { + AuthRequest, + BlockTxsRequest, + BlockTxsResponse, DEFAULT_SUB_PROTOCOL_VALIDATORS, type ReqRespInterface, type ReqRespResponse, @@ -94,14 +98,9 @@ import { type ReqRespSubProtocolHandler, type ReqRespSubProtocolHandlers, type ReqRespSubProtocolValidators, + StatusMessage, type SubProtocolMap, ValidationError, -} from '../reqresp/index.js'; -import { - AuthRequest, - BlockTxsRequest, - BlockTxsResponse, - StatusMessage, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, @@ -135,7 +134,7 @@ type ReceivedMessageValidationResult = /** * Lib P2P implementation of the P2PService interface. */ -export class LibP2PService extends WithTracer implements P2PService { +export class LibP2PService extends WithTracer implements P2PService { private discoveryRunningPromise?: RunningPromise; private msgIdSeenValidators: Record = {} as Record; @@ -182,7 +181,6 @@ export class LibP2PService extends protected logger: Logger; constructor( - private clientType: T, private config: P2PConfig, protected node: PubSubLibp2p, private peerDiscoveryService: PeerDiscoveryService, @@ -224,9 +222,13 @@ export class LibP2PService extends this.protocolVersion, ); - this.blockProposalValidator = new BlockProposalValidator(epochCache, { txsPermitted: !config.disableTransactions }); + this.blockProposalValidator = new BlockProposalValidator(epochCache, { + txsPermitted: !config.disableTransactions, + maxTxsPerBlock: config.maxTxsPerBlock, + }); this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, { txsPermitted: !config.disableTransactions, + maxTxsPerBlock: config.maxTxsPerBlock, }); this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) @@ -262,8 +264,7 @@ export class LibP2PService extends * @param txPool - The transaction pool to be accessed by the service. * @returns The new service. */ - public static async new( - clientType: T, + public static async new( config: P2PConfig, peerId: PeerId, deps: { @@ -341,6 +342,7 @@ export class LibP2PService extends heartbeatIntervalMs: config.gossipsubInterval, targetCommitteeSize: l1Constants.targetCommitteeSize, blockDurationMs: config.blockDurationMs, + expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot, }); const node = await createLibp2p({ @@ -474,7 +476,6 @@ export class LibP2PService extends peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId); return new LibP2PService( - clientType, config, node, peerDiscoveryService, @@ -548,7 +549,7 @@ export class LibP2PService extends await this.node.start(); // Subscribe to standard GossipSub topics by default - for (const topic of getTopicsForClientAndConfig(this.clientType, this.config.disableTransactions)) { + for (const topic of getTopicsForConfig(this.config.disableTransactions)) { this.subscribeToTopic(this.topicStrings[topic]); } @@ -614,6 +615,10 @@ export class LibP2PService extends return this.peerManager.getPeers(includePending); } + public getGossipMeshPeerCount(topicType: TopicType): number { + return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length; + } + private handleGossipSubEvent(e: CustomEvent) { this.logger.trace(`Received PUBSUB message.`); @@ -813,9 +818,7 @@ export class LibP2PService extends if (msg.topic === this.topicStrings[TopicType.tx]) { await this.handleGossipedTx(p2pMessage.payload, msgId, source); } else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) { - if (this.clientType === P2PClientType.Full) { - await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source); - } + await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source); } else if (msg.topic === this.topicStrings[TopicType.block_proposal]) { await this.processBlockFromPeer(p2pMessage.payload, msgId, source); } else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) { @@ -901,15 +904,45 @@ export class LibP2PService extends protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) { const validationFunc: () => Promise> = async () => { const tx = Tx.fromBuffer(payloadData); - const isValid = await this.validatePropagatedTx(tx, source); - if (!isValid) { - this.logger.trace(`Rejecting invalid propagated tx`, { - [Attributes.P2P_ID]: source.toString(), - }); + + const currentBlockNumber = await this.archiver.getBlockNumber(); + const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot(); + + // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header) + const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp); + const firstStageOutcome = await this.runValidations(tx, firstStageValidators); + if (!firstStageOutcome.allPassed) { + const { name } = firstStageOutcome.failure; + let { severity } = firstStageOutcome.failure; + + // Double spend validator has a special case handler. We perform more detailed examination + // as to how recently the nullifier was entered into the tree and if the transaction should + // have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer. + if (name === 'doubleSpendValidator') { + const txBlockNumber = BlockNumber(currentBlockNumber + 1); + severity = await this.handleDoubleSpendFailure(tx, txBlockNumber); + } + + this.peerManager.penalizePeer(source, severity); return { result: TopicValidatorResult.Reject }; } - // Propagate only on pool acceptance + // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification + const canAdd = await this.mempools.txPool.canAddPendingTx(tx); + if (canAdd === 'ignored') { + return { result: TopicValidatorResult.Ignore, obj: tx }; + } + + // Stage 2: expensive proof verification + const secondStageValidators = this.createSecondStageMessageValidators(); + const secondStageOutcome = await this.runValidations(tx, secondStageValidators); + if (!secondStageOutcome.allPassed) { + const { severity } = secondStageOutcome.failure; + this.peerManager.penalizePeer(source, severity); + return { result: TopicValidatorResult.Reject }; + } + + // Pool add: persist the tx const txHash = tx.getTxHash(); const addResult = await this.mempools.txPool.addPendingTxs([tx], { source: 'gossip' }); @@ -917,7 +950,6 @@ export class LibP2PService extends const wasIgnored = addResult.ignored.some(h => h.equals(txHash)); this.logger.trace(`Validate propagated tx`, { - isValid, wasAccepted, wasIgnored, [Attributes.P2P_ID]: source.toString(), @@ -1532,43 +1564,12 @@ export class LibP2PService extends } protected createRequestedTxValidator(): TxValidator { - return createTxReqRespValidator(this.proofVerifier, { + return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, { l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion, }); } - @trackSpan('Libp2pService.validatePropagatedTx', tx => ({ - [Attributes.TX_HASH]: tx.getTxHash().toString(), - })) - protected async validatePropagatedTx(tx: Tx, peerId: PeerId): Promise { - const currentBlockNumber = await this.archiver.getBlockNumber(); - - // We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field) - const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot(); - const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp); - - for (const validator of messageValidators) { - const outcome = await this.runValidations(tx, validator); - - if (outcome.allPassed) { - continue; - } - const { name } = outcome.failure; - let { severity } = outcome.failure; - - // Double spend validator has a special case handler - if (name === 'doubleSpendValidator') { - const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block - severity = await this.handleDoubleSpendFailure(tx, txBlockNumber); - } - - this.peerManager.penalizePeer(peerId, severity); - return false; - } - return true; - } - private async getGasFees(blockNumber: BlockNumber): Promise { if (blockNumber === this.feesCache?.blockNumber) { return this.feesCache.gasFees; @@ -1596,60 +1597,53 @@ export class LibP2PService extends }; } - public async validate(txs: Tx[]): Promise { - const currentBlockNumber = await this.archiver.getBlockNumber(); - - // We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field) - const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot(); - const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp); + public async validateTxsReceivedInBlockProposal(txs: Tx[]): Promise { + const validator = createTxValidatorForBlockProposalReceivedTxs( + this.proofVerifier, + { l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion }, + this.logger.getBindings(), + ); - await Promise.all( + const results = await Promise.all( txs.map(async tx => { - for (const validator of messageValidators) { - const outcome = await this.runValidations(tx, validator); - if (!outcome.allPassed) { - throw new Error('Invalid tx detected', { cause: { outcome } }); - } - } + const result = await validator.validateTx(tx); + return result.result !== 'invalid'; }), ); + if (results.some(value => value === false)) { + throw new Error('Invalid tx detected'); + } } - /** - * Create message validators for the given block number and timestamp. - * - * Each validator is a pair of a validator and a severity. - * If a validator fails, the peer is penalized with the severity of the validator. - * - * @param currentBlockNumber - The current synced block number. - * @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired). - * @returns The message validators. - */ - private async createMessageValidators( + /** Creates the first stage (fast) validators for gossiped transactions. */ + protected async createFirstStageMessageValidators( currentBlockNumber: BlockNumber, nextSlotTimestamp: UInt64, - ): Promise[]> { + ): Promise> { const gasFees = await this.getGasFees(currentBlockNumber); const allowedInSetup = this.config.txPublicSetupAllowList ?? (await getDefaultAllowedSetupFunctions()); + const blockNumber = BlockNumber(currentBlockNumber + 1); - const blockNumberInWhichTheTxIsConsideredToBeIncluded = BlockNumber(currentBlockNumber + 1); - - return createTxMessageValidators( + return createFirstStageTxValidationsForGossipedTransactions( nextSlotTimestamp, - blockNumberInWhichTheTxIsConsideredToBeIncluded, + blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, - this.proofVerifier, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), ); } + /** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ + protected createSecondStageMessageValidators(): Record { + return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings()); + } + /** * Run validations on a tx. * @param tx - The tx to validate. @@ -1658,7 +1652,7 @@ export class LibP2PService extends */ private async runValidations( tx: Tx, - messageValidators: Record, + messageValidators: Record, ): Promise { const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => { const { result } = await validator.validateTx(tx); diff --git a/yarn-project/p2p/src/services/reqresp/batch-tx-requester/tx_validator.ts b/yarn-project/p2p/src/services/reqresp/batch-tx-requester/tx_validator.ts index cbe33da83d04..3f79866a31c9 100644 --- a/yarn-project/p2p/src/services/reqresp/batch-tx-requester/tx_validator.ts +++ b/yarn-project/p2p/src/services/reqresp/batch-tx-requester/tx_validator.ts @@ -1,7 +1,7 @@ import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server'; import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx'; -import { createTxReqRespValidator } from '../../../msg_validators/tx_validator/factory.js'; +import { createTxValidatorForReqResponseReceivedTxs } from '../../../msg_validators/index.js'; export interface BatchRequestTxValidatorConfig { l1ChainId: number; @@ -29,7 +29,7 @@ export class BatchRequestTxValidator implements IBatchRequestTxValidator { } static createRequestedTxValidator(config: BatchRequestTxValidatorConfig): TxValidator { - return createTxReqRespValidator(config.proofVerifier, { + return createTxValidatorForReqResponseReceivedTxs(config.proofVerifier, { l1ChainId: config.l1ChainId, rollupVersion: config.rollupVersion, }); diff --git a/yarn-project/p2p/src/services/service.ts b/yarn-project/p2p/src/services/service.ts index b7b3b6fa42d0..59594e169788 100644 --- a/yarn-project/p2p/src/services/service.ts +++ b/yarn-project/p2p/src/services/service.ts @@ -1,7 +1,13 @@ import type { SlotNumber } from '@aztec/foundation/branded-types'; import type { EthAddress } from '@aztec/foundation/eth-address'; import type { PeerInfo } from '@aztec/stdlib/interfaces/server'; -import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore, Gossipable } from '@aztec/stdlib/p2p'; +import type { + BlockProposal, + CheckpointAttestation, + CheckpointProposalCore, + Gossipable, + TopicType, +} from '@aztec/stdlib/p2p'; import type { Tx } from '@aztec/stdlib/tx'; import type { PeerId } from '@libp2p/interface'; @@ -130,7 +136,10 @@ export interface P2PService { getPeers(includePending?: boolean): PeerInfo[]; - validate(txs: Tx[]): Promise; + /** Returns the number of peers in the GossipSub mesh for a given topic type. */ + getGossipMeshPeerCount(topicType: TopicType): number; + + validateTxsReceivedInBlockProposal(txs: Tx[]): Promise; addReqRespSubProtocol( subProtocol: ReqRespSubProtocol, diff --git a/yarn-project/p2p/src/services/tx_provider.test.ts b/yarn-project/p2p/src/services/tx_provider.test.ts index f21980fffccd..f2effc763541 100644 --- a/yarn-project/p2p/src/services/tx_provider.test.ts +++ b/yarn-project/p2p/src/services/tx_provider.test.ts @@ -17,7 +17,7 @@ describe('TxProvider', () => { // Dependencies let txCollection: MockProxy; let txPool: MockProxy; - let txValidator: MockProxy>; + let txValidator: MockProxy>; // Subject under test let txProvider: TestTxProvider; @@ -81,7 +81,7 @@ describe('TxProvider', () => { txCollection = mock(); txPool = mock(); - txValidator = mock>(); + txValidator = mock>(); txPool.getTxsByHash.mockImplementation(txHashes => Promise.resolve(txHashes.map(txHash => txPools.get(txHash.toString()))), diff --git a/yarn-project/p2p/src/services/tx_provider.ts b/yarn-project/p2p/src/services/tx_provider.ts index 7279609db8cd..311e31162351 100644 --- a/yarn-project/p2p/src/services/tx_provider.ts +++ b/yarn-project/p2p/src/services/tx_provider.ts @@ -25,7 +25,7 @@ export class TxProvider implements ITxProvider { constructor( private txCollection: TxCollection, private txPool: TxPoolV2, - private txValidator: Pick, + private blockProposalTransactionValidator: Pick, private log: Logger = createLogger('p2p:tx-collector'), client: TelemetryClient = getTelemetryClient(), ) { @@ -227,7 +227,7 @@ export class TxProvider implements ITxProvider { if (txs.length === 0) { return; } - await this.txValidator.validate(txs); + await this.blockProposalTransactionValidator.validateTxsReceivedInBlockProposal(txs); await this.txPool.addProtectedTxs(txs, blockHeader); } } diff --git a/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts b/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts index b0c69cb7ebe5..1bb554f79b06 100644 --- a/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts +++ b/yarn-project/p2p/src/test-helpers/make-test-p2p-clients.ts @@ -7,7 +7,6 @@ import { sleep } from '@aztec/foundation/sleep'; import type { DataStoreConfig } from '@aztec/kv-store/config'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import { createP2PClient } from '../client/index.js'; import type { P2PClient } from '../client/p2p_client.js'; @@ -98,7 +97,6 @@ export async function makeTestP2PClient( const kvStore = await openTmpStore('test'); const client = await createP2PClient( - P2PClientType.Full, config, l2BlockSource, proofVerifier, diff --git a/yarn-project/p2p/src/test-helpers/mock-pubsub.ts b/yarn-project/p2p/src/test-helpers/mock-pubsub.ts index 12e227d9461c..cf48654e0aff 100644 --- a/yarn-project/p2p/src/test-helpers/mock-pubsub.ts +++ b/yarn-project/p2p/src/test-helpers/mock-pubsub.ts @@ -4,7 +4,6 @@ import type { AztecAsyncKVStore } from '@aztec/kv-store'; import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { P2PClientType } from '@aztec/stdlib/p2p'; import type { TelemetryClient } from '@aztec/telemetry-client'; import type { GossipsubEvents, GossipsubMessage } from '@chainsafe/libp2p-gossipsub'; @@ -42,11 +41,10 @@ type GossipSubService = PubSubLibp2p['services']['pubsub']; * Given a mock gossip sub network, returns a factory function that creates an instance LibP2PService connected to it. * Designed to be used in tests in P2PClientDeps.p2pServiceFactory. */ -export function getMockPubSubP2PServiceFactory( +export function getMockPubSubP2PServiceFactory( network: MockGossipSubNetwork, -): (...args: Parameters<(typeof LibP2PService)['new']>) => Promise> { +): (...args: Parameters<(typeof LibP2PService)['new']>) => Promise { return ( - clientType: P2PClientType, config: P2PConfig, peerId: PeerId, deps: { @@ -66,8 +64,7 @@ export function getMockPubSubP2PServiceFactory( const peerManager = new DummyPeerManager(peerId, network); const reqresp: ReqRespInterface = new MockReqResp(peerId, network); const peerDiscoveryService = new DummyPeerDiscoveryService(); - const service = new LibP2PService( - clientType as T, + const service = new LibP2PService( config, libp2p, peerDiscoveryService, @@ -270,6 +267,16 @@ class MockGossipSubService extends TypedEventEmitter implements { msgId, propagationSource, acceptance }, ); } + + getMeshPeers(topic?: TopicStr): PeerIdStr[] { + if (topic && !this.subscribedTopics.has(topic)) { + return []; + } + return this.network + .getPeers() + .filter(peer => !this.peerId.equals(peer)) + .map(peer => peer.toString()); + } } /** diff --git a/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts b/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts index a3c0fe5443b9..f0e6f04232e2 100644 --- a/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts +++ b/yarn-project/p2p/src/test-helpers/reqresp-nodes.ts @@ -12,7 +12,6 @@ import type { IVCProofVerificationResult, WorldStateSynchronizer, } from '@aztec/stdlib/interfaces/server'; -import type { P2PClientType } from '@aztec/stdlib/p2p'; import type { Tx } from '@aztec/stdlib/tx'; import { compressComponentVersions } from '@aztec/stdlib/versioning'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; @@ -107,8 +106,7 @@ export async function createLibp2pNode( * * */ -export async function createTestLibP2PService( - clientType: T, +export async function createTestLibP2PService( boostrapAddrs: string[] = [], archiver: L2BlockSource & ContractDataSource, worldStateSynchronizer: WorldStateSynchronizer, @@ -159,8 +157,7 @@ export async function createTestLibP2PService( p2pNode.services.pubsub.score.params.appSpecificScore = (peerId: string) => peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId); - return new LibP2PService( - clientType, + return new LibP2PService( config, p2pNode as PubSubLibp2p, discoveryService, diff --git a/yarn-project/p2p/src/test-helpers/testbench-utils.ts b/yarn-project/p2p/src/test-helpers/testbench-utils.ts index ed9e8f3567f4..a4f249ecbe69 100644 --- a/yarn-project/p2p/src/test-helpers/testbench-utils.ts +++ b/yarn-project/p2p/src/test-helpers/testbench-utils.ts @@ -76,7 +76,7 @@ export class InMemoryTxPool extends EventEmitter implements TxPoolV2 { return Promise.resolve({ accepted, ignored: [], rejected: [] }); } - canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'> { + canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> { const key = tx.getTxHash().toString(); if (this.txsByHash.has(key)) { return Promise.resolve('ignored'); diff --git a/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts b/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts index a44fa2808dea..dc2fa88beb89 100644 --- a/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts +++ b/yarn-project/p2p/src/testbench/p2p_client_testbench_worker.ts @@ -19,7 +19,7 @@ import { protocolContractsHash } from '@aztec/protocol-contracts'; import type { L2BlockSource } from '@aztec/stdlib/block'; import type { ContractDataSource } from '@aztec/stdlib/contract'; import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server'; -import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p'; +import { type BlockProposal, P2PMessage } from '@aztec/stdlib/p2p'; import { ChonkProof } from '@aztec/stdlib/proofs'; import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing'; import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx'; @@ -86,12 +86,11 @@ export interface BenchReadyMessage { } const txCache = new Map(); -class TestLibP2PService extends LibP2PService { +class TestLibP2PService extends LibP2PService { private disableTxValidation: boolean; private gossipMessageCount = 0; constructor( - clientType: T, config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, @@ -107,7 +106,6 @@ class TestLibP2PService extends Li disableTxValidation = true, ) { super( - clientType, config, node, peerDiscoveryService, @@ -365,7 +363,6 @@ process.on('message', async msg => { }; const client = await createP2PClient( - P2PClientType.Full, config as P2PConfig & DataStoreConfig, l2BlockSource, proofVerifier as ClientProtocolCircuitVerifier, @@ -378,7 +375,6 @@ process.on('message', async msg => { ); const testService = new TestLibP2PService( - P2PClientType.Full, config, (client as any).p2pService.node, (client as any).p2pService.peerDiscoveryService, diff --git a/yarn-project/p2p/src/util.ts b/yarn-project/p2p/src/util.ts index 8cfae711e134..ab14817d8b47 100644 --- a/yarn-project/p2p/src/util.ts +++ b/yarn-project/p2p/src/util.ts @@ -23,7 +23,13 @@ export interface PubSubLibp2p extends Pick & { score: Pick }; }; } diff --git a/yarn-project/protocol-contracts/src/auth-registry/index.ts b/yarn-project/protocol-contracts/src/auth-registry/index.ts index d1699bdb6191..9f7f38677565 100644 --- a/yarn-project/protocol-contracts/src/auth-registry/index.ts +++ b/yarn-project/protocol-contracts/src/auth-registry/index.ts @@ -10,9 +10,9 @@ let protocolContract: ProtocolContract; export const AuthRegistryArtifact: ContractArtifact = loadContractArtifact(AuthRegistryJson as NoirCompiledContract); /** Returns the canonical deployment of the auth registry. */ -export async function getCanonicalAuthRegistry(): Promise { +export function getCanonicalAuthRegistry(): Promise { if (!protocolContract) { - protocolContract = await makeProtocolContract('AuthRegistry', AuthRegistryArtifact); + protocolContract = makeProtocolContract('AuthRegistry', AuthRegistryArtifact); } - return protocolContract; + return Promise.resolve(protocolContract); } diff --git a/yarn-project/protocol-contracts/src/auth-registry/lazy.ts b/yarn-project/protocol-contracts/src/auth-registry/lazy.ts index a058a48514c6..e7b45ac528dd 100644 --- a/yarn-project/protocol-contracts/src/auth-registry/lazy.ts +++ b/yarn-project/protocol-contracts/src/auth-registry/lazy.ts @@ -23,7 +23,7 @@ export async function getAuthRegistryArtifact(): Promise { export async function getCanonicalAuthRegistry(): Promise { if (!protocolContract) { const authRegistryArtifact = await getAuthRegistryArtifact(); - protocolContract = await makeProtocolContract('AuthRegistry', authRegistryArtifact); + protocolContract = makeProtocolContract('AuthRegistry', authRegistryArtifact); } return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/class-registry/index.ts b/yarn-project/protocol-contracts/src/class-registry/index.ts index 7526ff0fafda..7b3db3145893 100644 --- a/yarn-project/protocol-contracts/src/class-registry/index.ts +++ b/yarn-project/protocol-contracts/src/class-registry/index.ts @@ -14,10 +14,10 @@ export const ContractClassRegistryArtifact = loadContractArtifact(ContractClassR let protocolContract: ProtocolContract; /** Returns the canonical deployment of the contract. */ -export async function getCanonicalClassRegistry(): Promise { +export function getCanonicalClassRegistry(): Promise { if (!protocolContract) { const artifact = ContractClassRegistryArtifact; - protocolContract = await makeProtocolContract('ContractClassRegistry', artifact); + protocolContract = makeProtocolContract('ContractClassRegistry', artifact); } - return protocolContract; + return Promise.resolve(protocolContract); } diff --git a/yarn-project/protocol-contracts/src/class-registry/lazy.ts b/yarn-project/protocol-contracts/src/class-registry/lazy.ts index 1a1887049d61..634a075d1947 100644 --- a/yarn-project/protocol-contracts/src/class-registry/lazy.ts +++ b/yarn-project/protocol-contracts/src/class-registry/lazy.ts @@ -27,7 +27,7 @@ export async function getContractClassRegistryArtifact(): Promise { if (!protocolContract) { const contractClassRegistryArtifact = await getContractClassRegistryArtifact(); - protocolContract = await makeProtocolContract('ContractClassRegistry', contractClassRegistryArtifact); + protocolContract = makeProtocolContract('ContractClassRegistry', contractClassRegistryArtifact); } return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/fee-juice/index.ts b/yarn-project/protocol-contracts/src/fee-juice/index.ts index d277eda89bb1..90b4f5902465 100644 --- a/yarn-project/protocol-contracts/src/fee-juice/index.ts +++ b/yarn-project/protocol-contracts/src/fee-juice/index.ts @@ -14,11 +14,11 @@ export const FeeJuiceArtifact = loadContractArtifact(FeeJuiceJson as NoirCompile let protocolContract: ProtocolContract; /** Returns the canonical deployment of the contract. */ -export async function getCanonicalFeeJuice(): Promise { +export function getCanonicalFeeJuice(): Promise { if (!protocolContract) { - protocolContract = await makeProtocolContract('FeeJuice', FeeJuiceArtifact); + protocolContract = makeProtocolContract('FeeJuice', FeeJuiceArtifact); } - return protocolContract; + return Promise.resolve(protocolContract); } /** diff --git a/yarn-project/protocol-contracts/src/fee-juice/lazy.ts b/yarn-project/protocol-contracts/src/fee-juice/lazy.ts index 3ac6361da3eb..6c7e98166420 100644 --- a/yarn-project/protocol-contracts/src/fee-juice/lazy.ts +++ b/yarn-project/protocol-contracts/src/fee-juice/lazy.ts @@ -23,7 +23,7 @@ export async function getFeeJuiceArtifact(): Promise { export async function getCanonicalFeeJuice(): Promise { if (!protocolContract) { const feeJuiceArtifact = await getFeeJuiceArtifact(); - protocolContract = await makeProtocolContract('FeeJuice', feeJuiceArtifact); + protocolContract = makeProtocolContract('FeeJuice', feeJuiceArtifact); } return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/instance-registry/index.ts b/yarn-project/protocol-contracts/src/instance-registry/index.ts index d597f68e6629..9d10cdfe6b44 100644 --- a/yarn-project/protocol-contracts/src/instance-registry/index.ts +++ b/yarn-project/protocol-contracts/src/instance-registry/index.ts @@ -15,9 +15,9 @@ export const ContractInstanceRegistryArtifact = loadContractArtifact( let protocolContract: ProtocolContract; /** Returns the canonical deployment of the contract. */ -export async function getCanonicalInstanceRegistry(): Promise { +export function getCanonicalInstanceRegistry(): Promise { if (!protocolContract) { - protocolContract = await makeProtocolContract('ContractInstanceRegistry', ContractInstanceRegistryArtifact); + protocolContract = makeProtocolContract('ContractInstanceRegistry', ContractInstanceRegistryArtifact); } - return protocolContract; + return Promise.resolve(protocolContract); } diff --git a/yarn-project/protocol-contracts/src/instance-registry/lazy.ts b/yarn-project/protocol-contracts/src/instance-registry/lazy.ts index 41d9a8fc32d5..31f554c1d061 100644 --- a/yarn-project/protocol-contracts/src/instance-registry/lazy.ts +++ b/yarn-project/protocol-contracts/src/instance-registry/lazy.ts @@ -26,7 +26,7 @@ export async function getContractInstanceRegistryArtifact(): Promise { if (!protocolContract) { const contractInstanceRegistryArtifact = await getContractInstanceRegistryArtifact(); - protocolContract = await makeProtocolContract('ContractInstanceRegistry', contractInstanceRegistryArtifact); + protocolContract = makeProtocolContract('ContractInstanceRegistry', contractInstanceRegistryArtifact); } return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/make_protocol_contract.ts b/yarn-project/protocol-contracts/src/make_protocol_contract.ts index 14c3e0be7dbf..87215bcb3c20 100644 --- a/yarn-project/protocol-contracts/src/make_protocol_contract.ts +++ b/yarn-project/protocol-contracts/src/make_protocol_contract.ts @@ -1,26 +1,48 @@ import type { ContractArtifact } from '@aztec/stdlib/abi'; -import { getContractClassFromArtifact, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract'; +import { PublicKeys } from '@aztec/stdlib/keys'; import type { ProtocolContract } from './protocol_contract.js'; -import { ProtocolContractAddress, type ProtocolContractName, ProtocolContractSalt } from './protocol_contract_data.js'; +import { + ProtocolContractAddress, + ProtocolContractClassId, + ProtocolContractClassIdPreimage, + ProtocolContractInitializationHash, + type ProtocolContractName, + ProtocolContractPrivateFunctions, + ProtocolContractSalt, +} from './protocol_contract_data.js'; /** - * Returns the canonical deployment given its name and artifact. - * To be used internally within the protocol-contracts package. + * Reconstructs a ProtocolContract from precomputed data without performing any hash computations. + * Internal to the protocol-contracts package — not part of the public API. */ -export async function makeProtocolContract( - name: ProtocolContractName, - artifact: ContractArtifact, -): Promise { +export function makeProtocolContract(name: ProtocolContractName, artifact: ContractArtifact): ProtocolContract { const address = ProtocolContractAddress[name]; const salt = ProtocolContractSalt[name]; - // TODO(@spalladino): This computes the contract class from the artifact twice. - const contractClass = await getContractClassFromArtifact(artifact); - const instance = await getContractInstanceFromInstantiationParams(artifact, { salt, deployer: address }); - return { - instance: { ...instance, address }, - contractClass, - artifact, + const classId = ProtocolContractClassId[name]; + const { artifactHash, privateFunctionsRoot, publicBytecodeCommitment } = ProtocolContractClassIdPreimage[name]; + const initializationHash = ProtocolContractInitializationHash[name]; + + const contractClass = { + id: classId, + version: 1 as const, + artifactHash, + privateFunctionsRoot, + publicBytecodeCommitment, + packedBytecode: artifact.functions.find(f => f.name === 'public_dispatch')?.bytecode ?? Buffer.alloc(0), + privateFunctions: ProtocolContractPrivateFunctions[name], + }; + + const instance = { + version: 1 as const, + currentContractClassId: classId, + originalContractClassId: classId, + initializationHash, + publicKeys: PublicKeys.default(), + salt, + deployer: address, address, }; + + return { instance, contractClass, artifact, address }; } diff --git a/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts b/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts index a3e478f51867..e7dae3778f4c 100644 --- a/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts +++ b/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts @@ -10,9 +10,9 @@ export const MultiCallEntrypointArtifact = loadContractArtifact(MultiCallEntrypo let protocolContract: ProtocolContract; /** Returns the canonical deployment of the contract. */ -export async function getCanonicalMultiCallEntrypoint(): Promise { +export function getCanonicalMultiCallEntrypoint(): Promise { if (!protocolContract) { - protocolContract = await makeProtocolContract('MultiCallEntrypoint', MultiCallEntrypointArtifact); + protocolContract = makeProtocolContract('MultiCallEntrypoint', MultiCallEntrypointArtifact); } - return protocolContract; + return Promise.resolve(protocolContract); } diff --git a/yarn-project/protocol-contracts/src/multi-call-entrypoint/lazy.ts b/yarn-project/protocol-contracts/src/multi-call-entrypoint/lazy.ts index 18d9c4fc94f0..d1fe22edfcce 100644 --- a/yarn-project/protocol-contracts/src/multi-call-entrypoint/lazy.ts +++ b/yarn-project/protocol-contracts/src/multi-call-entrypoint/lazy.ts @@ -23,7 +23,7 @@ export async function getMultiCallEntrypointArtifact(): Promise { if (!protocolContract) { const multiCallEntrypointArtifact = await getMultiCallEntrypointArtifact(); - protocolContract = await makeProtocolContract('MultiCallEntrypoint', multiCallEntrypointArtifact); + protocolContract = makeProtocolContract('MultiCallEntrypoint', multiCallEntrypointArtifact); } return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/provider/bundle.ts b/yarn-project/protocol-contracts/src/provider/bundle.ts index ad886d532a9f..18868f164420 100644 --- a/yarn-project/protocol-contracts/src/provider/bundle.ts +++ b/yarn-project/protocol-contracts/src/provider/bundle.ts @@ -22,6 +22,6 @@ export const ProtocolContractArtifact: Record { - return makeProtocolContract(name, ProtocolContractArtifact[name]); + return Promise.resolve(makeProtocolContract(name, ProtocolContractArtifact[name])); } } diff --git a/yarn-project/protocol-contracts/src/public-checks/index.ts b/yarn-project/protocol-contracts/src/public-checks/index.ts index 66280429fcc3..0016a8c50926 100644 --- a/yarn-project/protocol-contracts/src/public-checks/index.ts +++ b/yarn-project/protocol-contracts/src/public-checks/index.ts @@ -10,9 +10,9 @@ export const PublicChecksArtifact = loadContractArtifact(PublicChecksJson as Noi let protocolContract: ProtocolContract; /** Returns the canonical deployment of the contract. */ -export async function getCanonicalPublicChecks(): Promise { +export function getCanonicalPublicChecks(): Promise { if (!protocolContract) { - protocolContract = await makeProtocolContract('PublicChecks', PublicChecksArtifact); + protocolContract = makeProtocolContract('PublicChecks', PublicChecksArtifact); } - return protocolContract; + return Promise.resolve(protocolContract); } diff --git a/yarn-project/protocol-contracts/src/public-checks/lazy.ts b/yarn-project/protocol-contracts/src/public-checks/lazy.ts index 21a8eef301a4..fee24a720598 100644 --- a/yarn-project/protocol-contracts/src/public-checks/lazy.ts +++ b/yarn-project/protocol-contracts/src/public-checks/lazy.ts @@ -23,7 +23,7 @@ export async function getPublicChecksArtifact(): Promise { export async function getCanonicalPublicChecks(): Promise { if (!protocolContract) { const publicChecksArtifact = await getPublicChecksArtifact(); - protocolContract = await makeProtocolContract('PublicChecks', publicChecksArtifact); + protocolContract = makeProtocolContract('PublicChecks', publicChecksArtifact); } return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/scripts/generate_data.ts b/yarn-project/protocol-contracts/src/scripts/generate_data.ts index f6648841ea11..58b8d8aa14c7 100644 --- a/yarn-project/protocol-contracts/src/scripts/generate_data.ts +++ b/yarn-project/protocol-contracts/src/scripts/generate_data.ts @@ -1,3 +1,7 @@ +// Reads compiled Noir artifacts for each protocol contract and derives their addresses, class IDs, +// bytecode commitments, and other deployment data, emitting everything as precomputed constants into +// `protocol_contract_data.ts`. This avoids clients repeating the expensive hashing at runtime and +// ensures a single source of truth for the protocol contracts hash enforced by circuits, P2P, and L1. import { CANONICAL_AUTH_REGISTRY_ADDRESS, CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS, @@ -11,10 +15,15 @@ import { import { makeTuple } from '@aztec/foundation/array'; import { Fr } from '@aztec/foundation/curves/bn254'; import { createConsoleLogger } from '@aztec/foundation/log'; -import { loadContractArtifact } from '@aztec/stdlib/abi'; +import { FunctionSelector, loadContractArtifact } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; -import { getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract'; +import { + computeContractAddressFromInstance, + computeInitializationHash, + getContractClassFromArtifact, +} from '@aztec/stdlib/contract'; import { computeSiloedPrivateLogFirstField } from '@aztec/stdlib/hash'; +import { PublicKeys } from '@aztec/stdlib/keys'; import { type NoirCompiledContract } from '@aztec/stdlib/noir'; import { ProtocolContracts } from '@aztec/stdlib/tx'; @@ -62,9 +71,42 @@ async function copyArtifact(srcName: string, destName: string) { return artifact; } -async function computeAddress(artifact: NoirCompiledContract, deployer: AztecAddress) { - const instance = await getContractInstanceFromInstantiationParams(loadContractArtifact(artifact), { salt, deployer }); - return instance.address; +type ContractData = { + address: AztecAddress; + classId: Fr; + artifactHash: Fr; + privateFunctionsRoot: Fr; + publicBytecodeCommitment: Fr; + initializationHash: Fr; + privateFunctions: { selector: FunctionSelector; vkHash: Fr }[]; +}; + +// Precompute all the expensive contract data that can be obtained from the artifact, to avoid redundant computations in clients. +// Protocol contracts come from a trusted source, so no class verifications are needed. +async function computeContractData(artifact: NoirCompiledContract, deployer: AztecAddress): Promise { + const loaded = loadContractArtifact(artifact); + const contractClass = await getContractClassFromArtifact(loaded); + const constructorArtifact = loaded.functions.find(f => f.name === 'constructor'); + const initializationHash = await computeInitializationHash(constructorArtifact, []); + const instance = { + version: 1 as const, + currentContractClassId: contractClass.id, + originalContractClassId: contractClass.id, + initializationHash, + publicKeys: PublicKeys.default(), + salt, + deployer, + }; + const address = await computeContractAddressFromInstance(instance); + return { + address, + classId: contractClass.id, + artifactHash: contractClass.artifactHash, + privateFunctionsRoot: contractClass.privateFunctionsRoot, + publicBytecodeCommitment: contractClass.publicBytecodeCommitment, + initializationHash, + privateFunctions: contractClass.privateFunctions, + }; } async function generateDeclarationFile(destName: string) { @@ -103,15 +145,53 @@ function generateContractAddresses(names: string[]) { `; } -function generateDerivedAddresses(names: string[], derivedAddresses: AztecAddress[]) { +function generateDerivedAddresses(names: string[], contractData: ContractData[]) { return ` export const ProtocolContractDerivedAddress = { - ${derivedAddresses.map((address, i) => `${names[i]}: AztecAddress.fromString('${address.toString()}')`).join(',\n')} + ${contractData.map((d, i) => `${names[i]}: AztecAddress.fromString('${d.address.toString()}')`).join(',\n')} }; `; } -async function generateProtocolContractsList(names: string[], derivedAddresses: AztecAddress[]) { +function generateClassIdPreimages(names: string[], contractData: ContractData[]) { + return ` + export const ProtocolContractClassId: Record = { + ${contractData.map((d, i) => `${names[i]}: Fr.fromString('${d.classId.toString()}')`).join(',\n')} + }; + + export const ProtocolContractClassIdPreimage: Record = { + ${contractData + .map( + (d, i) => `${names[i]}: { + artifactHash: Fr.fromString('${d.artifactHash.toString()}'), + privateFunctionsRoot: Fr.fromString('${d.privateFunctionsRoot.toString()}'), + publicBytecodeCommitment: Fr.fromString('${d.publicBytecodeCommitment.toString()}'), + }`, + ) + .join(',\n')} + }; + + export const ProtocolContractInitializationHash: Record = { + ${contractData.map((d, i) => `${names[i]}: Fr.fromString('${d.initializationHash.toString()}')`).join(',\n')} + }; + + export const ProtocolContractPrivateFunctions: Record = { + ${contractData + .map( + (d, i) => + `${names[i]}: [${d.privateFunctions + .map( + fn => + `{ selector: FunctionSelector.fromField(Fr.fromString('${fn.selector.toField().toString()}')), vkHash: Fr.fromString('${fn.vkHash.toString()}') }`, + ) + .join(', ')}]`, + ) + .join(',\n')} + }; + `; +} + +async function generateProtocolContractsList(names: string[], contractData: ContractData[]) { const list = makeTuple(MAX_PROTOCOL_CONTRACTS, () => AztecAddress.zero()); for (let i = 0; i < names.length; i++) { const name = names[i]; @@ -120,7 +200,7 @@ async function generateProtocolContractsList(names: string[], derivedAddresses: if (!list[derivedAddressIndex].equals(AztecAddress.zero())) { throw new Error(`Duplicate protocol contract address: ${address.toString()}`); } - list[derivedAddressIndex] = derivedAddresses[i]; + list[derivedAddressIndex] = contractData[i].address; } return ` @@ -142,10 +222,11 @@ async function generateLogTags() { `; } -async function generateOutputFile(names: string[], derivedAddresses: AztecAddress[]) { +async function generateOutputFile(names: string[], contractData: ContractData[]) { const content = ` // GENERATED FILE - DO NOT EDIT. RUN \`yarn generate\` or \`yarn generate:data\` import { Fr } from '@aztec/foundation/curves/bn254'; + import { FunctionSelector } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { ProtocolContracts } from '@aztec/stdlib/tx'; @@ -155,9 +236,11 @@ async function generateOutputFile(names: string[], derivedAddresses: AztecAddres ${generateContractAddresses(names)} - ${generateDerivedAddresses(names, derivedAddresses)} + ${generateDerivedAddresses(names, contractData)} + + ${generateClassIdPreimages(names, contractData)} - ${await generateProtocolContractsList(names, derivedAddresses)} + ${await generateProtocolContractsList(names, contractData)} ${await generateLogTags()} `; @@ -171,17 +254,19 @@ async function main() { await fs.readFile(path.join(noirContractsRoot, 'protocol_contracts.json'), 'utf8'), ) as string[]; - const derivedAddresses: AztecAddress[] = []; + const contractDataList: ContractData[] = []; const destNames = srcNames.map(n => n.split('-')[1]); for (let i = 0; i < srcNames.length; i++) { const srcName = srcNames[i]; const destName = destNames[i]; const artifact = await copyArtifact(srcName, destName); await generateDeclarationFile(destName); - derivedAddresses.push(await computeAddress(artifact, AztecAddress.fromBigInt(contractAddressMapping[destName]))); + contractDataList.push( + await computeContractData(artifact, AztecAddress.fromBigInt(BigInt(contractAddressMapping[destName]))), + ); } - await generateOutputFile(destNames, derivedAddresses); + await generateOutputFile(destNames, contractDataList); } try { diff --git a/yarn-project/prover-client/package.json b/yarn-project/prover-client/package.json index 7f1691fbbaaf..1d65685a9af9 100644 --- a/yarn-project/prover-client/package.json +++ b/yarn-project/prover-client/package.json @@ -81,7 +81,6 @@ "@aztec/stdlib": "workspace:^", "@aztec/telemetry-client": "workspace:^", "@aztec/world-state": "workspace:^", - "@google-cloud/storage": "^7.15.0", "@iarna/toml": "^2.2.5", "commander": "^12.1.0", "lodash.chunk": "^4.2.0", diff --git a/yarn-project/prover-client/src/proving_broker/proving_broker.ts b/yarn-project/prover-client/src/proving_broker/proving_broker.ts index e9d7c191e977..8d9db0e1bf6e 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_broker.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_broker.ts @@ -314,7 +314,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Pr // notify listeners of the cancellation if (!this.resultsCache.has(id)) { this.logger.info(`Cancelling job id=${id}`, { provingJobId: id }); - await this.#reportProvingJobError(id, 'Aborted', false); + await this.#reportProvingJobError(id, 'Aborted', false, undefined, true); } } @@ -395,6 +395,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Pr err: string, retry = false, filter?: ProvingJobFilter, + aborted = false, ): Promise { const info = this.inProgress.get(id); const item = this.jobsCache.get(id); @@ -455,7 +456,11 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Pr this.promises.get(id)!.resolve(result); this.completedJobNotifications.push(id); - this.instrumentation.incRejectedJobs(item.type); + if (aborted) { + this.instrumentation.incAbortedJobs(item.type); + } else { + this.instrumentation.incRejectedJobs(item.type); + } if (info) { const duration = this.msTimeSource() - info.startedAt; this.instrumentation.recordJobDuration(item.type, duration); diff --git a/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts b/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts index 7bcd5d50c780..f559c247cd29 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts @@ -18,6 +18,7 @@ export class ProvingBrokerInstrumentation { private activeJobs: ObservableGauge; private resolvedJobs: UpDownCounter; private rejectedJobs: UpDownCounter; + private abortedJobs: UpDownCounter; private timedOutJobs: UpDownCounter; private cachedJobs: UpDownCounter; private totalJobs: UpDownCounter; @@ -39,6 +40,8 @@ export class ProvingBrokerInstrumentation { this.rejectedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_REJECTED_JOBS, provingJobAttrs); + this.abortedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_ABORTED_JOBS, provingJobAttrs); + this.retriedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_RETRIED_JOBS, provingJobAttrs); this.timedOutJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_TIMED_OUT_JOBS, provingJobAttrs); @@ -72,6 +75,12 @@ export class ProvingBrokerInstrumentation { }); } + incAbortedJobs(proofType: ProvingRequestType) { + this.abortedJobs.add(1, { + [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType], + }); + } + incRetriedJobs(proofType: ProvingRequestType) { this.retriedJobs.add(1, { [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType], diff --git a/yarn-project/prover-node/src/factory.ts b/yarn-project/prover-node/src/factory.ts index c0d3660b09dd..ee312b2ce90d 100644 --- a/yarn-project/prover-node/src/factory.ts +++ b/yarn-project/prover-node/src/factory.ts @@ -19,7 +19,6 @@ import { getPublisherConfigFromProverConfig, } from '@aztec/sequencer-client'; import type { - AztecNode, ITxProvider, ProverConfig, ProvingJobBroker, @@ -38,7 +37,6 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js'; export type ProverNodeDeps = { telemetry?: TelemetryClient; log?: Logger; - aztecNodeTxProvider?: Pick; archiver: Archiver; publisherFactory?: ProverPublisherFactory; broker?: ProvingJobBroker; @@ -128,9 +126,6 @@ export async function createProverNode( telemetry, }); - // TODO(#20393): Check that the tx collection node sources are properly injected - // See aztecNodeTxProvider - const proverNodeConfig = { ...pick( config, diff --git a/yarn-project/prover-node/src/job/epoch-proving-job.test.ts b/yarn-project/prover-node/src/job/epoch-proving-job.test.ts index 93a5920cb80d..c94818623302 100644 --- a/yarn-project/prover-node/src/job/epoch-proving-job.test.ts +++ b/yarn-project/prover-node/src/job/epoch-proving-job.test.ts @@ -134,7 +134,7 @@ describe('epoch-proving-job', () => { publicProcessor.process.mockImplementation(async txs => { const txsArray = await toArray(txs); const processedTxs = await Promise.all(txsArray.map(tx => mock({ hash: tx.getTxHash() }))); - return [processedTxs, [], txsArray, [], 0]; + return [processedTxs, [], txsArray, [], 0, []]; }); }); @@ -179,7 +179,7 @@ describe('epoch-proving-job', () => { publicProcessor.process.mockImplementation(async txs => { const txsArray = await toArray(txs); const errors = txsArray.map(tx => ({ error: new Error('Failed to process tx'), tx })); - return [[], errors, [], [], 0]; + return [[], errors, [], [], 0, []]; }); const job = createJob(); @@ -190,7 +190,7 @@ describe('epoch-proving-job', () => { }); it('fails if does not process all txs for a block', async () => { - publicProcessor.process.mockImplementation(_txs => Promise.resolve([[], [], [], [], 0])); + publicProcessor.process.mockImplementation(_txs => Promise.resolve([[], [], [], [], 0, []])); const job = createJob(); await job.run(); diff --git a/yarn-project/prover-node/src/prover-node.test.ts b/yarn-project/prover-node/src/prover-node.test.ts index 4b9c28d2c8b7..9effe18edd71 100644 --- a/yarn-project/prover-node/src/prover-node.test.ts +++ b/yarn-project/prover-node/src/prover-node.test.ts @@ -207,6 +207,15 @@ describe('prover-node', () => { expect(proverNode.totalJobCount).toEqual(0); }); + it('gathers txs via the p2p client tx provider', async () => { + await proverNode.handleEpochReadyToProve(EpochNumber.fromBigInt(10n)); + // The prover node must route tx gathering through the shared p2p client's tx provider + expect(p2p.getTxProvider).toHaveBeenCalled(); + // One call per block across all checkpoints in the epoch + const totalBlocks = checkpoints.flatMap(c => c.blocks).length; + expect(txProvider.getTxsForBlock).toHaveBeenCalledTimes(totalBlocks); + }); + it('does not start a proof if there is a tx missing from coordinator', async () => { txProvider.getTxsForBlock.mockResolvedValue({ missingTxs: [TxHash.random()], txs: [] }); await proverNode.handleEpochReadyToProve(EpochNumber.fromBigInt(10n)); diff --git a/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts b/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts index 488fa554df73..e4e783f26b02 100644 --- a/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts +++ b/yarn-project/pxe/src/contract_function_simulator/contract_function_simulator.ts @@ -4,8 +4,6 @@ import { AVM_SENDL2TOL1MSG_BASE_L2_GAS, DA_GAS_PER_FIELD, FIXED_AVM_STARTUP_L2_GAS, - FIXED_DA_GAS, - FIXED_L2_GAS, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, @@ -19,6 +17,9 @@ import { MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, + PRIVATE_TX_L2_GAS_OVERHEAD, + PUBLIC_TX_L2_GAS_OVERHEAD, + TX_DA_GAS_OVERHEAD, } from '@aztec/constants'; import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/curves/bn254'; @@ -360,7 +361,7 @@ export class ContractFunctionSimulator { ); }); - this.log.verbose(`Utility simulation for ${call.to}.${call.selector} completed`); + this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`); return witnessMapToFields(acirExecutionResult.returnWitness); } catch (err) { throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution')); @@ -653,7 +654,12 @@ export async function generateSimulatedProvingResult( const publicInputs = new PrivateKernelTailCircuitPublicInputs( constantData, - /*gasUsed=*/ gasUsed.add(Gas.from({ l2Gas: FIXED_L2_GAS, daGas: FIXED_DA_GAS })), + /*gasUsed=*/ gasUsed.add( + Gas.from({ + l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD, + daGas: TX_DA_GAS_OVERHEAD, + }), + ), /*feePayer=*/ AztecAddress.zero(), /*expirationTimestamp=*/ 0n, hasPublicCalls ? inputsForPublic : undefined, diff --git a/yarn-project/pxe/src/contract_function_simulator/execution_tagging_index_cache.ts b/yarn-project/pxe/src/contract_function_simulator/execution_tagging_index_cache.ts index 85a45f7fb108..37ffc83016d9 100644 --- a/yarn-project/pxe/src/contract_function_simulator/execution_tagging_index_cache.ts +++ b/yarn-project/pxe/src/contract_function_simulator/execution_tagging_index_cache.ts @@ -1,18 +1,18 @@ -import { DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs'; +import { ExtendedDirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs'; /** - * A map that stores the tagging index for a given directional app tagging secret. + * A map that stores the tagging index for a given extended directional app tagging secret. * Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction * of sender -> recipient matters. */ export class ExecutionTaggingIndexCache { private taggingIndexMap: Map = new Map(); - public getLastUsedIndex(secret: DirectionalAppTaggingSecret): number | undefined { + public getLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret): number | undefined { return this.taggingIndexMap.get(secret.toString()); } - public setLastUsedIndex(secret: DirectionalAppTaggingSecret, index: number) { + public setLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret, index: number) { const currentValue = this.taggingIndexMap.get(secret.toString()); if (currentValue !== undefined && currentValue !== index - 1) { throw new Error(`Invalid tagging index update. Current value: ${currentValue}, new value: ${index}`); @@ -25,7 +25,7 @@ export class ExecutionTaggingIndexCache { */ public getUsedPreTags(): PreTag[] { return Array.from(this.taggingIndexMap.entries()).map(([secret, index]) => ({ - secret: DirectionalAppTaggingSecret.fromString(secret), + extendedSecret: ExtendedDirectionalAppTaggingSecret.fromString(secret), index, })); } diff --git a/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.test.ts b/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.test.ts index 44c74418d3fb..63816730790f 100644 --- a/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.test.ts +++ b/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.test.ts @@ -20,7 +20,6 @@ describe('EventValidationRequest', () => { 0, 0, 0, - 0, 0, // serialized_event padding end 2, // bounded_vec_len 6, // event_commitment diff --git a/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.ts b/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.ts index 6749a66299f0..8a33dd551923 100644 --- a/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.ts +++ b/yarn-project/pxe/src/contract_function_simulator/noir-structs/event_validation_request.ts @@ -5,7 +5,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { TxHash } from '@aztec/stdlib/tx'; // TODO(#14617): should we compute this from constants? This value is aztec-nr specific. -const MAX_EVENT_SERIALIZED_LEN = 11; +const MAX_EVENT_SERIALIZED_LEN = 10; /** * Intermediate struct used to perform batch event validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle diff --git a/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.test.ts b/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.test.ts index e798eb3c190c..4ac64de1d016 100644 --- a/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.test.ts +++ b/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.test.ts @@ -19,8 +19,7 @@ describe('NoteValidationRequest', () => { '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000000', // content end (MAX_NOTE_PACKED_LEN = 10) + '0x0000000000000000000000000000000000000000000000000000000000000000', // content end (MAX_NOTE_PACKED_LEN = 8) '0x0000000000000000000000000000000000000000000000000000000000000002', // content length '0x0000000000000000000000000000000000000000000000000000000000000006', // note hash '0x0000000000000000000000000000000000000000000000000000000000000007', // nullifier @@ -57,9 +56,8 @@ describe('NoteValidationRequest', () => { '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000000', // content end (MAX_NOTE_PACKED_LEN = 10) - '0x0000000000000000000000000000000000000000000000000000000000000000', // extra item, this is a malformed serialization + '0x0000000000000000000000000000000000000000000000000000000000000000', // content end (MAX_NOTE_PACKED_LEN = 8) + '0x0000000000000000000000000000000000000000000000000000000000000000', // extra field beyond MAX_NOTE_PACKED_LEN, this is a malformed serialization '0x0000000000000000000000000000000000000000000000000000000000000002', // content length '0x0000000000000000000000000000000000000000000000000000000000000006', // note hash '0x0000000000000000000000000000000000000000000000000000000000000007', // nullifier diff --git a/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.ts b/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.ts index 8b793434ac40..02ebba99e96e 100644 --- a/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.ts +++ b/yarn-project/pxe/src/contract_function_simulator/noir-structs/note_validation_request.ts @@ -4,7 +4,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { TxHash } from '@aztec/stdlib/tx'; // TODO(#14617): should we compute this from constants? This value is aztec-nr specific. -export const MAX_NOTE_PACKED_LEN = 9; +export const MAX_NOTE_PACKED_LEN = 8; /** * Intermediate struct used to perform batch note validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts index 7c72b6407c86..a1b2ada7881e 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/private_execution_oracle.ts @@ -14,7 +14,7 @@ import { import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { siloNullifier } from '@aztec/stdlib/hash'; import { PrivateContextInputs } from '@aztec/stdlib/kernel'; -import { type ContractClassLog, DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs'; +import { type ContractClassLog, ExtendedDirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs'; import { Tag } from '@aztec/stdlib/logs'; import { Note, type NoteStatus } from '@aztec/stdlib/note'; import { @@ -216,25 +216,29 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP * @returns An app tag to be used in a log. */ public async privateGetNextAppTagAsSender(sender: AztecAddress, recipient: AztecAddress): Promise { - const secret = await this.#calculateDirectionalAppTaggingSecret(this.contractAddress, sender, recipient); + const extendedSecret = await this.#calculateExtendedDirectionalAppTaggingSecret( + this.contractAddress, + sender, + recipient, + ); - const index = await this.#getIndexToUseForSecret(secret); + const index = await this.#getIndexToUseForSecret(extendedSecret); this.log.debug( `Incrementing tagging index for sender: ${sender}, recipient: ${recipient}, contract: ${this.contractAddress} to ${index}`, ); - this.taggingIndexCache.setLastUsedIndex(secret, index); + this.taggingIndexCache.setLastUsedIndex(extendedSecret, index); - return Tag.compute({ secret, index }); + return Tag.compute({ extendedSecret, index }); } - async #calculateDirectionalAppTaggingSecret( + async #calculateExtendedDirectionalAppTaggingSecret( contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress, ) { const senderCompleteAddress = await this.getCompleteAddressOrFail(sender); const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender); - return DirectionalAppTaggingSecret.compute( + return ExtendedDirectionalAppTaggingSecret.compute( senderCompleteAddress, senderIvsk, recipient, @@ -243,7 +247,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP ); } - async #getIndexToUseForSecret(secret: DirectionalAppTaggingSecret): Promise { + async #getIndexToUseForSecret(secret: ExtendedDirectionalAppTaggingSecret): Promise { // If we have the tagging index in the cache, we use it. If not we obtain it from the execution data provider. const lastUsedIndexInTx = this.taggingIndexCache.getLastUsedIndex(secret); @@ -255,7 +259,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP // that'd be wasteful as most tagging secrets are not used in each tx. await syncSenderTaggingIndexes( secret, - this.contractAddress, this.aztecNode, this.senderTaggingStore, await this.anchorBlockHeader.hash(), diff --git a/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts b/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts index 00242b8bb925..f957d44326a8 100644 --- a/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts +++ b/yarn-project/pxe/src/contract_function_simulator/oracle/utility_execution_oracle.ts @@ -3,7 +3,7 @@ import type { BlockNumber } from '@aztec/foundation/branded-types'; import { Aes128 } from '@aztec/foundation/crypto/aes128'; import { Fr } from '@aztec/foundation/curves/bn254'; import { Point } from '@aztec/foundation/curves/grumpkin'; -import { LogLevels, type Logger, applyStringFormatting, createLogger } from '@aztec/foundation/log'; +import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log'; import type { MembershipWitness } from '@aztec/foundation/trees'; import type { KeyStore } from '@aztec/key-store'; import type { AuthWitness } from '@aztec/stdlib/auth-witness'; @@ -21,6 +21,7 @@ import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from import type { BlockHeader, Capsule } from '@aztec/stdlib/tx'; import type { AccessScopes } from '../../access_scopes.js'; +import { createContractLogger, logContractMessage } from '../../contract_logging.js'; import { EventService } from '../../events/event_service.js'; import { LogService } from '../../logs/log_service.js'; import { NoteService } from '../../notes/note_service.js'; @@ -402,12 +403,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra */ async #getContractLogger(): Promise { if (!this.contractLogger) { - const addrAbbrev = this.contractAddress.toString().slice(0, 10); - const name = await this.contractStore.getDebugContractName(this.contractAddress); - const module = name ? `contract_log::${name}(${addrAbbrev})` : `contract_log::${addrAbbrev}`; // Purpose of instanceId is to distinguish logs from different instances of the same component. It makes sense // to re-use jobId as instanceId here as executions of different PXE jobs are isolated. - this.contractLogger = createLogger(module, { instanceId: this.jobId }); + this.contractLogger = await createContractLogger( + this.contractAddress, + addr => this.contractStore.getDebugContractName(addr), + { instanceId: this.jobId }, + ); } return this.contractLogger; } @@ -416,9 +418,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra if (!LogLevels[level]) { throw new Error(`Invalid log level: ${level}`); } - const levelName = LogLevels[level]; const logger = await this.#getContractLogger(); - logger[levelName](`${applyStringFormatting(message, fields)}`); + logContractMessage(logger, LogLevels[level], message, fields); } public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) { diff --git a/yarn-project/pxe/src/contract_logging.ts b/yarn-project/pxe/src/contract_logging.ts new file mode 100644 index 000000000000..cb32e2026fa1 --- /dev/null +++ b/yarn-project/pxe/src/contract_logging.ts @@ -0,0 +1,39 @@ +import type { Fr } from '@aztec/foundation/curves/bn254'; +import { type LogLevel, type Logger, applyStringFormatting, createLogger } from '@aztec/foundation/log'; +import type { AztecAddress } from '@aztec/stdlib/aztec-address'; +import type { DebugLog } from '@aztec/stdlib/logs'; + +/** Resolves a contract address to a human-readable name, if available. */ +export type ContractNameResolver = (address: AztecAddress) => Promise; + +/** + * Creates a logger whose output is prefixed with `contract_log::()`. + */ +export async function createContractLogger( + contractAddress: AztecAddress, + getContractName: ContractNameResolver, + options?: { instanceId?: string }, +): Promise { + const addrAbbrev = contractAddress.toString().slice(0, 10); + const name = await getContractName(contractAddress); + const module = name ? `contract_log::${name}(${addrAbbrev})` : `contract_log::Unknown(${addrAbbrev})`; + return createLogger(module, options); +} + +/** + * Formats and emits a single contract log message through the given logger. + */ +export function logContractMessage(logger: Logger, level: LogLevel, message: string, fields: Fr[]): void { + logger[level](applyStringFormatting(message, fields)); +} + +/** + * Displays debug logs collected during public function simulation, + * using the `contract_log::` prefixed logger format. + */ +export async function displayDebugLogs(debugLogs: DebugLog[], getContractName: ContractNameResolver): Promise { + for (const log of debugLogs) { + const logger = await createContractLogger(log.contractAddress, getContractName); + logContractMessage(logger, log.level, log.message, log.fields); + } +} diff --git a/yarn-project/pxe/src/debug/pxe_debug_utils.ts b/yarn-project/pxe/src/debug/pxe_debug_utils.ts index 2520433060c3..e5504328a611 100644 --- a/yarn-project/pxe/src/debug/pxe_debug_utils.ts +++ b/yarn-project/pxe/src/debug/pxe_debug_utils.ts @@ -18,7 +18,7 @@ import type { NoteStore } from '../storage/note_store/note_store.js'; export class PXEDebugUtils { #putJobInQueue!: (job: (jobId: string) => Promise) => Promise; #getSimulatorForTx!: (overrides?: { contracts?: ContractOverrides }) => ContractFunctionSimulator; - #simulateUtility!: ( + #executeUtility!: ( contractFunctionSimulator: ContractFunctionSimulator, call: FunctionCall, authWitnesses: AuthWitness[] | undefined, @@ -37,7 +37,7 @@ export class PXEDebugUtils { public setPXEHelpers( putJobInQueue: (job: (jobId: string) => Promise) => Promise, getSimulatorForTx: (overrides?: { contracts?: ContractOverrides }) => ContractFunctionSimulator, - simulateUtility: ( + executeUtility: ( contractFunctionSimulator: ContractFunctionSimulator, call: FunctionCall, authWitnesses: AuthWitness[] | undefined, @@ -47,7 +47,7 @@ export class PXEDebugUtils { ) { this.#putJobInQueue = putJobInQueue; this.#getSimulatorForTx = getSimulatorForTx; - this.#simulateUtility = simulateUtility; + this.#executeUtility = executeUtility; } /** @@ -73,7 +73,7 @@ export class PXEDebugUtils { filter.contractAddress, null, async (privateSyncCall, execScopes) => - await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), + await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes, diff --git a/yarn-project/pxe/src/entrypoints/client/bundle/index.ts b/yarn-project/pxe/src/entrypoints/client/bundle/index.ts index e532ec2b7b8a..d854f0abf873 100644 --- a/yarn-project/pxe/src/entrypoints/client/bundle/index.ts +++ b/yarn-project/pxe/src/entrypoints/client/bundle/index.ts @@ -3,6 +3,7 @@ export * from '../../../notes_filter.js'; export * from '../../../pxe.js'; export * from '../../../config/index.js'; export * from '../../../error_enriching.js'; +export * from '../../../contract_logging.js'; export * from '../../../storage/index.js'; export * from './utils.js'; export type { PXECreationOptions } from '../../pxe_creation_options.js'; diff --git a/yarn-project/pxe/src/entrypoints/client/lazy/index.ts b/yarn-project/pxe/src/entrypoints/client/lazy/index.ts index 5efe9b4e4ec6..17b4025cbf74 100644 --- a/yarn-project/pxe/src/entrypoints/client/lazy/index.ts +++ b/yarn-project/pxe/src/entrypoints/client/lazy/index.ts @@ -4,5 +4,6 @@ export * from '../../../pxe.js'; export * from '../../../config/index.js'; export * from '../../../storage/index.js'; export * from '../../../error_enriching.js'; +export * from '../../../contract_logging.js'; export * from './utils.js'; export { type PXECreationOptions } from '../../pxe_creation_options.js'; diff --git a/yarn-project/pxe/src/logs/log_service.ts b/yarn-project/pxe/src/logs/log_service.ts index 55a90c779a4b..7da90c092a62 100644 --- a/yarn-project/pxe/src/logs/log_service.ts +++ b/yarn-project/pxe/src/logs/log_service.ts @@ -3,7 +3,13 @@ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundatio import type { KeyStore } from '@aztec/key-store'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import { DirectionalAppTaggingSecret, PendingTaggedLog, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs'; +import { + ExtendedDirectionalAppTaggingSecret, + PendingTaggedLog, + SiloedTag, + Tag, + TxScopedL2Log, +} from '@aztec/stdlib/logs'; import type { BlockHeader } from '@aztec/stdlib/tx'; import type { AccessScopes } from '../access_scopes.js'; @@ -41,7 +47,7 @@ export class LogService { logRetrievalRequests.map(async request => { const [publicLog, privateLog] = await Promise.all([ this.#getPublicLogByTag(request.tag, request.contractAddress), - this.#getPrivateLogByTag(await SiloedTag.compute(request.tag, request.contractAddress)), + this.#getPrivateLogByTag(await SiloedTag.computeFromTagAndApp(request.tag, request.contractAddress)), ]); if (publicLog !== null && privateLog !== null) { @@ -130,7 +136,6 @@ export class LogService { secrets.map(secret => loadPrivateLogsForSenderRecipientPair( secret, - contractAddress, this.aztecNode, this.recipientTaggingStore, anchorBlockNumber, @@ -154,7 +159,7 @@ export class LogService { async #getSecretsForSenders( contractAddress: AztecAddress, recipient: AztecAddress, - ): Promise { + ): Promise { const recipientCompleteAddress = await this.addressStore.getCompleteAddress(recipient); if (!recipientCompleteAddress) { return []; @@ -172,7 +177,7 @@ export class LogService { return Promise.all( deduplicatedSenders.map(sender => { - return DirectionalAppTaggingSecret.compute( + return ExtendedDirectionalAppTaggingSecret.compute( recipientCompleteAddress, recipientIvsk, sender, diff --git a/yarn-project/pxe/src/private_kernel/private_kernel_oracle.ts b/yarn-project/pxe/src/private_kernel/private_kernel_oracle.ts index 39babbf1a6ca..6bbf8983af94 100644 --- a/yarn-project/pxe/src/private_kernel/private_kernel_oracle.ts +++ b/yarn-project/pxe/src/private_kernel/private_kernel_oracle.ts @@ -8,11 +8,7 @@ import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import type { FunctionSelector } from '@aztec/stdlib/abi'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import { BlockHash } from '@aztec/stdlib/block'; -import { - type ContractInstanceWithAddress, - computeContractClassIdPreimage, - computeSaltedInitializationHash, -} from '@aztec/stdlib/contract'; +import { type ContractInstanceWithAddress, computeSaltedInitializationHash } from '@aztec/stdlib/contract'; import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable'; import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; @@ -49,11 +45,15 @@ export class PrivateKernelOracle { /** Retrieves the preimage of a contract class id from the contract classes db. */ public async getContractClassIdPreimage(contractClassId: Fr) { - const contractClass = await this.contractStore.getContractClass(contractClassId); + const contractClass = await this.contractStore.getContractClassWithPreimage(contractClassId); if (!contractClass) { throw new Error(`Contract class not found when getting class id preimage. Class id: ${contractClassId}.`); } - return computeContractClassIdPreimage(contractClass); + return { + artifactHash: contractClass.artifactHash, + privateFunctionsRoot: contractClass.privateFunctionsRoot, + publicBytecodeCommitment: contractClass.publicBytecodeCommitment, + }; } /** Returns a membership witness with the sibling path and leaf index in our private functions tree. */ diff --git a/yarn-project/pxe/src/pxe.test.ts b/yarn-project/pxe/src/pxe.test.ts index f53376b0e4b3..7325d8b80ed7 100644 --- a/yarn-project/pxe/src/pxe.test.ts +++ b/yarn-project/pxe/src/pxe.test.ts @@ -326,6 +326,6 @@ describe('PXE', () => { }); }); }); - // Note: Not testing a successful run of `proveTx`, `sendTx`, `getTxReceipt` and `simulateUtility` here as it + // Note: Not testing a successful run of `proveTx`, `sendTx`, `getTxReceipt` and `executeUtility` here as it // requires a larger setup and it's sufficiently tested in the e2e tests. }); diff --git a/yarn-project/pxe/src/pxe.ts b/yarn-project/pxe/src/pxe.ts index d1d3b8fbd050..9b7e5cc3ed98 100644 --- a/yarn-project/pxe/src/pxe.ts +++ b/yarn-project/pxe/src/pxe.ts @@ -47,7 +47,7 @@ import { TxProfileResult, TxProvingResult, TxSimulationResult, - UtilitySimulationResult, + UtilityExecutionResult, } from '@aztec/stdlib/tx'; import { inspect } from 'util'; @@ -61,6 +61,7 @@ import { generateSimulatedProvingResult, } from './contract_function_simulator/contract_function_simulator.js'; import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js'; +import { displayDebugLogs } from './contract_logging.js'; import { ContractSyncService } from './contract_sync/contract_sync_service.js'; import { readCurrentClassId } from './contract_sync/helpers.js'; import { PXEDebugUtils } from './debug/pxe_debug_utils.js'; @@ -111,8 +112,8 @@ export type SimulateTxOpts = { scopes: AccessScopes; }; -/** Options for PXE.simulateUtility. */ -export type SimulateUtilityOpts = { +/** Options for PXE.executeUtility. */ +export type ExecuteUtilityOpts = { /** The authentication witnesses required for the function call. */ authwits?: AuthWitness[]; /** The accounts whose notes we can access in this call */ @@ -264,7 +265,7 @@ export class PXE { debugUtils.setPXEHelpers( pxe.#putInJobQueue.bind(pxe), pxe.#getSimulatorForTx.bind(pxe), - pxe.#simulateUtility.bind(pxe), + pxe.#executeUtility.bind(pxe), ); pxe.jobQueue.start(); @@ -344,9 +345,8 @@ export class PXE { async #registerProtocolContracts() { const registered: Record = {}; for (const name of protocolContractNames) { - const { address, contractClass, instance, artifact } = - await this.protocolContractsProvider.getProtocolContractArtifact(name); - await this.contractStore.addContractArtifact(contractClass.id, artifact); + const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name); + await this.contractStore.addContractArtifact(artifact); await this.contractStore.addContractInstance(instance); registered[name] = address.toString(); } @@ -370,7 +370,7 @@ export class PXE { contractAddress, functionSelector, (privateSyncCall, execScopes) => - this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), + this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes, @@ -394,16 +394,16 @@ export class PXE { } /** - * Simulate a utility function call on the given contract. + * Execute a utility function call on the given contract. * @param contractFunctionSimulator - The simulator to use for the function call. * @param call - The function call to execute. * @param authWitnesses - Authentication witnesses required for the function call. * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all * accounts if not specified. * @param jobId - The job ID for staged writes. - * @returns The simulation result containing the outputs of the utility function. + * @returns The execution result containing the outputs of the utility function. */ - async #simulateUtility( + async #executeUtility( contractFunctionSimulator: ContractFunctionSimulator, call: FunctionCall, authWitnesses: AuthWitness[] | undefined, @@ -601,8 +601,7 @@ export class PXE { * @param artifact - The build artifact for the contract class. */ public async registerContractClass(artifact: ContractArtifact): Promise { - const { id: contractClassId } = await getContractClassFromArtifact(artifact); - await this.contractStore.addContractArtifact(contractClassId, artifact); + const contractClassId = await this.contractStore.addContractArtifact(artifact); this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`); } @@ -621,17 +620,17 @@ export class PXE { if (artifact) { // If the user provides an artifact, validate it against the expected class id and register it const contractClass = await getContractClassFromArtifact(artifact); - const contractClassId = contractClass.id; - if (!contractClassId.equals(instance.currentContractClassId)) { + if (!contractClass.id.equals(instance.currentContractClassId)) { throw new Error( - `Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`, + `Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`, ); } const computedAddress = await computeContractAddressFromInstance(instance); if (!computedAddress.equals(instance.address)) { throw new Error('Added a contract in which the address does not match the contract instance.'); } - await this.contractStore.addContractArtifact(contractClass.id, artifact); + + await this.contractStore.addContractArtifact(artifact, contractClass); const publicFunctionSignatures = artifact.functions .filter(fn => fn.functionType === FunctionType.PUBLIC) @@ -680,15 +679,16 @@ export class PXE { throw new Error('Could not update contract to a class different from the current one.'); } - await this.contractStore.addContractArtifact(contractClass.id, artifact); - const publicFunctionSignatures = artifact.functions .filter(fn => fn.functionType === FunctionType.PUBLIC) .map(fn => decodeFunctionSignature(fn.name, fn.parameters)); await this.node.registerContractFunctionSignatures(publicFunctionSignatures); currentInstance.currentContractClassId = contractClass.id; - await this.contractStore.addContractInstance(currentInstance); + await Promise.all([ + this.contractStore.addContractArtifact(artifact, contractClass), + this.contractStore.addContractInstance(currentInstance), + ]); this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`); }); } @@ -947,6 +947,9 @@ export class PXE { const publicSimulationTimer = new Timer(); publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement); publicSimulationTime = publicSimulationTimer.ms(); + if (publicOutput?.debugLogs?.length) { + await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr)); + } } let validationTime: number | undefined; @@ -1013,16 +1016,16 @@ export class PXE { } /** - * Simulates the execution of a contract utility function. + * Executes a contract utility function. * @param call - The function call containing the function details, arguments, and target contract address. */ - public simulateUtility( + public executeUtility( call: FunctionCall, - { authwits, scopes }: SimulateUtilityOpts = { scopes: 'ALL_SCOPES' }, - ): Promise { - // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g. + { authwits, scopes }: ExecuteUtilityOpts = { scopes: 'ALL_SCOPES' }, + ): Promise { + // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g. // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to - // delete the same read value, or reading values that another simulation is currently modifying). + // delete the same read value, or reading values that another execution is currently modifying). return this.#putInJobQueue(async jobId => { try { const totalTimer = new Timer(); @@ -1037,13 +1040,13 @@ export class PXE { call.to, call.selector, (privateSyncCall, execScopes) => - this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), + this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes, ); - const executionResult = await this.#simulateUtility( + const executionResult = await this.#executeUtility( contractFunctionSimulator, call, authwits ?? [], @@ -1070,7 +1073,7 @@ export class PXE { const stringifiedArgs = args.map(arg => arg.toString()).join(', '); throw this.#contextualizeError( err, - `simulateUtility ${to}:${name}(${stringifiedArgs})`, + `executeUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes === 'ALL_SCOPES' ? scopes : scopes.map(s => s.toString()).join(', ')}`, ); } @@ -1108,7 +1111,7 @@ export class PXE { filter.contractAddress, null, async (privateSyncCall, execScopes) => - await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), + await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes, diff --git a/yarn-project/pxe/src/storage/contract_store/contract_store.test.ts b/yarn-project/pxe/src/storage/contract_store/contract_store.test.ts index 49034ac58a75..4b5253b863b6 100644 --- a/yarn-project/pxe/src/storage/contract_store/contract_store.test.ts +++ b/yarn-project/pxe/src/storage/contract_store/contract_store.test.ts @@ -1,10 +1,11 @@ -import { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; import { BenchmarkingContractArtifact } from '@aztec/noir-test-contracts.js/Benchmarking'; import { TestContractArtifact } from '@aztec/noir-test-contracts.js/Test'; import { FunctionType } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; -import { SerializableContractInstance } from '@aztec/stdlib/contract'; +import { SerializableContractInstance, getContractClassFromArtifact } from '@aztec/stdlib/contract'; + +import { jest } from '@jest/globals'; import { ContractStore } from './contract_store.js'; @@ -18,8 +19,7 @@ describe('ContractStore', () => { it('stores a contract artifact', async () => { const artifact = BenchmarkingContractArtifact; - const id = Fr.random(); - await contractStore.addContractArtifact(id, artifact); + const id = await contractStore.addContractArtifact(artifact); await expect(contractStore.getContractArtifact(id)).resolves.toEqual(artifact); }); @@ -30,8 +30,7 @@ describe('ContractStore', () => { const copiedFn = structuredClone(artifact.functions[index]); artifact.functions.push(copiedFn); - const id = Fr.random(); - await expect(contractStore.addContractArtifact(id, artifact)).rejects.toThrow( + await expect(contractStore.addContractArtifact(artifact)).rejects.toThrow( 'Repeated function selectors of private functions', ); }); @@ -42,4 +41,39 @@ describe('ContractStore', () => { await contractStore.addContractInstance(instance); await expect(contractStore.getContractInstance(address)).resolves.toEqual(instance); }); + + it('reconstructs contract class with correct preimage fields', async () => { + const artifact = BenchmarkingContractArtifact; + const expected = await getContractClassFromArtifact(artifact); + await contractStore.addContractArtifact(artifact); + + const result = await contractStore.getContractClassWithPreimage(expected.id); + expect(result).toBeDefined(); + expect(result!.id).toEqual(expected.id); + expect(result!.artifactHash).toEqual(expected.artifactHash); + expect(result!.privateFunctionsRoot).toEqual(expected.privateFunctionsRoot); + expect(result!.publicBytecodeCommitment).toEqual(expected.publicBytecodeCommitment); + expect(result!.packedBytecode).toEqual(expected.packedBytecode); + expect(result!.privateFunctions).toHaveLength(expected.privateFunctions.length); + for (let i = 0; i < expected.privateFunctions.length; i++) { + expect(result!.privateFunctions[i].selector).toEqual(expected.privateFunctions[i].selector); + expect(result!.privateFunctions[i].vkHash).toEqual(expected.privateFunctions[i].vkHash); + } + }); + + it('skips KV write on cache hit', async () => { + const kvStore = await openTmpStore('contract_store_cache_test'); + const store = new ContractStore(kvStore); + const spy = jest.spyOn(kvStore, 'transactionAsync'); + + const artifact = BenchmarkingContractArtifact; + await store.addContractArtifact(artifact); + expect(spy).toHaveBeenCalledTimes(1); + + // Second add of the same artifact should hit the in-memory cache and skip the KV write + await store.addContractArtifact(artifact); + expect(spy).toHaveBeenCalledTimes(1); + + spy.mockRestore(); + }); }); diff --git a/yarn-project/pxe/src/storage/contract_store/contract_store.ts b/yarn-project/pxe/src/storage/contract_store/contract_store.ts index 6b2453850499..5b7f36a88c07 100644 --- a/yarn-project/pxe/src/storage/contract_store/contract_store.ts +++ b/yarn-project/pxe/src/storage/contract_store/contract_store.ts @@ -1,6 +1,7 @@ import type { FUNCTION_TREE_HEIGHT } from '@aztec/constants'; -import type { Fr } from '@aztec/foundation/curves/bn254'; +import { Fr } from '@aztec/foundation/curves/bn254'; import { toArray } from '@aztec/foundation/iterable'; +import { BufferReader, numToUInt8, serializeToBuffer } from '@aztec/foundation/serialize'; import type { MembershipWitness } from '@aztec/foundation/trees'; import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; import { @@ -19,7 +20,8 @@ import { } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { - type ContractClass, + type ContractClassIdPreimage, + type ContractClassWithId, type ContractInstanceWithAddress, SerializableContractInstance, getContractClassFromArtifact, @@ -27,6 +29,68 @@ import { import { PrivateFunctionsTree } from './private_functions_tree.js'; +const VERSION = 1 as const; + +/** + * All contract class data except the large packedBytecode. + * The expensive data from the ContractClass is precomputed and stored in this format to avoid redundant hashing. + * Since we have to store the artifacts anyway, the final ContractClass is reconstructed by combining this data + * with the packedBytecode obtained from the former. That way we can have quick class lookups without wasted storage. + */ +export class SerializableContractClassData { + public readonly version = VERSION; + public readonly id: Fr; + public readonly artifactHash: Fr; + public readonly privateFunctionsRoot: Fr; + public readonly publicBytecodeCommitment: Fr; + public readonly privateFunctions: { selector: FunctionSelector; vkHash: Fr }[]; + + constructor( + data: ContractClassIdPreimage & { + id: Fr; + privateFunctions: { selector: FunctionSelector; vkHash: Fr }[]; + }, + ) { + this.id = data.id; + this.artifactHash = data.artifactHash; + this.privateFunctionsRoot = data.privateFunctionsRoot; + this.publicBytecodeCommitment = data.publicBytecodeCommitment; + this.privateFunctions = data.privateFunctions; + } + + toBuffer(): Buffer { + return serializeToBuffer( + numToUInt8(this.version), + this.id, + this.artifactHash, + this.privateFunctionsRoot, + this.publicBytecodeCommitment, + this.privateFunctions.length, + ...this.privateFunctions.map(fn => serializeToBuffer(fn.selector, fn.vkHash)), + ); + } + + static fromBuffer(bufferOrReader: Buffer | BufferReader): SerializableContractClassData { + const reader = BufferReader.asReader(bufferOrReader); + const version = reader.readUInt8(); + if (version !== VERSION) { + throw new Error(`Unexpected contract class data version ${version}`); + } + return new SerializableContractClassData({ + id: reader.readObject(Fr), + artifactHash: reader.readObject(Fr), + privateFunctionsRoot: reader.readObject(Fr), + publicBytecodeCommitment: reader.readObject(Fr), + privateFunctions: reader.readVector({ + fromBuffer: (r: BufferReader) => ({ + selector: r.readObject(FunctionSelector), + vkHash: r.readObject(Fr), + }), + }), + }); + } +} + /** * ContractStore serves as a data manager and retriever for Aztec.nr contracts. * It provides methods to obtain contract addresses, function ABI, bytecode, and membership witnesses @@ -39,42 +103,68 @@ export class ContractStore { // TODO: Update it to be LRU cache so that it doesn't keep all the data all the time. #privateFunctionTrees: Map = new Map(); - /** Map from contract address to contract class id */ + /** + * In-memory cache of deserialized ContractArtifact objects, keyed by class id string. + * Avoids repeated LMDB reads + JSON.parse + Zod validation on every oracle call. + * Artifacts are large but immutable after registration — safe to cache for the lifetime of the store. + */ + // TODO: Update it to be LRU cache so that it doesn't keep all the data all the time. + #contractArtifactCache: Map = new Map(); + + /** Map from contract address to contract class id (avoids KV round-trip on hot path). */ #contractClassIdMap: Map = new Map(); #store: AztecAsyncKVStore; #contractArtifacts: AztecAsyncMap; + #contractClassData: AztecAsyncMap; #contractInstances: AztecAsyncMap; constructor(store: AztecAsyncKVStore) { this.#store = store; this.#contractArtifacts = store.openMap('contract_artifacts'); + this.#contractClassData = store.openMap('contract_classes'); this.#contractInstances = store.openMap('contracts_instances'); } // Setters - public async addContractArtifact(id: Fr, contract: ContractArtifact): Promise { - // Validation outside transactionAsync - these are not DB operations + /** + * Registers a new contract artifact and its corresponding class data. + * IMPORTANT: This method does not verify that the provided artifact matches the class data or that the class id matches the artifact. + * It is the caller's responsibility to ensure the consistency and correctness of the provided data. + * This is done to avoid redundant, expensive contract class computations + */ + public async addContractArtifact( + contract: ContractArtifact, + contractClassWithIdAndPreimage?: ContractClassWithId & ContractClassIdPreimage, + ): Promise { + const contractClass = contractClassWithIdAndPreimage ?? (await getContractClassFromArtifact(contract)); + const key = contractClass.id.toString(); + + if (this.#contractArtifactCache.has(key)) { + return contractClass.id; + } + const privateFunctions = contract.functions.filter( functionArtifact => functionArtifact.functionType === FunctionType.PRIVATE, ); - const privateSelectors = await Promise.all( - privateFunctions.map(async privateFunctionArtifact => - ( - await FunctionSelector.fromNameAndParameters(privateFunctionArtifact.name, privateFunctionArtifact.parameters) - ).toString(), + privateFunctions.map(async fn => + (await FunctionSelector.fromNameAndParameters(fn.name, fn.parameters)).toString(), ), ); - if (privateSelectors.length !== new Set(privateSelectors).size) { throw new Error('Repeated function selectors of private functions'); } - await this.#store.transactionAsync(() => - this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract)), - ); + this.#contractArtifactCache.set(key, contract); + + await this.#store.transactionAsync(async () => { + await this.#contractArtifacts.set(key, contractArtifactToBuffer(contract)); + await this.#contractClassData.set(key, new SerializableContractClassData(contractClass).toBuffer()); + }); + + return contractClass.id; } async addContractInstance(contract: ContractInstanceWithAddress): Promise { @@ -89,26 +179,17 @@ export class ContractStore { // Private getters async #getContractClassId(contractAddress: AztecAddress): Promise { - if (!this.#contractClassIdMap.has(contractAddress.toString())) { + const key = contractAddress.toString(); + if (!this.#contractClassIdMap.has(key)) { const instance = await this.getContractInstance(contractAddress); if (!instance) { return; } - this.#contractClassIdMap.set(contractAddress.toString(), instance.currentContractClassId); + this.#contractClassIdMap.set(key, instance.currentContractClassId); } - return this.#contractClassIdMap.get(contractAddress.toString()); + return this.#contractClassIdMap.get(key); } - /** - * Retrieve or create a ContractTree instance based on the provided class id. - * If an existing tree with the same class id is found in the cache, it will be returned. - * Otherwise, a new ContractTree instance will be created using the contract data from the database - * and added to the cache before returning. - * - * @param classId - The class id of the contract for which the ContractTree is required. - * @returns A ContractTree instance associated with the specified contract address. - * @throws An Error if the contract is not found in the ContractDatabase. - */ async #getPrivateFunctionTreeForClassId(classId: Fr): Promise { if (!this.#privateFunctionTrees.has(classId.toString())) { const artifact = await this.getContractArtifact(classId); @@ -121,9 +202,9 @@ export class ContractStore { return this.#privateFunctionTrees.get(classId.toString())!; } - async #getContractArtifactByAddress(contractAddress: AztecAddress): Promise { - const contractClassId = await this.#getContractClassId(contractAddress); - return contractClassId && this.getContractArtifact(contractClassId); + async #getArtifactByAddress(contractAddress: AztecAddress): Promise { + const classId = await this.#getContractClassId(contractAddress); + return classId && this.getContractArtifact(classId); } // Public getters @@ -135,7 +216,7 @@ export class ContractStore { }); } - /** Returns a contract instance for a given address. Throws if not found. */ + /** Returns a contract instance for a given address. */ public getContractInstance(contractAddress: AztecAddress): Promise { return this.#store.transactionAsync(async () => { const contract = await this.#contractInstances.getAsync(contractAddress.toString()); @@ -143,18 +224,39 @@ export class ContractStore { }); } - public getContractArtifact(contractClassId: Fr): Promise { - return this.#store.transactionAsync(async () => { - const contract = await this.#contractArtifacts.getAsync(contractClassId.toString()); - // TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from. - return contract && contractArtifactFromBuffer(Buffer.from(contract)); + /** Returns the raw contract artifact for a given class id. */ + public async getContractArtifact(contractClassId: Fr): Promise { + const key = contractClassId.toString(); + const cached = this.#contractArtifactCache.get(key); + if (cached) { + return cached; + } + const artifact = await this.#store.transactionAsync(async () => { + const buf = await this.#contractArtifacts.getAsync(key); + return buf && contractArtifactFromBuffer(buf); }); + if (artifact) { + this.#contractArtifactCache.set(key, artifact); + } + return artifact; } - /** Returns a contract class for a given class id. Throws if not found. */ - public async getContractClass(contractClassId: Fr): Promise { + /** Returns a contract class for a given class id. */ + public async getContractClassWithPreimage( + contractClassId: Fr, + ): Promise<(ContractClassWithId & ContractClassIdPreimage) | undefined> { + const key = contractClassId.toString(); + const buf = await this.#contractClassData.getAsync(key); + if (!buf) { + return undefined; + } + const classData = SerializableContractClassData.fromBuffer(buf); const artifact = await this.getContractArtifact(contractClassId); - return artifact && getContractClassFromArtifact(artifact); + if (!artifact) { + return undefined; + } + const packedBytecode = artifact.functions.find(f => f.name === 'public_dispatch')?.bytecode ?? Buffer.alloc(0); + return { ...classData, packedBytecode }; } public async getContract( @@ -173,8 +275,6 @@ export class ContractStore { /** * Retrieves the artifact of a specified function within a given contract. - * The function is identified by its selector, which is a unique code generated from the function's signature. - * Throws an error if the contract address or function selector are invalid or not found. * * @param contractAddress - The AztecAddress representing the contract containing the function. * @param selector - The function selector. @@ -184,9 +284,12 @@ export class ContractStore { contractAddress: AztecAddress, selector: FunctionSelector, ): Promise { - const artifact = await this.#getContractArtifactByAddress(contractAddress); - const fnArtifact = artifact && (await this.#findFunctionArtifactBySelector(artifact, selector)); - return fnArtifact && { ...fnArtifact, contractName: artifact.name }; + const artifact = await this.#getArtifactByAddress(contractAddress); + if (!artifact) { + return undefined; + } + const fn = await this.#findFunctionArtifactBySelector(artifact, selector); + return fn && { ...fn, contractName: artifact.name }; } public async getFunctionArtifactWithDebugMetadata( @@ -207,50 +310,48 @@ export class ContractStore { public async getPublicFunctionArtifact( contractAddress: AztecAddress, ): Promise { - const artifact = await this.#getContractArtifactByAddress(contractAddress); - const fnArtifact = artifact && artifact.functions.find(fn => fn.functionType === FunctionType.PUBLIC); - return fnArtifact && { ...fnArtifact, contractName: artifact.name }; + const artifact = await this.#getArtifactByAddress(contractAddress); + const fn = artifact && artifact.functions.find(f => f.functionType === FunctionType.PUBLIC); + return fn && { ...fn, contractName: artifact.name }; } public async getFunctionAbi( contractAddress: AztecAddress, selector: FunctionSelector, ): Promise { - const artifact = await this.#getContractArtifactByAddress(contractAddress); + const artifact = await this.#getArtifactByAddress(contractAddress); return artifact && (await this.#findFunctionAbiBySelector(artifact, selector)); } /** * Retrieves the debug metadata of a specified function within a given contract. - * The function is identified by its selector, which is a unique code generated from the function's signature. - * Returns undefined if the debug metadata for the given function is not found. - * Throws if the contract has not been added to the database. * * @param contractAddress - The AztecAddress representing the contract containing the function. * @param selector - The function selector. - * @returns The corresponding function's artifact as an object. + * @returns The corresponding function's debug metadata, or undefined. */ public async getFunctionDebugMetadata( contractAddress: AztecAddress, selector: FunctionSelector, ): Promise { - const artifact = await this.#getContractArtifactByAddress(contractAddress); - const fnArtifact = artifact && (await this.#findFunctionArtifactBySelector(artifact, selector)); - return fnArtifact && getFunctionDebugMetadata(artifact, fnArtifact); + const artifact = await this.#getArtifactByAddress(contractAddress); + if (!artifact) { + return undefined; + } + const fn = await this.#findFunctionArtifactBySelector(artifact, selector); + return fn && getFunctionDebugMetadata(artifact, fn); } public async getPublicFunctionDebugMetadata( contractAddress: AztecAddress, ): Promise { - const artifact = await this.#getContractArtifactByAddress(contractAddress); - const fnArtifact = artifact && artifact.functions.find(fn => fn.functionType === FunctionType.PUBLIC); - return fnArtifact && getFunctionDebugMetadata(artifact, fnArtifact); + const artifact = await this.#getArtifactByAddress(contractAddress); + const fn = artifact && artifact.functions.find(f => f.functionType === FunctionType.PUBLIC); + return fn && getFunctionDebugMetadata(artifact, fn); } /** * Retrieve the function membership witness for the given contract class and function selector. - * The function membership witness represents a proof that the function belongs to the specified contract. - * Throws an error if the contract address or function selector is unknown. * * @param contractClassId - The id of the class. * @param selector - The function selector. @@ -265,23 +366,21 @@ export class ContractStore { } public async getDebugContractName(contractAddress: AztecAddress) { - const artifact = await this.#getContractArtifactByAddress(contractAddress); + const artifact = await this.#getArtifactByAddress(contractAddress); return artifact?.name; } public async getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector) { - const artifact = await this.#getContractArtifactByAddress(contractAddress); - const fnArtifact = artifact && (await this.#findFunctionAbiBySelector(artifact, selector)); - return `${artifact?.name ?? contractAddress}:${fnArtifact?.name ?? selector}`; + const artifact = await this.#getArtifactByAddress(contractAddress); + const fn = artifact && (await this.#findFunctionAbiBySelector(artifact, selector)); + return `${artifact?.name ?? contractAddress}:${fn?.name ?? selector}`; } async #findFunctionArtifactBySelector( artifact: ContractArtifact, selector: FunctionSelector, ): Promise { - const functions = artifact.functions; - for (let i = 0; i < functions.length; i++) { - const fn = functions[i]; + for (const fn of artifact.functions) { const fnSelector = await FunctionSelector.fromNameAndParameters(fn.name, fn.parameters); if (fnSelector.equals(selector)) { return fn; @@ -293,9 +392,7 @@ export class ContractStore { artifact: ContractArtifact, selector: FunctionSelector, ): Promise { - const functions = [...artifact.functions, ...(artifact.nonDispatchPublicFunctions ?? [])]; - for (let i = 0; i < functions.length; i++) { - const fn = functions[i]; + for (const fn of [...artifact.functions, ...(artifact.nonDispatchPublicFunctions ?? [])]) { const fnSelector = await FunctionSelector.fromNameAndParameters(fn.name, fn.parameters); if (fnSelector.equals(selector)) { return fn; @@ -316,10 +413,12 @@ export class ContractStore { throw new Error(`Unknown function ${functionName} in contract ${contract.name}.`); } + const selector = await FunctionSelector.fromNameAndParameters(functionDao.name, functionDao.parameters); + return FunctionCall.from({ name: functionDao.name, to, - selector: await FunctionSelector.fromNameAndParameters(functionDao.name, functionDao.parameters), + selector, type: functionDao.functionType, hideMsgSender: false, isStatic: functionDao.isStatic, diff --git a/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.test.ts b/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.test.ts index 49ff3ad27a89..33f2c60d2291 100644 --- a/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.test.ts +++ b/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.test.ts @@ -1,18 +1,18 @@ -import { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; -import { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; +import { randomExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/testing'; import { RecipientTaggingStore } from './recipient_tagging_store.js'; describe('RecipientTaggingStore', () => { let taggingStore: RecipientTaggingStore; - let secret1: DirectionalAppTaggingSecret; - let secret2: DirectionalAppTaggingSecret; + let secret1: ExtendedDirectionalAppTaggingSecret; + let secret2: ExtendedDirectionalAppTaggingSecret; beforeEach(async () => { taggingStore = new RecipientTaggingStore(await openTmpStore('test')); - secret1 = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); - secret2 = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); + secret1 = await randomExtendedDirectionalAppTaggingSecret(); + secret2 = await randomExtendedDirectionalAppTaggingSecret(); }); describe('staged writes', () => { diff --git a/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts b/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts index d492c0ff99b8..148d9b59dcfc 100644 --- a/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts +++ b/yarn-project/pxe/src/storage/tagging_store/recipient_tagging_store.ts @@ -1,5 +1,5 @@ import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; -import type { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; import type { StagedStore } from '../../job_coordinator/job_coordinator.js'; @@ -106,11 +106,11 @@ export class RecipientTaggingStore implements StagedStore { return Promise.resolve(); } - getHighestAgedIndex(secret: DirectionalAppTaggingSecret, jobId: string): Promise { + getHighestAgedIndex(secret: ExtendedDirectionalAppTaggingSecret, jobId: string): Promise { return this.#store.transactionAsync(() => this.#readHighestAgedIndex(jobId, secret.toString())); } - updateHighestAgedIndex(secret: DirectionalAppTaggingSecret, index: number, jobId: string): Promise { + updateHighestAgedIndex(secret: ExtendedDirectionalAppTaggingSecret, index: number, jobId: string): Promise { return this.#store.transactionAsync(async () => { const currentIndex = await this.#readHighestAgedIndex(jobId, secret.toString()); if (currentIndex !== undefined && index <= currentIndex) { @@ -121,11 +121,15 @@ export class RecipientTaggingStore implements StagedStore { }); } - getHighestFinalizedIndex(secret: DirectionalAppTaggingSecret, jobId: string): Promise { + getHighestFinalizedIndex(secret: ExtendedDirectionalAppTaggingSecret, jobId: string): Promise { return this.#store.transactionAsync(() => this.#readHighestFinalizedIndex(jobId, secret.toString())); } - updateHighestFinalizedIndex(secret: DirectionalAppTaggingSecret, index: number, jobId: string): Promise { + updateHighestFinalizedIndex( + secret: ExtendedDirectionalAppTaggingSecret, + index: number, + jobId: string, + ): Promise { return this.#store.transactionAsync(async () => { const currentIndex = await this.#readHighestFinalizedIndex(jobId, secret.toString()); if (currentIndex !== undefined && index < currentIndex) { diff --git a/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts index 7b78ce0141a3..986f1daef6fc 100644 --- a/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts +++ b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.test.ts @@ -1,6 +1,6 @@ -import { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; -import { DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret, PreTag } from '@aztec/stdlib/logs'; +import { randomExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/testing'; import { TxHash } from '@aztec/stdlib/tx'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.js'; @@ -8,19 +8,19 @@ import { SenderTaggingStore } from './sender_tagging_store.js'; describe('SenderTaggingStore', () => { let taggingStore: SenderTaggingStore; - let secret1: DirectionalAppTaggingSecret; - let secret2: DirectionalAppTaggingSecret; + let secret1: ExtendedDirectionalAppTaggingSecret; + let secret2: ExtendedDirectionalAppTaggingSecret; beforeEach(async () => { taggingStore = new SenderTaggingStore(await openTmpStore('test')); - secret1 = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); - secret2 = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); + secret1 = await randomExtendedDirectionalAppTaggingSecret(); + secret2 = await randomExtendedDirectionalAppTaggingSecret(); }); describe('storePendingIndexes', () => { it('stores a single pending index', async () => { const txHash = TxHash.random(); - const preTag: PreTag = { secret: secret1, index: 5 }; + const preTag: PreTag = { extendedSecret: secret1, index: 5 }; await taggingStore.storePendingIndexes([preTag], txHash, 'test'); @@ -32,8 +32,8 @@ describe('SenderTaggingStore', () => { it('stores multiple pending indexes for different secrets', async () => { const txHash = TxHash.random(); const preTags: PreTag[] = [ - { secret: secret1, index: 3 }, - { secret: secret2, index: 7 }, + { extendedSecret: secret1, index: 3 }, + { extendedSecret: secret2, index: 7 }, ]; await taggingStore.storePendingIndexes(preTags, txHash, 'test'); @@ -51,8 +51,8 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, 'test'); const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10, 'test'); expect(txHashes).toHaveLength(2); @@ -62,7 +62,7 @@ describe('SenderTaggingStore', () => { it('ignores duplicate preTag + txHash combination', async () => { const txHash = TxHash.random(); - const preTag: PreTag = { secret: secret1, index: 5 }; + const preTag: PreTag = { extendedSecret: secret1, index: 5 }; await taggingStore.storePendingIndexes([preTag], txHash, 'test'); await taggingStore.storePendingIndexes([preTag], txHash, 'test'); @@ -75,8 +75,8 @@ describe('SenderTaggingStore', () => { it('throws when storing duplicate secrets in the same call', async () => { const txHash = TxHash.random(); const preTags: PreTag[] = [ - { secret: secret1, index: 3 }, - { secret: secret1, index: 7 }, + { extendedSecret: secret1, index: 3 }, + { extendedSecret: secret1, index: 7 }, ]; await expect(taggingStore.storePendingIndexes(preTags, txHash, 'test')).rejects.toThrow( @@ -88,12 +88,12 @@ describe('SenderTaggingStore', () => { const txHash = TxHash.random(); // First store an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash, 'test'); // Try to store a different index for the same secret + txHash pair - await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash, 'test')).rejects.toThrow( - /Cannot store index 7.*a different index 5 already exists/, - ); + await expect( + taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash, 'test'), + ).rejects.toThrow(/Cannot store index 7.*a different index 5 already exists/); }); it('throws when storing a pending index lower than the last finalized index', async () => { @@ -101,13 +101,13 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); // First store and finalize an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 10 }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Try to store a pending index lower than the finalized index - await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2, 'test')).rejects.toThrow( - /Cannot store pending index 5.*lower than or equal to the last finalized index 10/, - ); + await expect( + taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash2, 'test'), + ).rejects.toThrow(/Cannot store pending index 5.*lower than or equal to the last finalized index 10/); }); it('throws when storing a pending index equal to the last finalized index', async () => { @@ -115,13 +115,13 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); // First store and finalize an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 10 }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Try to store a pending index equal to the finalized index - await expect(taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash2, 'test')).rejects.toThrow( - /Cannot store pending index 10.*lower than or equal to the last finalized index 10/, - ); + await expect( + taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 10 }], txHash2, 'test'), + ).rejects.toThrow(/Cannot store pending index 10.*lower than or equal to the last finalized index 10/); }); it('allows storing a pending index higher than the last finalized index', async () => { @@ -129,12 +129,12 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); // First store and finalize an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 10 }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Store a pending index higher than the finalized index - should succeed await expect( - taggingStore.storePendingIndexes([{ secret: secret1, index: 15 }], txHash2, 'test'), + taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 15 }], txHash2, 'test'), ).resolves.not.toThrow(); const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 20, 'test'); @@ -150,12 +150,12 @@ describe('SenderTaggingStore', () => { const indexBeyondWindow = finalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1; // First store and finalize an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: finalizedIndex }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: finalizedIndex }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Try to store an index beyond the window await expect( - taggingStore.storePendingIndexes([{ secret: secret1, index: indexBeyondWindow }], txHash2, 'test'), + taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: indexBeyondWindow }], txHash2, 'test'), ).rejects.toThrow( `Highest used index ${indexBeyondWindow} is further than window length from the highest finalized index ${finalizedIndex}`, ); @@ -168,12 +168,12 @@ describe('SenderTaggingStore', () => { const indexAtBoundary = finalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN; // First store and finalize an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: finalizedIndex }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: finalizedIndex }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Store an index at the boundary, but check is >, so it should succeed await expect( - taggingStore.storePendingIndexes([{ secret: secret1, index: indexAtBoundary }], txHash2, 'test'), + taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: indexAtBoundary }], txHash2, 'test'), ).resolves.not.toThrow(); const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, indexAtBoundary + 5, 'test'); @@ -194,9 +194,9 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); const txHash3 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 8 }], txHash3, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 8 }], txHash3, 'test'); const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 4, 9, 'test'); expect(txHashes).toHaveLength(2); @@ -209,8 +209,8 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 10 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 10 }], txHash2, 'test'); const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 5, 10, 'test'); expect(txHashes).toHaveLength(1); @@ -223,13 +223,13 @@ describe('SenderTaggingStore', () => { const txHash3 = TxHash.random(); const txHash4 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash2, 'test'); // We store different secret with txHash1 to check we correctly don't return it in the result - await taggingStore.storePendingIndexes([{ secret: secret2, index: 7 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret2, index: 7 }], txHash1, 'test'); // Store "parallel" index for secret1 with a different tx (can happen when sending logs from multiple PXEs) - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash4, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash3, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash4, 'test'); const txHashes = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10, 'test'); // Should have 3 unique tx hashes for secret1 @@ -245,7 +245,7 @@ describe('SenderTaggingStore', () => { it('returns the last finalized index after finalizePendingIndexes', async () => { const txHash = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash, 'test'); await taggingStore.finalizePendingIndexes([txHash], 'test'); const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1, 'test'); @@ -261,7 +261,7 @@ describe('SenderTaggingStore', () => { it('returns the last finalized index when no pending indexes exist', async () => { const txHash = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash, 'test'); await taggingStore.finalizePendingIndexes([txHash], 'test'); const lastUsed = await taggingStore.getLastUsedIndex(secret1, 'test'); @@ -273,11 +273,11 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); // First, finalize an index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Then add a higher pending index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, 'test'); const lastUsed = await taggingStore.getLastUsedIndex(secret1, 'test'); expect(lastUsed).toBe(7); @@ -288,9 +288,9 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); const txHash3 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash3, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash3, 'test'); const lastUsed = await taggingStore.getLastUsedIndex(secret1, 'test'); expect(lastUsed).toBe(7); @@ -302,9 +302,9 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret2, index: 5 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret2, index: 5 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, 'test'); await taggingStore.dropPendingIndexes([txHash1], 'test'); @@ -322,7 +322,7 @@ describe('SenderTaggingStore', () => { describe('finalizePendingIndexes', () => { it('moves pending index to finalized for a given tx hash', async () => { const txHash = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash, 'test'); await taggingStore.finalizePendingIndexes([txHash], 'test'); @@ -338,10 +338,10 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, 'test'); await taggingStore.finalizePendingIndexes([txHash2], 'test'); const lastFinalized = await taggingStore.getLastFinalizedIndex(secret1, 'test'); @@ -353,8 +353,8 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); // Store both pending indexes first - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash2, 'test'); // Finalize the higher index first await taggingStore.finalizePendingIndexes([txHash1], 'test'); @@ -371,9 +371,9 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); const txHash3 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash3, 'test'); // Finalize txHash2 (index 5) await taggingStore.finalizePendingIndexes([txHash2], 'test'); @@ -389,8 +389,8 @@ describe('SenderTaggingStore', () => { const txHash = TxHash.random(); await taggingStore.storePendingIndexes( [ - { secret: secret1, index: 3 }, - { secret: secret2, index: 7 }, + { extendedSecret: secret1, index: 3 }, + { extendedSecret: secret2, index: 7 }, ], txHash, 'test', @@ -407,7 +407,7 @@ describe('SenderTaggingStore', () => { it('does nothing when tx hash does not exist', async () => { const txHash = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash, 'test'); await taggingStore.finalizePendingIndexes([TxHash.random()], 'test'); @@ -427,7 +427,7 @@ describe('SenderTaggingStore', () => { const txHash2 = TxHash.random(); // Step 1: Add pending index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); expect(await taggingStore.getLastUsedIndex(secret1, 'test')).toBe(3); expect(await taggingStore.getLastFinalizedIndex(secret1, 'test')).toBeUndefined(); @@ -437,7 +437,7 @@ describe('SenderTaggingStore', () => { expect(await taggingStore.getLastFinalizedIndex(secret1, 'test')).toBe(3); // Step 3: Add a new higher pending index - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, 'test'); expect(await taggingStore.getLastUsedIndex(secret1, 'test')).toBe(7); expect(await taggingStore.getLastFinalizedIndex(secret1, 'test')).toBe(3); @@ -451,8 +451,8 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], txHash2, 'test'); expect(await taggingStore.getLastUsedIndex(secret1, 'test')).toBe(5); @@ -468,14 +468,14 @@ describe('SenderTaggingStore', () => { const txHash3 = TxHash.random(); // Secret1: pending -> finalized - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, 'test'); await taggingStore.finalizePendingIndexes([txHash1], 'test'); // Secret2: pending (not finalized) - await taggingStore.storePendingIndexes([{ secret: secret2, index: 5 }], txHash2, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret2, index: 5 }], txHash2, 'test'); // Secret1: new pending - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3, 'test'); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash3, 'test'); expect(await taggingStore.getLastFinalizedIndex(secret1, 'test')).toBe(3); expect(await taggingStore.getLastUsedIndex(secret1, 'test')).toBe(7); @@ -489,13 +489,13 @@ describe('SenderTaggingStore', () => { const committedTxHash = TxHash.random(); { const commitJobId: string = 'commit-job'; - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], committedTxHash, commitJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], committedTxHash, commitJobId); await taggingStore.commit(commitJobId); } const stagedTxHash = TxHash.random(); const stagingJobId: string = 'staging-job'; - await taggingStore.storePendingIndexes([{ secret: secret1, index: 5 }], stagedTxHash, stagingJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 5 }], stagedTxHash, stagingJobId); // For a job without any staged data we should only get committed data const txHashesWithoutJobId = await taggingStore.getTxHashesOfPendingIndexes(secret1, 0, 10, 'no-data-job'); @@ -513,7 +513,7 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); { const commitJobId: string = 'commit-job'; - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash1, commitJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash1, commitJobId); await taggingStore.finalizePendingIndexes([txHash1], commitJobId); await taggingStore.commit(commitJobId); } @@ -522,7 +522,7 @@ describe('SenderTaggingStore', () => { const stagingJobId: string = 'staging-job'; // Stage a higher finalized index (not committed) - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash2, stagingJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash2, stagingJobId); await taggingStore.finalizePendingIndexes([txHash2], stagingJobId); // With a different jobId, should get the committed finalized index @@ -537,8 +537,8 @@ describe('SenderTaggingStore', () => { const txHash1 = TxHash.random(); const txHash2 = TxHash.random(); const commitJobId: string = 'commit-job'; - await taggingStore.storePendingIndexes([{ secret: secret1, index: 2 }], txHash1, commitJobId); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 3 }], txHash2, commitJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 2 }], txHash1, commitJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 3 }], txHash2, commitJobId); await taggingStore.finalizePendingIndexes([txHash1], commitJobId); await taggingStore.commit(commitJobId); } @@ -546,7 +546,7 @@ describe('SenderTaggingStore', () => { const stagingJobId: string = 'staging-job'; { const txHash3 = TxHash.random(); - await taggingStore.storePendingIndexes([{ secret: secret1, index: 7 }], txHash3, stagingJobId); + await taggingStore.storePendingIndexes([{ extendedSecret: secret1, index: 7 }], txHash3, stagingJobId); await taggingStore.finalizePendingIndexes([txHash3], stagingJobId); await taggingStore.discardStaged(stagingJobId); } diff --git a/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts index 8da2e88ab91f..1b15bbbb207a 100644 --- a/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts +++ b/yarn-project/pxe/src/storage/tagging_store/sender_tagging_store.ts @@ -1,5 +1,5 @@ import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; -import type { DirectionalAppTaggingSecret, PreTag } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret, PreTag } from '@aztec/stdlib/logs'; import { TxHash } from '@aztec/stdlib/tx'; import type { StagedStore } from '../../job_coordinator/job_coordinator.js'; @@ -154,7 +154,7 @@ export class SenderTaggingStore implements StagedStore { // The secrets in pre-tags should be unique because we always store just the highest index per given secret-txHash // pair. Below we check that this is the case. - const secretsSet = new Set(preTags.map(preTag => preTag.secret.toString())); + const secretsSet = new Set(preTags.map(preTag => preTag.extendedSecret.toString())); if (secretsSet.size !== preTags.length) { return Promise.reject(new Error(`Duplicate secrets found when storing pending indexes`)); } @@ -163,10 +163,10 @@ export class SenderTaggingStore implements StagedStore { return this.#store.transactionAsync(async () => { // Prefetch all data, start reads during iteration to keep IndexedDB transaction alive - const preTagReadPromises = preTags.map(({ secret, index }) => { - const secretStr = secret.toString(); + const preTagReadPromises = preTags.map(({ extendedSecret, index }) => { + const secretStr = extendedSecret.toString(); return { - secret, + extendedSecret, secretStr, index, pending: this.#readPendingIndexes(jobId, secretStr), @@ -233,7 +233,7 @@ export class SenderTaggingStore implements StagedStore { * [startIndex, endIndex). Returns an empty array if no pending indexes exist in the range. */ getTxHashesOfPendingIndexes( - secret: DirectionalAppTaggingSecret, + secret: ExtendedDirectionalAppTaggingSecret, startIndex: number, endIndex: number, jobId: string, @@ -252,7 +252,7 @@ export class SenderTaggingStore implements StagedStore { * @param secret - The secret to get the last finalized index for. * @returns The last (highest) finalized index for the given secret. */ - getLastFinalizedIndex(secret: DirectionalAppTaggingSecret, jobId: string): Promise { + getLastFinalizedIndex(secret: ExtendedDirectionalAppTaggingSecret, jobId: string): Promise { return this.#store.transactionAsync(() => this.#readLastFinalizedIndex(jobId, secret.toString())); } @@ -262,7 +262,7 @@ export class SenderTaggingStore implements StagedStore { * @param secret - The directional app tagging secret to query the last used index for. * @returns The last used index. */ - getLastUsedIndex(secret: DirectionalAppTaggingSecret, jobId: string): Promise { + getLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret, jobId: string): Promise { const secretStr = secret.toString(); return this.#store.transactionAsync(async () => { diff --git a/yarn-project/pxe/src/tagging/get_all_logs_by_tags.test.ts b/yarn-project/pxe/src/tagging/get_all_logs_by_tags.test.ts index 2515b695ec1e..f769a1f54ff7 100644 --- a/yarn-project/pxe/src/tagging/get_all_logs_by_tags.test.ts +++ b/yarn-project/pxe/src/tagging/get_all_logs_by_tags.test.ts @@ -21,7 +21,7 @@ describe('getAllPrivateLogsByTags', () => { beforeAll(async () => { tags = await Promise.all( - [1, 2, 3].map(async () => SiloedTag.compute(new Tag(Fr.random()), await AztecAddress.random())), + [1, 2, 3].map(async () => SiloedTag.computeFromTagAndApp(new Tag(Fr.random()), await AztecAddress.random())), ); }); diff --git a/yarn-project/pxe/src/tagging/index.ts b/yarn-project/pxe/src/tagging/index.ts index beeb055a2e17..ea8c6f80f613 100644 --- a/yarn-project/pxe/src/tagging/index.ts +++ b/yarn-project/pxe/src/tagging/index.ts @@ -15,5 +15,5 @@ export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from './constants.js'; export { getAllPrivateLogsByTags, getAllPublicLogsByTagsFromContract } from './get_all_logs_by_tags.js'; // Re-export tagging-related types from stdlib -export { DirectionalAppTaggingSecret, Tag, SiloedTag } from '@aztec/stdlib/logs'; +export { ExtendedDirectionalAppTaggingSecret, Tag, SiloedTag } from '@aztec/stdlib/logs'; export { type PreTag } from '@aztec/stdlib/logs'; diff --git a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts index 7a19c393ae72..25d7104a3d48 100644 --- a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts +++ b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.test.ts @@ -2,11 +2,15 @@ import { MAX_TX_LIFETIME } from '@aztec/constants'; import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; -import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import { DirectionalAppTaggingSecret, SiloedTag, Tag } from '@aztec/stdlib/logs'; -import { makeBlockHeader, makeL2Tips, randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; +import { type ExtendedDirectionalAppTaggingSecret, SiloedTag } from '@aztec/stdlib/logs'; +import { + makeBlockHeader, + makeL2Tips, + randomExtendedDirectionalAppTaggingSecret, + randomTxScopedPrivateL2Log, +} from '@aztec/stdlib/testing'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -20,17 +24,15 @@ const FAR_FUTURE_BLOCK_NUMBER = BlockNumber(100); const MOCK_ANCHOR_BLOCK_HASH = BlockHash.random(); describe('loadPrivateLogsForSenderRecipientPair', () => { - let secret: DirectionalAppTaggingSecret; - let app: AztecAddress; + let secret: ExtendedDirectionalAppTaggingSecret; let aztecNode: MockProxy; let taggingStore: RecipientTaggingStore; const currentTimestamp = BigInt(Math.floor(Date.now() / 1000)); - async function computeSiloedTagForIndex(index: number) { - const tag = await Tag.compute({ secret, index }); - return SiloedTag.compute(tag, app); + function computeSiloedTagForIndex(index: number) { + return SiloedTag.compute({ extendedSecret: secret, index }); } function makeLog(blockNumber: number, blockTimestamp: bigint, tag: Fr) { @@ -38,8 +40,7 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { } beforeAll(async () => { - secret = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); - app = await AztecAddress.random(); + secret = await randomExtendedDirectionalAppTaggingSecret(); aztecNode = mock(); }); @@ -62,7 +63,6 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { const logs = await loadPrivateLogsForSenderRecipientPair( secret, - app, aztecNode, taggingStore, FAR_FUTURE_BLOCK_NUMBER, @@ -97,7 +97,6 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { const logs = await loadPrivateLogsForSenderRecipientPair( secret, - app, aztecNode, taggingStore, FAR_FUTURE_BLOCK_NUMBER, @@ -132,7 +131,6 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { const logs = await loadPrivateLogsForSenderRecipientPair( secret, - app, aztecNode, taggingStore, FAR_FUTURE_BLOCK_NUMBER, @@ -184,7 +182,6 @@ describe('loadPrivateLogsForSenderRecipientPair', () => { const logs = await loadPrivateLogsForSenderRecipientPair( secret, - app, aztecNode, taggingStore, FAR_FUTURE_BLOCK_NUMBER, diff --git a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts index de527f8a7f61..8587860539bf 100644 --- a/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +++ b/yarn-project/pxe/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts @@ -1,8 +1,7 @@ import type { BlockNumber } from '@aztec/foundation/branded-types'; -import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; -import type { DirectionalAppTaggingSecret, TxScopedL2Log } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret, TxScopedL2Log } from '@aztec/stdlib/logs'; import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../constants.js'; @@ -10,15 +9,14 @@ import { findHighestIndexes } from './utils/find_highest_indexes.js'; import { loadLogsForRange } from './utils/load_logs_for_range.js'; /** - * Loads private logs for `app` and sender-recipient pair defined by `secret` and updates the highest aged and + * Loads private logs for the app-sender-recipient triplet defined by `secret` and updates the highest aged and * finalized indexes in the db. At most load logs from blocks up to and including `anchorBlockNumber`. * * @dev This function can be safely executed "in parallel" for other sender-recipient pairs because the data in * in the tagging data provider is indexed by the secret and hence completely disjoint. */ export async function loadPrivateLogsForSenderRecipientPair( - secret: DirectionalAppTaggingSecret, - app: AztecAddress, + secret: ExtendedDirectionalAppTaggingSecret, aztecNode: AztecNode, taggingStore: RecipientTaggingStore, anchorBlockNumber: BlockNumber, @@ -96,7 +94,6 @@ export async function loadPrivateLogsForSenderRecipientPair( // Get private logs with their block timestamps and corresponding tagging indexes const privateLogsWithIndexes = await loadLogsForRange( secret, - app, aztecNode, start, end, diff --git a/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.test.ts b/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.test.ts index 24c278dd2e4d..89134335968d 100644 --- a/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.test.ts +++ b/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.test.ts @@ -1,10 +1,8 @@ import { BlockNumber } from '@aztec/foundation/branded-types'; -import { Fr } from '@aztec/foundation/curves/bn254'; -import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import { DirectionalAppTaggingSecret, SiloedTag, Tag } from '@aztec/stdlib/logs'; -import { randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; +import { type ExtendedDirectionalAppTaggingSecret, SiloedTag } from '@aztec/stdlib/logs'; +import { randomExtendedDirectionalAppTaggingSecret, randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; import { TxHash } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -18,14 +16,12 @@ const MOCK_ANCHOR_BLOCK_HASH = BlockHash.random(); describe('loadLogsForRange', () => { // App contract address and secret to be used on the input of the loadLogsForRange function. - let secret: DirectionalAppTaggingSecret; - let app: AztecAddress; + let secret: ExtendedDirectionalAppTaggingSecret; let aztecNode: MockProxy; - async function computeSiloedTagForIndex(index: number) { - const tag = await Tag.compute({ secret, index }); - return SiloedTag.compute(tag, app); + function computeSiloedTagForIndex(index: number) { + return SiloedTag.compute({ extendedSecret: secret, index }); } function makeLog(txHash: TxHash, blockNumber: number, blockTimestamp: bigint, tag: SiloedTag) { @@ -33,8 +29,7 @@ describe('loadLogsForRange', () => { } beforeAll(async () => { - secret = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); - app = await AztecAddress.random(); + secret = await randomExtendedDirectionalAppTaggingSecret(); aztecNode = mock(); }); @@ -49,7 +44,7 @@ describe('loadLogsForRange', () => { }); expect( - await loadLogsForRange(secret, app, aztecNode, 0, 10, FAR_FUTURE_BLOCK_NUMBER, MOCK_ANCHOR_BLOCK_HASH), + await loadLogsForRange(secret, aztecNode, 0, 10, FAR_FUTURE_BLOCK_NUMBER, MOCK_ANCHOR_BLOCK_HASH), ).toHaveLength(0); }); @@ -78,15 +73,7 @@ describe('loadLogsForRange', () => { ); }); - const result = await loadLogsForRange( - secret, - app, - aztecNode, - 0, - 10, - FAR_FUTURE_BLOCK_NUMBER, - MOCK_ANCHOR_BLOCK_HASH, - ); + const result = await loadLogsForRange(secret, aztecNode, 0, 10, FAR_FUTURE_BLOCK_NUMBER, MOCK_ANCHOR_BLOCK_HASH); expect(result).toHaveLength(2); const resultByIndex = result.sort((a, b) => a.taggingIndex - b.taggingIndex); @@ -118,15 +105,7 @@ describe('loadLogsForRange', () => { ); }); - const result = await loadLogsForRange( - secret, - app, - aztecNode, - 0, - 10, - FAR_FUTURE_BLOCK_NUMBER, - MOCK_ANCHOR_BLOCK_HASH, - ); + const result = await loadLogsForRange(secret, aztecNode, 0, 10, FAR_FUTURE_BLOCK_NUMBER, MOCK_ANCHOR_BLOCK_HASH); expect(result).toHaveLength(2); expect(result[0].taggingIndex).toBe(index); @@ -159,15 +138,7 @@ describe('loadLogsForRange', () => { ); }); - const result = await loadLogsForRange( - secret, - app, - aztecNode, - 0, - 10, - FAR_FUTURE_BLOCK_NUMBER, - MOCK_ANCHOR_BLOCK_HASH, - ); + const result = await loadLogsForRange(secret, aztecNode, 0, 10, FAR_FUTURE_BLOCK_NUMBER, MOCK_ANCHOR_BLOCK_HASH); expect(result).toHaveLength(2); @@ -203,7 +174,6 @@ describe('loadLogsForRange', () => { const result = await loadLogsForRange( secret, - app, aztecNode, start, end, @@ -240,7 +210,6 @@ describe('loadLogsForRange', () => { const result = await loadLogsForRange( secret, - app, aztecNode, 0, 10, diff --git a/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.ts b/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.ts index d9e8ce3eb2ee..c8e3bfa575b7 100644 --- a/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.ts +++ b/yarn-project/pxe/src/tagging/recipient_sync/utils/load_logs_for_range.ts @@ -1,32 +1,27 @@ import type { BlockNumber } from '@aztec/foundation/branded-types'; -import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; -import type { DirectionalAppTaggingSecret, PreTag, TxScopedL2Log } from '@aztec/stdlib/logs'; -import { SiloedTag, Tag } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret, TxScopedL2Log } from '@aztec/stdlib/logs'; +import { SiloedTag } from '@aztec/stdlib/logs'; import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js'; /** - * Gets private logs with their corresponding block timestamps and tagging indexes for the given index range, `app` and - * `secret`. At most load logs from blocks up to and including `anchorBlockNumber`. `start` is inclusive and `end` is - * exclusive. + * Gets private logs with their corresponding block timestamps and tagging indexes for the given index range and + * `extendedSecret`. At most load logs from blocks up to and including `anchorBlockNumber`. `start` is inclusive and + * `end` is exclusive. */ export async function loadLogsForRange( - secret: DirectionalAppTaggingSecret, - app: AztecAddress, + extendedSecret: ExtendedDirectionalAppTaggingSecret, aztecNode: AztecNode, start: number, end: number, anchorBlockNumber: BlockNumber, anchorBlockHash: BlockHash, ): Promise> { - // Derive tags for the window - const preTags: PreTag[] = Array(end - start) - .fill(0) - .map((_, i) => ({ secret, index: start + i })); - const siloedTags = await Promise.all(preTags.map(preTag => Tag.compute(preTag))).then(tags => - Promise.all(tags.map(tag => SiloedTag.compute(tag, app))), + // Derive siloed tags for the window + const siloedTags = await Promise.all( + Array.from({ length: end - start }, (_, i) => SiloedTag.compute({ extendedSecret, index: start + i })), ); // We use the utility function below to retrieve all logs for the tags across all pages, so we don't need to handle @@ -37,7 +32,7 @@ export async function loadLogsForRange( const logsWithIndexes: Array<{ log: TxScopedL2Log; taggingIndex: number }> = []; for (let i = 0; i < logs.length; i++) { const logsForTag = logs[i]; - const taggingIndex = preTags[i].index; + const taggingIndex = start + i; for (const log of logsForTag) { if (log.blockNumber <= anchorBlockNumber) { logsWithIndexes.push({ log, taggingIndex }); diff --git a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts index ba4cb0466a0f..d214b6e50120 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.test.ts @@ -1,31 +1,32 @@ import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; -import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; -import { randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; +import { randomExtendedDirectionalAppTaggingSecret, randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; import { TxExecutionResult, TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; import { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; -import { DirectionalAppTaggingSecret, SiloedTag, Tag, UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../index.js'; +import { + type ExtendedDirectionalAppTaggingSecret, + SiloedTag, + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN, +} from '../index.js'; import { syncSenderTaggingIndexes } from './sync_sender_tagging_indexes.js'; const MOCK_ANCHOR_BLOCK_HASH = BlockHash.random(); describe('syncSenderTaggingIndexes', () => { - // Contract address and secret to be used on the input of the syncSenderTaggingIndexes function. - let secret: DirectionalAppTaggingSecret; - let contractAddress: AztecAddress; + // The secret to be used on the input of the syncSenderTaggingIndexes function. + let secret: ExtendedDirectionalAppTaggingSecret; let aztecNode: MockProxy; let taggingStore: SenderTaggingStore; - async function computeSiloedTagForIndex(index: number) { - const tag = await Tag.compute({ secret, index }); - return SiloedTag.compute(tag, contractAddress); + function computeSiloedTagForIndex(index: number) { + return SiloedTag.compute({ extendedSecret: secret, index }); } function makeLog(txHash: TxHash, tag: Fr) { @@ -33,8 +34,7 @@ describe('syncSenderTaggingIndexes', () => { } async function setUp() { - secret = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); - contractAddress = await AztecAddress.random(); + secret = await randomExtendedDirectionalAppTaggingSecret(); aztecNode = mock(); taggingStore = new SenderTaggingStore(await openTmpStore('test')); @@ -48,7 +48,7 @@ describe('syncSenderTaggingIndexes', () => { return Promise.resolve(tags.map((_tag: SiloedTag) => [])); }); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await syncSenderTaggingIndexes(secret, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Highest used and finalized indexes should stay undefined expect(await taggingStore.getLastUsedIndex(secret, 'test')).toBeUndefined(); @@ -91,7 +91,7 @@ describe('syncSenderTaggingIndexes', () => { ), ); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await syncSenderTaggingIndexes(secret, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify the highest finalized index is updated to 3 expect(await taggingStore.getLastFinalizedIndex(secret, 'test')).toBe(finalizedIndexStep1); @@ -123,7 +123,7 @@ describe('syncSenderTaggingIndexes', () => { ), ); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await syncSenderTaggingIndexes(secret, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify the highest finalized index was not updated expect(await taggingStore.getLastFinalizedIndex(secret, 'test')).toBe(finalizedIndexStep1); @@ -206,7 +206,7 @@ describe('syncSenderTaggingIndexes', () => { } }); - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await syncSenderTaggingIndexes(secret, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); expect(await taggingStore.getLastFinalizedIndex(secret, 'test')).toBe(newHighestFinalizedIndex); expect(await taggingStore.getLastUsedIndex(secret, 'test')).toBe(newHighestUsedIndex); @@ -269,7 +269,7 @@ describe('syncSenderTaggingIndexes', () => { }); // Sync tagged logs - await syncSenderTaggingIndexes(secret, contractAddress, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await syncSenderTaggingIndexes(secret, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that both highest finalized and highest used were set to the pending and finalized index expect(await taggingStore.getLastFinalizedIndex(secret, 'test')).toBe(pendingAndFinalizedIndex); diff --git a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts index 0270ead82a35..87d56d6a46e7 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/sync_sender_tagging_indexes.ts @@ -1,7 +1,6 @@ -import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import type { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js'; import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../constants.js'; @@ -11,11 +10,8 @@ import { loadAndStoreNewTaggingIndexes } from './utils/load_and_store_new_taggin /** * Syncs tagging indexes. This function needs to be called whenever a private log is being sent. * - * @param secret - The secret that's unique for (sender, recipient, contract) tuple while the direction of + * @param secret - The secret that's unique for (sender, recipient, app) tuple while the direction of * sender -> recipient matters. - * @param app - The address of the contract that the logs are tagged for. Needs to be provided because we perform - * second round of siloing in this function which is necessary because kernels do it as well (they silo first field - * of the private log which corresponds to the tag). * @remarks When syncing the indexes as sender we don't care about the log contents - we only care about the highest * pending and highest finalized indexes as that guides the next index choice when sending a log. The next index choice * is simply the highest pending index plus one (or finalized if pending is undefined). @@ -23,8 +19,7 @@ import { loadAndStoreNewTaggingIndexes } from './utils/load_and_store_new_taggin * updates its status accordingly. */ export async function syncSenderTaggingIndexes( - secret: DirectionalAppTaggingSecret, - app: AztecAddress, + secret: ExtendedDirectionalAppTaggingSecret, aztecNode: AztecNode, taggingStore: SenderTaggingStore, anchorBlockHash: BlockHash, @@ -59,7 +54,7 @@ export async function syncSenderTaggingIndexes( while (true) { // Load and store indexes for the current window. These indexes may already exist in the database if txs using // them were previously sent from this PXE. Any duplicates are handled by the tagging data provider. - await loadAndStoreNewTaggingIndexes(secret, app, start, end, aztecNode, taggingStore, anchorBlockHash, jobId); + await loadAndStoreNewTaggingIndexes(secret, start, end, aztecNode, taggingStore, anchorBlockHash, jobId); // Retrieve all indexes within the current window from storage and update their status accordingly. const pendingTxHashes = await taggingStore.getTxHashesOfPendingIndexes(secret, start, end, jobId); diff --git a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts index 6ee625261b16..789c67c79f8f 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.test.ts @@ -1,10 +1,9 @@ -import { Fr } from '@aztec/foundation/curves/bn254'; +import type { Fr } from '@aztec/foundation/curves/bn254'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; -import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import { DirectionalAppTaggingSecret, SiloedTag, Tag } from '@aztec/stdlib/logs'; -import { randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; +import { type ExtendedDirectionalAppTaggingSecret, SiloedTag } from '@aztec/stdlib/logs'; +import { randomExtendedDirectionalAppTaggingSecret, randomTxScopedPrivateL2Log } from '@aztec/stdlib/testing'; import { TxHash } from '@aztec/stdlib/tx'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -15,16 +14,14 @@ import { loadAndStoreNewTaggingIndexes } from './load_and_store_new_tagging_inde const MOCK_ANCHOR_BLOCK_HASH = BlockHash.random(); describe('loadAndStoreNewTaggingIndexes', () => { - // App contract address and secret to be used on the input of the loadAndStoreNewTaggingIndexes function. - let secret: DirectionalAppTaggingSecret; - let app: AztecAddress; + // Secret to be used on the input of the loadAndStoreNewTaggingIndexes function. + let secret: ExtendedDirectionalAppTaggingSecret; let aztecNode: MockProxy; let taggingStore: SenderTaggingStore; - async function computeSiloedTagForIndex(index: number) { - const tag = await Tag.compute({ secret, index }); - return SiloedTag.compute(tag, app); + function computeSiloedTagForIndex(index: number) { + return SiloedTag.compute({ extendedSecret: secret, index }); } function makeLog(txHash: TxHash, tag: Fr) { @@ -32,8 +29,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { } beforeAll(async () => { - secret = DirectionalAppTaggingSecret.fromString(Fr.random().toString()); - app = await AztecAddress.random(); + secret = await randomExtendedDirectionalAppTaggingSecret(); aztecNode = mock(); }); @@ -49,7 +45,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { return Promise.resolve(tags.map((_tag: SiloedTag) => [])); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await loadAndStoreNewTaggingIndexes(secret, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that no pending indexes were stored expect(await taggingStore.getLastUsedIndex(secret, 'test')).toBeUndefined(); @@ -69,7 +65,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { return Promise.resolve(tags.map((t: SiloedTag) => (t.equals(tag) ? [makeLog(txHash, tag.value)] : []))); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await loadAndStoreNewTaggingIndexes(secret, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that the pending index was stored for this txHash const txHashesInRange = await taggingStore.getTxHashesOfPendingIndexes(secret, index, index + 1, 'test'); @@ -100,7 +96,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await loadAndStoreNewTaggingIndexes(secret, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that only the highest index (7) was stored for this txHash and secret const txHashesAtIndex2 = await taggingStore.getTxHashesOfPendingIndexes(secret, index2, index2 + 1, 'test'); @@ -136,7 +132,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await loadAndStoreNewTaggingIndexes(secret, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that both txHashes have their respective indexes stored const txHashesAtIndex1 = await taggingStore.getTxHashesOfPendingIndexes(secret, index1, index1 + 1, 'test'); @@ -164,7 +160,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await loadAndStoreNewTaggingIndexes(secret, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that both txHashes have the same index stored const txHashesAtIndex = await taggingStore.getTxHashesOfPendingIndexes(secret, index, index + 1, 'test'); @@ -210,7 +206,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes(secret, app, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); + await loadAndStoreNewTaggingIndexes(secret, 0, 10, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify txHash1 has highest index 8 (should not be at index 1) const txHashesAtIndex1 = await taggingStore.getTxHashesOfPendingIndexes(secret, 1, 2, 'test'); @@ -258,16 +254,7 @@ describe('loadAndStoreNewTaggingIndexes', () => { ); }); - await loadAndStoreNewTaggingIndexes( - secret, - app, - start, - end, - aztecNode, - taggingStore, - MOCK_ANCHOR_BLOCK_HASH, - 'test', - ); + await loadAndStoreNewTaggingIndexes(secret, start, end, aztecNode, taggingStore, MOCK_ANCHOR_BLOCK_HASH, 'test'); // Verify that the log at start (inclusive) was processed const txHashesAtStart = await taggingStore.getTxHashesOfPendingIndexes(secret, start, start + 1, 'test'); diff --git a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts index 4fa1939d4fe8..5558c1097cba 100644 --- a/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +++ b/yarn-project/pxe/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts @@ -1,8 +1,7 @@ -import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { BlockHash } from '@aztec/stdlib/block'; import type { AztecNode } from '@aztec/stdlib/interfaces/server'; -import type { DirectionalAppTaggingSecret, PreTag } from '@aztec/stdlib/logs'; -import { SiloedTag, Tag } from '@aztec/stdlib/logs'; +import type { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; +import { SiloedTag } from '@aztec/stdlib/logs'; import { TxHash } from '@aztec/stdlib/tx'; import type { SenderTaggingStore } from '../../../storage/tagging_store/sender_tagging_store.js'; @@ -12,9 +11,7 @@ import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js'; * Loads tagging indexes from the Aztec node and stores them in the tagging data provider. * @remarks This function is one of two places by which a pending index can get to the tagging data provider. The other * place is when a tx is being sent from this PXE. - * @param secret - The directional app tagging secret that's unique for (sender, recipient, contract) tuple. - * @param app - The address of the contract that the logs are tagged for. Used for siloing tags to match - * kernel circuit behavior. + * @param extendedSecret - The extended directional app tagging secret that's unique for (sender, recipient, app) tuple. * @param start - The starting index (inclusive) of the window to process. * @param end - The ending index (exclusive) of the window to process. * @param aztecNode - The Aztec node instance to query for logs. @@ -23,8 +20,7 @@ import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js'; * preserving way. */ export async function loadAndStoreNewTaggingIndexes( - secret: DirectionalAppTaggingSecret, - app: AztecAddress, + extendedSecret: ExtendedDirectionalAppTaggingSecret, start: number, end: number, aztecNode: AztecNode, @@ -33,20 +29,17 @@ export async function loadAndStoreNewTaggingIndexes( jobId: string, ) { // We compute the tags for the current window of indexes - const preTagsForWindow: PreTag[] = Array(end - start) - .fill(0) - .map((_, i) => ({ secret, index: start + i })); const siloedTagsForWindow = await Promise.all( - preTagsForWindow.map(async preTag => SiloedTag.compute(await Tag.compute(preTag), app)), + Array.from({ length: end - start }, (_, i) => SiloedTag.compute({ extendedSecret, index: start + i })), ); const txsForTags = await getTxsContainingTags(siloedTagsForWindow, aztecNode, anchorBlockHash); - const highestIndexMap = getTxHighestIndexMap(txsForTags, preTagsForWindow); + const highestIndexMap = getTxHighestIndexMap(txsForTags, start, siloedTagsForWindow.length); // Now we iterate over the map, reconstruct the preTags and tx hash and store them in the db. for (const [txHashStr, highestIndex] of highestIndexMap.entries()) { const txHash = TxHash.fromString(txHashStr); - await taggingStore.storePendingIndexes([{ secret, index: highestIndex }], txHash, jobId); + await taggingStore.storePendingIndexes([{ extendedSecret, index: highestIndex }], txHash, jobId); } } @@ -64,16 +57,14 @@ async function getTxsContainingTags( } // Returns a map of txHash to the highest index for that txHash. -function getTxHighestIndexMap(txHashesForTags: TxHash[][], preTagsForWindow: PreTag[]): Map { - if (txHashesForTags.length !== preTagsForWindow.length) { - throw new Error( - `Number of tx hashes arrays does not match number of pre-tags. ${txHashesForTags.length} !== ${preTagsForWindow.length}`, - ); +function getTxHighestIndexMap(txHashesForTags: TxHash[][], start: number, count: number): Map { + if (txHashesForTags.length !== count) { + throw new Error(`Number of tx hashes arrays does not match number of tags. ${txHashesForTags.length} !== ${count}`); } const highestIndexMap = new Map(); for (let i = 0; i < txHashesForTags.length; i++) { - const taggingIndex = preTagsForWindow[i].index; + const taggingIndex = start + i; const txHashesForTag = txHashesForTags[i]; for (const txHash of txHashesForTag) { const key = txHash.toString(); diff --git a/yarn-project/scripts/run_test.sh b/yarn-project/scripts/run_test.sh index 437395d26c10..e71c3a2d1bfc 100755 --- a/yarn-project/scripts/run_test.sh +++ b/yarn-project/scripts/run_test.sh @@ -14,6 +14,7 @@ cd ../$dir export RAYON_NUM_THREADS=1 export TOKIO_WORKER_THREADS=1 +export UV_THREADPOOL_SIZE=${UV_THREADPOOL_SIZE:-8} export HARDWARE_CONCURRENCY=${CPUS:-16} export LOG_LEVEL=${LOG_LEVEL:-info} exec node --no-warnings --experimental-vm-modules --loader @swc-node/register \ diff --git a/yarn-project/sequencer-client/src/config.ts b/yarn-project/sequencer-client/src/config.ts index 469651fba387..61dcb2344c17 100644 --- a/yarn-project/sequencer-client/src/config.ts +++ b/yarn-project/sequencer-client/src/config.ts @@ -13,6 +13,7 @@ import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p/config'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { type ChainConfig, + DEFAULT_MAX_TXS_PER_BLOCK, type SequencerConfig, chainConfigMappings, sharedSequencerConfigMappings, @@ -37,7 +38,7 @@ export type { SequencerConfig }; */ export const DefaultSequencerConfig: ResolvedSequencerConfig = { sequencerPollingIntervalMS: 500, - maxTxsPerBlock: 32, + maxTxsPerBlock: DEFAULT_MAX_TXS_PER_BLOCK, minTxsPerBlock: 1, buildCheckpointIfEmpty: false, publishTxsWithProposals: false, @@ -77,11 +78,6 @@ export const sequencerConfigMappings: ConfigMappingsType = { description: 'The number of ms to wait between polling for checking to build on the next slot.', ...numberConfigHelper(DefaultSequencerConfig.sequencerPollingIntervalMS), }, - maxTxsPerBlock: { - env: 'SEQ_MAX_TX_PER_BLOCK', - description: 'The maximum number of txs to include in a block.', - ...numberConfigHelper(DefaultSequencerConfig.maxTxsPerBlock), - }, minTxsPerBlock: { env: 'SEQ_MIN_TX_PER_BLOCK', description: 'The minimum number of txs to include in a block.', diff --git a/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.test.ts b/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.test.ts index 8ef5a19129ba..4361634eb771 100644 --- a/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.test.ts @@ -256,6 +256,7 @@ describe('CheckpointProposalJob', () => { validatorClient.signAttestationsAndSigners.mockImplementation(() => Promise.resolve(getSignatures()[0].signature)); validatorClient.getCoinbaseForAttestor.mockReturnValue(coinbase); validatorClient.getFeeRecipientForAttestor.mockReturnValue(feeRecipient); + validatorClient.getValidatorAddresses.mockReturnValue([attestorAddress]); slasherClient = mock(); slasherClient.getProposerActions.mockResolvedValue([]); diff --git a/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.timing.test.ts b/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.timing.test.ts index 2e9ebb18219e..ad88b7d040c1 100644 --- a/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.timing.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.timing.test.ts @@ -436,6 +436,7 @@ describe('CheckpointProposalJob Timing Tests', () => { validatorClient.signAttestationsAndSigners.mockResolvedValue(mockedSig); validatorClient.getCoinbaseForAttestor.mockReturnValue(coinbase); validatorClient.getFeeRecipientForAttestor.mockReturnValue(globalVariables.feeRecipient); + validatorClient.getValidatorAddresses.mockReturnValue([attestorAddress]); slasherClient = mock(); slasherClient.getProposerActions.mockResolvedValue([]); diff --git a/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.ts b/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.ts index 44abe045ba91..184e83a76506 100644 --- a/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.ts +++ b/yarn-project/sequencer-client/src/sequencer/checkpoint_proposal_job.ts @@ -38,7 +38,7 @@ import { } from '@aztec/stdlib/interfaces/server'; import { type L1ToL2MessageSource, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging'; import type { BlockProposalOptions, CheckpointProposal, CheckpointProposalOptions } from '@aztec/stdlib/p2p'; -import { orderAttestations } from '@aztec/stdlib/p2p'; +import { orderAttestations, trimAttestations } from '@aztec/stdlib/p2p'; import type { L2BlockBuiltStats } from '@aztec/stdlib/stats'; import { type FailedTx, Tx } from '@aztec/stdlib/tx'; import { AttestationTimeoutError } from '@aztec/stdlib/validators'; @@ -743,8 +743,20 @@ export class CheckpointProposalJob implements Traceable { collectedAttestationsCount = attestations.length; + // Trim attestations to minimum required to save L1 calldata gas + const localAddresses = this.validatorClient.getValidatorAddresses(); + const trimmed = trimAttestations( + attestations, + numberOfRequiredAttestations, + this.attestorAddress, + localAddresses, + ); + if (trimmed.length < attestations.length) { + this.log.debug(`Trimmed attestations from ${attestations.length} to ${trimmed.length} for L1 submission`); + } + // Rollup contract requires that the signatures are provided in the order of the committee - const sorted = orderAttestations(attestations, committee); + const sorted = orderAttestations(trimmed, committee); // Manipulate the attestations if we've been configured to do so if (this.config.injectFakeAttestation || this.config.shuffleAttestationOrdering) { diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.ts index 071613e1c491..527f7144bf60 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.ts @@ -422,6 +422,13 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter { let timetable: SequencerTimetable; + const logger = createLogger('sequencer-timetable-test'); const ETHEREUM_SLOT_DURATION = 12; const AZTEC_SLOT_DURATION = 36; @@ -287,16 +289,18 @@ describe('sequencer-timetable', () => { describe('maxNumberOfBlocks calculation', () => { it.each([ - { aztecSlot: 36, blockDuration: 8000 }, - { aztecSlot: 72, blockDuration: 8000 }, - { aztecSlot: 120, blockDuration: 10000 }, + { aztecSlot: 36, blockDuration: 8000, publishTime: L1_PUBLISHING_TIME }, + { aztecSlot: 72, blockDuration: 8000, publishTime: L1_PUBLISHING_TIME }, + { aztecSlot: 120, blockDuration: 10000, publishTime: L1_PUBLISHING_TIME }, + { aztecSlot: 72, blockDuration: 6000, publishTime: 36 }, + { aztecSlot: 72, blockDuration: 6000, publishTime: 24 }, ])( - 'should calculate max blocks with aztecSlot=$aztecSlot blockDuration=$blockDuration)', - ({ aztecSlot, blockDuration }) => { + 'should calculate max blocks with aztecSlot=$aztecSlot blockDuration=$blockDuration publishTime=$publishTime)', + ({ aztecSlot, blockDuration, publishTime }) => { const tt = new SequencerTimetable({ ethereumSlotDuration: ETHEREUM_SLOT_DURATION, aztecSlotDuration: aztecSlot, - l1PublishingTime: L1_PUBLISHING_TIME, + l1PublishingTime: publishTime, blockDurationMs: blockDuration, enforce: ENFORCE_TIMETABLE, }); @@ -311,6 +315,9 @@ describe('sequencer-timetable', () => { const result2 = tt.canStartNextBlock(20); expect(result2.canStart).toBe(true); } + logger.info( + `AztecSlot: ${aztecSlot}, BlockDuration: ${blockDuration}, PublishTime: ${publishTime}, MaxBlocks: ${tt.maxNumberOfBlocks}\n\n`, + ); }, ); diff --git a/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts b/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts index ae636ab8fb9e..895f6cc76ec0 100644 --- a/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts +++ b/yarn-project/simulator/src/public/fixtures/public_tx_simulation_tester.ts @@ -1,4 +1,9 @@ -import { DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT } from '@aztec/constants'; +import { + DEFAULT_TEARDOWN_DA_GAS_LIMIT, + DEFAULT_TEARDOWN_L2_GAS_LIMIT, + PUBLIC_TX_L2_GAS_OVERHEAD, + TX_DA_GAS_OVERHEAD, +} from '@aztec/constants'; import { asyncMap } from '@aztec/foundation/async-map'; import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; @@ -131,8 +136,11 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester { teardownCallRequest, feePayer, /*gasUsedByPrivate*/ teardownCall - ? new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT) - : Gas.empty(), + ? new Gas( + DEFAULT_TEARDOWN_DA_GAS_LIMIT + TX_DA_GAS_OVERHEAD, + DEFAULT_TEARDOWN_L2_GAS_LIMIT + PUBLIC_TX_L2_GAS_OVERHEAD, + ) + : new Gas(TX_DA_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD), defaultGlobals(), ); } diff --git a/yarn-project/simulator/src/public/public_processor/public_processor.ts b/yarn-project/simulator/src/public/public_processor/public_processor.ts index 92698d928a20..e3a776edac02 100644 --- a/yarn-project/simulator/src/public/public_processor/public_processor.ts +++ b/yarn-project/simulator/src/public/public_processor/public_processor.ts @@ -25,6 +25,7 @@ import type { PublicProcessorValidator, SequencerConfig, } from '@aztec/stdlib/interfaces/server'; +import { type DebugLog, type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs'; import { ProvingRequestType } from '@aztec/stdlib/proofs'; import { MerkleTreeId } from '@aztec/stdlib/trees'; import { @@ -130,7 +131,6 @@ class PublicProcessorTimeoutError extends Error { */ export class PublicProcessor implements Traceable { private metrics: PublicProcessorMetrics; - constructor( protected globalVariables: GlobalVariables, private guardedMerkleTree: GuardedMerkleTreeOperations, @@ -140,6 +140,7 @@ export class PublicProcessor implements Traceable { telemetryClient: TelemetryClient = getTelemetryClient(), private log: Logger, private opts: Pick = {}, + private debugLogStore: DebugLogStore = new NullDebugLogStore(), ) { this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor'); } @@ -159,12 +160,13 @@ export class PublicProcessor implements Traceable { txs: Iterable | AsyncIterable, limits: PublicProcessorLimits = {}, validator: PublicProcessorValidator = {}, - ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], number]> { + ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], number, DebugLog[]]> { const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits; const { preprocessValidator, nullifierCache } = validator; const result: ProcessedTx[] = []; const usedTxs: Tx[] = []; const failed: FailedTx[] = []; + const debugLogs: DebugLog[] = []; const timer = new Timer(); let totalSizeInBytes = 0; @@ -241,7 +243,7 @@ export class PublicProcessor implements Traceable { this.contractsDB.createCheckpoint(); try { - const [processedTx, returnValues] = await this.processTx(tx, deadline); + const [processedTx, returnValues, txDebugLogs] = await this.processTx(tx, deadline); // Inject a fake processing failure after N txs if requested const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount; @@ -290,6 +292,9 @@ export class PublicProcessor implements Traceable { result.push(processedTx); usedTxs.push(tx); returns = returns.concat(returnValues); + debugLogs.push(...txDebugLogs); + + this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs); totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas); totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas); @@ -363,7 +368,7 @@ export class PublicProcessor implements Traceable { totalSizeInBytes, }); - return [result, failed, usedTxs, returns, totalBlobFields]; + return [result, failed, usedTxs, returns, totalBlobFields, debugLogs]; } private async checkWorldStateUnchanged( @@ -383,8 +388,13 @@ export class PublicProcessor implements Traceable { } @trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() })) - private async processTx(tx: Tx, deadline: Date | undefined): Promise<[ProcessedTx, NestedProcessReturnValues[]]> { - const [time, [processedTx, returnValues]] = await elapsed(() => this.processTxWithinDeadline(tx, deadline)); + private async processTx( + tx: Tx, + deadline: Date | undefined, + ): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> { + const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() => + this.processTxWithinDeadline(tx, deadline), + ); this.log.verbose( !tx.hasPublicCalls() @@ -407,7 +417,7 @@ export class PublicProcessor implements Traceable { }, ); - return [processedTx, returnValues ?? []]; + return [processedTx, returnValues ?? [], debugLogs]; } private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise { @@ -441,10 +451,9 @@ export class PublicProcessor implements Traceable { private async processTxWithinDeadline( tx: Tx, deadline: Date | undefined, - ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> { - const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> = tx.hasPublicCalls() - ? () => this.processTxWithPublicCalls(tx) - : () => this.processPrivateOnlyTx(tx); + ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> { + const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> = + tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx); // Fake a delay per tx if instructed (used for tests) const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs; @@ -512,7 +521,7 @@ export class PublicProcessor implements Traceable { @trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({ [Attributes.TX_HASH]: tx.getTxHash().toString(), })) - private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> { + private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> { const gasFees = this.globalVariables.gasFees; const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed); @@ -537,13 +546,13 @@ export class PublicProcessor implements Traceable { await this.contractsDB.addNewContracts(tx); - return [processedTx, undefined]; + return [processedTx, undefined, []]; } @trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString(), })) - private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> { + private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> { const timer = new Timer(); const result = await this.publicTxSimulator.simulate(tx); @@ -581,7 +590,7 @@ export class PublicProcessor implements Traceable { revertReason, ); - return [processedTx, appLogicReturnValues]; + return [processedTx, appLogicReturnValues, result.logs ?? []]; } /** diff --git a/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator.ts b/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator.ts index 41b7ca70dd14..2bb70df15f0e 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator.ts @@ -1,4 +1,4 @@ -import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log'; +import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log'; import { sleep } from '@aztec/foundation/sleep'; import { type CancellationToken, avmSimulate, cancelSimulation, createCancellationToken } from '@aztec/native'; import { ProtocolContractsList } from '@aztec/protocol-contracts'; @@ -100,8 +100,7 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS inputBuffer, contractProvider, wsCppHandle, - logLevel, - // TODO: re-enable logging + this.log.level, undefined, this.cancellationToken, ); diff --git a/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts b/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts index f08f753edd47..7b979ffde784 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts @@ -1,4 +1,4 @@ -import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log'; +import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log'; import { avmSimulateWithHintedDbs } from '@aztec/native'; import { AvmCircuitInputs, @@ -75,7 +75,7 @@ export class CppPublicTxSimulatorHintedDbs extends PublicTxSimulator implements let resultBuffer: Buffer; try { - resultBuffer = await avmSimulateWithHintedDbs(inputBuffer, logLevel); + resultBuffer = await avmSimulateWithHintedDbs(inputBuffer, this.log.level); } catch (error: any) { throw new SimulationError(`C++ hinted simulation failed: ${error.message}`, []); } diff --git a/yarn-project/simulator/src/public/public_tx_simulator/factories.ts b/yarn-project/simulator/src/public/public_tx_simulator/factories.ts index 646317a3d94a..8d1c29746334 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator/factories.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator/factories.ts @@ -19,10 +19,11 @@ export function createPublicTxSimulatorForBlockBuilding( globalVariables: GlobalVariables, telemetryClient: TelemetryClient, bindings?: LoggerBindings, + collectDebugLogs = false, ) { const config = PublicSimulatorConfig.from({ skipFeeEnforcement: false, - collectDebugLogs: false, + collectDebugLogs, collectHints: false, collectPublicInputs: false, collectStatistics: false, diff --git a/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.test.ts b/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.test.ts index 38771de3382a..a0a86e68d5c0 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.test.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.test.ts @@ -1,9 +1,9 @@ import { - AVM_MAX_PROCESSABLE_L2_GAS, GAS_ESTIMATION_DA_GAS_LIMIT, GAS_ESTIMATION_L2_GAS_LIMIT, GAS_ESTIMATION_TEARDOWN_DA_GAS_LIMIT, GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT, + MAX_PROCESSABLE_L2_GAS, NULLIFIER_SUBTREE_HEIGHT, } from '@aztec/constants'; import { Fr } from '@aztec/foundation/curves/bn254'; @@ -498,14 +498,14 @@ describe('public_tx_simulator', () => { it('fails a tx that consumes more than the AVM maximum processable gas', async () => { gasLimits = new Gas(GAS_ESTIMATION_DA_GAS_LIMIT, GAS_ESTIMATION_L2_GAS_LIMIT); teardownGasLimits = new Gas(GAS_ESTIMATION_TEARDOWN_DA_GAS_LIMIT, GAS_ESTIMATION_TEARDOWN_L2_GAS_LIMIT); - enqueuedCallGasUsed = new Gas(GAS_ESTIMATION_L2_GAS_LIMIT, AVM_MAX_PROCESSABLE_L2_GAS); + enqueuedCallGasUsed = new Gas(GAS_ESTIMATION_L2_GAS_LIMIT, MAX_PROCESSABLE_L2_GAS); const tx = await mockTxWithPublicCalls({ numberOfAppLogicCalls: 1, }); await expect(simulator.simulate(tx)).rejects.toThrow( - `exceeds the AVM maximum processable gas of ${AVM_MAX_PROCESSABLE_L2_GAS}`, + `exceeds the maximum processable gas of ${MAX_PROCESSABLE_L2_GAS}`, ); expect(simulateInternal).toHaveBeenCalledTimes(1); diff --git a/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.ts b/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.ts index 6e3af53f7c2f..c07f0d04945c 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator/public_tx_simulator.ts @@ -1,4 +1,4 @@ -import { AVM_MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; +import { MAX_PROCESSABLE_L2_GAS } from '@aztec/constants'; import { Fr } from '@aztec/foundation/curves/bn254'; import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log'; import { ProtocolContractAddress, ProtocolContractsList } from '@aztec/protocol-contracts'; @@ -199,8 +199,8 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface { // Such transactions should be filtered by GasTxValidator. assert( - context.getActualGasUsed().l2Gas <= AVM_MAX_PROCESSABLE_L2_GAS, - `Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the AVM maximum processable gas of ${AVM_MAX_PROCESSABLE_L2_GAS}`, + context.getActualGasUsed().l2Gas <= MAX_PROCESSABLE_L2_GAS, + `Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the maximum processable gas of ${MAX_PROCESSABLE_L2_GAS}`, ); await this.payFee(context); diff --git a/yarn-project/slasher/src/config.ts b/yarn-project/slasher/src/config.ts index 79cef1e58b1a..646225cc6e20 100644 --- a/yarn-project/slasher/src/config.ts +++ b/yarn-project/slasher/src/config.ts @@ -155,7 +155,8 @@ export const slasherConfigMappings: ConfigMappingsType = { ...numberConfigHelper(DefaultSlasherConfig.slashMaxPayloadSize), }, slashGracePeriodL2Slots: { - description: 'Number of L2 slots to wait before considering a slashing offense expired.', + description: + 'Number of L2 slots after the network upgrade during which slashing offenses are ignored. The upgrade time is determined from the CanonicalRollupUpdated event.', env: 'SLASH_GRACE_PERIOD_L2_SLOTS', ...numberConfigHelper(DefaultSlasherConfig.slashGracePeriodL2Slots), }, diff --git a/yarn-project/slasher/src/empire_slasher_client.test.ts b/yarn-project/slasher/src/empire_slasher_client.test.ts index 4aa40aee11f9..1bff7848fdc5 100644 --- a/yarn-project/slasher/src/empire_slasher_client.test.ts +++ b/yarn-project/slasher/src/empire_slasher_client.test.ts @@ -50,6 +50,7 @@ describe('EmpireSlasherClient', () => { slotDuration: 4, ethereumSlotDuration: 12, slashingAmounts: undefined, + rollupRegisteredAtL2Slot: SlotNumber(0), }; const config: SlasherConfig = { diff --git a/yarn-project/slasher/src/factory/create_facade.ts b/yarn-project/slasher/src/factory/create_facade.ts index af6f7ed9cd6c..6787fc65ce75 100644 --- a/yarn-project/slasher/src/factory/create_facade.ts +++ b/yarn-project/slasher/src/factory/create_facade.ts @@ -1,13 +1,15 @@ import { EpochCache } from '@aztec/epoch-cache'; -import { RollupContract } from '@aztec/ethereum/contracts'; +import { RegistryContract, RollupContract } from '@aztec/ethereum/contracts'; import type { L1ReaderConfig } from '@aztec/ethereum/l1-reader'; import type { ViemClient } from '@aztec/ethereum/types'; +import { SlotNumber } from '@aztec/foundation/branded-types'; import { unique } from '@aztec/foundation/collection'; import { EthAddress } from '@aztec/foundation/eth-address'; import { createLogger } from '@aztec/foundation/log'; import { DateProvider } from '@aztec/foundation/timer'; import type { DataStoreConfig } from '@aztec/kv-store/config'; import { createStore } from '@aztec/kv-store/lmdb-v2'; +import { getSlotAtTimestamp } from '@aztec/stdlib/epoch-helpers'; import type { SlasherConfig } from '@aztec/stdlib/interfaces/server'; import { SlasherClientFacade } from '../slasher_client_facade.js'; @@ -18,7 +20,7 @@ import type { Watcher } from '../watcher.js'; /** Creates a slasher client facade that updates itself whenever the rollup slasher changes */ export async function createSlasherFacade( config: SlasherConfig & DataStoreConfig & { ethereumSlotDuration: number }, - l1Contracts: Pick, + l1Contracts: Pick, l1Client: ViemClient, watchers: Watcher[], dateProvider: DateProvider, @@ -34,6 +36,32 @@ export async function createSlasherFacade( const kvStore = await createStore('slasher', SCHEMA_VERSION, config, logger.getBindings()); const rollup = new RollupContract(l1Client, l1Contracts.rollupAddress); + // Compute and cache the L2 slot at which the rollup was registered as canonical + const settingsMap = kvStore.openMap('slasher-settings'); + const cacheKey = `registeredSlot:${l1Contracts.rollupAddress}`; + let rollupRegisteredAtL2Slot = (await settingsMap.getAsync(cacheKey)) as SlotNumber | undefined; + + if (rollupRegisteredAtL2Slot === undefined) { + const registry = new RegistryContract(l1Client, l1Contracts.registryAddress); + const l1StartBlock = await rollup.getL1StartBlock(); + const registrationTimestamp = await registry.getCanonicalRollupRegistrationTimestamp( + l1Contracts.rollupAddress, + l1StartBlock, + ); + if (registrationTimestamp !== undefined) { + const l1GenesisTime = await rollup.getL1GenesisTime(); + const slotDuration = await rollup.getSlotDuration(); + rollupRegisteredAtL2Slot = getSlotAtTimestamp(registrationTimestamp, { + l1GenesisTime, + slotDuration: Number(slotDuration), + }); + } else { + rollupRegisteredAtL2Slot = SlotNumber(0); + } + await settingsMap.set(cacheKey, rollupRegisteredAtL2Slot); + logger.info(`Canonical rollup registered at L2 slot ${rollupRegisteredAtL2Slot}`); + } + const slashValidatorsNever = config.slashSelfAllowed ? config.slashValidatorsNever : unique([...config.slashValidatorsNever, ...validatorAddresses].map(a => a.toString())).map(EthAddress.fromString); @@ -48,6 +76,7 @@ export async function createSlasherFacade( epochCache, dateProvider, kvStore, + rollupRegisteredAtL2Slot, logger, ); } diff --git a/yarn-project/slasher/src/factory/create_implementation.ts b/yarn-project/slasher/src/factory/create_implementation.ts index d793f3285709..0c6eb8ce6d76 100644 --- a/yarn-project/slasher/src/factory/create_implementation.ts +++ b/yarn-project/slasher/src/factory/create_implementation.ts @@ -5,6 +5,7 @@ import { TallySlashingProposerContract, } from '@aztec/ethereum/contracts'; import type { ViemClient } from '@aztec/ethereum/types'; +import type { SlotNumber } from '@aztec/foundation/branded-types'; import { EthAddress } from '@aztec/foundation/eth-address'; import { createLogger } from '@aztec/foundation/log'; import { DateProvider } from '@aztec/foundation/timer'; @@ -31,19 +32,40 @@ export async function createSlasherImplementation( epochCache: EpochCache, dateProvider: DateProvider, kvStore: AztecLMDBStoreV2, + rollupRegisteredAtL2Slot: SlotNumber, logger = createLogger('slasher'), ) { const proposer = await rollup.getSlashingProposer(); if (!proposer) { return new NullSlasherClient(config); } else if (proposer.type === 'tally') { - return createTallySlasher(config, rollup, proposer, watchers, dateProvider, epochCache, kvStore, logger); + return createTallySlasher( + config, + rollup, + proposer, + watchers, + dateProvider, + epochCache, + kvStore, + rollupRegisteredAtL2Slot, + logger, + ); } else { if (!slashFactoryAddress || slashFactoryAddress.equals(EthAddress.ZERO)) { throw new Error('Cannot initialize an empire-based SlasherClient without a SlashFactory address'); } const slashFactory = new SlashFactoryContract(l1Client, slashFactoryAddress.toString()); - return createEmpireSlasher(config, rollup, proposer, slashFactory, watchers, dateProvider, kvStore, logger); + return createEmpireSlasher( + config, + rollup, + proposer, + slashFactory, + watchers, + dateProvider, + kvStore, + rollupRegisteredAtL2Slot, + logger, + ); } } @@ -55,6 +77,7 @@ async function createEmpireSlasher( watchers: Watcher[], dateProvider: DateProvider, kvStore: AztecLMDBStoreV2, + rollupRegisteredAtL2Slot: SlotNumber, logger = createLogger('slasher'), ): Promise { if (slashingProposer.type !== 'empire') { @@ -97,6 +120,7 @@ async function createEmpireSlasher( l1StartBlock, ethereumSlotDuration: config.ethereumSlotDuration, slashingAmounts: undefined, + rollupRegisteredAtL2Slot, }; const payloadsStore = new SlasherPayloadsStore(kvStore, { @@ -130,13 +154,14 @@ async function createTallySlasher( dateProvider: DateProvider, epochCache: EpochCache, kvStore: AztecLMDBStoreV2, + rollupRegisteredAtL2Slot: SlotNumber, logger = createLogger('slasher'), ): Promise { if (slashingProposer.type !== 'tally') { throw new Error('Slashing proposer contract is not of type tally'); } - const settings = await getTallySlasherSettings(rollup, slashingProposer); + const settings = { ...(await getTallySlasherSettings(rollup, slashingProposer)), rollupRegisteredAtL2Slot }; const slasher = await rollup.getSlasherContract(); const offensesStore = new SlasherOffensesStore(kvStore, { diff --git a/yarn-project/slasher/src/factory/get_settings.ts b/yarn-project/slasher/src/factory/get_settings.ts index 078073847e13..6fd10662edcd 100644 --- a/yarn-project/slasher/src/factory/get_settings.ts +++ b/yarn-project/slasher/src/factory/get_settings.ts @@ -5,7 +5,7 @@ import type { TallySlasherSettings } from '../tally_slasher_client.js'; export async function getTallySlasherSettings( rollup: RollupContract, slashingProposer?: TallySlashingProposerContract, -): Promise { +): Promise> { if (!slashingProposer) { const rollupSlashingProposer = await rollup.getSlashingProposer(); if (!rollupSlashingProposer || rollupSlashingProposer.type !== 'tally') { @@ -40,7 +40,7 @@ export async function getTallySlasherSettings( rollup.getTargetCommitteeSize(), ]); - const settings: TallySlasherSettings = { + const settings: Omit = { slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds), slashingRoundSize: Number(slashingRoundSize), slashingRoundSizeInEpochs: Number(slashingRoundSizeInEpochs), diff --git a/yarn-project/slasher/src/slash_offenses_collector.test.ts b/yarn-project/slasher/src/slash_offenses_collector.test.ts index f23d1824fb18..3eeeb532494e 100644 --- a/yarn-project/slasher/src/slash_offenses_collector.test.ts +++ b/yarn-project/slasher/src/slash_offenses_collector.test.ts @@ -1,3 +1,4 @@ +import { SlotNumber } from '@aztec/foundation/branded-types'; import { EthAddress } from '@aztec/foundation/eth-address'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { openTmpStore } from '@aztec/kv-store/lmdb'; @@ -18,6 +19,7 @@ describe('SlashOffensesCollector', () => { const settings: SlashOffensesCollectorSettings = { epochDuration: 32, slashingAmounts: [100n, 200n, 300n], + rollupRegisteredAtL2Slot: 100 as SlotNumber, }; const config: SlasherConfig = { @@ -90,27 +92,28 @@ describe('SlashOffensesCollector', () => { }); }); - it('should skip offenses that happen during grace period', async () => { + it('should skip offenses that happen during grace period after upgrade', async () => { const validator1 = EthAddress.random(); const validator2 = EthAddress.random(); - // Create offense during grace period (slot < slashGracePeriodL2Slots = 10) + // Grace period is registeredSlot (100) + gracePeriodL2Slots (10) = 110 + // Create offense during grace period (slot 105 < 110) const gracePeriodOffense: WantToSlashArgs[] = [ { validator: validator1, amount: 1000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, // Slot-based offense - epochOrSlot: 5n, // Within grace period (< 10) + epochOrSlot: 105n, // Within grace period (< 110) }, ]; - // Create offense after grace period + // Create offense after grace period (slot 115 >= 110) const validOffense: WantToSlashArgs[] = [ { validator: validator2, amount: 2000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, // Slot-based offense - epochOrSlot: 20n, // After grace period (>= 10) + epochOrSlot: 115n, // After grace period (>= 110) }, ]; @@ -134,25 +137,26 @@ describe('SlashOffensesCollector', () => { const validator2 = EthAddress.random(); const validator3 = EthAddress.random(); - // Create an event with multiple offenses in a single array + // Grace period ends at registeredSlot (100) + gracePeriod (10) = 110 + // All offenses are after the grace period const multipleOffensesArgs: WantToSlashArgs[] = [ { validator: validator1, amount: 1000000000000000000n, offenseType: OffenseType.INACTIVITY, - epochOrSlot: 100n, + epochOrSlot: 100n, // epoch 100 → slot 3200, well past grace period }, { validator: validator2, amount: 2000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, - epochOrSlot: 50n, + epochOrSlot: 150n, // slot 150 >= 110 }, { validator: validator3, amount: 1500000000000000000n, offenseType: OffenseType.ATTESTED_DESCENDANT_OF_INVALID, - epochOrSlot: 75n, + epochOrSlot: 175n, // slot 175 >= 110 }, ]; @@ -182,14 +186,14 @@ describe('SlashOffensesCollector', () => { validator: validator2, amount: 2000000000000000000n, offenseType: OffenseType.PROPOSED_INSUFFICIENT_ATTESTATIONS, - epochOrSlot: 50n, + epochOrSlot: 150n, }); expect(offensesByValidator[validator3.toString()]).toMatchObject({ validator: validator3, amount: 1500000000000000000n, offenseType: OffenseType.ATTESTED_DESCENDANT_OF_INVALID, - epochOrSlot: 75n, + epochOrSlot: 175n, }); }); }); diff --git a/yarn-project/slasher/src/slash_offenses_collector.ts b/yarn-project/slasher/src/slash_offenses_collector.ts index 551f868ccec3..59cc7a0e1dc6 100644 --- a/yarn-project/slasher/src/slash_offenses_collector.ts +++ b/yarn-project/slasher/src/slash_offenses_collector.ts @@ -1,3 +1,4 @@ +import type { SlotNumber } from '@aztec/foundation/branded-types'; import { createLogger } from '@aztec/foundation/log'; import type { Prettify } from '@aztec/foundation/types'; import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers'; @@ -9,7 +10,11 @@ import { WANT_TO_SLASH_EVENT, type WantToSlashArgs, type Watcher } from './watch export type SlashOffensesCollectorConfig = Prettify>; export type SlashOffensesCollectorSettings = Prettify< - Pick & { slashingAmounts: [bigint, bigint, bigint] | undefined } + Pick & { + slashingAmounts: [bigint, bigint, bigint] | undefined; + /** L2 slot at which the rollup was registered as canonical in the Registry. Used to anchor the slash grace period. */ + rollupRegisteredAtL2Slot: SlotNumber; + } >; /** @@ -110,9 +115,9 @@ export class SlashOffensesCollector { return this.offensesStore.markAsSlashed(offenses); } - /** Returns whether to skip an offense if it happened during the grace period at the beginning of the chain */ + /** Returns whether to skip an offense if it happened during the grace period after the network upgrade */ private shouldSkipOffense(offense: Offense): boolean { const offenseSlot = getSlotForOffense(offense, this.settings); - return offenseSlot < this.config.slashGracePeriodL2Slots; + return offenseSlot < this.settings.rollupRegisteredAtL2Slot + this.config.slashGracePeriodL2Slots; } } diff --git a/yarn-project/slasher/src/slasher_client_facade.ts b/yarn-project/slasher/src/slasher_client_facade.ts index 943084816870..0ef4a677ac0a 100644 --- a/yarn-project/slasher/src/slasher_client_facade.ts +++ b/yarn-project/slasher/src/slasher_client_facade.ts @@ -32,6 +32,7 @@ export class SlasherClientFacade implements SlasherClientInterface { private epochCache: EpochCache, private dateProvider: DateProvider, private kvStore: AztecLMDBStoreV2, + private rollupRegisteredAtL2Slot: SlotNumber, private logger = createLogger('slasher'), ) {} @@ -88,6 +89,7 @@ export class SlasherClientFacade implements SlasherClientInterface { this.epochCache, this.dateProvider, this.kvStore, + this.rollupRegisteredAtL2Slot, this.logger, ); } diff --git a/yarn-project/slasher/src/tally_slasher_client.test.ts b/yarn-project/slasher/src/tally_slasher_client.test.ts index 9ca14eaa7a44..62f5b492fa99 100644 --- a/yarn-project/slasher/src/tally_slasher_client.test.ts +++ b/yarn-project/slasher/src/tally_slasher_client.test.ts @@ -50,6 +50,7 @@ describe('TallySlasherClient', () => { l1GenesisTime: BigInt(Math.floor(Date.now() / 1000) - 10000), slotDuration: 4, slashingQuorumSize: 110, + rollupRegisteredAtL2Slot: SlotNumber(0), }; const config: SlasherConfig = { diff --git a/yarn-project/slasher/src/tally_slasher_client.ts b/yarn-project/slasher/src/tally_slasher_client.ts index 70ef6fdfeeb6..d95d565746a8 100644 --- a/yarn-project/slasher/src/tally_slasher_client.ts +++ b/yarn-project/slasher/src/tally_slasher_client.ts @@ -349,15 +349,11 @@ export class TallySlasherClient implements ProposerSlashActionProvider, SlasherC return undefined; } - const offensesToSlashLog = offensesToSlash.map(offense => ({ - ...offense, - amount: offense.amount.toString(), - })); this.log.info(`Voting to slash ${offensesToSlash.length} offenses`, { slotNumber, currentRound, slashedRound, - offensesToSlash: offensesToSlashLog, + offensesToSlash, }); const committees = await this.collectCommitteesActiveDuringRound(slashedRound); diff --git a/yarn-project/stdlib/package.json b/yarn-project/stdlib/package.json index 9189844ec9aa..a16cb6461664 100644 --- a/yarn-project/stdlib/package.json +++ b/yarn-project/stdlib/package.json @@ -99,7 +99,7 @@ "@aztec/noir-noirc_abi": "portal:../../noir/packages/noirc_abi", "@aztec/validator-ha-signer": "workspace:^", "@google-cloud/storage": "^7.15.0", - "axios": "^1.12.0", + "axios": "^1.13.5", "json-stringify-deterministic": "1.0.12", "lodash.chunk": "^4.2.0", "lodash.isequal": "^4.5.0", diff --git a/yarn-project/stdlib/scripts/copy-contracts.sh b/yarn-project/stdlib/scripts/copy-contracts.sh index fa087fed2b07..83fe75736664 100755 --- a/yarn-project/stdlib/scripts/copy-contracts.sh +++ b/yarn-project/stdlib/scripts/copy-contracts.sh @@ -5,3 +5,14 @@ mkdir -p ./fixtures cp "../../noir-projects/noir-contracts/target/benchmarking_contract-Benchmarking.json" ./fixtures/Benchmarking.test.json cp "../../noir-projects/noir-contracts/target/test_contract-Test.json" ./fixtures/Test.test.json cp "../../noir-projects/noir-contracts/target/token_contract-Token.json" ./fixtures/Token.test.json + +# Run bb aztec_process on the copied fixtures to embed precomputed hashes +# (artifactHash, privateFunctionsRoot, publicBytecodeCommitment, contractClassId, +# per-function verificationKeyHash and functionSelector). +# These allow TypeScript to skip expensive hash computations and also serve as cross-validation +# that the C++ and TypeScript implementations are equivalent. +bb=$(../../barretenberg/cpp/scripts/find-bb) +for fixture in ./fixtures/Benchmarking.test.json ./fixtures/Test.test.json ./fixtures/Token.test.json; do + echo "Post-processing $fixture..." + $bb aztec_process -i "$fixture" -o "$fixture" +done diff --git a/yarn-project/stdlib/src/abi/decoder.ts b/yarn-project/stdlib/src/abi/decoder.ts index a54fc9dee69c..69f1ac106d81 100644 --- a/yarn-project/stdlib/src/abi/decoder.ts +++ b/yarn-project/stdlib/src/abi/decoder.ts @@ -135,10 +135,7 @@ export class FunctionSignatureDecoder { case 'field': return 'Field'; case 'integer': - if (param.sign === 'signed') { - throw new Error('Unsupported type: signed integer'); - } - return `u${param.width}`; + return param.sign === 'signed' ? `i${param.width}` : `u${param.width}`; case 'boolean': return 'bool'; case 'array': diff --git a/yarn-project/stdlib/src/abi/encoder.test.ts b/yarn-project/stdlib/src/abi/encoder.test.ts index f527e4514b9e..c26e9ae78045 100644 --- a/yarn-project/stdlib/src/abi/encoder.test.ts +++ b/yarn-project/stdlib/src/abi/encoder.test.ts @@ -209,6 +209,33 @@ describe('abi/encoder', () => { expect(() => encodeArguments(testFunctionAbi, args)).toThrow(`Cannot convert garbage to a BigInt`); }); + it("encodes negative signed integers as two's complement", () => { + const testFunctionAbi: FunctionAbi = { + name: 'test', + functionType: FunctionType.PRIVATE, + isOnlySelf: false, + isInitializer: false, + isStatic: false, + parameters: [ + { + name: 'value', + type: { kind: 'integer', sign: 'signed', width: 8 }, + visibility: 'private', + }, + ], + returnTypes: [], + errorTypes: {}, + }; + + expect(encodeArguments(testFunctionAbi, [0])).toEqual([new Fr(0n)]); + expect(encodeArguments(testFunctionAbi, [-128])).toEqual([new Fr(128n)]); + expect(encodeArguments(testFunctionAbi, [127])).toEqual([new Fr(127n)]); + expect(encodeArguments(testFunctionAbi, [-1])).toEqual([new Fr(255n)]); + + // Also check strings are properly encoded + expect(encodeArguments(testFunctionAbi, ['-1'])).toEqual([new Fr(255n)]); + }); + it('throws when passing object argument as field', () => { const testFunctionAbi: FunctionAbi = { name: 'constructor', diff --git a/yarn-project/stdlib/src/abi/encoder.ts b/yarn-project/stdlib/src/abi/encoder.ts index e36f170eef8b..c4748c8e41f8 100644 --- a/yarn-project/stdlib/src/abi/encoder.ts +++ b/yarn-project/stdlib/src/abi/encoder.ts @@ -123,14 +123,17 @@ class ArgumentEncoder { } break; } - case 'integer': - if (typeof arg === 'string') { - const value = BigInt(arg); - this.flattened.push(new Fr(value)); + case 'integer': { + const value = BigInt(arg); + if (abiType.sign === 'signed' && value < 0n) { + // Convert negative values to two's complement representation + const twosComplement = value + (1n << BigInt(abiType.width)); + this.flattened.push(new Fr(twosComplement)); } else { - this.flattened.push(new Fr(arg)); + this.flattened.push(new Fr(value)); } break; + } default: throw new Error(`Unsupported type: ${abiType.kind}`); } diff --git a/yarn-project/stdlib/src/avm/revert_code.ts b/yarn-project/stdlib/src/avm/revert_code.ts index 4249a6b69f4a..be01d20b20e1 100644 --- a/yarn-project/stdlib/src/avm/revert_code.ts +++ b/yarn-project/stdlib/src/avm/revert_code.ts @@ -5,10 +5,25 @@ import { BufferReader, FieldReader } from '@aztec/foundation/serialize'; import { inspect } from 'util'; import { z } from 'zod'; +/** + * Tracks which revertible phases of a transaction's public execution reverted. + * + * A transaction executes in three sequential phases: + * 1. SETUP – non-revertible; if this fails the entire transaction is rejected. + * 2. APP_LOGIC – revertible; its state changes are rolled back on failure. + * 3. TEARDOWN – revertible; always runs (even after app-logic revert) so the fee-payment contract can clean up. + * + * Only APP_LOGIC and TEARDOWN can produce a revert code. SETUP failures throw instead and discard the transaction + * entirely. + */ export enum RevertCodeEnum { + /** All phases completed successfully; no state was rolled back. */ OK = 0, + /** APP_LOGIC reverted; its state changes were discarded. If present, TEARDOWN still ran and succeeded. */ APP_LOGIC_REVERTED = 1, + /** TEARDOWN reverted; its state changes were discarded. APP_LOGIC succeeded. */ TEARDOWN_REVERTED = 2, + /** Both APP_LOGIC and TEARDOWN reverted; only SETUP effects are kept. */ BOTH_REVERTED = 3, } diff --git a/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.test.ts b/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.test.ts index 9d6e5beeebac..1ba698b4b307 100644 --- a/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.test.ts +++ b/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.test.ts @@ -755,6 +755,60 @@ describe('L2BlockStream', () => { ]); }); + describe('startingBlock with stale checkpoint state', () => { + // When a node restarts with startingBlock set and has local blocks but no checkpoint + // state (e.g. checkpoint tracking is new, or checkpoint state was reset), Loop 1 + // should not spam checkpoint events for all historical checkpoints. + + it('skips historical checkpoint events before startingBlock on restart with stale checkpoint state', async () => { + // node has blocks 1-15 locally (proposed=15) but no checkpoint state. + // Checkpoint 5 covers blocks 13-15 (the last checkpoint). + setRemoteTipsMultiBlock(15, 15); + localData.proposed.number = BlockNumber(15); + // localData.checkpointed starts at 0 - simulating stale/missing checkpoint state + + blockStream = new TestL2BlockStream(blockSource, localData, handler, undefined, { + batchSize: 10, + startingBlock: 13, // start from checkpoint 5 (blocks 13-15) + }); + + await blockStream.work(); + + // Should only emit checkpoint 5 (the one containing startingBlock=13), not all 5 checkpoints + expect(handler.events).toEqual([expectCheckpointed(5)]); + // Verify we don't spam checkpoints 1-4 + const checkpointEvents = handler.events.filter(e => e.type === 'chain-checkpointed'); + expect(checkpointEvents).toHaveLength(1); + }); + + it('without startingBlock emits all historical checkpoints for already-local blocks', async () => { + // Same scenario without startingBlock: should emit all 5 checkpoints (correct catch-up behavior) + setRemoteTipsMultiBlock(15, 15); + localData.proposed.number = BlockNumber(15); + // localData.checkpointed starts at 0 + + await blockStream.work(); + + // All 5 checkpoints should be emitted since they're all for already-local blocks + const checkpointEvents = handler.events.filter(e => e.type === 'chain-checkpointed'); + expect(checkpointEvents).toHaveLength(5); + }); + + it('does not call getCheckpointedBlocks(0) when startingBlock is 0', async () => { + // getCheckpointedBlocks rejects block 0 + setRemoteTipsMultiBlock(15, 15); + blockStream = new TestL2BlockStream(blockSource, localData, handler, undefined, { + batchSize: 10, + startingBlock: 0, + }); + + await blockStream.work(); + + const calls = blockSource.getCheckpointedBlocks.mock.calls; + expect(calls.every(([blockNum]) => blockNum >= 1)).toBe(true); + }); + }); + describe('checkpoint prefetching', () => { it('prefetches multiple checkpoints in a single RPC call', async () => { // Set up: 9 blocks in 3 checkpoints diff --git a/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.ts b/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.ts index dae14e6fb962..9aac6c45b143 100644 --- a/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.ts +++ b/yarn-project/stdlib/src/block/l2_block_stream/l2_block_stream.ts @@ -109,6 +109,27 @@ export class L2BlockStream { let nextBlockNumber = latestBlockNumber + 1; let nextCheckpointToEmit = CheckpointNumber(localTips.checkpointed.checkpoint.number + 1); + + // When startingBlock is set, also skip ahead for checkpoints. + if ( + this.opts.startingBlock !== undefined && + this.opts.startingBlock >= 1 && + nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number + ) { + const startingBlockCheckpoints = await this.l2BlockSource.getCheckpointedBlocks( + BlockNumber(this.opts.startingBlock), + 1, + ); + if (startingBlockCheckpoints.length > 0) { + nextCheckpointToEmit = CheckpointNumber( + Math.max(nextCheckpointToEmit, startingBlockCheckpoints[0].checkpointNumber), + ); + } else { + // startingBlock is past all checkpointed blocks; skip Loop 1 entirely. + nextCheckpointToEmit = CheckpointNumber(sourceTips.checkpointed.checkpoint.number + 1); + } + } + if (this.opts.skipFinalized) { // When skipping finalized blocks we need to provide reliable reorg detection while fetching as few blocks as // possible. Finalized blocks cannot be reorged by definition, so we can skip most of them. We do need the very diff --git a/yarn-project/stdlib/src/config/sequencer-config.ts b/yarn-project/stdlib/src/config/sequencer-config.ts index bc9ef0acb65b..31d0eca9458a 100644 --- a/yarn-project/stdlib/src/config/sequencer-config.ts +++ b/yarn-project/stdlib/src/config/sequencer-config.ts @@ -1,14 +1,19 @@ -import type { ConfigMappingsType } from '@aztec/foundation/config'; +import { type ConfigMappingsType, numberConfigHelper } from '@aztec/foundation/config'; import type { SequencerConfig } from '../interfaces/configs.js'; +/** Default maximum number of transactions per block. */ +export const DEFAULT_MAX_TXS_PER_BLOCK = 32; + /** * Partial sequencer config mappings for fields that need to be shared across packages. * The full sequencer config mappings remain in sequencer-client, but shared fields * (like blockDurationMs needed by both p2p and sequencer-client) are defined here * to avoid duplication. */ -export const sharedSequencerConfigMappings: ConfigMappingsType> = { +export const sharedSequencerConfigMappings: ConfigMappingsType< + Pick +> = { blockDurationMs: { env: 'SEQ_BLOCK_DURATION_MS', description: @@ -16,4 +21,17 @@ export const sharedSequencerConfigMappings: ConfigMappingsType (val ? parseInt(val, 10) : undefined), }, + expectedBlockProposalsPerSlot: { + env: 'SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT', + description: + 'Expected number of block proposals per slot for P2P peer scoring. ' + + '0 (default) disables block proposal scoring. Set to a positive value to enable.', + parseEnv: (val: string) => (val ? parseInt(val, 10) : 0), + defaultValue: 0, + }, + maxTxsPerBlock: { + env: 'SEQ_MAX_TX_PER_BLOCK', + description: 'The maximum number of txs to include in a block.', + ...numberConfigHelper(DEFAULT_MAX_TXS_PER_BLOCK), + }, }; diff --git a/yarn-project/stdlib/src/contract/contract_class.test.ts b/yarn-project/stdlib/src/contract/contract_class.test.ts index f45062905178..fb990a63ed6f 100644 --- a/yarn-project/stdlib/src/contract/contract_class.test.ts +++ b/yarn-project/stdlib/src/contract/contract_class.test.ts @@ -1,5 +1,3 @@ -import { Fr } from '@aztec/foundation/curves/bn254'; - import { FunctionSelector, FunctionType } from '../abi/index.js'; import { getBenchmarkContractArtifact } from '../tests/fixtures.js'; import { getContractClassFromArtifact } from './contract_class.js'; @@ -7,10 +5,7 @@ import { getContractClassFromArtifact } from './contract_class.js'; describe('ContractClass', () => { it('creates a contract class from a contract compilation artifact', async () => { const artifact = getBenchmarkContractArtifact(); - const contractClass = await getContractClassFromArtifact({ - ...artifact, - artifactHash: Fr.fromHexString('0x1234'), - }); + const contractClass = await getContractClassFromArtifact(artifact); // Assert bytecode has a reasonable length expect(contractClass.packedBytecode.length).toBeGreaterThan(100); diff --git a/yarn-project/stdlib/src/contract/contract_class.ts b/yarn-project/stdlib/src/contract/contract_class.ts index 8b400b45b580..68706437dbb4 100644 --- a/yarn-project/stdlib/src/contract/contract_class.ts +++ b/yarn-project/stdlib/src/contract/contract_class.ts @@ -8,7 +8,7 @@ import { type ContractClassIdPreimage, computeContractClassIdWithPreimage } from import type { ContractClass, ContractClassWithId } from './interfaces/index.js'; /** Contract artifact including its artifact hash */ -type ContractArtifactWithHash = ContractArtifact & { artifactHash: Fr }; +export type ContractArtifactWithHash = ContractArtifact & { artifactHash: Fr }; const cmpFunctionArtifacts = (a: T, b: T) => a.selector.toField().cmp(b.selector.toField()); @@ -35,8 +35,8 @@ export async function getContractClassFromArtifact( privateArtifactFunctions.sort(cmpFunctionArtifacts); - const contractClass: ContractClass = { - version: 1, + const contractClass = { + version: 1 as const, artifactHash, packedBytecode, privateFunctions: privateArtifactFunctions, diff --git a/yarn-project/stdlib/src/interfaces/configs.ts b/yarn-project/stdlib/src/interfaces/configs.ts index 5149006d2f65..3cd2912c078f 100644 --- a/yarn-project/stdlib/src/interfaces/configs.ts +++ b/yarn-project/stdlib/src/interfaces/configs.ts @@ -65,6 +65,8 @@ export interface SequencerConfig { shuffleAttestationOrdering?: boolean; /** Duration per block in milliseconds when building multiple blocks per slot (default: undefined = single block per slot) */ blockDurationMs?: number; + /** Expected number of block proposals per slot for P2P peer scoring. 0 disables scoring, undefined falls back to blocksPerSlot - 1. */ + expectedBlockProposalsPerSlot?: number; /** Have sequencer build and publish an empty checkpoint if there are no txs */ buildCheckpointIfEmpty?: boolean; /** Skip pushing proposed blocks to archiver (default: false) */ @@ -105,6 +107,7 @@ export const SequencerConfigSchema = zodFor()( fishermanMode: z.boolean().optional(), shuffleAttestationOrdering: z.boolean().optional(), blockDurationMs: z.number().positive().optional(), + expectedBlockProposalsPerSlot: z.number().nonnegative().optional(), buildCheckpointIfEmpty: z.boolean().optional(), skipPushProposedBlocksToArchiver: z.boolean().optional(), minBlocksForCheckpoint: z.number().positive().optional(), @@ -115,6 +118,7 @@ export const SequencerConfigSchema = zodFor()( type SequencerConfigOptionalKeys = | 'governanceProposerPayload' | 'blockDurationMs' + | 'expectedBlockProposalsPerSlot' | 'coinbase' | 'feeRecipient' | 'acvmWorkingDirectory' diff --git a/yarn-project/stdlib/src/interfaces/p2p.ts b/yarn-project/stdlib/src/interfaces/p2p.ts index fe0b5517bcff..301cbb4f9fee 100644 --- a/yarn-project/stdlib/src/interfaces/p2p.ts +++ b/yarn-project/stdlib/src/interfaces/p2p.ts @@ -3,7 +3,6 @@ import type { SlotNumber } from '@aztec/foundation/branded-types'; import { z } from 'zod'; import { CheckpointAttestation } from '../p2p/checkpoint_attestation.js'; -import type { P2PClientType } from '../p2p/client_type.js'; import { type ApiSchemaFor, optional, schemas } from '../schemas/index.js'; import { Tx } from '../tx/tx.js'; import { TxHash } from '../tx/tx_hash.js'; @@ -27,7 +26,7 @@ const PeerInfoSchema = z.discriminatedUnion('status', [ ]); /** Exposed API to the P2P module. */ -export interface P2PApiWithoutAttestations { +export interface P2PApi { /** * Returns all pending transactions in the transaction pool. * @param limit - The number of items to returns @@ -48,9 +47,7 @@ export interface P2PApiWithoutAttestations { * Returns info for all connected, dialing, and cached peers. */ getPeers(includePending?: boolean): Promise; -} -export interface P2PApiWithAttestations extends P2PApiWithoutAttestations { /** * Queries the Attestation pool for checkpoint attestations for the given slot * @@ -61,19 +58,11 @@ export interface P2PApiWithAttestations extends P2PApiWithoutAttestations { getCheckpointAttestationsForSlot(slot: SlotNumber, proposalId?: string): Promise; } -export interface P2PClient extends P2PApiWithAttestations { +export interface P2PClient extends P2PApi { /** Manually adds checkpoint attestations to the p2p client attestation pool. */ addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise; } -export type P2PApi = T extends P2PClientType.Full - ? P2PApiWithAttestations - : P2PApiWithoutAttestations; - -export type P2PApiFull = T extends P2PClientType.Full - ? P2PApiWithAttestations & P2PClient - : P2PApiWithoutAttestations; - export const P2PApiSchema: ApiSchemaFor = { getCheckpointAttestationsForSlot: z .function() diff --git a/yarn-project/stdlib/src/interfaces/validator.ts b/yarn-project/stdlib/src/interfaces/validator.ts index ae6c5faf1e25..898657f268f4 100644 --- a/yarn-project/stdlib/src/interfaces/validator.ts +++ b/yarn-project/stdlib/src/interfaces/validator.ts @@ -62,7 +62,7 @@ export type ValidatorClientConfig = ValidatorHASignerConfig & { }; export type ValidatorClientFullConfig = ValidatorClientConfig & - Pick & + Pick & Pick< SlasherConfig, 'slashBroadcastedInvalidBlockPenalty' | 'slashDuplicateProposalPenalty' | 'slashDuplicateAttestationPenalty' @@ -93,6 +93,7 @@ export const ValidatorClientFullConfigSchema = zodFor(); + + storeLogs(txHash: string, logs: DebugLog[]): void { + if (logs.length > 0) { + this.map.set(txHash, logs); + } + } + + decorateReceiptWithLogs(txHash: string, receipt: TxReceipt): void { + if (receipt.isMined()) { + const debugLogs = this.map.get(txHash); + if (debugLogs) { + receipt.debugLogs = debugLogs; + } + } + } + + get isEnabled(): boolean { + return true; + } +} diff --git a/yarn-project/stdlib/src/logs/extended_directional_app_tagging_secret.test.ts b/yarn-project/stdlib/src/logs/extended_directional_app_tagging_secret.test.ts new file mode 100644 index 000000000000..59b38d10eb77 --- /dev/null +++ b/yarn-project/stdlib/src/logs/extended_directional_app_tagging_secret.test.ts @@ -0,0 +1,13 @@ +import { randomExtendedDirectionalAppTaggingSecret } from '../tests/factories.js'; +import { ExtendedDirectionalAppTaggingSecret } from './extended_directional_app_tagging_secret.js'; + +describe('ExtendedDirectionalAppTaggingSecret', () => { + it('toString and fromString works', async () => { + const secret = await randomExtendedDirectionalAppTaggingSecret(); + const str = secret.toString(); + const parsed = ExtendedDirectionalAppTaggingSecret.fromString(str); + + expect(parsed.secret).toEqual(secret.secret); + expect(parsed.app).toEqual(secret.app); + }); +}); diff --git a/yarn-project/stdlib/src/logs/directional_app_tagging_secret.ts b/yarn-project/stdlib/src/logs/extended_directional_app_tagging_secret.ts similarity index 67% rename from yarn-project/stdlib/src/logs/directional_app_tagging_secret.ts rename to yarn-project/stdlib/src/logs/extended_directional_app_tagging_secret.ts index 410eaf6f2be1..0a083ed053bc 100644 --- a/yarn-project/stdlib/src/logs/directional_app_tagging_secret.ts +++ b/yarn-project/stdlib/src/logs/extended_directional_app_tagging_secret.ts @@ -5,22 +5,28 @@ import type { Point } from '@aztec/foundation/curves/grumpkin'; import { z } from 'zod'; -import type { AztecAddress } from '../aztec-address/index.js'; +import { AztecAddress } from '../aztec-address/index.js'; import type { CompleteAddress } from '../contract/complete_address.js'; import { computeAddressSecret, computePreaddress } from '../keys/derivation.js'; /** - * Directional application tagging secret used for log tagging. + * Extended directional application tagging secret used for log tagging. * - * "Directional" because the derived secret is bound to the recipient - * address: A→B differs from B→A even with the same participants and app. + * "Extended" because it bundles the directional app tagging secret with the app (contract) address. This bundling was + * done because where this type is used we commonly need access to both the secret and the address. * - * Note: It's a bit unfortunate that this type resides in `stdlib` as the rest of the tagging functionality resides - * in `pxe/src/tagging`. We need to use this type in `PreTag` that in turn is used by other types - * in stdlib hence there doesn't seem to be a good way around this. + * "Directional" because the derived secret is bound to the recipient address: A→B differs from B→A even with the same + * participants and app. + * + * Note: It's a bit unfortunate that this type resides in `stdlib` as the rest of the tagging functionality resides in + * `pxe/src/tagging`. We need to use this type in `PreTag` that in turn is used by other types in stdlib hence there + * doesn't seem to be a good way around this. */ -export class DirectionalAppTaggingSecret { - private constructor(public readonly value: Fr) {} +export class ExtendedDirectionalAppTaggingSecret { + private constructor( + public readonly secret: Fr, + public readonly app: AztecAddress, + ) {} /** * Derives shared tagging secret and from that, the app address and recipient derives the directional app tagging @@ -39,20 +45,21 @@ export class DirectionalAppTaggingSecret { externalAddress: AztecAddress, app: AztecAddress, recipient: AztecAddress, - ): Promise { + ): Promise { const taggingSecretPoint = await computeSharedTaggingSecret(localAddress, localIvsk, externalAddress); const appTaggingSecret = await poseidon2Hash([taggingSecretPoint.x, taggingSecretPoint.y, app]); const directionalAppTaggingSecret = await poseidon2Hash([appTaggingSecret, recipient]); - return new DirectionalAppTaggingSecret(directionalAppTaggingSecret); + return new ExtendedDirectionalAppTaggingSecret(directionalAppTaggingSecret, app); } toString(): string { - return this.value.toString(); + return `${this.secret.toString()}:${this.app.toString()}`; } - static fromString(str: string): DirectionalAppTaggingSecret { - return new DirectionalAppTaggingSecret(Fr.fromString(str)); + static fromString(str: string): ExtendedDirectionalAppTaggingSecret { + const [secretStr, appStr] = str.split(':'); + return new ExtendedDirectionalAppTaggingSecret(Fr.fromString(secretStr), AztecAddress.fromString(appStr)); } } @@ -74,6 +81,7 @@ async function computeSharedTaggingSecret( return Grumpkin.mul(externalAddressPoint, await computeAddressSecret(knownPreaddress, localIvsk)); } -export const DirectionalAppTaggingSecretSchema = z.object({ - value: Fr.schema, +export const ExtendedDirectionalAppTaggingSecretSchema = z.object({ + secret: Fr.schema, + app: AztecAddress.schema, }); diff --git a/yarn-project/stdlib/src/logs/index.ts b/yarn-project/stdlib/src/logs/index.ts index dafe33e376db..2e25c40da7c3 100644 --- a/yarn-project/stdlib/src/logs/index.ts +++ b/yarn-project/stdlib/src/logs/index.ts @@ -1,4 +1,4 @@ -export * from './directional_app_tagging_secret.js'; +export * from './extended_directional_app_tagging_secret.js'; export * from './pre_tag.js'; export * from './contract_class_log.js'; export * from './public_log.js'; @@ -12,5 +12,6 @@ export * from './shared_secret_derivation.js'; export * from './tx_scoped_l2_log.js'; export * from './message_context.js'; export * from './debug_log.js'; +export * from './debug_log_store.js'; export * from './tag.js'; export * from './siloed_tag.js'; diff --git a/yarn-project/stdlib/src/logs/pre_tag.ts b/yarn-project/stdlib/src/logs/pre_tag.ts index 0110412cbd15..40f13b6f501b 100644 --- a/yarn-project/stdlib/src/logs/pre_tag.ts +++ b/yarn-project/stdlib/src/logs/pre_tag.ts @@ -3,9 +3,9 @@ import { schemas } from '@aztec/foundation/schemas'; import { z } from 'zod'; import { - type DirectionalAppTaggingSecret, - DirectionalAppTaggingSecretSchema, -} from './directional_app_tagging_secret.js'; + type ExtendedDirectionalAppTaggingSecret, + ExtendedDirectionalAppTaggingSecretSchema, +} from './extended_directional_app_tagging_secret.js'; /** * Represents a preimage of a private log tag (see `Tag` in `pxe/src/tagging`). @@ -15,11 +15,11 @@ import { * around this. */ export type PreTag = { - secret: DirectionalAppTaggingSecret; + extendedSecret: ExtendedDirectionalAppTaggingSecret; index: number; }; export const PreTagSchema = z.object({ - secret: DirectionalAppTaggingSecretSchema, + extendedSecret: ExtendedDirectionalAppTaggingSecretSchema, index: schemas.Integer, }); diff --git a/yarn-project/stdlib/src/logs/siloed_tag.ts b/yarn-project/stdlib/src/logs/siloed_tag.ts index 5eec518b7f03..0710d3e91fe7 100644 --- a/yarn-project/stdlib/src/logs/siloed_tag.ts +++ b/yarn-project/stdlib/src/logs/siloed_tag.ts @@ -4,7 +4,8 @@ import type { ZodFor } from '@aztec/foundation/schemas'; import type { AztecAddress } from '../aztec-address/index.js'; import { computeSiloedPrivateLogFirstField } from '../hash/hash.js'; import { schemas } from '../schemas/schemas.js'; -import type { Tag } from './tag.js'; +import type { PreTag } from './pre_tag.js'; +import { Tag } from './tag.js'; /* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */ @@ -21,7 +22,12 @@ export interface SiloedTag { export class SiloedTag { constructor(public readonly value: Fr) {} - static async compute(tag: Tag, app: AztecAddress): Promise { + static async compute(preTag: PreTag): Promise { + const tag = await Tag.compute(preTag); + return SiloedTag.computeFromTagAndApp(tag, preTag.extendedSecret.app); + } + + static async computeFromTagAndApp(tag: Tag, app: AztecAddress): Promise { const siloedTag = await computeSiloedPrivateLogFirstField(app, tag.value); return new SiloedTag(siloedTag); } diff --git a/yarn-project/stdlib/src/logs/tag.ts b/yarn-project/stdlib/src/logs/tag.ts index ff7e120bc5b2..c16771da9f8c 100644 --- a/yarn-project/stdlib/src/logs/tag.ts +++ b/yarn-project/stdlib/src/logs/tag.ts @@ -20,7 +20,7 @@ export class Tag { constructor(public readonly value: Fr) {} static async compute(preTag: PreTag): Promise { - const tag = await poseidon2Hash([preTag.secret.value, preTag.index]); + const tag = await poseidon2Hash([preTag.extendedSecret.secret, preTag.index]); return new Tag(tag); } diff --git a/yarn-project/stdlib/src/p2p/attestation_utils.test.ts b/yarn-project/stdlib/src/p2p/attestation_utils.test.ts new file mode 100644 index 000000000000..c06353f6f959 --- /dev/null +++ b/yarn-project/stdlib/src/p2p/attestation_utils.test.ts @@ -0,0 +1,151 @@ +import { SlotNumber } from '@aztec/foundation/branded-types'; +import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer'; +import { Fr } from '@aztec/foundation/curves/bn254'; + +import { jest } from '@jest/globals'; + +import { CheckpointHeader } from '../rollup/index.js'; +import { trimAttestations } from './attestation_utils.js'; +import { CheckpointAttestation } from './checkpoint_attestation.js'; +import { ConsensusPayload } from './consensus_payload.js'; +import { SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from './signature_utils.js'; + +function makeAttestation(signer: Secp256k1Signer): CheckpointAttestation { + const header = CheckpointHeader.random({ slotNumber: SlotNumber(0) }); + const payload = new ConsensusPayload(header, Fr.random(), 0n); + const attestationHash = getHashedSignaturePayloadEthSignedMessage( + payload, + SignatureDomainSeparator.checkpointAttestation, + ); + const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointProposal); + return new CheckpointAttestation(payload, signer.sign(attestationHash), signer.sign(proposalHash)); +} + +function makeSignerAndAttestation() { + const signer = Secp256k1Signer.random(); + return { signer, attestation: makeAttestation(signer), address: signer.address }; +} + +describe('trimAttestations', () => { + it('returns attestations unchanged when count <= required', () => { + const items = Array.from({ length: 3 }, () => makeSignerAndAttestation()); + const proposer = items[0]; + + const result = trimAttestations( + items.map(i => i.attestation), + 3, + proposer.address, + [], + ); + + expect(result).toHaveLength(3); + }); + + it('trims to required count', () => { + const items = Array.from({ length: 5 }, () => makeSignerAndAttestation()); + const proposer = items[0]; + + const result = trimAttestations( + items.map(i => i.attestation), + 3, + proposer.address, + [], + ); + + expect(result).toHaveLength(3); + }); + + it('always keeps proposer attestation', () => { + const items = Array.from({ length: 5 }, () => makeSignerAndAttestation()); + // Proposer is the last item in the array + const proposer = items[4]; + + const result = trimAttestations( + items.map(i => i.attestation), + 3, + proposer.address, + [], + ); + + expect(result).toHaveLength(3); + const resultSenders = result.map(a => a.getSender()!.toString()); + expect(resultSenders).toContain(proposer.address.toString()); + }); + + it('prioritizes local validator attestations over external ones', () => { + const proposer = makeSignerAndAttestation(); + const local1 = makeSignerAndAttestation(); + const local2 = makeSignerAndAttestation(); + const external1 = makeSignerAndAttestation(); + const external2 = makeSignerAndAttestation(); + + const allAttestations = [proposer, local1, local2, external1, external2].map(i => i.attestation); + const localAddresses = [local1.address, local2.address]; + + const result = trimAttestations(allAttestations, 3, proposer.address, localAddresses); + + expect(result).toHaveLength(3); + const resultSenders = new Set(result.map(a => a.getSender()!.toString())); + expect(resultSenders.has(proposer.address.toString())).toBe(true); + expect(resultSenders.has(local1.address.toString())).toBe(true); + expect(resultSenders.has(local2.address.toString())).toBe(true); + expect(resultSenders.has(external1.address.toString())).toBe(false); + expect(resultSenders.has(external2.address.toString())).toBe(false); + }); + + it('fills with external attestations when not enough local ones', () => { + const proposer = makeSignerAndAttestation(); + const local1 = makeSignerAndAttestation(); + const external1 = makeSignerAndAttestation(); + const external2 = makeSignerAndAttestation(); + const external3 = makeSignerAndAttestation(); + + const allAttestations = [proposer, local1, external1, external2, external3].map(i => i.attestation); + + const result = trimAttestations(allAttestations, 3, proposer.address, [local1.address]); + + expect(result).toHaveLength(3); + const resultSenders = new Set(result.map(a => a.getSender()!.toString())); + expect(resultSenders.has(proposer.address.toString())).toBe(true); + expect(resultSenders.has(local1.address.toString())).toBe(true); + // One external fills the remaining slot + const externalIncluded = [external1, external2, external3].filter(e => resultSenders.has(e.address.toString())); + expect(externalIncluded).toHaveLength(1); + }); + + it('handles proposer also being in local addresses without double-counting', () => { + const proposer = makeSignerAndAttestation(); + const local1 = makeSignerAndAttestation(); + const external1 = makeSignerAndAttestation(); + const external2 = makeSignerAndAttestation(); + + const allAttestations = [proposer, local1, external1, external2].map(i => i.attestation); + // Proposer address is also listed in local addresses + const localAddresses = [proposer.address, local1.address]; + + const result = trimAttestations(allAttestations, 3, proposer.address, localAddresses); + + expect(result).toHaveLength(3); + const resultSenders = result.map(a => a.getSender()!.toString()); + // Proposer should appear exactly once + expect(resultSenders.filter(s => s === proposer.address.toString())).toHaveLength(1); + expect(resultSenders).toContain(local1.address.toString()); + }); + + it('skips attestations with unrecoverable signatures', () => { + const proposer = makeSignerAndAttestation(); + const valid = makeSignerAndAttestation(); + const external1 = makeSignerAndAttestation(); + + const badAttestation = makeSignerAndAttestation().attestation; + jest.spyOn(badAttestation, 'getSender').mockReturnValue(undefined); + + const allAttestations = [proposer.attestation, valid.attestation, badAttestation, external1.attestation]; + + const result = trimAttestations(allAttestations, 3, proposer.address, []); + + expect(result).toHaveLength(3); + const resultSenders = result.map(a => a.getSender()?.toString()).filter(Boolean); + expect(resultSenders).toHaveLength(3); + }); +}); diff --git a/yarn-project/stdlib/src/p2p/attestation_utils.ts b/yarn-project/stdlib/src/p2p/attestation_utils.ts index 646ea04d546c..33fb150909af 100644 --- a/yarn-project/stdlib/src/p2p/attestation_utils.ts +++ b/yarn-project/stdlib/src/p2p/attestation_utils.ts @@ -33,3 +33,59 @@ export function orderAttestations( return orderedAttestations; } + +/** + * Trims attestations to the minimum required number to save L1 calldata gas. + * Each signature costs 65 bytes of calldata vs 20 bytes for just an address. + * + * Priority order for keeping attestations: + * 1. The proposer's attestation (required by L1 contract - MissingProposerSignature revert) + * 2. Attestations from the local node's validator keys + * 3. Remaining attestations filled to reach the required count + */ +export function trimAttestations( + attestations: CheckpointAttestation[], + required: number, + proposerAddress: EthAddress, + localAddresses: EthAddress[], +): CheckpointAttestation[] { + if (attestations.length <= required) { + return attestations; + } + + const proposerAttestation: CheckpointAttestation[] = []; + const localAttestations: CheckpointAttestation[] = []; + const otherAttestations: CheckpointAttestation[] = []; + + for (const attestation of attestations) { + const sender = attestation.getSender(); + if (!sender) { + continue; + } + if (sender.equals(proposerAddress)) { + proposerAttestation.push(attestation); + } else if (localAddresses.some(addr => addr.equals(sender))) { + localAttestations.push(attestation); + } else { + otherAttestations.push(attestation); + } + } + + const result: CheckpointAttestation[] = [...proposerAttestation]; + + for (const att of localAttestations) { + if (result.length >= required) { + break; + } + result.push(att); + } + + for (const att of otherAttestations) { + if (result.length >= required) { + break; + } + result.push(att); + } + + return result; +} diff --git a/yarn-project/stdlib/src/p2p/client_type.ts b/yarn-project/stdlib/src/p2p/client_type.ts index 75d1fea547c1..e69de29bb2d1 100644 --- a/yarn-project/stdlib/src/p2p/client_type.ts +++ b/yarn-project/stdlib/src/p2p/client_type.ts @@ -1,6 +0,0 @@ -export enum P2PClientType { - // Full p2p clients will subscribe to all gossip topics - Full, - // Prove p2p clients will only subscribe to transaction and proving topics - Prover, -} diff --git a/yarn-project/stdlib/src/p2p/index.ts b/yarn-project/stdlib/src/p2p/index.ts index c057784472ac..590f7b4e60f6 100644 --- a/yarn-project/stdlib/src/p2p/index.ts +++ b/yarn-project/stdlib/src/p2p/index.ts @@ -8,7 +8,6 @@ export * from './interface.js'; export * from './signature_utils.js'; export * from './signed_txs.js'; export * from './topic_type.js'; -export * from './client_type.js'; export * from './message_validator.js'; export * from './peer_error.js'; export * from './constants.js'; diff --git a/yarn-project/stdlib/src/p2p/topic_type.ts b/yarn-project/stdlib/src/p2p/topic_type.ts index 949ec2c6173b..107298f8dc38 100644 --- a/yarn-project/stdlib/src/p2p/topic_type.ts +++ b/yarn-project/stdlib/src/p2p/topic_type.ts @@ -1,5 +1,3 @@ -import { P2PClientType } from './client_type.js'; - /** * Creates the topic channel identifier string from a given topic type */ @@ -27,19 +25,14 @@ export enum TopicType { checkpoint_attestation = 'checkpoint_attestation', } -export function getTopicTypeForClientType(clientType: P2PClientType) { - if (clientType === P2PClientType.Full) { - return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal, TopicType.checkpoint_attestation]; - } else if (clientType === P2PClientType.Prover) { - return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal]; - } else { - const _: never = clientType; - return [TopicType.tx]; - } -} - -export function getTopicsForClientAndConfig(clientType: P2PClientType, disableTransactions: boolean) { - const topics = getTopicTypeForClientType(clientType); +/** Returns all gossip topics, optionally filtering out transactions. */ +export function getTopicsForConfig(disableTransactions: boolean) { + const topics = [ + TopicType.tx, + TopicType.block_proposal, + TopicType.checkpoint_proposal, + TopicType.checkpoint_attestation, + ]; if (disableTransactions) { return topics.filter(topic => topic !== TopicType.tx); } diff --git a/yarn-project/stdlib/src/p2p/topics.test.ts b/yarn-project/stdlib/src/p2p/topics.test.ts index 79c395f0801b..78556986802a 100644 --- a/yarn-project/stdlib/src/p2p/topics.test.ts +++ b/yarn-project/stdlib/src/p2p/topics.test.ts @@ -1,16 +1,13 @@ -import { P2PClientType } from './client_type.js'; -import { TopicType, getTopicFromString, getTopicsForClientAndConfig } from './topic_type.js'; +import { TopicType, getTopicFromString, getTopicsForConfig } from './topic_type.js'; describe('Gossip topic retrieval', () => { it.each([ - [P2PClientType.Full, ['tx', 'block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], true], - [P2PClientType.Prover, ['tx', 'block_proposal', 'checkpoint_proposal'], true], - [P2PClientType.Full, ['block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], false], - [P2PClientType.Prover, ['block_proposal', 'checkpoint_proposal'], false], + [['tx', 'block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], true], + [['block_proposal', 'checkpoint_proposal', 'checkpoint_attestation'], false], ])( - 'Node type %s subscribes to topics %s with transactions enabled: %s', - (clientType: P2PClientType, expectedTopics: string[], transactionsEnabled: boolean) => { - expect(getTopicsForClientAndConfig(clientType, !transactionsEnabled)).toEqual(expectedTopics); + 'subscribes to topics %s with transactions enabled: %s', + (expectedTopics: string[], transactionsEnabled: boolean) => { + expect(getTopicsForConfig(!transactionsEnabled)).toEqual(expectedTopics); }, ); }); diff --git a/yarn-project/stdlib/src/tests/factories.ts b/yarn-project/stdlib/src/tests/factories.ts index e2d22f969b2c..c33aaa591bd4 100644 --- a/yarn-project/stdlib/src/tests/factories.ts +++ b/yarn-project/stdlib/src/tests/factories.ts @@ -128,6 +128,7 @@ import { PublicCallRequestArrayLengths, } from '../kernel/public_call_request.js'; import { PublicKeys, computeAddress } from '../keys/index.js'; +import { ExtendedDirectionalAppTaggingSecret } from '../logs/extended_directional_app_tagging_secret.js'; import { ContractClassLog, ContractClassLogFields } from '../logs/index.js'; import { PrivateLog } from '../logs/private_log.js'; import { FlatPublicLogs, PublicLog } from '../logs/public_log.js'; @@ -1757,3 +1758,11 @@ export function makeL2Tips( }, }; } + +export async function randomExtendedDirectionalAppTaggingSecret(): Promise { + const resolvedApp = await AztecAddress.random(); + // Using the fromString method like this is messy as it leaks the underlying serialization format but I don't want to + // expose the type's constructor just for tests since in prod the secret is always constructed via compute. Also this + // method is tested in extended_directional_app_tagging_secret.test.ts hence all should be fine. + return ExtendedDirectionalAppTaggingSecret.fromString(`${Fr.random().toString()}:${resolvedApp.toString()}`); +} diff --git a/yarn-project/stdlib/src/tests/mocks.ts b/yarn-project/stdlib/src/tests/mocks.ts index 6ce72b3563de..ceffb21c01a8 100644 --- a/yarn-project/stdlib/src/tests/mocks.ts +++ b/yarn-project/stdlib/src/tests/mocks.ts @@ -1,10 +1,11 @@ import { - FIXED_DA_GAS, - FIXED_L2_GAS, MAX_ENQUEUED_CALLS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_TX_LIFETIME, + PRIVATE_TX_L2_GAS_OVERHEAD, + PUBLIC_TX_L2_GAS_OVERHEAD, + TX_DA_GAS_OVERHEAD, } from '@aztec/constants'; import { type FieldsOf, makeTuple } from '@aztec/foundation/array'; import { BlockNumber, CheckpointNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types'; @@ -205,8 +206,11 @@ export async function mockProcessedTx({ feePayer, feePaymentPublicDataWrite, // The default gasUsed is the tx overhead. - gasUsed = Gas.from({ daGas: FIXED_DA_GAS, l2Gas: FIXED_L2_GAS }), privateOnly = false, + gasUsed = Gas.from({ + daGas: TX_DA_GAS_OVERHEAD, + l2Gas: privateOnly ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD, + }), avmAccumulatedData, ...mockTxOpts }: { diff --git a/yarn-project/stdlib/src/tx/profiling.ts b/yarn-project/stdlib/src/tx/profiling.ts index 093e7af471ed..c5441d77931d 100644 --- a/yarn-project/stdlib/src/tx/profiling.ts +++ b/yarn-project/stdlib/src/tx/profiling.ts @@ -157,23 +157,23 @@ export class TxProfileResult { } } -export class UtilitySimulationResult { +export class UtilityExecutionResult { constructor( public result: Fr[], public stats?: SimulationStats, ) {} - static get schema(): ZodFor { + static get schema(): ZodFor { return z .object({ result: z.array(schemas.Fr), stats: optional(SimulationStatsSchema), }) - .transform(({ result, stats }) => new UtilitySimulationResult(result, stats)); + .transform(({ result, stats }) => new UtilityExecutionResult(result, stats)); } - static random(): UtilitySimulationResult { - return new UtilitySimulationResult([Fr.random()], { + static random(): UtilityExecutionResult { + return new UtilityExecutionResult([Fr.random()], { nodeRPCCalls: { perMethod: { getBlockHeader: { times: [1] } }, roundTrips: { diff --git a/yarn-project/stdlib/src/tx/public_simulation_output.ts b/yarn-project/stdlib/src/tx/public_simulation_output.ts index 20e5d743e3d2..984a747fcf3d 100644 --- a/yarn-project/stdlib/src/tx/public_simulation_output.ts +++ b/yarn-project/stdlib/src/tx/public_simulation_output.ts @@ -7,6 +7,7 @@ import { z } from 'zod'; import { SimulationError } from '../errors/simulation_error.js'; import { Gas } from '../gas/gas.js'; import type { GasUsed } from '../gas/gas_used.js'; +import { DebugLog } from '../logs/debug_log.js'; import { NullishToUndefined } from '../schemas/schemas.js'; import { TxEffect } from '../tx/tx_effect.js'; import { GlobalVariables } from './global_variables.js'; @@ -71,6 +72,7 @@ export class PublicSimulationOutput { public txEffect: TxEffect, public publicReturnValues: NestedProcessReturnValues[], public gasUsed: GasUsed, + public debugLogs: DebugLog[] = [], ) {} static get schema(): ZodFor { @@ -86,6 +88,7 @@ export class PublicSimulationOutput { publicGas: Gas.schema, billedGas: Gas.schema, }), + debugLogs: z.array(DebugLog.schema).default([]), }) .transform( fields => @@ -95,6 +98,7 @@ export class PublicSimulationOutput { fields.txEffect, fields.publicReturnValues, fields.gasUsed, + fields.debugLogs, ), ); } diff --git a/yarn-project/stdlib/src/tx/tx_receipt.ts b/yarn-project/stdlib/src/tx/tx_receipt.ts index ec54694712d5..3b67b0057ba5 100644 --- a/yarn-project/stdlib/src/tx/tx_receipt.ts +++ b/yarn-project/stdlib/src/tx/tx_receipt.ts @@ -4,6 +4,7 @@ import { z } from 'zod'; import { RevertCode } from '../avm/revert_code.js'; import { BlockHash } from '../block/block_hash.js'; +import { DebugLog } from '../logs/debug_log.js'; import { type ZodFor, schemas } from '../schemas/schemas.js'; import { TxHash } from './tx_hash.js'; @@ -57,6 +58,12 @@ export class TxReceipt { public blockHash?: BlockHash, /** The block number in which the transaction was included. */ public blockNumber?: BlockNumber, + /** + * Debug logs collected during public function execution. Served only when the node is in test mode and placed on + * the receipt only because it's a convenient place for it (the logs are printed out by the wallet when a mined + * tx receipt is obtained). + */ + public debugLogs?: DebugLog[], ) {} /** Returns true if the transaction was executed successfully. */ @@ -103,6 +110,7 @@ export class TxReceipt { blockHash: BlockHash.schema.optional(), blockNumber: BlockNumberSchema.optional(), transactionFee: schemas.BigInt.optional(), + debugLogs: z.array(DebugLog.schema).optional(), }) .transform(fields => TxReceipt.from(fields)); } @@ -115,6 +123,7 @@ export class TxReceipt { transactionFee?: bigint; blockHash?: BlockHash; blockNumber?: BlockNumber; + debugLogs?: DebugLog[]; }) { return new TxReceipt( fields.txHash, @@ -124,6 +133,7 @@ export class TxReceipt { fields.transactionFee, fields.blockHash, fields.blockNumber, + fields.debugLogs, ); } diff --git a/yarn-project/telemetry-client/src/metrics.ts b/yarn-project/telemetry-client/src/metrics.ts index 0187114e0d5d..10f98f09b528 100644 --- a/yarn-project/telemetry-client/src/metrics.ts +++ b/yarn-project/telemetry-client/src/metrics.ts @@ -1041,6 +1041,11 @@ export const PROVING_QUEUE_REJECTED_JOBS: MetricDefinition = { description: 'Number of rejected proving jobs', valueType: ValueType.INT, }; +export const PROVING_QUEUE_ABORTED_JOBS: MetricDefinition = { + name: 'aztec.proving_queue.aborted_jobs_count', + description: 'Number of aborted proving jobs', + valueType: ValueType.INT, +}; export const PROVING_QUEUE_RETRIED_JOBS: MetricDefinition = { name: 'aztec.proving_queue.retried_jobs_count', description: 'Number of retried proving jobs', diff --git a/yarn-project/txe/src/index.ts b/yarn-project/txe/src/index.ts index bdcfa01af09b..76c25b5a4751 100644 --- a/yarn-project/txe/src/index.ts +++ b/yarn-project/txe/src/index.ts @@ -9,9 +9,12 @@ import { Fr } from '@aztec/aztec.js/fields'; import { PublicKeys, deriveKeys } from '@aztec/aztec.js/keys'; import { createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server'; import type { Logger } from '@aztec/foundation/log'; -import { type ProtocolContract, protocolContractNames } from '@aztec/protocol-contracts'; +import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; +import { protocolContractNames } from '@aztec/protocol-contracts'; import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle'; +import { ContractStore } from '@aztec/pxe/server'; import { computeArtifactHash } from '@aztec/stdlib/contract'; +import type { ContractArtifactWithHash } from '@aztec/stdlib/contract'; import type { ApiSchemaFor } from '@aztec/stdlib/schemas'; import { zodFor } from '@aztec/stdlib/schemas'; @@ -33,18 +36,24 @@ import { fromSingle, toSingle, } from './util/encoding.js'; -import type { ContractArtifactWithHash } from './util/txe_contract_store.js'; const sessions = new Map(); /* * TXE typically has to load the same contract artifacts over and over again for multiple tests, - * so we cache them here to avoid both loading them from disk repeatedly and computing their artifact hashes + * so we cache them here to avoid loading from disk repeatedly. + * + * The in-flight map coalesces concurrent requests for the same cache key so that + * computeArtifactHash (very expensive) is only run once even under parallelism. */ const TXEArtifactsCache = new Map< string, { artifact: ContractArtifactWithHash; instance: ContractInstanceWithAddress } >(); +const TXEArtifactsCacheInFlight = new Map< + string, + Promise<{ artifact: ContractArtifactWithHash; instance: ContractInstanceWithAddress }> +>(); type TXEForeignCallInput = { session_id: number; @@ -68,7 +77,7 @@ const TXEForeignCallInputSchema = zodFor()( ); class TXEDispatcher { - private protocolContracts!: ProtocolContract[]; + private contractStore!: ContractStore; constructor(private logger: Logger) {} @@ -135,29 +144,36 @@ class TXEDispatcher { this.logger.debug(`Using cached artifact for ${cacheKey}`); ({ artifact, instance } = TXEArtifactsCache.get(cacheKey)!); } else { - this.logger.debug(`Loading compiled artifact ${artifactPath}`); - const artifactJSON = JSON.parse(await readFile(artifactPath, 'utf-8')) as NoirCompiledContract; - const artifactWithoutHash = loadContractArtifact(artifactJSON); - artifact = { - ...artifactWithoutHash, - // Artifact hash is *very* expensive to compute, so we do it here once - // and the TXE contract data provider can cache it - artifactHash: await computeArtifactHash(artifactWithoutHash), - }; - this.logger.debug( - `Deploy ${ - artifact.name - } with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHash.toString()}`, - ); - instance = await getContractInstanceFromInstantiationParams(artifact, { - constructorArgs: decodedArgs, - skipArgsDecoding: true, - salt: Fr.ONE, - publicKeys, - constructorArtifact: initializer ? initializer : undefined, - deployer: AztecAddress.ZERO, - }); - TXEArtifactsCache.set(cacheKey, { artifact, instance }); + if (!TXEArtifactsCacheInFlight.has(cacheKey)) { + this.logger.debug(`Loading compiled artifact ${artifactPath}`); + const compute = async () => { + const artifactJSON = JSON.parse(await readFile(artifactPath, 'utf-8')) as NoirCompiledContract; + const artifactWithoutHash = loadContractArtifact(artifactJSON); + const computedArtifact: ContractArtifactWithHash = { + ...artifactWithoutHash, + // Artifact hash is *very* expensive to compute, so we do it here once + // and the TXE contract data provider can cache it + artifactHash: await computeArtifactHash(artifactWithoutHash), + }; + this.logger.debug( + `Deploy ${computedArtifact.name} with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHash.toString()}`, + ); + const computedInstance = await getContractInstanceFromInstantiationParams(computedArtifact, { + constructorArgs: decodedArgs, + skipArgsDecoding: true, + salt: Fr.ONE, + publicKeys, + constructorArtifact: initializer ? initializer : undefined, + deployer: AztecAddress.ZERO, + }); + const result = { artifact: computedArtifact, instance: computedInstance }; + TXEArtifactsCache.set(cacheKey, result); + TXEArtifactsCacheInFlight.delete(cacheKey); + return result; + }; + TXEArtifactsCacheInFlight.set(cacheKey, compute()); + } + ({ artifact, instance } = await TXEArtifactsCacheInFlight.get(cacheKey)!); } inputs.splice(0, 1, artifact, instance, toSingle(secret)); @@ -175,23 +191,35 @@ class TXEDispatcher { this.logger.debug(`Using cached artifact for ${cacheKey}`); ({ artifact, instance } = TXEArtifactsCache.get(cacheKey)!); } else { - const keys = await deriveKeys(secret); - const args = [keys.publicKeys.masterIncomingViewingPublicKey.x, keys.publicKeys.masterIncomingViewingPublicKey.y]; - artifact = { - ...SchnorrAccountContractArtifact, - // Artifact hash is *very* expensive to compute, so we do it here once - // and the TXE contract data provider can cache it - artifactHash: await computeArtifactHash(SchnorrAccountContractArtifact), - }; - instance = await getContractInstanceFromInstantiationParams(artifact, { - constructorArgs: args, - skipArgsDecoding: true, - salt: Fr.ONE, - publicKeys: keys.publicKeys, - constructorArtifact: 'constructor', - deployer: AztecAddress.ZERO, - }); - TXEArtifactsCache.set(cacheKey, { artifact, instance }); + if (!TXEArtifactsCacheInFlight.has(cacheKey)) { + const compute = async () => { + const keys = await deriveKeys(secret); + const args = [ + keys.publicKeys.masterIncomingViewingPublicKey.x, + keys.publicKeys.masterIncomingViewingPublicKey.y, + ]; + const computedArtifact: ContractArtifactWithHash = { + ...SchnorrAccountContractArtifact, + // Artifact hash is *very* expensive to compute, so we do it here once + // and the TXE contract data provider can cache it + artifactHash: await computeArtifactHash(SchnorrAccountContractArtifact), + }; + const computedInstance = await getContractInstanceFromInstantiationParams(computedArtifact, { + constructorArgs: args, + skipArgsDecoding: true, + salt: Fr.ONE, + publicKeys: keys.publicKeys, + constructorArtifact: 'constructor', + deployer: AztecAddress.ZERO, + }); + const result = { artifact: computedArtifact, instance: computedInstance }; + TXEArtifactsCache.set(cacheKey, result); + TXEArtifactsCacheInFlight.delete(cacheKey); + return result; + }; + TXEArtifactsCacheInFlight.set(cacheKey, compute()); + } + ({ artifact, instance } = await TXEArtifactsCacheInFlight.get(cacheKey)!); } inputs.splice(0, 0, artifact, instance); @@ -204,12 +232,18 @@ class TXEDispatcher { if (!sessions.has(sessionId)) { this.logger.debug(`Creating new session ${sessionId}`); - if (!this.protocolContracts) { - this.protocolContracts = await Promise.all( - protocolContractNames.map(name => new BundledProtocolContractsProvider().getProtocolContractArtifact(name)), - ); + if (!this.contractStore) { + const kvStore = await openTmpStore('txe-contracts'); + this.contractStore = new ContractStore(kvStore); + const provider = new BundledProtocolContractsProvider(); + for (const name of protocolContractNames) { + const { instance, artifact } = await provider.getProtocolContractArtifact(name); + await this.contractStore.addContractArtifact(artifact); + await this.contractStore.addContractInstance(instance); + } + this.logger.debug('Registered protocol contracts in shared contract store'); } - sessions.set(sessionId, await TXESession.init(this.protocolContracts)); + sessions.set(sessionId, await TXESession.init(this.contractStore)); } switch (functionName) { diff --git a/yarn-project/txe/src/oracle/interfaces.ts b/yarn-project/txe/src/oracle/interfaces.ts index 35d5bea9555d..98dd9f4c0086 100644 --- a/yarn-project/txe/src/oracle/interfaces.ts +++ b/yarn-project/txe/src/oracle/interfaces.ts @@ -71,11 +71,13 @@ export interface ITxeExecutionOracle { args: Fr[], argsHash: Fr, isStaticCall: boolean, + jobId: string, ): Promise; - txeSimulateUtilityFunction( + txeExecuteUtilityFunction( targetContractAddress: AztecAddress, functionSelector: FunctionSelector, args: Fr[], + jobId: string, ): Promise; txePublicCallNewFlow( from: AztecAddress, @@ -83,4 +85,7 @@ export interface ITxeExecutionOracle { calldata: Fr[], isStaticCall: boolean, ): Promise; + // TODO(F-335): Drop this from here as it's not a real oracle handler - it's only called from + // RPCTranslator::txeGetPrivateEvents and never from Noir. + syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string): Promise; } diff --git a/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts b/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts index 29ec046bec14..45be8bbcf95c 100644 --- a/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts +++ b/yarn-project/txe/src/oracle/txe_oracle_top_level_context.ts @@ -16,6 +16,7 @@ import type { AccessScopes } from '@aztec/pxe/client/lazy'; import { AddressStore, CapsuleStore, + type ContractStore, NoteStore, ORACLE_VERSION, PrivateEventStore, @@ -84,7 +85,6 @@ import { ForkCheckpoint } from '@aztec/world-state'; import { DEFAULT_ADDRESS } from '../constants.js'; import type { TXEStateMachine } from '../state_machine/index.js'; import type { TXEAccountStore } from '../util/txe_account_store.js'; -import type { TXEContractStore } from '../util/txe_contract_store.js'; import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js'; import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js'; import type { ITxeExecutionOracle } from './interfaces.js'; @@ -97,7 +97,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl constructor( private stateMachine: TXEStateMachine, - private contractStore: TXEContractStore, + private contractStore: ContractStore, private noteStore: NoteStore, private keyStore: KeyStore, private addressStore: AddressStore, @@ -107,7 +107,6 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl private senderAddressBookStore: SenderAddressBookStore, private capsuleStore: CapsuleStore, private privateEventStore: PrivateEventStore, - private jobId: string, private nextBlockTimestamp: bigint, private version: Fr, private chainId: Fr, @@ -172,6 +171,25 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl return { txHash: txEffects.txHash, noteHashes: txEffects.noteHashes, nullifiers: txEffects.nullifiers }; } + async syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string) { + if (contractAddress.equals(DEFAULT_ADDRESS)) { + this.logger.debug(`Skipping sync in txeGetPrivateEvents because the events correspond to the default address.`); + return; + } + + const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader(); + await this.stateMachine.contractSyncService.ensureContractSynced( + contractAddress, + null, + async (call, execScopes) => { + await this.executeUtilityCall(call, execScopes, jobId); + }, + blockHeader, + jobId, + [scope], + ); + } + async txeGetPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) { return ( await this.privateEventStore.getPrivateEvents(selector, { @@ -211,7 +229,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl await this.txeAddAccount(artifact, instance, secret); } else { await this.contractStore.addContractInstance(instance); - await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact); + await this.contractStore.addContractArtifact(artifact); this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`); } } @@ -221,7 +239,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`); await this.contractStore.addContractInstance(instance); - await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact); + await this.contractStore.addContractArtifact(artifact); const completeAddress = await this.keyStore.addAccount(secret, partialAddress); await this.accountStore.setAccount(completeAddress.address, completeAddress); @@ -285,6 +303,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl args: Fr[], argsHash: Fr = Fr.zero(), isStaticCall: boolean = false, + jobId: string, ) { this.logger.verbose( `Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`, @@ -304,7 +323,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl // Sync notes before executing private function to discover notes from previous transactions const utilityExecutor = async (call: FunctionCall, execScopes: AccessScopes) => { - await this.executeUtilityCall(call, execScopes); + await this.executeUtilityCall(call, execScopes, jobId); }; const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader(); @@ -313,7 +332,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl functionSelector, utilityExecutor, blockHeader, - this.jobId, + jobId, effectiveScopes, ); @@ -360,7 +379,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl capsuleStore: this.capsuleStore, privateEventStore: this.privateEventStore, contractSyncService: this.stateMachine.contractSyncService, - jobId: this.jobId, + jobId, totalPublicCalldataCount: 0, sideEffectCounter: minRevertibleSideEffectCounter, scopes: effectiveScopes, @@ -659,10 +678,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl return returnValues ?? []; } - async txeSimulateUtilityFunction( + async txeExecuteUtilityFunction( targetContractAddress: AztecAddress, functionSelector: FunctionSelector, args: Fr[], + jobId: string, ) { const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector); if (!artifact) { @@ -675,10 +695,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl targetContractAddress, functionSelector, async (call, execScopes) => { - await this.executeUtilityCall(call, execScopes); + await this.executeUtilityCall(call, execScopes, jobId); }, blockHeader, - this.jobId, + jobId, 'ALL_SCOPES', ); @@ -693,10 +713,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl returnTypes: [], }); - return this.executeUtilityCall(call, 'ALL_SCOPES'); + return this.executeUtilityCall(call, 'ALL_SCOPES', jobId); } - private async executeUtilityCall(call: FunctionCall, scopes: AccessScopes): Promise { + private async executeUtilityCall(call: FunctionCall, scopes: AccessScopes, jobId: string): Promise { const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector); if (entryPointArtifact.functionType !== FunctionType.UTILITY) { throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`); @@ -723,7 +743,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl senderAddressBookStore: this.senderAddressBookStore, capsuleStore: this.capsuleStore, privateEventStore: this.privateEventStore, - jobId: this.jobId, + jobId, scopes, }); const acirExecutionResult = await new WASMSimulator() @@ -741,10 +761,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl ); }); - this.logger.verbose(`Utility simulation for ${call.to}.${call.selector} completed`); + this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`); return witnessMapToFields(acirExecutionResult.returnWitness); } catch (err) { - throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility simulation')); + throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution')); } } diff --git a/yarn-project/txe/src/rpc_translator.ts b/yarn-project/txe/src/rpc_translator.ts index 78a3b9ce13ec..55deeb05b91e 100644 --- a/yarn-project/txe/src/rpc_translator.ts +++ b/yarn-project/txe/src/rpc_translator.ts @@ -30,7 +30,7 @@ import { toSingle, } from './util/encoding.js'; -const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS +const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5; export class UnavailableOracleError extends Error { @@ -285,6 +285,13 @@ export class RPCTranslator { const contractAddress = addressFromSingle(foreignContractAddress); const scope = addressFromSingle(foreignScope); + // TODO(F-335): Avoid doing the following 2 calls here. + { + await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob()); + // We cycle job to commit the stores after the contract sync. + await this.stateHandler.cycleJob(); + } + const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope); if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) { @@ -1038,12 +1045,15 @@ export class RPCTranslator { args, argsHash, isStaticCall, + this.stateHandler.getCurrentJob(), ); + // TODO(F-335): Avoid doing the following call here. + await this.stateHandler.cycleJob(); return toForeignCallResult([toArray(returnValues)]); } - async txeSimulateUtilityFunction( + async txeExecuteUtilityFunction( foreignTargetContractAddress: ForeignCallSingle, foreignFunctionSelector: ForeignCallSingle, foreignArgs: ForeignCallArray, @@ -1052,12 +1062,15 @@ export class RPCTranslator { const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector)); const args = fromArray(foreignArgs); - const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction( + const returnValues = await this.handlerAsTxe().txeExecuteUtilityFunction( targetContractAddress, functionSelector, args, + this.stateHandler.getCurrentJob(), ); + // TODO(F-335): Avoid doing the following call here. + await this.stateHandler.cycleJob(); return toForeignCallResult([toArray(returnValues)]); } @@ -1074,6 +1087,8 @@ export class RPCTranslator { const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall); + // TODO(F-335): Avoid doing the following call here. + await this.stateHandler.cycleJob(); return toForeignCallResult([toArray(returnValues)]); } diff --git a/yarn-project/txe/src/state_machine/dummy_p2p_client.ts b/yarn-project/txe/src/state_machine/dummy_p2p_client.ts index db9c94b94942..4958f8773169 100644 --- a/yarn-project/txe/src/state_machine/dummy_p2p_client.ts +++ b/yarn-project/txe/src/state_machine/dummy_p2p_client.ts @@ -17,11 +17,11 @@ import type { } from '@aztec/p2p'; import type { EthAddress, L2BlockStreamEvent, L2Tips } from '@aztec/stdlib/block'; import type { ITxProvider, PeerInfo } from '@aztec/stdlib/interfaces/server'; -import type { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p'; +import type { BlockProposal, CheckpointAttestation, CheckpointProposal, TopicType } from '@aztec/stdlib/p2p'; import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx'; export class DummyP2P implements P2P { - public validate(_txs: Tx[]): Promise { + public validateTxsReceivedInBlockProposal(_txs: Tx[]): Promise { return Promise.resolve(); } @@ -41,6 +41,10 @@ export class DummyP2P implements P2P { throw new Error('DummyP2P does not implement "getPeers"'); } + public getGossipMeshPeerCount(_topicType: TopicType): Promise { + return Promise.resolve(0); + } + public broadcastProposal(_proposal: BlockProposal): Promise { throw new Error('DummyP2P does not implement "broadcastProposal"'); } diff --git a/yarn-project/txe/src/txe_session.ts b/yarn-project/txe/src/txe_session.ts index 5f6f2598cd4a..5c7b87ea4feb 100644 --- a/yarn-project/txe/src/txe_session.ts +++ b/yarn-project/txe/src/txe_session.ts @@ -3,12 +3,12 @@ import { Fr } from '@aztec/foundation/curves/bn254'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { KeyStore } from '@aztec/key-store'; import { openTmpStore } from '@aztec/kv-store/lmdb-v2'; -import type { ProtocolContract } from '@aztec/protocol-contracts'; import type { AccessScopes } from '@aztec/pxe/client/lazy'; import { AddressStore, AnchorBlockStore, CapsuleStore, + ContractStore, JobCoordinator, NoteService, NoteStore, @@ -55,7 +55,6 @@ import { TXEArchiver } from './state_machine/archiver.js'; import { TXEStateMachine } from './state_machine/index.js'; import type { ForeignCallArgs, ForeignCallResult } from './util/encoding.js'; import { TXEAccountStore } from './util/txe_account_store.js'; -import { TXEContractStore } from './util/txe_contract_store.js'; import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from './utils/block_creation.js'; import { makeTxEffect } from './utils/tx_effect_creation.js'; @@ -114,6 +113,10 @@ export interface TXESessionStateHandler { enterPublicState(contractAddress?: AztecAddress): Promise; enterPrivateState(contractAddress?: AztecAddress, anchorBlockNumber?: BlockNumber): Promise; enterUtilityState(contractAddress?: AztecAddress): Promise; + + // TODO(F-335): Exposing the job info is abstraction breakage - drop the following 2 functions. + cycleJob(): Promise; + getCurrentJob(): string; } /** @@ -132,7 +135,7 @@ export class TXESession implements TXESessionStateHandler { | IPrivateExecutionOracle | IAvmExecutionOracle | ITxeExecutionOracle, - private contractStore: TXEContractStore, + private contractStore: ContractStore, private noteStore: NoteStore, private keyStore: KeyStore, private addressStore: AddressStore, @@ -149,12 +152,11 @@ export class TXESession implements TXESessionStateHandler { private nextBlockTimestamp: bigint, ) {} - static async init(protocolContracts: ProtocolContract[]) { + static async init(contractStore: ContractStore) { const store = await openTmpStore('txe-session'); const addressStore = new AddressStore(store); const privateEventStore = new PrivateEventStore(store); - const contractStore = new TXEContractStore(store); const noteStore = new NoteStore(store); const senderTaggingStore = new SenderTaggingStore(store); const recipientTaggingStore = new RecipientTaggingStore(store); @@ -173,12 +175,6 @@ export class TXESession implements TXESessionStateHandler { noteStore, ]); - // Register protocol contracts. - for (const { contractClass, instance, artifact } of protocolContracts) { - await contractStore.addContractArtifact(contractClass.id, artifact); - await contractStore.addContractInstance(instance); - } - const archiver = new TXEArchiver(store); const anchorBlockStore = new AnchorBlockStore(store); const stateMachine = await TXEStateMachine.create(archiver, anchorBlockStore, contractStore, noteStore); @@ -201,7 +197,6 @@ export class TXESession implements TXESessionStateHandler { senderAddressBookStore, capsuleStore, privateEventStore, - initialJobId, nextBlockTimestamp, version, chainId, @@ -262,6 +257,17 @@ export class TXESession implements TXESessionStateHandler { } } + getCurrentJob(): string { + return this.currentJobId; + } + + /** Commits the current job and begins a new one. Returns the new job ID. */ + async cycleJob(): Promise { + await this.jobCoordinator.commitJob(this.currentJobId); + this.currentJobId = this.jobCoordinator.beginJob(); + return this.currentJobId; + } + async enterTopLevelState() { switch (this.state.name) { case 'PRIVATE': { @@ -285,8 +291,7 @@ export class TXESession implements TXESessionStateHandler { } // Commit all staged stores from the job that was just completed, then begin a new job - await this.jobCoordinator.commitJob(this.currentJobId); - this.currentJobId = this.jobCoordinator.beginJob(); + await this.cycleJob(); this.oracleHandler = new TXEOracleTopLevelContext( this.stateMachine, @@ -300,7 +305,6 @@ export class TXESession implements TXESessionStateHandler { this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, - this.currentJobId, this.nextBlockTimestamp, this.version, this.chainId, diff --git a/yarn-project/txe/src/util/txe_contract_store.ts b/yarn-project/txe/src/util/txe_contract_store.ts deleted file mode 100644 index 4ca375531318..000000000000 --- a/yarn-project/txe/src/util/txe_contract_store.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { ContractArtifact } from '@aztec/aztec.js/abi'; -import { Fr } from '@aztec/aztec.js/fields'; -import { ContractStore } from '@aztec/pxe/server'; - -export type ContractArtifactWithHash = ContractArtifact & { artifactHash: Fr }; - -/* - * A contract store that stores contract artifacts with their hashes. Since - * TXE typically deploys the same contract again and again for multiple tests, caching - * the *very* expensive artifact hash computation improves testing speed significantly. - */ -export class TXEContractStore extends ContractStore { - #artifactHashes: Map = new Map(); - - public override async addContractArtifact( - id: Fr, - artifact: ContractArtifact | ContractArtifactWithHash, - ): Promise { - if ('artifactHash' in artifact) { - this.#artifactHashes.set(id.toString(), artifact.artifactHash.toBuffer()); - } - await super.addContractArtifact(id, artifact); - } - - public override async getContractArtifact( - contractClassId: Fr, - ): Promise { - const artifact = await super.getContractArtifact(contractClassId); - if (artifact && this.#artifactHashes.has(contractClassId.toString())) { - (artifact as ContractArtifactWithHash).artifactHash = Fr.fromBuffer( - this.#artifactHashes.get(contractClassId.toString())!, - ); - } - return artifact; - } -} diff --git a/yarn-project/txe/src/util/txe_public_contract_data_source.ts b/yarn-project/txe/src/util/txe_public_contract_data_source.ts index 0ec38ae2dcd2..8573d54ee6c8 100644 --- a/yarn-project/txe/src/util/txe_public_contract_data_source.ts +++ b/yarn-project/txe/src/util/txe_public_contract_data_source.ts @@ -1,19 +1,11 @@ import { BlockNumber } from '@aztec/foundation/branded-types'; import { Fr } from '@aztec/foundation/curves/bn254'; import type { ContractStore } from '@aztec/pxe/server'; -import { type ContractArtifact, FunctionSelector, FunctionType } from '@aztec/stdlib/abi'; +import { type ContractArtifact, FunctionSelector } from '@aztec/stdlib/abi'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; -import { - type ContractClassPublic, - type ContractDataSource, - type ContractInstanceWithAddress, - computePrivateFunctionsRoot, - computePublicBytecodeCommitment, - getContractClassPrivateFunctionFromArtifact, -} from '@aztec/stdlib/contract'; +import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract'; export class TXEPublicContractDataSource implements ContractDataSource { - #privateFunctionsRoot: Map = new Map(); constructor( private blockNumber: BlockNumber, private contractStore: ContractStore, @@ -24,42 +16,24 @@ export class TXEPublicContractDataSource implements ContractDataSource { } async getContractClass(id: Fr): Promise { - const contractClass = await this.contractStore.getContractClass(id); + const contractClass = await this.contractStore.getContractClassWithPreimage(id); if (!contractClass) { return; } - const artifact = await this.contractStore.getContractArtifact(id); - if (!artifact) { - return; - } - - let privateFunctionsRoot; - if (!this.#privateFunctionsRoot.has(id.toString())) { - const privateFunctions = await Promise.all( - artifact.functions - .filter(fn => fn.functionType === FunctionType.PRIVATE) - .map(fn => getContractClassPrivateFunctionFromArtifact(fn)), - ); - privateFunctionsRoot = await computePrivateFunctionsRoot(privateFunctions); - this.#privateFunctionsRoot.set(id.toString(), privateFunctionsRoot.toBuffer()); - } else { - privateFunctionsRoot = Fr.fromBuffer(this.#privateFunctionsRoot.get(id.toString())!); - } - return { - id, - artifactHash: contractClass!.artifactHash, - packedBytecode: contractClass!.packedBytecode, - privateFunctionsRoot, - version: contractClass!.version, + id: contractClass.id, + artifactHash: contractClass.artifactHash, + packedBytecode: contractClass.packedBytecode, + privateFunctionsRoot: contractClass.privateFunctionsRoot, + version: contractClass.version, privateFunctions: [], utilityFunctions: [], }; } async getBytecodeCommitment(id: Fr): Promise { - const contractClass = await this.contractStore.getContractClass(id); - return contractClass && computePublicBytecodeCommitment(contractClass.packedBytecode); + const contractClass = await this.contractStore.getContractClassWithPreimage(id); + return contractClass?.publicBytecodeCommitment; } async getContract(address: AztecAddress): Promise { diff --git a/yarn-project/validator-client/src/checkpoint_builder.test.ts b/yarn-project/validator-client/src/checkpoint_builder.test.ts index 76899d131bdd..38945d92aa4e 100644 --- a/yarn-project/validator-client/src/checkpoint_builder.test.ts +++ b/yarn-project/validator-client/src/checkpoint_builder.test.ts @@ -95,6 +95,7 @@ describe('CheckpointBuilder', () => { [], // usedTxs [], // returnValues 0, // usedTxBlobFields + [], // debugLogs ]); const result = await checkpointBuilder.buildBlock([], blockNumber, 1000n); @@ -118,6 +119,7 @@ describe('CheckpointBuilder', () => { [], // usedTxs [], // returnValues 0, // usedTxBlobFields + [], // debugLogs ]); const result = await checkpointBuilder.buildBlock([], blockNumber, 1000n); @@ -137,6 +139,7 @@ describe('CheckpointBuilder', () => { [], // usedTxs [], // returnValues 0, // usedTxBlobFields + [], // debugLogs ]); await expect(checkpointBuilder.buildBlock([], blockNumber, 1000n)).rejects.toThrow(NoValidTxsError); diff --git a/yarn-project/validator-client/src/checkpoint_builder.ts b/yarn-project/validator-client/src/checkpoint_builder.ts index 7805f431610b..9d26252c0a23 100644 --- a/yarn-project/validator-client/src/checkpoint_builder.ts +++ b/yarn-project/validator-client/src/checkpoint_builder.ts @@ -4,7 +4,7 @@ import { Fr } from '@aztec/foundation/curves/bn254'; import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log'; import { bufferToHex } from '@aztec/foundation/string'; import { DateProvider, elapsed } from '@aztec/foundation/timer'; -import { getDefaultAllowedSetupFunctions } from '@aztec/p2p/msg_validators'; +import { createTxValidatorForBlockBuilding, getDefaultAllowedSetupFunctions } from '@aztec/p2p/msg_validators'; import { LightweightCheckpointBuilder } from '@aztec/prover-client/light'; import { GuardedMerkleTreeOperations, @@ -28,12 +28,11 @@ import { type PublicProcessorLimits, type WorldStateSynchronizer, } from '@aztec/stdlib/interfaces/server'; +import { type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs'; import { MerkleTreeId } from '@aztec/stdlib/trees'; import { type CheckpointGlobalVariables, GlobalVariables, StateReference, Tx } from '@aztec/stdlib/tx'; import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client'; -import { createValidatorForBlockBuilding } from './tx_validator/tx_validator_factory.js'; - // Re-export for backward compatibility export type { BuildBlockInCheckpointResult } from '@aztec/stdlib/interfaces/server'; @@ -52,6 +51,7 @@ export class CheckpointBuilder implements ICheckpointBlockBuilder { private dateProvider: DateProvider, private telemetryClient: TelemetryClient, bindings?: LoggerBindings, + private debugLogStore: DebugLogStore = new NullDebugLogStore(), ) { this.log = createLogger('checkpoint-builder', { ...bindings, @@ -152,6 +152,8 @@ export class CheckpointBuilder implements ICheckpointBlockBuilder { const contractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings()); const guardedFork = new GuardedMerkleTreeOperations(fork); + const collectDebugLogs = this.debugLogStore.isEnabled; + const bindings = this.log.getBindings(); const publicTxSimulator = createPublicTxSimulatorForBlockBuilding( guardedFork, @@ -159,6 +161,7 @@ export class CheckpointBuilder implements ICheckpointBlockBuilder { globalVariables, this.telemetryClient, bindings, + collectDebugLogs, ); const processor = new PublicProcessor( @@ -170,9 +173,10 @@ export class CheckpointBuilder implements ICheckpointBlockBuilder { this.telemetryClient, createLogger('simulator:public-processor', bindings), this.config, + this.debugLogStore, ); - const validator = createValidatorForBlockBuilding( + const validator = createTxValidatorForBlockBuilding( fork, this.contractDataSource, globalVariables, @@ -197,6 +201,7 @@ export class FullNodeCheckpointsBuilder implements ICheckpointsBuilder { private contractDataSource: ContractDataSource, private dateProvider: DateProvider, private telemetryClient: TelemetryClient = getTelemetryClient(), + private debugLogStore: DebugLogStore = new NullDebugLogStore(), ) { this.log = createLogger('checkpoint-builder'); } @@ -251,6 +256,7 @@ export class FullNodeCheckpointsBuilder implements ICheckpointsBuilder { this.dateProvider, this.telemetryClient, bindings, + this.debugLogStore, ); } @@ -311,6 +317,7 @@ export class FullNodeCheckpointsBuilder implements ICheckpointsBuilder { this.dateProvider, this.telemetryClient, bindings, + this.debugLogStore, ); } diff --git a/yarn-project/validator-client/src/factory.ts b/yarn-project/validator-client/src/factory.ts index f2cc3e4d80e7..eacdb5322965 100644 --- a/yarn-project/validator-client/src/factory.ts +++ b/yarn-project/validator-client/src/factory.ts @@ -29,6 +29,7 @@ export function createBlockProposalHandler( const metrics = new ValidatorMetrics(deps.telemetry); const blockProposalValidator = new BlockProposalValidator(deps.epochCache, { txsPermitted: !config.disableTransactions, + maxTxsPerBlock: config.maxTxsPerBlock, }); return new BlockProposalHandler( deps.checkpointsBuilder, diff --git a/yarn-project/validator-client/src/index.ts b/yarn-project/validator-client/src/index.ts index 32621c149525..e1bb317f9f81 100644 --- a/yarn-project/validator-client/src/index.ts +++ b/yarn-project/validator-client/src/index.ts @@ -4,4 +4,3 @@ export * from './config.js'; export * from './factory.js'; export * from './validator.js'; export * from './key_store/index.js'; -export * from './tx_validator/index.js'; diff --git a/yarn-project/validator-client/src/tx_validator/index.ts b/yarn-project/validator-client/src/tx_validator/index.ts deleted file mode 100644 index 5d460503cdbc..000000000000 --- a/yarn-project/validator-client/src/tx_validator/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './nullifier_cache.js'; -export * from './tx_validator_factory.js'; diff --git a/yarn-project/validator-client/src/tx_validator/tx_validator_factory.ts b/yarn-project/validator-client/src/tx_validator/tx_validator_factory.ts deleted file mode 100644 index 48d0cf3d2a38..000000000000 --- a/yarn-project/validator-client/src/tx_validator/tx_validator_factory.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { BlockNumber } from '@aztec/foundation/branded-types'; -import { Fr } from '@aztec/foundation/curves/bn254'; -import type { LoggerBindings } from '@aztec/foundation/log'; -import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree'; -import { - AggregateTxValidator, - ArchiveCache, - BlockHeaderTxValidator, - DataTxValidator, - DoubleSpendTxValidator, - GasTxValidator, - MetadataTxValidator, - PhasesTxValidator, - SizeTxValidator, - TimestampTxValidator, - TxPermittedValidator, - TxProofValidator, -} from '@aztec/p2p'; -import { ProtocolContractAddress, protocolContractsHash } from '@aztec/protocol-contracts'; -import type { ContractDataSource } from '@aztec/stdlib/contract'; -import type { GasFees } from '@aztec/stdlib/gas'; -import type { - AllowedElement, - ClientProtocolCircuitVerifier, - MerkleTreeReadOperations, - PublicProcessorValidator, -} from '@aztec/stdlib/interfaces/server'; -import { DatabasePublicStateSource, type PublicStateSource } from '@aztec/stdlib/trees'; -import { GlobalVariables, type Tx, type TxValidator } from '@aztec/stdlib/tx'; -import type { UInt64 } from '@aztec/stdlib/types'; - -import { NullifierCache } from './nullifier_cache.js'; - -export function createValidatorForAcceptingTxs( - db: MerkleTreeReadOperations, - contractDataSource: ContractDataSource, - verifier: ClientProtocolCircuitVerifier | undefined, - { - l1ChainId, - rollupVersion, - setupAllowList, - gasFees, - skipFeeEnforcement, - timestamp, - blockNumber, - txsPermitted, - }: { - l1ChainId: number; - rollupVersion: number; - setupAllowList: AllowedElement[]; - gasFees: GasFees; - skipFeeEnforcement?: boolean; - timestamp: UInt64; - blockNumber: BlockNumber; - txsPermitted: boolean; - }, - bindings?: LoggerBindings, -): TxValidator { - const validators: TxValidator[] = [ - new TxPermittedValidator(txsPermitted, bindings), - new SizeTxValidator(bindings), - new DataTxValidator(bindings), - new MetadataTxValidator( - { - l1ChainId: new Fr(l1ChainId), - rollupVersion: new Fr(rollupVersion), - protocolContractsHash, - vkTreeRoot: getVKTreeRoot(), - }, - bindings, - ), - new TimestampTxValidator( - { - timestamp, - blockNumber, - }, - bindings, - ), - new DoubleSpendTxValidator(new NullifierCache(db), bindings), - new PhasesTxValidator(contractDataSource, setupAllowList, timestamp, bindings), - new BlockHeaderTxValidator(new ArchiveCache(db), bindings), - ]; - - if (!skipFeeEnforcement) { - validators.push( - new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings), - ); - } - - if (verifier) { - validators.push(new TxProofValidator(verifier, bindings)); - } - - return new AggregateTxValidator(...validators); -} - -export function createValidatorForBlockBuilding( - db: MerkleTreeReadOperations, - contractDataSource: ContractDataSource, - globalVariables: GlobalVariables, - setupAllowList: AllowedElement[], - bindings?: LoggerBindings, -): PublicProcessorValidator { - const nullifierCache = new NullifierCache(db); - const archiveCache = new ArchiveCache(db); - const publicStateSource = new DatabasePublicStateSource(db); - - return { - preprocessValidator: preprocessValidator( - nullifierCache, - archiveCache, - publicStateSource, - contractDataSource, - globalVariables, - setupAllowList, - bindings, - ), - nullifierCache, - }; -} - -function preprocessValidator( - nullifierCache: NullifierCache, - archiveCache: ArchiveCache, - publicStateSource: PublicStateSource, - contractDataSource: ContractDataSource, - globalVariables: GlobalVariables, - setupAllowList: AllowedElement[], - bindings?: LoggerBindings, -): TxValidator { - // We don't include the TxProofValidator nor the DataTxValidator here because they are already checked by the time we get to block building. - return new AggregateTxValidator( - new MetadataTxValidator( - { - l1ChainId: globalVariables.chainId, - rollupVersion: globalVariables.version, - protocolContractsHash, - vkTreeRoot: getVKTreeRoot(), - }, - bindings, - ), - new TimestampTxValidator( - { - timestamp: globalVariables.timestamp, - blockNumber: globalVariables.blockNumber, - }, - bindings, - ), - new DoubleSpendTxValidator(nullifierCache, bindings), - new PhasesTxValidator(contractDataSource, setupAllowList, globalVariables.timestamp, bindings), - new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, globalVariables.gasFees, bindings), - new BlockHeaderTxValidator(archiveCache, bindings), - ); -} diff --git a/yarn-project/validator-client/src/validator.test.ts b/yarn-project/validator-client/src/validator.test.ts index 7485939da4fc..7d9c4b975288 100644 --- a/yarn-project/validator-client/src/validator.test.ts +++ b/yarn-project/validator-client/src/validator.test.ts @@ -327,7 +327,6 @@ describe('ValidatorClient', () => { p2pClient.getTxStatus.mockResolvedValue('pending'); p2pClient.hasTxsInPool.mockImplementation(txHashes => Promise.resolve(times(txHashes.length, () => true))); - p2pClient.getTxsByHash.mockImplementation((txHashes: TxHash[]) => Promise.resolve(txHashes.map(makeTxFromHash))); txProvider.getTxsForBlockProposal.mockImplementation((proposal: BlockProposal) => Promise.resolve({ diff --git a/yarn-project/validator-client/src/validator.ts b/yarn-project/validator-client/src/validator.ts index a1a8e112b264..fd0ae9852837 100644 --- a/yarn-project/validator-client/src/validator.ts +++ b/yarn-project/validator-client/src/validator.ts @@ -197,6 +197,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter) const metrics = new ValidatorMetrics(telemetry); const blockProposalValidator = new BlockProposalValidator(epochCache, { txsPermitted: !config.disableTransactions, + maxTxsPerBlock: config.maxTxsPerBlock, }); const blockProposalHandler = new BlockProposalHandler( checkpointsBuilder, diff --git a/yarn-project/wallet-sdk/src/base-wallet/base_wallet.test.ts b/yarn-project/wallet-sdk/src/base-wallet/base_wallet.test.ts index ac3983ce72ae..2b2c4cc5e300 100644 --- a/yarn-project/wallet-sdk/src/base-wallet/base_wallet.test.ts +++ b/yarn-project/wallet-sdk/src/base-wallet/base_wallet.test.ts @@ -88,6 +88,7 @@ describe('BaseWallet', () => { txEffect: TxEffect.empty(), publicReturnValues: [optimizedRv0, optimizedRv1], gasUsed: { totalGas: Gas.empty(), teardownGas: Gas.empty(), publicGas: Gas.empty(), billedGas: Gas.empty() }, + debugLogs: [], }; node.simulatePublicCalls.mockResolvedValue(optimizedPublicOutput); @@ -98,6 +99,7 @@ describe('BaseWallet', () => { txEffect: TxEffect.empty(), publicReturnValues: [normalRv0], gasUsed: { totalGas: Gas.empty(), teardownGas: Gas.empty(), publicGas: Gas.empty(), billedGas: Gas.empty() }, + debugLogs: [], }; const normalResult = new TxSimulationResult( mock(), diff --git a/yarn-project/wallet-sdk/src/base-wallet/base_wallet.ts b/yarn-project/wallet-sdk/src/base-wallet/base_wallet.ts index 72cfe026eb35..406d4942e75d 100644 --- a/yarn-project/wallet-sdk/src/base-wallet/base_wallet.ts +++ b/yarn-project/wallet-sdk/src/base-wallet/base_wallet.ts @@ -8,12 +8,12 @@ import type { AppCapabilities, BatchResults, BatchedMethod, + ExecuteUtilityOptions, PrivateEvent, PrivateEventFilter, ProfileOptions, SendOptions, SimulateOptions, - SimulateUtilityOptions, Wallet, WalletCapabilities, } from '@aztec/aztec.js/wallet'; @@ -28,7 +28,7 @@ import type { ChainInfo } from '@aztec/entrypoints/interfaces'; import { Fr } from '@aztec/foundation/curves/bn254'; import { createLogger } from '@aztec/foundation/log'; import type { FieldsOf } from '@aztec/foundation/types'; -import type { AccessScopes } from '@aztec/pxe/client/lazy'; +import { type AccessScopes, displayDebugLogs } from '@aztec/pxe/client/lazy'; import type { PXE, PackedPrivateEvent } from '@aztec/pxe/server'; import { type ContractArtifact, @@ -52,7 +52,7 @@ import { type TxExecutionRequest, type TxProfileResult, TxSimulationResult, - type UtilitySimulationResult, + type UtilityExecutionResult, } from '@aztec/stdlib/tx'; import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx'; @@ -348,6 +348,7 @@ export abstract class BaseWallet implements Wallet { feeOptions.gasSettings, blockHeader, opts.skipFeeEnforcement ?? true, + this.getContractName.bind(this), ) : Promise.resolve([]), remainingCalls.length > 0 @@ -400,7 +401,27 @@ export abstract class BaseWallet implements Wallet { // Otherwise, wait for the full receipt (default behavior on wait: undefined) const waitOpts = typeof opts.wait === 'object' ? opts.wait : undefined; - return (await waitForTx(this.aztecNode, txHash, waitOpts)) as SendReturn; + const receipt = await waitForTx(this.aztecNode, txHash, waitOpts); + + // Display debug logs from public execution if present (served in test mode only) + if (receipt.debugLogs?.length) { + await displayDebugLogs(receipt.debugLogs, this.getContractName.bind(this)); + } + + return receipt as SendReturn; + } + + /** + * Resolves a contract address to a human-readable name via PXE, if available. + * @param address - The contract address to resolve. + */ + protected async getContractName(address: AztecAddress): Promise { + const instance = await this.pxe.getContractInstance(address); + if (!instance) { + return undefined; + } + const artifact = await this.pxe.getContractArtifact(instance.currentContractClassId); + return artifact?.name; } protected contextualizeError(err: Error, ...context: string[]): Error { @@ -417,8 +438,8 @@ export abstract class BaseWallet implements Wallet { return err; } - simulateUtility(call: FunctionCall, opts: SimulateUtilityOptions): Promise { - return this.pxe.simulateUtility(call, { authwits: opts.authWitnesses, scopes: [opts.scope] }); + executeUtility(call: FunctionCall, opts: ExecuteUtilityOptions): Promise { + return this.pxe.executeUtility(call, { authwits: opts.authWitnesses, scopes: [opts.scope] }); } async getPrivateEvents( diff --git a/yarn-project/wallet-sdk/src/base-wallet/utils.ts b/yarn-project/wallet-sdk/src/base-wallet/utils.ts index 81737e7674dc..24153108d8ce 100644 --- a/yarn-project/wallet-sdk/src/base-wallet/utils.ts +++ b/yarn-project/wallet-sdk/src/base-wallet/utils.ts @@ -4,6 +4,8 @@ import type { ChainInfo } from '@aztec/entrypoints/interfaces'; import { makeTuple } from '@aztec/foundation/array'; import { Fr } from '@aztec/foundation/curves/bn254'; import type { Tuple } from '@aztec/foundation/serialize'; +import type { ContractNameResolver } from '@aztec/pxe/client/lazy'; +import { displayDebugLogs } from '@aztec/pxe/client/lazy'; import { generateSimulatedProvingResult } from '@aztec/pxe/simulator'; import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; @@ -72,6 +74,7 @@ async function simulateBatchViaNode( gasSettings: GasSettings, blockHeader: BlockHeader, skipFeeEnforcement: boolean, + getContractName: ContractNameResolver, ): Promise { const txContext = new TxContext(chainInfo.chainId, chainInfo.version, gasSettings); @@ -145,6 +148,9 @@ async function simulateBatchViaNode( throw publicOutput.revertReason; } + // Display debug logs from the public simulation. + await displayDebugLogs(publicOutput.debugLogs, getContractName); + return new TxSimulationResult(privateResult, provingResult.publicInputs, publicOutput, undefined); } @@ -169,6 +175,7 @@ export async function simulateViaNode( gasSettings: GasSettings, blockHeader: BlockHeader, skipFeeEnforcement: boolean = true, + getContractName: ContractNameResolver, ): Promise { const batches: FunctionCall[][] = []; @@ -187,6 +194,7 @@ export async function simulateViaNode( gasSettings, blockHeader, skipFeeEnforcement, + getContractName, ); results.push(result); } diff --git a/yarn-project/wallets/src/embedded/embedded_wallet.ts b/yarn-project/wallets/src/embedded/embedded_wallet.ts index bcb373985b4c..e1f69cf6ad09 100644 --- a/yarn-project/wallets/src/embedded/embedded_wallet.ts +++ b/yarn-project/wallets/src/embedded/embedded_wallet.ts @@ -180,10 +180,15 @@ export class EmbeddedWallet extends BaseWallet { const accountManager = await AccountManager.create(this, secret, contract, salt); const instance = accountManager.getInstance(); - const artifact = await accountManager.getAccountContract().getContractArtifact(); - - await this.registerContract(instance, artifact, accountManager.getSecretKey()); - + const existingInstance = await this.pxe.getContractInstance(instance.address); + if (!existingInstance) { + const existingArtifact = await this.pxe.getContractArtifact(instance.currentContractClassId); + await this.registerContract( + instance, + !existingArtifact ? await accountManager.getAccountContract().getContractArtifact() : undefined, + accountManager.getSecretKey(), + ); + } return accountManager; } diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 75b235c07906..cb1b1d09ce4d 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -143,574 +143,551 @@ __metadata: linkType: hard "@aws-sdk/client-s3@npm:^3.892.0": - version: 3.892.0 - resolution: "@aws-sdk/client-s3@npm:3.892.0" + version: 3.998.0 + resolution: "@aws-sdk/client-s3@npm:3.998.0" dependencies: "@aws-crypto/sha1-browser": "npm:5.2.0" "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/credential-provider-node": "npm:3.891.0" - "@aws-sdk/middleware-bucket-endpoint": "npm:3.890.0" - "@aws-sdk/middleware-expect-continue": "npm:3.891.0" - "@aws-sdk/middleware-flexible-checksums": "npm:3.892.0" - "@aws-sdk/middleware-host-header": "npm:3.891.0" - "@aws-sdk/middleware-location-constraint": "npm:3.891.0" - "@aws-sdk/middleware-logger": "npm:3.891.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.891.0" - "@aws-sdk/middleware-sdk-s3": "npm:3.891.0" - "@aws-sdk/middleware-ssec": "npm:3.891.0" - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/region-config-resolver": "npm:3.890.0" - "@aws-sdk/signature-v4-multi-region": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@aws-sdk/util-user-agent-browser": "npm:3.887.0" - "@aws-sdk/util-user-agent-node": "npm:3.891.0" - "@aws-sdk/xml-builder": "npm:3.887.0" - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/core": "npm:^3.11.0" - "@smithy/eventstream-serde-browser": "npm:^4.1.1" - "@smithy/eventstream-serde-config-resolver": "npm:^4.2.1" - "@smithy/eventstream-serde-node": "npm:^4.1.1" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/hash-blob-browser": "npm:^4.1.1" - "@smithy/hash-node": "npm:^4.1.1" - "@smithy/hash-stream-node": "npm:^4.1.1" - "@smithy/invalid-dependency": "npm:^4.1.1" - "@smithy/md5-js": "npm:^4.1.1" - "@smithy/middleware-content-length": "npm:^4.1.1" - "@smithy/middleware-endpoint": "npm:^4.2.2" - "@smithy/middleware-retry": "npm:^4.2.3" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-body-length-node": "npm:^4.1.0" - "@smithy/util-defaults-mode-browser": "npm:^4.1.2" - "@smithy/util-defaults-mode-node": "npm:^4.1.2" - "@smithy/util-endpoints": "npm:^3.1.2" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@smithy/util-stream": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.1.0" - "@smithy/util-waiter": "npm:^4.1.1" - "@types/uuid": "npm:^9.0.1" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/credential-provider-node": "npm:^3.972.13" + "@aws-sdk/middleware-bucket-endpoint": "npm:^3.972.5" + "@aws-sdk/middleware-expect-continue": "npm:^3.972.5" + "@aws-sdk/middleware-flexible-checksums": "npm:^3.973.0" + "@aws-sdk/middleware-host-header": "npm:^3.972.5" + "@aws-sdk/middleware-location-constraint": "npm:^3.972.5" + "@aws-sdk/middleware-logger": "npm:^3.972.5" + "@aws-sdk/middleware-recursion-detection": "npm:^3.972.5" + "@aws-sdk/middleware-sdk-s3": "npm:^3.972.14" + "@aws-sdk/middleware-ssec": "npm:^3.972.5" + "@aws-sdk/middleware-user-agent": "npm:^3.972.14" + "@aws-sdk/region-config-resolver": "npm:^3.972.5" + "@aws-sdk/signature-v4-multi-region": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-endpoints": "npm:^3.996.2" + "@aws-sdk/util-user-agent-browser": "npm:^3.972.5" + "@aws-sdk/util-user-agent-node": "npm:^3.972.13" + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/core": "npm:^3.23.6" + "@smithy/eventstream-serde-browser": "npm:^4.2.10" + "@smithy/eventstream-serde-config-resolver": "npm:^4.3.10" + "@smithy/eventstream-serde-node": "npm:^4.2.10" + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/hash-blob-browser": "npm:^4.2.11" + "@smithy/hash-node": "npm:^4.2.10" + "@smithy/hash-stream-node": "npm:^4.2.10" + "@smithy/invalid-dependency": "npm:^4.2.10" + "@smithy/md5-js": "npm:^4.2.10" + "@smithy/middleware-content-length": "npm:^4.2.10" + "@smithy/middleware-endpoint": "npm:^4.4.20" + "@smithy/middleware-retry": "npm:^4.4.37" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/middleware-stack": "npm:^4.2.10" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-body-length-browser": "npm:^4.2.1" + "@smithy/util-body-length-node": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.36" + "@smithy/util-defaults-mode-node": "npm:^4.2.39" + "@smithy/util-endpoints": "npm:^3.3.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-retry": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" + "@smithy/util-waiter": "npm:^4.2.10" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10/a17a07f5a2764b3995485fd3d804cc3187001f33f23751938bb8ae03e5777af4b41d9e95950a7a445b2d091ba09eccd6c7797be9eee65f94b53362a5d300d100 + checksum: 10/b8b73b16e5b33f44169545d7b3a69085af1571913fd1ab3a90e136007bef4b601eef9c9c78a271066faa5807ff9b75a9d0a86dc469a0a42928c0ccf20e0416c0 + languageName: node + linkType: hard + +"@aws-sdk/core@npm:^3.973.14": + version: 3.973.14 + resolution: "@aws-sdk/core@npm:3.973.14" + dependencies: + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/xml-builder": "npm:^3.972.7" + "@smithy/core": "npm:^3.23.6" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/signature-v4": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-utf8": "npm:^4.2.1" + tslib: "npm:^2.6.2" + checksum: 10/8ca24fc9542aa92c082636b2fce8a2b6df6c588042e3a97f566420351459207a8bd37e6c469d1b8e8101ecb8e033ef5d1de990fdfb36397d0f48fd79caf47a0e languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/client-sso@npm:3.891.0" +"@aws-sdk/crc64-nvme@npm:^3.972.2": + version: 3.972.2 + resolution: "@aws-sdk/crc64-nvme@npm:3.972.2" dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/middleware-host-header": "npm:3.891.0" - "@aws-sdk/middleware-logger": "npm:3.891.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.891.0" - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/region-config-resolver": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@aws-sdk/util-user-agent-browser": "npm:3.887.0" - "@aws-sdk/util-user-agent-node": "npm:3.891.0" - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/core": "npm:^3.11.0" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/hash-node": "npm:^4.1.1" - "@smithy/invalid-dependency": "npm:^4.1.1" - "@smithy/middleware-content-length": "npm:^4.1.1" - "@smithy/middleware-endpoint": "npm:^4.2.2" - "@smithy/middleware-retry": "npm:^4.2.3" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-body-length-node": "npm:^4.1.0" - "@smithy/util-defaults-mode-browser": "npm:^4.1.2" - "@smithy/util-defaults-mode-node": "npm:^4.1.2" - "@smithy/util-endpoints": "npm:^3.1.2" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/03bbff822df8ea9eec181c552823410417700049f0f315e98535eb2d9b0c0a67fb5a45d1ef77f8d8e13e89ea7e5c76e6b03f333f4d9dc8614a5666b1732b94d8 - languageName: node - linkType: hard - -"@aws-sdk/core@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/core@npm:3.890.0" - dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/xml-builder": "npm:3.887.0" - "@smithy/core": "npm:^3.11.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/signature-v4": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-utf8": "npm:^4.1.0" - fast-xml-parser: "npm:5.2.5" - tslib: "npm:^2.6.2" - checksum: 10/1b6c24c841076591adef95742cb91125c3d8fddb4da5e90e71095805caee51954bba510a90ac62b586fde886962c08cd6ba8bd2a4e328d7feca94a811eb874cd + checksum: 10/f29f7a96c281215189b66375e87502a9e7061effc39b6ad8b9a8d4477eca73dee61ff95cefcf465401619a8a927b359c845292b4719e57607754278dcd3e5abd languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.890.0" +"@aws-sdk/credential-provider-env@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-env@npm:3.972.12" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d8a3d755a85bdd49ec364d65578fecc5e6634e0632d0b6a5a530a8918688eaab70d3adcda8318306eb3f18ad2fbaaacf62093e4c7365de024fd11cfb1a8318ff + checksum: 10/b93aeb45989fa33129238b79dda4894dcde8f2e8fc08b9db88ddfc8e6e714397934fb648a897e81674541ca2d47bc4a8d8203630e21a313b690aa59bc6d8be70 languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.890.0" +"@aws-sdk/credential-provider-http@npm:^3.972.14": + version: 3.972.14 + resolution: "@aws-sdk/credential-provider-http@npm:3.972.14" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-stream": "npm:^4.3.1" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-stream": "npm:^4.5.15" tslib: "npm:^2.6.2" - checksum: 10/26260f64b90c4a6cb2a0682f2a96151799448b92e4e1b7ffbadd0a8267984a9be5b487ae6d6487e9a8ffb6a2d127f7da03213b139f8d6fe86e1c7d503034996d - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.891.0" - dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/credential-provider-env": "npm:3.890.0" - "@aws-sdk/credential-provider-http": "npm:3.890.0" - "@aws-sdk/credential-provider-process": "npm:3.890.0" - "@aws-sdk/credential-provider-sso": "npm:3.891.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.891.0" - "@aws-sdk/nested-clients": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/credential-provider-imds": "npm:^4.1.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + checksum: 10/2d5da972415d3ce26f77e65e9f044e9bcd1ca7a22ebd92c72a3c5fc1dc5676f24ee4260b4179680616a6ec2bd4ce8a59e8262af24b2a6b5ce32a17dea133b1a7 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-ini@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-ini@npm:3.972.12" + dependencies: + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/credential-provider-env": "npm:^3.972.12" + "@aws-sdk/credential-provider-http": "npm:^3.972.14" + "@aws-sdk/credential-provider-login": "npm:^3.972.12" + "@aws-sdk/credential-provider-process": "npm:^3.972.12" + "@aws-sdk/credential-provider-sso": "npm:^3.972.12" + "@aws-sdk/credential-provider-web-identity": "npm:^3.972.12" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/credential-provider-imds": "npm:^4.2.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/5b992d289948a3066432977ae85ed6ae08341ecb6260a51f36654d9ee69bfe3701cb301bc4d1ebb573451841f69419d695ca1bb3cc6d0479bf1760c2ab4712c9 + checksum: 10/5ceb4814c1408d3eafc23c490d08a17f6e4dbecf95687a62ee6e7299df5534d097cc7f800639ebe35c68935f80ae099d0a846a60e49304b310ec4eaaaca11d32 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.891.0" +"@aws-sdk/credential-provider-login@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-login@npm:3.972.12" dependencies: - "@aws-sdk/credential-provider-env": "npm:3.890.0" - "@aws-sdk/credential-provider-http": "npm:3.890.0" - "@aws-sdk/credential-provider-ini": "npm:3.891.0" - "@aws-sdk/credential-provider-process": "npm:3.890.0" - "@aws-sdk/credential-provider-sso": "npm:3.891.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/credential-provider-imds": "npm:^4.1.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/cb9606e4ef3c276227aa7ebae4c1b58cfd735a433ab753f854d88c6985013c062e0742dd77f572d4e0e25790ab72670692e7c7f366cf4682272ae8b8e21f1182 + checksum: 10/11465db821bd727beb2038e86f374ddfd8fb3f96b1643dc4875b0862f858fa8a0031a3c23a54baed2179b5cd14d62a292b84f08257642cf5ad34ae28683c9968 languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.890.0" +"@aws-sdk/credential-provider-node@npm:^3.972.13": + version: 3.972.13 + resolution: "@aws-sdk/credential-provider-node@npm:3.972.13" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/credential-provider-env": "npm:^3.972.12" + "@aws-sdk/credential-provider-http": "npm:^3.972.14" + "@aws-sdk/credential-provider-ini": "npm:^3.972.12" + "@aws-sdk/credential-provider-process": "npm:^3.972.12" + "@aws-sdk/credential-provider-sso": "npm:^3.972.12" + "@aws-sdk/credential-provider-web-identity": "npm:^3.972.12" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/credential-provider-imds": "npm:^4.2.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/57043a2f8c8d379660156838cafe5b32a1c839411f51d4ba9de80c266ea893169fbee17f126d385204c3cb0663a05e485366277099ecae56a9c469e62a8a8448 + checksum: 10/47b11d1b8b2cdd055b63b1acc8bc0a8fe9ae23d75e514d3f36eedc01180b5276b4d0cba1f3ad8aa100200e97f96e7b5683d9abdedb15ae629eff685f62add659 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.891.0" +"@aws-sdk/credential-provider-process@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-process@npm:3.972.12" dependencies: - "@aws-sdk/client-sso": "npm:3.891.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/token-providers": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/a034bea117500a0e7c48d537e5338be77688ba67412904af87e750e763bcf7b9925a2f7ddc939196829afdbaf8e2465adbbd1bb65a81ae6760eaf96811678fdb + checksum: 10/c2c587d8e31de880df899ab8c2be4f1d310ce73f4da85b5a1ff04de09f63ad720fd35f0f6d146b55026d06f846b6f0953591cf99023bca29b0d60623b8ff85db languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.891.0" +"@aws-sdk/credential-provider-sso@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-sso@npm:3.972.12" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/nested-clients": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/token-providers": "npm:3.998.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d15c3171d125c99614098672cc3f3517246344453981f301b6d723eb0dd5db7f9ebefebbcf94fdd03f948e083ade9cf789357cfc2f6bc2de5ab02041223c1e74 + checksum: 10/b22e3b184e4430a0fd267b9dbc30aac409d06632dcf83394aed503ae901f40a8a73ae014d82178415fa5bc12b9dbe28b078b601656e6ca0b6e8fafc86a30119d languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.890.0" +"@aws-sdk/credential-provider-web-identity@npm:^3.972.12": + version: 3.972.12 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.972.12" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-arn-parser": "npm:3.873.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/f6b1f5d5cc722fff3eb9454177cf9d38a8412463a59ee7e350381569c13bf6b94dde1fd9e64abc2fcb664b2df4232cfcca660742e7d12d697a32cbb154b2f457 + checksum: 10/ebb536035c21208e605529be4088c857e00ff27f808007eb1116cb0f83a44b650241197fbe590afea03c0cb7a6a0451965edd76df02156cbf33023962577c773 languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.891.0" +"@aws-sdk/middleware-bucket-endpoint@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-arn-parser": "npm:^3.972.2" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-config-provider": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/4e1ec09ab9b1398e4ad6ae840cfe62483f65ba2615a97b81ca26a4d8beea93da89d1360eadac0cf6645330316e50091755bf3cb928de8fe59dff3d89b754826a + checksum: 10/075b50d32458163ca2635f573e9327c4acfaac3f339d42fc93d0372713c7c4e66122ae2950a7505c9c5e91d5b50f2a929ce7b4b7c5fd3c52697a7155dabafc1b languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.892.0": - version: 3.892.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.892.0" +"@aws-sdk/middleware-expect-continue@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.972.5" + dependencies: + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + tslib: "npm:^2.6.2" + checksum: 10/ee57a4693bf8f09b6561321b6c3f814932a56ef431331b7875a5c3ca368df9b6181c5680fe1ca6a70f87065beac76a510033d9c866510b892fd0cfcf6cad2a31 + languageName: node + linkType: hard + +"@aws-sdk/middleware-flexible-checksums@npm:^3.973.0": + version: 3.973.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.973.0" dependencies: "@aws-crypto/crc32": "npm:5.2.0" "@aws-crypto/crc32c": "npm:5.2.0" "@aws-crypto/util": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/is-array-buffer": "npm:^4.1.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-stream": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.1.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/crc64-nvme": "npm:^3.972.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/is-array-buffer": "npm:^4.2.1" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/de67db1ed29faf665b501259a4241befd4fbf6f2e6b2626c7e526a8fbd5211a40c3a1a183bf42de62511928c60b0c7a9424a094a86ca4ede824963f218764320 + checksum: 10/0432367ec463b6616e410c8d5534d33b1cbdac7d4090251ead362f4989414f299c8fcdad4538c581b566441f96a7de821647929db12a7ae5db11226827b344c6 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.891.0" +"@aws-sdk/middleware-host-header@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-host-header@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d2e38a288303db64948869542c88474c8401c8730bb66e1ec0205d4175a1f9df78c9c1fe9cc3100450eff04a1dc8195ac96d7c042229c6eb04160d4a499d7d82 + checksum: 10/1111cb18fcb621ebe97ef4f5d7f6e2814a9b74143f7327412d99112b44e3b087f476f3099c30822a981d9113b1f3ce637d7d8c0d333e1117920fe539f9f118f9 languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.891.0" +"@aws-sdk/middleware-location-constraint@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/458904e299497fb228177252de8752b6ee061b3882b888538b13d1ee0a952d4df534740b5111465019eb39d6ccf4c253aa6140fc31acf1d1bbc95ee974af8125 + checksum: 10/61dad687d0db28ec9968d15cfb4815ffc84c8231c7ee830c9a6dbd53064ac4b885b2fd601a650446315b37dedc729bab2128426f8d7f5733e7aafbc4ac0db92d languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-logger@npm:3.891.0" +"@aws-sdk/middleware-logger@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-logger@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ae410515ea8c4933bb8861b225cf84253a146964644be62581bec793177d0f589da13d0d7fe1df679f11f3e22b1b7c5f5736e43abbab99fb4b550d74a1bfc745 + checksum: 10/c846998f69412d6b1e5e1f047a11c87c14ad1e28b049cf92a205269eb0ae28f0742ee28644580590407080783193b4995ecbeb397b4adfde251fcae8b2a98d57 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.891.0" +"@aws-sdk/middleware-recursion-detection@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@aws/lambda-invoke-store": "npm:^0.0.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@aws/lambda-invoke-store": "npm:^0.2.2" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/f69b35645b581049a35bd93ee31333aa9bd2885857867529cc6a5ebb7d67598538b76236c937802e288eeacecba975d125af7d070ea9c520e2327fac81eff0e4 - languageName: node - linkType: hard - -"@aws-sdk/middleware-sdk-s3@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.891.0" - dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-arn-parser": "npm:3.873.0" - "@smithy/core": "npm:^3.11.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/signature-v4": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-stream": "npm:^4.3.1" - "@smithy/util-utf8": "npm:^4.1.0" + checksum: 10/110e9e38b8938ca186f99106319e73e807b9a99c47e32e8bbf8f1e3c84b4caf8b1ad58e5646b0c475f4d5dc03eb21e63489460ffeda33b98cf82cec64f0e5638 + languageName: node + linkType: hard + +"@aws-sdk/middleware-sdk-s3@npm:^3.972.14": + version: 3.972.14 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.972.14" + dependencies: + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-arn-parser": "npm:^3.972.2" + "@smithy/core": "npm:^3.23.6" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/signature-v4": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-config-provider": "npm:^4.2.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/8f337e23a469efccef49ca76dd26ac9f33695d3da28bb0d04781fde2b45a66450f717e1b688e0d1e66a0f8f75018a317207a0d928e6db7df89ed43fc88d0d423 + checksum: 10/499b7152ad33fe57acb75000ed3b27c9807804fff563dcca0be7eb762935d5cd84c39054bd7e94412d165accc3a26af3e015a27c0d137b2a0efffb54cc4ab2fe languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.891.0" +"@aws-sdk/middleware-ssec@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/middleware-ssec@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/eaff1bcb582ae55882db977019d019b167e3a0ba2e23cc70719ecb8c45939e7e7f973a9966e64ae5e26e766219d2d1c46decffa05f933f10bfad8ffb12822057 + checksum: 10/d224c0be37527219f5e5fdf543c8a969d954ef526e426a72fc35778af32144d5b2378a2a591fa1adf97b0bb2e35df80b114baf414c7b77b41d73fd9b64dfcbad languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.891.0" +"@aws-sdk/middleware-user-agent@npm:^3.972.14": + version: 3.972.14 + resolution: "@aws-sdk/middleware-user-agent@npm:3.972.14" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@smithy/core": "npm:^3.11.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-endpoints": "npm:^3.996.2" + "@smithy/core": "npm:^3.23.6" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ae9dad8f3092120e609d21668bc0c82025c0adc30ec80633cb7d734c648ca03af776e82f114e29b9c29ecad54bc4788f17e8f4dd387e03682472fa1a39da2d43 + checksum: 10/161f85507e7338c3c75c0ab1cc1de9ff70fd02cbb10a895483b08f02100009287a932df72bc3dc08f17675fe374531275c16f014d8bb34c6bb19e9256ffee50e languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/nested-clients@npm:3.891.0" +"@aws-sdk/nested-clients@npm:^3.996.2": + version: 3.996.2 + resolution: "@aws-sdk/nested-clients@npm:3.996.2" dependencies: "@aws-crypto/sha256-browser": "npm:5.2.0" "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/middleware-host-header": "npm:3.891.0" - "@aws-sdk/middleware-logger": "npm:3.891.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.891.0" - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/region-config-resolver": "npm:3.890.0" - "@aws-sdk/types": "npm:3.887.0" - "@aws-sdk/util-endpoints": "npm:3.891.0" - "@aws-sdk/util-user-agent-browser": "npm:3.887.0" - "@aws-sdk/util-user-agent-node": "npm:3.891.0" - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/core": "npm:^3.11.0" - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/hash-node": "npm:^4.1.1" - "@smithy/invalid-dependency": "npm:^4.1.1" - "@smithy/middleware-content-length": "npm:^4.1.1" - "@smithy/middleware-endpoint": "npm:^4.2.2" - "@smithy/middleware-retry": "npm:^4.2.3" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/smithy-client": "npm:^4.6.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-body-length-node": "npm:^4.1.0" - "@smithy/util-defaults-mode-browser": "npm:^4.1.2" - "@smithy/util-defaults-mode-node": "npm:^4.1.2" - "@smithy/util-endpoints": "npm:^3.1.2" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@smithy/util-utf8": "npm:^4.1.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/middleware-host-header": "npm:^3.972.5" + "@aws-sdk/middleware-logger": "npm:^3.972.5" + "@aws-sdk/middleware-recursion-detection": "npm:^3.972.5" + "@aws-sdk/middleware-user-agent": "npm:^3.972.14" + "@aws-sdk/region-config-resolver": "npm:^3.972.5" + "@aws-sdk/types": "npm:^3.973.3" + "@aws-sdk/util-endpoints": "npm:^3.996.2" + "@aws-sdk/util-user-agent-browser": "npm:^3.972.5" + "@aws-sdk/util-user-agent-node": "npm:^3.972.13" + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/core": "npm:^3.23.6" + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/hash-node": "npm:^4.2.10" + "@smithy/invalid-dependency": "npm:^4.2.10" + "@smithy/middleware-content-length": "npm:^4.2.10" + "@smithy/middleware-endpoint": "npm:^4.4.20" + "@smithy/middleware-retry": "npm:^4.4.37" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/middleware-stack": "npm:^4.2.10" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-body-length-browser": "npm:^4.2.1" + "@smithy/util-body-length-node": "npm:^4.2.2" + "@smithy/util-defaults-mode-browser": "npm:^4.3.36" + "@smithy/util-defaults-mode-node": "npm:^4.2.39" + "@smithy/util-endpoints": "npm:^3.3.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-retry": "npm:^4.2.10" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/04582711919570aad21dc894a1dc6b4f7ed648e6e624d1ed05436afdd1f517819c201bcca2fef5351ec1739d8703d12e991c65ea7f7b3fb337429789f90b36e7 + checksum: 10/544fd7ed6bef14c5e8c9289d3900d7cee1ccb61b54ca6ff0ef9b60f9d31c67e3a2b8a3b894250efcf663aae7a27ee3eec38bcb639fa9ba21b2728b1ac183ccba languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.890.0" +"@aws-sdk/region-config-resolver@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/region-config-resolver@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/cc206435a728beea2ba08ce6efdd6a2e980be350f92b5dee0194665f3f1e88c3a82bf48d7cddf1567a9ff2fc597b30eda31749d88b09e4d2b30d71b3b67956a0 + checksum: 10/0499dbbf00c441a308c323b93bf0b05ec998102e2febed007682db0af13a92f54b6473f0af093429198c56c50a178092e47932b107e015274e5d6d05923117d1 languageName: node linkType: hard -"@aws-sdk/signature-v4-multi-region@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.891.0" +"@aws-sdk/signature-v4-multi-region@npm:^3.996.2": + version: 3.996.2 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.996.2" dependencies: - "@aws-sdk/middleware-sdk-s3": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/signature-v4": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/middleware-sdk-s3": "npm:^3.972.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/signature-v4": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/0ca324f399f18acb081c1a39dfafb433d48be55f35af05309c5b4332f5772612d8c2b2b83b34b2b46bd19288650b8062a2764d36453bfd4d7320b22bfa7b598c + checksum: 10/db0125ce57c8bd7a82116e494f5892f0377adf9467a2df2d43fe148c1d87eee107bb5ce0cee574224e074ed6bb1ca6c4ebe496100d67aba33adad6974e909408 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/token-providers@npm:3.891.0" +"@aws-sdk/token-providers@npm:3.998.0": + version: 3.998.0 + resolution: "@aws-sdk/token-providers@npm:3.998.0" dependencies: - "@aws-sdk/core": "npm:3.890.0" - "@aws-sdk/nested-clients": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/core": "npm:^3.973.14" + "@aws-sdk/nested-clients": "npm:^3.996.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ef72f752850eeb653c91c9cdf29ee6fd82ceae33ddeb818bf7935a59d1e897370eb0ec6121a308c71dbfac628fde49b0effad011b2e6e21c15ce0eef4717e848 + checksum: 10/f909edc88ea504d9146e18c7a979a51e0b471df9110ecc8f2a9c8a4f51398f285d99549df487800fe3ee466cad21dafcdf9fedbed306e7cb37d8aa8231d0c05e languageName: node linkType: hard -"@aws-sdk/types@npm:3.887.0, @aws-sdk/types@npm:^3.222.0": - version: 3.887.0 - resolution: "@aws-sdk/types@npm:3.887.0" +"@aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.973.3": + version: 3.973.3 + resolution: "@aws-sdk/types@npm:3.973.3" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/b4a0024c35d01b481d18454ed1d6eaca8aa1f61082e9e71b1af78d1bc714c919fad3f594498a572aafa73f0d4301b26ae359d009a79d62c5ad995dad25416d59 + checksum: 10/00b27f33990ce1ae58feea6889c57a47d2c1f176d05ca401fbff1e510f256c97ae8fead4b2de81b25d075e38c6439b87ac02f65ded5cb6923a096690ec2f4cc2 languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.873.0": - version: 3.873.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.873.0" +"@aws-sdk/util-arn-parser@npm:^3.972.2": + version: 3.972.2 + resolution: "@aws-sdk/util-arn-parser@npm:3.972.2" dependencies: tslib: "npm:^2.6.2" - checksum: 10/c0438e9730bf5e9c9fdabf1ed5befe3cdbceaa163ccadef616de2675ed5fbdcc84d5c2286b2c20ec6043c29f699b9bc22dc37afc2895d1145499531ec6c0ad36 + checksum: 10/6c09725259187615199b44c21cc9aaf6e61c4d1f326535fd36cf1e95d9842bd58084542c72a9facbca47c5846c5bd8fed7b179e86a036ee142d4a171a6098092 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/util-endpoints@npm:3.891.0" +"@aws-sdk/util-endpoints@npm:^3.996.2": + version: 3.996.2 + resolution: "@aws-sdk/util-endpoints@npm:3.996.2" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-endpoints": "npm:^3.1.2" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-endpoints": "npm:^3.3.1" tslib: "npm:^2.6.2" - checksum: 10/72f50b9c31cc18637f0e2586c2597583860713a2fdb3b14e92dff78b20d8852df2c78577222ec453a0cbc62eac2227d1638b445b9c93f2a58e6449902e604504 + checksum: 10/a964913f92d21b7d30a55c280ed908df28d17805be059e8f611188efc659557952f6304fdf6ebd510861a81a6a7ce5e00aef653908726834d87c17ba73649826 languageName: node linkType: hard "@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.873.0 - resolution: "@aws-sdk/util-locate-window@npm:3.873.0" + version: 3.965.4 + resolution: "@aws-sdk/util-locate-window@npm:3.965.4" dependencies: tslib: "npm:^2.6.2" - checksum: 10/36f252a0cc7dd2ae08eb14ca3aba2982761ce813e42d455b478213765688ac1bcc609888ad8888b8ab23220ec0865987640d66e0cf9182552063e88220257563 + checksum: 10/5b41a026b8600549805a368143f2c4fb79deb60fb8a82064c76a0286bda5ef629c2ea0e5eb6b4d038f90bf2a5cf46cb098232e84c9dc342c15c7206543fbb8b1 languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.887.0" +"@aws-sdk/util-user-agent-browser@npm:^3.972.5": + version: 3.972.5 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.972.5" dependencies: - "@aws-sdk/types": "npm:3.887.0" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/types": "npm:^4.13.0" bowser: "npm:^2.11.0" tslib: "npm:^2.6.2" - checksum: 10/9ea71ca8e756a5e69e9651724253917fa5b75d31fc91562976d09c65d1ebdad65f529afc07922639549027c75f5f207fc70694ae29787198e895573f888c1b0e + checksum: 10/0ad962747d0655211842772ce70c146930200755ba6b0804021d8bba1c972a2b33bdf9a8aea7b9eac4e7d89e575e346b30326adb13fa4a882d76806e3395e433 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.891.0" +"@aws-sdk/util-user-agent-node@npm:^3.972.13": + version: 3.972.13 + resolution: "@aws-sdk/util-user-agent-node@npm:3.972.13" dependencies: - "@aws-sdk/middleware-user-agent": "npm:3.891.0" - "@aws-sdk/types": "npm:3.887.0" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" + "@aws-sdk/middleware-user-agent": "npm:^3.972.14" + "@aws-sdk/types": "npm:^3.973.3" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: 10/4ed824842e5b680db9a08f07a105f6020b3bf5f6489a7d9b133b27c76bef7e3c808b045dbc786017e4badaeeb2266b0833a82f824e415e8e9cbef01d76c5b6f2 + checksum: 10/47157f35bcc37fe0dfa78586db6990c8fe4c3578080cc58987dbc684e43bfd660834cc8440bf59578a4d01c155b9009603b77beeece70ba9bcab1d5770d05102 languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/xml-builder@npm:3.887.0" +"@aws-sdk/xml-builder@npm:^3.972.7": + version: 3.972.7 + resolution: "@aws-sdk/xml-builder@npm:3.972.7" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" + fast-xml-parser: "npm:5.3.6" tslib: "npm:^2.6.2" - checksum: 10/4a6189a319b846a82fe8a2cee7d34d6e5da934aacd5913d140bd3f3f7c677bd28617d49ce51dee95bee8aeccb4e436989a544405e8f3f28304daa43f1081c29c + checksum: 10/0c467ddc63b273b4bb99ffdf818ca2beecada06f8ee9fa1c2cf2a5d565cd44c9e9a7f5f1c8821e9c20b0d7c8282f49f17ec153c0a06f40f7ac355d9f99dae1cb languageName: node linkType: hard -"@aws/lambda-invoke-store@npm:^0.0.1": - version: 0.0.1 - resolution: "@aws/lambda-invoke-store@npm:0.0.1" - checksum: 10/e8f54d28aade8828962f2871a22aa4e960ebc40c8fa551414181dd9dd32d6258279013c42f88e57d17aa4252cb5ed00df6a49fc35185f9fa6b6f351ccf821bd6 +"@aws/lambda-invoke-store@npm:^0.2.2": + version: 0.2.3 + resolution: "@aws/lambda-invoke-store@npm:0.2.3" + checksum: 10/d0efa8ca73b2d8dc0bf634525eefa1b72cda85f5d47366264849343a6f2860cfa5c52b7f766a16b78da8406bbd3ee975da3abb1dbe38183f8af95413eafeb256 languageName: node linkType: hard @@ -856,7 +833,7 @@ __metadata: "@types/jest": "npm:^30.0.0" "@types/node": "npm:^22.15.17" "@typescript/native-preview": "npm:7.0.0-dev.20260113.1" - axios: "npm:^1.12.0" + axios: "npm:^1.13.5" buffer: "npm:^6.0.3" crypto-browserify: "npm:^3.12.1" jest: "npm:^30.0.0" @@ -1894,7 +1871,6 @@ __metadata: "@aztec/stdlib": "workspace:^" "@aztec/telemetry-client": "workspace:^" "@aztec/world-state": "workspace:^" - "@google-cloud/storage": "npm:^7.15.0" "@iarna/toml": "npm:^2.2.5" "@jest/globals": "npm:^30.0.0" "@types/jest": "npm:^30.0.0" @@ -2158,7 +2134,7 @@ __metadata: "@types/node": "npm:^22.15.17" "@types/pako": "npm:^2.0.3" "@typescript/native-preview": "npm:7.0.0-dev.20260113.1" - axios: "npm:^1.12.0" + axios: "npm:^1.13.5" eslint: "npm:^9.26.0" jest: "npm:^30.0.0" jest-mock-extended: "npm:^4.0.0" @@ -3780,7 +3756,7 @@ __metadata: languageName: node linkType: hard -"@google-cloud/promisify@npm:^4.0.0": +"@google-cloud/promisify@npm:<4.1.0": version: 4.0.0 resolution: "@google-cloud/promisify@npm:4.0.0" checksum: 10/c5de81321b3a5c567edcbe0b941fb32644611147f3ba22f20575918c225a979988a99bc2ebda05ac914fa8714b0a54c69be72c3f46c7a64c3b19db7d7fba8d04 @@ -3788,16 +3764,16 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^7.15.0": - version: 7.15.0 - resolution: "@google-cloud/storage@npm:7.15.0" + version: 7.19.0 + resolution: "@google-cloud/storage@npm:7.19.0" dependencies: "@google-cloud/paginator": "npm:^5.0.0" "@google-cloud/projectify": "npm:^4.0.0" - "@google-cloud/promisify": "npm:^4.0.0" + "@google-cloud/promisify": "npm:<4.1.0" abort-controller: "npm:^3.0.0" async-retry: "npm:^1.3.3" duplexify: "npm:^4.1.3" - fast-xml-parser: "npm:^4.4.1" + fast-xml-parser: "npm:^5.3.4" gaxios: "npm:^6.0.2" google-auth-library: "npm:^9.6.3" html-entities: "npm:^2.5.2" @@ -3806,7 +3782,7 @@ __metadata: retry-request: "npm:^7.0.0" teeny-request: "npm:^9.0.0" uuid: "npm:^8.0.0" - checksum: 10/b9898537125974e0c787ad351d3adf5cfec8c1c1bb98bdf2a56bcbc89ea84f719c9efed35aa14f309f934b97b8f9ffb161de6ba3cecc32961c3d8786c246c849 + checksum: 10/6fa0621ff702f3e8e8e4edd25c1f7582b5f2a0b44866ad0b94cd3f074ff58b9164d1c470222bf9c29fcf54c27fabb4ff6706ee073a706c6a67673a8e19b17c30 languageName: node linkType: hard @@ -6364,190 +6340,190 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/abort-controller@npm:4.1.1" +"@smithy/abort-controller@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/abort-controller@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/d2a007a4a41afd3ac13c291f2683d1da57709e75db0a09f502225983c097c8169e3b1b78fc01ee691fb12980492fb3ca49628b3f34ece0a66806bd0caf701710 + checksum: 10/cd13d1a674e6a9318166cb3602e8d6aecf7141f3f4f8faf25afe2a9841faf6ecfface8058be520174a6b4776e45c18bac41fa352e917ca3cafaf4e77f893a0e2 languageName: node linkType: hard -"@smithy/chunked-blob-reader-native@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/chunked-blob-reader-native@npm:4.1.0" +"@smithy/chunked-blob-reader-native@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/chunked-blob-reader-native@npm:4.2.2" dependencies: - "@smithy/util-base64": "npm:^4.1.0" + "@smithy/util-base64": "npm:^4.3.1" tslib: "npm:^2.6.2" - checksum: 10/5ddca9cb700392ff0e6025726528e2c2e20e189b974af0eb8286b2b7bfa248c10c479c99ff09d0fbf0c3c5feefa98ce5da78f4273bbdae0b85e064d753fdecc9 + checksum: 10/2137c946da0bff26f1643252ab63ecc20b1359ed0e66aa7fe502d880343b14ddd1e3d21fdf9addc55a7e71444c4dcab0d13f759670827b7903759d78cf76fb3d languageName: node linkType: hard -"@smithy/chunked-blob-reader@npm:^5.1.0": - version: 5.1.0 - resolution: "@smithy/chunked-blob-reader@npm:5.1.0" +"@smithy/chunked-blob-reader@npm:^5.2.1": + version: 5.2.1 + resolution: "@smithy/chunked-blob-reader@npm:5.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/a7d1d7d5b45499dc6e2c6a4bbfd1ac8cfbaf85b5b28db060c8d3cb1f331432cdada0e5586d57d949a3e521d7eb7b88c425d66cd2ee7ab9d1cf4fbff9a1f830e0 + checksum: 10/a0979d9a22b9e042c0527e5331e1f1a11fb14c169628814371953273cb7bb772bf8051055e63e7738287efeb98c64d2a9bef64332db25aa099d52b426f3e11e4 languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/config-resolver@npm:4.2.2" +"@smithy/config-resolver@npm:^4.4.9": + version: 4.4.9 + resolution: "@smithy/config-resolver@npm:4.4.9" dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-config-provider": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-config-provider": "npm:^4.2.1" + "@smithy/util-endpoints": "npm:^3.3.1" + "@smithy/util-middleware": "npm:^4.2.10" tslib: "npm:^2.6.2" - checksum: 10/8b489420646c61c4ac57e2754ad6e4012de27aa6d0bca18d69f1916085908d58d8ba4d8d963e24ba55c9a797996b95cedff18e3fa2674136c6eb14044f942da0 + checksum: 10/59733532725b50a9b7ec0f569bffafe6d47465c3b61ba5449a11952834b8cc07862b398fdb1a85b9a0205eddb7905f1b1095bad1a8561db883c42c192cf079b2 languageName: node linkType: hard -"@smithy/core@npm:^3.11.0, @smithy/core@npm:^3.11.1": - version: 3.11.1 - resolution: "@smithy/core@npm:3.11.1" +"@smithy/core@npm:^3.23.6": + version: 3.23.6 + resolution: "@smithy/core@npm:3.23.6" dependencies: - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-body-length-browser": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-stream": "npm:^4.3.2" - "@smithy/util-utf8": "npm:^4.1.0" - "@types/uuid": "npm:^9.0.1" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-body-length-browser": "npm:^4.2.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-stream": "npm:^4.5.15" + "@smithy/util-utf8": "npm:^4.2.1" + "@smithy/uuid": "npm:^1.1.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10/23637790d7ce4366d9facf3ce63802ecfe2bdaba5235f0501fa7feef6ca67276c6c3877ace0b910e171274daa61724647a20e4fd8ec25f6bd93b9dfd5ab39896 + checksum: 10/aea8d404fefeb1532c1caf00a2eef8764e3260b26f70746bf9460ba668d63c4616f95064c6edf15d7e0eba072740b79d1b9351745c4fa5d1a569502210370746 languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/credential-provider-imds@npm:4.1.2" +"@smithy/credential-provider-imds@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/credential-provider-imds@npm:4.2.10" dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" tslib: "npm:^2.6.2" - checksum: 10/c10cbea54ba8475d27cd38e956bda9113efa7e90ad46369aa2b3f8bce511ccc89a45f2198efe8bd00a35de16f5ef411723be01093cc02c10511ea89c5ed0131e + checksum: 10/32b1b2ad3d071b36bb50da598d620100ec72fee45cae22f87d27b9764614a2e975e94cf481df78e088a60cf621a48ea9141ce18d6f7ba2d0e351707cecfe16d7 languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-codec@npm:4.1.1" +"@smithy/eventstream-codec@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-codec@npm:4.2.10" dependencies: "@aws-crypto/crc32": "npm:5.2.0" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-hex-encoding": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-hex-encoding": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/7921997f85957c17fd5493567777dcfa31b90c84a3cb2a27adfc8218846994dd6ddebb4699c0656e02d25709d44b692b58a0c94296e771257097ab61626ebdd3 + checksum: 10/83e0a9b8d12f148fb6719369979a39961720bbab04f7a6418402432625edb9ec19f2e054c726b6e3ee024bf55967dabf51a0e174a5742694b1a13d37d43dde5e languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-serde-browser@npm:4.1.1" +"@smithy/eventstream-serde-browser@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-serde-browser@npm:4.2.10" dependencies: - "@smithy/eventstream-serde-universal": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/eventstream-serde-universal": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/89afea2e1deeb3e771e69e62dbc3d17a4fb366dc0b3edf355069a0d8c429cc09e46c8b78f92456dded8e40e22dd06dade5bc717e17ae197b0fe5997729aac82c + checksum: 10/7be36cc32d731d32b8ea8b91d68fc6b8a8dc061816a0bc2979b4b287f2bc6fe4f86187976a39d403527660b3b867a09cc9e17ed59ea8dafc9a525fdb96c03e17 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^4.2.1": - version: 4.2.1 - resolution: "@smithy/eventstream-serde-config-resolver@npm:4.2.1" +"@smithy/eventstream-serde-config-resolver@npm:^4.3.10": + version: 4.3.10 + resolution: "@smithy/eventstream-serde-config-resolver@npm:4.3.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/18e1f0e69bb10b427103113ca14542d6e740e9096cd51d706f890cec78d390f5ccc81513ceef0b861ba05ff0004f0244aaac29d4f3eeff2bc062a16a76331944 + checksum: 10/4b5c7f49ea853b52ee61bc1b021aa001c8d9ffe9723767cfb08121200234379436c25da1385da9e03ae159a6971a96b0c3cabefd92d2b86537d1caef51f1d643 languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-serde-node@npm:4.1.1" +"@smithy/eventstream-serde-node@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-serde-node@npm:4.2.10" dependencies: - "@smithy/eventstream-serde-universal": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/eventstream-serde-universal": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/9ec402098b3d67d051e92d332afb7ea7ab056d178e206d4e35ca47e9b2d12915373358323681c6183f22680e847101277dbf43abb9703bfda2ec23451cc87c51 + checksum: 10/6a904fedfde118fc7f9d5b3903a8f4f01bf3af66cc5681965569937ea6abbe3963cb01269e5ed5d00417df03666e1e1962cb0f55974468663fa027d768f0a953 languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/eventstream-serde-universal@npm:4.1.1" +"@smithy/eventstream-serde-universal@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/eventstream-serde-universal@npm:4.2.10" dependencies: - "@smithy/eventstream-codec": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/eventstream-codec": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/bbe77b9f14d718d18972dc4690c53b6518e0088e0c24d7f0a38b3ede3dd0291fd494112bfe7efb93591ba4b923b0ce9b8598ee72eec4e4481812ef3f4bfb5af7 + checksum: 10/4354d22497aa72cc35b1aa62c2afa755607da721752b47e37cfe7bb3972b82bca25cf73aac4821b9c3ed3d7f024d72d93a63230557e103ecb228555d4bba9be8 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.2.1": - version: 5.2.1 - resolution: "@smithy/fetch-http-handler@npm:5.2.1" +"@smithy/fetch-http-handler@npm:^5.3.11": + version: 5.3.11 + resolution: "@smithy/fetch-http-handler@npm:5.3.11" dependencies: - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/querystring-builder": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/querystring-builder": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" tslib: "npm:^2.6.2" - checksum: 10/a7038d20ad2ad64bdfda06b61e6a485b20af2086e94b78dc8f955a5baf270efaca6c9a3f7401114b8e856eed3ff8dda9701119a560455e6d72f8ae1957f50d33 + checksum: 10/b15461b66a3fdc293ab62f3146b322d9ec6e76457b3a33ec9dbad40f93e927705e318cfe4006742aab3f1bf4928938acff9472abb076c8b47ff9ae767a7dfbad languageName: node linkType: hard -"@smithy/hash-blob-browser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/hash-blob-browser@npm:4.1.1" +"@smithy/hash-blob-browser@npm:^4.2.11": + version: 4.2.11 + resolution: "@smithy/hash-blob-browser@npm:4.2.11" dependencies: - "@smithy/chunked-blob-reader": "npm:^5.1.0" - "@smithy/chunked-blob-reader-native": "npm:^4.1.0" - "@smithy/types": "npm:^4.5.0" + "@smithy/chunked-blob-reader": "npm:^5.2.1" + "@smithy/chunked-blob-reader-native": "npm:^4.2.2" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/8e29bf75da5ceebc571bee17c3e6c28162572105dcdc17b249a5edf3691e0987daf579470cb60799e8f200756cb3bd8fa69e0b299a8435edaff490f14101bc13 + checksum: 10/ae08dc05eff99a7e5c8d7d526e7229975c316ed9ab6dc3902ea857119d14f68dc3d5c5432498d3453bbdde3c0ff1dca5cce3e075cb02577a149fa36e118c0c37 languageName: node linkType: hard -"@smithy/hash-node@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/hash-node@npm:4.1.1" +"@smithy/hash-node@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/hash-node@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-buffer-from": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-buffer-from": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/234f3d52975f99583ec8e739f70b3ccb1941f57bb47e1d230af954d5b1b3d7ee6c94907079017ef5fbfec4bcb618c0214b26b2ff7d7a01dc57d1f8f5ff414cba + checksum: 10/e81cdad00803cbb3598efe1c37f7b13e050a371bd0456d622c790bc6c125b28549f06f277c10aae1f66fbdaf2a599f5d184f062d8ed44b29eb03de8e77b65534 languageName: node linkType: hard -"@smithy/hash-stream-node@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/hash-stream-node@npm:4.1.1" +"@smithy/hash-stream-node@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/hash-stream-node@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/abdeea567ffb65f41e79c4dec5733c29a419a1de546e968be95113e2d96fc7e870149c1de422ff4fefb4229ee3dd0e29996df14c2c95e42a65027f9cdfa8f03a + checksum: 10/197719def18803fd23fe1320937bbcd4e434f85304205fbbcfecf9c5b97b97d0fa6ff53005340cc221c628ed13af147754896405ef9198ee67d1da26b3445903 languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/invalid-dependency@npm:4.1.1" +"@smithy/invalid-dependency@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/invalid-dependency@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/665e34379c6b3ad3a6bb0cf14ad646ba2bd9785b6e1b571d41192ad2d5617f5f48cd743d2ad75ce5ba6d5a2c2e312f7f86c2be50d2b8b12c9f2c0e5f42c9633e + checksum: 10/7f9be8eade96a8dff5b2a71b6ffcedf97f743b9531e10b10430dea22b663ed821ee22f5d7e58f0aa7739c9ca6bf86b568531a5c9e0b01d1c7ba25c7d20149618 languageName: node linkType: hard @@ -6560,254 +6536,253 @@ __metadata: languageName: node linkType: hard -"@smithy/is-array-buffer@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/is-array-buffer@npm:4.1.0" +"@smithy/is-array-buffer@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/is-array-buffer@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/5fba7ea13175100d39bc88b480dc70dc04bb62c62dc470e61e09b287f3b4c851c56473bda2ec077eca31675cde184dadc4d50ef11f065fb566e0b88f92d9465a + checksum: 10/a6cb22520c1cac6e5aca8ebc830fa4ad96bd793d7ff9f12a34d0bfa2ddc7f4c62930b032d6f81af4271ce2031998a8d7494ea16492bdb5d343b8649ab220535f languageName: node linkType: hard -"@smithy/md5-js@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/md5-js@npm:4.1.1" +"@smithy/md5-js@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/md5-js@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/383d9acb06adad67c1089283988195d478475a53fa6e9954f5b237989b5ae15a8f2ec70f8f64557c65ce2984e8503bdc55ea4ff487def8c04822af1132f6746b + checksum: 10/a2ba23e4fad7af31ff50da64f3929961462f87cf50e30bd2d72fc4a2c64b7610f9f1c5ce8584cf0d91a1f02f937b55e06f890579f27ecde379540edfbb3350f2 languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/middleware-content-length@npm:4.1.1" +"@smithy/middleware-content-length@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/middleware-content-length@npm:4.2.10" dependencies: - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/eb2a99c11d01484ff0b17ba9c5d02878b92c61153568080eab011699de4460ff4534a302d9131583deb83963be83494a43e1973235c1e7edbaaaa2ace5e2b202 + checksum: 10/7b58bdcfc97f01997e2a235c16536847b70ba07fdb7da8dfc81b93e4782fcd5fcf8b894a599455b35bed7ac0b145e2d00d0be4610131f48be6bb4df2e110b68c languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.2.2, @smithy/middleware-endpoint@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/middleware-endpoint@npm:4.2.3" - dependencies: - "@smithy/core": "npm:^3.11.1" - "@smithy/middleware-serde": "npm:^4.1.1" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" - "@smithy/url-parser": "npm:^4.1.1" - "@smithy/util-middleware": "npm:^4.1.1" +"@smithy/middleware-endpoint@npm:^4.4.20": + version: 4.4.20 + resolution: "@smithy/middleware-endpoint@npm:4.4.20" + dependencies: + "@smithy/core": "npm:^3.23.6" + "@smithy/middleware-serde": "npm:^4.2.11" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" + "@smithy/url-parser": "npm:^4.2.10" + "@smithy/util-middleware": "npm:^4.2.10" tslib: "npm:^2.6.2" - checksum: 10/0a7a5187b12c2b0e78b9fe3e36617874bf7326a6f3eec61d782ec107c621d770e5ae70de4bd2d7c83fbedc0c03fe699fa072c2d5beec27142b36198a083ce200 + checksum: 10/5c383e2b2bdadee64547ba9a3fa7690c9b146510313cec999477527029a0eb0a25bac94034b769b1b528480e2e825c4e611511d01458b90841edef3bb3735cf0 languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.2.3": - version: 4.2.4 - resolution: "@smithy/middleware-retry@npm:4.2.4" - dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/service-error-classification": "npm:^4.1.2" - "@smithy/smithy-client": "npm:^4.6.3" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-retry": "npm:^4.1.2" - "@types/uuid": "npm:^9.0.1" +"@smithy/middleware-retry@npm:^4.4.37": + version: 4.4.37 + resolution: "@smithy/middleware-retry@npm:4.4.37" + dependencies: + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/service-error-classification": "npm:^4.2.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-retry": "npm:^4.2.10" + "@smithy/uuid": "npm:^1.1.1" tslib: "npm:^2.6.2" - uuid: "npm:^9.0.1" - checksum: 10/ff078b30f43b37e2fa02f743dddfd7c61f4485df2816646f33ad88689c54282466ebd258cf4af146aa9e5aaae49eb93b09011c36d6fdf55f7e98fcb9ddba06de + checksum: 10/4a9ac93ed0ec19dba8ced3787a12baa812df431718176d167a6894fd9a21c0da0b7a9953341d07662d44fa9f0a1942559883e3132db8daed84dcb611422fbbda languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/middleware-serde@npm:4.1.1" +"@smithy/middleware-serde@npm:^4.2.11": + version: 4.2.11 + resolution: "@smithy/middleware-serde@npm:4.2.11" dependencies: - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/01d907751748a4b2806aba43ec4a668d313c89c04ecd6ba3b15663e39b9b447842387e4300e47d8ce7066c415fb70b05b53c11967f98c4d8ea5488891070cad6 + checksum: 10/0d61120641729ca921c19077562e59b407d06010d674520726493ce56db6c6b42c97ad3844f9b9f53c3be7f67d356105de169ab1fd2ad24657e14b9754e8811f languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/middleware-stack@npm:4.1.1" +"@smithy/middleware-stack@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/middleware-stack@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/7c07663cb381f785d2bf39ff7fa5ee14e233168021274ede6b86335fff60a23260f42535f5ef32c8fe581c780a80acd06df39fcbcd3634e61c1eae685372a65c + checksum: 10/bc37f3650b1e05f63e32156ef0c72b8cc7e2ede1ec5f122266e7042ba69f9165681c2633c73156a7195053e2022a14c66a4df021afd29613370f6a06cd90b926 languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/node-config-provider@npm:4.2.2" +"@smithy/node-config-provider@npm:^4.3.10": + version: 4.3.10 + resolution: "@smithy/node-config-provider@npm:4.3.10" dependencies: - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/shared-ini-file-loader": "npm:^4.2.0" - "@smithy/types": "npm:^4.5.0" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/shared-ini-file-loader": "npm:^4.4.5" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/18f290c8be9c5de33b64e7cae847bfbf1b926e7fbb1df31e853a7d04ef3275adb690f5cf3450ffef23ab68fc8f37f45d42bee9c05bf791b8b66c447c97ba2e25 + checksum: 10/49c6450b7a6b1871bc9f1eee4ecfa6170f022b4b5c47a320aae73041c4ec1aa1901e0d8babd772d71745d363a3bd735fd08e1ebfd28b4a33498bd38a4f3bf7e4 languageName: node linkType: hard -"@smithy/node-http-handler@npm:^4.2.1": - version: 4.2.1 - resolution: "@smithy/node-http-handler@npm:4.2.1" +"@smithy/node-http-handler@npm:^4.4.12": + version: 4.4.12 + resolution: "@smithy/node-http-handler@npm:4.4.12" dependencies: - "@smithy/abort-controller": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/querystring-builder": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/abort-controller": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/querystring-builder": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/71f6551dbd06e2a9eb2b536bf13f11ec32c93da324376bf82ff3614e24241970e9ba4106cbbc8a0ac2867595fad3b12c6b2807366f921561ec41086a90af2ece + checksum: 10/2c561c4af663a5d48778051fa23b31469045a00531cda14aadbd4b454d2f8e95f396505204f3990817a99872feae0a7d150abb2158d2c620d5a2f7cf2f594f67 languageName: node linkType: hard -"@smithy/property-provider@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/property-provider@npm:4.1.1" +"@smithy/property-provider@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/property-provider@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/f44da66c108b6bb0d9e59a30d8dbde17fc38656890b3ba688cf22db130e93f84d7436003cde473d2636a16d736eb4a8638e069f9a1cb0228a9bb2a5d90f8e40a + checksum: 10/4ad889be847e391ae5fd82b97c18db6c5c67174073c50c26d3458dad76f11bc08ebf45db2afb690a3935c85dbd5c3b4526270270248168f79af1c829d5e78d5f languageName: node linkType: hard -"@smithy/protocol-http@npm:^5.2.1": - version: 5.2.1 - resolution: "@smithy/protocol-http@npm:5.2.1" +"@smithy/protocol-http@npm:^5.3.10": + version: 5.3.10 + resolution: "@smithy/protocol-http@npm:5.3.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/7e00b314d6b38d58f4ca692546642b6a641be564d67fc31bae227ec0f0fd8f568522752189727a45828654c6ebcab2784884d4058ce992d2f48fc63ab37f4c2c + checksum: 10/617835e3f9ccc30e8d03c364ec6617335088e02ad9117b7c1bee868ae14ce904dffee686be7f75ab955e6fe11f1976a17298cba88dd17db48148d34ed7a40c9e languageName: node linkType: hard -"@smithy/querystring-builder@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/querystring-builder@npm:4.1.1" +"@smithy/querystring-builder@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/querystring-builder@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - "@smithy/util-uri-escape": "npm:^4.1.0" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-uri-escape": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/bbbfd564ccd585273df3829cc5e86572341cf22ed65477fdf31c8b9fc99759e872246ad419863efc259a110fbdab5bac408a5729abc8f883edd8390ae80aaf30 + checksum: 10/3c5fa9eea099ec1087dc05deaba0d482136b23cc5548f46acfec6b18690bb2ce0f591b8c441c45fcc6139682b54e032e17749ef21f795422bf6ff0966ab5d5c8 languageName: node linkType: hard -"@smithy/querystring-parser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/querystring-parser@npm:4.1.1" +"@smithy/querystring-parser@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/querystring-parser@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/08b81b7e8350d88b5a350cbe55c626c71bb86de06041e8311c44133919accba63b401672f84e65cbdbddce02a08b408da40669161d92af1d4d283dd167863aa5 + checksum: 10/676763166c3c34e8553ca5981f59313bc6d07177b2db83027be90ff1e89b1fe41912f39c23f3eeea01a58686adf465dcd74d2ccd1661dfc2860e915acbf957f8 languageName: node linkType: hard -"@smithy/service-error-classification@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/service-error-classification@npm:4.1.2" +"@smithy/service-error-classification@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/service-error-classification@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" - checksum: 10/50e8835e9850167093db1a96e9265ee66991f8e03b44fd2f23c44114de5634d9d65dd80fc6f7f94ebba2f2e892f73a270bbfdca5c07bfc97bb36bbf3b95ad4a3 + "@smithy/types": "npm:^4.13.0" + checksum: 10/f535fddfb958440f008d6dabd50acf0bae3129923af5f3f94e9c30fe2695015ec2bae88e938ace195cae5f33337cc40fd32d376a199a48f6c37a01000e7510f3 languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^4.2.0": - version: 4.2.0 - resolution: "@smithy/shared-ini-file-loader@npm:4.2.0" +"@smithy/shared-ini-file-loader@npm:^4.4.5": + version: 4.4.5 + resolution: "@smithy/shared-ini-file-loader@npm:4.4.5" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/ee67bbfbbde59407ef15777118cccc2ef39163f70efc0704044144dcd08019316b08ccdec5e8dc94fb17d2be6aeb256a2d7b790a36c9938b6149e2e4c646db89 + checksum: 10/84fca675b277b5bcadc107628fcfe6c33da0af590467c239c796f3bd921b65b96c42bc9620790f246ecd8c7a2cd09ef7605346aea9576e2b4b2044a38125e9c1 languageName: node linkType: hard -"@smithy/signature-v4@npm:^5.2.1": - version: 5.2.1 - resolution: "@smithy/signature-v4@npm:5.2.1" - dependencies: - "@smithy/is-array-buffer": "npm:^4.1.0" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-hex-encoding": "npm:^4.1.0" - "@smithy/util-middleware": "npm:^4.1.1" - "@smithy/util-uri-escape": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" +"@smithy/signature-v4@npm:^5.3.10": + version: 5.3.10 + resolution: "@smithy/signature-v4@npm:5.3.10" + dependencies: + "@smithy/is-array-buffer": "npm:^4.2.1" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-hex-encoding": "npm:^4.2.1" + "@smithy/util-middleware": "npm:^4.2.10" + "@smithy/util-uri-escape": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/4f22b6f1a1d15c15627af64ea1490ce797f020fca3177b00ec54d89e72ecdce98ed71ec8a96ece638110ac0b331718065a8393687654776e6989a523f03703b0 + checksum: 10/654f621ede3bdcb68e655e2a310e948e81b347d56525ba893ff126149d1172ee7a224aeb59c9887065352191178cff745ce1025c21ad5a6e1487c7bd1438cda4 languageName: node linkType: hard -"@smithy/smithy-client@npm:^4.6.2, @smithy/smithy-client@npm:^4.6.3": - version: 4.6.3 - resolution: "@smithy/smithy-client@npm:4.6.3" - dependencies: - "@smithy/core": "npm:^3.11.1" - "@smithy/middleware-endpoint": "npm:^4.2.3" - "@smithy/middleware-stack": "npm:^4.1.1" - "@smithy/protocol-http": "npm:^5.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-stream": "npm:^4.3.2" +"@smithy/smithy-client@npm:^4.12.0": + version: 4.12.0 + resolution: "@smithy/smithy-client@npm:4.12.0" + dependencies: + "@smithy/core": "npm:^3.23.6" + "@smithy/middleware-endpoint": "npm:^4.4.20" + "@smithy/middleware-stack": "npm:^4.2.10" + "@smithy/protocol-http": "npm:^5.3.10" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-stream": "npm:^4.5.15" tslib: "npm:^2.6.2" - checksum: 10/7bf439f1b4d4b31e514090af7fa68c8cf3366e2293debcb8020ce38f0ff7e662464815bf1b4ff71e8bdc2a124d83b0658e8f585e7b4f642b982e757b79bce982 + checksum: 10/aa339275f3a2de7cabc463c173d8cdc4faebf958be357efb47243eba65e69e244c285563825f4d091df368256f7beffcb7410839fce4e42608b00dbaf816ed4c languageName: node linkType: hard -"@smithy/types@npm:^4.5.0": - version: 4.5.0 - resolution: "@smithy/types@npm:4.5.0" +"@smithy/types@npm:^4.13.0": + version: 4.13.0 + resolution: "@smithy/types@npm:4.13.0" dependencies: tslib: "npm:^2.6.2" - checksum: 10/d25275a0f1cb75dd3534a60a637b0202fbe1343703a448c410aa3e3029d5dc1d128c711c005bbda29a111af5a072aaf01bd8314a05c9806857d18e625f41c075 + checksum: 10/abcc033be2ee9500f4befd988879a5dcedbe460e445207095a17eb974f9f07ec31cbf0b27754b704a9ca9a4fc17891948026438d34215b84d539e4bdaf5ac7b6 languageName: node linkType: hard -"@smithy/url-parser@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/url-parser@npm:4.1.1" +"@smithy/url-parser@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/url-parser@npm:4.2.10" dependencies: - "@smithy/querystring-parser": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/querystring-parser": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/35904bf3561d433f92c318c2f9d1fb8324e7693ea11af3e7570a334944f701e9c6720d5b426d93830e33cfe105dd026cd5fda842b20d14589ff62b9c67b4118b + checksum: 10/e86ae3397434c58b8a831048f8bb2bf76e7f2627fec58262ac92aa34f18daa98e708c7ba6c2549c4d587e7c836a8e318ebbe5e509adc3d442e9f8892bbc34174 languageName: node linkType: hard -"@smithy/util-base64@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-base64@npm:4.1.0" +"@smithy/util-base64@npm:^4.3.1": + version: 4.3.1 + resolution: "@smithy/util-base64@npm:4.3.1" dependencies: - "@smithy/util-buffer-from": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" + "@smithy/util-buffer-from": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/980391b462ab5d8a99ce2ac55441b3bcaef73e197926327f32ef09d708535f6d0449eb05fa166d709e27fdeb212a60f201d6678f2c64122fce072ef3d82c0644 + checksum: 10/77dd092e73566ebb1a9942ec37bc0fcf861159a62f90c03a676c17826c1e43a6ad493fee65ddae2c0b4b3ce89b9f363cee2856fc6c2068fbb215320cf5e179b2 languageName: node linkType: hard -"@smithy/util-body-length-browser@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-body-length-browser@npm:4.1.0" +"@smithy/util-body-length-browser@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-body-length-browser@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/264b1b0f47127b1d215e95e7c66d3717b3f838d674b195e0150c8405e1875779694b3c75ab1932bf1a51c890ed495f7a9560a25c40e635d2f5585e496d9fbf77 + checksum: 10/2a5221e7d1b233a1182f1d9f754eb116b7cc86e3152beaff6941c1c55b863099fcab73795cffa299d522069fc5f74f985b4d6713a0913247d13d8936a4de1a2c languageName: node linkType: hard -"@smithy/util-body-length-node@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-body-length-node@npm:4.1.0" +"@smithy/util-body-length-node@npm:^4.2.2": + version: 4.2.2 + resolution: "@smithy/util-body-length-node@npm:4.2.2" dependencies: tslib: "npm:^2.6.2" - checksum: 10/5a6d925afdebdcde7a7f1ce55e69d823c0a9b7a5ed8f899417c402952585784b0ac843932691875381ce389f0e5f543d25c9fe4a3d8addeddbd48124a8985b6b + checksum: 10/b6bea331247f3a81134fe2b3e07b3b00bab467dc45ccf4b1fb4dd98d51c9341ff7fdbd760532a84bd7b479387cc0af564760b06e58b9825e34c5ba171185c611 languageName: node linkType: hard @@ -6821,116 +6796,115 @@ __metadata: languageName: node linkType: hard -"@smithy/util-buffer-from@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-buffer-from@npm:4.1.0" +"@smithy/util-buffer-from@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-buffer-from@npm:4.2.1" dependencies: - "@smithy/is-array-buffer": "npm:^4.1.0" + "@smithy/is-array-buffer": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/b1337ac6874adac67bbc91144c6e0e760b194f44af91a9816812c042c19a83d552cd5c8a94b8ed01af6047d2163a854fc32ebcd957a6053b4fd27dedc8793bb5 + checksum: 10/686c8feafb751942caa60bbd47c6214acf75e8ac6118e5d0f9cee3d5a60be2dfa8f95a5955bbe65a53f8ad1136b2d446642ec343e37c8440b1852779040da46a languageName: node linkType: hard -"@smithy/util-config-provider@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-config-provider@npm:4.1.0" +"@smithy/util-config-provider@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-config-provider@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/b6daf4d12e721062d7b1888a14a760db23a3df388cced56ba47673cc1a3a24b8933190a7631be1cc548eb62fb5a3b5c34d6de2eb595ffdacdfd7e0dcb7fee5ef + checksum: 10/3d17e618d9427d049ce51c41ae75ceb7800f29f59babe2823783cd585d0922205046a660c49c1afefa57f00a5f20e428cbaf9ede68ad1fc99b415455d47befb4 languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.1.2": - version: 4.1.3 - resolution: "@smithy/util-defaults-mode-browser@npm:4.1.3" +"@smithy/util-defaults-mode-browser@npm:^4.3.36": + version: 4.3.36 + resolution: "@smithy/util-defaults-mode-browser@npm:4.3.36" dependencies: - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/smithy-client": "npm:^4.6.3" - "@smithy/types": "npm:^4.5.0" - bowser: "npm:^2.11.0" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/732b739d642c3111549e1667f72d4c6fcb07e09ed33448766b6bb4226f6acd98f52b198fac25351e2112384b365b79a90c34644ca6167f4786291a6a074cf506 + checksum: 10/8edbb9e7f5970bfabd29de066a8f59d18f437b11f1150e54421795cdf648b288c6019f07259c5a8cd63196252301f59b3963b959904c7df12bfd657a19f952f7 languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^4.1.2": - version: 4.1.3 - resolution: "@smithy/util-defaults-mode-node@npm:4.1.3" - dependencies: - "@smithy/config-resolver": "npm:^4.2.2" - "@smithy/credential-provider-imds": "npm:^4.1.2" - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/property-provider": "npm:^4.1.1" - "@smithy/smithy-client": "npm:^4.6.3" - "@smithy/types": "npm:^4.5.0" +"@smithy/util-defaults-mode-node@npm:^4.2.39": + version: 4.2.39 + resolution: "@smithy/util-defaults-mode-node@npm:4.2.39" + dependencies: + "@smithy/config-resolver": "npm:^4.4.9" + "@smithy/credential-provider-imds": "npm:^4.2.10" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/property-provider": "npm:^4.2.10" + "@smithy/smithy-client": "npm:^4.12.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/a882d3edc30781cce987ab9a9d15f60b0083e36f703a4601f4800d9aea2dee1db60dfc4c73f6656c298c78a62917acb24624d145ef2dd25143a8bd55713bf6de + checksum: 10/999faa0a8abc2273a1134f0fbfb9fb68aee8da6b0a651c6a1453b492bbf2308bb0f26075f50c748c1e3ccf7159fe77db35714fe197f71c112b749f53e9cd8abe languageName: node linkType: hard -"@smithy/util-endpoints@npm:^3.1.2": - version: 3.1.2 - resolution: "@smithy/util-endpoints@npm:3.1.2" +"@smithy/util-endpoints@npm:^3.3.1": + version: 3.3.1 + resolution: "@smithy/util-endpoints@npm:3.3.1" dependencies: - "@smithy/node-config-provider": "npm:^4.2.2" - "@smithy/types": "npm:^4.5.0" + "@smithy/node-config-provider": "npm:^4.3.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/4310b3ae356d69f5bc6a7b3477ac5c16b0d014fe5c36db3445c010bfcea43f8b5de7abcb118f6935ccf9b41b9dcb6f17ca60792a68074c5b3ac70332dbc3c4b2 + checksum: 10/75f6bc5d467981b8c4caf9e10ae1b47ca1534b2565fd33f36beffdd6b73c80951ed408df922a2d7ba013d988c1a73abea04317a99613012acb5b898a950484f8 languageName: node linkType: hard -"@smithy/util-hex-encoding@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-hex-encoding@npm:4.1.0" +"@smithy/util-hex-encoding@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-hex-encoding@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/dc66a330ba5e4a7e034c75ff6bf823e7a3dd9df3283511f0e5e95797063f3a82cd1d68d1bdb2353b33502e7a2ae6806ae195a964c2e3339547e972d917c78ea4 + checksum: 10/5b1a486d9b36feffa542cfa012ca8067b95f512ee020113a666e78f879b103cd0e1826cfae4f668f2a0c2e0f58d322580176fea930d49511c4d885e2764ab86b languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/util-middleware@npm:4.1.1" +"@smithy/util-middleware@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/util-middleware@npm:4.2.10" dependencies: - "@smithy/types": "npm:^4.5.0" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/bc80179fb554271dd44a9eb8403f09a2ed4f14de5ee1ba44fea17d8ee2d5b2178a433a24c85ee8898d7a69b45a8cf5978b3ef71866b6b461179a7c4ef4e79b58 + checksum: 10/609f3d0fc1ca3b47aaa3c8fea0b9cb7a9c2c651c3c8a4806633aa271daeba2b1e8bd5c32df04e0a8ad882cd0996d77434af28e9230ecd9382c0474a3fcb66a94 languageName: node linkType: hard -"@smithy/util-retry@npm:^4.1.2": - version: 4.1.2 - resolution: "@smithy/util-retry@npm:4.1.2" +"@smithy/util-retry@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/util-retry@npm:4.2.10" dependencies: - "@smithy/service-error-classification": "npm:^4.1.2" - "@smithy/types": "npm:^4.5.0" + "@smithy/service-error-classification": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/3daf4b560de5dff99c14661b7ae5c4456b7b99642141cd4c7dccb281579435edecd22695a9fe78d47e716c85e25c9bbc555d44598f460f01f2d28d9182834dd4 + checksum: 10/a47b04d3faeb195f5147bbf876e75d5cc2beabe1c55990b9b6c2ae6456243ab942fd9bedc5945f165c951c0d30d56f0e2c6042968047046c8773a30b35b9a9e5 languageName: node linkType: hard -"@smithy/util-stream@npm:^4.3.1, @smithy/util-stream@npm:^4.3.2": - version: 4.3.2 - resolution: "@smithy/util-stream@npm:4.3.2" - dependencies: - "@smithy/fetch-http-handler": "npm:^5.2.1" - "@smithy/node-http-handler": "npm:^4.2.1" - "@smithy/types": "npm:^4.5.0" - "@smithy/util-base64": "npm:^4.1.0" - "@smithy/util-buffer-from": "npm:^4.1.0" - "@smithy/util-hex-encoding": "npm:^4.1.0" - "@smithy/util-utf8": "npm:^4.1.0" +"@smithy/util-stream@npm:^4.5.15": + version: 4.5.15 + resolution: "@smithy/util-stream@npm:4.5.15" + dependencies: + "@smithy/fetch-http-handler": "npm:^5.3.11" + "@smithy/node-http-handler": "npm:^4.4.12" + "@smithy/types": "npm:^4.13.0" + "@smithy/util-base64": "npm:^4.3.1" + "@smithy/util-buffer-from": "npm:^4.2.1" + "@smithy/util-hex-encoding": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/244739dcb05c1d1cb3e7b2cad313475605846fb1a264220d97777d35ab4c676a9e71a4443fb9f04b5ed0f6cd28c74f692ce75b14840429b0e28abffb6ab10ebb + checksum: 10/97b23cf181cfc39dd21f1d77ccc4723c3914408d3901e39e9f2c49b744886d6587efb54fca16b4ccab3b0fe525d1ff79cc3860edd84a2a8b715314a8ee6064ed languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-uri-escape@npm:4.1.0" +"@smithy/util-uri-escape@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-uri-escape@npm:4.2.1" dependencies: tslib: "npm:^2.6.2" - checksum: 10/c576cb2b7d365d02338734efd83d8b9d2e5ab7ea5a91444762ace367b6fe46e060a2a85ba51ba84ca5ac73b3e732436b22fb61359af4b731b41c1f803f3055ff + checksum: 10/16a75ad9686d1d972255f18fdf275b798ed9849917e02cac23213af28af5931149e0916c9742d1c45f78a232c2c89cd9a0dca653baa0db36becb1244e6b9c05c languageName: node linkType: hard @@ -6944,24 +6918,33 @@ __metadata: languageName: node linkType: hard -"@smithy/util-utf8@npm:^4.1.0": - version: 4.1.0 - resolution: "@smithy/util-utf8@npm:4.1.0" +"@smithy/util-utf8@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-utf8@npm:4.2.1" dependencies: - "@smithy/util-buffer-from": "npm:^4.1.0" + "@smithy/util-buffer-from": "npm:^4.2.1" tslib: "npm:^2.6.2" - checksum: 10/4565df6e64df958d2e45da4344d3206a81e66b6e6a48734a45b5228fe73c5c5982ec52beedc8065ab73d169a278f9028438a60410a6daa1d40aebd9dd6122a07 + checksum: 10/ff8ee4e26b6222d358cd3b9ef52bbdfb2500a2952f439aa0264a127c4235508681648600b6def3ce7d276c03b16fe79bb5a38430ec2e46e41185412790353ee7 languageName: node linkType: hard -"@smithy/util-waiter@npm:^4.1.1": - version: 4.1.1 - resolution: "@smithy/util-waiter@npm:4.1.1" +"@smithy/util-waiter@npm:^4.2.10": + version: 4.2.10 + resolution: "@smithy/util-waiter@npm:4.2.10" dependencies: - "@smithy/abort-controller": "npm:^4.1.1" - "@smithy/types": "npm:^4.5.0" + "@smithy/abort-controller": "npm:^4.2.10" + "@smithy/types": "npm:^4.13.0" tslib: "npm:^2.6.2" - checksum: 10/019eecded24b9244675da3b956f572261e333d8d2b0d0555f9c85c893f2583f113bf0210521876e825943085d2d89e7e4fdb768cdc802627b9660d809734cce3 + checksum: 10/0b310d9f9a523ba069a9251a80ecebf6e53bf7fb192bcc5defa9deb02ef33863a09621a9fb3d8be1ff149390562ef9ee5ee042fe5ccf8358464ba24d3d60c2b0 + languageName: node + linkType: hard + +"@smithy/uuid@npm:^1.1.1": + version: 1.1.1 + resolution: "@smithy/uuid@npm:1.1.1" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/26acc5b818d219ec049c1877857afc783dd9c4cb62234b61d1c18b1465ec731ec0aea902bdf6f58f730a4bf72d9564559b1fb14c94ceaafe3d41f6923745a97c languageName: node linkType: hard @@ -8130,13 +8113,6 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^9.0.1": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: 10/b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 - languageName: node - linkType: hard - "@types/wrap-ansi@npm:^3.0.0": version: 3.0.0 resolution: "@types/wrap-ansi@npm:3.0.0" @@ -9685,14 +9661,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.12.0": - version: 1.12.2 - resolution: "axios@npm:1.12.2" +"axios@npm:^1.13.5": + version: 1.13.5 + resolution: "axios@npm:1.13.5" dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.4" + follow-redirects: "npm:^1.15.11" + form-data: "npm:^4.0.5" proxy-from-env: "npm:^1.1.0" - checksum: 10/886a79770594eaad76493fecf90344b567bd956240609b5dcd09bd0afe8d3e6f1ad6d3257a93a483b6192b409d4b673d9515a34619e3e3ed1b2c0ec2a83b20ba + checksum: 10/db726d09902565ef9a0632893530028310e2ec2b95b727114eca1b101450b00014133dfc3871cffc87983fb922bca7e4874d7e2826d1550a377a157cdf3f05b6 languageName: node linkType: hard @@ -9863,9 +9839,9 @@ __metadata: linkType: hard "basic-ftp@npm:^5.0.2": - version: 5.0.5 - resolution: "basic-ftp@npm:5.0.5" - checksum: 10/3dc56b2092b10d67e84621f5b9bbb0430469499178e857869194184d46fbdd367a9aa9fad660084388744b074b5f540e6ac8c22c0826ebba4fcc86a9d1c324e2 + version: 5.2.0 + resolution: "basic-ftp@npm:5.2.0" + checksum: 10/f5a15d789aa98859af4da9e976154b2aeae19052e1762dc68d259d2bce631dafa40c667aa06d7346cd630aa6f9cc9a26f515b468e0bd24243fbae2149c7d01ad languageName: node linkType: hard @@ -13203,25 +13179,33 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:5.2.5": - version: 5.2.5 - resolution: "fast-xml-parser@npm:5.2.5" +"fast-xml-builder@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-xml-builder@npm:1.0.0" + checksum: 10/06c04d80545e5c9f4d1d6cca00567b5cc09953a92c6328fa48cfb4d7f42630313b8c2bb62e9cb81accee7bb5e1c5312fcae06c3d20dbe52d969a5938233316da + languageName: node + linkType: hard + +"fast-xml-parser@npm:5.3.6": + version: 5.3.6 + resolution: "fast-xml-parser@npm:5.3.6" dependencies: - strnum: "npm:^2.1.0" + strnum: "npm:^2.1.2" bin: fxparser: src/cli/cli.js - checksum: 10/305017cff6968a34cbac597317be1516e85c44f650f30d982c84f8c30043e81fd38d39a8810d570136c921399dd43b9ac4775bdfbbbcfee96456f3c086b48bdd + checksum: 10/03527ab0bdf49d960fdc8f6088cd0715c052e06b68b39459da87b1a1fbb3439a855b2d83cbf3c400e983b8e668b396296b072a4dd5c63403cf1e618c9326b6df languageName: node linkType: hard -"fast-xml-parser@npm:^4.4.1": - version: 4.5.1 - resolution: "fast-xml-parser@npm:4.5.1" +"fast-xml-parser@npm:^5.3.4": + version: 5.4.1 + resolution: "fast-xml-parser@npm:5.4.1" dependencies: - strnum: "npm:^1.0.5" + fast-xml-builder: "npm:^1.0.0" + strnum: "npm:^2.1.2" bin: fxparser: src/cli/cli.js - checksum: 10/17ce5908e798de1b6d12a39d26f04ac3b582ea9ce28f3a6e3b9c401edcb74790f28df84d75377608af53308ff8caad2b244ba1283cc4b5b4cf4cc7bd532a9983 + checksum: 10/2b40067c3ad3542ca197d1353bcb0416cd5db20d5c66d74ac176b99af6ff9bd55a6182d36856a2fd477c95b8fc1f07405475f1662a31185480130ba7076c702a languageName: node linkType: hard @@ -13428,13 +13412,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.11": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10/70c7612c4cab18e546e36b991bbf8009a1a41cf85354afe04b113d1117569abf760269409cb3eb842d9f7b03d62826687086b081c566ea7b1e6613cf29030bf7 + checksum: 10/07372fd74b98c78cf4d417d68d41fdaa0be4dcacafffb9e67b1e3cf090bc4771515e65020651528faab238f10f9b9c0d9707d6c1574a6c0387c5de1042cde9ba languageName: node linkType: hard @@ -13478,7 +13462,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0, form-data@npm:^4.0.4": +"form-data@npm:^4.0.0": version: 4.0.4 resolution: "form-data@npm:4.0.4" dependencies: @@ -13491,6 +13475,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.5": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10/52ecd6e927c8c4e215e68a7ad5e0f7c1031397439672fd9741654b4a94722c4182e74cc815b225dcb5be3f4180f36428f67c6dd39eaa98af0dcfdd26c00c19cd + languageName: node + linkType: hard + "formidable@npm:^2.1.2": version: 2.1.2 resolution: "formidable@npm:2.1.2" @@ -20649,17 +20646,10 @@ __metadata: languageName: node linkType: hard -"strnum@npm:^1.0.5": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 10/d3117975db8372d4d7b2c07601ed2f65bf21cc48d741f37a8617b76370d228f2ec26336e53791ebc3638264d23ca54e6c241f57f8c69bd4941c63c79440525ca - languageName: node - linkType: hard - -"strnum@npm:^2.1.0": - version: 2.1.1 - resolution: "strnum@npm:2.1.1" - checksum: 10/d5fe6e4333cddc17569331048e403e876ffcf629989815f0359b0caf05dae9441b7eef3d7dd07427313ac8b3f05a8f60abc1f61efc15f97245dbc24028362bc9 +"strnum@npm:^2.1.2": + version: 2.1.2 + resolution: "strnum@npm:2.1.2" + checksum: 10/7d894dff385e3a5c5b29c012cf0a7ea7962a92c6a299383c3d6db945ad2b6f3e770511356a9774dbd54444c56af1dc7c435dad6466c47293c48173274dd6c631 languageName: node linkType: hard