diff --git a/.github/TEMPO_NIGHTLY_FAILURE_TEMPLATE.md b/.github/TEMPO_NIGHTLY_FAILURE_TEMPLATE.md new file mode 100644 index 0000000000000..8f72899c63611 --- /dev/null +++ b/.github/TEMPO_NIGHTLY_FAILURE_TEMPLATE.md @@ -0,0 +1,10 @@ +--- +title: "bug: tempo nightly workflow failed" +labels: P-high, T-bug +--- + +The nightly Tempo workflow (mainnet and testnet checks) has failed. This indicates a regression in Foundry's Tempo support or an issue with the Tempo mainnet/testnet endpoints. + +Check the [tempo nightly workflow page]({{ env.WORKFLOW_URL }}) for details. + +This issue was raised by the workflow at `.github/workflows/ci-tempo.yml`. diff --git a/.github/scripts/matrices.py b/.github/scripts/matrices.py index b60ea7048884d..727fa08893881 100755 --- a/.github/scripts/matrices.py +++ b/.github/scripts/matrices.py @@ -68,10 +68,10 @@ def __init__( profile = os.environ.get("PROFILE") is_pr = os.environ.get("EVENT_NAME") == "pull_request" t_linux_x86 = Target( - "depot-ubuntu-latest-16", "x86_64-unknown-linux-gnu", "linux-amd64" + "ubuntu-latest-16", "x86_64-unknown-linux-gnu", "linux-amd64" ) t_linux_arm = Target( - "depot-ubuntu-latest-arm-16", "aarch64-unknown-linux-gnu", "linux-aarch64" + "ubuntu-latest-arm-16", "aarch64-unknown-linux-gnu", "linux-aarch64" ) t_macos = Target("depot-macos-latest", "aarch64-apple-darwin", "macosx-aarch64") t_windows = Target("depot-windows-latest-16", "x86_64-pc-windows-msvc", "windows-amd64") diff --git a/.github/workflows/bump-tempo.yml b/.github/workflows/bump-tempo.yml deleted file mode 100644 index ffbd68d772d81..0000000000000 --- a/.github/workflows/bump-tempo.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Bump Tempo Dependencies - -permissions: {} - -on: - schedule: - # Run daily at 00:00 UTC - - cron: "0 0 * * *" - workflow_dispatch: - -jobs: - bump-tempo: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - fetch-depth: 0 - - - name: Bump tempo dependencies - id: bump - env: - GH_TOKEN: ${{ github.token }} - run: ./.github/scripts/bump-tempo.sh - - - name: Create Pull Request - if: steps.bump.outputs.updated == 'true' - env: - GH_TOKEN: ${{ github.token }} - LATEST_REV: ${{ steps.bump.outputs.latest_rev }} - CHANGELOG_FILE: ${{ steps.bump.outputs.changelog }} - run: | - BRANCH_NAME="deps/bump-tempo-${LATEST_REV:0:7}" - - # Skip if a PR already exists for this branch - EXISTING_PR=$(gh pr list --head "$BRANCH_NAME" --state open --json number --jq '.[0].number') - if [[ -n "$EXISTING_PR" ]]; then - echo "PR #${EXISTING_PR} already exists for ${BRANCH_NAME}, skipping." - exit 0 - fi - - # Configure git - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - # Create and push branch (force-push in case a stale branch exists from a prior failed run) - git checkout -b "$BRANCH_NAME" - git add Cargo.toml Cargo.lock - git commit -m "chore(deps): bump tempo dependencies to ${LATEST_REV:0:7}" - git push --force-with-lease origin "$BRANCH_NAME" - - # Create PR - gh pr create \ - --title "chore(deps): bump tempo dependencies to ${LATEST_REV:0:7}" \ - --body-file "$CHANGELOG_FILE" \ - --base main \ - --head "$BRANCH_NAME" diff --git a/.github/workflows/ci-mpp.yml b/.github/workflows/ci-mpp.yml deleted file mode 100644 index 3a608b6500a90..0000000000000 --- a/.github/workflows/ci-mpp.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: CI MPP - -permissions: {} - -on: - push: - branches: [master] - pull_request: - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - CARGO_TERM_COLOR: always - RUSTC_WRAPPER: "sccache" - -jobs: - mpp-check: - runs-on: depot-ubuntu-latest - timeout-minutes: 60 - permissions: - contents: read - steps: - # Checkout the repository - - uses: actions/checkout@v6 - with: - persist-credentials: false - - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master - with: - toolchain: stable - - - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2 - - # Build and install binaries - - name: Build and install Foundry binaries - run: | - cargo build --profile dev --locked -p forge -p cast -p anvil -p chisel - echo "${{ github.workspace }}/target/debug" >> "$GITHUB_PATH" - - - name: Run MPP e2e test - env: - TEMPO_PRIVATE_KEY: ${{ secrets.TEMPO_PRIVATE_KEY }} - TEMPO_KEYS_TOML_B64: ${{ secrets.TEMPO_KEYS_TOML_B64 }} - MPP_API_KEY: ${{ secrets.MPP_API_KEY }} - MPP_DEPOSIT: "1000000" - TEMPO_AUTO_FUND: "1" - run: | - if [ -n "${TEMPO_PRIVATE_KEY:-}" ]; then - echo "::notice::Using TEMPO_PRIVATE_KEY for MPP e2e" - elif [ -n "${TEMPO_KEYS_TOML_B64:-}" ]; then - mkdir -p ~/.tempo/wallet - echo "$TEMPO_KEYS_TOML_B64" | tr -d '[:space:]' | base64 -d > ~/.tempo/wallet/keys.toml - else - echo "::warning::TEMPO_PRIVATE_KEY or TEMPO_KEYS_TOML_B64 secret not set, skipping MPP e2e" - exit 0 - fi - ./.github/scripts/tempo-mpp.sh "$(which cast | xargs dirname)" diff --git a/.github/workflows/ci-tempo.yml b/.github/workflows/ci-tempo.yml deleted file mode 100644 index 06451b8428ea6..0000000000000 --- a/.github/workflows/ci-tempo.yml +++ /dev/null @@ -1,122 +0,0 @@ -name: CI Tempo - -permissions: {} - -on: - push: - branches: [master] - pull_request: - workflow_dispatch: - inputs: - network: - description: "Tempo network to check" - required: true - type: choice - options: - - testnet - - devnet - - mainnet - - all - scripts: - description: "Which scripts to run" - required: false - type: choice - default: "both" - options: - - check - - deploy - - both - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - CARGO_TERM_COLOR: always - RUSTC_WRAPPER: "sccache" - -jobs: - tempo-check: - runs-on: depot-ubuntu-latest - timeout-minutes: 60 - permissions: - contents: read - steps: - # Checkout the repository - - uses: actions/checkout@v6 - with: - persist-credentials: false - - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master - with: - toolchain: stable - - - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2 - - # Build and install binaries - - name: Build and install Foundry binaries - run: | - cargo build --profile dev --locked -p forge -p cast -p anvil -p chisel - echo "${{ github.workspace }}/target/debug" >> "$GITHUB_PATH" - - # TODO: re-enable once devnet is up and stable - # - name: Run Tempo check on devnet - # if: | - # github.event_name == 'pull_request' || - # github.event.inputs.network == 'devnet' || - # github.event.inputs.network == 'all' - # env: - # ETH_RPC_URL: ${{ secrets.TEMPO_DEVNET_RPC_URL }} - # SCRIPTS: ${{ github.event.inputs.scripts || 'both' }} - # run: | - # if [ "$SCRIPTS" = "check" ] || [ "$SCRIPTS" = "both" ]; then - # ./.github/scripts/tempo-check.sh - # fi - # if [ "$SCRIPTS" = "deploy" ] || [ "$SCRIPTS" = "both" ]; then - # ./.github/scripts/tempo-deploy.sh - # fi - - # TODO: re-enable once devnet is up and stable - # - name: Run Tempo wallet tests on devnet - # if: | - # github.event_name == 'pull_request' || - # github.event.inputs.network == 'devnet' || - # github.event.inputs.network == 'all' - # env: - # ETH_RPC_URL: ${{ secrets.TEMPO_DEVNET_RPC_URL }} - # run: ./.github/scripts/tempo-wallet.sh - - - name: Run Tempo check on testnet - if: | - github.event_name == 'pull_request' || - github.event.inputs.network == 'testnet' || - github.event.inputs.network == 'all' - env: - ETH_RPC_URL: ${{ secrets.TEMPO_TESTNET_RPC_URL }} - VERIFIER_URL: ${{ secrets.VERIFIER_URL }} - SCRIPTS: ${{ github.event.inputs.scripts || 'both' }} - run: | - if [ "$SCRIPTS" = "check" ] || [ "$SCRIPTS" = "both" ]; then - ./.github/scripts/tempo-check.sh - fi - if [ "$SCRIPTS" = "deploy" ] || [ "$SCRIPTS" = "both" ]; then - ./.github/scripts/tempo-deploy.sh - fi - - - name: Run Tempo check on mainnet - if: | - github.event.inputs.network == 'mainnet' || - github.event.inputs.network == 'all' - env: - ETH_RPC_URL: ${{ secrets.TEMPO_MAINNET_RPC_URL }} - TEMPO_FEE_TOKEN: "0x20c0000000000000000000000000000000000000" - VERIFIER_URL: ${{ secrets.VERIFIER_URL }} - PRIVATE_KEY: ${{ secrets.THROW_AWAY_MAINNET_PKEY }} - SCRIPTS: ${{ github.event.inputs.scripts || 'both' }} - run: | - if [ "$SCRIPTS" = "check" ] || [ "$SCRIPTS" = "both" ]; then - ./.github/scripts/tempo-check.sh - fi - if [ "$SCRIPTS" = "deploy" ] || [ "$SCRIPTS" = "both" ]; then - ./.github/scripts/tempo-deploy.sh - fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9eb90a76cdbfd..3437887f04c15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,9 +3,8 @@ name: CI permissions: {} on: - push: - branches: [master] pull_request: + merge_group: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -23,10 +22,7 @@ jobs: contents: read with: profile: default - secrets: - ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} - ARBITRUM_RPC: ${{ secrets.ARBITRUM_RPC }} - ETH_SEPOLIA_RPC: ${{ secrets.ETH_SEPOLIA_RPC }} + secrets: inherit docs: uses: ./.github/workflows/docs.yml @@ -34,42 +30,54 @@ jobs: contents: read pages: write id-token: write + secrets: inherit doctest: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master with: toolchain: stable - - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 + - uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1 - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 - - run: cargo test --workspace --doc --locked + - uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2 + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Configure git for private cargo deps + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" + - run: cargo test --workspace --doc typos: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - - uses: crate-ci/typos@cf5f1c29a8ac336af8568821ec41919923b05a83 # v1.45.1 + - uses: crate-ci/typos@2d0ce569feab1f8752f1dde43cc2f2aa53236e06 # v1 shellcheck: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 5 permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - name: Shellcheck @@ -77,32 +85,43 @@ jobs: run: ./.github/scripts/shellcheck.sh clippy: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master with: toolchain: nightly components: clippy - - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 + - uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1 - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 - - run: cargo clippy --workspace --all-targets --all-features --locked + - uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2 + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Configure git for private cargo deps + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" + - run: cargo clippy --workspace --all-targets --all-features env: RUSTFLAGS: -Dwarnings rustfmt: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master @@ -112,28 +131,91 @@ jobs: - run: cargo fmt --all --check forge-fmt: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master with: toolchain: stable - - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 + - uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1 - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + - uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2 + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Configure git for private cargo deps + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" - name: forge fmt shell: bash run: ./.github/scripts/format.sh --check + crate-checks: + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master + with: + toolchain: stable + - uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1 + - uses: taiki-e/install-action@763e3324d4fd026c9bd284c504378585777a87d5 # v2 + with: + tool: cargo-hack + - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + - uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2 + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Configure git for private cargo deps + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" + - run: cargo hack check + deny: - uses: tempoxyz/ci/.github/workflows/deny.yml@268b3ce142717ff86c58fbbcc3abc3f109f0fb8d # main + runs-on: ubuntu-latest + timeout-minutes: 15 permissions: contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Configure git for private cargo deps + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" + - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + - uses: taiki-e/install-action@763e3324d4fd026c9bd284c504378585777a87d5 # v2 + with: + tool: cargo-deny + - run: cargo deny --all-features check codeql: name: analyze (${{ matrix.language }}) @@ -150,16 +232,16 @@ jobs: build-mode: none steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@v6 with: persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" @@ -175,6 +257,7 @@ jobs: - clippy - rustfmt - forge-fmt + - crate-checks - deny - codeql timeout-minutes: 30 diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index b97a99d5310a4..5c5b4f5b442e5 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -6,7 +6,7 @@ on: workflow_dispatch: inputs: tag_name: - default: nightly-dev + default: nightly description: The tag we're building for type: string workflow_call: @@ -24,27 +24,27 @@ env: IMAGE_NAME: ${{ github.repository }} # Keep in sync with `release.yml`. - RUST_PROFILE: dist - RUST_FEATURES: aws-kms,gcp-kms,turnkey,cli,asm-keccak,js-tracer + RUST_PROFILE: maxperf + RUST_FEATURES: aws-kms,gcp-kms,turnkey,cli,asm-keccak,js-tracer,credible jobs: build: name: build and push - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest permissions: contents: read id-token: write packages: write timeout-minutes: 60 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Login into registry ${{ env.REGISTRY }} - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -54,32 +54,26 @@ jobs: # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta - uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 + uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - # Derive Docker tags from inputs.tag_name: - # - v{major}.{minor}.{patch}: tagged as :v1.2.3, :v1.2, :v1, and :latest - # - nightly-{SHA}: tagged as :nightly-{SHA} and :nightly - # - anything else: tagged as-is + # Creates an additional 'latest' or 'nightly' tag + # If the job is triggered via cron schedule, tag nightly and nightly-{SHA} + # If the job is triggered via workflow dispatch and on a master branch, tag branch and latest + # Otherwise, just tag as the branch name - name: Finalize Docker Metadata id: docker_tagging run: | - TAG="${{ inputs.tag_name }}" - REGISTRY="${{ env.REGISTRY }}" - IMAGE="${{ env.IMAGE_NAME }}" - - if [[ "$TAG" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then - MAJOR="v${BASH_REMATCH[1]}" - MINOR="v${BASH_REMATCH[1]}.${BASH_REMATCH[2]}" - printf "version tag release, assigning %s, %s, %s, and latest tags\n" "$TAG" "$MINOR" "$MAJOR" - printf "docker_tags=%s/%s:%s,%s/%s:%s,%s/%s:%s,%s/%s:latest\n" "$REGISTRY" "$IMAGE" "$TAG" "$REGISTRY" "$IMAGE" "$MINOR" "$REGISTRY" "$IMAGE" "$MAJOR" "$REGISTRY" "$IMAGE" >> "$GITHUB_OUTPUT" - elif [[ "$TAG" =~ ^nightly- ]]; then - printf "nightly release, assigning %s and nightly tags\n" "$TAG" - printf "docker_tags=%s/%s:%s,%s/%s:nightly\n" "$REGISTRY" "$IMAGE" "$TAG" "$REGISTRY" "$IMAGE" >> "$GITHUB_OUTPUT" + if [[ "${{ github.event_name }}" == "schedule" ]]; then + printf "cron trigger, assigning nightly tag\n" + printf "docker_tags=%s/%s:nightly,%s/%s:nightly-%s\n" "${{ env.REGISTRY }}" "${{ env.IMAGE_NAME }}" "${{ env.REGISTRY }}" "${{ env.IMAGE_NAME }}" "$GITHUB_SHA" >> "$GITHUB_OUTPUT" + elif [[ "${GITHUB_REF##*/}" == "main" ]] || [[ "${GITHUB_REF##*/}" == "master" ]]; then + printf "manual trigger from master/main branch, assigning latest tag\n" + printf "docker_tags=%s/%s:%s,%s/%s:latest\n" "${{ env.REGISTRY }}" "${{ env.IMAGE_NAME }}" "${GITHUB_REF##*/}" "${{ env.REGISTRY }}" "${{ env.IMAGE_NAME }}" >> "$GITHUB_OUTPUT" else - printf "tagging as %s\n" "$TAG" - printf "docker_tags=%s/%s:%s\n" "$REGISTRY" "$IMAGE" "$TAG" >> "$GITHUB_OUTPUT" + printf "Neither scheduled nor manual release from main branch. Just tagging as branch name\n" + printf "docker_tags=%s/%s:%s\n" "${{ env.REGISTRY }}" "${{ env.IMAGE_NAME }}" "${GITHUB_REF##*/}" >> "$GITHUB_OUTPUT" fi # Log docker metadata to explicitly know what is being pushed @@ -89,10 +83,10 @@ jobs: printf "LABELS -> %s\n" "${{ steps.meta.outputs.labels }}" - name: Set up Depot CLI - uses: depot/setup-action@15c09a5f77a0840ad4bce955686522a257853461 # v1.7.1 + uses: depot/setup-action@b0b1ea4f69e92ebf5dea3f8713a1b0c37b2126a5 # v1 - name: Build and push Foundry image - uses: depot/build-push-action@5f3b3c2e5a00f0093de47f657aeaefcedff27d18 # v1.17.0 + uses: depot/build-push-action@9785b135c3c76c33db102e45be96a25ab55cd507 # v1 with: build-args: | RUST_PROFILE=${{ env.RUST_PROFILE }} @@ -105,4 +99,3 @@ jobs: labels: ${{ steps.meta.outputs.labels }} platforms: linux/amd64,linux/arm64 push: true - no-cache: true diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 45d00708394f5..a18a7f2805dfd 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -18,7 +18,7 @@ env: jobs: docs: - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: contents: read @@ -30,6 +30,17 @@ jobs: with: toolchain: nightly - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + - name: Configure git for private cargo deps + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + run: git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" - name: Build documentation run: cargo doc --workspace --all-features --no-deps --document-private-items --locked env: @@ -46,7 +57,7 @@ jobs: deploy-docs: if: github.ref_name == 'master' && github.event_name == 'push' needs: [docs] - runs-on: depot-ubuntu-latest + runs-on: ubuntu-latest timeout-minutes: 30 permissions: pages: write diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc1d6923da812..e7ac9bff2e350 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,9 @@ permissions: {} on: push: tags: + - "stable" + - "rc" + - "rc-*" - "v*.*.*" schedule: - cron: "0 6 * * *" @@ -15,8 +18,10 @@ env: IS_NIGHTLY: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} # Keep in sync with `docker-publish.yml`. - RUST_PROFILE: dist - RUST_FEATURES: aws-kms,gcp-kms,turnkey,cli,asm-keccak,js-tracer + RUST_PROFILE: maxperf + RUST_FEATURES: aws-kms,gcp-kms,turnkey,cli,asm-keccak,js-tracer,credible + + LAST_STABLE_VERSION: "v1.5.0" jobs: prepare: @@ -31,7 +36,7 @@ jobs: release_name: ${{ steps.release_info.outputs.release_name }} changelog: ${{ steps.build_changelog.outputs.changelog }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false fetch-depth: 0 @@ -42,17 +47,9 @@ jobs: if [[ ${IS_NIGHTLY} == 'true' ]]; then printf 'tag_name=%s\n' "nightly-${GITHUB_SHA}" >> "$GITHUB_OUTPUT" printf 'release_name=%s\n' "Nightly ($(date '+%Y-%m-%d'))" >> "$GITHUB_OUTPUT" - # Find the previous nightly tag for changelog generation, - # sorted by tag creation date (most recent first). - PREV_NIGHTLY=$(git tag -l 'nightly-*' --sort=-creatordate | head -n1) - printf 'from_tag=%s\n' "$PREV_NIGHTLY" >> "$GITHUB_OUTPUT" else printf 'tag_name=%s\n' "$GITHUB_REF_NAME" >> "$GITHUB_OUTPUT" printf 'release_name=%s\n' "$GITHUB_REF_NAME" >> "$GITHUB_OUTPUT" - # Find the previous stable release tag (v*.*.*) for changelog generation, - # skipping the current tag so we diff from the last stable release. - PREV_STABLE=$(git tag -l 'v*.*.*' --sort=-v:refname | grep -v "^${GITHUB_REF_NAME}$" | head -n1) - printf 'from_tag=%s\n' "$PREV_STABLE" >> "$GITHUB_OUTPUT" fi # Creates a `nightly-SHA` tag for this specific nightly @@ -61,7 +58,7 @@ jobs: # the changelog. - name: Create build-specific nightly tag if: ${{ env.IS_NIGHTLY == 'true' }} - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + uses: actions/github-script@v8 env: TAG_NAME: ${{ steps.release_info.outputs.tag_name }} with: @@ -71,47 +68,14 @@ jobs: - name: Build changelog id: build_changelog - uses: mikepenz/release-changelog-builder-action@bcae7115752d4ed746ff92feb666574428a79415 # v6.2 + uses: mikepenz/release-changelog-builder-action@439f79b5b5428107c7688c1d2b0e8bacc9b8792c # v6 with: configuration: "./.github/changelog.json" - fromTag: ${{ steps.release_info.outputs.from_tag || '' }} + fromTag: ${{ env.IS_NIGHTLY == 'true' && 'nightly' || env.STABLE_VERSION }} toTag: ${{ steps.release_info.outputs.tag_name }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # Create the GitHub release as a draft up-front so that all matrix jobs - # only upload assets to an existing draft. With immutable releases - # enabled, an immutable release is sealed when it is published, so all - # assets must be attached before that. Stable releases are then left as - # a draft for a maintainer to publish manually; nightlies are auto- - # published by the `publish-nightly` job at the end of the workflow. - - name: Create draft release - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_REPO: ${{ github.repository }} - TAG_NAME: ${{ steps.release_info.outputs.tag_name }} - RELEASE_NAME: ${{ steps.release_info.outputs.release_name }} - CHANGELOG: ${{ steps.build_changelog.outputs.changelog }} - shell: bash - run: | - set -euo pipefail - if release_json="$(gh release view "$TAG_NAME" --json isDraft 2>/dev/null)"; then - is_draft="$(printf '%s' "$release_json" | grep -o '"isDraft":[^,}]*' | cut -d: -f2 | tr -d ' ')" - if [[ "$is_draft" == "true" ]]; then - echo "Draft release $TAG_NAME already exists; reusing it." - exit 0 - fi - echo "::error::Release $TAG_NAME is already published; cannot upload more assets to an immutable release." - exit 1 - fi - notes_file="$(mktemp)" - printf '%s' "$CHANGELOG" > "$notes_file" - flags=(--draft --verify-tag --title "$RELEASE_NAME" --notes-file "$notes_file") - if [[ "$IS_NIGHTLY" == "true" ]]; then - flags+=(--prerelease) - fi - gh release create "$TAG_NAME" "${flags[@]}" - release-docker: name: Release Docker needs: prepare @@ -123,10 +87,6 @@ jobs: with: tag_name: ${{ needs.prepare.outputs.tag_name }} - # This job uploads assets to the draft release created in `prepare`. - # Stable releases stay as drafts for a maintainer to publish manually; - # nightlies are auto-published by the `publish-nightly` job below. Either - # way, GitHub's immutable-releases setting seals the release at publish. release: permissions: id-token: write @@ -181,14 +141,19 @@ jobs: platform: win32 arch: amd64 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # master with: toolchain: stable targets: ${{ matrix.target }} - - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 + - uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1 + + - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + if: ${{ contains(matrix.runner, 'depot') }} + - run: printf 'RUSTC_WRAPPER=sccache\n' >> "$GITHUB_ENV" + if: ${{ contains(matrix.runner, 'depot') }} - name: Apple M1 setup if: matrix.target == 'aarch64-apple-darwin' @@ -198,7 +163,7 @@ jobs: - name: cross setup if: contains(matrix.target, 'musl') - uses: taiki-e/cache-cargo-install-action@f9eed3e4680f27610dc6d8c67be1b88593f7dade # v3.0.6 + uses: taiki-e/cache-cargo-install-action@7447f04c51f2ba27ca35e7f1e28fab848c5b3ba7 # v2 with: git: https://github.com/cross-rs/cross rev: baf457efc2555225af47963475bd70e8d2f5993f @@ -214,7 +179,7 @@ jobs: shell: bash run: | set -eo pipefail - flags=(--locked --target $TARGET --profile $RUST_PROFILE --bins + flags=(--target $TARGET --profile $RUST_PROFILE --bins --no-default-features --features "$RUST_FEATURES") # `jemalloc` is not fully supported on MSVC or aarch64 Linux. @@ -267,7 +232,7 @@ jobs: printf "foundry_attestation=%s\n" "foundry_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.attestation.txt" >> "$GITHUB_OUTPUT" - name: Upload build artifacts - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@v6 with: retention-days: 1 name: ${{ steps.artifacts.outputs.file_name }} @@ -295,7 +260,7 @@ jobs: - name: Binaries attestation id: attestation - uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 + uses: actions/attest-build-provenance@v3 with: subject-path: | ${{ env.anvil_bin_path }} @@ -312,59 +277,77 @@ jobs: set -euo pipefail printf '%s\n' "$ATTESTATION_URL" > "$FOUNDRY_ATTESTATION" - # Upload assets to the draft release created in `prepare`. Stable - # releases stay as drafts after this workflow finishes; a maintainer - # publishes them manually. Nightlies are auto-published below. - - name: Upload assets to draft release - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_REPO: ${{ github.repository }} - TAG_NAME: ${{ needs.prepare.outputs.tag_name }} - FILE_NAME: ${{ steps.artifacts.outputs.file_name }} - FOUNDRY_ATTESTATION: ${{ steps.artifacts.outputs.foundry_attestation }} - FOUNDRY_MAN: ${{ steps.man.outputs.foundry_man }} - shell: bash - run: | - set -euo pipefail - files=("$FILE_NAME" "$FOUNDRY_ATTESTATION") - if [[ -n "${FOUNDRY_MAN:-}" ]]; then - files+=("$FOUNDRY_MAN") - fi - gh release upload "$TAG_NAME" "${files[@]}" --clobber + # Creates the release for this specific version + - name: Create release + uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 + with: + name: ${{ needs.prepare.outputs.release_name }} + tag_name: ${{ needs.prepare.outputs.tag_name }} + prerelease: ${{ env.IS_NIGHTLY == 'true' }} + body: ${{ needs.prepare.outputs.changelog }} + files: | + ${{ steps.artifacts.outputs.file_name }} + ${{ steps.artifacts.outputs.foundry_attestation }} + ${{ steps.man.outputs.foundry_man }} + + # If this is a nightly release, it also updates the release + # tagged `nightly` for compatibility with `foundryup` + - name: Update nightly release + if: ${{ env.IS_NIGHTLY == 'true' }} + uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 + with: + name: "Nightly" + tag_name: "nightly" + prerelease: true + body: ${{ needs.prepare.outputs.changelog }} + files: | + ${{ steps.artifacts.outputs.file_name }} + ${{ steps.artifacts.outputs.foundry_attestation }} + ${{ steps.man.outputs.foundry_man }} - # Auto-publish nightly releases once all assets have been uploaded so that - # foundryup and other consumers see them immediately. Stable releases are - # left as drafts for a maintainer to publish manually. - publish-nightly: - name: Publish nightly release + cleanup: + name: Release cleanup runs-on: ubuntu-latest - needs: [prepare, release-docker, release] - if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + timeout-minutes: 30 permissions: contents: write + needs: release + if: always() steps: - - name: Publish release - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_REPO: ${{ github.repository }} - TAG_NAME: ${{ needs.prepare.outputs.tag_name }} - shell: bash - run: gh release edit "$TAG_NAME" --draft=false + - uses: actions/checkout@v6 + with: + persist-credentials: false + + # Moves the `nightly` tag to `HEAD` + - name: Move nightly tag + if: ${{ env.IS_NIGHTLY == 'true' }} + uses: actions/github-script@v8 + with: + script: | + const moveTag = require('./.github/scripts/move-tag.js') + await moveTag({ github, context }, 'nightly') + + - name: Delete old nightlies + uses: actions/github-script@v8 + with: + script: | + const prunePrereleases = require('./.github/scripts/prune-prereleases.js') + await prunePrereleases({github, context}) # If any of the jobs fail, this will create a high-priority issue to signal so. issue: name: Open an issue runs-on: ubuntu-latest - needs: [prepare, release-docker, release, publish-nightly] + needs: [prepare, release-docker, release, cleanup] if: failure() permissions: contents: read issues: write steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@v6 with: persist-credentials: false - - uses: JasonEtco/create-an-issue@1b14a70e4d8dc185e5cc76d3bec9eab20257b2c5 # v2.9.2 + - uses: JasonEtco/create-an-issue@1b14a70e4d8dc185e5cc76d3bec9eab20257b2c5 # v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} WORKFLOW_URL: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eaa46c8e79f7c..b9861afb5760b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -110,11 +110,21 @@ jobs: ${{ runner.os }}-foundry-${{ matrix.name }}- - uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + - name: Generate GitHub App token (cross-repo cargo auth) + id: app-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.4 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} - name: Setup Git config + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} run: | git config --global user.name "GitHub Actions Bot" git config --global user.email "<>" git config --global url."https://github.com/".insteadOf "git@github.com:" + git config --global url."https://x-access-token:${GH_TOKEN}@github.com/".insteadOf "https://github.com/" - name: Test env: SVM_TARGET_PLATFORM: ${{ matrix.svm_target_platform }} diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000..c4a84884ee1d8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "testdata/lib/credible-std"] +path = testdata/lib/credible-std +url = https://github.com/phylaxsystems/credible-std.git +branch = feat/update-assertion-interface diff --git a/Cargo.lock b/Cargo.lock index 71d56653d7a20..76b03ecc7ec47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,21 +77,21 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a547705d5c1b42575a0542bae2ba45bc62a6154be86611afaef1c0ab5c38598e" +checksum = "d8010fc7e9e8643ef4e758cdccf3eef26734594aedf88a9d5ed35e51837d42ef" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-contract", "alloy-core", - "alloy-eips 2.0.1", - "alloy-genesis", + "alloy-eips 2.0.4", + "alloy-genesis 2.0.4", "alloy-network", "alloy-provider", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-signer", "alloy-signer-local", "alloy-transport", @@ -116,16 +116,43 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "2.0.1" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f16daaf7e1f95f62c6c3bf8a3fc3d78b08ae9777810c0bb5e94966c7cd57ef0" +dependencies = [ + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 1.8.3", + "alloy-trie", + "alloy-tx-macros 1.8.3", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1 0.30.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-consensus" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8c24c95e90c1608c2d91cff1b451d796474168d3310ccc8b7cd12502ca8169" +checksum = "e3d64da86c616b5092ea64eea648f311bbd58630a0b384c42d699175d6f9122b" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-trie", - "alloy-tx-macros", + "alloy-tx-macros 2.0.4", "auto_impl", "borsh", "c-kzg", @@ -133,7 +160,7 @@ dependencies = [ "either", "k256", "once_cell", - "rand 0.8.6", + "rand 0.8.5", "secp256k1 0.30.0", "serde", "serde_json", @@ -143,33 +170,47 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "2.0.1" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "118998d9015332ab1b4720ae1f1e3009491966a0349938a1f43ff45a8a4c6299" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 1.8.3", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d211ad0ef468a70a7a829e49683ff59ad25f02b4ab3764344c4c2663329a52c" +checksum = "8fd98696ca3617d3a9ba1a6f2011880cbfd5618228dab6400c9f8bca457859a8" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] [[package]] name = "alloy-contract" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59d55233ac14aa7fa6bcdcad45ba305e90c556065e0947cd9f243c4469e7c2d" +checksum = "de3df0aadc569a8b277808a7d0ad0e421180654ea36a3c59e9ed2bb968c9a1cd" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-json-abi", "alloy-network", - "alloy-network-primitives", + "alloy-network-primitives 2.0.4", "alloy-primitives", "alloy-provider", "alloy-pubsub", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-sol-types", "alloy-transport", "futures", @@ -208,7 +249,7 @@ dependencies = [ "proptest", "serde", "serde_json", - "winnow 0.7.15", + "winnow 0.7.14", ] [[package]] @@ -238,12 +279,12 @@ dependencies = [ [[package]] name = "alloy-eip5792" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250ba1168b8a049185a68c4dfa7f2a6a4046bd26fcc8c68632caeb216a5e12dc" +checksum = "1ceb16e7fe5a95825305f218ccd356665f848831f94ce2bbf55339bf5d21e88a" dependencies = [ "alloy-primitives", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", "serde_json", ] @@ -265,14 +306,16 @@ dependencies = [ [[package]] name = "alloy-eip7928" -version = "0.3.3" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8222b1d88f9a6d03be84b0f5e76bb60cd83991b43ad8ab6477f0e4a7809b98d" +checksum = "6b827a6d7784fe3eb3489d40699407a4cdcce74271421a01bdffe60cf573bb16" dependencies = [ "alloy-primitives", "alloy-rlp", "borsh", + "once_cell", "serde", + "thiserror 2.0.18", ] [[package]] @@ -300,9 +343,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae69eaa5096b47ffe97e6a5d6bde7e7fa2dec106af22a9315621d11039c3de3c" +checksum = "64c0456f5f7a4497e9342d20f528e30f5288ddfa0d6a012bd5044afee46cd8a0" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -310,7 +353,7 @@ dependencies = [ "alloy-eip7928", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "auto_impl", "borsh", "c-kzg", @@ -325,9 +368,9 @@ dependencies = [ [[package]] name = "alloy-ens" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a8c1330ad33c95b5958573bca9a1ad0b419a51d76bb4c521556fbba8539b8d" +checksum = "d5638cbbffb318d440fdb009de019090d8d117dae40de9d10cdb29891ea59eb9" dependencies = [ "alloy-contract", "alloy-primitives", @@ -339,16 +382,36 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.33.2" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f092eb6af80456e4ab41c9722e777d791335bc9c00b11bc3db7bf29a432dfd0" +dependencies = [ + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-hardforks", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth 2.0.4", + "alloy-sol-types", + "auto_impl", + "derive_more", + "revm", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "alloy-evm" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fc4b83cb672156663e6094d098beb509965b7fe684bb3d6e44bb9ca2e9ae714" +checksum = "c1ceeea6dcbbcd4e546b27700763a6f6c3b3fee30054209884f521078b6fda4f" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-hardforks", "alloy-primitives", "alloy-rpc-types-engine", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-sol-types", "auto_impl", "derive_more", @@ -359,13 +422,28 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "2.0.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39789db0b3f3bbef0e6549c87bc6842b73886ebabee1405b6941685b1cc34083" +checksum = "bbf9480307b09d22876efb67d30cadd9013134c21f3a17ec9f93fd7536d38024" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-serde 1.8.3", + "alloy-trie", + "borsh", + "serde", + "serde_with", +] + +[[package]] +name = "alloy-genesis" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a71ff8b55d2b8aa05259f474cae7dea0e4991724dc18936b81cb23ec492a0c2a" +dependencies = [ + "alloy-eips 2.0.4", "alloy-primitives", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-trie", "borsh", "serde", @@ -400,9 +478,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662b525af73e86b2167dae923261c8edf440ba7e1426b30a8b993177bc214c02" +checksum = "19e352478b756bad5d7203148e4b461861282ea2ded3da406ba24868b52cd098" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -415,19 +493,19 @@ dependencies = [ [[package]] name = "alloy-network" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c657c2d9751d3c7d94990554b231e5372c3c2e4bad842806280b6151a0d6a05d" +checksum = "ed08ae169869e08370ed121612e0d3dadac33d1a256e9f2465926b23f0bd7d95" dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-consensus-any 2.0.4", + "alloy-eips 2.0.4", "alloy-json-rpc", - "alloy-network-primitives", + "alloy-network-primitives 2.0.4", "alloy-primitives", "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "alloy-signer", "alloy-sol-types", "async-trait", @@ -441,14 +519,27 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "2.0.1" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb82711d59a43fdfd79727c99f270b974c784ec4eb5728a0d0d22f26716c87ef" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-serde 1.8.3", + "serde", +] + +[[package]] +name = "alloy-network-primitives" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e7c4bb0ebbd6d7406d2808968f43c0d5186c69c5e58cedcbee7380f4cd1fcf" +checksum = "02e6c7ad28afe348a9a9c5624b67ee5b3607b8de98d5816b3056ecdfa6fa2697" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] @@ -457,9 +548,9 @@ name = "alloy-op-evm" version = "0.31.0" source = "git+https://github.com/ethereum-optimism/optimism?rev=42f5117c2e7de0614cd3b96f274d0a3078f9701c#42f5117c2e7de0614cd3b96f274d0a3078f9701c" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", "alloy-op-hardforks", "alloy-primitives", "auto_impl", @@ -503,7 +594,7 @@ dependencies = [ "paste", "proptest", "proptest-derive", - "rand 0.9.4", + "rand 0.9.2", "rapidhash", "ruint", "rustc-hash", @@ -513,22 +604,22 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fea0fc2628cdbc851aaa333124f9d8ab9f567ab8d4c20202819db13aa1a534" +checksum = "93a7c17472b55482d4734154c2f5ed13f72e03f6752cebb927f6a2d8b52e646c" dependencies = [ "alloy-chains", - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-json-rpc", "alloy-network", - "alloy-network-primitives", + "alloy-network-primitives 2.0.4", "alloy-primitives", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-anvil", "alloy-rpc-types-debug", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", "alloy-signer", @@ -547,7 +638,7 @@ dependencies = [ "lru", "parking_lot", "pin-project", - "reqwest 0.13.2", + "reqwest 0.13.3", "serde", "serde_json", "thiserror 2.0.18", @@ -559,9 +650,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc7b42e514613c717887dc77bb58d35e845557ebd63a18c3f92a77094e4891f" +checksum = "a8d86958b02bca85103d64fa60d7b364a8b017c6e40f2b02c3f50ca22964a738" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -603,9 +694,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ee7b51752c68fb95f21705e402700750e692b1d21ccc294ac48fadc8655d53" +checksum = "5beb5c2fe6b960c8e8b038e69fd502a90a2e930afa4770efb748b163b0767729" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -616,7 +707,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest 0.13.2", + "reqwest 0.13.3", "serde", "serde_json", "tokio", @@ -629,55 +720,55 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa76988f54105ad4398828e8aaf1a39b3f07f91fb79091529056689514ee8c2" +checksum = "4ee1257a278f6d293e05c5162c5940a1561b1aa85ded0028b464c81de37ebfa5" dependencies = [ "alloy-primitives", "alloy-rpc-types-anvil", "alloy-rpc-types-debug", "alloy-rpc-types-engine", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "serde", ] [[package]] name = "alloy-rpc-types-anvil" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d276bea4e92e4991269d31b9abd3e722eed2565b82036478a4416adb8dd4992" +checksum = "df32156f085e74eac942b6103744be49b817c302341aaa8cb0c1c88dc29228d9" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "serde", ] [[package]] name = "alloy-rpc-types-any" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1a9a3bda9be7f6515316eb792710532411878bbfc88934973f4b371376b00d" +checksum = "6a234bfbdf7a76c3d13808f729af5321852de3dedcaa6fc6d5f54787aaf54c6a" dependencies = [ - "alloy-consensus-any", - "alloy-network-primitives", + "alloy-consensus-any 2.0.4", + "alloy-network-primitives 2.0.4", "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-beacon" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5d68ddca890854fb78291cbde06115473ded00b2337d0f815e92c0c1f8003" +checksum = "296450f5e76bece0116c939b9437b0421a5da9c5d40031bf4cf9b38d3d94e475" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "derive_more", @@ -689,9 +780,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea21739e232c221779741eba7e7b9bc19ad8ff777b72736647ae519f5c9f6f33" +checksum = "0ab075ac1c25bcf697f133b7cd92e2fb26afe213e872ef79fdf77f0d7bcb3793" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -702,37 +793,58 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f05338cfb4ee5508ff76f01c88142cab8a4579db74b7d9432936c26e4f11374" +checksum = "73b12366c96f4013e1aeebc96c6b56e5f33f07853c42ea2f485045c0c157a4a1" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "derive_more", "ethereum_ssz", "ethereum_ssz_derive", "jsonwebtoken", - "rand 0.8.6", + "rand 0.8.5", "serde", "strum", ] [[package]] name = "alloy-rpc-types-eth" -version = "2.0.1" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c095f92c4e1ff4981d89e9aa02d5f98c762a1980ab66bec49c44be11349da2" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-consensus-any 1.8.3", + "alloy-eips 1.8.3", + "alloy-network-primitives 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 1.8.3", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda4ece0050154ab278241aeffade58916b04f38254832e8cb6e4671c6e72ed2" +checksum = "56a282daf869eeb7383d3d5c2deb35b0b3fb45ecb329513af4090fc61245ee18" dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips 2.0.1", - "alloy-network-primitives", + "alloy-consensus 2.0.4", + "alloy-consensus-any 2.0.4", + "alloy-eips 2.0.4", + "alloy-network-primitives 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-sol-types", "itertools 0.14.0", "serde", @@ -743,13 +855,13 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5905ac3663b0859d67b82d912acce20887d20682a0cadde79c8a763b133a515" +checksum = "6184b5d14152b68b0bb8beb621339d94f0b761a37958bb365fbf7c00922125c2" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "serde", "serde_json", "thiserror 2.0.18", @@ -757,13 +869,13 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fbf71892d4df9cae8d35dc96f15d522384bb93806205465e2c8c012b7f0a34" +checksum = "f00b631c361e7c7baaf4f1f5a9877730f3507fed2acb9d4b34841b8184b2ec28" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "serde", ] @@ -780,9 +892,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beaa5c581a67e2743d95b4849eb9cfeb90866429cdaa6d8f6b75eb988b2d0cd9" +checksum = "a0eada2558e921b39dfcead33c487364df9b31374f5733c1c9d2c891c4529933" dependencies = [ "alloy-primitives", "serde", @@ -791,9 +903,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5da9ae50f9b48d7b4e2e5cde87175257be7e5e56909a7794720597c1d9806f6" +checksum = "41eb29f7a8adcd8941fbb8e134022a133e6f8dfd345f2e3b7109599f8a7dca08" dependencies = [ "alloy-dyn-abi", "alloy-primitives", @@ -808,11 +920,11 @@ dependencies = [ [[package]] name = "alloy-signer-aws" -version = "2.0.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a57d1e72b1f9b11e5e71ebdab0569cb02277a462bbea6793fcaebfcd794ae9" +checksum = "1258987fbc82716b5153ec7bb95a8a295e7640871b8f03d8ec7c4000dc80c215" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-primitives", "alloy-signer", @@ -827,11 +939,11 @@ dependencies = [ [[package]] name = "alloy-signer-gcp" -version = "2.0.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b27f20b5298b76a5a3b7cdbe6bdb184ab1ebd6e120e00dad748867673f5c90" +checksum = "7ffc2a49bca5b73c6964711b57452f6c36a6bcb7f845ab7e9ad05b5a828d0161" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-primitives", "alloy-signer", @@ -845,11 +957,11 @@ dependencies = [ [[package]] name = "alloy-signer-ledger" -version = "2.0.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c7acc40ffbfd37d4113eb619863099f3235d78d044006a1eecb94d8b0b2f1a" +checksum = "94e11ddaddfb98c1ddce737dc440225565b0ae0987ac9ad5e59a85db5904878c" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-network", "alloy-primitives", @@ -865,11 +977,11 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b794002d57fd2f71b4c87298a41ca24dfc0f2cf6630d95106a477e451747ba" +checksum = "bef839e7ce9b59aa60fa9a175e97986c6145c888d643b0f1fb0a3e7b8e56a2e2" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-primitives", "alloy-signer", @@ -878,18 +990,18 @@ dependencies = [ "coins-bip39", "eth-keystore", "k256", - "rand 0.8.6", + "rand 0.8.5", "thiserror 2.0.18", "zeroize", ] [[package]] name = "alloy-signer-trezor" -version = "2.0.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a09a865ae9e1f05478429ef0d935b16467f35c6e0b02cb10f23f66a3b33fc3" +checksum = "44eb341d0013784da6a39e5bbdc11b95d6744993b12a1c3fd55df795a850dd42" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-primitives", "alloy-signer", @@ -902,11 +1014,11 @@ dependencies = [ [[package]] name = "alloy-signer-turnkey" -version = "2.0.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bb8218544ab635281f1be180a1cfd9b5d549db686faa7e85b3b2c10969819e" +checksum = "82ff16b4166fb90bbe79bd1e49244824fb3cadc6b8cd11e9c8a002c1f8c07492" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-primitives", "alloy-signer", @@ -974,7 +1086,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" dependencies = [ "serde", - "winnow 0.7.15", + "winnow 0.7.14", ] [[package]] @@ -991,9 +1103,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19dec9bfb59647254afdecbb5ddcddd7ba02edcd48ffa40510bddfbed0be1634" +checksum = "3ac7a80c0bac3e44559d53d002e34c461dc2f23262b42cafec019bc70551abbe" dependencies = [ "alloy-json-rpc", "auto_impl", @@ -1014,14 +1126,14 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2035f3c4d6bee20624da2dcf765d469b292398e48d766ffade61b0fcf8b4d45d" +checksum = "eed3ed3300a998f88639ed619fdbbd88bd82865e00c6a8ecb796c99eb12358f6" dependencies = [ "alloy-json-rpc", "alloy-transport", "itertools 0.14.0", - "reqwest 0.13.2", + "reqwest 0.13.3", "serde_json", "tower", "tracing", @@ -1030,9 +1142,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfad7aa9206fcb831ae401b6a1c893a402b8eed74f9c8ffbb7a7323afb0d9a4c" +checksum = "1075d9d30fd4d71e50000fd4afb19ed2664ceab20c2a29f3889a6e988329e02d" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -1050,9 +1162,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "2.0.1" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5aa8ff49386df3e008b73c7fb0a5479410e8493fdb86a8b916877a16e8aead9" +checksum = "0e3bff84b2b2a46eb34cc522dc3f889a2867c70be90a377421429b662b3ec4ce" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -1085,9 +1197,21 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "2.0.1" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69722eddcdf1ce096c3ab66cf8116999363f734eb36fe94a148f4f71c85da84" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "alloy-tx-macros" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3520337f3d3d063a7fe20f47aaa62d695e3dc0372b34f601560dee24e76988b9" +checksum = "99fce0350197dcd4ba4e9a7dd43915d908c0eb0e7352755791709a705e1c76b6" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -1111,18 +1235,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4" dependencies = [ "anstyle", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] name = "annotate-snippets" -version = "0.12.15" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92570a3f9c98e7e84df84b71d0965ac99b1871fcd75a3773a3bd1bad13f64cf7" +checksum = "96401ca08501972288ecbcde33902fce858bf73fbcbdf91dab8c3a9544e106bb" dependencies = [ "anstyle", "memchr", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -1132,22 +1256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", - "anstyle-parse 0.2.7", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse 1.0.0", + "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", @@ -1157,15 +1266,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-lossy" -version = "1.1.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ca7d0f520afcd6d817970d0b2d5fd7c630c75e7783cae046b8b8a783c5befa" +checksum = "04d3a5dc826f84d0ea11882bb8054ff7f3d482602e11bb181101303a279ea01f" dependencies = [ "anstyle", ] @@ -1179,15 +1288,6 @@ dependencies = [ "utf8parse", ] -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - [[package]] name = "anstyle-query" version = "1.1.5" @@ -1199,15 +1299,15 @@ dependencies = [ [[package]] name = "anstyle-svg" -version = "0.1.12" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22d9f3dea8bbda97c75bd0f0203e23f1e190d6d6f27a40e10063946dc4d4362" +checksum = "26b9ec8c976eada1b0f9747a3d7cc4eae3bef10613e443746e7487f26c872fde" dependencies = [ "anstyle", "anstyle-lossy", - "anstyle-parse 0.2.7", + "anstyle-parse", "html-escape", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -1223,15 +1323,15 @@ dependencies = [ [[package]] name = "anvil" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-contract", "alloy-dyn-abi", - "alloy-eips 2.0.1", - "alloy-evm", - "alloy-genesis", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", + "alloy-genesis 2.0.4", "alloy-network", "alloy-op-evm", "alloy-primitives", @@ -1240,8 +1340,8 @@ dependencies = [ "alloy-rlp", "alloy-rpc-types", "alloy-rpc-types-beacon", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "alloy-signer", "alloy-signer-local", "alloy-sol-types", @@ -1270,13 +1370,13 @@ dependencies = [ "futures", "hyper", "itertools 0.14.0", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "op-alloy-rpc-types", "op-revm", "parking_lot", - "rand 0.8.6", - "rand 0.9.4", - "reqwest 0.13.2", + "rand 0.8.5", + "rand 0.9.2", + "reqwest 0.13.3", "revm", "revm-inspectors", "serde", @@ -1291,28 +1391,28 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tracing", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", "yansi", ] [[package]] name = "anvil-core" -version = "1.6.0" +version = "1.7.1" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-eip5792", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-network", "alloy-primitives", "alloy-rlp", "alloy-rpc-types", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "bytes", "foundry-common", "foundry-evm", "foundry-primitives", - "rand 0.9.4", + "rand 0.9.2", "revm", "serde", "serde_json", @@ -1321,7 +1421,7 @@ dependencies = [ [[package]] name = "anvil-rpc" -version = "1.6.0" +version = "1.7.1" dependencies = [ "serde", "serde_json", @@ -1329,7 +1429,7 @@ dependencies = [ [[package]] name = "anvil-server" -version = "1.6.0" +version = "1.7.1" dependencies = [ "anvil-rpc", "async-trait", @@ -1630,7 +1730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -1640,7 +1740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -1650,7 +1750,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -1678,14 +1778,80 @@ dependencies = [ "term", ] +[[package]] +name = "assertion-da-client" +version = "1.4.0" +source = "git+https://github.com/phylaxsystems/credible-sdk.git?branch=lea%2Feng-3169-featcredible-sdk-update-revm-and-alloy-dependencies#7812d7d33e20f176ce64bfa4111003b9fb0ccbc2" +dependencies = [ + "alloy-primitives", + "assertion-da-core", + "http 1.4.0", + "reqwest 0.12.26", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tokio-util", + "url", +] + +[[package]] +name = "assertion-da-core" +version = "1.4.0" +source = "git+https://github.com/phylaxsystems/credible-sdk.git?branch=lea%2Feng-3169-featcredible-sdk-update-revm-and-alloy-dependencies#7812d7d33e20f176ce64bfa4111003b9fb0ccbc2" +dependencies = [ + "alloy-primitives", + "serde", +] + +[[package]] +name = "assertion-executor" +version = "1.4.0" +source = "git+https://github.com/phylaxsystems/credible-sdk.git?branch=lea%2Feng-3169-featcredible-sdk-update-revm-and-alloy-dependencies#7812d7d33e20f176ce64bfa4111003b9fb0ccbc2" +dependencies = [ + "alloy-chains", + "alloy-consensus 2.0.4", + "alloy-evm 0.34.0", + "alloy-network", + "alloy-network-primitives 2.0.4", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types", + "alloy-signer", + "alloy-sol-types", + "assertion-da-client", + "bincode", + "bumpalo", + "bytes", + "dashmap", + "eip-common", + "enum-as-inner", + "metrics", + "op-revm", + "rapidhash", + "rayon", + "reth-db", + "reth-db-api 1.11.2", + "reth-libmdbx", + "revm", + "serde", + "serde_json", + "sled", + "strum", + "thiserror 2.0.18", + "tokio", + "tracing", +] + [[package]] name = "async-compression" -version = "0.4.41" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" dependencies = [ "compression-codecs", "compression-core", + "futures-core", "pin-project-lite", "tokio", ] @@ -1793,9 +1959,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.15" +version = "1.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11493b0bad143270fb8ad284a096dd529ba91924c5409adeac856cc1bf047dbc" +checksum = "96571e6996817bf3d58f6b569e4b9fd2e9d2fcf9f7424eed07b2ce9bb87535e5" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1813,7 +1979,7 @@ dependencies = [ "fastrand", "hex", "http 1.4.0", - "sha1", + "ring", "time", "tokio", "tracing", @@ -1823,9 +1989,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.14" +version = "1.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f20799b373a1be121fe3005fba0c2090af9411573878f224df44b42727fcaf7" +checksum = "3cd362783681b15d136480ad555a099e82ecd8e2d10a841e14dfd0078d67fee3" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1835,9 +2001,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.16.3" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -1846,9 +2012,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.40.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" dependencies = [ "cc", "cmake", @@ -1858,9 +2024,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.7.2" +version = "1.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc0651c57e384202e47153c1260b84a9936e19803d747615edf199dc3b98d17" +checksum = "d81b5b2898f6798ad58f484856768bca817e3cd9de0974c24ae0f1113fe88f1b" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1871,28 +2037,26 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "bytes-utils", "fastrand", - "http 1.4.0", - "http-body 1.0.1", + "http 0.2.12", + "http-body 0.4.6", "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.23.1", + "uuid 1.19.0", ] [[package]] name = "aws-sdk-kms" -version = "1.104.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41ae6a33da941457e89075ef8ca5b4870c8009fe4dceeba82fce2f30f313ac6" +checksum = "b35a6be02a6fd3618c701a49a4dac4282658d18ccfcdcc8ac3b6c2fb4317e4fa" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", - "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1900,23 +2064,21 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.97.0" +version = "1.91.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aadc669e184501caaa6beafb28c6267fc1baef0810fb58f9b205485ca3f2567" +checksum = "8ee6402a36f27b52fe67661c6732d684b2635152b676aa2babbfb5204f99115d" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", - "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1924,23 +2086,21 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.99.0" +version = "1.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1342a7db8f358d3de0aed2007a0b54e875458e39848d54cc1d46700b2bfcb0a8" +checksum = "a45a7f750bbd170ee3677671ad782d90b894548f4e4ae168302c57ec9de5cb3e" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", - "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -1948,23 +2108,21 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.101.0" +version = "1.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab41ad64e4051ecabeea802d6a17845a91e83287e1dd249e6963ea1ba78c428a" +checksum = "55542378e419558e6b1f398ca70adb0b2088077e79ad9f14eb09441f2f7b2164" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", - "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -1973,16 +2131,15 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", - "http 1.4.0", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.4.2" +version = "1.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b660013a6683ab23797778e21f1f854744fdf05f68204b4cca4c8c04b5d1f4" +checksum = "69e523e1c4e8e7e8ff219d732988e22bfeae8a1cafdbe6d9eca1546fa080be7c" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -2002,9 +2159,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.14" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffcaf626bdda484571968400c326a244598634dc75fd451325a54ad1a59acfc" +checksum = "9ee19095c7c4dda59f1697d028ce704c24b2d33c6718790c7f1d5a3015b4107c" dependencies = [ "futures-util", "pin-project-lite", @@ -2013,9 +2170,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.63.6" +version = "0.62.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ab2dc1c2c3749ead27180d333c42f11be8b0e934058fb4b2258ee8dbe5231" +checksum = "826141069295752372f8203c17f28e30c464d22899a43a0c9fd9c458d469c88b" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -2023,9 +2180,9 @@ dependencies = [ "bytes-utils", "futures-core", "futures-util", + "http 0.2.12", "http 1.4.0", - "http-body 1.0.1", - "http-body-util", + "http-body 0.4.6", "percent-encoding", "pin-project-lite", "pin-utils", @@ -2034,9 +2191,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.12" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a2f165a7feee6f263028b899d0a181987f4fa7179a6411a32a439fba7c5f769" +checksum = "59e62db736db19c488966c8d787f52e6270be565727236fd5579eaa301e7bc4a" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -2058,27 +2215,27 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.62.5" +version = "0.61.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9648b0bb82a2eedd844052c6ad2a1a822d1f8e3adee5fbf668366717e428856a" +checksum = "49fa1213db31ac95288d981476f78d05d9cbb0353d22cdf3472cc05bb02f6551" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.2.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06c2315d173edbf1920da8ba3a7189695827002e4c0fc961973ab1c54abca9c" +checksum = "17f616c3f2260612fe44cede278bafa18e73e6479c4e393e2c4518cf2a9a228a" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.15" +version = "0.60.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a56d79744fb3edb5d722ef79d86081e121d3b9422cb209eb03aea6aa4f21ebd" +checksum = "ae5d689cf437eae90460e944a58b5668530d433b4ff85789e69d2f2a556e057d" dependencies = [ "aws-smithy-types", "urlencoding", @@ -2086,9 +2243,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.11.1" +version = "1.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0504b1ab12debb5959e5165ee5fe97dd387e7aa7ea6a477bfd7635dfe769a4f5" +checksum = "65fda37911905ea4d3141a01364bc5509a0f32ae3f3b22d6e330c0abfb62d247" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -2102,7 +2259,6 @@ dependencies = [ "http 1.4.0", "http-body 0.4.6", "http-body 1.0.1", - "http-body-util", "pin-project-lite", "pin-utils", "tokio", @@ -2111,12 +2267,11 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.12.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71a13df6ada0aafbf21a73bdfcdf9324cfa9df77d96b8446045be3cde61b42e" +checksum = "ab0d43d899f9e508300e587bf582ba54c27a452dd0a9ea294690669138ae14a2" dependencies = [ "aws-smithy-async", - "aws-smithy-runtime-api-macros", "aws-smithy-types", "bytes", "http 0.2.12", @@ -2128,21 +2283,10 @@ dependencies = [ ] [[package]] -name = "aws-smithy-runtime-api-macros" -version = "1.0.0" +name = "aws-smithy-types" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d7396fd9500589e62e460e987ecb671bad374934e55ec3b5f498cc7a8a8a7b7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "aws-smithy-types" -version = "1.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d73dbfbaa8e4bc57b9045137680b958d274823509a360abfd8e1d514d40c95c" +checksum = "905cb13a9895626d49cf2ced759b062d913834c7482c38e49557eac4e6193f01" dependencies = [ "base64-simd", "bytes", @@ -2163,18 +2307,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.15" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce02add1aa3677d022f8adf81dcbe3046a95f17a1b1e8979c145cd21d3d22b3" +checksum = "11b2f670422ff42bf7065031e72b45bc52a3508bd089f743ea90731ca2b6ea57" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.14" +version = "1.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c8323699dd9b3c8d5b3c13051ae9cdef58fd179957c882f8374dd8725962d9" +checksum = "1d980627d2dd7bfc32a3c025685a033eeab8d365cc840c631ef59d1b8f428164" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -2186,9 +2330,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ "axum-core", "base64 0.22.1", @@ -2213,7 +2357,7 @@ dependencies = [ "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite 0.29.0", + "tokio-tungstenite 0.28.0", "tower", "tower-layer", "tower-service", @@ -2222,9 +2366,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.6" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" dependencies = [ "bytes", "futures-core", @@ -2251,7 +2395,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -2284,9 +2428,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.3" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" [[package]] name = "bech32" @@ -2300,6 +2444,33 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.10.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.117", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -2339,9 +2510,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ "serde_core", ] @@ -2361,9 +2532,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.4" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ "arrayref", "arrayvec", @@ -2424,11 +2595,11 @@ dependencies = [ [[package]] name = "boa_ast" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6339a700715bda376f5ea65c76e8fe8fc880930d8b0638cea68e7f3da6538e0a" +checksum = "bc119a5ad34c3f459062a96907f53358989b173d104258891bb74f95d93747e8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "boa_interner", "boa_macros", "boa_string", @@ -2439,13 +2610,13 @@ dependencies = [ [[package]] name = "boa_engine" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1521be326f8a5c8887e95d4ce7f002917a002a23f7b93b9a6a2bf50ed4157824" +checksum = "e637ec52ea66d76b0ca86180c259d6c7bb6e6a6e14b2f36b85099306d8b00cc3" dependencies = [ "aligned-vec", "arrayvec", - "bitflags 2.11.1", + "bitflags 2.10.0", "boa_ast", "boa_gc", "boa_interner", @@ -2473,7 +2644,7 @@ dependencies = [ "num_enum", "paste", "portable-atomic", - "rand 0.9.4", + "rand 0.9.2", "regress", "rustc-hash", "ryu-js", @@ -2491,9 +2662,9 @@ dependencies = [ [[package]] name = "boa_gc" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17323a98cf2e631afacf1a6d659c1212c48a68bacfa85afab0a66ade80582e51" +checksum = "f1179f690cbfcbe5364cceee5f1cb577265bb6f07b0be6f210aabe270adcf9da" dependencies = [ "boa_macros", "boa_string", @@ -2503,9 +2674,9 @@ dependencies = [ [[package]] name = "boa_interner" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20510b8b02bcde9b0a01cf34c0c308c56156503d1d91cdab4c8cfbd292b747ea" +checksum = "9626505d33dc63d349662437297df1d3afd9d5fc4a2b3ad34e5e1ce879a78848" dependencies = [ "boa_gc", "boa_macros", @@ -2519,9 +2690,9 @@ dependencies = [ [[package]] name = "boa_macros" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5822cb4f146d243060e588bc5a5f2e709683fdad3d7111f42c48e6b5c921d23d" +checksum = "7f36418a46544b152632c141b0a0b7a453cd69ca150caeef83aee9e2f4b48b7d" dependencies = [ "cfg-if", "cow-utils", @@ -2533,11 +2704,11 @@ dependencies = [ [[package]] name = "boa_parser" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd957fa9fa93e3a001a8aba5a5cd40c2bbfde486378be4c4b472fd304aaddb" +checksum = "02f99bf5b684f0de946378fcfe5f38c3a0fbd51cbf83a0f39ff773a0e218541f" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "boa_ast", "boa_interner", "boa_macros", @@ -2551,9 +2722,9 @@ dependencies = [ [[package]] name = "boa_string" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2da1d7f4a76fd9040788a122f0d807910800a7b86f5952e9244848c36511de" +checksum = "45ce9d7aa5563a2e14eab111e2ae1a06a69a812f6c0c3d843196c9d03fbef440" dependencies = [ "fast-float2", "itoa", @@ -2590,20 +2761,19 @@ dependencies = [ [[package]] name = "borsh" -version = "1.6.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" dependencies = [ "borsh-derive", - "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.6.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" dependencies = [ "once_cell", "proc-macro-crate", @@ -2641,9 +2811,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "byte-slice-cast" @@ -2653,9 +2823,9 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] @@ -2711,6 +2881,15 @@ dependencies = [ "serde", ] +[[package]] +name = "cache-advisor" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f89ab55ca4e6a46a0740a1c5346db1ad66e4a76598bbfa060dc3259935a7450" +dependencies = [ + "crossbeam-queue", +] + [[package]] name = "camino" version = "1.2.2" @@ -2745,15 +2924,15 @@ dependencies = [ [[package]] name = "cast" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-contract", "alloy-dyn-abi", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-ens", - "alloy-evm", + "alloy-evm 0.33.3", "alloy-hardforks", "alloy-json-abi", "alloy-json-rpc", @@ -2763,7 +2942,7 @@ dependencies = [ "alloy-rlp", "alloy-rpc-types", "alloy-rpc-types-beacon", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-signer", "alloy-signer-local", "alloy-sol-types", @@ -2790,11 +2969,11 @@ dependencies = [ "foundry-wallets", "futures", "itertools 0.14.0", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "op-alloy-flz", "op-alloy-network", - "rand 0.8.6", - "rand 0.9.4", + "rand 0.8.5", + "rand 0.9.2", "rayon", "regex", "revm", @@ -2822,9 +3001,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.60" +version = "1.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" dependencies = [ "find-msvc-tools", "jobserver", @@ -2838,6 +3017,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -2876,7 +3064,7 @@ dependencies = [ [[package]] name = "chisel" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -2894,7 +3082,7 @@ dependencies = [ "foundry-solang-parser", "foundry-test-utils", "itertools 0.14.0", - "reqwest 0.13.2", + "reqwest 0.13.3", "rexpect", "rustyline", "semver 1.0.28", @@ -2904,23 +3092,23 @@ dependencies = [ "tempfile", "time", "tracing", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", "walkdir", "yansi", ] [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -2961,11 +3149,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" -version = "4.6.1" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -2983,33 +3182,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ - "anstream 1.0.0", + "anstream", "anstyle", "clap_lex", "strsim", "terminal_size", "unicase", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] name = "clap_complete" -version = "4.6.2" +version = "4.5.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff7a1dccbdd8b078c2bdebff47e404615151534d5043da397ec50286816f9cb" +checksum = "004eef6b14ce34759aa7de4aea3217e368f463f46a3ed3764ca4b5a4404003b4" dependencies = [ "clap", ] [[package]] name = "clap_complete_nushell" -version = "4.6.0" +version = "4.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb9e9715d29a754b468591be588f6b926f5b0a1eb6a8b62acabeb66ff84d897" +checksum = "685bc86fd34b7467e0532a4f8435ab107960d69a243785ef0275e571b35b641a" dependencies = [ "clap", "clap_complete", @@ -3017,9 +3216,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", @@ -3029,17 +3228,17 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.1.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clearscreen" -version = "4.0.6" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d669bb552908e336ad5681789752033b45566b7e591aeaac7a614e58e5d6d8f2" +checksum = "85a8ab73a1c02b0c15597b22e09c7dc36e63b2f601f9d1e83ac0c3decd38b1ae" dependencies = [ - "nix 0.31.2", + "nix 0.29.0", "terminfo", "thiserror 2.0.18", "which", @@ -3048,9 +3247,9 @@ dependencies = [ [[package]] name = "cliclack" -version = "0.3.8" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa510b739c618c679375ea9c5af44ce9f591289546e874ad5910e7ce7df79844" +checksum = "2381872509dfa50d8b92b92a5da8367ba68458ab9494be4134b57ad6ca26295f" dependencies = [ "console 0.15.11", "indicatif", @@ -3071,9 +3270,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.58" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" dependencies = [ "cc", ] @@ -3111,7 +3310,7 @@ dependencies = [ "hmac", "once_cell", "pbkdf2 0.12.2", - "rand 0.8.6", + "rand 0.8.5", "sha2 0.10.9", "thiserror 1.0.69", ] @@ -3186,15 +3385,15 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "colored" -version = "3.1.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" dependencies = [ "windows-sys 0.59.0", ] @@ -3211,13 +3410,13 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.2.2" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" dependencies = [ "crossterm", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -3236,7 +3435,7 @@ dependencies = [ "cfg-if", "commonware-macros", "paste", - "rand 0.8.6", + "rand 0.8.5", "rand_chacha 0.3.1", "thiserror 2.0.18", ] @@ -3263,11 +3462,11 @@ dependencies = [ "ctutils", "ecdsa", "ed25519-consensus", - "getrandom 0.2.17", + "getrandom 0.2.16", "num-rational", "num-traits", "p256", - "rand 0.8.6", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", "sha2 0.10.9", @@ -3296,7 +3495,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.117", - "toml", + "toml 0.9.10+spec-1.1.0", ] [[package]] @@ -3335,7 +3534,7 @@ dependencies = [ "commonware-codec", "commonware-macros", "futures", - "getrandom 0.2.17", + "getrandom 0.2.16", "hashbrown 0.16.1", "num-bigint", "num-integer", @@ -3343,7 +3542,7 @@ dependencies = [ "num-traits", "parking_lot", "pin-project", - "rand 0.8.6", + "rand 0.8.5", "thiserror 2.0.18", "tokio", "zeroize", @@ -3365,9 +3564,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.37" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" dependencies = [ "compression-core", "flate2", @@ -3380,6 +3579,17 @@ version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" +[[package]] +name = "concurrent-map" +version = "5.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6542c565fbcba786db59307d7840f0bf5cd9e0aba6502755337e15f0e06fd65" +dependencies = [ + "ebr", + "serde", + "stack-map", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -3398,19 +3608,20 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.2", + "unicode-width 0.2.0", "windows-sys 0.59.0", ] [[package]] name = "console" -version = "0.16.3" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" dependencies = [ "encode_unicode", "libc", - "unicode-width 0.2.2", + "once_cell", + "unicode-width 0.2.0", "windows-sys 0.61.2", ] @@ -3426,9 +3637,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.18.1" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531185e432bb31db1ecda541e9e7ab21468d4d844ad7505e0546a49b4945d49b" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -3442,14 +3653,19 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const_format" -version = "0.2.36" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", - "konst", ] [[package]] @@ -3478,6 +3694,16 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -3596,6 +3822,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -3608,7 +3843,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "crossterm_winapi", "derive_more", "document-features", @@ -3660,9 +3895,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "hybrid-array", ] @@ -3678,12 +3913,12 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.2" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ "dispatch2", - "nix 0.31.2", + "nix 0.30.1", "windows-sys 0.61.2", ] @@ -3745,6 +3980,16 @@ dependencies = [ "darling_macro 0.20.11", ] +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + [[package]] name = "darling" version = "0.23.0" @@ -3769,6 +4014,20 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + [[package]] name = "darling_core" version = "0.23.0" @@ -3794,6 +4053,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.117", +] + [[package]] name = "darling_macro" version = "0.23.0" @@ -3822,9 +4092,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.10.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "der" @@ -3832,16 +4102,16 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] [[package]] name = "deranged" -version = "0.5.8" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", "serde_core", @@ -3860,9 +4130,9 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.6.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", @@ -3940,11 +4210,17 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" dependencies = [ - "console 0.16.3", + "console 0.16.2", "shell-words", "zeroize", ] +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + [[package]] name = "diff" version = "0.1.13" @@ -3967,19 +4243,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid", + "const-oid 0.9.6", "crypto-common 0.1.7", "subtle", ] [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", - "crypto-common 0.2.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", ] [[package]] @@ -4005,11 +4282,11 @@ dependencies = [ [[package]] name = "dispatch2" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "block2", "libc", "objc2", @@ -4028,9 +4305,9 @@ dependencies = [ [[package]] name = "doctest-file" -version = "1.1.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2db04e74f0a9a93103b50e90b96024c9b2bdca8bce6a632ec71b88736d3d359" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" [[package]] name = "document-features" @@ -4085,6 +4362,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "ebr" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b1ea3b18359d566f360eaf811a2d69bc6c8eb6faaeecc8839975633860a076e" +dependencies = [ + "shared-local-state", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -4129,9 +4415,19 @@ dependencies = [ [[package]] name = "ego-tree" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8" +checksum = "b04dc5a38e4f151a79d9f2451ae6037fb6eaf5cba34771f44781f80e508498e3" + +[[package]] +name = "eip-common" +version = "1.4.0" +source = "git+https://github.com/phylaxsystems/credible-sdk.git?branch=lea%2Feng-3169-featcredible-sdk-update-revm-and-alloy-dependencies#7812d7d33e20f176ce64bfa4111003b9fb0ccbc2" +dependencies = [ + "alloy-eips 2.0.4", + "alloy-primitives", + "revm", +] [[package]] name = "either" @@ -4177,22 +4473,22 @@ dependencies = [ [[package]] name = "email-address-parser" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e981c3b50d728bb498dd0f860a7228ef17e19efef5cc2c6e30d78ebce13bcaa7" +checksum = "7fe19a4967eca30062be4abaf813d929ba48b3bfb21830367f7e1baae37f213a" dependencies = [ "console_error_panic_hook", "pest", "pest_derive", - "quick-xml 0.39.2", + "quick-xml 0.18.1", "wasm-bindgen", ] [[package]] name = "ena" -version = "0.14.4" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ "log", ] @@ -4218,6 +4514,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "enum-ordinalize" version = "4.3.2" @@ -4240,21 +4548,27 @@ dependencies = [ [[package]] name = "env_filter" -version = "1.0.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", ] +[[package]] +name = "env_home" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" + [[package]] name = "env_logger" -version = "0.11.10" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ - "anstream 1.0.0", + "anstream", "anstyle", "env_filter", "jiff", @@ -4289,9 +4603,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" dependencies = [ "serde", "serde_core", @@ -4326,7 +4640,7 @@ dependencies = [ "hex", "hmac", "pbkdf2 0.11.0", - "rand 0.8.6", + "rand 0.8.5", "scrypt", "serde", "serde_json", @@ -4351,13 +4665,13 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.10.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368a4a4e4273b0135111fe9464e35465067766a8f664615b5a86338b73864407" +checksum = "7e8cd8c4f47dfb947dbfe3cdf2945ae1da808dbedc592668658e827a12659ba1" dependencies = [ "alloy-primitives", "ethereum_serde_utils", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_derive", "smallvec", @@ -4366,9 +4680,9 @@ dependencies = [ [[package]] name = "ethereum_ssz_derive" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cd82c68120c89361e1a457245cf212f7d9f541bffaffed530c8f2d54a160b2" +checksum = "daf022360bdbe9456eda5f35718a50476d5b2a0d51a97ed4eae27420737a6fba" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -4399,9 +4713,9 @@ dependencies = [ [[package]] name = "evmole" -version = "0.8.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e332670cb19161dee3f15ae86bfb5e4361bb1716d7c1995bd309b5360cb630" +checksum = "6b62c02aa0474cf6c68610ee424dc5feddbe004ea48632c14d237fefa3d893a3" dependencies = [ "alloy-dyn-abi", "alloy-primitives", @@ -4438,9 +4752,9 @@ checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" [[package]] name = "fastrand" -version = "2.4.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -4464,6 +4778,12 @@ dependencies = [ "bytes", ] +[[package]] +name = "fault-injection" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3d175246dec3fddef3b1fcd57acdb023e4c562d032e9eccc5f246da3d7fed3" + [[package]] name = "fd-lock" version = "4.0.4" @@ -4503,24 +4823,24 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "figment2" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4380ce44915a6227efbb61e3885bc1c8e99fb9820f5db612abfac2c5cfc46871" +checksum = "87d63dee16df12076c7770919713c0b92f4e1c85eac828dc2ade0b6c998f016b" dependencies = [ "atomic", "parking_lot", "serde", "tempfile", - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit 0.25.11+spec-1.1.0", "uncased", "version_check", ] [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fixed-hash" @@ -4529,7 +4849,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.6", + "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -4563,13 +4883,13 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.9" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", - "zlib-rs", ] [[package]] @@ -4602,16 +4922,16 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-awesome-as-a-crate" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "932dcfbd51320af5f27f1ba02d2e567dec332cac7d2c221ba45d8e767264c4dc" +checksum = "b40fbe89eb7639971503bf5f17bd31c41338e8f92e03c5744d07f2e03d43f679" [[package]] name = "forge" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-hardforks", "alloy-json-abi", @@ -4659,10 +4979,10 @@ dependencies = [ "path-slash", "proptest", "quick-junit", - "rand 0.9.4", + "rand 0.9.2", "rayon", "regex", - "reqwest 0.13.2", + "reqwest 0.13.3", "revm", "semver 1.0.28", "serde", @@ -4678,7 +4998,7 @@ dependencies = [ "tempo-alloy", "thiserror 2.0.18", "tokio", - "toml_edit 0.24.1+spec-1.1.0", + "toml_edit 0.24.0+spec-1.1.0", "tower-http", "tracing", "url", @@ -4690,7 +5010,7 @@ dependencies = [ [[package]] name = "forge-doc" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-primitives", "derive_more", @@ -4708,13 +5028,13 @@ dependencies = [ "serde_json", "solar-compiler", "thiserror 2.0.18", - "toml", + "toml 0.9.10+spec-1.1.0", "tracing", ] [[package]] name = "forge-fmt" -version = "1.6.0" +version = "1.7.1" dependencies = [ "foundry-common", "foundry-config", @@ -4723,12 +5043,12 @@ dependencies = [ "similar", "snapbox", "solar-compiler", - "toml", + "toml 0.9.10+spec-1.1.0", ] [[package]] name = "forge-lint" -version = "1.6.0" +version = "1.7.1" dependencies = [ "eyre", "foundry-common", @@ -4742,13 +5062,13 @@ dependencies = [ [[package]] name = "forge-script" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", - "alloy-eips 2.0.1", - "alloy-evm", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", "alloy-json-abi", "alloy-network", "alloy-primitives", @@ -4790,7 +5110,7 @@ dependencies = [ [[package]] name = "forge-script-sequence" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-network", "alloy-primitives", @@ -4806,7 +5126,7 @@ dependencies = [ [[package]] name = "forge-sol-macro-gen" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -4821,11 +5141,11 @@ dependencies = [ [[package]] name = "forge-verify" -version = "1.6.0" +version = "1.7.1" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", - "alloy-evm", + "alloy-evm 0.33.3", "alloy-json-abi", "alloy-primitives", "alloy-provider", @@ -4844,7 +5164,7 @@ dependencies = [ "futures", "itertools 0.14.0", "regex", - "reqwest 0.13.2", + "reqwest 0.13.3", "revm", "semver 1.0.28", "serde", @@ -4867,7 +5187,7 @@ dependencies = [ [[package]] name = "foundry-bench" -version = "1.6.0" +version = "1.7.1" dependencies = [ "chrono", "clap", @@ -4884,15 +5204,15 @@ dependencies = [ [[package]] name = "foundry-block-explorers" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41211d5c69c92070d2e2174eff99ffb259d0d568d2e4f789d2a7251b4416ccd" +checksum = "786287256b3da26184e25d66685d33fd208d0b6e2098895cf7e880f3ce18eca1" dependencies = [ "alloy-chains", "alloy-json-abi", "alloy-primitives", "foundry-compilers", - "reqwest 0.13.2", + "reqwest 0.13.3", "semver 1.0.28", "serde", "serde_json", @@ -4902,14 +5222,14 @@ dependencies = [ [[package]] name = "foundry-cheatcodes" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-ens", - "alloy-evm", - "alloy-genesis", + "alloy-evm 0.33.3", + "alloy-genesis 2.0.4", "alloy-json-abi", "alloy-network", "alloy-primitives", @@ -4919,6 +5239,7 @@ dependencies = [ "alloy-signer", "alloy-signer-local", "alloy-sol-types", + "assertion-executor", "base64 0.22.1", "dialoguer", "ecdsa", @@ -4932,6 +5253,7 @@ dependencies = [ "foundry-evm-core", "foundry-evm-fuzz", "foundry-evm-traces", + "foundry-fork-db", "foundry-wallets", "itertools 0.14.0", "jsonpath_lib", @@ -4940,7 +5262,7 @@ dependencies = [ "p256", "parking_lot", "proptest", - "rand 0.9.4", + "rand 0.9.2", "revm", "revm-inspectors", "semver 1.0.28", @@ -4948,29 +5270,29 @@ dependencies = [ "serde_json", "solar-compiler", "thiserror 2.0.18", - "toml", + "toml 0.9.10+spec-1.1.0", "tracing", "walkdir", ] [[package]] name = "foundry-cheatcodes-spec" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-sol-types", "foundry-macros", - "schemars 1.2.1", + "schemars 1.1.0", "serde", "serde_json", ] [[package]] name = "foundry-cli" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", "alloy-dyn-abi", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-ens", "alloy-json-abi", "alloy-network", @@ -5011,14 +5333,14 @@ dependencies = [ "tikv-jemallocator", "tokio", "tracing", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", "tracing-tracy", "yansi", ] [[package]] name = "foundry-cli-markdown" -version = "1.6.0" +version = "1.7.1" dependencies = [ "clap", "pretty_assertions", @@ -5026,12 +5348,12 @@ dependencies = [ [[package]] name = "foundry-common" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-json-abi", "alloy-json-rpc", "alloy-network", @@ -5047,7 +5369,7 @@ dependencies = [ "alloy-transport", "alloy-transport-ipc", "alloy-transport-ws", - "anstream 0.6.21", + "anstream", "anstyle", "axum", "chrono", @@ -5072,7 +5394,7 @@ dependencies = [ "op-alloy-rpc-types", "path-slash", "regex", - "reqwest 0.13.2", + "reqwest 0.13.3", "revm", "rustls", "semver 1.0.28", @@ -5085,7 +5407,7 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-tungstenite 0.28.0", - "toml", + "toml 0.9.10+spec-1.1.0", "tower", "tracing", "url", @@ -5096,19 +5418,19 @@ dependencies = [ [[package]] name = "foundry-common-fmt" -version = "1.6.0" +version = "1.7.1" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-network", "alloy-primitives", "alloy-rpc-types", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "chrono", "comfy-table", "eyre", "foundry-macros", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "op-alloy-rpc-types", "revm", "serde", @@ -5134,7 +5456,7 @@ dependencies = [ "fs_extra", "itertools 0.14.0", "path-slash", - "rand 0.9.4", + "rand 0.9.2", "rayon", "semver 1.0.28", "serde", @@ -5146,7 +5468,7 @@ dependencies = [ "tempfile", "thiserror 2.0.18", "tracing", - "winnow 0.7.15", + "winnow 0.7.14", "yansi", ] @@ -5219,7 +5541,7 @@ dependencies = [ [[package]] name = "foundry-config" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", "alloy-primitives", @@ -5249,8 +5571,8 @@ dependencies = [ "soldeer-core", "tempfile", "thiserror 2.0.18", - "toml", - "toml_edit 0.24.1+spec-1.1.0", + "toml 0.9.10+spec-1.1.0", + "toml_edit 0.24.0+spec-1.1.0", "tracing", "unit-prefix", "walkdir", @@ -5259,7 +5581,7 @@ dependencies = [ [[package]] name = "foundry-debugger" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-primitives", "crossterm", @@ -5277,7 +5599,7 @@ dependencies = [ [[package]] name = "foundry-evm" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -5309,12 +5631,12 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tracing", - "uuid 1.23.1", + "uuid 1.19.0", ] [[package]] name = "foundry-evm-abi" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -5326,13 +5648,13 @@ dependencies = [ [[package]] name = "foundry-evm-core" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", - "alloy-evm", - "alloy-genesis", + "alloy-evm 0.33.3", + "alloy-genesis 2.0.4", "alloy-hardforks", "alloy-json-abi", "alloy-network", @@ -5341,7 +5663,7 @@ dependencies = [ "alloy-provider", "alloy-rlp", "alloy-rpc-types", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "alloy-sol-types", "anvil", "auto_impl", @@ -5356,7 +5678,7 @@ dependencies = [ "foundry-test-utils", "futures", "itertools 0.14.0", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "op-alloy-network", "op-alloy-rpc-types", "op-revm", @@ -5378,7 +5700,7 @@ dependencies = [ [[package]] name = "foundry-evm-coverage" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-primitives", "eyre", @@ -5394,7 +5716,7 @@ dependencies = [ [[package]] name = "foundry-evm-fuzz" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -5409,7 +5731,7 @@ dependencies = [ "itertools 0.14.0", "parking_lot", "proptest", - "rand 0.9.4", + "rand 0.9.2", "revm", "serde", "solar-compiler", @@ -5419,7 +5741,7 @@ dependencies = [ [[package]] name = "foundry-evm-hardforks" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -5434,11 +5756,11 @@ dependencies = [ [[package]] name = "foundry-evm-networks" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", - "alloy-eips 2.0.1", - "alloy-evm", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", "alloy-op-hardforks", "alloy-primitives", "clap", @@ -5450,11 +5772,11 @@ dependencies = [ [[package]] name = "foundry-evm-sancov" -version = "1.6.0" +version = "1.7.1" [[package]] name = "foundry-evm-traces" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -5472,15 +5794,13 @@ dependencies = [ "itertools 0.14.0", "memchr", "rayon", - "reqwest 0.13.2", + "reqwest 0.13.3", "revm", "revm-inspectors", "serde", "serde_json", "solar-compiler", "tempfile", - "tempo-contracts", - "tempo-precompiles", "tokio", "tracing", "yansi", @@ -5506,12 +5826,12 @@ dependencies = [ "tokio", "tracing", "url", - "zstd", + "zstd 0.13.3", ] [[package]] name = "foundry-linking" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-primitives", "foundry-compilers", @@ -5522,7 +5842,7 @@ dependencies = [ [[package]] name = "foundry-macros" -version = "1.6.0" +version = "1.7.1" dependencies = [ "proc-macro-error2", "proc-macro2", @@ -5532,21 +5852,21 @@ dependencies = [ [[package]] name = "foundry-primitives" -version = "1.6.0" +version = "1.7.1" dependencies = [ - "alloy-consensus", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-evm 0.33.3", "alloy-network", "alloy-op-evm", "alloy-primitives", "alloy-provider", "alloy-rlp", "alloy-rpc-types", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "alloy-signer", "derive_more", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "op-alloy-rpc-types", "op-revm", "revm", @@ -5573,7 +5893,7 @@ dependencies = [ [[package]] name = "foundry-test-utils" -version = "1.6.0" +version = "1.7.1" dependencies = [ "alloy-chains", "alloy-primitives", @@ -5586,16 +5906,16 @@ dependencies = [ "foundry-config", "idna_adapter", "parking_lot", - "rand 0.9.4", + "rand 0.9.2", "regex", - "reqwest 0.13.2", + "reqwest 0.13.3", "serde_json", "snapbox", "svm-rs", "tempfile", "tokio", "tracing", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", "ui_test", ] @@ -5605,7 +5925,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f2cc1ff7ea002addf41bd9c5785cd34f6a7b9658998c50035cc860ffebc3a9" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-dyn-abi", "alloy-network", "alloy-primitives", @@ -5633,21 +5953,28 @@ dependencies = [ "tempo-primitives", "thiserror 2.0.18", "tokio", - "toml", + "toml 0.9.10+spec-1.1.0", "tower", "tower-http", "tracing", - "uuid 1.23.1", + "uuid 1.19.0", "webbrowser", ] [[package]] name = "fragile" -version = "2.1.0" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" + +[[package]] +name = "fs2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8878864ba14bb86e818a412bfd6f18f9eabd4ec0f008a28e8f7eb61db532fcf9" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ - "futures-core", + "libc", + "winapi", ] [[package]] @@ -5665,6 +5992,12 @@ dependencies = [ "libc", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "funty" version = "2.0.0" @@ -5672,20 +6005,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "futf" -version = "0.1.5" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -5696,11 +6019,24 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-buffered" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin", +] + [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -5708,28 +6044,30 @@ dependencies = [ [[package]] name = "futures-concurrency" -version = "7.7.1" +version = "7.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175cd8cca9e1d45b87f18ffa75088f2099e3c4fe5e2f83e42de112560bea8ea6" +checksum = "0eb68017df91f2e477ed4bea586c59eaecaa47ed885a770d0444e21e62572cd2" dependencies = [ "fixedbitset", + "futures-buffered", "futures-core", "futures-lite", "pin-project", + "slab", "smallvec", ] [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -5738,9 +6076,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -5757,9 +6095,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -5768,21 +6106,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -5792,6 +6130,7 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", + "pin-utils", "slab", ] @@ -5814,9 +6153,9 @@ dependencies = [ "hyper", "jsonwebtoken", "once_cell", - "prost 0.14.3", - "prost-types 0.14.3", - "reqwest 0.13.2", + "prost 0.14.1", + "prost-types 0.14.1", + "reqwest 0.13.3", "secret-vault-value", "serde", "serde_json", @@ -5840,8 +6179,8 @@ dependencies = [ "libc", "log", "rustversion", - "windows-link", - "windows-result", + "windows-link 0.1.3", + "windows-result 0.3.4", ] [[package]] @@ -5857,9 +6196,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.17" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -5945,9 +6284,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -5975,9 +6314,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "6.4.0" +version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e" +checksum = "d43ccdfe15a81ab0a8af639e90254227c9a46afd9c5f5b6ec7efaa345c4b0f00" dependencies = [ "derive_builder", "log", @@ -6026,9 +6365,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hashlink" @@ -6107,9 +6446,9 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.36.1" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6452c4751a24e1b99c3260d505eaeee76a050573e61f30ac2c924ddc7236f01e" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" dependencies = [ "log", "markup5ever", @@ -6190,18 +6529,18 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" dependencies = [ "typenum", ] [[package]] name = "hyper" -version = "1.9.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -6214,6 +6553,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -6221,19 +6561,20 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.9" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.4.0", "hyper", "hyper-util", "rustls", "rustls-native-certs", + "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.7", + "webpki-roots 1.0.4", ] [[package]] @@ -6251,13 +6592,14 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.20" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.4.0", "http-body 1.0.1", @@ -6276,9 +6618,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.65" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -6286,7 +6628,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -6313,9 +6655,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -6372,9 +6714,9 @@ checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", @@ -6497,20 +6839,20 @@ checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.17.1", "serde", "serde_core", ] [[package]] name = "indicatif" -version = "0.18.4" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" dependencies = [ - "console 0.16.3", + "console 0.16.2", "portable-atomic", - "unicode-width 0.2.2", + "unicode-width 0.2.0", "unit-prefix", "web-time", ] @@ -6526,27 +6868,37 @@ dependencies = [ [[package]] name = "inferno" -version = "0.12.6" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90807d610575744524d9bdc69f3885d96f0e6c3354565b0828354a7ff2a262b8" +checksum = "d35223c50fdd26419a4ccea2c73be68bd2b29a3d7d6123ffe101c17f4c20a52a" dependencies = [ "ahash", "itoa", "log", "num-format", "once_cell", - "quick-xml 0.39.2", + "quick-xml 0.38.4", "rgb", "str_stack", ] +[[package]] +name = "inline-array" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4213ac9a8f085582112110fbf2a49b64c4394e3c609dbcbcca6f5f33c009651" +dependencies = [ + "concurrent-map", + "serde", +] + [[package]] name = "inotify" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "inotify-sys", "libc", ] @@ -6571,11 +6923,11 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.12" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" +checksum = "6778b0196eefee7df739db78758e5cf9b37412268bfa5650bfeed028aed20d9c" dependencies = [ - "darling 0.23.0", + "darling 0.20.11", "indoc", "proc-macro2", "quote", @@ -6584,9 +6936,9 @@ dependencies = [ [[package]] name = "interprocess" -version = "2.4.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6be5e5c847dbdb44564bd85294740d031f4f8aeb3464e5375ef7141f7538db69" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" dependencies = [ "doctest-file", "futures-core", @@ -6621,15 +6973,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.12.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.12" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -6690,15 +7042,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.18" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ "jiff-static", "log", @@ -6709,9 +7061,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" dependencies = [ "proc-macro2", "quote", @@ -6727,7 +7079,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys 0.3.1", + "jni-sys 0.3.0", "log", "thiserror 1.0.69", "walkdir", @@ -6748,7 +7100,7 @@ dependencies = [ "simd_cesu8", "thiserror 2.0.18", "walkdir", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -6766,12 +7118,9 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jni-sys" @@ -6804,9 +7153,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" dependencies = [ "cfg-if", "futures-util", @@ -6839,18 +7188,20 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "10.3.0" +version = "10.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" dependencies = [ + "aws-lc-rs", "base64 0.22.1", - "getrandom 0.2.17", + "getrandom 0.2.16", "js-sys", "pem", "serde", "serde_json", "signature", "simple_asn1", + "zeroize", ] [[package]] @@ -6870,9 +7221,9 @@ dependencies = [ [[package]] name = "kasuari" -version = "0.4.12" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" +checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b" dependencies = [ "hashbrown 0.16.1", "portable-atomic", @@ -6881,38 +7232,23 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures 0.2.17", ] [[package]] name = "keccak-asm" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa468878266ad91431012b3e5ef1bf9b170eab22883503a318d46857afa4579a" +checksum = "1766b89733097006f3a1388a02849865d6bc98c89273cb622e29fdd209922183" dependencies = [ "digest 0.10.7", "sha3-asm", ] -[[package]] -name = "konst" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" -dependencies = [ - "konst_macro_rules", -] - -[[package]] -name = "konst_macro_rules" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" - [[package]] name = "kqueue" version = "1.1.1" @@ -6984,15 +7320,25 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] [[package]] name = "libm" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libmimalloc-sys" @@ -7006,10 +7352,11 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" dependencies = [ + "bitflags 2.10.0", "libc", ] @@ -7036,13 +7383,22 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" +dependencies = [ + "zlib-rs", +] + [[package]] name = "line-clipping" -version = "0.3.7" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" +checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", ] [[package]] @@ -7053,9 +7409,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "litrs" @@ -7091,7 +7447,7 @@ dependencies = [ "generator", "scoped-tls", "tracing", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", ] [[package]] @@ -7110,10 +7466,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] -name = "mac" -version = "0.1.1" +name = "lz4_flex" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90071f8077f8e40adfc4b7fe9cd495ce316263f19e75c2211eeff3fdf475a3d9" + +[[package]] +name = "mach2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +dependencies = [ + "libc", +] [[package]] name = "macro-string" @@ -7128,9 +7493,9 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.36.1" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c3294c4d74d0742910f8c7b466f44dda9eb2d5742c1e430138df290a1e8451c" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ "log", "tendril", @@ -7154,23 +7519,23 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "mdbook-core" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a3873d4afac65583f1acb56ff058df989d5b4a2464bb02c785549727d307ee" +checksum = "6fc1c4da7fd9e2e412f3891428f9468fab890ed159723ed0892bb85a049ac1c1" dependencies = [ "anyhow", "regex", "serde", "serde_json", - "toml", + "toml 1.1.2+spec-1.1.0", "tracing", ] [[package]] name = "mdbook-driver" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a229930b29a9908560883e1f386eae25d8a971d259a80f49916a50627f04a42d" +checksum = "2068566fc3c100cfd19f4a13e4e0eb4fdcd2250cfd0aa633ec25102b1c98d53e" dependencies = [ "anyhow", "indexmap 2.14.0", @@ -7185,16 +7550,16 @@ dependencies = [ "serde_json", "shlex", "tempfile", - "toml", + "toml 1.1.2+spec-1.1.0", "topological-sort", "tracing", ] [[package]] name = "mdbook-html" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee80c03c65e3212fb528b8c9be5568a6a85cf795d03cf9fd6ba39ad52069ca" +checksum = "85ed2140251689f928615f0a5615413eb072eb28e003d179257aa4f034c95513" dependencies = [ "anyhow", "ego-tree", @@ -7211,15 +7576,15 @@ dependencies = [ "regex", "serde", "serde_json", - "sha2 0.10.9", + "sha2 0.11.0", "tracing", ] [[package]] name = "mdbook-markdown" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c41bf35212f5d8b83e543aa6a4887dc5709c8489c5fb9ed00f1b51ce1a2cc6" +checksum = "2cb3ca9eadf02ce206118a0b9c264718723d669b110c01a720fa9a0786f30642" dependencies = [ "pulldown-cmark", "regex", @@ -7228,9 +7593,9 @@ dependencies = [ [[package]] name = "mdbook-preprocessor" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d87bf40be0597f26f0822f939a64f02bf92c4655ba04490aadbf83601a013bb" +checksum = "8eff7b4afaafd664a649a03b8891ad8199aef359a35b911ad6c31acab38ed209" dependencies = [ "anyhow", "mdbook-core", @@ -7240,9 +7605,9 @@ dependencies = [ [[package]] name = "mdbook-renderer" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ed59f225b3ae4283c56bea633db83184627a090d892908bd66990c68e10b43" +checksum = "e607259410d53aa5cdaf5b6c1c6b3fd61f2e0f0523ebf457d34cd4f0b71e2a88" dependencies = [ "anyhow", "mdbook-core", @@ -7252,9 +7617,9 @@ dependencies = [ [[package]] name = "mdbook-summary" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d85b291d67a69c92e939450390fe34d6ea418a868c8f7b42f0b300af35a7b" +checksum = "cae8a734e5e35b0bc145b46d01fd27e266ba647dcdb9b8c907cb6a29eca9122b" dependencies = [ "anyhow", "mdbook-core", @@ -7270,6 +7635,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -7309,6 +7683,17 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "metrics-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161ab904c2c62e7bda0f7562bf22f96440ca35ff79e66c800cbac298f2f4f5ec" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "miette" version = "7.6.0" @@ -7374,9 +7759,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", @@ -7444,8 +7829,8 @@ dependencies = [ "hex", "hmac", "http 1.4.0", - "rand 0.9.4", - "reqwest 0.12.28", + "rand 0.9.2", + "reqwest 0.12.26", "serde", "serde_json", "serde_json_canonicalizer", @@ -7456,7 +7841,7 @@ dependencies = [ "time", "tokio", "tokio-tungstenite 0.26.2", - "uuid 1.23.1", + "uuid 1.19.0", ] [[package]] @@ -7477,7 +7862,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c012d14ef788ab066a347d19e3dda699916c92293b05b85ba2c76b8c82d2830" dependencies = [ - "uuid 1.23.1", + "uuid 1.19.0", ] [[package]] @@ -7504,11 +7889,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.30.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -7516,11 +7901,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.31.2" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -7563,7 +7948,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "fsevent-sys", "inotify", "kqueue", @@ -7577,11 +7962,17 @@ dependencies = [ [[package]] name = "notify-types" -version = "2.1.0" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" + +[[package]] +name = "ntapi" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" dependencies = [ - "bitflags 2.11.1", + "winapi", ] [[package]] @@ -7629,9 +8020,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-format" @@ -7711,9 +8102,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.6" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -7721,9 +8112,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.6" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7756,13 +8147,22 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "objc2-encode" version = "4.1.0" @@ -7775,10 +8175,20 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "objc2", ] +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + [[package]] name = "object" version = "0.37.3" @@ -7790,9 +8200,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.4" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" dependencies = [ "critical-section", "portable-atomic", @@ -7806,12 +8216,12 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "once_map" -version = "0.4.24" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b685c8311c9171d1bd2895222965d25616b2de2cb5819dd3504ed9250df9fecd" +checksum = "29eefd5038c9eee9e788d90966d6b5578dd3f88363a91edaec117a7ae0adc2d5" dependencies = [ "ahash", - "hashbrown 0.17.0", + "hashbrown 0.16.1", "parking_lot", "stable_deref_trait", ] @@ -7821,29 +8231,45 @@ name = "op-alloy" version = "0.24.0" source = "git+https://github.com/ethereum-optimism/optimism?rev=42f5117c2e7de0614cd3b96f274d0a3078f9701c#42f5117c2e7de0614cd3b96f274d0a3078f9701c" dependencies = [ - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "op-alloy-network", "op-alloy-provider", "op-alloy-rpc-types", "op-alloy-rpc-types-engine", ] +[[package]] +name = "op-alloy-consensus" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736381a95471d23e267263cfcee9e1d96d30b9754a94a2819148f83379de8a86" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 1.8.3", + "derive_more", + "serde", + "thiserror 2.0.18", +] + [[package]] name = "op-alloy-consensus" version = "0.24.0" source = "git+https://github.com/ethereum-optimism/optimism?rev=42f5117c2e7de0614cd3b96f274d0a3078f9701c#42f5117c2e7de0614cd3b96f274d0a3078f9701c" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-network", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "bytes", "derive_more", - "reth-codecs", - "reth-zstd-compressors", + "reth-codecs 0.3.0", + "reth-zstd-compressors 0.3.1", "serde", "serde_with", "thiserror 2.0.18", @@ -7860,11 +8286,11 @@ name = "op-alloy-network" version = "0.24.0" source = "git+https://github.com/ethereum-optimism/optimism?rev=42f5117c2e7de0614cd3b96f274d0a3078f9701c#42f5117c2e7de0614cd3b96f274d0a3078f9701c" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-provider", - "alloy-rpc-types-eth", - "op-alloy-consensus", + "alloy-rpc-types-eth 2.0.4", + "op-alloy-consensus 0.24.0", "op-alloy-rpc-types", ] @@ -7887,15 +8313,15 @@ name = "op-alloy-rpc-types" version = "0.24.0" source = "git+https://github.com/ethereum-optimism/optimism?rev=42f5117c2e7de0614cd3b96f274d0a3078f9701c#42f5117c2e7de0614cd3b96f274d0a3078f9701c" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-network", - "alloy-network-primitives", + "alloy-network-primitives 2.0.4", "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "derive_more", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "reth-rpc-traits", "serde", "serde_json", @@ -7907,16 +8333,16 @@ name = "op-alloy-rpc-types-engine" version = "0.24.0" source = "git+https://github.com/ethereum-optimism/optimism?rev=42f5117c2e7de0614cd3b96f274d0a3078f9701c#42f5117c2e7de0614cd3b96f274d0a3078f9701c" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "alloy-serde 2.0.1", + "alloy-serde 2.0.4", "derive_more", "ethereum_ssz", "ethereum_ssz_derive", - "op-alloy-consensus", + "op-alloy-consensus 0.24.0", "serde", "sha2 0.10.9", "snap", @@ -7941,20 +8367,20 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "opener" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fa337e0cf13357c13ef1dc108df1333eb192f75fc170bea03fcf1fd404c2ee" +checksum = "cb9024962ab91e00c89d2a14352a8d0fc1a64346bf96f1839b45c09149564e47" dependencies = [ "bstr", "normpath", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] name = "openssl-probe" -version = "0.2.1" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "option-ext" @@ -7970,9 +8396,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "owo-colors" -version = "4.3.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" [[package]] name = "p256" @@ -7987,6 +8413,22 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pagetable" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b57830c885fc057ecbf2f1f99f0427c3d102cf2ee5e80a52c09948d45a460e" + [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -8042,7 +8484,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -8103,9 +8545,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" dependencies = [ "memchr", "ucd-trie", @@ -8113,9 +8555,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" +checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" dependencies = [ "pest", "pest_generator", @@ -8123,9 +8565,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" +checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" dependencies = [ "pest", "pest_meta", @@ -8136,9 +8578,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.8.6" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" +checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" dependencies = [ "pest", "sha2 0.10.9", @@ -8212,7 +8654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -8271,18 +8713,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -8291,9 +8733,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.17" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -8313,9 +8755,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "poly1305" @@ -8330,24 +8772,24 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "f59e70c4aef1e55797c2e8fd94a4f2a973fc972cfde0e0b05f683667b0cd39dd" [[package]] name = "portable-atomic-util" -version = "0.2.7" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -8375,9 +8817,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "predicates" -version = "3.1.4" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "predicates-core", @@ -8385,15 +8827,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.10" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.13" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -8451,11 +8893,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.5.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", + "toml_edit 0.23.10+spec-1.0.0", ] [[package]] @@ -8482,38 +8924,38 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "process-wrap" -version = "9.1.0" +version = "8.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" +checksum = "a3ef4f2f0422f23a82ec9f628ea2acd12871c81a9362b02c43c1aa86acfc3ba1" dependencies = [ "futures", "indexmap 2.14.0", - "nix 0.31.2", + "nix 0.30.1", "tokio", "tracing", - "windows", + "windows 0.61.3", ] [[package]] name = "proptest" -version = "1.11.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.11.1", + "bitflags 2.10.0", "num-traits", - "rand 0.9.4", + "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -8545,12 +8987,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", - "prost-derive 0.14.3", + "prost-derive 0.14.1", ] [[package]] @@ -8568,9 +9010,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" dependencies = [ "anyhow", "itertools 0.12.1", @@ -8590,11 +9032,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.14.3" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" dependencies = [ - "prost 0.14.3", + "prost 0.14.1", ] [[package]] @@ -8619,11 +9061,11 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "memchr", "pulldown-cmark-escape", "unicase", @@ -8668,23 +9110,23 @@ dependencies = [ "quick-xml 0.38.4", "strip-ansi-escapes", "thiserror 2.0.18", - "uuid 1.23.1", + "uuid 1.19.0", ] [[package]] name = "quick-xml" -version = "0.38.4" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +checksum = "3cc440ee4802a86e357165021e3e255a9143724da31db1e2ea540214c96a0f82" dependencies = [ "memchr", ] [[package]] name = "quick-xml" -version = "0.39.2" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", ] @@ -8711,15 +9153,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "aws-lc-rs", "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.4", + "rand 0.9.2", "ring", "rustc-hash", "rustls", @@ -8747,9 +9189,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.45" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -8784,9 +9226,22 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.6" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + +[[package]] +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -8796,12 +9251,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.5", + "rand_core 0.9.3", "serde", ] @@ -8822,44 +9277,59 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.5", + "rand_core 0.9.3", ] [[package]] name = "rand_core" -version = "0.6.4" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ - "getrandom 0.2.17", + "rand_core 0.4.2", ] [[package]] name = "rand_core" -version = "0.9.5" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", - "serde", -] +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] -name = "rand_xorshift" -version = "0.4.0" +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.5", + "rand_core 0.9.3", ] [[package]] name = "rapidhash" -version = "4.4.1" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" +checksum = "2988730ee014541157f48ce4dcc603940e00915edc3c7f9a8d78092256bb2493" dependencies = [ - "rand 0.9.4", + "rand 0.9.2", "rustversion", ] @@ -8881,7 +9351,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "compact_str", "hashbrown 0.16.1", "indoc", @@ -8892,7 +9362,7 @@ dependencies = [ "thiserror 2.0.18", "unicode-segmentation", "unicode-truncate", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -8913,7 +9383,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "hashbrown 0.16.1", "indoc", "instability", @@ -8923,7 +9393,7 @@ dependencies = [ "strum", "time", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -8932,14 +9402,14 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", ] [[package]] name = "rayon" -version = "1.12.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -8955,6 +9425,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "recvmsg" version = "1.0.0" @@ -8967,7 +9446,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", ] [[package]] @@ -8976,7 +9455,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.17", + "getrandom 0.2.16", "libredox", "thiserror 2.0.18", ] @@ -9015,9 +9494,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -9026,15 +9505,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "regress" @@ -9046,11 +9525,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + [[package]] name = "reqwest" -version = "0.12.28" +version = "0.12.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" dependencies = [ "base64 0.22.1", "bytes", @@ -9088,14 +9576,14 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams 0.4.2", "web-sys", - "webpki-roots 1.0.7", + "webpki-roots 1.0.4", ] [[package]] name = "reqwest" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" dependencies = [ "base64 0.22.1", "bytes", @@ -9141,17 +9629,17 @@ version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ "alloy-chains", - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-evm", - "alloy-genesis", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", + "alloy-genesis 2.0.4", "alloy-primitives", "alloy-trie", "auto_impl", "derive_more", "reth-ethereum-forks", "reth-network-peers", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "serde_json", ] @@ -9160,16 +9648,34 @@ name = "reth-codecs" version = "0.3.0" source = "git+https://github.com/paradigmxyz/reth-core?rev=6b12498#6b12498871bc1b1d42c6dcf28968c271660de8c0" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-genesis", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-genesis 2.0.4", "alloy-primitives", "alloy-trie", "bytes", "modular-bitfield", "parity-scale-codec", - "reth-codecs-derive", - "reth-zstd-compressors", + "reth-codecs-derive 0.3.0", + "reth-zstd-compressors 0.3.0", + "serde", +] + +[[package]] +name = "reth-codecs" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-eips 1.8.3", + "alloy-genesis 1.8.3", + "alloy-primitives", + "alloy-trie", + "bytes", + "modular-bitfield", + "op-alloy-consensus 0.23.1", + "reth-codecs-derive 1.11.2", + "reth-zstd-compressors 1.11.2", "serde", ] @@ -9183,16 +9689,26 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "reth-codecs-derive" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "reth-consensus" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-primitives", "auto_impl", "reth-execution-types", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "thiserror 2.0.18", ] @@ -9201,12 +9717,63 @@ name = "reth-consensus-common" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", "reth-chainspec", "reth-consensus", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", +] + +[[package]] +name = "reth-db" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-primitives", + "derive_more", + "eyre", + "metrics", + "page_size", + "reth-db-api 1.11.2", + "reth-fs-util", + "reth-libmdbx", + "reth-metrics", + "reth-nippy-jar", + "reth-static-file-types 1.11.2", + "reth-storage-errors 1.11.2", + "reth-tracing", + "rustc-hash", + "strum", + "sysinfo", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "reth-db-api" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-genesis 1.8.3", + "alloy-primitives", + "arrayvec", + "bytes", + "derive_more", + "metrics", + "modular-bitfield", + "parity-scale-codec", + "reth-codecs 1.11.2", + "reth-db-models 1.11.2", + "reth-ethereum-primitives 1.11.2", + "reth-primitives-traits 1.11.2", + "reth-prune-types 1.11.2", + "reth-stages-types 1.11.2", + "reth-storage-errors 1.11.2", + "reth-trie-common 1.11.2", + "roaring", + "serde", ] [[package]] @@ -9214,36 +9781,50 @@ name = "reth-db-api" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-primitives", "arrayvec", "bytes", "derive_more", "metrics", "modular-bitfield", - "reth-codecs", - "reth-db-models", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", + "reth-codecs 0.3.0", + "reth-db-models 2.1.0", + "reth-ethereum-primitives 2.1.0", + "reth-primitives-traits 0.3.0", + "reth-prune-types 2.1.0", + "reth-stages-types 2.1.0", + "reth-storage-errors 2.1.0", + "reth-trie-common 2.1.0", "roaring", "serde", ] +[[package]] +name = "reth-db-models" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-eips 1.8.3", + "alloy-primitives", + "bytes", + "modular-bitfield", + "reth-codecs 1.11.2", + "reth-primitives-traits 1.11.2", + "serde", +] + [[package]] name = "reth-db-models" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "bytes", "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", + "reth-codecs 0.3.0", + "reth-primitives-traits 0.3.0", "serde", ] @@ -9252,14 +9833,14 @@ name = "reth-ethereum-consensus" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", "reth-chainspec", "reth-consensus", "reth-consensus-common", "reth-execution-types", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "tracing", ] @@ -9276,17 +9857,36 @@ dependencies = [ "rustc-hash", ] +[[package]] +name = "reth-ethereum-primitives" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth 1.8.3", + "alloy-serde 1.8.3", + "modular-bitfield", + "reth-codecs 1.11.2", + "reth-primitives-traits 1.11.2", + "reth-zstd-compressors 1.11.2", + "serde", + "serde_with", +] + [[package]] name = "reth-ethereum-primitives" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", - "alloy-rpc-types-eth", - "reth-codecs", - "reth-primitives-traits", + "alloy-rpc-types-eth 2.0.4", + "reth-codecs 0.3.0", + "reth-primitives-traits 0.3.0", "serde", ] @@ -9295,9 +9895,9 @@ name = "reth-evm" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", "alloy-primitives", "auto_impl", "derive_more", @@ -9305,10 +9905,10 @@ dependencies = [ "rayon", "reth-execution-errors", "reth-execution-types", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", + "reth-storage-errors 2.1.0", + "reth-trie-common 2.1.0", "revm", ] @@ -9317,18 +9917,18 @@ name = "reth-evm-ethereum" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", "alloy-primitives", "alloy-rpc-types-engine", "reth-chainspec", "reth-ethereum-forks", - "reth-ethereum-primitives", + "reth-ethereum-primitives 2.1.0", "reth-evm", "reth-execution-types", - "reth-primitives-traits", - "reth-storage-errors", + "reth-primitives-traits 0.3.0", + "reth-storage-errors 2.1.0", "revm", ] @@ -9337,11 +9937,11 @@ name = "reth-execution-errors" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-evm", + "alloy-evm 0.33.3", "alloy-primitives", "alloy-rlp", "nybbles", - "reth-storage-errors", + "reth-storage-errors 2.1.0", "thiserror 2.0.18", ] @@ -9350,20 +9950,64 @@ name = "reth-execution-types" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", "alloy-primitives", "alloy-rlp", "derive_more", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-trie-common", + "reth-ethereum-primitives 2.1.0", + "reth-primitives-traits 0.3.0", + "reth-trie-common 2.1.0", "revm", "serde", "serde_with", ] +[[package]] +name = "reth-fs-util" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "reth-libmdbx" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "bitflags 2.10.0", + "byteorder", + "dashmap", + "derive_more", + "parking_lot", + "reth-mdbx-sys", + "smallvec", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "reth-mdbx-sys" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "bindgen", + "cc", +] + +[[package]] +name = "reth-metrics" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "metrics", + "metrics-derive", +] + [[package]] name = "reth-network-peers" version = "2.1.0" @@ -9377,17 +10021,34 @@ dependencies = [ "url", ] +[[package]] +name = "reth-nippy-jar" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "anyhow", + "bincode", + "derive_more", + "lz4_flex", + "memmap2", + "reth-fs-util", + "serde", + "thiserror 2.0.18", + "tracing", + "zstd 0.13.3", +] + [[package]] name = "reth-primitives-traits" version = "0.3.0" source = "git+https://github.com/paradigmxyz/reth-core?rev=6b12498#6b12498871bc1b1d42c6dcf28968c271660de8c0" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", - "alloy-genesis", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", + "alloy-genesis 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-trie", "byteorder", "bytes", @@ -9396,13 +10057,58 @@ dependencies = [ "modular-bitfield", "once_cell", "quanta", - "reth-codecs", - "revm-bytecode", - "revm-primitives", - "revm-state", + "reth-codecs 0.3.0", + "revm-bytecode 10.0.0", + "revm-primitives 23.0.0", + "revm-state 11.0.1", + "secp256k1 0.30.0", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "reth-primitives-traits" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-eips 1.8.3", + "alloy-genesis 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth 1.8.3", + "alloy-trie", + "auto_impl", + "byteorder", + "bytes", + "dashmap", + "derive_more", + "modular-bitfield", + "once_cell", + "op-alloy-consensus 0.23.1", + "reth-codecs 1.11.2", + "revm-bytecode 8.0.0", + "revm-primitives 22.1.0", + "revm-state 9.0.0", "secp256k1 0.30.0", "serde", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "reth-prune-types" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-primitives", + "derive_more", + "modular-bitfield", + "reth-codecs 1.11.2", + "serde", + "strum", "thiserror 2.0.18", + "tracing", ] [[package]] @@ -9413,7 +10119,7 @@ dependencies = [ "alloy-primitives", "derive_more", "modular-bitfield", - "reth-codecs", + "reth-codecs 0.3.0", "serde", "strum", "thiserror 2.0.18", @@ -9427,9 +10133,9 @@ source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b0 dependencies = [ "alloy-primitives", "alloy-rlp", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "reth-storage-api", - "reth-storage-errors", + "reth-storage-errors 2.1.0", "revm", ] @@ -9438,17 +10144,17 @@ name = "reth-rpc-convert" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-evm 0.33.3", "alloy-json-rpc", "alloy-network", "alloy-primitives", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "auto_impl", "dyn-clone", "jsonrpsee-types", "reth-evm", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "reth-rpc-traits", "thiserror 2.0.18", ] @@ -9456,18 +10162,30 @@ dependencies = [ [[package]] name = "reth-rpc-traits" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b766da61ec7c46596386b4bc88d9b57d1939d3da2bc9e927567a8a23650e5ce9" +source = "git+https://github.com/paradigmxyz/reth-core?rev=6b12498#6b12498871bc1b1d42c6dcf28968c271660de8c0" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-network", "alloy-primitives", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-signer", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "thiserror 2.0.18", ] +[[package]] +name = "reth-stages-types" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-primitives", + "bytes", + "modular-bitfield", + "reth-codecs 1.11.2", + "reth-trie-common 1.11.2", + "serde", +] + [[package]] name = "reth-stages-types" version = "2.1.0" @@ -9476,11 +10194,24 @@ dependencies = [ "alloy-primitives", "bytes", "modular-bitfield", - "reth-codecs", - "reth-trie-common", + "reth-codecs 0.3.0", + "reth-trie-common 2.1.0", "serde", ] +[[package]] +name = "reth-static-file-types" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-primitives", + "derive_more", + "fixed-map", + "reth-stages-types 1.11.2", + "serde", + "strum", +] + [[package]] name = "reth-static-file-types" version = "2.1.0" @@ -9489,7 +10220,7 @@ dependencies = [ "alloy-primitives", "derive_more", "fixed-map", - "reth-stages-types", + "reth-stages-types 2.1.0", "serde", "strum", "tracing", @@ -9500,61 +10231,115 @@ name = "reth-storage-api" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", "reth-chainspec", - "reth-db-models", - "reth-ethereum-primitives", + "reth-db-models 2.1.0", + "reth-ethereum-primitives 2.1.0", "reth-execution-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "revm-database", + "reth-primitives-traits 0.3.0", + "reth-prune-types 2.1.0", + "reth-stages-types 2.1.0", + "reth-storage-errors 2.1.0", + "reth-trie-common 2.1.0", + "revm-database 13.0.1", "serde_json", ] +[[package]] +name = "reth-storage-errors" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-eips 1.8.3", + "alloy-primitives", + "alloy-rlp", + "derive_more", + "reth-primitives-traits 1.11.2", + "reth-prune-types 1.11.2", + "reth-static-file-types 1.11.2", + "revm-database-interface 9.0.0", + "revm-state 9.0.0", + "thiserror 2.0.18", +] + [[package]] name = "reth-storage-errors" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-primitives", "alloy-rlp", "derive_more", - "reth-codecs", - "reth-primitives-traits", - "reth-prune-types", - "reth-static-file-types", - "revm-database-interface", - "revm-state", + "reth-codecs 0.3.0", + "reth-primitives-traits 0.3.0", + "reth-prune-types 2.1.0", + "reth-static-file-types 2.1.0", + "revm-database-interface 11.0.1", + "revm-state 11.0.1", "thiserror 2.0.18", ] +[[package]] +name = "reth-tracing" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "clap", + "eyre", + "rolling-file", + "tracing", + "tracing-appender", + "tracing-journald", + "tracing-logfmt", + "tracing-samply", + "tracing-subscriber 0.3.22", +] + +[[package]] +name = "reth-trie-common" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "alloy-consensus 1.8.3", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth 1.8.3", + "alloy-trie", + "arrayvec", + "bytes", + "derive_more", + "itertools 0.14.0", + "nybbles", + "reth-codecs 1.11.2", + "reth-primitives-traits 1.11.2", + "revm-database 10.0.0", + "serde", +] + [[package]] name = "reth-trie-common" version = "2.1.0" source = "git+https://github.com/paradigmxyz/reth?rev=7839f3d#7839f3d876b32842b059ca8171242b807ba1fc80" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "alloy-trie", "arrayvec", "bytes", "derive_more", "itertools 0.14.0", "nybbles", - "reth-codecs", - "reth-primitives-traits", - "revm-database", + "reth-codecs 0.3.0", + "reth-primitives-traits 0.3.0", + "revm-database 13.0.1", "serde", "serde_with", ] @@ -9564,7 +10349,24 @@ name = "reth-zstd-compressors" version = "0.3.0" source = "git+https://github.com/paradigmxyz/reth-core?rev=6b12498#6b12498871bc1b1d42c6dcf28968c271660de8c0" dependencies = [ - "zstd", + "zstd 0.13.3", +] + +[[package]] +name = "reth-zstd-compressors" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c12fafa33d2f420a9d39249a3e0357b1928d09429f30758b85280409092873b2" +dependencies = [ + "zstd 0.13.3", +] + +[[package]] +name = "reth-zstd-compressors" +version = "1.11.2" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.11.2#793a3d5fb3e3413e9ecc9b024a5e26672e61e7c3" +dependencies = [ + "zstd 0.13.3", ] [[package]] @@ -9573,17 +10375,29 @@ version = "38.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91202d39dbe8e8d10e9e8f2b76c30da68ecd1d25be69ba6d853ad0d03a3a398a" dependencies = [ - "revm-bytecode", + "revm-bytecode 10.0.0", "revm-context", "revm-context-interface", - "revm-database", - "revm-database-interface", + "revm-database 13.0.1", + "revm-database-interface 11.0.1", "revm-handler", "revm-inspector", "revm-interpreter", "revm-precompile", - "revm-primitives", - "revm-state", + "revm-primitives 23.0.0", + "revm-state 11.0.1", +] + +[[package]] +name = "revm-bytecode" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d1e5c1eaa44d39d537f668bc5c3409dc01e5c8be954da6c83370bbdf006457" +dependencies = [ + "bitvec", + "phf 0.13.1", + "revm-primitives 22.1.0", + "serde", ] [[package]] @@ -9594,7 +10408,7 @@ checksum = "bdbb3a3d735efa94c91f2ef6bf20a35f99a77bc78f3e25bd758336901bdf9661" dependencies = [ "bitvec", "phf 0.13.1", - "revm-primitives", + "revm-primitives 23.0.0", "serde", ] @@ -9607,11 +10421,11 @@ dependencies = [ "bitvec", "cfg-if", "derive-where", - "revm-bytecode", + "revm-bytecode 10.0.0", "revm-context-interface", - "revm-database-interface", - "revm-primitives", - "revm-state", + "revm-database-interface 11.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "serde", ] @@ -9625,9 +10439,23 @@ dependencies = [ "alloy-eip7702", "auto_impl", "either", - "revm-database-interface", - "revm-primitives", - "revm-state", + "revm-database-interface 11.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", + "serde", +] + +[[package]] +name = "revm-database" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529528d0b05fe646be86223032c3e77aa8b05caa2a35447d538c55965956a511" +dependencies = [ + "alloy-eips 1.8.3", + "revm-bytecode 8.0.0", + "revm-database-interface 9.0.0", + "revm-primitives 22.1.0", + "revm-state 9.0.0", "serde", ] @@ -9638,13 +10466,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c281a1f11d3bcb8c0bba1199ed6bcb001d1aeb3d4fb366819e14f88723989a4e" dependencies = [ "alloy-eips 1.8.3", - "revm-bytecode", - "revm-database-interface", - "revm-primitives", - "revm-state", + "revm-bytecode 10.0.0", + "revm-database-interface 11.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "serde", ] +[[package]] +name = "revm-database-interface" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7bf93ac5b91347c057610c0d96e923db8c62807e03f036762d03e981feddc1d" +dependencies = [ + "auto_impl", + "either", + "revm-primitives 22.1.0", + "revm-state 9.0.0", + "serde", + "thiserror 2.0.18", +] + [[package]] name = "revm-database-interface" version = "11.0.1" @@ -9653,8 +10495,8 @@ checksum = "d89efb9832a4e3742bb4ded5f7fe5bf905e8860e69427d4dfec153484fc6d304" dependencies = [ "auto_impl", "either", - "revm-primitives", - "revm-state", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "serde", "thiserror 2.0.18", ] @@ -9667,14 +10509,14 @@ checksum = "783e903d6922b7f5f9a940d1bb229530502d2924b1aed9d5ca5a94ebf065d460" dependencies = [ "auto_impl", "derive-where", - "revm-bytecode", + "revm-bytecode 10.0.0", "revm-context", "revm-context-interface", - "revm-database-interface", + "revm-database-interface 11.0.1", "revm-interpreter", "revm-precompile", - "revm-primitives", - "revm-state", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "serde", ] @@ -9687,11 +10529,11 @@ dependencies = [ "auto_impl", "either", "revm-context", - "revm-database-interface", + "revm-database-interface 11.0.1", "revm-handler", "revm-interpreter", - "revm-primitives", - "revm-state", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "serde", "serde_json", ] @@ -9703,7 +10545,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "731b682530a732ef9c189ef831589128e2ce34d4a306c956322ae2dffe009715" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 2.0.4", "alloy-rpc-types-trace", "alloy-sol-types", "anstyle", @@ -9722,10 +10564,10 @@ version = "35.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ece9f41b69658c15d748288a4dbdfc06a63f3ce93d983af440de3f1631dce6a" dependencies = [ - "revm-bytecode", + "revm-bytecode 10.0.0", "revm-context-interface", - "revm-primitives", - "revm-state", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "serde", ] @@ -9748,12 +10590,24 @@ dependencies = [ "k256", "p256", "revm-context-interface", - "revm-primitives", + "revm-primitives 23.0.0", "ripemd", "secp256k1 0.31.1", "sha2 0.10.9", ] +[[package]] +name = "revm-primitives" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfb5ce6cf18b118932bcdb7da05cd9c250f2cb9f64131396b55f3fe3537c35" +dependencies = [ + "alloy-primitives", + "num_enum", + "once_cell", + "serde", +] + [[package]] name = "revm-primitives" version = "23.0.0" @@ -9766,6 +10620,19 @@ dependencies = [ "serde", ] +[[package]] +name = "revm-state" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "311720d4f0f239b041375e7ddafdbd20032a33b7bae718562ea188e188ed9fd3" +dependencies = [ + "alloy-eip7928", + "bitflags 2.10.0", + "revm-bytecode 8.0.0", + "revm-primitives 22.1.0", + "serde", +] + [[package]] name = "revm-state" version = "11.0.1" @@ -9773,9 +10640,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c32490ed687dba31c3c882beb8c20408bdd30ef96690d8f145b0ee9a87040bfe" dependencies = [ "alloy-eip7928", - "bitflags 2.11.1", - "revm-bytecode", - "revm-primitives", + "bitflags 2.10.0", + "revm-bytecode 10.0.0", + "revm-primitives 23.0.0", "serde", ] @@ -9803,9 +10670,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.53" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] @@ -9818,7 +10685,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.17", + "getrandom 0.2.16", "libc", "untrusted 0.9.0", "windows-sys 0.52.0", @@ -9845,14 +10712,23 @@ dependencies = [ [[package]] name = "roaring" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba9ce64a8f45d7fc86358410bb1a82e8c987504c0d4900e9141d69a9f26c885" +checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" dependencies = [ "bytemuck", "byteorder", ] +[[package]] +name = "rolling-file" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" +dependencies = [ + "chrono", +] + [[package]] name = "rpassword" version = "7.4.0" @@ -9866,19 +10742,19 @@ dependencies = [ [[package]] name = "rtoolbox" -version = "0.0.4" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327b72899159dfae8060c51a1f6aebe955245bcd9cc4997eed0f623caea022e4" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "ruint" -version = "1.17.2" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" dependencies = [ "alloy-rlp", "arbitrary", @@ -9894,8 +10770,8 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.6", - "rand 0.9.4", + "rand 0.8.5", + "rand 0.9.2", "rlp", "ruint-macro", "serde_core", @@ -9925,7 +10801,7 @@ version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22715a5d6deef63c637207afbe68d0c72c3f8d0022d7cf9714c442d6157606b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -9935,17 +10811,17 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.27" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" dependencies = [ - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -9999,7 +10875,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", @@ -10008,9 +10884,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.38" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "aws-lc-rs", "log", @@ -10024,9 +10900,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -10036,9 +10912,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ "web-time", "zeroize", @@ -10046,13 +10922,13 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", - "jni 0.21.1", + "jni 0.22.4", "log", "once_cell", "rustls", @@ -10073,9 +10949,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "aws-lc-rs", "ring", @@ -10107,7 +10983,7 @@ version = "17.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e902948a25149d50edc1a8e0141aad50f54e22ba83ff988cf8f7c9ef07f50564" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "cfg-if", "clipboard-win", "fd-lock", @@ -10118,16 +10994,16 @@ dependencies = [ "nix 0.30.1", "radix_trie", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width 0.2.0", "utf8parse", "windows-sys 0.60.2", ] [[package]] name = "ryu" -version = "1.0.23" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +checksum = "62049b2877bf12821e8f9ad256ee38fdc31db7387ec2d3b3f403024de2034aea" [[package]] name = "ryu-js" @@ -10164,9 +11040,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.29" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ "windows-sys 0.61.2", ] @@ -10185,9 +11061,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -10198,9 +11074,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.2.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +checksum = "301858a4023d78debd2353c7426dc486001bddc91ae31a76fb1f55132f7e2633" dependencies = [ "proc-macro2", "quote", @@ -10254,7 +11130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", - "rand 0.8.6", + "rand 0.8.5", "secp256k1-sys 0.10.1", "serde", ] @@ -10266,7 +11142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.9.4", + "rand 0.9.2", "secp256k1-sys 0.11.0", ] @@ -10301,11 +11177,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.7.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -10314,9 +11190,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.17.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -10423,9 +11299,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "indexmap 2.14.0", "itoa", @@ -10480,9 +11356,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.18.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" dependencies = [ "base64 0.22.1", "chrono", @@ -10490,7 +11366,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.14.0", "schemars 0.9.0", - "schemars 1.2.1", + "schemars 1.1.0", "serde_core", "serde_json", "serde_with_macros", @@ -10499,11 +11375,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.18.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ - "darling 0.23.0", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.117", @@ -10562,7 +11438,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -10577,9 +11453,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cbb88c189d6352cc8ae96a39d19c7ecad8f7330b29461187f2587fdc2988d5" +checksum = "9f3f15d4e239ebe08413eed880e0f9b5af4b40ee0472543320efa91d488e96a7" dependencies = [ "cc", "cfg-if", @@ -10594,6 +11470,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shared-local-state" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a50ccb2f45251772ed15abfd1e5f10a305288187b1582ab2e4295b29bbb4929" +dependencies = [ + "parking_lot", +] + [[package]] name = "shell-words" version = "1.1.1" @@ -10629,11 +11514,10 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.8" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ - "errno", "libc", ] @@ -10649,9 +11533,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simd_cesu8" @@ -10691,9 +11575,9 @@ dependencies = [ [[package]] name = "simple_asn1" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", @@ -10703,15 +11587,42 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.12" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "sled" +version = "1.0.0-alpha.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ddb1887c62f8dad18635f6096876c648923e61962057058f92228fee2308f" +dependencies = [ + "bincode", + "cache-advisor", + "concurrent-map", + "crc32fast", + "crossbeam-channel", + "crossbeam-queue", + "ebr", + "fault-injection", + "fnv", + "fs2", + "inline-array", + "log", + "pagetable", + "parking_lot", + "rayon", + "serde", + "stack-map", + "tempdir", + "zstd 0.12.4", +] [[package]] name = "small_btree" @@ -10745,11 +11656,11 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "snapbox" -version = "0.6.24" +version = "0.6.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1abc378119f77310836665f8523018532cf7e3faeb3b10b01da5a7321bf8e1" +checksum = "96fa1ce81be900d083b30ec2d481e6658c2acfaa2cfc7be45ccc2cc1b820edb3" dependencies = [ - "anstream 0.6.21", + "anstream", "anstyle", "anstyle-svg", "normalize-line-endings", @@ -10766,17 +11677,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b750c344002d7cc69afb9da00ebd9b5c0f8ac2eb7d115d9d45d5b5f47718d74" dependencies = [ - "anstream 0.6.21", + "anstream", ] [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -10838,8 +11749,8 @@ name = "solar-interface" version = "0.1.8" source = "git+https://github.com/paradigmxyz/solar?rev=530f129#530f129b1b2d7138df973dd71d2fc1e592b593d7" dependencies = [ - "annotate-snippets 0.12.15", - "anstream 0.6.21", + "annotate-snippets 0.12.5", + "anstream", "anstyle", "derive_more", "dunce", @@ -10858,7 +11769,7 @@ dependencies = [ "solar-macros", "thiserror 2.0.18", "tracing", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -10877,7 +11788,7 @@ version = "0.1.8" source = "git+https://github.com/paradigmxyz/solar?rev=530f129#530f129b1b2d7138df973dd71d2fc1e592b593d7" dependencies = [ "alloy-primitives", - "bitflags 2.11.1", + "bitflags 2.10.0", "bumpalo", "itertools 0.12.1", "memchr", @@ -10899,7 +11810,7 @@ source = "git+https://github.com/paradigmxyz/solar?rev=530f129#530f129b1b2d7138d dependencies = [ "alloy-json-abi", "alloy-primitives", - "bitflags 2.11.1", + "bitflags 2.10.0", "bumpalo", "derive_more", "either", @@ -10954,7 +11865,7 @@ dependencies = [ "path-slash", "rayon", "regex", - "reqwest 0.12.28", + "reqwest 0.12.26", "sanitize-filename", "semver 1.0.28", "serde", @@ -10963,7 +11874,7 @@ dependencies = [ "thiserror 2.0.18", "tokio", "toml_edit 0.23.10+spec-1.0.0", - "uuid 1.23.1", + "uuid 1.19.0", "zip", "zip-extract", ] @@ -11001,6 +11912,15 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stack-map" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49d6d36fee60faad91e23603db2356677b58ec2429237b39d5c60c26868f37c" +dependencies = [ + "serde", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -11099,15 +12019,15 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" [[package]] name = "sval" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb9318255ebd817902d7e279d8f8e39b35b1b9954decd5eb9ea0e30e5fd2b6a" +checksum = "502b8906c4736190684646827fbab1e954357dfe541013bbd7994d033d53a1ca" [[package]] name = "sval_buffer" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12571299185e653fdb0fbfe36cd7f6529d39d4e747a60b15a3f34574b7b97c61" +checksum = "c4b854348b15b6c441bdd27ce9053569b016a0723eab2d015b1fd8e6abe4f708" dependencies = [ "sval", "sval_ref", @@ -11115,18 +12035,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39526f24e997706c0de7f03fb7371f7f5638b66a504ded508e20ad173d0a3677" +checksum = "a0bd9e8b74410ddad37c6962587c5f9801a2caadba9e11f3f916ee3f31ae4a1f" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "933dd3bb26965d682280fcc49400ac2a05036f4ee1e6dbd61bf8402d5a5c3a54" +checksum = "6fe17b8deb33a9441280b4266c2d257e166bafbaea6e66b4b34ca139c91766d9" dependencies = [ "itoa", "ryu", @@ -11135,9 +12055,9 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cda08f6d5c9948024a6551077557b1fdcc3880ff2f20ae839667d2ec2d87ed" +checksum = "854addb048a5bafb1f496c98e0ab5b9b581c3843f03ca07c034ae110d3b7c623" dependencies = [ "itoa", "ryu", @@ -11146,9 +12066,9 @@ dependencies = [ [[package]] name = "sval_nested" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d49d5e6c1f9fd0e53515819b03a97ca4eb1bff5c8ee097c43391c09ecfb19f" +checksum = "96cf068f482108ff44ae8013477cb047a1665d5f1a635ad7cf79582c1845dce9" dependencies = [ "sval", "sval_buffer", @@ -11157,18 +12077,18 @@ dependencies = [ [[package]] name = "sval_ref" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f876c5a78405375b4e19cbb9554407513b59c93dea12dc6a4af4e1d30899ca" +checksum = "ed02126365ffe5ab8faa0abd9be54fbe68d03d607cd623725b0a71541f8aaa6f" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.18.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9ccd3b7f7200239a655e517dd3fd48d960b9111ad24bd6a5e055bef17607c7" +checksum = "a263383c6aa2076c4ef6011d3bae1b356edf6ea2613e3d8e8ebaa7b57dd707d5" dependencies = [ "serde_core", "sval", @@ -11177,13 +12097,13 @@ dependencies = [ [[package]] name = "svm-rs" -version = "0.5.24" +version = "0.5.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230df06b463c7251e4d1b39b1b3e6f25a9b3a42630179053a1e5f919e6e15534" +checksum = "4572dd9845e37ca0293acb5fe591a7f61b51f1b7b62d3dc6fb8e99e2664f3755" dependencies = [ "const-hex", "dirs", - "reqwest 0.13.2", + "reqwest 0.13.3", "semver 1.0.28", "serde", "serde_json", @@ -11196,9 +12116,9 @@ dependencies = [ [[package]] name = "svm-rs-builds" -version = "0.5.24" +version = "0.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b271921143e5b12947a526de464db02b00363919d582a7ea712374840f928328" +checksum = "c1ebe77b200f965e8dbec3ef1d8337e974179ca1ecaa9fc28f67288d6b438159" dependencies = [ "const-hex", "semver 1.0.28", @@ -11206,6 +12126,12 @@ dependencies = [ "svm-rs", ] +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + [[package]] name = "syn" version = "1.0.109" @@ -11260,13 +12186,27 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "sysinfo" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows 0.62.2", +] + [[package]] name = "system-configuration" -version = "0.7.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -11293,6 +12233,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" +dependencies = [ + "rand 0.4.6", + "remove_dir_all", +] + [[package]] name = "tempfile" version = "3.27.0" @@ -11311,14 +12261,14 @@ name = "tempo-alloy" version = "1.6.0" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ - "alloy-consensus", + "alloy-consensus 2.0.4", "alloy-contract", - "alloy-eips 2.0.1", + "alloy-eips 2.0.4", "alloy-network", "alloy-primitives", "alloy-provider", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "alloy-signer-local", "alloy-sol-types", "alloy-transport", @@ -11338,9 +12288,9 @@ name = "tempo-chainspec" version = "1.5.3" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ - "alloy-eips 2.0.1", - "alloy-evm", - "alloy-genesis", + "alloy-eips 2.0.4", + "alloy-evm 0.33.3", + "alloy-genesis 2.0.4", "alloy-hardforks", "alloy-primitives", "once_cell", @@ -11357,14 +12307,14 @@ name = "tempo-consensus" version = "1.6.0" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ - "alloy-consensus", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-evm 0.33.3", "alloy-primitives", "reth-chainspec", "reth-consensus", "reth-consensus-common", "reth-ethereum-consensus", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "tempo-chainspec", "tempo-primitives", "thiserror 2.0.18", @@ -11386,8 +12336,8 @@ name = "tempo-evm" version = "1.6.0" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ - "alloy-consensus", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-evm 0.33.3", "alloy-primitives", "alloy-rlp", "commonware-codec", @@ -11397,7 +12347,7 @@ dependencies = [ "reth-consensus", "reth-evm", "reth-evm-ethereum", - "reth-primitives-traits", + "reth-primitives-traits 0.3.0", "reth-revm", "tempo-chainspec", "tempo-consensus", @@ -11414,7 +12364,7 @@ version = "1.6.0" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ "alloy", - "alloy-evm", + "alloy-evm 0.33.3", "commonware-codec", "commonware-cryptography", "derive_more", @@ -11444,13 +12394,13 @@ name = "tempo-primitives" version = "1.6.0" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.1", + "alloy-consensus 2.0.4", + "alloy-eips 2.0.4", "alloy-network", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde 2.0.1", + "alloy-rpc-types-eth 2.0.4", + "alloy-serde 2.0.4", "aws-lc-rs", "base64 0.22.1", "derive_more", @@ -11458,10 +12408,10 @@ dependencies = [ "modular-bitfield", "once_cell", "p256", - "reth-codecs", - "reth-db-api", - "reth-ethereum-primitives", - "reth-primitives-traits", + "reth-codecs 0.3.0", + "reth-db-api 2.1.0", + "reth-ethereum-primitives 2.1.0", + "reth-primitives-traits 0.3.0", "reth-rpc-convert", "revm", "serde", @@ -11475,8 +12425,8 @@ name = "tempo-revm" version = "1.6.0" source = "git+https://github.com/tempoxyz/tempo?rev=1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69#1e5a82dff207e2cbd6cecdcfb8ff3cd2e39baa69" dependencies = [ - "alloy-consensus", - "alloy-evm", + "alloy-consensus 2.0.4", + "alloy-evm 0.33.3", "alloy-primitives", "alloy-sol-types", "auto_impl", @@ -11495,12 +12445,11 @@ dependencies = [ [[package]] name = "tendril" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" dependencies = [ - "futf", - "mac", + "new_debug_unreachable", "utf-8", ] @@ -11515,12 +12464,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ "rustix", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -11549,14 +12498,14 @@ checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] name = "thin-vec" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259cdf8ed4e4aca6f1e9d011e10bd53f524a2d0637d7b28450f6c64ac298c4c6" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" [[package]] name = "thiserror" @@ -11644,6 +12593,7 @@ checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", + "js-sys", "libc", "num-conv", "num_threads", @@ -11671,9 +12621,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "serde_core", @@ -11682,9 +12632,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -11697,9 +12647,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.1" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -11714,9 +12664,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -11735,9 +12685,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -11773,23 +12723,11 @@ dependencies = [ "webpki-roots 0.26.11", ] -[[package]] -name = "tokio-tungstenite" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.29.0", -] - [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -11800,9 +12738,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.12+spec-1.1.0" +version = "0.9.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" dependencies = [ "indexmap 2.14.0", "serde_core", @@ -11810,7 +12748,22 @@ dependencies = [ "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.15", + "winnow 0.7.14", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", ] [[package]] @@ -11843,20 +12796,20 @@ dependencies = [ "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.15", + "winnow 0.7.14", ] [[package]] name = "toml_edit" -version = "0.24.1+spec-1.1.0" +version = "0.24.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01f2eadbbc6b377a847be05f60791ef1058d9f696ecb51d2c07fe911d8569d8e" +checksum = "8c740b185920170a6d9191122cafef7010bd6270a3824594bff6784c04d7f09e" dependencies = [ "indexmap 2.14.0", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.15", + "winnow 0.7.14", ] [[package]] @@ -11866,9 +12819,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap 2.14.0", + "serde_core", + "serde_spanned", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.1", + "winnow 1.0.3", ] [[package]] @@ -11877,7 +12832,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.3", ] [[package]] @@ -11888,9 +12843,9 @@ checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tonic" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "axum", @@ -11914,17 +12869,17 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "webpki-roots 1.0.7", + "webpki-roots 1.0.4", ] [[package]] name = "tonic-prost" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" dependencies = [ "bytes", - "prost 0.14.3", + "prost 0.14.1", "tonic", ] @@ -11936,9 +12891,9 @@ checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" [[package]] name = "tower" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", @@ -11960,7 +12915,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "async-compression", - "bitflags 2.11.1", + "bitflags 2.10.0", "bytes", "futures-core", "futures-util", @@ -12006,6 +12961,19 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" +dependencies = [ + "crossbeam-channel", + "symlink", + "thiserror 2.0.18", + "time", + "tracing-subscriber 0.3.22", +] + [[package]] name = "tracing-attributes" version = "0.1.31" @@ -12034,7 +13002,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", +] + +[[package]] +name = "tracing-journald" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3a81ed245bfb62592b1e2bc153e77656d94ee6a0497683a65a12ccaf2438d0" +dependencies = [ + "libc", + "tracing-core", + "tracing-subscriber 0.3.22", ] [[package]] @@ -12048,6 +13027,44 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-logfmt" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" +dependencies = [ + "time", + "tracing", + "tracing-core", + "tracing-subscriber 0.3.22", +] + +[[package]] +name = "tracing-samply" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c175f7ecc002b6ef04776a39f440503e4e788790ddbdbfac8259b7a069526334" +dependencies = [ + "cfg-if", + "itoa", + "libc", + "mach2", + "memmap2", + "smallvec", + "tracing-core", + "tracing-subscriber 0.3.22", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.2.25" @@ -12059,20 +13076,23 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.23" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", "once_cell", "regex-automata", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] @@ -12082,15 +13102,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eaa1852afa96e0fe9e44caa53dc0bd2d9d05e0f2611ce09f97f8677af56e4ba" dependencies = [ "tracing-core", - "tracing-subscriber 0.3.23", + "tracing-subscriber 0.3.22", "tracy-client", ] [[package]] name = "tracy-client" -version = "0.18.4" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f6fc3baeac5d86ab90c772e9e30620fc653bf1864295029921a15ef478e6a5" +checksum = "91d722a05fe49b31fef971c4732a7d4aa6a18283d9ba46abddab35f484872947" dependencies = [ "loom", "once_cell", @@ -12100,9 +13120,9 @@ dependencies = [ [[package]] name = "tracy-client-sys" -version = "0.28.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f7c95348f20c1c913d72157b3c6dee6ea3e30b3d19502c5a7f6d3f160dacbf" +checksum = "2fb391ac70462b3097a755618fbf9c8f95ecc1eb379a414f7b46f202ed10db1f" dependencies = [ "cc", "windows-targets 0.52.6", @@ -12139,7 +13159,7 @@ dependencies = [ "http 1.4.0", "httparse", "log", - "rand 0.9.4", + "rand 0.9.2", "sha1", "thiserror 2.0.18", "utf-8", @@ -12156,7 +13176,7 @@ dependencies = [ "http 1.4.0", "httparse", "log", - "rand 0.9.4", + "rand 0.9.2", "rustls", "rustls-pki-types", "sha1", @@ -12164,22 +13184,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "tungstenite" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" -dependencies = [ - "bytes", - "data-encoding", - "http 1.4.0", - "httparse", - "log", - "rand 0.9.4", - "sha1", - "thiserror 2.0.18", -] - [[package]] name = "turnkey_api_key_stamper" version = "0.6.2" @@ -12205,7 +13209,7 @@ dependencies = [ "mime", "prost 0.12.6", "prost-types 0.12.6", - "reqwest 0.12.28", + "reqwest 0.12.26", "serde", "serde_json", "serde_with", @@ -12222,9 +13226,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -12287,9 +13291,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.9.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" @@ -12299,9 +13303,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-joining-type" @@ -12326,9 +13330,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" @@ -12338,7 +13342,7 @@ checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ "itertools 0.14.0", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width 0.2.0", ] [[package]] @@ -12349,9 +13353,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" @@ -12389,15 +13393,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.8" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", - "serde_derive", ] [[package]] @@ -12442,17 +13445,17 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.17", + "getrandom 0.2.16", "serde", ] [[package]] name = "uuid" -version = "1.23.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.3.4", "js-sys", "serde_core", "wasm-bindgen", @@ -12508,9 +13511,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "10.0.0-beta.6" +version = "10.0.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "174a690eb3293a5666442b0738d080df9ea6b9e03782bbe78875c89ff914a77c" +checksum = "2d7cb4a83971db3f6ae36f0aa41eaf5985d2e2b469581fa755c132f9c2a1ec89" dependencies = [ "anyhow", "bon", @@ -12521,9 +13524,9 @@ dependencies = [ [[package]] name = "vergen-gitcl" -version = "10.0.0-beta.6" +version = "10.0.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f628f4acc90a5c1a8136495eaf5f9ef94e03c174d6fb2e6de691bc58fc721ee" +checksum = "bba14c9676943b2899cea2ed7ea194b89b3d13564a3c93a61882a978b123a41c" dependencies = [ "anyhow", "bon", @@ -12535,9 +13538,9 @@ dependencies = [ [[package]] name = "vergen-lib" -version = "10.0.0-beta.6" +version = "10.0.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390d0442b660baedd7a6f60d2af01bd8967e0d7fe69cd15e13c82c811d82b709" +checksum = "fb684e6d170ef15a9b3c20561779a50ba8c806f8acdaff47c0a2c5c4c6cadd43" dependencies = [ "anyhow", "bon", @@ -12602,11 +13605,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.46.0", ] [[package]] @@ -12615,14 +13618,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", @@ -12633,9 +13636,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" dependencies = [ "js-sys", "wasm-bindgen", @@ -12643,9 +13646,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12653,9 +13656,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", @@ -12666,9 +13669,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] @@ -12727,7 +13730,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.10.0", "hashbrown 0.15.5", "indexmap 2.14.0", "semver 1.0.28", @@ -12749,14 +13752,13 @@ dependencies = [ [[package]] name = "watchexec" -version = "8.2.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de3c4a47a75176b13fc7b3f421a80a55b13cab5b3200547774f9b25d43a79a0" +checksum = "bc35794a21139060aca512393e9b1a225fe48fc11edee65c84d6d76b25a53331" dependencies = [ "async-priority-channel", "atomic-take", "futures", - "libc", "miette", "normalize-path", "notify", @@ -12766,14 +13768,13 @@ dependencies = [ "watchexec-events", "watchexec-signals", "watchexec-supervisor", - "windows-sys 0.59.0", ] [[package]] name = "watchexec-events" -version = "6.1.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad87c046fa1050d22100e7d234db2cbf6ffd020b0ae2deff4bef6faa8f71ac44" +checksum = "9c4a8973a20c7d30198a12272519163168a9ba8b687693ec9d1f027b75b860d1" dependencies = [ "notify-types", "watchexec-signals", @@ -12781,9 +13782,9 @@ dependencies = [ [[package]] name = "watchexec-signals" -version = "5.0.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd4537617a323437550d34c73a6aeeb1b489bbcc526e63f044ca3e59347101f" +checksum = "377729679262964c27e6a28f360a84b7aedb172b59841301c1c77922305dfd83" dependencies = [ "miette", "nix 0.30.1", @@ -12792,9 +13793,9 @@ dependencies = [ [[package]] name = "watchexec-supervisor" -version = "5.2.0" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a710aaac2dfcfb8a2e117c2f5e926bf10c533345f468f2017160c5f0e9ee0c53" +checksum = "92a45c50ea6b2795f3d070ad621618c8737bb98f6bc2eb4847e8e8e2ce2f446c" dependencies = [ "futures", "process-wrap", @@ -12806,9 +13807,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" dependencies = [ "js-sys", "wasm-bindgen", @@ -12826,9 +13827,9 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ "phf 0.13.1", "phf_codegen 0.13.1", @@ -12838,12 +13839,12 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.2.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" +checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97" dependencies = [ "core-foundation 0.10.1", - "jni 0.22.4", + "jni 0.21.1", "log", "ndk-context", "objc2", @@ -12867,25 +13868,27 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.7", + "webpki-roots 1.0.4", ] [[package]] name = "webpki-roots" -version = "1.0.7" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] [[package]] name = "which" -version = "8.0.2" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" dependencies = [ - "libc", + "env_home", + "rustix", + "winsafe", ] [[package]] @@ -12925,16 +13928,38 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link 0.1.3", + "windows-numerics 0.2.0", +] + [[package]] name = "windows" version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-numerics", + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", ] [[package]] @@ -12943,7 +13968,20 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ - "windows-core", + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -12954,9 +13992,20 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading 0.1.0", ] [[package]] @@ -12965,9 +14014,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ - "windows-core", - "windows-link", - "windows-threading", + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] @@ -12992,20 +14041,36 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + [[package]] name = "windows-numerics" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ - "windows-core", - "windows-link", + "windows-core 0.62.2", + "windows-link 0.2.1", ] [[package]] @@ -13014,9 +14079,18 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", ] [[package]] @@ -13025,7 +14099,16 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", ] [[package]] @@ -13034,7 +14117,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -13079,7 +14162,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -13119,7 +14202,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -13130,13 +14213,22 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-threading" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -13279,22 +14371,34 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.15" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ "memchr", ] +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -13353,7 +14457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags 2.10.0", "indexmap 2.14.0", "log", "serde", @@ -13391,9 +14495,9 @@ checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "ws_stream_wasm" @@ -13464,9 +14568,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -13475,9 +14579,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", @@ -13487,18 +14591,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", @@ -13507,18 +14611,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", @@ -13537,9 +14641,9 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", @@ -13548,21 +14652,20 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", "zerofrom", - "zerovec", ] [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "serde", "yoke", @@ -13572,9 +14675,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", @@ -13608,9 +14711,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" +checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" [[package]] name = "zmij" @@ -13630,13 +14733,32 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.6", +] + [[package]] name = "zstd" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ - "zstd-safe", + "zstd-safe 7.2.4", +] + +[[package]] +name = "zstd-safe" +version = "6.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +dependencies = [ + "libc", + "zstd-sys", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c27286e7d6ba0..cecab8087061e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ members = [ resolver = "2" [workspace.package] -version = "1.6.0" +version = "1.7.1" edition = "2024" rust-version = "1.89" authors = ["Foundry Contributors"] @@ -591,6 +591,7 @@ rexpect = { git = "https://github.com/rust-cli/rexpect", rev = "2ed0b1898d7edaf6 ## reth-core reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth-core", rev = "6b12498" } +reth-rpc-traits = { git = "https://github.com/paradigmxyz/reth-core", rev = "6b12498" } reth-codecs = { git = "https://github.com/paradigmxyz/reth-core", rev = "6b12498" } reth-codecs-derive = { git = "https://github.com/paradigmxyz/reth-core", rev = "6b12498" } reth-zstd-compressors = { git = "https://github.com/paradigmxyz/reth-core", rev = "6b12498" } diff --git a/README.md b/README.md index c9f0a45c57b0a..7933cc1c3ea08 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,16 @@ +# Phoundry + +### Phoundry is a minimalfork of Foundry that is customized to support the cheat codes used in the Credible Layer +
Foundry banner   [![Github Actions][gha-badge]][gha-url] [![Telegram Chat][tg-badge]][tg-url] [![Telegram Support][tg-support-badge]][tg-support-url] +![Foundry](https://img.shields.io/badge/Foundry-grey?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAElElEQVR4nH1VUUhUaRg9984YdzBpkqR0Z210rIESIXSabEbcHgydrpNRRj00kWaztj0U1MOW0MOIbD300IvLMqBpMTGYxdoqyoRNDUESBDWwUuPugCSSsTM7u0Oj1/+efdiMcmnP2/fDd77D4f/OB6xCa2urQZbllVICYGtqanK1tLS4AdgAyAAgyzJaW1sNq/ulT4twOGw4fPiwAGDp7Ow8VV1d7bVarRWxWCw/k8mgsbExm0wmZ+Lx+M/Xr1//CcAsSVmSJH01McLhsAEAnE5nx+Tk5B/xeJxOp5N9fX2sqqqixWLhnTt36HA4GIvFGI1GU3V1df5Pe/9D1t7eHkgkEuzo6GBPT49WWloq7Ha7fujQITocDu7atUs3m83i6tWr2okTJ/jixQuePn265zPScDhskGUZe/fubXv8+DFv3rypbdiwQaxbt46RSIT79u3j0NAQb926RVVVOT4+TqvVyvz8fD0YDC5NTk6ysbHxlCRJ/5KSlAAURyKRTFNTkwAg7t69S5/Px76+Pq7GyMgI9+/fz9HRUQIQO3bsEKOjo38DsJCUJADw+/0BVVW7otHo8ps3b4yvXr3CxMQETCYTTCYTNE0DAOTl5SGXy0FRFOzZswdmsxkVFRXLNTU1xmg0+kNvb+/3AGAcGBiI7969Wwcg6urq+OTJE967d49btmzh9PT0R3WJRIKBQIDBYJBTU1NsaGggAGGz2fTe3t5fAeQZAWwuLi4uP3nypOT1emEwGFBeXo7a2losLCygoaEB/f39MJlMCIVCkCQJBw8ehNVqhcfjQXNzs1RSUiKtX7++DEAZqqqq3KFQiABYUFDAM2fOkCQXFxdJkvfv32dhYSG9Xi+vXbvG2dnZj4oDgQCLioqoKAqHhobodDq/Mc7NzUklJSUIBoOw2WzYtm0blpeXsWbNGkxMTODp06doa2vD4OAgNm7cCIvFApLQdR3nzp3Dzp078fLlSxQVFeHdu3cAgIpHjx69/zBUX5k+MDBAt9vNY8eOsbu7m6lUigcOHKDL5WImkyHJz9TGYrEcALsMIPn69esZTdMIgM+ePUNXVxdu376NsrIyuN1uXLp0CWazGcPDw3C5XFBVFWfPnkVNTQ18Pp+ezWY5MzPzO4DfAABHjhzpJslUKqVdvHiR4+PjbG9vZy6XI0kuLS0xmUxSCEGS9Pv9LC0tpdFoZGVlpSaEoM/nuwIAKx/7q5GRkb9CoZBQVVWcP3+ez58/J0mm02kODg7ywoULjMViTKfTtNvtXLt2LTdt2qTncrnlsbGxLICvSUqfrl5HJBLh1NTUkhBCJ8mFhQX29/dTVVUWFBTwwYMH1HWdly9fpqIoeiKRWJqfn2d1dXWnLMuf7zMAHD16tGd+fn7FZy2bzYrKykodAAFQVVV9cXFRkNTevn3Lubk5trS0XPnfxHE4HN8ODw+nV/yanp6mx+Ohx+P5aIMQgmNjY3/W1tZ+t5rsSwG7+fjx4/76+vrm7du32woLC00AkE6n38fj8ZmHDx/+cuPGjR8BJL8YsCtYdQIMALYqilKvKEo9APuHty+egH8A3GfFDJXmxmMAAAAASUVORK5CYII%3D&link=https%3A%2F%2Fbook.getfoundry.sh%2F) -[gha-badge]: https://img.shields.io/github/actions/workflow/status/foundry-rs/foundry/test.yml?branch=master&style=flat-square +[gha-badge]: https://img.shields.io/github/actions/workflow/status/foundry-rs/foundry/test.yml?branch=master [gha-url]: https://github.com/foundry-rs/foundry/actions [tg-badge]: https://img.shields.io/endpoint?color=neon&logo=telegram&label=chat&style=flat-square&url=https%3A%2F%2Ftg.sumanjay.workers.dev%2Ffoundry_rs [tg-url]: https://t.me/foundry_rs @@ -14,7 +19,6 @@ **[Install](https://getfoundry.sh/getting-started/installation)** | [Docs][foundry-docs] -| [Benchmarks](https://www.getfoundry.sh/benchmarks) | [Developer Guidelines](./docs/dev/README.md) | [Contributing](./CONTRIBUTING.md) | [Crate Docs](https://foundry-rs.github.io/foundry) @@ -23,72 +27,358 @@ --- -Blazing fast, portable and modular toolkit for Ethereum application development, written in Rust. +### Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust + +Foundry consists of: + +- [**Forge**](#forge): Build, test, fuzz, debug and deploy [Solidity][solidity] contracts, like Hardhat, Brownie, Ape. +- [**Cast**](#cast): A Swiss Army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- [**Anvil**](#anvil): Fast local Ethereum development node, akin to Hardhat Network, Tenderly. +- [**Chisel**](#chisel): Fast, utilitarian, and verbose Solidity REPL. -- [**Forge**](https://getfoundry.sh/forge) — Build, test, fuzz, debug and deploy Solidity contracts. -- [**Cast**](https://getfoundry.sh/cast) — Swiss Army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- [**Anvil**](https://getfoundry.sh/anvil) — Fast local Ethereum development node. -- [**Chisel**](https://getfoundry.sh/chisel) — Fast, utilitarian and verbose Solidity REPL. +**Need help getting started with Foundry? Read the [📖 Foundry Docs][foundry-docs]!** ![Demo](.github/assets/demo.gif) +## Features + +- **High-Performance Compilation** + + - **Fast and Flexible**: Automatically detects and installs the required Solidity compiler version. + - **Solidity and Vyper Support**: Fully supports both Solidity and Vyper out-of-the-box. + - **Incremental Compilation**: Re-compiles only changed files, saving time. + - **Parallelized Pipeline**: Leverages multi-core systems for ultra-fast builds. + - **Broad Compatibility**: Supports non-standard directory structures, including [Hardhat repos](https://twitter.com/gakonst/status/1461289225337421829). + +- **Advanced Testing** + + - **No Context Switching**: Write tests directly in Solidity. + - **Fuzz Testing**: Quickly identify edge cases with input shrinking and counter-example generation. + - **Invariant Testing**: Ensure complex system properties hold across a wide range of inputs. + - **Debugging Made Easy**: Use [forge-std](https://github.com/foundry-rs/forge-std)'s `console.sol` for flexible debug logging. + - **Interactive Debugger**: Step through your Solidity code with Foundry's interactive debugger, making it easy to pinpoint issues. + +- **Powerful Runtime Features** + + - **RPC Forking**: Fast and efficient remote RPC forking backed by [Alloy][alloy]. + - **Lightweight & Portable**: No dependency on Nix or other package managers for installation. + +- **Streamlined CI/CD** + + - **Optimized CI**: Accelerate builds, run tests and execute scripts using [Foundry's GitHub action][foundry-gha]. + ## Installation -```sh +Getting started is very easy: + +Install `foundryup`: + +``` curl -L https://foundry.paradigm.xyz | bash +``` + +Next, run `foundryup`. + +It will automatically install the latest version of the precompiled binaries: [`forge`](#forge), [`cast`](#cast), [`anvil`](#anvil), and [`chisel`](#chisel). + +``` foundryup ``` -See the [installation guide](https://getfoundry.sh/getting-started/installation) for more details. +**Done!** + +For additional details see the [installation guide](https://getfoundry.sh/getting-started/installation) in the [Foundry Docs][foundry-docs]. + +If you're experiencing any issues while installing, check out [Getting Help](#getting-help) and the [FAQ](https://getfoundry.sh/faq). -## Getting Started +## How Fast? -Initialize a new project, build and test: +Forge is quite fast at both compiling (leveraging `solc` with [foundry-compilers]) and testing. + +See the benchmarks below. Older benchmarks against [DappTools][dapptools] can be found in the [v0.2.0 announcement post][benchmark-post] and in the [Convex Shutdown Simulation][convex] repository. + +### Testing Benchmarks + +| Project | Type | [Forge 1.0][foundry-1.0] | [Forge 0.2][foundry-0.2] | DappTools | Speedup | +| --------------------------------------------- | -------------------- | ------------------------ | ------------------------ | --------- | -------------- | +| [vectorized/solady][solady] | Unit / Fuzz | 0.9s | 2.3s | - | 2.6x | +| [morpho-org/morpho-blue][morpho-blue] | Invariant | 0.7s | 1m43s | - | 147.1x | +| [morpho-org/morpho-blue-oracles][morpho-blue] | Integration (Cold) | 6.1s | 6.3s | - | 1.04x | +| [morpho-org/morpho-blue-oracles][morpho-blue] | Integration (Cached) | 0.6s | 0.9s | - | 1.50x | +| [transmissions11/solmate][solmate] | Unit / Fuzz | 2.7s | 2.8s | 6m34s | 1.03x / 140.0x | +| [reflexer-labs/geb][geb] | Unit / Fuzz | 0.2s | 0.4s | 23s | 2.0x / 57.5x | + +_In the above benchmarks, compilation was always skipped_ + +**Takeaway: Forge dramatically outperforms the competition, delivering blazing-fast execution speeds while continuously expanding its robust feature set.** + +### Compilation Benchmarks + +
+ + + + + + + + + + +  + +
+ +**Takeaway: Forge compilation is consistently faster than Hardhat by a factor of `2.1x` to `5.2x`, depending on the amount of caching involved.** + +## Forge + +Forge helps you build, test, fuzz, debug and deploy Solidity contracts. + +The best way to understand Forge is to simply try it (in less than 30 seconds!). + +First, let's initialize a new `counter` example repository: + +```sh +forge init counter +``` + +Next `cd` into `counter` and build : ```sh -forge init counter && cd counter forge build +``` + +```console +[⠊] Compiling... +[⠔] Compiling 27 files with Solc 0.8.28 +[⠒] Solc 0.8.28 finished in 452.13ms +Compiler run successful! +``` + +Let's [test](https://getfoundry.sh/forge/tests#tests) our contracts: + +```sh forge test ``` -Interact with a live network: +```console +[⠊] Compiling... +No files changed, compilation skipped + +Ran 2 tests for test/Counter.t.sol:CounterTest +[PASS] testFuzz_SetNumber(uint256) (runs: 256, μ: 31121, ~: 31277) +[PASS] test_Increment() (gas: 31293) +Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.35ms (4.86ms CPU time) + +Ran 1 test suite in 5.91ms (5.35ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests) +``` + +Finally, let's run our deployment script: + +```sh +forge script script/Counter.s.sol +``` + +```console +[⠊] Compiling... +No files changed, compilation skipped +Script ran successfully. +Gas used: 109037 + +If you wish to simulate on-chain transactions pass a RPC URL. +``` + +Run `forge --help` to explore the full list of available subcommands and their usage. + +More documentation can be found in the [forge](https://getfoundry.sh/forge/overview) section of the Foundry Docs. + +## Cast + +Cast is a Swiss Army knife for interacting with Ethereum applications from the command line. + +Here are a few examples of what you can do: + +**Check the latest block on Ethereum Mainnet**: ```sh cast block-number --rpc-url https://eth.merkle.io +``` + +**Check the Ether balance of `vitalik.eth`** + +```sh cast balance vitalik.eth --ether --rpc-url https://eth.merkle.io ``` -Fork mainnet locally: +**Replay and trace a transaction** + +```sh +cast run 0x9c32042f5e997e27e67f82583839548eb19dc78c4769ad6218657c17f2a5ed31 --rpc-url https://eth.merkle.io +``` + +Optionally, pass `--etherscan-api-key ` to decode transaction traces using verified source maps, providing more detailed and human-readable information. + +--- + +Run `cast --help` to explore the full list of available subcommands and their usage. + +More documentation can be found in the [cast](https://getfoundry.sh/cast/overview) section of the Foundry Docs. + +## Anvil + +Anvil is a fast local Ethereum development node. + +Let's fork Ethereum mainnet at the latest block: ```sh anvil --fork-url https://eth.merkle.io ``` -Read the [Foundry Docs][foundry-docs] to learn more. +You can use those same `cast` subcommands against your `anvil` instance: + +```sh +cast block-number +``` + +--- + +Run `anvil --help` to explore the full list of available features and their usage. + +More documentation can be found in the [anvil](https://getfoundry.sh/anvil/overview) section of the Foundry Docs. + +## Chisel + +Chisel is a fast, utilitarian, and verbose Solidity REPL. + +To use Chisel, simply type `chisel`. + +```sh +chisel +``` + +From here, start writing Solidity code! Chisel will offer verbose feedback on each input. + +Create a variable `a` and query it: + +```console +➜ uint256 a = 123; +➜ a +Type: uint256 +├ Hex: 0x7b +├ Hex (full word): 0x000000000000000000000000000000000000000000000000000000000000007b +└ Decimal: 123 +``` + +Finally, run `!source` to see `a` was applied: + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.28; + +import {Vm} from "forge-std/Vm.sol"; + +contract REPL { + Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + /// @notice REPL contract entry point + function run() public { + uint256 a = 123; + } +} +``` + +--- + +Run `chisel --help` to explore the full list of available features and their usage. + +More documentation can be found in the [chisel](https://getfoundry.sh/chisel/overview) section of the Foundry Docs. + +## Configuration + +Foundry is highly configurable, allowing you to tailor it to your needs. Configuration is managed via a file called [`foundry.toml`](./crates/config) located in the root of your project or any parent directory. For a full list of configuration options, refer to the [config package documentation](./crates/config/README.md#all-options). + +**Profiles and Namespaces** + +- Configuration can be organized into **profiles**, which are arbitrarily namespaced for flexibility. +- The default profile is named `default`. Learn more in the [Default Profile section](./crates/config/README.md#default-profile). +- To select a different profile, set the `FOUNDRY_PROFILE` environment variable. +- Override specific settings using environment variables prefixed with `FOUNDRY_` (e.g., `FOUNDRY_SRC`). + +--- + +You can find additional [setup and configurations guides](https://getfoundry.sh/config/overview) in the [Foundry Docs][foundry-docs] and in the [config crate](./crates/config/README.md): + +- [Configuring with `foundry.toml`](https://getfoundry.sh/config/overview) +- [Setting up VSCode][vscode-setup] +- [Shell autocompletions][shell-setup] ## Contributing -Contributions are welcome and highly appreciated. To get started, check out the [contributing guidelines](./CONTRIBUTING.md). +See our [contributing guidelines](./CONTRIBUTING.md). + +## Getting Help -Join our [Telegram][tg-url] to chat about the development of Foundry. +First, see if the answer to your question can be found in the [Foundry Docs][foundry-docs], or in the relevant crate. -## Support +If the answer is not there: -Having trouble? Check the [Foundry Docs][foundry-docs], join the [support Telegram][tg-support-url], or [open an issue](https://github.com/foundry-rs/foundry/issues/new). +- Join the [support Telegram][tg-support-url] to get help, or +- Open a [discussion](https://github.com/foundry-rs/foundry/discussions/new) with your question, or +- Open an issue with [the bug](https://github.com/foundry-rs/foundry/issues/new) -#### License +If you want to contribute, or follow along with contributor discussion, you can use our [main telegram](https://t.me/foundry_rs) to chat with us about the development of Foundry! - -Licensed under either of Apache License, Version -2.0 or MIT license at your option. - +## License -
+Licensed under either of [Apache License](./LICENSE-APACHE), Version +2.0 or [MIT License](./LICENSE-MIT) at your option. - Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in these crates by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. - +## How to update upstream + +The default branch of this repository is `main`. + +To update the upstream repository, run the following commands: + +```terminal +git remote add upstream https://github.com/foundry-rs/foundry.git +git fetch upstream +git checkout main +# Backup branch +git checkout -b upstream-update +git checkout main +git rebase upstream/master +git push --force-with-lease origin main +``` + +## Acknowledgements + +- Foundry is a clean-room rewrite of the testing framework [DappTools][dapptools]. None of this would have been possible without the DappHub team's work over the years. +- [Matthias Seitz](https://twitter.com/mattsse_): Created [ethers-solc] (now [foundry-compilers]) which is the backbone of our compilation pipeline, as well as countless contributions to ethers, in particular the `abigen` macros. +- [Rohit Narurkar](https://twitter.com/rohitnarurkar): Created the Rust Solidity version manager [svm-rs](https://github.com/roynalnaruto/svm-rs) which we use to auto-detect and manage multiple Solidity versions. +- [Brock Elmore](https://twitter.com/brockjelmore): For extending the VM's cheatcodes and implementing [structured call tracing](https://github.com/foundry-rs/foundry/pull/192), a critical feature for debugging smart contract calls. +- Thank you to [Depot](https://depot.dev) for sponsoring us with their fast GitHub runners and sccache, which we use in CI to reduce build and test times significantly. +- All the other [contributors](https://github.com/foundry-rs/foundry/graphs/contributors) to the [ethers-rs](https://github.com/gakonst/ethers-rs), [alloy][alloy] & [foundry](https://github.com/foundry-rs/foundry) repositories and chatrooms. + +[solidity]: https://soliditylang.org/ [foundry-docs]: https://getfoundry.sh +[foundry-gha]: https://github.com/foundry-rs/foundry-toolchain +[foundry-compilers]: https://github.com/foundry-rs/compilers +[ethers-solc]: https://github.com/gakonst/ethers-rs/tree/master/ethers-solc/ +[solady]: https://github.com/Vectorized/solady +[openzeppelin]: https://github.com/OpenZeppelin/openzeppelin-contracts/tree/release-v5.1 +[morpho-blue]: https://github.com/morpho-org/morpho-blue +[solmate]: https://github.com/transmissions11/solmate/ +[geb]: https://github.com/reflexer-labs/geb +[benchmark-post]: https://www.paradigm.xyz/2022/03/foundry-02#blazing-fast-compilation--testing +[convex]: https://github.com/mds1/convex-shutdown-simulation +[vscode-setup]: https://getfoundry.sh/config/vscode.html +[shell-setup]: https://getfoundry.sh/config/shell-autocompletion.html +[foundry-0.2]: https://github.com/foundry-rs/foundry/releases/tag/nightly-5b7e4cb3c882b28f3c32ba580de27ce7381f415a +[foundry-1.0]: https://github.com/foundry-rs/foundry/releases/tag/nightly-59f354c179f4e7f6d7292acb3d068815c79286d1 +[dapptools]: https://github.com/dapphub/dapptools +[alloy]: https://github.com/alloy-rs/alloy diff --git a/SECURITY.md b/SECURITY.md index d84327cc18e91..6296066db5e73 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,3 +3,112 @@ ## Reporting a Vulnerability Contact [security@tempo.xyz](mailto:security@tempo.xyz). + +## Verifying Releases + +Every official Foundry release ships with multiple, independent integrity +artifacts. All signing is keyless via [Sigstore](https://www.sigstore.dev/) — +no Foundry-managed key material is involved, and every signature is recorded +in the public [Rekor](https://docs.sigstore.dev/logging/overview/) transparency +log. The signing identity is the GitHub Actions OIDC token of this repository's +`release.yml` / `docker-publish.yml` workflows. + +### Per-release artifacts + +For each `foundry___.{tar.gz,zip}` archive on the +[releases page](https://github.com/foundry-rs/foundry/releases), the same +release also publishes: + +| Suffix | Purpose | +| --- | --- | +| `.sha256` | SHA-256 checksum of the archive (`sha256sum` format) | +| `.sigstore.json` | Cosign keyless signature bundle (cert + signature + Rekor proof) over the archive | +| `.spdx.json` | SPDX 2.3 SBOM of the source workspace used for the build | +| `.attestation.txt` | URL of the GitHub artifact-attestation summary | + +In addition, GitHub stores SLSA build-provenance and SBOM attestations against +the archive's digest; these are queryable via `gh attestation` without +downloading anything else. + +### Verifying an archive + +Pick whichever toolchain you have available — they verify the same signatures. + +#### Option 1: GitHub CLI (simplest) + +```bash +gh attestation verify foundry_v1.4.0_linux_amd64.tar.gz \ + --repo foundry-rs/foundry +``` + +This computes the file's digest, fetches the matching attestation from GitHub, +and verifies the Sigstore signature plus the SLSA provenance predicate. Add +`--signer-workflow foundry-rs/foundry/.github/workflows/release.yml` to also +require the workflow identity. + +To verify the SBOM attestation specifically: + +```bash +gh attestation verify foundry_v1.4.0_linux_amd64.tar.gz \ + --repo foundry-rs/foundry \ + --predicate-type 'https://spdx.dev/Document/v2.3' +``` + +#### Option 2: Cosign (offline-friendly) + +Download the archive and its `.sigstore.json` bundle from the release page, +then: + +```bash +cosign verify-blob \ + --bundle foundry_v1.4.0_linux_amd64.sigstore.json \ + --certificate-identity-regexp '^https://github.com/foundry-rs/foundry/\.github/workflows/release\.yml@.*' \ + --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \ + foundry_v1.4.0_linux_amd64.tar.gz +``` + +For nightly builds the certificate identity points at `refs/heads/master` +instead of a tag; the regex above matches both. + +#### Option 3: Plain checksum (integrity only) + +```bash +sha256sum -c foundry_v1.4.0_linux_amd64.sha256 # GNU coreutils +shasum -a 256 -c foundry_v1.4.0_linux_amd64.sha256 # macOS +``` + +This proves the bytes match what was uploaded, but says nothing about who +uploaded them. Combine with one of the verifications above for end-to-end +trust. + +### Verifying the Docker image + +Container signatures and attestations are pushed as OCI referrers to GHCR, so +no separate files need to be downloaded. + +```bash +# Cosign keyless signature on the image +cosign verify ghcr.io/foundry-rs/foundry:v1.4.0 \ + --certificate-identity-regexp '^https://github.com/foundry-rs/foundry/\.github/workflows/(release|docker-publish)\.yml@.*' \ + --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' + +# SLSA build-provenance attestation +gh attestation verify oci://ghcr.io/foundry-rs/foundry:v1.4.0 \ + --repo foundry-rs/foundry + +# Inspect the buildx-attached SBOM and provenance +docker buildx imagetools inspect ghcr.io/foundry-rs/foundry:v1.4.0 \ + --format '{{ json .SBOM }}' +docker buildx imagetools inspect ghcr.io/foundry-rs/foundry:v1.4.0 \ + --format '{{ json .Provenance }}' +``` + +To pin to an immutable digest (recommended for reproducible deployments): + +```bash +docker pull ghcr.io/foundry-rs/foundry:v1.4.0 +DIGEST=$(docker buildx imagetools inspect ghcr.io/foundry-rs/foundry:v1.4.0 --format '{{ .Manifest.Digest }}') +cosign verify "ghcr.io/foundry-rs/foundry@${DIGEST}" \ + --certificate-identity-regexp '^https://github.com/foundry-rs/foundry/\.github/workflows/(release|docker-publish)\.yml@.*' \ + --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' +``` diff --git a/crates/anvil/Cargo.toml b/crates/anvil/Cargo.toml index b664266450d07..83d147f942f3d 100644 --- a/crates/anvil/Cargo.toml +++ b/crates/anvil/Cargo.toml @@ -139,3 +139,4 @@ cmd = [ "tokio/signal", ] js-tracer = ["revm-inspectors/js-tracer"] +credible = ["foundry-evm/credible"] diff --git a/crates/anvil/src/eth/pool/transactions.rs b/crates/anvil/src/eth/pool/transactions.rs index df65822e1eab3..5280987483dd7 100644 --- a/crates/anvil/src/eth/pool/transactions.rs +++ b/crates/anvil/src/eth/pool/transactions.rs @@ -123,10 +123,10 @@ impl PoolTransaction { impl fmt::Debug for PoolTransaction { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!(fmt, "Transaction {{ ")?; - write!(fmt, "hash: {:?}, ", &self.pending_transaction.hash())?; + write!(fmt, "hash: {:?}, ", self.pending_transaction.hash())?; write!(fmt, "requires: [{}], ", hex_fmt_many(self.requires.iter()))?; write!(fmt, "provides: [{}], ", hex_fmt_many(self.provides.iter()))?; - write!(fmt, "raw tx: {:?}", &self.pending_transaction)?; + write!(fmt, "raw tx: {:?}", self.pending_transaction)?; write!(fmt, "}}")?; Ok(()) } diff --git a/crates/cast/Cargo.toml b/crates/cast/Cargo.toml index dc5be77a244da..8546c9560c780 100644 --- a/crates/cast/Cargo.toml +++ b/crates/cast/Cargo.toml @@ -109,3 +109,4 @@ aws-kms = ["foundry-wallets/aws-kms"] gcp-kms = ["foundry-wallets/gcp-kms"] turnkey = ["foundry-wallets/turnkey"] isolate-by-default = ["foundry-config/isolate-by-default"] +credible = ["foundry-evm/credible"] diff --git a/crates/cast/src/cmd/keychain.rs b/crates/cast/src/cmd/keychain.rs index 8b7d80786dfad..c952b58369e1c 100644 --- a/crates/cast/src/cmd/keychain.rs +++ b/crates/cast/src/cmd/keychain.rs @@ -646,7 +646,7 @@ async fn run_remaining_limit( }; if shell::is_json() { - sh_println!("{}", serde_json::to_string(&remaining.to_string())?)?; + sh_println!("{}", serde_json::json!({ "remaining": remaining.to_string() }))?; } else { sh_println!("{remaining}")?; } diff --git a/crates/cast/src/cmd/wallet/mod.rs b/crates/cast/src/cmd/wallet/mod.rs index 8e0dd8dd3ed8c..b2378d8bfdc58 100644 --- a/crates/cast/src/cmd/wallet/mod.rs +++ b/crates/cast/src/cmd/wallet/mod.rs @@ -779,8 +779,7 @@ flag to set your key via: )?; let address = wallet.address(); let success_message = format!( - "`{}` keystore was saved successfully. Address: {:?}", - &account_name, address, + "`{account_name}` keystore was saved successfully. Address: {address:?}", ); sh_println!("{}", success_message.green())?; } @@ -815,7 +814,7 @@ flag to set your key via: format!("Failed to remove keystore file at {}", keystore_path.display()) })?; - let success_message = format!("`{}` keystore was removed successfully.", &name); + let success_message = format!("`{name}` keystore was removed successfully."); sh_println!("{}", success_message.green())?; } Self::PrivateKey { @@ -886,8 +885,7 @@ flag to set your key via: let private_key = B256::from_slice(&wallet.credential().to_bytes()); - let success_message = - format!("{}'s private key is: {}", &account_name, private_key); + let success_message = format!("{account_name}'s private key is: {private_key}"); sh_println!("{}", success_message.green())?; } @@ -945,10 +943,9 @@ flag to set your key via: Some(&account_name), )?; + let address = wallet.address(); let success_message = format!( - "Password for keystore `{}` was changed successfully. Address: {:?}", - &account_name, - wallet.address(), + "Password for keystore `{account_name}` was changed successfully. Address: {address:?}", ); sh_println!("{}", success_message.green())?; } diff --git a/crates/cast/src/lib.rs b/crates/cast/src/lib.rs index ce5572acebc13..3f446b1fbedf0 100644 --- a/crates/cast/src/lib.rs +++ b/crates/cast/src/lib.rs @@ -246,7 +246,7 @@ impl + Clone + Unpin, N: Network> Cast { let mut s = vec![format!("gas used: {}", access_list.gas_used), "access list:".to_string()]; for al in access_list.access_list.0 { - s.push(format!("- address: {}", &al.address.to_checksum(None))); + s.push(format!("- address: {}", al.address.to_checksum(None))); if !al.storage_keys.is_empty() { s.push(" keys:".to_string()); for key in al.storage_keys { diff --git a/crates/cast/tests/cli/main.rs b/crates/cast/tests/cli/main.rs index da33a34d849db..2ca1bda09c9da 100644 --- a/crates/cast/tests/cli/main.rs +++ b/crates/cast/tests/cli/main.rs @@ -3203,7 +3203,7 @@ Nothing to compile .stdout_eq(str![[r#" Executing previous transactions from the block. Traces: - [..] → new @0x5FbDB2315678afecb367f032d93F642f64180aa3 + [13711] → new @0x5FbDB2315678afecb367f032d93F642f64180aa3 ├─ emit topic 0: 0xa7263295d3a687d750d1fd377b5df47de69d7db8decc745aaa4bbee44dc1688d │ data: 0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266 └─ ← [Return] 62 bytes of code @@ -3286,7 +3286,7 @@ forgetest_async!(show_state_changes_in_traces, |prj, cmd| { .stdout_eq(str![[r#" Executing previous transactions from the block. Traces: - [..] 0x5FbDB2315678afecb367f032d93F642f64180aa3::setNumber(111) + [22492] ::setNumber(111) ├─ storage changes: │ @ 0: 0 → 111 └─ ← [Stop] @@ -3568,7 +3568,7 @@ contract Counter { .assert_success() .stdout_eq(str![[r#" Traces: - [2402] 0x5FbDB2315678afecb367f032d93F642f64180aa3::number() + [2402] ::number() └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000001234 @@ -3611,7 +3611,7 @@ Transaction successfully executed. .assert_success() .stdout_eq(str![[r#" Traces: - [747] 0x5FbDB2315678afecb367f032d93F642f64180aa3::getBalance(0x5FbDB2315678afecb367f032d93F642f64180aa3) + [747] ::getBalance(: [0x5FbDB2315678afecb367f032d93F642f64180aa3]) └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000001111 @@ -3699,7 +3699,7 @@ Error: Transaction failed. .assert_success() .stdout_eq(str![[r#" Traces: - [2402] 0x5FbDB2315678afecb367f032d93F642f64180aa3::number1() + [2402] ::number1() └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000002222 @@ -3744,7 +3744,7 @@ Transaction successfully executed. .assert_success() .stdout_eq(str![[r#" Traces: - [2402] 0x5FbDB2315678afecb367f032d93F642f64180aa3::number1() + [2402] ::number1() └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000002222 @@ -3978,14 +3978,18 @@ Error: Failed to estimate gas: server returned an error response: error code 3: }); // -casttest!(estimate_base_da, |_prj, cmd| { - cmd.args(["da-estimate", "30558838", "-r", "https://mainnet.base.org/"]) - .assert_success() - .stdout_eq(str![[r#" +casttest!( + #[ignore = "mainnet.base.org no longer returns transactions for this historical block"] + estimate_base_da, + |_prj, cmd| { + cmd.args(["da-estimate", "30558838", "-r", "https://mainnet.base.org/"]) + .assert_success() + .stdout_eq(str![[r#" Estimated data availability size for block 30558838 with 225 transactions: 52916546100 "#]]); -}); + } +); // casttest!(cast_call_return_array_of_tuples, |_prj, cmd| { @@ -4815,7 +4819,7 @@ forgetest_async!(cast_send_with_data, |prj, cmd| { .stdout_eq(str![[r#" Executing previous transactions from the block. Traces: - [..] 0x5FbDB2315678afecb367f032d93F642f64180aa3::setNumber(111) + [22492] ::setNumber(111) ├─ storage changes: │ @ 0: 0 → 111 └─ ← [Stop] diff --git a/crates/cheatcodes/Cargo.toml b/crates/cheatcodes/Cargo.toml index 659fec7f1a333..f7313a99f4372 100644 --- a/crates/cheatcodes/Cargo.toml +++ b/crates/cheatcodes/Cargo.toml @@ -14,7 +14,17 @@ exclude.workspace = true [lints] workspace = true +[features] +default = [] +credible = ["dep:assertion-executor"] + +[build-dependencies] + [dependencies] +foundry-fork-db.workspace = true +# tracks the credible-sdk ENG-3169 rebase branch during the revm/alloy bump +assertion-executor = { git = "https://github.com/phylaxsystems/credible-sdk.git", branch = "lea/eng-3169-featcredible-sdk-update-revm-and-alloy-dependencies", features = ["phoundry"], optional = true } + foundry-cheatcodes-spec.workspace = true foundry-common.workspace = true foundry-compilers.workspace = true diff --git a/crates/cheatcodes/assets/cheatcodes.json b/crates/cheatcodes/assets/cheatcodes.json index 7d6cb9e481502..1a3ddcd3b9d3b 100644 --- a/crates/cheatcodes/assets/cheatcodes.json +++ b/crates/cheatcodes/assets/cheatcodes.json @@ -864,7 +864,7 @@ "func": { "id": "assertApproxEqAbsDecimal_1", "description": "Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqAbsDecimal(uint256,uint256,uint256,uint256,string)", @@ -904,7 +904,7 @@ "func": { "id": "assertApproxEqAbsDecimal_3", "description": "Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqAbsDecimal(int256,int256,uint256,uint256,string)", @@ -944,7 +944,7 @@ "func": { "id": "assertApproxEqAbs_1", "description": "Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.\nIncludes error message into revert string on failure.", - "declaration": "function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;", + "declaration": "function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqAbs(uint256,uint256,uint256,string)", @@ -984,7 +984,7 @@ "func": { "id": "assertApproxEqAbs_3", "description": "Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.\nIncludes error message into revert string on failure.", - "declaration": "function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;", + "declaration": "function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqAbs(int256,int256,uint256,string)", @@ -1024,7 +1024,7 @@ "func": { "id": "assertApproxEqRelDecimal_1", "description": "Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n`maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqRelDecimal(uint256,uint256,uint256,uint256,string)", @@ -1064,7 +1064,7 @@ "func": { "id": "assertApproxEqRelDecimal_3", "description": "Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n`maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqRelDecimal(int256,int256,uint256,uint256,string)", @@ -1104,7 +1104,7 @@ "func": { "id": "assertApproxEqRel_1", "description": "Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n`maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\nIncludes error message into revert string on failure.", - "declaration": "function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) external pure;", + "declaration": "function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqRel(uint256,uint256,uint256,string)", @@ -1144,7 +1144,7 @@ "func": { "id": "assertApproxEqRel_3", "description": "Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.\n`maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%\nIncludes error message into revert string on failure.", - "declaration": "function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure;", + "declaration": "function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertApproxEqRel(int256,int256,uint256,string)", @@ -1184,7 +1184,7 @@ "func": { "id": "assertEqDecimal_1", "description": "Asserts that two `uint256` values are equal, formatting them with decimals in failure message.\nIncludes error message into revert string on failure.", - "declaration": "function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEqDecimal(uint256,uint256,uint256,string)", @@ -1224,7 +1224,7 @@ "func": { "id": "assertEqDecimal_3", "description": "Asserts that two `int256` values are equal, formatting them with decimals in failure message.\nIncludes error message into revert string on failure.", - "declaration": "function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEqDecimal(int256,int256,uint256,string)", @@ -1264,7 +1264,7 @@ "func": { "id": "assertEq_1", "description": "Asserts that two `bool` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(bool left, bool right, string calldata error) external pure;", + "declaration": "function assertEq(bool left, bool right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(bool,bool,string)", @@ -1304,7 +1304,7 @@ "func": { "id": "assertEq_11", "description": "Asserts that two `string` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(string calldata left, string calldata right, string calldata error) external pure;", + "declaration": "function assertEq(string calldata left, string calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(string,string,string)", @@ -1344,7 +1344,7 @@ "func": { "id": "assertEq_13", "description": "Asserts that two `bytes` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;", + "declaration": "function assertEq(bytes calldata left, bytes calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(bytes,bytes,string)", @@ -1384,7 +1384,7 @@ "func": { "id": "assertEq_15", "description": "Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(bool[] calldata left, bool[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(bool[],bool[],string)", @@ -1424,7 +1424,7 @@ "func": { "id": "assertEq_17", "description": "Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(uint256[],uint256[],string)", @@ -1464,7 +1464,7 @@ "func": { "id": "assertEq_19", "description": "Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(int256[] calldata left, int256[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(int256[],int256[],string)", @@ -1524,7 +1524,7 @@ "func": { "id": "assertEq_21", "description": "Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(address[] calldata left, address[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(address[],address[],string)", @@ -1564,7 +1564,7 @@ "func": { "id": "assertEq_23", "description": "Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(bytes32[],bytes32[],string)", @@ -1604,7 +1604,7 @@ "func": { "id": "assertEq_25", "description": "Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(string[] calldata left, string[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(string[],string[],string)", @@ -1644,7 +1644,7 @@ "func": { "id": "assertEq_27", "description": "Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;", + "declaration": "function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(bytes[],bytes[],string)", @@ -1664,7 +1664,7 @@ "func": { "id": "assertEq_3", "description": "Asserts that two `uint256` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(uint256 left, uint256 right, string calldata error) external pure;", + "declaration": "function assertEq(uint256 left, uint256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(uint256,uint256,string)", @@ -1704,7 +1704,7 @@ "func": { "id": "assertEq_5", "description": "Asserts that two `int256` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(int256 left, int256 right, string calldata error) external pure;", + "declaration": "function assertEq(int256 left, int256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(int256,int256,string)", @@ -1744,7 +1744,7 @@ "func": { "id": "assertEq_7", "description": "Asserts that two `address` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(address left, address right, string calldata error) external pure;", + "declaration": "function assertEq(address left, address right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(address,address,string)", @@ -1784,7 +1784,7 @@ "func": { "id": "assertEq_9", "description": "Asserts that two `bytes32` values are equal and includes error message into revert string on failure.", - "declaration": "function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;", + "declaration": "function assertEq(bytes32 left, bytes32 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertEq(bytes32,bytes32,string)", @@ -1824,7 +1824,7 @@ "func": { "id": "assertFalse_1", "description": "Asserts that the given condition is false and includes error message into revert string on failure.", - "declaration": "function assertFalse(bool condition, string calldata error) external pure;", + "declaration": "function assertFalse(bool condition, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertFalse(bool,string)", @@ -1864,7 +1864,7 @@ "func": { "id": "assertGeDecimal_1", "description": "Compares two `uint256` values. Expects first value to be greater than or equal to second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGeDecimal(uint256,uint256,uint256,string)", @@ -1904,7 +1904,7 @@ "func": { "id": "assertGeDecimal_3", "description": "Compares two `int256` values. Expects first value to be greater than or equal to second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGeDecimal(int256,int256,uint256,string)", @@ -1944,7 +1944,7 @@ "func": { "id": "assertGe_1", "description": "Compares two `uint256` values. Expects first value to be greater than or equal to second.\nIncludes error message into revert string on failure.", - "declaration": "function assertGe(uint256 left, uint256 right, string calldata error) external pure;", + "declaration": "function assertGe(uint256 left, uint256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGe(uint256,uint256,string)", @@ -1984,7 +1984,7 @@ "func": { "id": "assertGe_3", "description": "Compares two `int256` values. Expects first value to be greater than or equal to second.\nIncludes error message into revert string on failure.", - "declaration": "function assertGe(int256 left, int256 right, string calldata error) external pure;", + "declaration": "function assertGe(int256 left, int256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGe(int256,int256,string)", @@ -2024,7 +2024,7 @@ "func": { "id": "assertGtDecimal_1", "description": "Compares two `uint256` values. Expects first value to be greater than second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGtDecimal(uint256,uint256,uint256,string)", @@ -2064,7 +2064,7 @@ "func": { "id": "assertGtDecimal_3", "description": "Compares two `int256` values. Expects first value to be greater than second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGtDecimal(int256,int256,uint256,string)", @@ -2104,7 +2104,7 @@ "func": { "id": "assertGt_1", "description": "Compares two `uint256` values. Expects first value to be greater than second.\nIncludes error message into revert string on failure.", - "declaration": "function assertGt(uint256 left, uint256 right, string calldata error) external pure;", + "declaration": "function assertGt(uint256 left, uint256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGt(uint256,uint256,string)", @@ -2144,7 +2144,7 @@ "func": { "id": "assertGt_3", "description": "Compares two `int256` values. Expects first value to be greater than second.\nIncludes error message into revert string on failure.", - "declaration": "function assertGt(int256 left, int256 right, string calldata error) external pure;", + "declaration": "function assertGt(int256 left, int256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertGt(int256,int256,string)", @@ -2184,7 +2184,7 @@ "func": { "id": "assertLeDecimal_1", "description": "Compares two `uint256` values. Expects first value to be less than or equal to second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLeDecimal(uint256,uint256,uint256,string)", @@ -2224,7 +2224,7 @@ "func": { "id": "assertLeDecimal_3", "description": "Compares two `int256` values. Expects first value to be less than or equal to second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLeDecimal(int256,int256,uint256,string)", @@ -2264,7 +2264,7 @@ "func": { "id": "assertLe_1", "description": "Compares two `uint256` values. Expects first value to be less than or equal to second.\nIncludes error message into revert string on failure.", - "declaration": "function assertLe(uint256 left, uint256 right, string calldata error) external pure;", + "declaration": "function assertLe(uint256 left, uint256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLe(uint256,uint256,string)", @@ -2304,7 +2304,7 @@ "func": { "id": "assertLe_3", "description": "Compares two `int256` values. Expects first value to be less than or equal to second.\nIncludes error message into revert string on failure.", - "declaration": "function assertLe(int256 left, int256 right, string calldata error) external pure;", + "declaration": "function assertLe(int256 left, int256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLe(int256,int256,string)", @@ -2344,7 +2344,7 @@ "func": { "id": "assertLtDecimal_1", "description": "Compares two `uint256` values. Expects first value to be less than second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLtDecimal(uint256,uint256,uint256,string)", @@ -2384,7 +2384,7 @@ "func": { "id": "assertLtDecimal_3", "description": "Compares two `int256` values. Expects first value to be less than second.\nFormats values with decimals in failure message. Includes error message into revert string on failure.", - "declaration": "function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLtDecimal(int256,int256,uint256,string)", @@ -2424,7 +2424,7 @@ "func": { "id": "assertLt_1", "description": "Compares two `uint256` values. Expects first value to be less than second.\nIncludes error message into revert string on failure.", - "declaration": "function assertLt(uint256 left, uint256 right, string calldata error) external pure;", + "declaration": "function assertLt(uint256 left, uint256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLt(uint256,uint256,string)", @@ -2464,7 +2464,7 @@ "func": { "id": "assertLt_3", "description": "Compares two `int256` values. Expects first value to be less than second.\nIncludes error message into revert string on failure.", - "declaration": "function assertLt(int256 left, int256 right, string calldata error) external pure;", + "declaration": "function assertLt(int256 left, int256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertLt(int256,int256,string)", @@ -2504,7 +2504,7 @@ "func": { "id": "assertNotEqDecimal_1", "description": "Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.\nIncludes error message into revert string on failure.", - "declaration": "function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEqDecimal(uint256,uint256,uint256,string)", @@ -2544,7 +2544,7 @@ "func": { "id": "assertNotEqDecimal_3", "description": "Asserts that two `int256` values are not equal, formatting them with decimals in failure message.\nIncludes error message into revert string on failure.", - "declaration": "function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;", + "declaration": "function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEqDecimal(int256,int256,uint256,string)", @@ -2584,7 +2584,7 @@ "func": { "id": "assertNotEq_1", "description": "Asserts that two `bool` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(bool left, bool right, string calldata error) external pure;", + "declaration": "function assertNotEq(bool left, bool right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(bool,bool,string)", @@ -2624,7 +2624,7 @@ "func": { "id": "assertNotEq_11", "description": "Asserts that two `string` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(string calldata left, string calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(string,string,string)", @@ -2664,7 +2664,7 @@ "func": { "id": "assertNotEq_13", "description": "Asserts that two `bytes` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(bytes calldata left, bytes calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(bytes,bytes,string)", @@ -2704,7 +2704,7 @@ "func": { "id": "assertNotEq_15", "description": "Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(bool[],bool[],string)", @@ -2744,7 +2744,7 @@ "func": { "id": "assertNotEq_17", "description": "Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(uint256[],uint256[],string)", @@ -2784,7 +2784,7 @@ "func": { "id": "assertNotEq_19", "description": "Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(int256[],int256[],string)", @@ -2844,7 +2844,7 @@ "func": { "id": "assertNotEq_21", "description": "Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(address[] calldata left, address[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(address[],address[],string)", @@ -2884,7 +2884,7 @@ "func": { "id": "assertNotEq_23", "description": "Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(bytes32[],bytes32[],string)", @@ -2924,7 +2924,7 @@ "func": { "id": "assertNotEq_25", "description": "Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(string[] calldata left, string[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(string[],string[],string)", @@ -2964,7 +2964,7 @@ "func": { "id": "assertNotEq_27", "description": "Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;", + "declaration": "function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(bytes[],bytes[],string)", @@ -2984,7 +2984,7 @@ "func": { "id": "assertNotEq_3", "description": "Asserts that two `uint256` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;", + "declaration": "function assertNotEq(uint256 left, uint256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(uint256,uint256,string)", @@ -3024,7 +3024,7 @@ "func": { "id": "assertNotEq_5", "description": "Asserts that two `int256` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(int256 left, int256 right, string calldata error) external pure;", + "declaration": "function assertNotEq(int256 left, int256 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(int256,int256,string)", @@ -3064,7 +3064,7 @@ "func": { "id": "assertNotEq_7", "description": "Asserts that two `address` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(address left, address right, string calldata error) external pure;", + "declaration": "function assertNotEq(address left, address right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(address,address,string)", @@ -3104,7 +3104,7 @@ "func": { "id": "assertNotEq_9", "description": "Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.", - "declaration": "function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;", + "declaration": "function assertNotEq(bytes32 left, bytes32 right, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertNotEq(bytes32,bytes32,string)", @@ -3144,7 +3144,7 @@ "func": { "id": "assertTrue_1", "description": "Asserts that the given condition is true and includes error message into revert string on failure.", - "declaration": "function assertTrue(bool condition, string calldata error) external pure;", + "declaration": "function assertTrue(bool condition, string calldata err) external pure;", "visibility": "external", "mutability": "pure", "signature": "assertTrue(bool,string)", @@ -3160,6 +3160,26 @@ "status": "stable", "safety": "safe" }, + { + "func": { + "id": "assertion", + "description": "Used to execute assertion against the next call or contract creation.\nWill revert if the assertion is not triggered.", + "declaration": "function assertion(address adopter, bytes calldata createData, bytes4 fnSelector) external;", + "visibility": "external", + "mutability": "", + "signature": "assertion(address,bytes,bytes4)", + "selector": "0x85f59e0e", + "selectorBytes": [ + 133, + 245, + 158, + 14 + ] + }, + "group": "credible", + "status": "stable", + "safety": "safe" + }, { "func": { "id": "assume", diff --git a/crates/cheatcodes/assets/cheatcodes.schema.json b/crates/cheatcodes/assets/cheatcodes.schema.json index c98cfb69357bd..33ea6ccc367f2 100644 --- a/crates/cheatcodes/assets/cheatcodes.schema.json +++ b/crates/cheatcodes/assets/cheatcodes.schema.json @@ -226,6 +226,13 @@ "Group": { "description": "Cheatcode groups.\nInitially derived and modified from inline comments in [`forge-std`'s `Vm.sol`][vmsol].\n\n[vmsol]: https://github.com/foundry-rs/forge-std/blob/dcb0d52bc4399d37a6545848e3b8f9d03c77b98d/src/Vm.sol", "oneOf": [ + { + "description": "Cheatcodes that are related to the Phylax Credible Layer\n\nExamples: `assertion`.\n\nSafety: safe", + "type": "string", + "enum": [ + "credible" + ] + }, { "description": "Cheatcodes that read from, or write to the current EVM execution state.\n\nExamples: any of the `record` cheatcodes, `chainId`, `coinbase`.\n\nSafety: ambiguous, depends on whether the cheatcode is read-only or not.", "type": "string", @@ -429,4 +436,4 @@ ] } } -} \ No newline at end of file +} diff --git a/crates/cheatcodes/spec/src/cheatcode.rs b/crates/cheatcodes/spec/src/cheatcode.rs index 89cfb31f1df32..84e5d6bafc381 100644 --- a/crates/cheatcodes/spec/src/cheatcode.rs +++ b/crates/cheatcodes/spec/src/cheatcode.rs @@ -68,6 +68,12 @@ pub enum Status<'a> { #[serde(rename_all = "camelCase")] #[non_exhaustive] pub enum Group { + /// Cheatcodes that are related to the Phylax Credible Layer + /// + /// Examples: `assertion`. + /// + /// Safety: safe + Credible, /// Cheatcodes that read from, or write to the current EVM execution state. /// /// Examples: any of the `record` cheatcodes, `chainId`, `coinbase`. @@ -137,6 +143,7 @@ impl Group { /// `None`. pub const fn safety(self) -> Option { match self { + Self::Credible => Some(Safety::Safe), Self::Evm | Self::Testing => None, Self::Scripting | Self::Filesystem @@ -152,6 +159,7 @@ impl Group { /// Returns this value as a string. pub const fn as_str(self) -> &'static str { match self { + Self::Credible => "credible", Self::Evm => "evm", Self::Testing => "testing", Self::Scripting => "scripting", diff --git a/crates/cheatcodes/spec/src/vm.rs b/crates/cheatcodes/spec/src/vm.rs index 65f181f6b0e35..d223706ac174c 100644 --- a/crates/cheatcodes/spec/src/vm.rs +++ b/crates/cheatcodes/spec/src/vm.rs @@ -19,6 +19,13 @@ sol! { #[derive(Debug, Cheatcode)] // Keep this list small to avoid unnecessary bloat. #[sol(abi)] interface Vm { + + /// Used to execute assertion against the next call or contract creation. + /// Will revert if the assertion is not triggered. + #[cheatcode(group = Credible, safety = Safe)] + function assertion(address adopter, bytes calldata createData, bytes4 fnSelector) external; + + // ======== Types ======== /// Error thrown by cheatcodes. @@ -1243,7 +1250,7 @@ interface Vm { /// Asserts that the given condition is true and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertTrue(bool condition, string calldata error) external pure; + function assertTrue(bool condition, string calldata err) external pure; /// Asserts that the given condition is false. #[cheatcode(group = Testing, safety = Safe)] @@ -1251,7 +1258,7 @@ interface Vm { /// Asserts that the given condition is false and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertFalse(bool condition, string calldata error) external pure; + function assertFalse(bool condition, string calldata err) external pure; /// Asserts that two `bool` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1259,7 +1266,7 @@ interface Vm { /// Asserts that two `bool` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(bool left, bool right, string calldata error) external pure; + function assertEq(bool left, bool right, string calldata err) external pure; /// Asserts that two `uint256` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1267,7 +1274,7 @@ interface Vm { /// Asserts that two `uint256` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(uint256 left, uint256 right, string calldata error) external pure; + function assertEq(uint256 left, uint256 right, string calldata err) external pure; /// Asserts that two `int256` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1275,7 +1282,7 @@ interface Vm { /// Asserts that two `int256` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(int256 left, int256 right, string calldata error) external pure; + function assertEq(int256 left, int256 right, string calldata err) external pure; /// Asserts that two `address` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1283,7 +1290,7 @@ interface Vm { /// Asserts that two `address` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(address left, address right, string calldata error) external pure; + function assertEq(address left, address right, string calldata err) external pure; /// Asserts that two `bytes32` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1291,7 +1298,7 @@ interface Vm { /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; + function assertEq(bytes32 left, bytes32 right, string calldata err) external pure; /// Asserts that two `string` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1299,7 +1306,7 @@ interface Vm { /// Asserts that two `string` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(string calldata left, string calldata right, string calldata error) external pure; + function assertEq(string calldata left, string calldata right, string calldata err) external pure; /// Asserts that two `bytes` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1307,7 +1314,7 @@ interface Vm { /// Asserts that two `bytes` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + function assertEq(bytes calldata left, bytes calldata right, string calldata err) external pure; /// Asserts that two arrays of `bool` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1315,7 +1322,7 @@ interface Vm { /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + function assertEq(bool[] calldata left, bool[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `uint256 values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1323,7 +1330,7 @@ interface Vm { /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `int256` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1331,7 +1338,7 @@ interface Vm { /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + function assertEq(int256[] calldata left, int256[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `address` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1339,7 +1346,7 @@ interface Vm { /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + function assertEq(address[] calldata left, address[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `bytes32` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1347,7 +1354,7 @@ interface Vm { /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `string` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1355,7 +1362,7 @@ interface Vm { /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + function assertEq(string[] calldata left, string[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `bytes` values are equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1363,7 +1370,7 @@ interface Vm { /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; + function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata err) external pure; /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. #[cheatcode(group = Testing, safety = Safe)] @@ -1372,7 +1379,7 @@ interface Vm { /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. #[cheatcode(group = Testing, safety = Safe)] @@ -1381,7 +1388,7 @@ interface Vm { /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; /// Asserts that two `bool` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1389,7 +1396,7 @@ interface Vm { /// Asserts that two `bool` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(bool left, bool right, string calldata error) external pure; + function assertNotEq(bool left, bool right, string calldata err) external pure; /// Asserts that two `uint256` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1397,7 +1404,7 @@ interface Vm { /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; + function assertNotEq(uint256 left, uint256 right, string calldata err) external pure; /// Asserts that two `int256` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1405,7 +1412,7 @@ interface Vm { /// Asserts that two `int256` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(int256 left, int256 right, string calldata error) external pure; + function assertNotEq(int256 left, int256 right, string calldata err) external pure; /// Asserts that two `address` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1413,7 +1420,7 @@ interface Vm { /// Asserts that two `address` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(address left, address right, string calldata error) external pure; + function assertNotEq(address left, address right, string calldata err) external pure; /// Asserts that two `bytes32` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1421,7 +1428,7 @@ interface Vm { /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; + function assertNotEq(bytes32 left, bytes32 right, string calldata err) external pure; /// Asserts that two `string` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1429,7 +1436,7 @@ interface Vm { /// Asserts that two `string` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; + function assertNotEq(string calldata left, string calldata right, string calldata err) external pure; /// Asserts that two `bytes` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1437,7 +1444,7 @@ interface Vm { /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + function assertNotEq(bytes calldata left, bytes calldata right, string calldata err) external pure; /// Asserts that two arrays of `bool` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1445,7 +1452,7 @@ interface Vm { /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `uint256` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1453,7 +1460,7 @@ interface Vm { /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `int256` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1461,7 +1468,7 @@ interface Vm { /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `address` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1469,7 +1476,7 @@ interface Vm { /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + function assertNotEq(address[] calldata left, address[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `bytes32` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1477,7 +1484,7 @@ interface Vm { /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `string` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1485,7 +1492,7 @@ interface Vm { /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + function assertNotEq(string[] calldata left, string[] calldata right, string calldata err) external pure; /// Asserts that two arrays of `bytes` values are not equal. #[cheatcode(group = Testing, safety = Safe)] @@ -1493,7 +1500,7 @@ interface Vm { /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; + function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata err) external pure; /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. #[cheatcode(group = Testing, safety = Safe)] @@ -1502,7 +1509,7 @@ interface Vm { /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. #[cheatcode(group = Testing, safety = Safe)] @@ -1511,7 +1518,7 @@ interface Vm { /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. #[cheatcode(group = Testing, safety = Safe)] @@ -1520,7 +1527,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be greater than second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGt(uint256 left, uint256 right, string calldata error) external pure; + function assertGt(uint256 left, uint256 right, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be greater than second. #[cheatcode(group = Testing, safety = Safe)] @@ -1529,7 +1536,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be greater than second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGt(int256 left, int256 right, string calldata error) external pure; + function assertGt(int256 left, int256 right, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. @@ -1539,7 +1546,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. @@ -1549,7 +1556,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. #[cheatcode(group = Testing, safety = Safe)] @@ -1558,7 +1565,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGe(uint256 left, uint256 right, string calldata error) external pure; + function assertGe(uint256 left, uint256 right, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. #[cheatcode(group = Testing, safety = Safe)] @@ -1567,7 +1574,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGe(int256 left, int256 right, string calldata error) external pure; + function assertGe(int256 left, int256 right, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. @@ -1577,7 +1584,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. @@ -1587,7 +1594,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be less than second. #[cheatcode(group = Testing, safety = Safe)] @@ -1596,7 +1603,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be less than second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLt(uint256 left, uint256 right, string calldata error) external pure; + function assertLt(uint256 left, uint256 right, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be less than second. #[cheatcode(group = Testing, safety = Safe)] @@ -1605,7 +1612,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be less than second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLt(int256 left, int256 right, string calldata error) external pure; + function assertLt(int256 left, int256 right, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. @@ -1615,7 +1622,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. @@ -1625,7 +1632,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. #[cheatcode(group = Testing, safety = Safe)] @@ -1634,7 +1641,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLe(uint256 left, uint256 right, string calldata error) external pure; + function assertLe(uint256 left, uint256 right, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. #[cheatcode(group = Testing, safety = Safe)] @@ -1643,7 +1650,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLe(int256 left, int256 right, string calldata error) external pure; + function assertLe(int256 left, int256 right, string calldata err) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. @@ -1653,7 +1660,7 @@ interface Vm { /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. @@ -1663,7 +1670,7 @@ interface Vm { /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. #[cheatcode(group = Testing, safety = Safe)] @@ -1672,7 +1679,7 @@ interface Vm { /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata err) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. #[cheatcode(group = Testing, safety = Safe)] @@ -1681,7 +1688,7 @@ interface Vm { /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata err) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. @@ -1696,7 +1703,7 @@ interface Vm { uint256 right, uint256 maxDelta, uint256 decimals, - string calldata error + string calldata err ) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. @@ -1712,7 +1719,7 @@ interface Vm { int256 right, uint256 maxDelta, uint256 decimals, - string calldata error + string calldata err ) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. @@ -1724,7 +1731,7 @@ interface Vm { /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) external pure; + function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata err) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% @@ -1735,7 +1742,7 @@ interface Vm { /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Includes error message into revert string on failure. #[cheatcode(group = Testing, safety = Safe)] - function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure; + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata err) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% @@ -1757,7 +1764,7 @@ interface Vm { uint256 right, uint256 maxPercentDelta, uint256 decimals, - string calldata error + string calldata err ) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. @@ -1780,7 +1787,7 @@ interface Vm { int256 right, uint256 maxPercentDelta, uint256 decimals, - string calldata error + string calldata err ) external pure; /// Returns true if the current Foundry version is greater than or equal to the given version. diff --git a/crates/cheatcodes/src/credible.rs b/crates/cheatcodes/src/credible.rs new file mode 100644 index 0000000000000..ae108a2eeb634 --- /dev/null +++ b/crates/cheatcodes/src/credible.rs @@ -0,0 +1,510 @@ +use crate::{Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, Result, Vm::*}; +use alloy_primitives::{Bytes, FixedBytes, TxKind}; +use assertion_executor::{ + ExecutorConfig, + db::{DatabaseCommit, DatabaseRef, fork_db::ForkDb}, + primitives::{ + AccountInfo, Address, AssertionFunctionExecutionResult, B256, Bytecode, ExecutionResult, + TxEnv, TxValidationResult, U256, + }, + store::{AssertionState, AssertionStore}, +}; +use foundry_evm_core::{ + decode::RevertDecoder, + env::FoundryContextExt, + evm::{FoundryContextFor, FoundryEvmNetwork}, +}; +use foundry_fork_db::DatabaseError; +use revm::{ + Database, + context::{Block, BlockEnv, ContextTr, JournalTr, Transaction}, +}; +use std::{ + cmp::max, + collections::HashSet, + sync::{Arc, Mutex}, +}; + +use revm::primitives::eip7825::TX_GAS_LIMIT_CAP; + +/// Wrapper around DatabaseExt so assertion-executor can clone and share the active database. +struct ThreadSafeDb<'db, DB: Database + Send> { + db: Arc>, +} + +impl + Send> Clone for ThreadSafeDb<'_, DB> { + fn clone(&self) -> Self { + Self { db: self.db.clone() } + } +} + +impl + Send> std::fmt::Debug for ThreadSafeDb<'_, DB> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "ThreadSafeDb") + } +} + +impl<'db, DB: Database + Send> ThreadSafeDb<'db, DB> { + pub fn new(db: &'db mut DB) -> Self { + Self { db: Arc::new(Mutex::new(db)) } + } +} + +impl + Send> DatabaseRef for ThreadSafeDb<'_, DB> { + type Error = DatabaseError; + + fn basic_ref( + &self, + address: Address, + ) -> Result, ::Error> { + self.db.lock().unwrap().basic(address) + } + + fn code_by_hash_ref(&self, code_hash: B256) -> Result::Error> { + self.db.lock().unwrap().code_by_hash(code_hash) + } + + fn storage_ref( + &self, + address: Address, + index: U256, + ) -> Result::Error> { + self.db.lock().unwrap().storage(address, index) + } + + fn block_hash_ref(&self, number: u64) -> Result::Error> { + self.db.lock().unwrap().block_hash(number) + } +} + +impl Cheatcode for assertionCall { + fn apply_stateful(&self, ccx: &mut CheatsCtxt<'_, '_, FEN>) -> Result { + let Self { adopter, createData: create_data, fnSelector: fn_selector } = self; + + ensure!( + ccx.state.assertion.is_none(), + "you must call another function prior to setting another assertion" + ); + let assertion = Assertion { + adopter: *adopter, + create_data: create_data.to_vec(), + fn_selector: *fn_selector, + depth: ccx.ecx.journal().depth(), + }; + + ccx.state.assertion = Some(assertion); + Ok(Default::default()) + } +} + +#[derive(Debug, Clone)] +pub struct Assertion { + pub adopter: Address, + pub create_data: Vec, + pub fn_selector: FixedBytes<4>, + pub depth: usize, +} + +pub struct TxAttributes { + pub value: U256, + pub data: Bytes, + pub caller: Address, + pub kind: TxKind, + pub gas_limit: u64, +} + +/// Maximum gas allowed for assertion execution (300k gas). +/// Assertions exceeding this limit will cause the test to fail. +const ASSERTION_GAS_LIMIT: u64 = 300_000; + +/// Checks if the assertion gas usage is within the allowed limit. +/// Returns a detailed log message if the limit is exceeded, None otherwise. +fn check_assertion_gas_limit(gas_used: u64) -> Option { + (gas_used > ASSERTION_GAS_LIMIT).then(|| { + let over_by = gas_used - ASSERTION_GAS_LIMIT; + let over_percent = (over_by as f64 / ASSERTION_GAS_LIMIT as f64) * 100.0; + format!( + "Assertion used {gas_used} gas, exceeding limit of {ASSERTION_GAS_LIMIT} by {over_by} ({over_percent:.1}% over)" + ) + }) +} + +fn build_tx_env( + tx_attributes: TxAttributes, + base_tx_env: &impl Transaction, + chain_id: u64, + nonce: u64, +) -> TxEnv { + let tx_gas_limit = tx_attributes.gas_limit.min(TX_GAS_LIMIT_CAP); + TxEnv { + tx_type: base_tx_env.tx_type(), + caller: tx_attributes.caller, + gas_limit: tx_gas_limit, + gas_price: base_tx_env.gas_price(), + chain_id: Some(chain_id), + value: tx_attributes.value, + data: tx_attributes.data, + kind: tx_attributes.kind, + nonce, + gas_priority_fee: base_tx_env.max_priority_fee_per_gas(), + blob_hashes: base_tx_env.blob_versioned_hashes().to_vec(), + max_fee_per_blob_gas: base_tx_env.max_fee_per_blob_gas(), + ..Default::default() + } +} + +fn build_block_env(block: &impl Block) -> BlockEnv { + BlockEnv { + number: block.number(), + beneficiary: block.beneficiary(), + timestamp: block.timestamp(), + gas_limit: block.gas_limit(), + basefee: block.basefee(), + difficulty: block.difficulty(), + prevrandao: block.prevrandao(), + blob_excess_gas_and_price: block.blob_excess_gas_and_price(), + ..Default::default() + } +} + +/// Used to handle assertion execution in inspector in calls after the cheatcode was called. +pub fn execute_assertion( + assertion: &Assertion, + tx_attributes: TxAttributes, + ecx: &mut FoundryContextFor<'_, FEN>, + executor: &mut dyn CheatcodesExecutor, + cheats: &mut Cheatcodes, +) -> Result<(), crate::Error> { + let spec_id = ecx.cfg().spec.into(); + let block = build_block_env(ecx.block()); + let chain_id = ecx.cfg().chain_id; + let nonce = ecx + .journal_mut() + .load_account(tx_attributes.caller) + .map(|acc| acc.data.info.nonce) + .unwrap_or(0); + + // Prepare assertion store + let config = ExecutorConfig { + spec_id, + chain_id, + assertion_gas_limit: TX_GAS_LIMIT_CAP, + assertion_evaluation_enabled: true, + }; + + let store = AssertionStore::new_ephemeral(); + + if assertion.create_data.is_empty() { + bail!("Assertion bytecode is empty"); + } + + let mut assertion_state = + AssertionState::new_active(&Bytes::from_iter(assertion.create_data.clone()), &config) + .expect("Failed to create assertion state"); + + // Filter triggers to only keep those matching our fn_selector + assertion_state.trigger_recorder.triggers.retain(|_, fn_selectors| { + if fn_selectors.contains(&assertion.fn_selector) { + *fn_selectors = HashSet::from_iter([assertion.fn_selector]); + true + } else { + false + } + }); + + store.insert(assertion.adopter, assertion_state).expect("Failed to store assertions"); + + let tx_env = build_tx_env(tx_attributes, ecx.tx(), chain_id, nonce); + + let mut assertion_executor = config.build(store); + + let (raw_db, journal_inner) = ecx.db_journal_inner_mut(); + let state = journal_inner.state.clone(); + let db = ThreadSafeDb::new(raw_db); + + // Commit current journal state so that it is available for assertions and triggering tx + let mut fork_db = ForkDb::new(db.clone()); + fork_db.commit(state); + + // Odysseas: This is a hack to use the new unified codepath for validate_transaction_ext_db + // Effectively, we are applying the transaction in a clone of the currently running database + // which is then used by the fork_db. + // TODO: Remove this once we have a proper way to handle this. + let mut ext_db = revm::database::WrapDatabaseRef(fork_db.clone()); + + let tx_validation: TxValidationResult = assertion_executor + .validate_transaction_ext_db(block, &tx_env, &mut fork_db, &mut ext_db) + .map_err(|e| format!("Assertion Executor Error: {e:#?}"))?; + + // if transaction execution reverted, log the revert reason + if !tx_validation.result_and_state.result.is_success() { + bail!(format!( + "Mock Transaction Reverted: {}", + decode_invalidated_assertion(&tx_validation.result_and_state.result) + )); + } + + // else get information about the assertion execution + let total_assertion_gas = tx_validation.total_assertions_gas(); + let total_assertions_ran = tx_validation.total_assertion_funcs_ran(); + let tx_gas_used = tx_validation.result_and_state.result.tx_gas_used(); + + if total_assertions_ran != 1 { + // If assertions were not executed, we need to update expect revert depth to + // allow for matching on this revert condition, as we will not execute against + // test evm in this case. + journal_inner.checkpoint(); + + if let Some(expected) = &mut cheats.expected_revert { + expected.max_depth = max(journal_inner.depth, expected.max_depth); + } + bail!("Expected 1 assertion to be executed, but {total_assertions_ran} were executed."); + } + + //Expect is safe because we validate above that 1 assertion was ran. + let assertion_contract = tx_validation + .assertions_executions + .first() + .expect("Expected 1 assertion to be executed, but got 0"); + + let assertion_fn_result = assertion_contract + .assertion_fns_results + .first() + .expect("Expected 1 assertion to be executed, but got 0"); + + if !assertion_fn_result.console_logs.is_empty() { + executor.console_log("Assertion function logs: "); + for log in &assertion_fn_result.console_logs { + executor.console_log(log); + } + } + + executor.console_log(&format!( + "Transaction gas cost: {tx_gas_used}\n Assertion gas cost: {total_assertion_gas}" + )); + + if !tx_validation.is_valid() { + // If invalidated, we don't execute against test evm, so we must update expected depth + // for expect revert cheatcode. + journal_inner.checkpoint(); + + if let Some(expected) = &mut cheats.expected_revert { + expected.max_depth = max(journal_inner.depth, expected.max_depth); + } + + let (msg, result) = match &assertion_fn_result.result { + AssertionFunctionExecutionResult::AssertionContractDeployFailure(r) => { + ("Assertion contract deploy failed", r) + } + AssertionFunctionExecutionResult::AssertionExecutionResult(r) => { + ("Assertion function reverted", r) + } + }; + executor.console_log(&format!("{msg}: {}", decode_invalidated_assertion(result))); + return Err(crate::Error::from(result.output().unwrap_or_default().clone())); + } + + if let Some(log_msg) = check_assertion_gas_limit(total_assertion_gas) { + executor.console_log(&log_msg); + bail!("Assertion exceeded gas limit"); + } + + Ok(()) +} + +/// Decodes revert data from an assertion execution result. +/// Uses foundry's RevertDecoder to handle all revert types: +/// - Error(string) from revert()/require() +/// - Panic(uint256) from assert()/overflow/etc +/// - Custom errors +/// - Raw bytes as fallback +fn decode_invalidated_assertion(result: &ExecutionResult) -> String { + match result { + ExecutionResult::Success { .. } => { + "Tried to decode invalidated assertion, but result was success. \ + This is a bug in phoundry. Please report to the Phylax team." + .to_string() + } + ExecutionResult::Revert { output, .. } => RevertDecoder::default().decode(output, None), + ExecutionResult::Halt { reason, .. } => { + format!("Halt reason: {reason:#?}") + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_sol_types::{Revert, SolError}; + use assertion_executor::primitives::HaltReason; + use revm::context_interface::result::{Output, ResultGas, SuccessReason}; + + #[test] + fn test_decode_revert_error_success() { + let result = ExecutionResult::Success { + gas: ResultGas::new_with_state_gas(0, 0, 0, 0), + logs: vec![], + output: Output::Call(Bytes::new()), + reason: SuccessReason::Return, + }; + let decoded = decode_invalidated_assertion(&result); + assert!(decoded.contains("bug in phoundry")); + } + + #[test] + fn test_decode_revert_error_revert() { + let revert_reason = "Something is a bit fky wuky"; + let revert_output = Revert::new((revert_reason.to_string(),)).abi_encode(); + let result = ExecutionResult::Revert { + output: revert_output.into(), + gas: ResultGas::new_with_state_gas(0, 0, 0, 0), + logs: vec![], + }; + let decoded = decode_invalidated_assertion(&result); + assert_eq!(decoded, revert_reason); + } + + #[test] + fn test_decode_revert_panic() { + // Panic(uint256) with code 0x01 (assertion failed) + let panic_output = alloy_sol_types::Panic::from(0x01).abi_encode(); + let result = ExecutionResult::Revert { + output: panic_output.into(), + gas: ResultGas::new_with_state_gas(0, 0, 0, 0), + logs: vec![], + }; + let decoded = decode_invalidated_assertion(&result); + assert!(decoded.contains("Panic") || decoded.contains("panic")); + } + + #[test] + fn test_decode_revert_raw_bytes() { + // Raw bytes that don't match any known format + let raw_bytes = vec![0xde, 0xad, 0xbe, 0xef]; + let result = ExecutionResult::Revert { + output: raw_bytes.into(), + gas: ResultGas::new_with_state_gas(0, 0, 0, 0), + logs: vec![], + }; + let decoded = decode_invalidated_assertion(&result); + // Should contain hex representation + assert!(decoded.contains("deadbeef") || decoded.contains("custom error")); + } + + #[test] + fn test_decode_revert_error_halt() { + let halt_reason = HaltReason::CallTooDeep; + let result = ExecutionResult::Halt { + reason: halt_reason, + gas: ResultGas::new_with_state_gas(0, 0, 0, 0), + logs: vec![], + }; + let decoded = decode_invalidated_assertion(&result); + assert_eq!(decoded, "Halt reason: CallTooDeep"); + } + + #[test] + fn test_build_tx_env_uses_base_gas_fields() { + let base_tx_env = TxEnv { + gas_limit: 50_000, + gas_price: 123, + gas_priority_fee: Some(7), + tx_type: 2, + ..Default::default() + }; + let tx_attributes = TxAttributes { + value: U256::from(1), + data: Bytes::from(vec![0x01, 0x02]), + caller: Address::from([0x11; 20]), + kind: TxKind::Call(Address::from([0x22; 20])), + gas_limit: 40_000, + }; + let tx_env = build_tx_env(tx_attributes, &base_tx_env, 1, 9); + + assert_eq!(tx_env.gas_limit, 40_000); + assert_eq!(tx_env.gas_price, 123); + assert_eq!(tx_env.gas_priority_fee, Some(7)); + assert_eq!(tx_env.tx_type, 2); + assert_eq!(tx_env.chain_id, Some(1)); + assert_eq!(tx_env.nonce, 9); + assert_eq!(tx_env.caller, Address::from([0x11; 20])); + assert_eq!(tx_env.value, U256::from(1)); + assert_eq!(tx_env.data, Bytes::from(vec![0x01, 0x02])); + assert_eq!(tx_env.kind, TxKind::Call(Address::from([0x22; 20]))); + } + + #[test] + fn test_build_tx_env_caps_gas_limit() { + let base_tx_env = TxEnv { + gas_limit: TX_GAS_LIMIT_CAP.saturating_add(1), + gas_price: 1, + ..Default::default() + }; + let tx_attributes = TxAttributes { + value: U256::ZERO, + data: Bytes::new(), + caller: Address::from([0x33; 20]), + kind: TxKind::Call(Address::from([0x44; 20])), + gas_limit: TX_GAS_LIMIT_CAP.saturating_add(1), + }; + let tx_env = build_tx_env(tx_attributes, &base_tx_env, 1, 0); + + assert_eq!(tx_env.gas_limit, TX_GAS_LIMIT_CAP); + } + + #[test] + fn test_assertion_gas_limit_constant() { + // Ensure the gas limit is set to the expected value (300k) + assert_eq!(ASSERTION_GAS_LIMIT, 300_000); + } + + #[test] + fn test_check_gas_limit_under() { + // Gas usage under limit should return None + assert!(check_assertion_gas_limit(100_000).is_none()); + assert!(check_assertion_gas_limit(299_999).is_none()); + } + + #[test] + fn test_check_gas_limit_exact() { + // Gas usage exactly at limit should return None + assert!(check_assertion_gas_limit(300_000).is_none()); + } + + #[test] + fn test_check_gas_limit_over() { + // Gas usage over limit should return error message with details + let result = check_assertion_gas_limit(450_000); + assert!(result.is_some()); + let msg = result.unwrap(); + // Should contain: gas used, limit, absolute over, percentage + assert!(msg.contains("450000"), "should contain gas used"); + assert!(msg.contains("300000"), "should contain limit"); + assert!(msg.contains("150000"), "should contain absolute over amount"); + assert!(msg.contains("50.0%"), "should contain percentage over"); + } + + #[test] + fn test_check_gas_limit_over_small() { + // Just 1 gas over the limit + let result = check_assertion_gas_limit(300_001); + assert!(result.is_some()); + let msg = result.unwrap(); + assert!(msg.contains("300001")); + assert!(msg.contains("by 1")); + assert!(msg.contains("0.0%")); // 1/300000 ≈ 0.0003% + } + + #[test] + fn test_check_gas_limit_zero() { + // Zero gas should be fine + assert!(check_assertion_gas_limit(0).is_none()); + } + + #[test] + fn test_check_gas_limit_max() { + // Max u64 should definitely exceed + let result = check_assertion_gas_limit(u64::MAX); + assert!(result.is_some()); + } +} diff --git a/crates/cheatcodes/src/inspector.rs b/crates/cheatcodes/src/inspector.rs index b22f76714dd0f..78acecf8be6fa 100644 --- a/crates/cheatcodes/src/inspector.rs +++ b/crates/cheatcodes/src/inspector.rs @@ -44,7 +44,7 @@ use foundry_evm_core::{ }, }; use foundry_evm_traces::{ - TracingInspector, TracingInspectorConfig, identifier::SignaturesIdentifier, + CallTraceArena, TracingInspector, TracingInspectorConfig, identifier::SignaturesIdentifier, }; use foundry_wallets::wallet_multi::MultiWallet; use itertools::Itertools; @@ -464,6 +464,10 @@ pub struct Cheatcodes { /// Expected revert information pub expected_revert: Option, + /// Assertion information (only available with `credible` feature) + #[cfg(feature = "credible")] + pub assertion: Option, + /// Assume next call can revert and discard fuzz run if it does. pub assume_no_revert: Option, @@ -558,6 +562,11 @@ pub struct Cheatcodes { /// Ignored traces. pub ignored_traces: IgnoredTraces, + /// Assertion traces collected during assertion execution. + assertion_traces: Vec, + /// Trigger call traces collected during assertion execution. + assertion_trigger_traces: Vec, + /// Addresses with arbitrary storage. pub arbitrary_storage: Option, @@ -607,6 +616,8 @@ impl Cheatcodes { mocked_functions: Default::default(), expected_calls: Default::default(), expected_emits: Default::default(), + #[cfg(feature = "credible")] + assertion: Default::default(), expected_creates: Default::default(), allowed_mem_writes: Default::default(), broadcast: Default::default(), @@ -623,6 +634,8 @@ impl Cheatcodes { intercept_next_create_call: Default::default(), test_runner: Default::default(), ignored_traces: Default::default(), + assertion_traces: Default::default(), + assertion_trigger_traces: Default::default(), arbitrary_storage: Default::default(), deprecated: Default::default(), wallets: Default::default(), @@ -654,6 +667,32 @@ impl Cheatcodes { self.wallets = Some(wallets); } + /// Stores assertion traces collected during execution. + pub fn push_assertion_traces(&mut self, traces: I) + where + I: IntoIterator, + { + self.assertion_traces.extend(traces); + } + + /// Stores trigger call traces collected during assertion execution. + pub fn push_assertion_trigger_traces(&mut self, traces: I) + where + I: IntoIterator, + { + self.assertion_trigger_traces.extend(traces); + } + + /// Drains assertion traces for inclusion in test output. + pub fn take_assertion_traces(&mut self) -> Vec { + std::mem::take(&mut self.assertion_traces) + } + + /// Drains trigger call traces for inclusion in test output. + pub fn take_assertion_trigger_traces(&mut self) -> Vec { + std::mem::take(&mut self.assertion_trigger_traces) + } + /// Adds a delegation to the active delegations list. pub fn add_delegation(&mut self, authorization: SignedAuthorization) { self.active_delegations.push(authorization); @@ -856,42 +895,6 @@ impl Cheatcodes { } } - // Handle mocked calls - if let Some(mocks) = self.mocked_calls.get_mut(&call.bytecode_address) { - let ctx = MockCallDataContext { - calldata: call.input.bytes(ecx), - value: call.transfer_value(), - }; - - if let Some(return_data_queue) = match mocks.get_mut(&ctx) { - Some(queue) => Some(queue), - None => mocks - .iter_mut() - .find(|(mock, _)| { - call.input.bytes(ecx).get(..mock.calldata.len()) == Some(&mock.calldata[..]) - && mock.value.is_none_or(|value| Some(value) == call.transfer_value()) - }) - .map(|(_, v)| v), - } && let Some(return_data) = if return_data_queue.len() == 1 { - // If the mocked calls stack has a single element in it, don't empty it - return_data_queue.front().map(|x| x.to_owned()) - } else { - // Else, we pop the front element - return_data_queue.pop_front() - } { - return Some(CallOutcome { - result: InterpreterResult { - result: return_data.ret_type, - output: return_data.data, - gas, - }, - memory_offset: call.return_memory_offset.clone(), - was_precompile_called: true, - precompile_call_logs: vec![], - }); - } - } - // Apply our prank if let Some(prank) = &self.get_prank(curr_depth) { // Apply delegate call, `call.caller`` will not equal `prank.prank_caller` @@ -932,6 +935,72 @@ impl Cheatcodes { } } + // Handle mocked calls + if let Some(mocks) = self.mocked_calls.get_mut(&call.bytecode_address) { + let ctx = MockCallDataContext { + calldata: call.input.bytes(ecx), + value: call.transfer_value(), + }; + + if let Some(return_data_queue) = match mocks.get_mut(&ctx) { + Some(queue) => Some(queue), + None => mocks + .iter_mut() + .find(|(mock, _)| { + call.input.bytes(ecx).get(..mock.calldata.len()) == Some(&mock.calldata[..]) + && mock.value.is_none_or(|value| Some(value) == call.transfer_value()) + }) + .map(|(_, v)| v), + } && let Some(return_data) = return_data_queue.front().map(|x| x.to_owned()) + { + if let Some(value) = call.transfer_value() { + let checkpoint = ecx.journal_mut().checkpoint(); + match ecx.journal_mut().transfer_loaded( + call.transfer_from(), + call.transfer_to(), + value, + ) { + None => { + if return_data.ret_type.is_ok() { + ecx.journal_mut().checkpoint_commit(); + } else { + ecx.journal_mut().checkpoint_revert(checkpoint); + } + } + Some(err) => { + ecx.journal_mut().checkpoint_revert(checkpoint); + return Some(CallOutcome { + result: InterpreterResult { + result: err.into(), + output: Bytes::new(), + gas, + }, + memory_offset: call.return_memory_offset.clone(), + was_precompile_called: false, + precompile_call_logs: vec![], + }); + } + } + } + + // If the mocked calls stack has a single element in it, don't empty it + if return_data_queue.len() > 1 { + return_data_queue.pop_front(); + } + + return Some(CallOutcome { + result: InterpreterResult { + result: return_data.ret_type, + output: return_data.data, + gas, + }, + memory_offset: call.return_memory_offset.clone(), + was_precompile_called: true, + precompile_call_logs: vec![], + }); + } + } + // Apply EIP-2930 access list self.apply_accesslist(ecx); @@ -1098,6 +1167,37 @@ impl Cheatcodes { }]); } + #[cfg(feature = "credible")] + if let Some(assertion) = self.assertion.take() { + let tx_attributes = crate::credible::TxAttributes { + value: call.call_value(), + data: call.input.bytes(ecx), + caller: call.caller, + kind: TxKind::Call(call.target_address), + gas_limit: call.gas_limit, + }; + + return match crate::credible::execute_assertion( + &assertion, + tx_attributes, + ecx, + executor, + self, + ) { + Ok(()) => None, + Err(err) => Some(CallOutcome { + result: InterpreterResult { + result: InstructionResult::Revert, + output: err.abi_encode().into(), + gas, + }, + memory_offset: call.return_memory_offset.clone(), + was_precompile_called: false, + precompile_call_logs: vec![], + }), + }; + } + None } @@ -1497,6 +1597,21 @@ impl Inspector> for Cheatcode } } + // this will ensure we don't have false positives when trying to diagnose reverts in fork + // mode + let diag = self.fork_revert_diagnostic.take(); + + // If the call already reverted, preserve that primary failure and skip post-call + // expect* validation so it cannot overwrite the original revert. + if outcome.result.is_revert() { + // if there's a revert and a previous call was diagnosed as fork related revert then we + // can return a better error here + if let Some(err) = diag { + outcome.result.output = Error::encode(err.to_error_msg(&self.labels)); + } + return; + } + // At the end of the call, // we need to check if we've found all the emits. // We know we've found all the expected emits in the right order @@ -1574,19 +1689,6 @@ impl Inspector> for Cheatcode self.expected_emits.clear() } - // this will ensure we don't have false positives when trying to diagnose reverts in fork - // mode - let diag = self.fork_revert_diagnostic.take(); - - // if there's a revert and a previous call was diagnosed as fork related revert then we can - // return a better error here - if outcome.result.is_revert() - && let Some(err) = diag - { - outcome.result.output = Error::encode(err.to_error_msg(&self.labels)); - return; - } - // try to diagnose reverts in multi-fork mode where a call is made to an address that does // not exist if let TxKind::Call(test_contract) = ecx.tx().kind() { @@ -1830,6 +1932,35 @@ impl Inspector> for Cheatcode }]); } + #[cfg(feature = "credible")] + if let Some(assertion) = self.assertion.take() { + let tx_attributes = crate::credible::TxAttributes { + value: input.value(), + data: input.init_code(), + caller: input.caller(), + kind: TxKind::Create, + gas_limit: input.gas_limit(), + }; + + return match crate::credible::execute_assertion( + &assertion, + tx_attributes, + ecx, + &mut TransparentCheatcodesExecutor, + self, + ) { + Ok(()) => None, + Err(err) => Some(CreateOutcome { + result: InterpreterResult { + result: InstructionResult::Revert, + output: err.abi_encode().into(), + gas, + }, + address: None, + }), + }; + } + None } @@ -1867,10 +1998,23 @@ impl Inspector> for Cheatcode } // Handle expected reverts - if let Some(expected_revert) = &self.expected_revert + if let Some(expected_revert) = &mut self.expected_revert && curr_depth <= expected_revert.depth && matches!(expected_revert.kind, ExpectedRevertKind::Default) { + // Mirror the logic in `call_end`: when an expected reverter address is set + // and we don't yet have one (or we're matching multiple reverts), record the + // would-be deployed address as the reverter. revm guarantees `outcome.address` + // is `Some(_)` whenever the constructor actually ran (including the revert + // case); it is only `None` for pre-frame rejection (depth/balance/nonce), + // for which a reverter address is meaningless. + if outcome.result.is_revert() + && expected_revert.reverter.is_some() + && (expected_revert.reverted_by.is_none() || expected_revert.count > 1) + && let Some(addr) = outcome.address + { + expected_revert.reverted_by = Some(addr); + } let mut expected_revert = std::mem::take(&mut self.expected_revert).unwrap(); return match revert_handlers::handle_expect_revert( false, diff --git a/crates/cheatcodes/src/lib.rs b/crates/cheatcodes/src/lib.rs index f3e922e5c14b4..d06c8850bb9d3 100644 --- a/crates/cheatcodes/src/lib.rs +++ b/crates/cheatcodes/src/lib.rs @@ -66,6 +66,29 @@ mod toml; mod utils; +#[cfg(feature = "credible")] +pub mod credible; + +/// Stub implementation when the `credible` feature is disabled. +/// `vm.assertion()` is kept in the ABI but reverts with a clear error at runtime. +#[cfg(not(feature = "credible"))] +mod credible_stub { + use crate::{Cheatcode, CheatsCtxt, Result, Vm::*}; + use foundry_evm_core::evm::FoundryEvmNetwork; + + impl Cheatcode for assertionCall { + fn apply_stateful( + &self, + _ccx: &mut CheatsCtxt<'_, '_, FEN>, + ) -> Result { + bail!( + "vm.assertion() requires Phylax-built forge with the `credible` feature enabled. \ + Install from: https://github.com/phylaxsystems/phoundry" + ) + } + } +} + /// Cheatcode implementation. pub(crate) trait Cheatcode: CheatcodeDef { /// Applies this cheatcode to the given state. diff --git a/crates/cheatcodes/src/test/assert.rs b/crates/cheatcodes/src/test/assert.rs index 632ba8e04245b..12d625768a0c9 100644 --- a/crates/cheatcodes/src/test/assert.rs +++ b/crates/cheatcodes/src/test/assert.rs @@ -164,7 +164,7 @@ impl EqRelAssertionError { format_units_uint(&f.left, decimals), format_units_uint(&f.right, decimals), format_delta_percent(&f.max_delta), - &f.real_delta, + f.real_delta, ), Self::Overflow => self.to_string(), } @@ -179,7 +179,7 @@ impl EqRelAssertionError { format_units_int(&f.left, decimals), format_units_int(&f.right, decimals), format_delta_percent(&f.max_delta), - &f.real_delta, + f.real_delta, ), Self::Overflow => self.to_string(), } @@ -222,9 +222,9 @@ fn handle_assertion_result_mono( /// Implements [crate::Cheatcode] for pairs of cheatcodes. /// /// Accepts a list of pairs of cheatcodes, where the first cheatcode is the one that doesn't contain -/// a custom error message, and the second one contains it at `error` field. +/// a custom error message, and the second one contains it at `err` field. /// -/// Passed `args` are the common arguments for both cheatcode structs (excluding `error` field). +/// Passed `args` are the common arguments for both cheatcode structs (excluding `err` field). /// /// Macro also accepts an optional closure that formats the error returned by the assertion. macro_rules! impl_assertions { @@ -267,10 +267,12 @@ macro_rules! impl_assertions { ccx: &mut CheatsCtxt<'_, '_, FEN>, executor: &mut dyn CheatcodesExecutor, ) -> Result { - let Self { $($arg,)* error } = self; + let Self { $($arg,)* err } = self; match $body { Ok(()) => Ok(Default::default()), - Err(err) => handle_assertion_result(ccx, executor, err, $error_formatter, Some(error)) + Err(assertion_err) => { + handle_assertion_result(ccx, executor, assertion_err, $error_formatter, Some(err)) + } } } } diff --git a/crates/cheatcodes/src/version.rs b/crates/cheatcodes/src/version.rs index fb722c2814baa..2b8f81518a621 100644 --- a/crates/cheatcodes/src/version.rs +++ b/crates/cheatcodes/src/version.rs @@ -20,7 +20,14 @@ impl Cheatcode for foundryVersionAtLeastCall { } fn foundry_version_cmp(version: &str) -> Result { - version_cmp(SEMVER_VERSION.split('-').next().unwrap(), version) + version_cmp(strip_semver_metadata(SEMVER_VERSION), version) +} + +/// Strips pre-release (e.g. `-nightly`, `-dev`) and build metadata +/// (e.g. `+..`) from a version string +/// so we compare on `MAJOR.MINOR.PATCH` only. +fn strip_semver_metadata(version: &str) -> &str { + version.split(['-', '+']).next().unwrap() } fn version_cmp(version_a: &str, version_b: &str) -> Result { @@ -42,3 +49,61 @@ fn parse_version(version: &str) -> Result { } Ok(version) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn strips_build_metadata_only() { + // Tagged release: `1.7.1+..` + assert_eq!(strip_semver_metadata("1.7.1+abc1234567.1737036656.release"), "1.7.1"); + } + + #[test] + fn strips_pre_release_and_build_metadata() { + // Nightly: `1.7.1-nightly+..` + assert_eq!(strip_semver_metadata("1.7.1-nightly+abc1234567.1737036656.release"), "1.7.1"); + // Dev: `1.7.1-dev+..` + assert_eq!(strip_semver_metadata("1.7.1-dev+abc1234567.1737036656.debug"), "1.7.1"); + } + + #[test] + fn strips_plain_version() { + assert_eq!(strip_semver_metadata("1.7.1"), "1.7.1"); + } + + #[test] + fn version_cmp_orders_correctly() { + assert_eq!(version_cmp("1.7.1", "1.7.1").unwrap(), Ordering::Equal); + assert_eq!(version_cmp("1.7.1", "1.7.0").unwrap(), Ordering::Greater); + assert_eq!(version_cmp("1.7.1", "1.7.2").unwrap(), Ordering::Less); + assert_eq!(version_cmp("1.7.1", "0.0.1").unwrap(), Ordering::Greater); + assert_eq!(version_cmp("1.7.1", "99.0.0").unwrap(), Ordering::Less); + } + + #[test] + fn parse_version_rejects_pre_release_and_build_metadata() { + // User-supplied versions must be plain `MAJOR.MINOR.PATCH`. + assert!(parse_version("1.7.1-nightly").is_err()); + assert!(parse_version("1.7.1+abc").is_err()); + assert!(parse_version("not-a-version").is_err()); + assert!(parse_version("1.7.1").is_ok()); + } + + #[test] + fn cmp_works_against_full_semver_version_strings() { + // Simulate comparing each shape of `SEMVER_VERSION` against a user-supplied version. + for current in [ + "1.7.1+abc1234567.1737036656.release", + "1.7.1-nightly+abc1234567.1737036656.release", + "1.7.1-dev+abc1234567.1737036656.debug", + "1.7.1", + ] { + let stripped = strip_semver_metadata(current); + assert_eq!(version_cmp(stripped, "1.7.1").unwrap(), Ordering::Equal); + assert_eq!(version_cmp(stripped, "1.7.0").unwrap(), Ordering::Greater); + assert_eq!(version_cmp(stripped, "1.7.2").unwrap(), Ordering::Less); + } + } +} diff --git a/crates/chisel/Cargo.toml b/crates/chisel/Cargo.toml index e9a1936013272..618d869f0f99e 100644 --- a/crates/chisel/Cargo.toml +++ b/crates/chisel/Cargo.toml @@ -70,3 +70,4 @@ asm-keccak = ["alloy-primitives/asm-keccak"] jemalloc = ["foundry-cli/jemalloc"] mimalloc = ["foundry-cli/mimalloc"] tracy-allocator = ["foundry-cli/tracy-allocator"] +credible = ["foundry-evm/credible"] diff --git a/crates/chisel/src/executor.rs b/crates/chisel/src/executor.rs index da2c7f4caff02..8d8122e05868e 100644 --- a/crates/chisel/src/executor.rs +++ b/crates/chisel/src/executor.rs @@ -384,8 +384,8 @@ fn format_event_definition(event_definition: &pt::EventDefinition) -> Result Result>() diff --git a/crates/cli/src/opts/evm.rs b/crates/cli/src/opts/evm.rs index 87f14e2039606..4fc437c7232f8 100644 --- a/crates/cli/src/opts/evm.rs +++ b/crates/cli/src/opts/evm.rs @@ -307,6 +307,17 @@ mod tests { assert_eq!(val, &Value::from(1000u64)); } + #[test] + fn rpc_url_arg_does_not_read_eth_rpc_url_env() { + use clap::CommandFactory; + + let command = EvmArgs::command(); + let rpc_url = + command.get_arguments().find(|arg| arg.get_id() == "rpc_url").expect("rpc_url arg"); + + assert!(rpc_url.get_env().is_none()); + } + #[test] fn can_parse_chain_id() { let args = EvmArgs { diff --git a/crates/cli/src/opts/global.rs b/crates/cli/src/opts/global.rs index fee75a5d34e87..aa70b88267a4e 100644 --- a/crates/cli/src/opts/global.rs +++ b/crates/cli/src/opts/global.rs @@ -1,8 +1,5 @@ use clap::{ArgAction, Parser}; -use foundry_common::{ - shell::{ColorChoice, OutputFormat, OutputMode, Shell, Verbosity}, - version::{IS_NIGHTLY_VERSION, NIGHTLY_VERSION_WARNING_MESSAGE}, -}; +use foundry_common::shell::{ColorChoice, OutputFormat, OutputMode, Shell, Verbosity}; use serde::{Deserialize, Serialize}; /// Global arguments for the CLI. @@ -79,14 +76,6 @@ impl GlobalArgs { self.force_init_thread_pool()?; } - // Display a warning message if the current version is not stable. - if IS_NIGHTLY_VERSION - && !self.json - && std::env::var_os("FOUNDRY_DISABLE_NIGHTLY_WARNING").is_none() - { - let _ = sh_warn!("{}", NIGHTLY_VERSION_WARNING_MESSAGE); - } - Ok(()) } diff --git a/crates/cli/src/opts/rpc.rs b/crates/cli/src/opts/rpc.rs index 8c37860446683..3438b57ed054a 100644 --- a/crates/cli/src/opts/rpc.rs +++ b/crates/cli/src/opts/rpc.rs @@ -66,8 +66,20 @@ impl figment::Provider for RpcOpts { impl RpcOpts { /// Returns the RPC endpoint. pub fn url<'a>(&'a self, config: Option<&'a Config>) -> Result>> { + self.url_with_env(config, std::env::var("ETH_RPC_URL").ok()) + } + + fn url_with_env<'a>( + &'a self, + config: Option<&'a Config>, + env_url: Option, + ) -> Result>> { if self.flashbots { Ok(Some(Cow::Borrowed(FLASHBOTS_URL))) + } else if let Some(url) = self.common.rpc_url.as_deref() { + Ok(Some(Cow::Borrowed(url))) + } else if let Some(url) = env_url { + Ok(Some(Cow::Owned(url))) } else { self.common.url(config) } @@ -85,6 +97,9 @@ impl RpcOpts { pub fn dict(&self) -> Dict { let mut dict = self.common.dict(); + if let Ok(Some(url)) = self.url(None) { + dict.insert("eth_rpc_url".into(), url.into_owned().into()); + } if self.flashbots { dict.insert("eth_rpc_url".into(), FLASHBOTS_URL.into()); } @@ -199,6 +214,7 @@ impl figment::Provider for EthereumOpts { #[cfg(test)] mod tests { use super::*; + use clap::CommandFactory; #[test] fn parse_etherscan_opts() { @@ -223,4 +239,41 @@ mod tests { let id: u64 = chain_id.deserialize().expect("chain_id should deserialize as u64"); assert_eq!(id, 9745); } + + #[test] + fn rpc_url_arg_does_not_read_eth_rpc_url_env() { + let command = RpcOpts::command(); + let rpc_url = + command.get_arguments().find(|arg| arg.get_id() == "rpc_url").expect("rpc_url arg"); + + assert!(rpc_url.get_env().is_none()); + } + + #[test] + fn rpc_url_resolves_eth_rpc_url_env() { + let args = RpcOpts::default(); + let url = args + .url_with_env(None, Some("http://127.0.0.1:8545".to_string())) + .expect("url") + .expect("url"); + + assert_eq!(url.as_ref(), "http://127.0.0.1:8545"); + } + + #[test] + fn explicit_rpc_url_takes_precedence_over_eth_rpc_url_env() { + let args = RpcOpts { + common: RpcCommonOpts { + rpc_url: Some("http://127.0.0.1:8546".to_string()), + ..Default::default() + }, + ..Default::default() + }; + let url = args + .url_with_env(None, Some("http://127.0.0.1:8545".to_string())) + .expect("url") + .expect("url"); + + assert_eq!(url.as_ref(), "http://127.0.0.1:8546"); + } } diff --git a/crates/cli/src/opts/rpc_common.rs b/crates/cli/src/opts/rpc_common.rs index 05b98582fa88f..9c6285857f8cf 100644 --- a/crates/cli/src/opts/rpc_common.rs +++ b/crates/cli/src/opts/rpc_common.rs @@ -13,14 +13,10 @@ use serde::Serialize; use std::borrow::Cow; /// Common RPC-related options shared across CLI commands. -/// -/// This struct holds fields that both [`super::RpcOpts`] (cast) and -/// [`super::EvmArgs`] (forge/script) need, eliminating duplication and -/// making the two structs composable. #[derive(Clone, Debug, Default, Serialize, Parser)] pub struct RpcCommonOpts { /// The RPC endpoint. - #[arg(short, long, visible_alias = "fork-url", env = "ETH_RPC_URL")] + #[arg(short, long, visible_alias = "fork-url", value_name = "URL")] #[serde(rename = "eth_rpc_url", skip_serializing_if = "Option::is_none")] pub rpc_url: Option, @@ -80,12 +76,7 @@ impl figment::Provider for RpcCommonOpts { impl RpcCommonOpts { /// Returns the RPC endpoint URL, resolving from CLI args or config. pub fn url<'a>(&'a self, config: Option<&'a Config>) -> Result>> { - let url = match (self.rpc_url.as_deref(), config) { - (Some(url), _) => Some(Cow::Borrowed(url)), - (None, Some(config)) => config.get_rpc_url().transpose()?, - (None, None) => None, - }; - Ok(url) + resolve_rpc_url(self.rpc_url.as_deref(), config) } /// Builds a figment-compatible dictionary from these options. @@ -112,3 +103,16 @@ impl RpcCommonOpts { dict } } + +/// Resolves an RPC URL from an explicit CLI value or config. +pub fn resolve_rpc_url<'a>( + rpc_url: Option<&'a str>, + config: Option<&'a Config>, +) -> Result>> { + let url = match (rpc_url, config) { + (Some(url), _) => Some(Cow::Borrowed(url)), + (None, Some(config)) => config.get_rpc_url().transpose()?, + (None, None) => None, + }; + Ok(url) +} diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 51115fb4a0bae..2d7f721d3789b 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -34,7 +34,7 @@ alloy-signer.workspace = true alloy-pubsub.workspace = true alloy-rpc-client.workspace = true alloy-rpc-types = { workspace = true, features = ["eth", "engine"] } -alloy-rpc-types-engine = { workspace = true, features = ["jwt"] } +alloy-rpc-types-engine = { workspace = true, features = ["jwt-aws-lc-rs"] } alloy-sol-types.workspace = true alloy-transport-ipc.workspace = true alloy-transport-ws.workspace = true diff --git a/crates/common/build.rs b/crates/common/build.rs index d89e23be850f4..9afa01b5757ef 100644 --- a/crates/common/build.rs +++ b/crates/common/build.rs @@ -15,16 +15,13 @@ fn main() -> Result<(), Box> { let sha_short = &sha[..10]; let tag_name = try_env_var("TAG_NAME").unwrap_or_else(|| String::from("dev")); - let is_nightly = tag_name.contains("nightly"); - let version_suffix = if is_nightly { "nightly" } else { &tag_name }; + let version = release_version(&env_var("CARGO_PKG_VERSION"), &tag_name); + let is_nightly = tag_name.starts_with("nightly"); if is_nightly { println!("cargo:rustc-env=FOUNDRY_IS_NIGHTLY_VERSION=true"); } - let pkg_version = env_var("CARGO_PKG_VERSION"); - let version = format!("{pkg_version}-{version_suffix}"); - // `PROFILE` captures only release or debug. Get the actual name from the out directory. let out_dir = PathBuf::from(env_var("OUT_DIR")); let profile = out_dir.components().rev().nth(3).unwrap().as_os_str().to_str().unwrap(); @@ -87,6 +84,19 @@ fn env_var(name: &str) -> String { try_env_var(name).unwrap() } +fn release_version(pkg_version: &str, tag_name: &str) -> String { + if let Some(version) = tag_name.strip_prefix('v') { + return version.to_owned(); + } + + // Normalize `nightly-` to `nightly` so tarball and Docker nightly + // artifacts produce the same version string. The commit identifier is + // already included in the SemVer build metadata (after `+`). + let normalized = if tag_name.starts_with("nightly-") { "nightly" } else { tag_name }; + + format!("{pkg_version}-{normalized}") +} + fn try_env_var(name: &str) -> Option { println!("cargo:rerun-if-env-changed={name}"); std::env::var(name).ok() diff --git a/crates/common/src/contracts.rs b/crates/common/src/contracts.rs index 895b16b3b4532..12d2aea5b1287 100644 --- a/crates/common/src/contracts.rs +++ b/crates/common/src/contracts.rs @@ -411,7 +411,7 @@ impl ContractsByArtifact { let mut funcs = BTreeMap::new(); let mut events = BTreeMap::new(); let mut errors_abi = JsonAbi::new(); - for (_name, contract) in self.iter() { + for contract in self.values() { for func in contract.abi.functions() { funcs.insert(func.selector(), func.clone()); } diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index 4934503ea66c4..46062ee95dace 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -847,12 +847,15 @@ impl Config { // Check if the selected profile exists. if config.profiles.contains(&selected_profile) { config.profile = selected_profile; - } else if strict_profile { - return Err(ExtractConfigError::new(Error::from(format!( - "selected profile `{selected_profile}` does not exist" - )))); } else { - // Fall back to default profile for nested lib configs. + // Fall back to the default profile. In strict mode (top-level loads), emit a warning + // so users are informed when an unknown profile (e.g. via `FOUNDRY_PROFILE`) is + // selected; the silent fallback is reserved for nested lib configs. + if strict_profile { + config + .warnings + .push(Warning::UnknownProfile { profile: selected_profile.to_string() }); + } config.profile = Self::DEFAULT_PROFILE; } @@ -1922,14 +1925,24 @@ impl Config { fn _with_root(root: &Path) -> Self { // autodetect paths let paths = ProjectPathsConfig::builder().build_with_root::<()>(root); - let artifacts: PathBuf = paths.artifacts.file_name().unwrap().into(); + let default = Self::default(); + let src = if root.join("src").exists() || root.join("contracts").exists() { + ProjectPathsConfig::find_source_dir(root).file_name().unwrap().into() + } else { + default.src.clone() + }; + let out = if root.join("out").exists() || root.join("artifacts").exists() { + ProjectPathsConfig::find_artifacts_dir(root).file_name().unwrap().into() + } else { + default.out.clone() + }; Self { root: paths.root, - src: paths.sources.file_name().unwrap().into(), - out: artifacts.clone(), + src, + out: out.clone(), libs: paths.libraries.into_iter().map(|lib| lib.file_name().unwrap().into()).collect(), - fs_permissions: FsPermissions::new([PathPermission::read(artifacts)]), - ..Self::default() + fs_permissions: FsPermissions::new([PathPermission::read(out)]), + ..default } } @@ -2626,20 +2639,20 @@ impl Default for Config { Self { profile: Self::DEFAULT_PROFILE, profiles: vec![Self::DEFAULT_PROFILE], - fs_permissions: FsPermissions::new([PathPermission::read("out")]), + fs_permissions: FsPermissions::new([PathPermission::read("assertions/out")]), isolate: cfg!(feature = "isolate-by-default"), root: root_default(), extends: None, - src: "src".into(), - test: "test".into(), - script: "script".into(), - out: "out".into(), + src: "assertions/src".into(), + test: "assertions/test".into(), + script: "assertions/script".into(), + out: "assertions/out".into(), libs: vec!["lib".into()], cache: true, dynamic_test_linking: false, - cache_path: "cache".into(), - broadcast: "broadcast".into(), - snapshots: "snapshots".into(), + cache_path: "assertions/cache".into(), + broadcast: "assertions/broadcast".into(), + snapshots: "assertions/snapshots".into(), gas_snapshot_check: false, gas_snapshot_emit: true, allow_paths: vec![], @@ -2669,11 +2682,11 @@ impl Default for Config { path_pattern: None, path_pattern_inverse: None, coverage_pattern_inverse: None, - test_failures_file: "cache/test-failures".into(), + test_failures_file: "assertions/cache/test-failures".into(), threads: None, show_progress: false, - fuzz: FuzzConfig::new("cache/fuzz".into()), - invariant: InvariantConfig::new("cache/invariant".into()), + fuzz: FuzzConfig::new("assertions/cache/fuzz".into()), + invariant: InvariantConfig::new("assertions/cache/invariant".into()), always_use_create_2_factory: false, ffi: false, live_logs: false, @@ -2861,19 +2874,35 @@ impl BasicConfig { /// /// This serializes to a table with the name of the profile pub fn to_string_pretty(&self) -> Result { - let mut value = toml::Value::try_from(self)?; + let mut profile_body = toml::Value::try_from(self)?; if let Some(ref network) = self.network - && let toml::Value::Table(ref mut table) = value + && let toml::Value::Table(ref mut table) = profile_body { - table.insert(network.clone(), toml::Value::Boolean(true)); + table.insert("network".to_string(), toml::Value::String(network.clone())); + } + + let mut profile_section = toml::value::Table::new(); + profile_section.insert(self.profile.to_string(), profile_body); + + let mut document = toml::value::Table::new(); + document.insert("profile".to_string(), toml::Value::Table(profile_section)); + + if self.network.as_deref() == Some("tempo") { + let mut endpoints = toml::value::Table::new(); + endpoints.insert( + "tempo".to_string(), + toml::Value::String("https://rpc.tempo.xyz/".to_string()), + ); + endpoints.insert( + "moderato".to_string(), + toml::Value::String("https://rpc.moderato.tempo.xyz/".to_string()), + ); + document.insert("rpc_endpoints".to_string(), toml::Value::Table(endpoints)); } - let s = toml::to_string_pretty(&value)?; + + let body = toml::to_string_pretty(&toml::Value::Table(document))?; Ok(format!( - "\ -[profile.{}] -{s} -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options\n", - self.profile + "{body}\n# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options\n" )) } } @@ -3083,7 +3112,7 @@ mod tests { figment::Jail::expect_with(|_| { let config = Config::default(); let paths_config = config.project_paths::(); - assert_eq!(paths_config.tests, PathBuf::from(r"test")); + assert_eq!(paths_config.tests, PathBuf::from(r"assertions/test")); Ok(()) }); } @@ -4963,7 +4992,7 @@ mod tests { InvariantConfig { runs: 512, depth: 10, - failure_persist_dir: Some(PathBuf::from("cache/invariant")), + failure_persist_dir: Some(PathBuf::from("assertions/cache/invariant")), ..Default::default() } ); @@ -6678,6 +6707,55 @@ mod tests { }); } + #[test] + fn no_unknown_key_warning_for_network_field() { + // Regression test: `network` is a flattened `Option` field of `NetworkConfigs`. It must + // not trigger an unknown-key warning, regardless of whether it is set. + figment::Jail::expect_with(|jail| { + jail.create_file( + "foundry.toml", + r#" + [profile.default] + network = "tempo" + "#, + )?; + + let cfg = Config::load().unwrap(); + assert!( + !cfg.warnings.iter().any( + |w| matches!(w, crate::Warning::UnknownKey { key, .. } if key == "network") + ), + "did not expect UnknownKey warning for `network`, got: {:?}", + cfg.warnings + ); + Ok(()) + }); + } + + #[test] + fn no_unknown_key_warning_for_legacy_tempo_alias() { + // Regression test: the legacy `tempo = true` alias must keep working without warnings. + figment::Jail::expect_with(|jail| { + jail.create_file( + "foundry.toml", + r#" + [profile.default] + tempo = true + "#, + )?; + + let cfg = Config::load().unwrap(); + assert!( + !cfg.warnings + .iter() + .any(|w| matches!(w, crate::Warning::UnknownKey { key, .. } if key == "tempo")), + "did not expect UnknownKey warning for `tempo`, got: {:?}", + cfg.warnings + ); + Ok(()) + }); + } + #[test] fn fails_on_ambiguous_version_in_compilation_restrictions() { figment::Jail::expect_with(|jail| { @@ -7024,9 +7102,9 @@ mod tests { }); } - // Test for issue #12844: FOUNDRY_PROFILE=nonexistent should fail + // Test for issue #12844: FOUNDRY_PROFILE=nonexistent should warn and fall back to default. #[test] - fn fails_on_unknown_profile() { + fn warns_on_unknown_profile() { figment::Jail::expect_with(|jail| { jail.create_file( "foundry.toml", @@ -7037,11 +7115,15 @@ mod tests { )?; jail.set_env("FOUNDRY_PROFILE", "nonexistent"); - let err = Config::load().expect_err("expected unknown profile to fail"); - let err_msg = err.to_string(); + let cfg = Config::load().expect("expected unknown profile to fall back to default"); + assert_eq!(cfg.profile, Config::DEFAULT_PROFILE); assert!( - err_msg.contains("selected profile `nonexistent` does not exist"), - "Expected error about nonexistent profile, got: {err_msg}" + cfg.warnings.iter().any(|w| matches!( + w, + crate::Warning::UnknownProfile { profile } if profile == "nonexistent" + )), + "Expected UnknownProfile warning, got: {:?}", + cfg.warnings ); Ok(()) diff --git a/crates/config/src/providers/ext.rs b/crates/config/src/providers/ext.rs index 6423e37a4f2fa..bd382fd435d30 100644 --- a/crates/config/src/providers/ext.rs +++ b/crates/config/src/providers/ext.rs @@ -365,24 +365,28 @@ impl Provider for DappHardhatDirProvider<'_> { fn data(&self) -> Result, Error> { let mut dict = Dict::new(); - dict.insert( - "src".to_string(), - ProjectPathsConfig::find_source_dir(self.0) - .file_name() - .unwrap() - .to_string_lossy() - .to_string() - .into(), - ); - dict.insert( - "out".to_string(), - ProjectPathsConfig::find_artifacts_dir(self.0) - .file_name() - .unwrap() - .to_string_lossy() - .to_string() - .into(), - ); + if self.0.join("src").exists() || self.0.join("contracts").exists() { + dict.insert( + "src".to_string(), + ProjectPathsConfig::find_source_dir(self.0) + .file_name() + .unwrap() + .to_string_lossy() + .to_string() + .into(), + ); + } + if self.0.join("out").exists() || self.0.join("artifacts").exists() { + dict.insert( + "out".to_string(), + ProjectPathsConfig::find_artifacts_dir(self.0) + .file_name() + .unwrap() + .to_string_lossy() + .to_string() + .into(), + ); + } // detect libs folders: // if `lib` _and_ `node_modules` exists: include both diff --git a/crates/config/src/providers/warnings.rs b/crates/config/src/providers/warnings.rs index 930066b29cf73..ff1d0b35def47 100644 --- a/crates/config/src/providers/warnings.rs +++ b/crates/config/src/providers/warnings.rs @@ -38,7 +38,10 @@ const DOC_KEYS: &[&str] = &["out", "title", "book", "homepage", "repository", "p const RESERVED_KEYS: &[&str] = &["extends"]; /// Keys kept for backward compatibility that should not trigger unknown key warnings. -const BACKWARD_COMPATIBLE_KEYS: &[&str] = &["solc_version"]; +/// +/// `tempo` and `optimism` are legacy aliases for `network = "tempo"` / `network = "optimism"` — +/// still accepted on input but no longer serialized in the default config. +const BACKWARD_COMPATIBLE_KEYS: &[&str] = &["solc_version", "tempo", "optimism"]; /// Generate warnings for unknown sections and deprecated keys pub struct WarningsProvider

{ diff --git a/crates/config/src/warning.rs b/crates/config/src/warning.rs index 1c1518f5d7cc7..32a1183208892 100644 --- a/crates/config/src/warning.rs +++ b/crates/config/src/warning.rs @@ -64,6 +64,12 @@ pub enum Warning { /// The config file where the key was found source: String, }, + /// The selected profile (via `FOUNDRY_PROFILE` or otherwise) does not exist in the config. + /// Falls back to the default profile. + UnknownProfile { + /// The selected profile that does not exist + profile: String, + }, } impl fmt::Display for Warning { @@ -117,6 +123,12 @@ impl fmt::Display for Warning { "Found unknown `{key}` config key in section `{section}` defined in {source}." ) } + Self::UnknownProfile { profile } => { + write!( + f, + "Selected profile `{profile}` does not exist; falling back to the default profile." + ) + } } } } diff --git a/crates/doc/src/writer/as_doc.rs b/crates/doc/src/writer/as_doc.rs index 1502322ac87f4..c4cc5bd07a234 100644 --- a/crates/doc/src/writer/as_doc.rs +++ b/crates/doc/src/writer/as_doc.rs @@ -75,8 +75,8 @@ impl AsDoc for CommentsRef<'_> { writer.writeln_raw(format!( "{}{}: {}", if customs.len() == 1 { "" } else { "- " }, - &c.tag, - &c.value + c.tag, + c.value ))?; writer.writeln()?; } diff --git a/crates/evm/core/src/backend/mod.rs b/crates/evm/core/src/backend/mod.rs index 5c5fe29c3154c..b1708ebb85abd 100644 --- a/crates/evm/core/src/backend/mod.rs +++ b/crates/evm/core/src/backend/mod.rs @@ -82,7 +82,7 @@ pub type JournaledState = JournalInner; /// An extension trait that allows us to easily extend the `revm::Inspector` capabilities #[auto_impl::auto_impl(&mut)] pub trait DatabaseExt: - Database + DatabaseCommit + Debug + Database + DatabaseCommit + Debug + Send { /// Creates a new state snapshot at the current point of execution. /// diff --git a/crates/evm/core/src/decode.rs b/crates/evm/core/src/decode.rs index 0cfd56a44219c..b836023a968b7 100644 --- a/crates/evm/core/src/decode.rs +++ b/crates/evm/core/src/decode.rs @@ -223,8 +223,8 @@ fn trimmed_hex(s: &[u8]) -> String { } else { format!( "{}…{} ({} bytes)", - &hex::encode(&s[..n / 2]), - &hex::encode(&s[s.len() - n / 2..]), + hex::encode(&s[..n / 2]), + hex::encode(&s[s.len() - n / 2..]), s.len(), ) } diff --git a/crates/evm/core/src/fork/database.rs b/crates/evm/core/src/fork/database.rs index aefa0e2ee9741..2284823047ca6 100644 --- a/crates/evm/core/src/fork/database.rs +++ b/crates/evm/core/src/fork/database.rs @@ -212,13 +212,18 @@ pub struct ForkDbStateSnapshot { } impl ForkDbStateSnapshot { - fn get_storage(&self, address: Address, index: U256) -> Option { - self.local - .cache - .accounts - .get(&address) - .and_then(|account| account.storage.get(&index)) - .copied() + /// Lookup storage in `state_snapshot`, then fall back to the backend (remote RPC). + fn storage_from_snapshot_or_backend( + &self, + address: Address, + index: U256, + ) -> Result { + // Check state_snapshot.storage first (data fetched by SharedBackend / disk cache). + if let Some(val) = self.state_snapshot.storage.get(&address).and_then(|s| s.get(&index)) { + return Ok(*val); + } + // Fall back to the underlying backend (SharedBackend → remote RPC). + DatabaseRef::storage_ref(&self.local, address, index) } } @@ -250,15 +255,9 @@ impl DatabaseRef for ForkDbStateSnapshot { match self.local.cache.accounts.get(&address) { Some(account) => match account.storage.get(&index) { Some(entry) => Ok(*entry), - None => match self.get_storage(address, index) { - None => DatabaseRef::storage_ref(&self.local, address, index), - Some(storage) => Ok(storage), - }, - }, - None => match self.get_storage(address, index) { - None => DatabaseRef::storage_ref(&self.local, address, index), - Some(storage) => Ok(storage), + None => self.storage_from_snapshot_or_backend(address, index), }, + None => self.storage_from_snapshot_or_backend(address, index), } } @@ -303,4 +302,28 @@ mod tests { assert!(loaded.is_some()); assert_eq!(loaded.unwrap(), info); } + + /// Verifies that `ForkDbStateSnapshot::storage_ref` reads from `state_snapshot.storage` + /// when the slot is missing from `local.cache.accounts`. Without this lookup the call + /// would fall through to the backend and return the unrelated remote value. + #[tokio::test(flavor = "multi_thread")] + async fn fork_db_state_snapshot_reads_storage_from_snapshot() { + let rpc = foundry_test_utils::rpc::next_http_rpc_endpoint(); + let provider = get_http_provider(rpc.clone()); + let meta = BlockchainDbMeta::new(BlockEnv::default(), rpc); + let db = BlockchainDb::new(meta, None); + let backend = SharedBackend::spawn_backend(Arc::new(provider), db, None).await; + + let address = Address::random(); + let slot = U256::from(42u64); + let expected = U256::from(0xdeadbeefu64); + + let mut state_snapshot = StateSnapshot::default(); + state_snapshot.storage.entry(address).or_default().insert(slot, expected); + + let snapshot = ForkDbStateSnapshot { local: CacheDB::new(backend), state_snapshot }; + + let got = DatabaseRef::storage_ref(&snapshot, address, slot).unwrap(); + assert_eq!(got, expected); + } } diff --git a/crates/evm/evm/Cargo.toml b/crates/evm/evm/Cargo.toml index 70bce50a89882..050c430c9a0e7 100644 --- a/crates/evm/evm/Cargo.toml +++ b/crates/evm/evm/Cargo.toml @@ -13,6 +13,10 @@ repository.workspace = true [lints] workspace = true +[features] +default = [] +credible = ["foundry-cheatcodes/credible"] + [dependencies] foundry-cheatcodes.workspace = true foundry-common.workspace = true diff --git a/crates/evm/evm/src/executors/invariant/mod.rs b/crates/evm/evm/src/executors/invariant/mod.rs index 27d8e6a0ed588..e02cdbc393ee6 100644 --- a/crates/evm/evm/src/executors/invariant/mod.rs +++ b/crates/evm/evm/src/executors/invariant/mod.rs @@ -736,7 +736,7 @@ impl<'a, FEN: FoundryEvmNetwork> InvariantExecutor<'a, FEN> { if !msg.is_empty() { msg.push_str(", "); } - msg.push_str(&format!("{}", &corpus_manager.metrics)); + msg.push_str(&format!("{}", corpus_manager.metrics)); } progress.set_message(msg); } diff --git a/crates/evm/evm/src/inspectors/stack.rs b/crates/evm/evm/src/inspectors/stack.rs index addaddc180efd..2a3bce3dac89e 100644 --- a/crates/evm/evm/src/inspectors/stack.rs +++ b/crates/evm/evm/src/inspectors/stack.rs @@ -1291,6 +1291,15 @@ impl Inspector> && !self.in_inner_context && ecx.journal().depth() == 1 { + // In isolation mode, transact_inner returns None for the address on revert; pre-compute + // the would-be deployed address so create_end can enforce expected_revert reverter + // checks. + let precomputed_address = ecx + .journal() + .evm_state() + .get(&create.caller()) + .map(|acc| create.caller().create(acc.info.nonce)); + let (result, address) = self.transact_inner( ecx, TxKind::Create, @@ -1299,6 +1308,8 @@ impl Inspector> create.gas_limit(), create.value(), ); + let address = + address.or_else(|| if result.is_revert() { precomputed_address } else { None }); return Some(CreateOutcome { result, address }); } diff --git a/crates/evm/fuzz/src/lib.rs b/crates/evm/fuzz/src/lib.rs index 44d71fb6deee3..e64d7abc5add3 100644 --- a/crates/evm/fuzz/src/lib.rs +++ b/crates/evm/fuzz/src/lib.rs @@ -229,7 +229,7 @@ impl fmt::Display for BaseCounterExample { if let Some(sig) = &self.signature { write!(f, "calldata={sig}")? } else { - write!(f, "calldata={}", &self.calldata)? + write!(f, "calldata={}", self.calldata)? } if let Some(args) = &self.args { diff --git a/crates/evm/networks/src/lib.rs b/crates/evm/networks/src/lib.rs index 4672deff353d0..303b9ca8b7a13 100644 --- a/crates/evm/networks/src/lib.rs +++ b/crates/evm/networks/src/lib.rs @@ -59,22 +59,25 @@ impl From for NetworkVariant { } } -#[derive(Clone, Debug, Default, Parser, Serialize, Deserialize, Copy, PartialEq, Eq)] +#[derive(Clone, Debug, Default, Parser, Deserialize, Copy, PartialEq, Eq)] pub struct NetworkConfigs { /// Enable a specific network family. #[arg(help_heading = "Networks", long, short, num_args = 1, value_name = "NETWORK", value_enum, conflicts_with_all = ["celo", "optimism", "tempo"])] - #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] network: Option, /// Enable Celo network features. #[arg(help_heading = "Networks", long, conflicts_with_all = ["network", "optimism", "tempo"])] celo: bool, /// Enable Optimism network features (deprecated: use --network optimism). #[arg(long, hide = true, conflicts_with_all = ["network", "celo", "tempo"])] - // Skipped from configs (forge) as there is no feature to be added yet. - #[serde(skip)] + // Deserialize-only legacy alias: accepted in foundry.toml but never serialized — the + // canonical form is `network = "optimism"`. + #[serde(default)] optimism: bool, /// Enable Tempo network features (deprecated: use --network tempo). #[arg(long, hide = true, conflicts_with_all = ["network", "celo", "optimism"])] + // Deserialize-only legacy alias: accepted in foundry.toml but never serialized — the + // canonical form is `network = "tempo"`. #[serde(default)] tempo: bool, /// Whether to bypass prevrandao. @@ -83,6 +86,21 @@ pub struct NetworkConfigs { bypass_prevrandao: bool, } +// Custom `Serialize` impl: always emits the *resolved* network as the canonical +// `network = "..."` field, and never emits the legacy `tempo` / `optimism` aliases. This avoids +// confusing output like `network = "tempo"` next to `tempo = false`, and ensures `tempo = true` +// in foundry.toml round-trips as `network = "tempo"`. +impl Serialize for NetworkConfigs { + fn serialize(&self, serializer: S) -> Result { + use serde::ser::SerializeStruct; + let mut s = serializer.serialize_struct("NetworkConfigs", 3)?; + s.serialize_field("network", &self.resolved_network())?; + s.serialize_field("celo", &self.celo)?; + s.serialize_field("bypass_prevrandao", &self.bypass_prevrandao)?; + s.end() + } +} + impl NetworkConfigs { pub fn with_optimism() -> Self { Self { network: Some(NetworkVariant::Optimism), optimism: true, ..Default::default() } @@ -311,6 +329,17 @@ mod tests { assert!(cfg.is_tempo()); } + #[test] + fn serde_serializes_legacy_alias_as_canonical_network() { + // Legacy `tempo = true` should serialize as the canonical `network = "tempo"`, + // and the legacy `tempo` / `optimism` keys must not appear in the output. + let cfg = NetworkConfigs { tempo: true, ..Default::default() }; + let json = serde_json::to_value(cfg).unwrap(); + assert_eq!(json["network"], serde_json::json!("tempo")); + assert!(json.get("tempo").is_none(), "legacy `tempo` key should not be serialized"); + assert!(json.get("optimism").is_none(), "legacy `optimism` key should not be serialized"); + } + #[test] fn serde_new_network_field_deserialized() { let json_tempo = r#"{"network": "tempo", "celo": false, "bypass_prevrandao": false}"#; diff --git a/crates/evm/traces/Cargo.toml b/crates/evm/traces/Cargo.toml index 90d2db724cebc..0d31cfca6a7ae 100644 --- a/crates/evm/traces/Cargo.toml +++ b/crates/evm/traces/Cargo.toml @@ -32,9 +32,6 @@ alloy-primitives = { workspace = true, features = [ alloy-sol-types.workspace = true revm-inspectors.workspace = true -tempo-contracts.workspace = true -tempo-precompiles.workspace = true - async-trait.workspace = true eyre.workspace = true futures.workspace = true diff --git a/crates/evm/traces/src/decoder/mod.rs b/crates/evm/traces/src/decoder/mod.rs index a47c90c116d0b..04f9f684b9c90 100644 --- a/crates/evm/traces/src/decoder/mod.rs +++ b/crates/evm/traces/src/decoder/mod.rs @@ -18,22 +18,13 @@ use foundry_evm_core::{ constants::{CALLER, CHEATCODE_ADDRESS, DEFAULT_CREATE2_DEPLOYER, HARDHAT_CONSOLE_ADDRESS}, decode::RevertDecoder, precompiles::{ - BLAKE_2F, BLS12_G1ADD, BLS12_G1MSM, BLS12_G2ADD, BLS12_G2MSM, BLS12_MAP_FP_TO_G1, - BLS12_MAP_FP2_TO_G2, BLS12_PAIRING_CHECK, EC_ADD, EC_MUL, EC_PAIRING, EC_RECOVER, IDENTITY, - MOD_EXP, P256_VERIFY, POINT_EVALUATION, RIPEMD_160, SHA_256, + BLAKE_2F, EC_ADD, EC_MUL, EC_PAIRING, EC_RECOVER, IDENTITY, MOD_EXP, POINT_EVALUATION, + RIPEMD_160, SHA_256, }, }; use itertools::Itertools; use revm_inspectors::tracing::types::{DecodedCallLog, DecodedCallTrace}; use std::{collections::BTreeMap, sync::OnceLock}; -use tempo_contracts::precompiles::{ - IAccountKeychain, IFeeManager, IStablecoinDEX, ITIP20Factory, ITIP403Registry, IValidatorConfig, -}; -use tempo_precompiles::{ - ACCOUNT_KEYCHAIN_ADDRESS, NONCE_PRECOMPILE_ADDRESS, PATH_USD_ADDRESS, STABLECOIN_DEX_ADDRESS, - TIP_FEE_MANAGER_ADDRESS, TIP20_FACTORY_ADDRESS, TIP403_REGISTRY_ADDRESS, - VALIDATOR_CONFIG_ADDRESS, nonce::INonce, tip20::ITIP20, -}; mod precompiles; @@ -102,17 +93,17 @@ impl CallTraceDecoderBuilder { self } - /// Sets the chain ID for network-specific precompile detection. + /// Sets the debug identifier for the decoder. #[inline] - pub const fn with_chain_id(mut self, chain_id: Option) -> Self { - self.decoder.chain_id = chain_id; + pub fn with_debug_identifier(mut self, identifier: DebugTraceIdentifier) -> Self { + self.decoder.debug_identifier = Some(identifier); self } - /// Sets the debug identifier for the decoder. + /// Sets the chain ID for chain-specific precompile decoding. #[inline] - pub fn with_debug_identifier(mut self, identifier: DebugTraceIdentifier) -> Self { - self.decoder.debug_identifier = Some(identifier); + pub const fn with_chain_id(mut self, chain_id: Option) -> Self { + self.decoder.chain_id = chain_id; self } @@ -167,7 +158,7 @@ pub struct CallTraceDecoder { /// Disable showing of labels. pub disable_labels: bool, - /// The chain ID, used to determine network-specific precompiles. + /// Chain ID used for chain-specific precompile decoding. pub chain_id: Option, } @@ -202,23 +193,6 @@ impl CallTraceDecoder { (EC_PAIRING, "ECPairing".to_string()), (BLAKE_2F, "Blake2F".to_string()), (POINT_EVALUATION, "PointEvaluation".to_string()), - (BLS12_G1ADD, "BLS12_G1ADD".to_string()), - (BLS12_G1MSM, "BLS12_G1MSM".to_string()), - (BLS12_G2ADD, "BLS12_G2ADD".to_string()), - (BLS12_G2MSM, "BLS12_G2MSM".to_string()), - (BLS12_PAIRING_CHECK, "BLS12_PAIRING_CHECK".to_string()), - (BLS12_MAP_FP_TO_G1, "BLS12_MAP_FP_TO_G1".to_string()), - (BLS12_MAP_FP2_TO_G2, "BLS12_MAP_FP2_TO_G2".to_string()), - (P256_VERIFY, "P256VERIFY".to_string()), - // Tempo - (TIP_FEE_MANAGER_ADDRESS, "FeeManager".to_string()), - (TIP403_REGISTRY_ADDRESS, "TIP403Registry".to_string()), - (TIP20_FACTORY_ADDRESS, "TIP20Factory".to_string()), - (STABLECOIN_DEX_ADDRESS, "StablecoinDex".to_string()), - (NONCE_PRECOMPILE_ADDRESS, "Nonce".to_string()), - (VALIDATOR_CONFIG_ADDRESS, "ValidatorConfig".to_string()), - (ACCOUNT_KEYCHAIN_ADDRESS, "AccountKeychain".to_string()), - (PATH_USD_ADDRESS, "PathUSD".to_string()), ]), receive_contracts: Default::default(), fallback_contracts: Default::default(), @@ -227,29 +201,11 @@ impl CallTraceDecoder { functions: console::hh::abi::functions() .into_values() .chain(Vm::abi::functions().into_values()) - // Tempo - .chain(IFeeManager::abi::functions().into_values()) - .chain(ITIP20::abi::functions().into_values()) - .chain(ITIP403Registry::abi::functions().into_values()) - .chain(ITIP20Factory::abi::functions().into_values()) - .chain(IStablecoinDEX::abi::functions().into_values()) - .chain(INonce::abi::functions().into_values()) - .chain(IValidatorConfig::abi::functions().into_values()) - .chain(IAccountKeychain::abi::functions().into_values()) .flatten() .map(|func| (func.selector(), vec![func])) .collect(), events: console::ds::abi::events() .into_values() - // Tempo - .chain(IFeeManager::abi::events().into_values()) - .chain(ITIP20::abi::events().into_values()) - .chain(ITIP403Registry::abi::events().into_values()) - .chain(ITIP20Factory::abi::events().into_values()) - .chain(IStablecoinDEX::abi::events().into_values()) - .chain(INonce::abi::events().into_values()) - .chain(IValidatorConfig::abi::events().into_values()) - .chain(IAccountKeychain::abi::events().into_values()) .flatten() .map(|event| ((event.selector(), indexed_inputs(&event)), vec![event])) .collect(), @@ -261,7 +217,6 @@ impl CallTraceDecoder { debug_identifier: None, disable_labels: false, - chain_id: None, } } @@ -277,7 +232,6 @@ impl CallTraceDecoder { self.receive_contracts.clear(); self.fallback_contracts.clear(); - self.non_fallback_contracts.clear(); } /// Identify unknown addresses in the specified call trace using the specified identifier. @@ -296,12 +250,6 @@ impl CallTraceDecoder { identifier: &'a mut impl TraceIdentifier, ) -> Vec> { let nodes = arena.nodes().iter().filter(|node| { - // Skip precompile addresses, they will never resolve externally. - if node.is_precompile() - || precompiles::is_known_precompile(node.trace.address, self.chain_id) - { - return false; - } let address = &node.trace.address; !self.labels.contains_key(address) || !self.contracts.contains_key(address) }); @@ -377,7 +325,7 @@ impl CallTraceDecoder { self.contracts.entry(address).or_insert(contract); } - if let Some(label) = label.filter(|s| !s.is_empty()) { + if let Some(label) = label { self.labels.entry(address).or_insert(label); } @@ -565,28 +513,7 @@ impl CallTraceDecoder { /// Custom decoding for cheatcode inputs. fn decode_cheatcode_inputs(&self, func: &Function, data: &[u8]) -> Option> { match func.name.as_str() { - "expectRevert" => { - let decoded = match data.get(SELECTOR_LEN..) { - Some(data) => func.abi_decode_input(data).ok(), - None => None, - }; - let Some(decoded) = decoded else { - return Some(vec![self.revert_decoder.decode(data, None)]); - }; - let Some(first) = decoded.first() else { - return Some(vec![self.revert_decoder.decode(data, None)]); - }; - let expected_revert = match first { - DynSolValue::Bytes(bytes) => bytes.as_slice(), - DynSolValue::FixedBytes(word, size) => &word[..*size], - _ => return None, - }; - Some( - std::iter::once(self.revert_decoder.decode(expected_revert, None)) - .chain(decoded.iter().skip(1).map(|value| self.format_value(value))) - .collect(), - ) - } + "expectRevert" => Some(vec![self.revert_decoder.decode(data, None)]), "addr" | "createWallet" | "deriveKey" | "rememberKey" => { // Redact private key in all cases Some(vec!["".to_string()]) @@ -594,12 +521,14 @@ impl CallTraceDecoder { "broadcast" | "startBroadcast" => { // Redact private key if defined // broadcast(uint256) / startBroadcast(uint256) - (!func.inputs.is_empty() && func.inputs[0].ty == "uint256").then(|| vec!["".to_string()]) + (!func.inputs.is_empty() && func.inputs[0].ty == "uint256") + .then(|| vec!["".to_string()]) } "getNonce" => { // Redact private key if defined // getNonce(Wallet) - (!func.inputs.is_empty() && func.inputs[0].ty == "tuple").then(|| vec!["".to_string()]) + (!func.inputs.is_empty() && func.inputs[0].ty == "tuple") + .then(|| vec!["".to_string()]) } "sign" | "signP256" => { let mut decoded = func.abi_decode_input(&data[SELECTOR_LEN..]).ok()?; @@ -622,6 +551,17 @@ impl CallTraceDecoder { decoded[1] = DynSolValue::String("".to_string()); Some(decoded.iter().map(format_token).collect()) } + "assertion" => { + if self.verbosity >= 5 { + None + } else { + let mut decoded = func.abi_decode_input(&data[SELECTOR_LEN..]).ok()?; + if decoded.len() >= 2 { + decoded[1] = DynSolValue::String("".to_string()); + } + Some(decoded.iter().map(format_token).collect()) + } + } "parseJson" | "parseJsonUint" | "parseJsonUintArray" | @@ -985,113 +925,8 @@ mod tests { fn test_should_redact() { let decoder = CallTraceDecoder::new(); - let expected_revert_bytes4 = vec![0xde, 0xad, 0xbe, 0xef]; - let expect_revert_bytes4_data = Function::parse("expectRevert(bytes4)") - .unwrap() - .abi_encode_input(&[DynSolValue::FixedBytes( - B256::right_padding_from(expected_revert_bytes4.as_slice()), - 4, - )]) - .unwrap(); - - let expected_revert_bytes = hex!( - "08c379a000000000000000000000000000000000000000000000000000000000\ - 0000002000000000000000000000000000000000000000000000000000000000\ - 00000004626f6f6d000000000000000000000000000000000000000000000000" - ) - .to_vec(); - let expect_revert_bytes_data = Function::parse("expectRevert(bytes)") - .unwrap() - .abi_encode_input(&[DynSolValue::Bytes(expected_revert_bytes.clone())]) - .unwrap(); - - let reverter = Address::from([0x11; 20]); - let expect_revert_bytes4_address_data = Function::parse("expectRevert(bytes4,address)") - .unwrap() - .abi_encode_input(&[ - DynSolValue::FixedBytes( - B256::right_padding_from(expected_revert_bytes4.as_slice()), - 4, - ), - DynSolValue::Address(reverter), - ]) - .unwrap(); - - let count = 42_u64; - let expect_revert_bytes_count_data = Function::parse("expectRevert(bytes,uint64)") - .unwrap() - .abi_encode_input(&[ - DynSolValue::Bytes(expected_revert_bytes.clone()), - DynSolValue::Uint(alloy_primitives::U256::from(count), 64), - ]) - .unwrap(); - - let expect_revert_bytes_address_count_data = - Function::parse("expectRevert(bytes,address,uint64)") - .unwrap() - .abi_encode_input(&[ - DynSolValue::Bytes(expected_revert_bytes.clone()), - DynSolValue::Address(reverter), - DynSolValue::Uint(alloy_primitives::U256::from(count), 64), - ]) - .unwrap(); - - let expect_revert_runtime_data = expected_revert_bytes4.clone(); - // [function_signature, data, expected] let cheatcode_input_test_cases = vec![ - // Should decode the expected revert payload, not full cheatcode calldata: - ( - "expectRevert(bytes4)", - expect_revert_bytes4_data, - Some(vec![decoder.revert_decoder.decode(expected_revert_bytes4.as_slice(), None)]), - ), - ( - "expectRevert(bytes)", - expect_revert_bytes_data, - Some(vec![decoder.revert_decoder.decode(expected_revert_bytes.as_slice(), None)]), - ), - ( - "expectRevert(bytes4)", - expect_revert_runtime_data.clone(), - Some(vec![ - decoder.revert_decoder.decode(expect_revert_runtime_data.as_slice(), None), - ]), - ), - ( - "expectRevert(bytes4,address)", - expect_revert_bytes4_address_data, - Some(vec![ - decoder.revert_decoder.decode(expected_revert_bytes4.as_slice(), None), - decoder.format_value(&DynSolValue::Address(reverter)), - ]), - ), - ( - "expectRevert(bytes,uint64)", - expect_revert_bytes_count_data, - Some(vec![ - decoder.revert_decoder.decode(expected_revert_bytes.as_slice(), None), - decoder - .format_value(&DynSolValue::Uint(alloy_primitives::U256::from(count), 64)), - ]), - ), - ( - "expectRevert(bytes,address,uint64)", - expect_revert_bytes_address_count_data, - Some(vec![ - decoder.revert_decoder.decode(expected_revert_bytes.as_slice(), None), - decoder.format_value(&DynSolValue::Address(reverter)), - decoder - .format_value(&DynSolValue::Uint(alloy_primitives::U256::from(count), 64)), - ]), - ), - ( - "expectRevert()", - expect_revert_runtime_data.clone(), - Some(vec![ - decoder.revert_decoder.decode(expect_revert_runtime_data.as_slice(), None), - ]), - ), // Should redact private key from traces in all cases: ("addr(uint256)", vec![], Some(vec!["".to_string()])), ("createWallet(string)", vec![], Some(vec!["".to_string()])), @@ -1438,118 +1273,28 @@ mod tests { } } - // A mock identifier that records which addresses it was asked to identify. - struct RecordingIdentifier { - queried: Vec

, - } - impl TraceIdentifier for RecordingIdentifier { - fn identify_addresses(&mut self, nodes: &[&CallTraceNode]) -> Vec> { - self.queried.extend(nodes.iter().map(|n| n.trace.address)); - Vec::new() - } - } - #[test] - fn test_identify_addresses_skips_evm_precompiles() { - use foundry_evm_core::precompiles::SHA_256; - + fn test_assertion_bytecode_redacted() { let decoder = CallTraceDecoder::new(); + let function = Function::parse("assertion(address,bytes,bytes4)").unwrap(); + let address = Address::repeat_byte(0x11); - let mut arena = CallTraceArena::default(); - let regular_addr = Address::from([0x42; 20]); - arena.nodes_mut()[0].trace.address = regular_addr; - - // Standard EVM precompile flagged by the inspector. - arena.nodes_mut().push(CallTraceNode { - trace: CallTrace { - address: SHA_256, - depth: 1, - maybe_precompile: Some(true), - ..Default::default() - }, - idx: 1, - ..Default::default() - }); - - // Standard EVM precompile NOT flagged, caught by is_known_precompile. - arena.nodes_mut().push(CallTraceNode { - trace: CallTrace { - address: SHA_256, - depth: 1, - maybe_precompile: None, - ..Default::default() - }, - idx: 2, - ..Default::default() - }); - - let mut identifier = RecordingIdentifier { queried: Vec::new() }; - decoder.identify_addresses(&arena, &mut identifier); - - assert_eq!(identifier.queried, vec![regular_addr]); - } + let mut selector_word = [0u8; 32]; + selector_word[..4].copy_from_slice(&[0x12, 0x34, 0x56, 0x78]); + let selector = B256::from(selector_word); - #[test] - fn test_identify_addresses_skips_tempo_precompiles() { - use foundry_evm_core::tempo::TEMPO_PRECOMPILE_ADDRESSES; - - // Decoder with Tempo chain ID (4217). - let mut decoder = CallTraceDecoder::new().clone(); - decoder.chain_id = Some(4217); - - let mut arena = CallTraceArena::default(); - let regular_addr = Address::from([0x42; 20]); - arena.nodes_mut()[0].trace.address = regular_addr; - - // Tempo precompile — not flagged by inspector, caught by is_known_precompile - // only when chain_id is a Tempo chain. - let tempo_precompile = TEMPO_PRECOMPILE_ADDRESSES[0]; - arena.nodes_mut().push(CallTraceNode { - trace: CallTrace { - address: tempo_precompile, - depth: 1, - maybe_precompile: None, - ..Default::default() - }, - idx: 1, - ..Default::default() - }); - - let mut identifier = RecordingIdentifier { queried: Vec::new() }; - decoder.identify_addresses(&arena, &mut identifier); - - // On a Tempo chain, the Tempo precompile should be filtered out. - assert_eq!(identifier.queried, vec![regular_addr]); - } - - #[test] - fn test_identify_addresses_does_not_skip_tempo_precompiles_on_other_chains() { - use foundry_evm_core::tempo::TEMPO_PRECOMPILE_ADDRESSES; - - // Decoder with Ethereum mainnet chain ID (1). - let mut decoder = CallTraceDecoder::new().clone(); - decoder.chain_id = Some(1); - - let mut arena = CallTraceArena::default(); - let regular_addr = Address::from([0x42; 20]); - arena.nodes_mut()[0].trace.address = regular_addr; - - let tempo_precompile = TEMPO_PRECOMPILE_ADDRESSES[0]; - arena.nodes_mut().push(CallTraceNode { - trace: CallTrace { - address: tempo_precompile, - depth: 1, - maybe_precompile: None, - ..Default::default() - }, - idx: 1, - ..Default::default() - }); - - let mut identifier = RecordingIdentifier { queried: Vec::new() }; - decoder.identify_addresses(&arena, &mut identifier); + let data = function + .abi_encode_input(&[ + DynSolValue::Address(address), + DynSolValue::Bytes(vec![0xde, 0xad, 0xbe, 0xef]), + DynSolValue::FixedBytes(selector, 4), + ]) + .unwrap(); - // On Ethereum, Tempo precompile addresses are regular contracts — should NOT be filtered. - assert_eq!(identifier.queried, vec![regular_addr, tempo_precompile]); + let decoded = decoder.decode_cheatcode_inputs(&function, &data).expect("decoded inputs"); + assert_eq!(decoded.len(), 3); + assert_eq!(decoded[0], format_token(&DynSolValue::Address(address))); + assert_eq!(decoded[1], "\"\""); + assert_eq!(decoded[2], format_token(&DynSolValue::FixedBytes(selector, 4))); } } diff --git a/crates/evm/traces/src/lib.rs b/crates/evm/traces/src/lib.rs index f9bf9c5e8471a..a392836fb2206 100644 --- a/crates/evm/traces/src/lib.rs +++ b/crates/evm/traces/src/lib.rs @@ -187,6 +187,22 @@ pub fn render_trace_arena(arena: &SparsedTraceArena) -> String { render_trace_arena_inner(arena, false, false) } +/// Render a collection of call traces to a string with ANSI colors always enabled. +/// +/// Use this when rendering traces outside of a TTY context (e.g. server-side) where +/// `shell::color_choice()` would default to `Never`. +pub fn render_trace_arena_with_colors( + arena: &SparsedTraceArena, + with_storage_changes: bool, +) -> String { + let mut w = TraceWriter::new(Vec::::new()) + .color_cheatcodes(true) + .use_colors(revm_inspectors::ColorChoice::Always) + .with_storage_changes(with_storage_changes); + w.write_arena(&arena.resolve_arena()).expect("Failed to write traces"); + String::from_utf8(w.into_writer()).expect("trace writer wrote invalid UTF-8") +} + /// Prunes trace depth if depth is provided as an argument pub fn prune_trace_depth(arena: &mut CallTraceArena, depth: usize) { for node in arena.nodes_mut() { @@ -230,6 +246,8 @@ pub enum TraceKind { Deployment, Setup, Execution, + AssertionTrigger, + Assertion, } impl TraceKind { @@ -256,6 +274,22 @@ impl TraceKind { pub const fn is_execution(self) -> bool { matches!(self, Self::Execution) } + + /// Returns `true` if the trace kind is [`AssertionTrigger`]. + /// + /// [`AssertionTrigger`]: TraceKind::AssertionTrigger + #[must_use] + pub const fn is_assertion_trigger(self) -> bool { + matches!(self, Self::AssertionTrigger) + } + + /// Returns `true` if the trace kind is [`Assertion`]. + /// + /// [`Assertion`]: TraceKind::Assertion + #[must_use] + pub const fn is_assertion(self) -> bool { + matches!(self, Self::Assertion) + } } /// Given a list of traces and artifacts, it returns a map connecting address to abi diff --git a/crates/fmt/src/state/mod.rs b/crates/fmt/src/state/mod.rs index 89a9bf152c8c2..4b986017b71dd 100644 --- a/crates/fmt/src/state/mod.rs +++ b/crates/fmt/src/state/mod.rs @@ -711,7 +711,7 @@ impl<'sess> State<'sess, '_> { // Merge the lines and let the wrapper handle breaking if needed let merged_line = format!( "{current_line} {next_content}", - next_content = &next_line[prefix.len()..].trim_start() + next_content = next_line[prefix.len()..].trim_start() ); result.push(merged_line); diff --git a/crates/forge/Cargo.toml b/crates/forge/Cargo.toml index 064834d248d5f..77bee773e28f6 100644 --- a/crates/forge/Cargo.toml +++ b/crates/forge/Cargo.toml @@ -126,3 +126,4 @@ aws-kms = ["foundry-wallets/aws-kms"] gcp-kms = ["foundry-wallets/gcp-kms"] turnkey = ["foundry-wallets/turnkey"] isolate-by-default = ["foundry-config/isolate-by-default"] +credible = ["foundry-evm/credible"] diff --git a/crates/forge/assets/tempo/MailTemplate.s.sol b/crates/forge/assets/tempo/MailTemplate.s.sol index 27512efe4d5ec..45006f7cd0e06 100644 --- a/crates/forge/assets/tempo/MailTemplate.s.sol +++ b/crates/forge/assets/tempo/MailTemplate.s.sol @@ -14,7 +14,7 @@ contract MailScript is Script { function run(string memory salt) public { vm.startBroadcast(); - address feeToken = vm.envOr("TEMPO_FEE_TOKEN", StdTokens.ALPHA_USD_ADDRESS); + address feeToken = vm.envOr("TEMPO_FEE_TOKEN", StdTokens.PATH_USD_ADDRESS); StdPrecompiles.TIP_FEE_MANAGER.setUserToken(feeToken); ITIP20 token = ITIP20( diff --git a/crates/forge/assets/tempo/MailTemplate.t.sol b/crates/forge/assets/tempo/MailTemplate.t.sol index b1749db5df0bf..19760303860a1 100644 --- a/crates/forge/assets/tempo/MailTemplate.t.sol +++ b/crates/forge/assets/tempo/MailTemplate.t.sol @@ -17,7 +17,7 @@ contract MailTest is Test { address public constant BOB = address(0x70997970C51812dc3A010C7d01b50e0d17dc79C8); function setUp() public virtual { - address feeToken = vm.envOr("TEMPO_FEE_TOKEN", StdTokens.ALPHA_USD_ADDRESS); + address feeToken = vm.envOr("TEMPO_FEE_TOKEN", StdTokens.PATH_USD_ADDRESS); StdPrecompiles.TIP_FEE_MANAGER.setUserToken(feeToken); token = ITIP20( diff --git a/crates/forge/src/cmd/coverage.rs b/crates/forge/src/cmd/coverage.rs index ea034bce87185..b8ce2a9b945b1 100644 --- a/crates/forge/src/cmd/coverage.rs +++ b/crates/forge/src/cmd/coverage.rs @@ -87,8 +87,11 @@ impl CoverageArgs { config = self.load_config()?; } - // Set fuzz seed so coverage reports are deterministic - config.fuzz.seed = Some(U256::from_be_bytes(STATIC_FUZZ_SEED)); + // Default to a static fuzz seed so coverage reports are deterministic, + // but allow the user to override it via `--fuzz-seed` or `[fuzz] seed` in config. + if config.fuzz.seed.is_none() { + config.fuzz.seed = Some(U256::from_be_bytes(STATIC_FUZZ_SEED)); + } let (paths, mut output) = { let (project, output) = self.build(&config)?; diff --git a/crates/forge/src/cmd/create.rs b/crates/forge/src/cmd/create.rs index 765bb64f95fdd..98564ec01ea67 100644 --- a/crates/forge/src/cmd/create.rs +++ b/crates/forge/src/cmd/create.rs @@ -408,15 +408,18 @@ impl CreateArgs { // Apply user-provided gas, fee, nonce, and Tempo options. self.tx.apply::(&mut deployer.tx, is_legacy); - // For keychain mode, set key_id and nonce_key before gas estimation. // Convert the CREATE into an AA-compatible call entry since Tempo AA // transactions use a `calls` list instead of `to`+`input`. + if chain.is_tempo() { + deployer.tx.convert_create_to_call(); + } + + // For keychain mode, set key_id and nonce_key before gas estimation. if let Some((_, ref ak)) = tempo_keychain { deployer.tx.set_key_id(ak.key_address); if deployer.tx.nonce_key().is_none() { deployer.tx.set_nonce_key(U256::ZERO); } - deployer.tx.convert_create_to_call(); } // Fetch defaults from provider for values not specified by user. diff --git a/crates/forge/src/cmd/flatten.rs b/crates/forge/src/cmd/flatten.rs index 3dc508d577cf9..3917b0418179f 100644 --- a/crates/forge/src/cmd/flatten.rs +++ b/crates/forge/src/cmd/flatten.rs @@ -26,7 +26,7 @@ pub struct FlattenArgs { pub output: Option, #[command(flatten)] - project_paths: ProjectPathOpts, + pub project_paths: ProjectPathOpts, } impl FlattenArgs { diff --git a/crates/forge/src/cmd/snapshot.rs b/crates/forge/src/cmd/snapshot.rs index c8dc2ba72aae1..7c6fb51ce3266 100644 --- a/crates/forge/src/cmd/snapshot.rs +++ b/crates/forge/src/cmd/snapshot.rs @@ -99,8 +99,11 @@ impl GasSnapshotArgs { } pub async fn run(mut self) -> Result<()> { - // Set fuzz seed so gas snapshots are deterministic - self.test.fuzz_seed = Some(U256::from_be_bytes(STATIC_FUZZ_SEED)); + // Default to a static fuzz seed so gas snapshots are deterministic, + // but allow the user to override it via `--fuzz-seed`. + if self.test.fuzz_seed.is_none() { + self.test.fuzz_seed = Some(U256::from_be_bytes(STATIC_FUZZ_SEED)); + } let outcome = self.test.compile_and_run().await?; outcome.ensure_ok(false)?; diff --git a/crates/forge/src/cmd/test/mod.rs b/crates/forge/src/cmd/test/mod.rs index da300c429e37e..73437f40dea1a 100644 --- a/crates/forge/src/cmd/test/mod.rs +++ b/crates/forge/src/cmd/test/mod.rs @@ -6,7 +6,7 @@ use crate::{ multi_runner::matches_artifact, result::{SuiteResult, TestOutcome, TestStatus}, traces::{ - CallTraceDecoderBuilder, InternalTraceMode, TraceKind, + CallTraceDecoderBuilder, InternalTraceMode, SparsedTraceArena, TraceKind, debug::{ContractSources, DebugTraceIdentifier}, decode_trace_arena, folded_stack_trace, identifier::SignaturesIdentifier, @@ -59,6 +59,21 @@ use std::{ }; use yansi::Paint; +fn label_assertion_trace(arena: &mut SparsedTraceArena) { + let Some(assertion_addr) = arena.nodes().first().map(|node| node.trace.address) else { + return; + }; + + for node in arena.nodes_mut() { + if node.trace.address == assertion_addr + && let Some(decoded) = node.trace.decoded.as_mut() + && decoded.label.is_none() + { + decoded.label = Some("Assertion".to_string()); + } + } +} + mod filter; mod summary; use crate::{result::TestKind, traces::render_trace_arena_inner}; @@ -704,6 +719,8 @@ impl TestArgs { // Identify addresses and decode traces. let mut decoded_traces = Vec::with_capacity(result.traces.len()); + let mut decoded_trigger_traces = Vec::new(); + let mut decoded_assertion_traces = Vec::new(); for (kind, arena) in &mut result.traces { if identify_addresses { decoder.identify(arena, &mut identifier); @@ -718,6 +735,12 @@ impl TestArgs { TraceKind::Execution => { (verbosity == 3 && result.status.is_failure()) || verbosity >= 4 } + TraceKind::AssertionTrigger => { + (verbosity == 3 && result.status.is_failure()) || verbosity >= 4 + } + TraceKind::Assertion => { + (verbosity == 3 && result.status.is_failure()) || verbosity >= 4 + } TraceKind::Setup => { (verbosity == 4 && result.status.is_failure()) || verbosity >= 5 } @@ -731,14 +754,60 @@ impl TestArgs { prune_trace_depth(arena, trace_depth); } - decoded_traces.push(render_trace_arena_inner(arena, false, verbosity > 4)); + if matches!(kind, TraceKind::Assertion) { + label_assertion_trace(arena); + decoded_assertion_traces.push(render_trace_arena_inner( + arena, + false, + verbosity > 4, + )); + } else if matches!(kind, TraceKind::AssertionTrigger) { + decoded_trigger_traces.push(render_trace_arena_inner( + arena, + false, + verbosity > 4, + )); + } else { + decoded_traces.push(render_trace_arena_inner( + arena, + false, + verbosity > 4, + )); + } } } - if !silent && show_traces && !decoded_traces.is_empty() { - sh_println!("Traces:")?; - for trace in &decoded_traces { - sh_println!("{trace}")?; + if !silent + && show_traces + && (!decoded_traces.is_empty() + || !decoded_trigger_traces.is_empty() + || !decoded_assertion_traces.is_empty()) + { + if !decoded_traces.is_empty() { + sh_println!("Traces:")?; + for trace in &decoded_traces { + sh_println!("{trace}")?; + } + } + + if !decoded_trigger_traces.is_empty() { + if !decoded_traces.is_empty() { + sh_println!()?; + } + sh_println!("Trigger Call:")?; + for trace in &decoded_trigger_traces { + sh_println!("{trace}")?; + } + } + + if !decoded_assertion_traces.is_empty() { + if !decoded_traces.is_empty() || !decoded_trigger_traces.is_empty() { + sh_println!()?; + } + sh_println!("Assertion Traces:")?; + for trace in &decoded_assertion_traces { + sh_println!("{trace}")?; + } } } @@ -905,7 +974,7 @@ impl TestArgs { if let Some(gas_report) = gas_report { let finalized = gas_report.finalize(); - sh_println!("{}", &finalized)?; + sh_println!("{finalized}")?; outcome.gas_report = Some(finalized); } @@ -915,7 +984,7 @@ impl TestArgs { if self.summary && !outcome.results.is_empty() { let summary_report = TestSummaryReport::new(self.detailed, outcome.clone()); - sh_println!("{}", &summary_report)?; + sh_println!("{summary_report}")?; } // Reattach the task. diff --git a/crates/forge/src/cmd/test/summary.rs b/crates/forge/src/cmd/test/summary.rs index f8a72272af53c..a0123e896d0bf 100644 --- a/crates/forge/src/cmd/test/summary.rs +++ b/crates/forge/src/cmd/test/summary.rs @@ -25,9 +25,9 @@ impl TestSummaryReport { impl Display for TestSummaryReport { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { if shell::is_json() { - writeln!(f, "{}", &self.format_json_output(&self.is_detailed, &self.outcome))?; + writeln!(f, "{}", self.format_json_output(&self.is_detailed, &self.outcome))?; } else { - writeln!(f, "\n{}", &self.format_table_output(&self.is_detailed, &self.outcome))?; + writeln!(f, "\n{}", self.format_table_output(&self.is_detailed, &self.outcome))?; } Ok(()) } diff --git a/crates/forge/src/gas_report.rs b/crates/forge/src/gas_report.rs index 6c93dc03b28b5..58b11d98874ed 100644 --- a/crates/forge/src/gas_report.rs +++ b/crates/forge/src/gas_report.rs @@ -146,7 +146,7 @@ impl GasReport { impl Display for GasReport { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { if shell::is_json() { - writeln!(f, "{}", &self.format_json_output())?; + writeln!(f, "{}", self.format_json_output())?; } else { for (name, contract) in &self.contracts { if contract.functions.is_empty() { diff --git a/crates/forge/src/result.rs b/crates/forge/src/result.rs index 66be289ef252d..b5d3671116819 100644 --- a/crates/forge/src/result.rs +++ b/crates/forge/src/result.rs @@ -16,7 +16,7 @@ use foundry_evm::{ decode::SkipReason, executors::{RawCallResult, invariant::InvariantMetrics}, fuzz::{CounterExample, FuzzCase, FuzzFixtures, FuzzTestResult}, - traces::{CallTraceArena, CallTraceDecoder, TraceKind, Traces}, + traces::{CallTraceArena, CallTraceDecoder, SparsedTraceArena, TraceKind, Traces}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -618,7 +618,24 @@ impl TestResult { self.duration = Duration::default(); self.gas_report_traces = Vec::new(); - if let Some(cheatcodes) = raw_call_result.cheatcodes { + if let Some(mut cheatcodes) = raw_call_result.cheatcodes { + let assertion_trigger_traces = cheatcodes.take_assertion_trigger_traces(); + if !assertion_trigger_traces.is_empty() { + self.traces.extend(assertion_trigger_traces.into_iter().map(|arena| { + ( + TraceKind::AssertionTrigger, + SparsedTraceArena { arena, ignored: Default::default() }, + ) + })); + } + + let assertion_traces = cheatcodes.take_assertion_traces(); + if !assertion_traces.is_empty() { + self.traces.extend(assertion_traces.into_iter().map(|arena| { + (TraceKind::Assertion, SparsedTraceArena { arena, ignored: Default::default() }) + })); + } + self.breakpoints = cheatcodes.breakpoints; self.gas_snapshots = cheatcodes.gas_snapshots; self.deprecated_cheatcodes = cheatcodes.deprecated; diff --git a/crates/forge/src/runner.rs b/crates/forge/src/runner.rs index d924c416759a2..353d8b1f55cde 100644 --- a/crates/forge/src/runner.rs +++ b/crates/forge/src/runner.rs @@ -826,7 +826,7 @@ impl<'a, FEN: FoundryEvmNetwork> FunctionRunner<'a, FEN> { ); if let Some(ref progress) = progress { - progress.set_prefix(format!("{}\n{warn}\n", &func.name)); + progress.set_prefix(format!("{}\n{warn}\n", func.name)); } else { let _ = sh_warn!("{warn}"); } diff --git a/crates/forge/tests/cli/backtrace.rs b/crates/forge/tests/cli/backtrace.rs index 434fa4cb289ba..835bdde5eb808 100644 --- a/crates/forge/tests/cli/backtrace.rs +++ b/crates/forge/tests/cli/backtrace.rs @@ -290,7 +290,7 @@ forgetest!(test_library_backtrace, |prj, cmd| { // Add foundry.toml configuration for linked library let config = foundry_config::Config { libraries: vec!["src/libraries/ExternalMathLib.sol:ExternalMathLib:0x1234567890123456789012345678901234567890".to_string()], - ..Default::default() + ..foundry_test_utils::util::test_config_default() }; prj.write_config(config); diff --git a/crates/forge/tests/cli/cmd.rs b/crates/forge/tests/cli/cmd.rs index d3f1503faf569..d9f6e6be77fef 100644 --- a/crates/forge/tests/cli/cmd.rs +++ b/crates/forge/tests/cli/cmd.rs @@ -298,6 +298,9 @@ forgetest!( // checks that init works forgetest!(can_init_repo_with_config, |prj, cmd| { let foundry_toml = prj.root().join(Config::FILE_NAME); + // `TestProject::new` pre-writes a foundry.toml to match the project's PathStyle; remove it + // so this test exercises `forge init`'s empty-directory path. + let _ = fs::remove_file(&foundry_toml); assert!(!foundry_toml.exists()); cmd.args(["init", "--force"]) @@ -916,11 +919,18 @@ Installing tempo-std in [..] (url: https://github.com/tempoxyz/tempo-std, tag: N assert!(prj.root().join("foundry.toml").exists()); - // Verify foundry.toml contains `tempo = true` so subsequent commands auto-detect the network. + // Verify foundry.toml contains `network = "tempo"` so subsequent commands auto-detect the + // network. let foundry_toml = std::fs::read_to_string(prj.root().join("foundry.toml")).unwrap(); assert!( - foundry_toml.contains("tempo = true"), - "foundry.toml should contain `tempo = true`, got:\n{foundry_toml}" + foundry_toml.contains("network = \"tempo\""), + "foundry.toml should contain `network = \"tempo\"`, got:\n{foundry_toml}" + ); + assert!( + foundry_toml.contains("[rpc_endpoints]") + && foundry_toml.contains("tempo = \"https://rpc.tempo.xyz/\"") + && foundry_toml.contains("moderato = \"https://rpc.moderato.tempo.xyz/\""), + "foundry.toml should contain tempo rpc_endpoints, got:\n{foundry_toml}" ); assert!(prj.root().join("lib/forge-std").exists()); @@ -1816,7 +1826,7 @@ forgetest!(gas_report_all_contracts, |prj, cmd| { +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -1830,7 +1840,7 @@ forgetest!(gas_report_all_contracts, |prj, cmd| { +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -1844,7 +1854,7 @@ forgetest!(gas_report_all_contracts, |prj, cmd| { +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -1863,7 +1873,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -1879,7 +1889,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -1895,7 +1905,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -1921,7 +1931,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -1935,7 +1945,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -1949,7 +1959,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -1968,7 +1978,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -1984,7 +1994,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2000,7 +2010,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2026,7 +2036,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2040,7 +2050,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -2054,7 +2064,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2073,7 +2083,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2089,7 +2099,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2105,7 +2115,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2134,7 +2144,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2148,7 +2158,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -2162,7 +2172,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2181,7 +2191,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2197,7 +2207,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2213,7 +2223,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2246,7 +2256,7 @@ forgetest!(gas_report_some_contracts, |prj, cmd| { +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2265,7 +2275,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2293,7 +2303,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2312,7 +2322,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2340,7 +2350,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -2359,7 +2369,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2395,7 +2405,7 @@ forgetest!(gas_report_ignore_some_contracts, |prj, cmd| { +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -2409,7 +2419,7 @@ forgetest!(gas_report_ignore_some_contracts, |prj, cmd| { +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2428,7 +2438,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2444,7 +2454,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2476,7 +2486,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2490,7 +2500,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -2509,7 +2519,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2525,7 +2535,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2565,7 +2575,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2579,7 +2589,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=================================================================================================+ | Deployment Cost | Deployment Size | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| -| 133243 | 395 | | | | | +| 133219 | 395 | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| | | | | | | | |------------------------------------------+-----------------+--------+--------+--------+---------| @@ -2593,7 +2603,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) +=============================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| -| 133027 | 394 | | | | | +| 133015 | 394 | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------------+-----------------+-------+--------+-------+---------| @@ -2622,7 +2632,7 @@ Warning: ContractThree is listed in both 'gas_reports' and 'gas_reports_ignore'. { "contract": "src/Contracts.sol:ContractOne", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -2638,7 +2648,7 @@ Warning: ContractThree is listed in both 'gas_reports' and 'gas_reports_ignore'. { "contract": "src/Contracts.sol:ContractThree", "deployment": { - "gas": 133243, + "gas": 133219, "size": 395 }, "functions": { @@ -2654,7 +2664,7 @@ Warning: ContractThree is listed in both 'gas_reports' and 'gas_reports_ignore'. { "contract": "src/Contracts.sol:ContractTwo", "deployment": { - "gas": 133027, + "gas": 133015, "size": 394 }, "functions": { @@ -3106,7 +3116,7 @@ contract NestedDeploy is Test { +============================================================================================+ | Deployment Cost | Deployment Size | | | | | |-------------------------------------------+-----------------+-----+--------+-----+---------| -| 328961 | 1163 | | | | | +| 328949 | 1163 | | | | | |-------------------------------------------+-----------------+-----+--------+-----+---------| | | | | | | | |-------------------------------------------+-----------------+-----+--------+-----+---------| @@ -3161,7 +3171,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) { "contract": "test/NestedDeployTest.sol:Parent", "deployment": { - "gas": 328961, + "gas": 328949, "size": 1163 }, "functions": { @@ -3918,7 +3928,7 @@ forgetest_init!(gas_report_include_tests, |prj, cmd| { +=======================================================================================+ | Deployment Cost | Deployment Size | | | | | |----------------------------------+-----------------+-------+--------+-------+---------| -| 156813 | 509 | | | | | +| 156801 | 509 | | | | | |----------------------------------+-----------------+-------+--------+-------+---------| | | | | | | | |----------------------------------+-----------------+-------+--------+-------+---------| @@ -3942,7 +3952,7 @@ forgetest_init!(gas_report_include_tests, |prj, cmd| { |-----------------------------------------+-----------------+--------+--------+--------+---------| | Function Name | Min | Avg | Median | Max | # Calls | |-----------------------------------------+-----------------+--------+--------+--------+---------| -| setUp | 218902 | 218902 | 218902 | 218902 | 1 | +| setUp | 218890 | 218890 | 218890 | 218890 | 1 | |-----------------------------------------+-----------------+--------+--------+--------+---------| | test_Increment | 51847 | 51847 | 51847 | 51847 | 1 | ╰-----------------------------------------+-----------------+--------+--------+--------+---------╯ @@ -3960,7 +3970,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) | src/Counter.sol:Counter Contract | | | | | | |----------------------------------|-----------------|-------|--------|-------|---------| | Deployment Cost | Deployment Size | | | | | -| 156813 | 509 | | | | | +| 156801 | 509 | | | | | | | | | | | | | Function Name | Min | Avg | Median | Max | # Calls | | increment | 43482 | 43482 | 43482 | 43482 | 1 | @@ -3973,7 +3983,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) | 1544498 | 7573 | | | | | | | | | | | | | Function Name | Min | Avg | Median | Max | # Calls | -| setUp | 218902 | 218902 | 218902 | 218902 | 1 | +| setUp | 218890 | 218890 | 218890 | 218890 | 1 | | test_Increment | 51847 | 51847 | 51847 | 51847 | 1 | @@ -3990,7 +4000,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) { "contract": "src/Counter.sol:Counter", "deployment": { - "gas": 156813, + "gas": 156801, "size": 509 }, "functions": { @@ -4026,10 +4036,10 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) "functions": { "setUp()": { "calls": 1, - "min": 218902, - "mean": 218902, - "median": 218902, - "max": 218902 + "min": 218890, + "mean": 218890, + "median": 218890, + "max": 218890 }, "test_Increment()": { "calls": 1, diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index dca88ad1c2f63..c8a4014a6154a 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -16,7 +16,7 @@ use foundry_config::{ use foundry_evm::opts::EvmOpts; use foundry_test_utils::{ foundry_compilers::artifacts::{EvmVersion, remappings::Remapping}, - util::{OTHER_SOLC_VERSION, OutputExt, TestCommand, pretty_err}, + util::{OTHER_SOLC_VERSION, OutputExt, TestCommand, pretty_err, test_config_default}, }; use path_slash::PathBufExt; use semver::VersionReq; @@ -30,21 +30,21 @@ use std::{ }; const DEFAULT_CONFIG: &str = r#"[profile.default] -src = "src" -test = "test" -script = "script" -out = "out" +src = "assertions/src" +test = "assertions/test" +script = "assertions/script" +out = "assertions/out" libs = ["lib"] remappings = ["forge-std/=lib/forge-std/src/"] auto_detect_remappings = true libraries = [] cache = true -cache_path = "cache" +cache_path = "assertions/cache" dynamic_test_linking = false -snapshots = "snapshots" +snapshots = "assertions/snapshots" gas_snapshot_check = false gas_snapshot_emit = true -broadcast = "broadcast" +broadcast = "assertions/broadcast" allow_paths = [] include_paths = [] skip = [] @@ -72,7 +72,7 @@ ignored_error_codes = [ ignored_error_codes_from = [] ignored_warnings_from = [] deny = "never" -test_failures_file = "cache/test-failures" +test_failures_file = "assertions/cache/test-failures" show_progress = false ffi = false live_logs = false @@ -112,7 +112,6 @@ create2_deployer = "0x4e59b44847b379578588920ca78fbf26c0b4956c" assertions_revert = true legacy_assertions = false celo = false -tempo = false bypass_prevrandao = false transaction_timeout = 120 additional_compiler_profiles = [] @@ -125,7 +124,7 @@ endpoints = "all" [[profile.default.fs_permissions]] access = "read" -path = "out" +path = "assertions/out" [fmt] line_length = 120 @@ -198,7 +197,7 @@ corpus_min_size = 0 show_edge_coverage = false sancov_edges = false sancov_trace_cmp = false -failure_persist_dir = "cache/fuzz" +failure_persist_dir = "assertions/cache/fuzz" show_logs = false [invariant] @@ -221,7 +220,7 @@ corpus_min_size = 0 show_edge_coverage = false sancov_edges = false sancov_trace_cmp = false -failure_persist_dir = "cache/invariant" +failure_persist_dir = "assertions/cache/invariant" show_metrics = true show_solidity = false check_interval = 1 @@ -730,7 +729,10 @@ forgetest!(can_set_use_literal_content, |prj, cmd| { // forgetest!(enable_optimizer_when_runs_set, |prj, cmd| { // explicitly set optimizer runs - prj.update_config(|config| config.optimizer_runs = Some(1337)); + prj.update_config(|config| { + config.optimizer = None; + config.optimizer_runs = Some(1337); + }); let config = cmd.config(); assert!(config.optimizer.unwrap()); @@ -908,7 +910,7 @@ forgetest_init!(can_prioritise_project_remappings, |prj, cmd| { // This should be filtered out from final remappings as root project already has `@utils/`. let nested = prj.paths().libraries[0].join("dep1"); pretty_err(&nested, fs::create_dir_all(&nested)); - let mut lib_config = Config::load_with_root(&nested).unwrap(); + let mut lib_config = test_config_default(); lib_config.remappings = vec![ Remapping::from_str("@utils/libraries/=src/").unwrap().into(), Remapping::from_str("@openzeppelin/contracts-upgradeable/=lib/openzeppelin-upgradeable/") @@ -1201,10 +1203,10 @@ forgetest_init!(test_default_config, |prj, cmd| { cmd.forge_fuse().args(["config", "--json"]).assert_success().stdout_eq(str![[r#" { - "src": "src", - "test": "test", - "script": "script", - "out": "out", + "src": "assertions/src", + "test": "assertions/test", + "script": "assertions/script", + "out": "assertions/out", "libs": [ "lib" ], @@ -1214,12 +1216,12 @@ forgetest_init!(test_default_config, |prj, cmd| { "auto_detect_remappings": true, "libraries": [], "cache": true, - "cache_path": "cache", + "cache_path": "assertions/cache", "dynamic_test_linking": false, - "snapshots": "snapshots", + "snapshots": "assertions/snapshots", "gas_snapshot_check": false, "gas_snapshot_emit": true, - "broadcast": "broadcast", + "broadcast": "assertions/broadcast", "allow_paths": [], "include_paths": [], "skip": [], @@ -1265,7 +1267,7 @@ forgetest_init!(test_default_config, |prj, cmd| { "match_path": null, "no_match_path": null, "no_match_coverage": null, - "test_failures_file": "cache/test-failures", + "test_failures_file": "assertions/cache/test-failures", "threads": null, "show_progress": false, "fuzz": { @@ -1287,7 +1289,7 @@ forgetest_init!(test_default_config, |prj, cmd| { "show_edge_coverage": false, "sancov_edges": false, "sancov_trace_cmp": false, - "failure_persist_dir": "cache/fuzz", + "failure_persist_dir": "assertions/cache/fuzz", "show_logs": false, "timeout": null }, @@ -1312,7 +1314,7 @@ forgetest_init!(test_default_config, |prj, cmd| { "show_edge_coverage": false, "sancov_edges": false, "sancov_trace_cmp": false, - "failure_persist_dir": "cache/invariant", + "failure_persist_dir": "assertions/cache/invariant", "show_metrics": true, "timeout": null, "show_solidity": false, @@ -1422,7 +1424,7 @@ forgetest_init!(test_default_config, |prj, cmd| { "fs_permissions": [ { "access": "read", - "path": "out" + "path": "assertions/out" } ], "isolate": false, @@ -1437,8 +1439,8 @@ forgetest_init!(test_default_config, |prj, cmd| { "soldeer": null, "assertions_revert": true, "legacy_assertions": false, + "network": null, "celo": false, - "tempo": false, "bypass_prevrandao": false, "transaction_timeout": 120, "additional_compiler_profiles": [], diff --git a/crates/forge/tests/cli/ext_integration.rs b/crates/forge/tests/cli/ext_integration.rs index fbd84739635c5..b4ad3c2d0afc6 100644 --- a/crates/forge/tests/cli/ext_integration.rs +++ b/crates/forge/tests/cli/ext_integration.rs @@ -6,7 +6,7 @@ use foundry_test_utils::util::ExtTester; // #[test] fn forge_std() { - ExtTester::new("foundry-rs", "forge-std", "b69e66b0ff79924d487d49bf7fb47c9ec326acba") + ExtTester::new("foundry-rs", "forge-std", "8987040ede9553cea20c95ad40d0455930f9c8e0") // Skip fork tests. .args(["--nmc", "Fork"]) .verbosity(2) diff --git a/crates/forge/tests/cli/failure_assertions.rs b/crates/forge/tests/cli/failure_assertions.rs index 48a17c723b261..77d5a5e84cfbb 100644 --- a/crates/forge/tests/cli/failure_assertions.rs +++ b/crates/forge/tests/cli/failure_assertions.rs @@ -70,8 +70,13 @@ Suite result: FAILED. 0 passed; 7 failed; 0 skipped; [ELAPSED] .stdout_eq( r#"No files changed, compilation skipped ... +[FAIL: Reverter != expected reverter: [..] != 0x000000000000000000000000000000000000dEaD] testShouldFailExpectPartialRevertWrongReverterTopLevelCreate() ([GAS]) +[FAIL: Reverter != expected reverter: [..] != [..]] testShouldFailExpectRevertNestedCreateInnerAddress() ([GAS]) +[FAIL: Reverter != expected reverter: [..] != 0x000000000000000000000000000000000000dEaD] testShouldFailExpectRevertWithBytesWrongReverterTopLevelCreate() ([GAS]) +[FAIL: Reverter != expected reverter: [..] != 0x000000000000000000000000000000000000dEaD] testShouldFailExpectRevertWrongReverterNestedCreate() ([GAS]) +[FAIL: Reverter != expected reverter: [..] != 0x000000000000000000000000000000000000dEaD] testShouldFailExpectRevertWrongReverterTopLevelCreate() ([GAS]) [FAIL: next call did not revert as expected] testShouldFailExpectRevertsNotOnImmediateNextCall() ([GAS]) -Suite result: FAILED. 0 passed; 1 failed; 0 skipped; [ELAPSED] +Suite result: FAILED. 0 passed; 6 failed; 0 skipped; [ELAPSED] ... "#, ); diff --git a/crates/forge/tests/cli/inline_config.rs b/crates/forge/tests/cli/inline_config.rs index 04fb2369d83b0..64e06f4ab7134 100644 --- a/crates/forge/tests/cli/inline_config.rs +++ b/crates/forge/tests/cli/inline_config.rs @@ -399,7 +399,7 @@ Ran 2 test suites [ELAPSED]: 4 tests passed, 0 failed, 0 skipped (4 total tests) forgetest_init!(config_inline_hardfork_same_network_family, |prj, cmd| { prj.write_config(foundry_config::Config { hardfork: Some("tempo:T2".parse::().unwrap()), - ..foundry_config::Config::default() + ..foundry_test_utils::util::test_config_default() }); prj.add_test( "inline.sol", diff --git a/crates/forge/tests/cli/install.rs b/crates/forge/tests/cli/install.rs index 35b785cb111de..d75356aefdcfb 100644 --- a/crates/forge/tests/cli/install.rs +++ b/crates/forge/tests/cli/install.rs @@ -5,7 +5,7 @@ use foundry_cli::utils::{Git, Submodules}; use foundry_compilers::artifacts::Remapping; use foundry_config::Config; use foundry_test_utils::util::{ - ExtTester, FORGE_STD_REVISION, TestCommand, pretty_err, read_string, + ExtTester, FORGE_STD_REVISION, TestCommand, pretty_err, read_string, test_config_default, }; use semver::Version; use std::{ @@ -422,7 +422,7 @@ Installing forge-5980-test in [..] (url: https://github.com/evalir/forge-5980-te .unwrap() .into(), ], - ..Default::default() + ..test_config_default() }; prj.write_config(config); diff --git a/crates/forge/tests/cli/precompiles.rs b/crates/forge/tests/cli/precompiles.rs index 505a6f7b04800..7e43d851bf6ba 100644 --- a/crates/forge/tests/cli/precompiles.rs +++ b/crates/forge/tests/cli/precompiles.rs @@ -163,7 +163,7 @@ Traces: │ │ └─ ← [Return] 0x0000000000000000000000000000000011a9a0372b8f332d5c30de9ad14e50372a73fa4c45d5f2fa5097f2d6fb93bcac592f2e1711ac43db0519870c7d0ea41500000000000000000000000000000000092c0f994164a0719f51c24ba3788de240ff926b55f58c445116e8bc6a47cd63392fd4e8e22bdf9feaa96ee773222133 │ ├─ [..] PRECOMPILES::bls12MapFp2ToG2(0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) [staticcall] │ │ └─ ← [Return] 0x00000000000000000000000000000000018320896ec9eef9d5e619848dc29ce266f413d02dd31d9b9d44ec0c79cd61f18b075ddba6d7bd20b7ff27a4b324bfce000000000000000000000000000000000a67d12118b5a35bb02d2e86b3ebfa7e23410db93de39fb06d7025fa95e96ffa428a7a27c3ae4dd4b40bd251ac658892000000000000000000000000000000000260e03644d1a2c321256b3246bad2b895cad13890cbe6f85df55106a0d334604fb143c7a042d878006271865bc359410000000000000000000000000000000004c69777a43f0bda07679d5805e63f18cf4e0e7c6112ac7f70266d199b4f76ae27c6269a3ceebdae30806e9a76aadf5c - │ ├─ [..] P256VERIFY::fulfillBasicOrder_efficient_6GL6yc() [staticcall] + │ ├─ [6900] 0x0000000000000000000000000000000000000100::fulfillBasicOrder_efficient_6GL6yc() [staticcall] │ │ └─ ← [Return] │ └─ ← [Return] 62 bytes of code └─ ← [Stop] diff --git a/crates/forge/tests/cli/script.rs b/crates/forge/tests/cli/script.rs index 242a0ebb4267f..b2df86da36497 100644 --- a/crates/forge/tests/cli/script.rs +++ b/crates/forge/tests/cli/script.rs @@ -1986,7 +1986,7 @@ contract SimpleScript is Script { ]) .assert_success() .stdout_eq(str![[r#" -{"logs":[],"returns":{"success":{"internal_type":"bool","value":"true"}},"success":true,"raw_logs":[],"traces":[["Deployment",{"arena":[{"parent":null,"children":[],"idx":0,"trace":{"depth":0,"success":true,"caller":"0x1804c8ab1f12e6bbf3894d4083f33e07309d1f38","address":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","maybe_precompile":false,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CREATE","value":"0x0","data":"[..]","output":"[..]","gas_used":"{...}","gas_limit":"{...}","gas_refund_counter":0,"status":"Return","steps":[],"decoded":{"label":"SimpleScript","return_data":null,"call_data":null}},"logs":[],"ordering":[]}]}],["Execution",{"arena":[{"parent":null,"children":[1,2],"idx":0,"trace":{"depth":0,"success":true,"caller":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","address":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0xc0406226","output":"0x0000000000000000000000000000000000000000000000000000000000000001","gas_used":"{...}","gas_limit":1073720760,"gas_refund_counter":0,"status":"Return","steps":[],"decoded":{"label":"SimpleScript","return_data":"true","call_data":{"signature":"run()","args":[]}}},"logs":[],"ordering":[{"Call":0},{"Call":1}]},{"parent":0,"children":[],"idx":1,"trace":{"depth":1,"success":true,"caller":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","address":"0x7109709ecfa91a80626ff3989d68f67f5b1dd12d","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0x7fb5297f","output":"0x","gas_used":"{...}","gas_limit":1056940999,"gas_refund_counter":0,"status":"Return","steps":[],"decoded":{"label":"VM","return_data":null,"call_data":{"signature":"startBroadcast()","args":[]}}},"logs":[],"ordering":[]},{"parent":0,"children":[],"idx":2,"trace":{"depth":1,"success":true,"caller":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","address":"0x0000000000000000000000000000000000000000","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0x","output":"0x","gas_used":"{...}","gas_limit":1056940650,"gas_refund_counter":0,"status":"Stop","steps":[],"decoded":{"label":null,"return_data":null,"call_data":null}},"logs":[],"ordering":[]}]}]],"gas_used":"{...}","labeled_addresses":{},"returned":"0x0000000000000000000000000000000000000000000000000000000000000001","address":null} +{"logs":[],"returns":{"success":{"internal_type":"bool","value":"true"}},"success":true,"raw_logs":[],"traces":[["Deployment",{"arena":[{"parent":null,"children":[],"idx":0,"trace":{"depth":0,"success":true,"caller":"0x1804c8ab1f12e6bbf3894d4083f33e07309d1f38","address":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","maybe_precompile":false,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CREATE","value":"0x0","data":"[..]","output":"[..]","gas_used":"{...}","gas_limit":"{...}","gas_refund_counter":0,"status":"Return","steps":[],"decoded":{"label":"SimpleScript","return_data":null,"call_data":null}},"logs":[],"ordering":[]}]}],["Execution",{"arena":[{"parent":null,"children":[1,2],"idx":0,"trace":{"depth":0,"success":true,"caller":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","address":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0xc0406226","output":"0x0000000000000000000000000000000000000000000000000000000000000001","gas_used":"{...}","gas_limit":1073720760,"gas_refund_counter":0,"status":"Return","steps":[],"decoded":{"label":"SimpleScript","return_data":"true","call_data":{"signature":"run()","args":[]}}},"logs":[],"ordering":[{"Call":0},{"Call":1}]},{"parent":0,"children":[],"idx":1,"trace":{"depth":1,"success":true,"caller":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","address":"0x7109709ecfa91a80626ff3989d68f67f5b1dd12d","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0x7fb5297f","output":"0x","gas_used":"{...}","gas_limit":1056940999,"gas_refund_counter":0,"status":"Return","steps":[],"decoded":{"label":"VM","return_data":null,"call_data":{"signature":"startBroadcast()","args":[]}}},"logs":[],"ordering":[]},{"parent":0,"children":[],"idx":2,"trace":{"depth":1,"success":true,"caller":"0x5b73c5498c1e3b4dba84de0f1833c4a029d90519","address":"0x0000000000000000000000000000000000000000","maybe_precompile":null,"selfdestruct_address":null,"selfdestruct_refund_target":null,"selfdestruct_transferred_value":null,"kind":"CALL","value":"0x0","data":"0x","output":"0x","gas_used":"{...}","gas_limit":1056940650,"gas_refund_counter":0,"status":"Stop","steps":[],"decoded":{"label":"","return_data":null,"call_data":null}},"logs":[],"ordering":[]}]}]],"gas_used":"{...}","labeled_addresses":{},"returned":"0x0000000000000000000000000000000000000000000000000000000000000001","address":null} {"chain":31337,"estimated_gas_price":"{...}","estimated_total_gas_used":"{...}","estimated_amount_required":"{...}","token_symbol":"ETH"} {"chain":"anvil-hardhat","status":"success","tx_hash":"0x4f78afe915fceb282c7625a68eb350bc0bf78acb59ad893e5c62b710a37f3156","contract_address":null,"block_number":1,"gas_used":"{...}","gas_price":"{...}"} {"status":"success","transactions":"[..]/broadcast/Foo.sol/31337/run-latest.json","sensitive":"[..]/cache/Foo.sol/31337/run-latest.json"} @@ -2809,17 +2809,17 @@ Traces: │ └─ ← [Return] 481 bytes of code ├─ [0] VM::signAndAttachDelegation(0x5FbDB2315678afecb367f032d93F642f64180aa3, "") │ └─ ← [Return] (0, 0xd4301eb9f82f747137a5f2c3dc3a5c2d253917cf99ecdc0d49f7bb85313c3159, 0x786d354f0bbd456f44116ddd3aa50475e989d72d8396005e5b3a12cede83fb68, 4, 0x5FbDB2315678afecb367f032d93F642f64180aa3) - ├─ [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::increment() + ├─ [22418] ::increment() │ └─ ← [Stop] - ├─ [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::increment() + ├─ [518] ::increment() │ └─ ← [Stop] ├─ [0] VM::signAndAttachDelegation(0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512, "") │ └─ ← [Return] (0, 0xaba9128338f7ff036a0d2ecb96d4f4376389005cd565f87aba33b312570af962, 0x69acbe0831fb8ca95338bc4b908dcfebaf7b81b0f770a12c073ceb07b89fbdf3, 7, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512) - ├─ [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::setNumber(0) + ├─ [492] ::setNumber(0) │ └─ ← [Stop] ├─ [0] VM::signAndAttachDelegation(0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0, "") │ └─ ← [Return] (1, 0x3a3427b66e589338ce7ea06135650708f9152e93e257b4a5ec6eb86a3e09a2ce, 0x444651c354c89fd3312aafb05948e12c0a16220827a5e467705253ab4d8aa8d3, 9, 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0) - ├─ [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::setNumber(0) + ├─ [492] ::setNumber(0) │ └─ ← [Stop] ├─ [0] VM::stopBroadcast() │ └─ ← [Return] @@ -2841,16 +2841,16 @@ Simulated On-chain Traces: [..] → new Counter@0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 └─ ← [Return] 481 bytes of code - [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::increment() + [22418] ::increment() └─ ← [Stop] - [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::increment() + [5318] ::increment() └─ ← [Stop] - [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::setNumber(0) + [5392] ::setNumber(0) └─ ← [Stop] - [..] 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266::setNumber(0) + [2592] ::setNumber(0) └─ ← [Stop] @@ -3241,7 +3241,7 @@ contract CounterScript is Script { error: the following required arguments were not provided: --broadcast -Usage: [..] script --broadcast --verify --rpc-url [ARGS]... +Usage: [..] script --broadcast --verify --rpc-url [ARGS]... For more information, try '--help'. diff --git a/crates/forge/tests/cli/test_cmd/invariant/common.rs b/crates/forge/tests/cli/test_cmd/invariant/common.rs index fefd95def0412..107b387bb0ec5 100644 --- a/crates/forge/tests/cli/test_cmd/invariant/common.rs +++ b/crates/forge/tests/cli/test_cmd/invariant/common.rs @@ -2670,7 +2670,7 @@ contract InvariantWarp is Test { [FAIL: max time] [Sequence] (original: 3, shrunk: 1) vm.warp(block.timestamp + 656868); - vm.prank(0x00000000000000000000000000000000000012d2); + vm.prank(0x00000000000000000000000000000000000012d1); Warp(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).increment(); invariant_warp() (runs: 0, calls: 0, reverts: 2) ... diff --git a/crates/forge/tests/cli/test_cmd/invariant/mod.rs b/crates/forge/tests/cli/test_cmd/invariant/mod.rs index 723b5bd789c8b..bbe65f2f2f2fa 100644 --- a/crates/forge/tests/cli/test_cmd/invariant/mod.rs +++ b/crates/forge/tests/cli/test_cmd/invariant/mod.rs @@ -422,9 +422,9 @@ Failing tests: Encountered 1 failing test in test/InvariantSequenceLenTest.t.sol:InvariantSequenceLenTest [FAIL: invariant increment failure] [Sequence] (original: 3, shrunk: 3) - sender=0x00000000000000000000000000000000000014aD addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=increment() args=[] + sender=0x0000000000000000000000000000000000001490 addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=increment() args=[] sender=0x8ef7F804bAd9183981A366EA618d9D47D3124649 addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=increment() args=[] - sender=0x00000000000000000000000000000000000016Ac addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=setNumber(uint256) args=[284406551521730736391345481857560031052359183671404042152984097777 [2.844e65]] + sender=0x00000000000000000000000000000000000016C5 addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=setNumber(uint256) args=[284406551521730736391345481857560031052359183671404042152984097777 [2.844e65]] invariant_increment() (runs: 0, calls: 0, reverts: 0) Encountered a total of 1 failing tests, 0 tests succeeded @@ -448,11 +448,11 @@ Failing tests: Encountered 1 failing test in test/InvariantSequenceLenTest.t.sol:InvariantSequenceLenTest [FAIL: invariant increment failure] [Sequence] (original: 3, shrunk: 3) - vm.prank(0x00000000000000000000000000000000000014aD); + vm.prank(0x0000000000000000000000000000000000001490); Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).increment(); vm.prank(0x8ef7F804bAd9183981A366EA618d9D47D3124649); Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).increment(); - vm.prank(0x00000000000000000000000000000000000016Ac); + vm.prank(0x00000000000000000000000000000000000016C5); Counter(0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f).setNumber(284406551521730736391345481857560031052359183671404042152984097777); invariant_increment() (runs: 0, calls: 0, reverts: 0) @@ -476,9 +476,9 @@ Failing tests: Encountered 1 failing test in test/InvariantSequenceLenTest.t.sol:InvariantSequenceLenTest [FAIL: invariant increment failure] [Sequence] (original: 3, shrunk: 3) - sender=0x00000000000000000000000000000000000014aD addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=increment() args=[] + sender=0x0000000000000000000000000000000000001490 addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=increment() args=[] sender=0x8ef7F804bAd9183981A366EA618d9D47D3124649 addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=increment() args=[] - sender=0x00000000000000000000000000000000000016Ac addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=setNumber(uint256) args=[284406551521730736391345481857560031052359183671404042152984097777 [2.844e65]] + sender=0x00000000000000000000000000000000000016C5 addr=[src/Counter.sol:Counter]0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f calldata=setNumber(uint256) args=[284406551521730736391345481857560031052359183671404042152984097777 [2.844e65]] invariant_increment() (runs: 1, calls: 1, reverts: 1) Encountered a total of 1 failing tests, 0 tests succeeded diff --git a/crates/forge/tests/cli/test_cmd/mod.rs b/crates/forge/tests/cli/test_cmd/mod.rs index 14f49863815cd..db6c455e425de 100644 --- a/crates/forge/tests/cli/test_cmd/mod.rs +++ b/crates/forge/tests/cli/test_cmd/mod.rs @@ -6,7 +6,7 @@ use foundry_test_utils::{ TestCommand, rpc::{self, rpc_endpoints}, str, - util::{OTHER_SOLC_VERSION, OutputExt, SOLC_VERSION}, + util::{OTHER_SOLC_VERSION, OutputExt, SOLC_VERSION, get_vyper}, }; use similar_asserts::assert_eq; use std::{io::Write, path::PathBuf, str::FromStr}; @@ -35,12 +35,25 @@ fn setup_testdata_cmd(cmd: &mut TestCommand) { } } drop(dotenv); + + // `testdata` includes Vyper fixtures; keep this test hermetic if PATH lacks a working vyper. + let vyper = get_vyper(); + if let Some(vyper_dir) = vyper.path.parent().filter(|path| !path.as_os_str().is_empty()) { + let path = std::env::var_os("PATH").unwrap_or_default(); + let joined_path = std::env::join_paths( + std::iter::once(vyper_dir.to_path_buf()).chain(std::env::split_paths(&path)), + ) + .unwrap(); + cmd.env("PATH", joined_path); + } } /// Contracts excluded from the main `testdata` run because they depend on flaky external RPCs. /// These are run separately by the `flaky_testdata` test below. /// Format: pipe-separated regex alternation, e.g. `"Foo|Bar|Baz"`. -const FLAKY_TESTDATA_CONTRACTS: &str = "Issue4640Test"; +const FLAKY_TESTDATA_CONTRACTS: &str = "Issue4640Test|Issue14212Test"; +/// Contracts that are not part of the default Foundry-compatible `testdata` run. +const DEFAULT_TESTDATA_EXCLUDED_CONTRACTS: &str = "Issue4640Test|Issue14212Test|CredibleTest"; // Run `forge test` on `/testdata`. forgetest!(testdata, |_prj, cmd| { @@ -48,9 +61,9 @@ forgetest!(testdata, |_prj, cmd| { let mut args = vec!["test"]; let nmc_isolate = format!( - "--nmc=(LastCallGasDefaultTest|MockFunctionTest|WithSeed|StateDiff|GetStorageSlotsTest|RecordAccount|{FLAKY_TESTDATA_CONTRACTS})", + "--nmc=(LastCallGasDefaultTest|MockFunctionTest|WithSeed|StateDiff|GetStorageSlotsTest|RecordAccount|{DEFAULT_TESTDATA_EXCLUDED_CONTRACTS})", ); - let nmc_default = format!("--nmc=({FLAKY_TESTDATA_CONTRACTS})"); + let nmc_default = format!("--nmc=({DEFAULT_TESTDATA_EXCLUDED_CONTRACTS})"); if cfg!(feature = "isolate-by-default") { args.push(&nmc_isolate); } else { diff --git a/crates/forge/tests/cli/test_cmd/repros.rs b/crates/forge/tests/cli/test_cmd/repros.rs index 32bfe6a98a9fd..3803385b496ab 100644 --- a/crates/forge/tests/cli/test_cmd/repros.rs +++ b/crates/forge/tests/cli/test_cmd/repros.rs @@ -783,6 +783,66 @@ ParserError: Source "Missing.sol" not found: File not found. Searched the follow "#]]); }); +// https://github.com/foundry-rs/foundry/issues/10463 +forgetest_init!(issue_10463, |prj, cmd| { + prj.add_test( + "Issue10463.t.sol", + r#" +import {Test} from "forge-std/Test.sol"; + +contract Issue10463Test is Test { + event Foo(); + + error CustomError(uint256 code); + + function revertingBefore(bool shouldRevert) external { + if (shouldRevert) revert(); + emit Foo(); + } + + function revertingWithReason() external pure { + revert("revert reason"); + } + + function revertingWithCustomError() external pure { + revert CustomError(42); + } + + function testExpectEmitPreservesRevertWhenCallRevertsBeforeLog() public { + vm.expectEmit(); + emit Foo(); + + this.revertingBefore(true); + } + + function testExpectEmitPreservesRevertReason() public { + vm.expectEmit(); + emit Foo(); + + this.revertingWithReason(); + } + + function testExpectEmitPreservesCustomError() public { + vm.expectEmit(); + emit Foo(); + + this.revertingWithCustomError(); + } +} +"#, + ); + + cmd.arg("test").assert_failure().stdout_eq(str![[r#" +... +Ran 3 tests for test/Issue10463.t.sol:Issue10463Test +[FAIL: CustomError(42)] testExpectEmitPreservesCustomError() ([GAS]) +[FAIL: revert reason] testExpectEmitPreservesRevertReason() ([GAS]) +[FAIL: EvmError: Revert] testExpectEmitPreservesRevertWhenCallRevertsBeforeLog() ([GAS]) +Suite result: FAILED. 0 passed; 3 failed; 0 skipped; [ELAPSED] +... +"#]]); +}); + // https://github.com/foundry-rs/foundry/issues/12803 // Test gas underflow prevention on Cancun (no EIP-7702 gas floor) forgetest_init!(issue_12803_cancun, |prj, cmd| { diff --git a/crates/forge/tests/fixtures/ExpectRevertFailures.t.sol b/crates/forge/tests/fixtures/ExpectRevertFailures.t.sol index 7e482c6673155..838183a1b0b5e 100644 --- a/crates/forge/tests/fixtures/ExpectRevertFailures.t.sol +++ b/crates/forge/tests/fixtures/ExpectRevertFailures.t.sol @@ -233,6 +233,63 @@ contract ExpectRevertWithReverterFailureTest is DSTest { aContract.doNotRevert(); aContract.callAndRevert(); } + + // + // Regression: must fail because 0xdead is not the actual reverter when a + // top-level CREATE constructor reverts directly. + function testShouldFailExpectRevertWrongReverterTopLevelCreate() public { + vm.expectRevert(address(0xdead)); + new DContract(); + } + + // + // Regression: must fail because the reverter address argument is enforced + // even when an exact-bytes pattern is also supplied for a top-level CREATE. + function testShouldFailExpectRevertWithBytesWrongReverterTopLevelCreate() public { + vm.expectRevert(abi.encodePacked("Reverted by DContract"), address(0xdead)); + new DContract(); + } + + // + // Regression: must fail because the reverter address argument is enforced + // for `expectPartialRevert(bytes4, address)` against a top-level CREATE. + function testShouldFailExpectPartialRevertWrongReverterTopLevelCreate() public { + vm.expectPartialRevert(bytes4(keccak256("Error(string)")), address(0xdead)); + new DContract(); + } + + // + // Regression: must fail when the innermost reverting frame is a nested + // CREATE and the reverter address argument does not match the would-be + // deployed address of the failed deployment. + function testShouldFailExpectRevertWrongReverterNestedCreate() public { + vm.expectRevert(address(0xdead)); + new NestedDContractCreator(); + } + + // + // Regression: documents the intended semantics for nested CREATEs — the + // matched reverter is the *outer* would-be-deployed address (the contract + // whose deployment failed), NOT the innermost reverting CREATE's address. + // Supplying the inner address must fail. + function testShouldFailExpectRevertNestedCreateInnerAddress() public { + // Outer = NestedDContractCreator at this contract's next nonce. + // Inner = DContract created from inside the outer constructor (deployer + // is the outer, nonce 1). + address outer = + vm.computeCreateAddress(address(this), vm.getNonce(address(this))); + address inner = vm.computeCreateAddress(outer, 1); + vm.expectRevert(inner); + new NestedDContractCreator(); + } +} + +// Used by `testShouldFailExpectRevertWrongReverterNestedCreate`: a contract whose +// constructor directly creates another contract that reverts. +contract NestedDContractCreator { + constructor() { + new DContract(); + } } contract ExpectRevertCountFailureTest is DSTest { diff --git a/crates/script/src/execute.rs b/crates/script/src/execute.rs index 627bcfffd3802..8ad50bb1709f1 100644 --- a/crates/script/src/execute.rs +++ b/crates/script/src/execute.rs @@ -450,6 +450,8 @@ impl PreSimulationState { let should_include = match kind { TraceKind::Setup => verbosity >= 5, TraceKind::Execution => verbosity > 3, + TraceKind::AssertionTrigger => verbosity > 3, + TraceKind::Assertion => verbosity > 3, _ => false, } || !result.success; diff --git a/crates/script/src/verify.rs b/crates/script/src/verify.rs index ef10a1ce94082..fe1e9345fa23c 100644 --- a/crates/script/src/verify.rs +++ b/crates/script/src/verify.rs @@ -129,7 +129,7 @@ impl VerifyBundle { path: Some(artifact.source.to_string_lossy().to_string()), name: artifact .name - .strip_suffix(&format!(".{}", &artifact.profile)) + .strip_suffix(&format!(".{}", artifact.profile)) .unwrap_or_else(|| &artifact.name) .to_string(), }; diff --git a/crates/test-utils/src/prj.rs b/crates/test-utils/src/prj.rs index 96fa065317bec..462c5625f8975 100644 --- a/crates/test-utils/src/prj.rs +++ b/crates/test-utils/src/prj.rs @@ -22,7 +22,9 @@ use std::{ }, }; -use crate::util::{SOLC_VERSION, copy_dir_filtered, pretty_err}; +use crate::util::{ + SOLC_VERSION, copy_dir_filtered, pretty_err, test_config_default, test_config_for_style, +}; static CURRENT_DIR_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); @@ -177,8 +179,17 @@ impl TestProject { /// to a logical grouping of tests. pub fn new(name: &str, style: PathStyle) -> Self { let id = NEXT_ID.fetch_add(1, Ordering::SeqCst); - let project = pretty_err(name, TempProject::with_style(&format!("{name}-{id}"), style)); - Self::with_project(project) + let project = + pretty_err(name, TempProject::with_style(&format!("{name}-{id}"), style.clone())); + let this = Self::with_project(project); + // Write a foundry.toml so `forge` sees the same paths the TempProject scaffolds. + // Without this, Phylax's `assertions/*` defaults (Config::default()) take effect and + // `forge build|clean|...` look in directories the test never touches. + let config_path = this.config(); + if !config_path.exists() { + this.write_config(test_config_for_style(style)); + } + this } pub fn with_project(project: TempProject) -> Self { @@ -245,7 +256,7 @@ impl TestProject { .exists() .then_some(()) .and_then(|()| Config::load_with_root(self.root()).ok()) - .unwrap_or_default(); + .unwrap_or_else(test_config_default); config.remappings.clear(); f(&mut config); self.write_config(config); diff --git a/crates/test-utils/src/util.rs b/crates/test-utils/src/util.rs index d22e12736d832..8d245ba4e5d50 100644 --- a/crates/test-utils/src/util.rs +++ b/crates/test-utils/src/util.rs @@ -30,13 +30,48 @@ static TEMPLATE_LOCK: LazyLock = LazyLock::new(|| env::temp_dir().join("foundry-forge-test-template.lock")); /// The default Solc version used when compiling tests. -pub const SOLC_VERSION: &str = "0.8.33"; +pub const SOLC_VERSION: &str = "0.8.35"; /// Another Solc version used when compiling tests. /// /// Necessary to avoid downloading multiple versions. pub const OTHER_SOLC_VERSION: &str = "0.8.26"; +/// Returns a [`Config`] suitable for tests: starts from [`Config::default()`] but overrides the +/// Phylax `assertions/*` path defaults with upstream `src/`, `test/`, `script/`, ... matching +/// what `forge init` and `foundry-compilers` scaffold on disk. +pub fn test_config_default() -> Config { + test_config_for_style(foundry_compilers::PathStyle::Dapptools) +} + +/// Like [`test_config_default`], but produces a config whose `src`/`out`/`libs` match the given +/// `PathStyle` so that `forge` commands resolve the same locations as the `TempProject`. +pub fn test_config_for_style(style: foundry_compilers::PathStyle) -> Config { + let (src, out, libs) = match style { + foundry_compilers::PathStyle::HardHat => { + ("contracts", "artifacts", vec!["node_modules".into()]) + } + foundry_compilers::PathStyle::Dapptools => ("src", "out", vec!["lib".into()]), + }; + Config { + src: src.into(), + test: "test".into(), + script: "script".into(), + out: out.into(), + fs_permissions: foundry_config::FsPermissions::new([ + foundry_config::fs_permissions::PathPermission::read(out), + ]), + libs, + cache_path: "cache".into(), + broadcast: "broadcast".into(), + snapshots: "snapshots".into(), + test_failures_file: "cache/test-failures".into(), + fuzz: foundry_config::FuzzConfig::new("cache/fuzz".into()), + invariant: foundry_config::InvariantConfig::new("cache/invariant".into()), + ..Default::default() + } +} + /// Initializes a project with `forge init` at the given path from a template directory. /// /// This should be called after an empty project is created like in @@ -84,7 +119,7 @@ pub fn initialize(target: &Path) { cmd.args(["init", "--force", "--empty"]).assert_success(); prj.write_config(Config { solc: Some(foundry_config::SolcReq::Version(SOLC_VERSION.parse().unwrap())), - ..Default::default() + ..test_config_default() }); // Checkout forge-std. diff --git a/deny.toml b/deny.toml index 1a0e1e8e53005..d33e9002050ca 100644 --- a/deny.toml +++ b/deny.toml @@ -7,10 +7,30 @@ yanked = "warn" ignore = [ # https://rustsec.org/advisories/RUSTSEC-2024-0436 paste! is unmaintained "RUSTSEC-2024-0436", - # https://rustsec.org/advisories/RUSTSEC-2025-0141 bincode is unmaintained + # https://rustsec.org/advisories/RUSTSEC-2025-0141 bincode is unmaintained, need to transition all deps to wincode first "RUSTSEC-2025-0141", - # https://rustsec.org/advisories/RUSTSEC-2026-0097 rand is unsound with a custom logger + # https://rustsec.org/advisories/RUSTSEC-2023-0018 remove_dir_all vulnerability + # Transitive dep: sled -> assertion-executor. Not fixable until sled updates. + "RUSTSEC-2023-0018", + # https://rustsec.org/advisories/RUSTSEC-2025-0137 `reciprocal_mg10` OOB, unused + "RUSTSEC-2025-0137", + # https://rustsec.org/advisories/RUSTSEC-2018-0017 tempdir deprecated + # Transitive dep: sled -> assertion-executor. Not fixable until sled updates. + "RUSTSEC-2018-0017", + # https://rustsec.org/advisories/RUSTSEC-2026-0049 rustls-webpki CRL bypass — awaiting upstream update + "RUSTSEC-2026-0049", + # https://rustsec.org/advisories/RUSTSEC-2026-0097 rand unsoundness with custom logger — awaiting upstream update "RUSTSEC-2026-0097", + # https://rustsec.org/advisories/RUSTSEC-2026-0012 keccak ARMv8 asm — off-by-default `asm` feature, not enabled + "RUSTSEC-2026-0012", + # https://rustsec.org/advisories/RUSTSEC-2026-0098 rustls-webpki URI name constraint — awaiting upstream update + "RUSTSEC-2026-0098", + # https://rustsec.org/advisories/RUSTSEC-2026-0099 rustls-webpki wildcard name constraint — awaiting upstream update + "RUSTSEC-2026-0099", + # https://rustsec.org/advisories/RUSTSEC-2026-0103 thin-vec IntoIter UAF — awaiting upstream update + "RUSTSEC-2026-0103", + # https://rustsec.org/advisories/RUSTSEC-2026-0104 rustls-webpki CRL panic — awaiting upstream update + "RUSTSEC-2026-0104", ] # This section is considered when running `cargo deny check bans`. @@ -23,7 +43,11 @@ multiple-versions = "allow" wildcards = "allow" highlight = "all" # List of crates to deny -deny = [{ name = "openssl" }] +deny = [ + # openssl is banned but allowed when wrapped by native-tls + # (transitive dep from assertion-executor -> alloy -> reqwest -> native-tls) + { name = "openssl", wrappers = ["native-tls"] }, +] # Certain crates/versions that will be skipped when doing duplicate detection. skip = [] # Similarly to `skip` allows you to skip certain crates during duplicate @@ -65,12 +89,22 @@ exceptions = [ # CC0 is a permissive license but somewhat unclear status for source code # so we prefer to not have dependencies using it # https://tldrlegal.com/license/creative-commons-cc0-1.0-universal + { allow = ["CC0-1.0"], name = "tiny-keccak" }, { allow = ["CC0-1.0"], name = "trezor-client" }, { allow = ["CC0-1.0"], name = "notify" }, { allow = ["CC0-1.0"], name = "dunce" }, { allow = ["CC0-1.0"], name = "aurora-engine-modexp" }, - # Rendered mdBook HTML source code includes attribution as required by CC-BY-4.0 - { allow = ["CC-BY-4.0", "MIT"], name = "font-awesome-as-a-crate" }, + # font-awesome icons embedded as a crate; CC-BY-4.0 applies to the icon set. + { allow = ["CC-BY-4.0"], name = "font-awesome-as-a-crate" }, +] + +# Crates from credible-sdk don't have license fields +# These are internal/trusted dependencies - ignore unlicensed crates from these sources +[licenses.private] +ignore = true +registries = [] +ignore-sources = [ + "https://github.com/phylaxsystems/credible-sdk", ] # copyleft = "deny" @@ -98,20 +132,19 @@ unknown-registry = "warn" # in the allow list is encountered unknown-git = "deny" allow-git = [ - "https://github.com/alloy-rs/alloy", - "https://github.com/alloy-rs/evm", - "https://github.com/foundry-rs/foundry-core", - "https://github.com/paradigmxyz/revm-inspectors", "https://github.com/paradigmxyz/solar", - "https://github.com/bluealloy/revm", # Only for tests. "https://github.com/rust-cli/rexpect", # Tempo "https://github.com/tempoxyz/tempo", + # Tempo transitive: mpp-rs "https://github.com/tempoxyz/mpp-rs", # Transitive dependency of Tempo "https://github.com/paradigmxyz/reth", + # reth-core split crates pinned for 1.7.1-compatible API "https://github.com/paradigmxyz/reth-core", - # Temporary: upstream OP crates until release is published. + # OP fork: op-revm / alloy-op-evm / alloy-op-hardforks / op-alloy-* aligned with phoundry 1.7.1 "https://github.com/ethereum-optimism/optimism", + # Assertion executor and its dependencies + "https://github.com/phylaxsystems/credible-sdk", ] diff --git a/foundryup/README.md b/foundryup/README.md index 29e91378929cc..2cf61f8725227 100644 --- a/foundryup/README.md +++ b/foundryup/README.md @@ -30,10 +30,10 @@ To install the latest **nightly** version: foundryup --install nightly ``` -To install a specific version (e.g. `v1.6.0`): +To install a specific version (e.g. `v1.7.0`): ```sh -foundryup --install v1.6.0 +foundryup --install v1.7.0 ``` To **list** all **versions** installed: diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000000000..14eb32bef3a5b --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly" +components = ["rustfmt", "clippy"] \ No newline at end of file diff --git a/testdata/cheats/Vm.sol b/testdata/cheats/Vm.sol new file mode 100644 index 0000000000000..63cf8a539f15e --- /dev/null +++ b/testdata/cheats/Vm.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.2 <0.9.0; + +import {Vm as UtilsVm} from "../utils/Vm.sol"; + +interface Vm is UtilsVm {} diff --git a/testdata/default/cheats/Credible.t.sol b/testdata/default/cheats/Credible.t.sol new file mode 100644 index 0000000000000..8385651cda41b --- /dev/null +++ b/testdata/default/cheats/Credible.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity ^0.8.18; + +import "ds-test/test.sol"; +import "cheats/Vm.sol"; +import {Assertion} from "credible-std/Assertion.sol"; + +contract MockAssertion is Assertion { + MockContract mockContract; + + constructor(address mockContract_) { + mockContract = MockContract(mockContract_); + } + + function fnSelectors() external pure override returns (bytes4[] memory selectors) { + selectors = new bytes4[](2); + selectors[0] = this.assertIsOne.selector; + selectors[1] = this.assertIsTwo.selector; + } + + function assertIsOne() external view returns (bool) { + return mockContract.value() == 1; + } + + function assertIsTwo() external view returns (bool) { + return mockContract.value() == 2; + } +} + +contract MockContract { + uint256 public value = 1; + + function increment() public { + value++; + } +} + +contract CredibleTest is DSTest { + Vm constant vm = Vm(HEVM_ADDRESS); + + address assertionAdopter; + + address constant caller = address(0xdead); + + function setUp() public { + assertionAdopter = address(new MockContract()); + vm.deal(caller, 1 ether); + } + + function testAssertionPass() public { + emit log_address(assertionAdopter); + + bytes memory assertion = abi.encodePacked(type(MockAssertion).creationCode, abi.encode(assertionAdopter)); + + vm.assertion(assertionAdopter, assertion, MockAssertion.assertIsOne.selector); + assertTrue(MockContract(assertionAdopter).value() == 1); + + MockContract(assertionAdopter).increment(); + assertTrue(MockContract(assertionAdopter).value() == 2); + + vm.assertion(assertionAdopter, assertion, MockAssertion.assertIsTwo.selector); + assertTrue(MockContract(assertionAdopter).value() == 2); + } +} diff --git a/testdata/default/cheats/ExpectRevert.t.sol b/testdata/default/cheats/ExpectRevert.t.sol index 839d97962aa94..ae0c8ed844f5d 100644 --- a/testdata/default/cheats/ExpectRevert.t.sol +++ b/testdata/default/cheats/ExpectRevert.t.sol @@ -305,6 +305,91 @@ contract ExpectRevertWithReverterTest is Test { vm.expectRevert(address(cContract)); aContract.createDContractThroughCContract(); } + + // + // Regression: when the next operation is a top-level CREATE whose constructor + // reverts directly, the reverter address argument must be enforced (it used to + // be silently ignored). The matched reverter is the would-be-deployed address. + function testExpectRevertsWithReverterTopLevelCreate() public { + address expected = vm.computeCreateAddress(address(this), vm.getNonce(address(this))); + vm.expectRevert(expected); + new DContract(); + + expected = vm.computeCreateAddress(address(this), vm.getNonce(address(this))); + vm.expectRevert(abi.encodePacked("Reverted by DContract"), expected); + new DContract(); + } + + // + // Regression: when the next operation is a top-level CREATE whose constructor + // synchronously creates another contract that reverts (i.e. innermost frame is + // a CREATE), the matched reverter is the outer would-be-deployed address (the + // contract whose deployment failed). + function testExpectRevertsWithReverterNestedCreate() public { + address expected = vm.computeCreateAddress(address(this), vm.getNonce(address(this))); + vm.expectRevert(expected); + new NestedDContractCreator(); + } + + // + // Regression: `expectPartialRevert(bytes4, address)` overload must enforce + // the reverter address argument when matching a top-level CREATE revert. + function testExpectPartialRevertWithReverterTopLevelCreate() public { + address expected = vm.computeCreateAddress(address(this), vm.getNonce(address(this))); + // `Reverted by DContract` triggers Solidity's `Error(string)` selector. + vm.expectPartialRevert(bytes4(keccak256("Error(string)")), expected); + new DContract(); + } + + // + // Regression: `expectRevert(bytes4, address)` (exact 4-byte selector + reverter) + // overload must enforce the reverter address argument for a top-level CREATE. + function testExpectRevertWithBytes4SelectorAndReverterTopLevelCreate() public { + address expected = vm.computeCreateAddress(address(this), vm.getNonce(address(this))); + vm.expectRevert(DCustomErrorContract.CustomError.selector, expected); + new DCustomErrorContract(); + } + + // + // Regression: `expectRevert(address, uint64)` count-bearing overload must + // exercise the `count > 1` branch in `create_end`. Use CREATE2 with the same + // salt so both deploys would resolve to the same would-be address (each + // constructor reverts so no contract is ever actually placed there). + function testExpectRevertsWithReverterCountTopLevelCreate2() public { + bytes32 salt = bytes32(uint256(0x42)); + address expected = vm.computeCreate2Address(salt, keccak256(type(DContract).creationCode), address(this)); + vm.expectRevert(expected, 2); + new DContract{salt: salt}(); + new DContract{salt: salt}(); + } + + // + // Regression: CREATE2 deploys must also enforce the reverter address argument. + function testExpectRevertsWithReverterTopLevelCreate2() public { + bytes32 salt = bytes32(uint256(0xC0FFEE)); + address expected = vm.computeCreate2Address(salt, keccak256(type(DContract).creationCode), address(this)); + vm.expectRevert(expected); + new DContract{salt: salt}(); + } +} + +// Used by `testExpectRevertsWithReverterNestedCreate`: a contract whose constructor +// directly creates another contract that reverts. +contract NestedDContractCreator { + constructor() { + new DContract(); + } +} + +// Used by `testExpectRevertWithBytes4SelectorAndReverterTopLevelCreate`: constructor +// reverts with a parameter-less custom error so the full revert data is exactly the +// 4-byte selector. +contract DCustomErrorContract { + error CustomError(); + + constructor() { + revert CustomError(); + } } contract ExpectRevertCount is Test { diff --git a/testdata/default/cheats/Fork2.t.sol b/testdata/default/cheats/Fork2.t.sol index 0941e508483fd..d83c0480b7e72 100644 --- a/testdata/default/cheats/Fork2.t.sol +++ b/testdata/default/cheats/Fork2.t.sol @@ -325,6 +325,7 @@ contract ForkTest is Test { struct LegacyTransactionResult { bytes32 blockHash; bytes blockNumber; + bytes blockTimestamp; bytes chainId; address from; bytes gas; diff --git a/testdata/default/cheats/GetFoundryVersion.t.sol b/testdata/default/cheats/GetFoundryVersion.t.sol index 6139b8b6b6a5e..f01b7cdd7d213 100644 --- a/testdata/default/cheats/GetFoundryVersion.t.sol +++ b/testdata/default/cheats/GetFoundryVersion.t.sol @@ -84,4 +84,55 @@ contract GetFoundryVersionTest is Test { // Should return true for past versions assertTrue(vm.foundryVersionAtLeast("0.2.0")); } + + /// Returns the `MAJOR.MINOR.PATCH` prefix of `vm.getFoundryVersion()`, + /// stripping any pre-release suffix (`-nightly`, `-dev`, …) and the + /// `+..` build metadata. + function _semverPrefix() internal view returns (string memory) { + string[] memory plusSplit = vm.split(vm.getFoundryVersion(), "+"); + require(plusSplit.length == 2, "Invalid version format: Missing '+' separator"); + string[] memory dashSplit = vm.split(plusSplit[0], "-"); + return dashSplit[0]; + } + + function testGetFoundryVersionMajorMinorPatchIsParseable() public view { + // The MAJOR.MINOR.PATCH prefix must always be three numeric components, + // regardless of build kind (tagged release / nightly / dev). + string[] memory parts = vm.split(_semverPrefix(), "."); + require(parts.length == 3, "Invalid semver prefix: expected MAJOR.MINOR.PATCH"); + // Each component must parse as a uint (this reverts on garbage). + vm.parseUint(parts[0]); + vm.parseUint(parts[1]); + vm.parseUint(parts[2]); + } + + function testGetFoundryVersionBuildProfile() public view { + // The build profile must be present and non-empty (e.g. "debug", "release", "dist", …). + string[] memory plusSplit = vm.split(vm.getFoundryVersion(), "+"); + string[] memory metadataComponents = vm.split(plusSplit[1], "."); + require(bytes(metadataComponents[2]).length > 0, "Build profile is empty"); + } + + function testFoundryVersionCmpAndAtLeastAreConsistent() public { + // `foundryVersionAtLeast(v)` must equal `foundryVersionCmp(v) >= 0` for any input. + string[3] memory probes = ["0.0.1", _semverPrefix(), "99.0.0"]; + for (uint256 i = 0; i < probes.length; i++) { + assertEq(vm.foundryVersionAtLeast(probes[i]), vm.foundryVersionCmp(probes[i]) >= 0); + } + } + + function testFoundryVersionCmpRejectsPreRelease() public { + vm._expectCheatcodeRevert(); + vm.foundryVersionCmp("1.0.0-nightly"); + } + + function testFoundryVersionCmpRejectsBuildMetadata() public { + vm._expectCheatcodeRevert(); + vm.foundryVersionCmp("1.0.0+abc1234567.1700000000.release"); + } + + function testFoundryVersionCmpRejectsInvalidVersion() public { + vm._expectCheatcodeRevert(); + vm.foundryVersionCmp("not-a-version"); + } } diff --git a/testdata/default/cheats/MockCall.t.sol b/testdata/default/cheats/MockCall.t.sol index e2ac74d6f70fa..d8019ab4f6ee8 100644 --- a/testdata/default/cheats/MockCall.t.sol +++ b/testdata/default/cheats/MockCall.t.sol @@ -158,6 +158,35 @@ contract MockCallTest is Test { assertEq(mock.pay{value: 50}(1), 100); } + function testMockCallWithValueTransfersBalance() public { + Mock mock = new Mock(); + uint256 value = 10; + vm.deal(address(this), value); + + vm.mockCall(address(mock), value, abi.encodeWithSelector(mock.pay.selector), abi.encode(10)); + + assertEq(address(mock).balance, 0); + assertEq(mock.pay{value: value}(1), 10); + assertEq(address(mock).balance, value); + assertEq(address(this).balance, 0); + } + + function testMockCallWithValueTransfersPrankedSenderBalance() public { + Mock mock = new Mock(); + address sender = address(0xBEEF); + uint256 value = 10; + vm.deal(address(this), 0); + vm.deal(sender, value); + + vm.mockCall(address(mock), value, abi.encodeWithSelector(mock.pay.selector), abi.encode(10)); + + vm.prank(sender); + assertEq(mock.pay{value: value}(1), 10); + assertEq(address(mock).balance, value); + assertEq(address(this).balance, 0); + assertEq(sender.balance, 0); + } + function testMockCallWithValueCalldataPrecedence() public { Mock mock = new Mock(); @@ -279,17 +308,25 @@ contract MockCallRevertTest is Test { function testMockCallRevertWithValue() public { Mock mock = new Mock(); + uint256 value = 10; + vm.deal(address(this), value); - vm.mockCallRevert(address(mock), 10, abi.encodeWithSelector(mock.pay.selector), ERROR_MESSAGE); + vm.mockCallRevert(address(mock), value, abi.encodeWithSelector(mock.pay.selector), ERROR_MESSAGE); assertEq(mock.pay(1), 1); assertEq(mock.pay(2), 2); - try mock.pay{value: 10}(1) { + uint256 initSenderBalance = address(this).balance; + uint256 initTargetBalance = address(mock).balance; + + try mock.pay{value: value}(1) { revert(); } catch (bytes memory err) { require(keccak256(err) == keccak256(ERROR_MESSAGE)); } + + assertEq(address(this).balance, initSenderBalance); + assertEq(address(mock).balance, initTargetBalance); } function testMockCallResetsMockCallRevert() public { diff --git a/testdata/default/cheats/MockCalls.t.sol b/testdata/default/cheats/MockCalls.t.sol index e0f5eef151db6..777543f28e361 100644 --- a/testdata/default/cheats/MockCalls.t.sol +++ b/testdata/default/cheats/MockCalls.t.sol @@ -28,13 +28,17 @@ contract MockCallsTest is Test { mocks[0] = abi.encode(2 ether); mocks[1] = abi.encode(1 ether); mocks[2] = abi.encode(6.423 ether); + vm.deal(address(this), 3 ether); vm.mockCalls(mockErc20, 1 ether, data, mocks); (, bytes memory ret1) = mockErc20.call{value: 1 ether}(data); assertEq(abi.decode(ret1, (uint256)), 2 ether); + assertEq(mockErc20.balance, 1 ether); (, bytes memory ret2) = mockErc20.call{value: 1 ether}(data); assertEq(abi.decode(ret2, (uint256)), 1 ether); + assertEq(mockErc20.balance, 2 ether); (, bytes memory ret3) = mockErc20.call{value: 1 ether}(data); assertEq(abi.decode(ret3, (uint256)), 6.423 ether); + assertEq(mockErc20.balance, 3 ether); } function testMockCalls() public { diff --git a/testdata/forge-std-rev b/testdata/forge-std-rev index b1716a0a12950..977c31eec5512 100644 --- a/testdata/forge-std-rev +++ b/testdata/forge-std-rev @@ -1 +1 @@ -8987040ede9553cea20c95ad40d0455930f9c8e0 \ No newline at end of file +620536fa5277db4e3fd46772d5cbc1ea0696fb43 \ No newline at end of file diff --git a/testdata/foundry.lock b/testdata/foundry.lock new file mode 100644 index 0000000000000..979ae46488bea --- /dev/null +++ b/testdata/foundry.lock @@ -0,0 +1,8 @@ +{ + "lib/credible-std": { + "branch": { + "name": "feat/update-assertion-interface", + "rev": "04cd6ed6ce81b9eb09471e6a5b2512b833af4f9d" + } + } +} \ No newline at end of file diff --git a/testdata/foundry.toml b/testdata/foundry.toml index 6307668074860..0cbadeab61832 100644 --- a/testdata/foundry.toml +++ b/testdata/foundry.toml @@ -1,6 +1,11 @@ [profile.default] src = "src" test = "./" +out = "out" +cache_path = "cache" +broadcast = "broadcast" +snapshots = "snapshots" +test_failures_file = "cache/test-failures" optimizer = true optimizer_runs = 200 via_ir = false @@ -64,3 +69,7 @@ polkadotTestnet = "https://eth-rpc-testnet.polkadot.io" kusama = "https://eth-rpc-kusama.polkadot.io" polkadot = "https://eth-rpc.polkadot.io" rpcEnvAlias = "${RPC_ENV_ALIAS}" + +[profile.credible] +src = "./credible" +test = "./credible" diff --git a/testdata/lib/credible-std b/testdata/lib/credible-std new file mode 160000 index 0000000000000..04cd6ed6ce81b --- /dev/null +++ b/testdata/lib/credible-std @@ -0,0 +1 @@ +Subproject commit 04cd6ed6ce81b9eb09471e6a5b2512b833af4f9d diff --git a/testdata/lib/ds-test/src/test.sol b/testdata/lib/ds-test/src/test.sol new file mode 100644 index 0000000000000..02f5cea710014 --- /dev/null +++ b/testdata/lib/ds-test/src/test.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.4.23; + +import {DSTest as UtilsDSTest} from "../../../utils/DSTest.sol"; + +contract DSTest is UtilsDSTest {} diff --git a/testdata/remappings.txt b/testdata/remappings.txt new file mode 100644 index 0000000000000..ddd50dc64477e --- /dev/null +++ b/testdata/remappings.txt @@ -0,0 +1,2 @@ +ds-test/=lib/ds-test/src/ +credible-std/=lib/credible-std/src/ diff --git a/testdata/utils/Vm.sol b/testdata/utils/Vm.sol index d9f9b52821f52..94cf994dfb834 100644 --- a/testdata/utils/Vm.sol +++ b/testdata/utils/Vm.sol @@ -36,121 +36,122 @@ interface Vm { function addr(uint256 privateKey) external pure returns (address keyAddr); function allowCheatcodes(address account) external; function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure; - function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals, string calldata error) external pure; + function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals, string calldata err) external pure; function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure; - function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string calldata error) external pure; + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string calldata err) external pure; function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure; - function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata err) external pure; function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure; - function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata err) external pure; function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals) external pure; - function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error) external pure; + function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals, string calldata err) external pure; function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals) external pure; - function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error) external pure; + function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals, string calldata err) external pure; function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure; - function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) external pure; + function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata err) external pure; function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure; - function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure; + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata err) external pure; function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure; - function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; function assertEq(bool left, bool right) external pure; - function assertEq(bool left, bool right, string calldata error) external pure; + function assertEq(bool left, bool right, string calldata err) external pure; function assertEq(string calldata left, string calldata right) external pure; - function assertEq(string calldata left, string calldata right, string calldata error) external pure; + function assertEq(string calldata left, string calldata right, string calldata err) external pure; function assertEq(bytes calldata left, bytes calldata right) external pure; - function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + function assertEq(bytes calldata left, bytes calldata right, string calldata err) external pure; function assertEq(bool[] calldata left, bool[] calldata right) external pure; - function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + function assertEq(bool[] calldata left, bool[] calldata right, string calldata err) external pure; function assertEq(uint256[] calldata left, uint256[] calldata right) external pure; - function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata err) external pure; function assertEq(int256[] calldata left, int256[] calldata right) external pure; - function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + function assertEq(int256[] calldata left, int256[] calldata right, string calldata err) external pure; function assertEq(uint256 left, uint256 right) external pure; function assertEq(address[] calldata left, address[] calldata right) external pure; - function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + function assertEq(address[] calldata left, address[] calldata right, string calldata err) external pure; function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure; - function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata err) external pure; function assertEq(string[] calldata left, string[] calldata right) external pure; - function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + function assertEq(string[] calldata left, string[] calldata right, string calldata err) external pure; function assertEq(bytes[] calldata left, bytes[] calldata right) external pure; - function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; - function assertEq(uint256 left, uint256 right, string calldata error) external pure; + function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata err) external pure; + function assertEq(uint256 left, uint256 right, string calldata err) external pure; function assertEq(int256 left, int256 right) external pure; - function assertEq(int256 left, int256 right, string calldata error) external pure; + function assertEq(int256 left, int256 right, string calldata err) external pure; function assertEq(address left, address right) external pure; - function assertEq(address left, address right, string calldata error) external pure; + function assertEq(address left, address right, string calldata err) external pure; function assertEq(bytes32 left, bytes32 right) external pure; - function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; + function assertEq(bytes32 left, bytes32 right, string calldata err) external pure; function assertFalse(bool condition) external pure; - function assertFalse(bool condition, string calldata error) external pure; + function assertFalse(bool condition, string calldata err) external pure; function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure; - function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; function assertGe(uint256 left, uint256 right) external pure; - function assertGe(uint256 left, uint256 right, string calldata error) external pure; + function assertGe(uint256 left, uint256 right, string calldata err) external pure; function assertGe(int256 left, int256 right) external pure; - function assertGe(int256 left, int256 right, string calldata error) external pure; + function assertGe(int256 left, int256 right, string calldata err) external pure; function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure; - function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; function assertGt(uint256 left, uint256 right) external pure; - function assertGt(uint256 left, uint256 right, string calldata error) external pure; + function assertGt(uint256 left, uint256 right, string calldata err) external pure; function assertGt(int256 left, int256 right) external pure; - function assertGt(int256 left, int256 right, string calldata error) external pure; + function assertGt(int256 left, int256 right, string calldata err) external pure; function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure; - function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; function assertLe(uint256 left, uint256 right) external pure; - function assertLe(uint256 left, uint256 right, string calldata error) external pure; + function assertLe(uint256 left, uint256 right, string calldata err) external pure; function assertLe(int256 left, int256 right) external pure; - function assertLe(int256 left, int256 right, string calldata error) external pure; + function assertLe(int256 left, int256 right, string calldata err) external pure; function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure; - function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; function assertLt(uint256 left, uint256 right) external pure; - function assertLt(uint256 left, uint256 right, string calldata error) external pure; + function assertLt(uint256 left, uint256 right, string calldata err) external pure; function assertLt(int256 left, int256 right) external pure; - function assertLt(int256 left, int256 right, string calldata error) external pure; + function assertLt(int256 left, int256 right, string calldata err) external pure; function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; - function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata err) external pure; function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure; - function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata err) external pure; function assertNotEq(bool left, bool right) external pure; - function assertNotEq(bool left, bool right, string calldata error) external pure; + function assertNotEq(bool left, bool right, string calldata err) external pure; function assertNotEq(string calldata left, string calldata right) external pure; - function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; + function assertNotEq(string calldata left, string calldata right, string calldata err) external pure; function assertNotEq(bytes calldata left, bytes calldata right) external pure; - function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + function assertNotEq(bytes calldata left, bytes calldata right, string calldata err) external pure; function assertNotEq(bool[] calldata left, bool[] calldata right) external pure; - function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata err) external pure; function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure; - function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata err) external pure; function assertNotEq(int256[] calldata left, int256[] calldata right) external pure; - function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata err) external pure; function assertNotEq(uint256 left, uint256 right) external pure; function assertNotEq(address[] calldata left, address[] calldata right) external pure; - function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + function assertNotEq(address[] calldata left, address[] calldata right, string calldata err) external pure; function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure; - function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata err) external pure; function assertNotEq(string[] calldata left, string[] calldata right) external pure; - function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + function assertNotEq(string[] calldata left, string[] calldata right, string calldata err) external pure; function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure; - function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; - function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; + function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata err) external pure; + function assertNotEq(uint256 left, uint256 right, string calldata err) external pure; function assertNotEq(int256 left, int256 right) external pure; - function assertNotEq(int256 left, int256 right, string calldata error) external pure; + function assertNotEq(int256 left, int256 right, string calldata err) external pure; function assertNotEq(address left, address right) external pure; - function assertNotEq(address left, address right, string calldata error) external pure; + function assertNotEq(address left, address right, string calldata err) external pure; function assertNotEq(bytes32 left, bytes32 right) external pure; - function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; + function assertNotEq(bytes32 left, bytes32 right, string calldata err) external pure; function assertTrue(bool condition) external pure; - function assertTrue(bool condition, string calldata error) external pure; + function assertTrue(bool condition, string calldata err) external pure; + function assertion(address adopter, bytes calldata createData, bytes4 fnSelector) external; function assume(bool condition) external pure; function assumeNoRevert() external pure; function assumeNoRevert(PotentialRevert calldata potentialRevert) external pure;