From 4fa7de055d461b7fa948eb56107b7a172459e8fc Mon Sep 17 00:00:00 2001 From: Wolfgang Welz Date: Mon, 7 Oct 2024 17:11:36 +0100 Subject: [PATCH] Cherry-pick main and set version to 1.1.4 (#284) Cherry picks all changes to Steel since the last release of Steel. Updates all versions to 1.1.4, including Steel. **This PR marks the 1.0 release of Steel** --------- Co-authored-by: capossele Co-authored-by: Victor Graf Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sasha <33594434+sashaaldrick@users.noreply.github.com> --- .github/scripts/cargo-check.sh | 12 + .github/scripts/cargo-clippy.sh | 11 + .github/scripts/cargo-test.sh | 12 + .github/scripts/forge-check.sh | 11 + .github/scripts/forge-test.sh | 11 + .github/workflows/bonsai.yml | 59 - .github/workflows/e2e.yml | 101 ++ .github/workflows/main.yml | 124 +- Cargo.lock | 993 ++++----------- Cargo.toml | 30 +- README.md | 2 +- RELEASE.md | 18 +- contracts/generate_contract_address_table.py | 111 ++ .../src/groth16/RiscZeroGroth16Verifier.sol | 2 +- contracts/src/steel/Steel.sol | 46 +- contracts/version-management-design.md | 8 +- examples/erc20-counter/.env | 1 - examples/erc20-counter/Cargo.lock | 1011 ++++------------ examples/erc20-counter/Cargo.toml | 2 +- examples/erc20-counter/README.md | 2 +- examples/erc20-counter/apps/README.md | 31 +- .../erc20-counter/apps/src/bin/publisher.rs | 55 +- .../contracts/script/DeployCounter.s.sol | 20 +- .../contracts/test/Counter.t.sol | 12 +- examples/erc20-counter/deployment-guide.md | 90 +- examples/erc20-counter/e2e-test.sh | 43 + examples/erc20-counter/foundry.toml | 3 + examples/erc20-counter/methods/README.md | 4 +- examples/erc20-counter/methods/build.rs | 1 + .../erc20-counter/methods/guest/Cargo.lock | 141 +-- examples/erc20-counter/rust-toolchain.toml | 5 +- .../erc20-counter/test-local-deployment.sh | 61 - examples/erc20/Cargo.lock | 975 ++++----------- examples/erc20/README.md | 2 +- examples/erc20/host/src/main.rs | 14 +- examples/erc20/methods/guest/Cargo.lock | 141 +-- examples/erc20/methods/guest/src/main.rs | 2 +- examples/erc20/rust-toolchain.toml | 2 +- examples/governance/Cargo.lock | 1061 ++++------------ examples/governance/README.md | 2 +- examples/governance/apps/Cargo.toml | 2 +- examples/governance/methods/guest/Cargo.lock | 21 +- examples/governance/methods/src/lib.rs | 6 +- examples/token-stats/Cargo.lock | 1025 ++++------------ examples/token-stats/Cargo.toml | 3 +- examples/token-stats/README.md | 2 +- examples/token-stats/core/Cargo.toml | 2 +- examples/token-stats/host/Cargo.toml | 4 +- examples/token-stats/host/src/main.rs | 9 +- examples/token-stats/methods/Cargo.toml | 2 +- examples/token-stats/methods/guest/Cargo.toml | 2 +- .../token-stats/methods/guest/src/main.rs | 2 +- examples/token-stats/rust-toolchain.toml | 4 +- ffi/README.md | 2 - ffi/guests/echo/Cargo.lock | 1062 +++++++++++++++++ steel/CHANGELOG.md | 19 +- steel/Cargo.toml | 20 +- steel/README.md | 167 +-- steel/docs/create-steel-app/README.md | 51 + steel/docs/create-steel-app/create-steel-app | 179 +++ steel/docs/how-does-steel-work.md | 129 ++ steel/docs/steel-commitments.md | 139 +++ steel/docs/what-is-steel.md | 73 ++ steel/src/beacon.rs | 484 +++++--- steel/src/block.rs | 49 +- steel/src/config.rs | 103 +- steel/src/contract.rs | 120 +- steel/src/ethereum.rs | 4 +- steel/src/host/builder.rs | 282 +++++ steel/src/host/db/alloy.rs | 25 +- steel/src/host/db/proof.rs | 55 +- steel/src/host/mod.rs | 231 ++-- steel/src/lib.rs | 205 +++- steel/src/merkle.rs | 114 ++ steel/src/mpt.rs | 151 ++- steel/src/serde.rs | 21 +- steel/src/state.rs | 68 +- steel/steel-banner.png | Bin 739012 -> 738290 bytes steel/testdata/corrupt_beacon_proof.json | 1 + .../corrupt_header_beacon_commitment.json | 1 + steel/tests/common/mod.rs | 4 +- steel/tests/corruption.rs | 423 +++++++ steel/tests/steel.rs | 103 +- 83 files changed, 5505 insertions(+), 5096 deletions(-) create mode 100755 .github/scripts/cargo-check.sh create mode 100755 .github/scripts/cargo-clippy.sh create mode 100755 .github/scripts/cargo-test.sh create mode 100755 .github/scripts/forge-check.sh create mode 100755 .github/scripts/forge-test.sh delete mode 100644 .github/workflows/bonsai.yml create mode 100644 .github/workflows/e2e.yml create mode 100644 contracts/generate_contract_address_table.py delete mode 100644 examples/erc20-counter/.env create mode 100755 examples/erc20-counter/e2e-test.sh delete mode 100755 examples/erc20-counter/test-local-deployment.sh create mode 100644 ffi/guests/echo/Cargo.lock create mode 100644 steel/docs/create-steel-app/README.md create mode 100755 steel/docs/create-steel-app/create-steel-app create mode 100644 steel/docs/how-does-steel-work.md create mode 100644 steel/docs/steel-commitments.md create mode 100644 steel/docs/what-is-steel.md create mode 100644 steel/src/host/builder.rs create mode 100644 steel/src/merkle.rs create mode 100644 steel/testdata/corrupt_beacon_proof.json create mode 100644 steel/testdata/corrupt_header_beacon_commitment.json create mode 100644 steel/tests/corruption.rs diff --git a/.github/scripts/cargo-check.sh b/.github/scripts/cargo-check.sh new file mode 100755 index 00000000..dd6c6845 --- /dev/null +++ b/.github/scripts/cargo-check.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +fmt_sort(){ + while read path; do + printf "Project: %s\n" "$path" + cargo fmt --all --check --manifest-path "$path" + (cd "${path%/*}"; cargo sort --workspace --check) + done +} + +grep -rl --include "Cargo.toml" '\[workspace\]' | sort -u | fmt_sort diff --git a/.github/scripts/cargo-clippy.sh b/.github/scripts/cargo-clippy.sh new file mode 100755 index 00000000..7cd53210 --- /dev/null +++ b/.github/scripts/cargo-clippy.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +clippy(){ + while read path; do + printf "Project: %s\n" "$path" + cargo clippy --workspace --all-targets --all-features --manifest-path "$path" + done +} + +grep -rl --include "Cargo.toml" '\[workspace\]' | sort -u | clippy diff --git a/.github/scripts/cargo-test.sh b/.github/scripts/cargo-test.sh new file mode 100755 index 00000000..a15b9d3a --- /dev/null +++ b/.github/scripts/cargo-test.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +build_test(){ + while read path; do + printf "Project: %s\n" "$path" + cargo build --workspace --all-features --manifest-path "$path" + cargo test --workspace --all-features --manifest-path "$path" + done +} + +find . -maxdepth 2 -mindepth 2 -name 'Cargo.toml' | sort -u | build_test diff --git a/.github/scripts/forge-check.sh b/.github/scripts/forge-check.sh new file mode 100755 index 00000000..a6aaf9f8 --- /dev/null +++ b/.github/scripts/forge-check.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +fmt(){ + while read path; do + printf "Project: %s\n" "$path" + (cd "${path%/*}"; forge fmt --check) + done +} + +find . -maxdepth 2 -mindepth 2 -name 'foundry.toml' | sort -u | fmt diff --git a/.github/scripts/forge-test.sh b/.github/scripts/forge-test.sh new file mode 100755 index 00000000..28396bf4 --- /dev/null +++ b/.github/scripts/forge-test.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +test(){ + while read path; do + printf "Project: %s\n" "$path" + (cd "${path%/*}"; forge test -vvvv) + done +} + +find . -maxdepth 2 -mindepth 2 -name 'foundry.toml' | sort -u | test diff --git a/.github/workflows/bonsai.yml b/.github/workflows/bonsai.yml deleted file mode 100644 index 31af2496..00000000 --- a/.github/workflows/bonsai.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Bonsai integration - -on: - pull_request: - branches: ["release-*"] - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -# this is needed to gain access via OIDC to the S3 bucket for caching -permissions: - id-token: write - contents: read - -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RISC0_TOOLCHAIN_VERSION: r0.1.79.0-2 - RISC0_MONOREPO_REF: "release-1.1" - -jobs: - e2e-test: - runs-on: [self-hosted, prod, "${{ matrix.os }}"] - strategy: - fail-fast: false - matrix: - include: - - os: Linux - feature: default - steps: - # This is a workaround from: https://github.com/actions/checkout/issues/590#issuecomment-970586842 - - run: "git checkout -f $(git -c user.name=x -c user.email=x@x commit-tree $(git hash-object -t tree /dev/null) < /dev/null) || :" - - uses: actions/checkout@v4 - with: - submodules: recursive - - uses: risc0/risc0/.github/actions/rustup@main - - uses: risc0/risc0/.github/actions/sccache@main - with: - key: ${{ matrix.os }}-${{ matrix.feature }} - - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f - - uses: actions/setup-node@v4 - with: - node-version: 18 - - uses: ./.github/actions/cargo-risczero-install - with: - ref: ${{ env.RISC0_MONOREPO_REF }} - toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} - features: ${{ matrix.feature }} - - name: build erc20-Counter - run: cargo build - working-directory: examples/erc20-counter - - name: test erc20-Counter - run: ./test-local-deployment.sh - env: - BONSAI_API_URL: ${{ secrets.BONSAI_API_URL }} - BONSAI_API_KEY: ${{ secrets.BONSAI_API_KEY }} - working-directory: examples/erc20-counter - - run: sccache --show-stats diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 00000000..0c95255d --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,101 @@ +name: Testnet + +on: + merge_group: + pull_request: + branches: [main, "release-*"] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +# this is needed to gain access via OIDC to the S3 bucket for caching +permissions: + id-token: write + contents: read + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RISC0_TOOLCHAIN_VERSION: r0.1.79.0-2 + RISC0_MONOREPO_REF: "release-1.1" + +jobs: + e2e-tests: + runs-on: [self-hosted, prod, "${{ matrix.os }}", "${{ matrix.device }}"] + strategy: + matrix: + prover: [bonsai, local] + release: + - ${{ startsWith(github.base_ref, 'release-') || startsWith(github.base_ref, 'refs/heads/release-') }} + # Run on Linux with GPU for faster local proving. + include: + - os: Linux + feature: cuda + device: nvidia_rtx_a5000 + # Exclude Bonsai proving on non-release branches. + exclude: + - release: false + prover: bonsai + env: + RUST_BACKTRACE: full + steps: + # This is a workaround from: https://github.com/actions/checkout/issues/590#issuecomment-970586842 + - run: "git checkout -f $(git -c user.name=x -c user.email=x@x commit-tree $(git hash-object -t tree /dev/null) < /dev/null) || :" + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Use Bonsai for release branches + if: matrix.prover == 'bonsai' + run: | + echo "BONSAI_API_URL=${{ secrets.BONSAI_API_URL }}" >> $GITHUB_ENV + echo "BONSAI_API_KEY=${{ secrets.BONSAI_API_KEY }}" >> $GITHUB_ENV + - if: matrix.feature == 'cuda' + uses: risc0/risc0/.github/actions/cuda@main + - uses: risc0/risc0/.github/actions/rustup@main + - uses: risc0/risc0/.github/actions/sccache@main + with: + key: ${{ matrix.os }}-${{ matrix.feature }} + - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f + - uses: ./.github/actions/cargo-risczero-install + with: + ref: ${{ env.RISC0_MONOREPO_REF }} + toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} + features: ${{ matrix.feature }} + - name: Setup Kurtosis + run: | + echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list + sudo apt update + sudo apt install kurtosis-cli + kurtosis analytics disable + echo "$(dirname $(which kurtosis))" >> $GITHUB_PATH + shell: bash + - name: Start local Ethereum testnet + run: | + kurtosis --enclave local-eth-testnet run github.com/ethpandaops/ethereum-package@2e9e5a41784f792a206f1a108c2c96830b2c95ef + echo "ETH_TESTNET_EL_URL=http://$(kurtosis port print local-eth-testnet el-1-geth-lighthouse rpc)" >> $GITHUB_ENV + echo "ETH_TESTNET_CL_URL=$(kurtosis port print local-eth-testnet cl-1-lighthouse-geth http)" >> $GITHUB_ENV + - name: Wait for the local Ethereum testnet to come up + run: while [ $(cast rpc --rpc-url $ETH_TESTNET_EL_URL eth_blockNumber | jq -re) == "0x0" ]; do sleep 5; done + shell: bash + - run: cargo build + working-directory: examples/erc20-counter + - name: Run E2E test (Block Commitment) + run: ./e2e-test.sh + env: + ETH_RPC_URL: ${{ env.ETH_TESTNET_EL_URL }} + ETH_WALLET_ADDRESS: "0x802dCbE1B1A97554B4F50DB5119E37E8e7336417" + ETH_WALLET_PRIVATE_KEY: "0x5d2344259f42259f82d2c140aa66102ba89b57b4883ee441a8b312622bd42491" + working-directory: examples/erc20-counter + - name: Run E2E test (Beacon Commitment) + run: ./e2e-test.sh + env: + ETH_RPC_URL: ${{ env.ETH_TESTNET_EL_URL }} + BEACON_API_URL: ${{ env.ETH_TESTNET_CL_URL }} + ETH_WALLET_ADDRESS: "0x802dCbE1B1A97554B4F50DB5119E37E8e7336417" + ETH_WALLET_PRIVATE_KEY: "0x5d2344259f42259f82d2c140aa66102ba89b57b4883ee441a8b312622bd42491" + working-directory: examples/erc20-counter + - name: Stop local Ethereum testnet + if: always() + run: kurtosis enclave rm -f local-eth-testnet + - run: sccache --show-stats diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d25220d4..5c0b3298 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,7 +4,6 @@ on: merge_group: pull_request: branches: [main, "release-*"] - workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -28,7 +27,7 @@ jobs: - check - doc - docs-rs - - test + - test-risc0-ethereum runs-on: ubuntu-latest steps: - name: Check all job status @@ -44,24 +43,26 @@ jobs: with: # Full history is required by license-check.py fetch-depth: 0 - submodules: recursive - uses: risc0/risc0/.github/actions/rustup@main - name: Install cargo-sort uses: risc0/cargo-install@b9307573043522ab0d3e3be64a51763b765b52a4 with: crate: cargo-sort version: "1.0" - - uses: actions/setup-node@v3 - with: - node-version: 18 + - name: cargo check risc0-ethereum + run: | + cargo fmt --all --check + cargo sort --workspace --check + - name: cargo check examples + run: ../.github/scripts/cargo-check.sh + working-directory: examples - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f - - run: cargo fmt --all --check - - run: cargo sort --workspace --check - - run: cargo clippy --workspace - env: - RISC0_SKIP_BUILD: true - - run: forge fmt --check + - name: forge check risc0-ethereum + run: forge fmt --check working-directory: contracts + - name: forge check examples + run: ../.github/scripts/forge-check.sh + working-directory: examples - uses: actions/setup-python@v4 with: python-version: "3.10" @@ -70,7 +71,44 @@ jobs: run: | [ "$(grep -re 'DO[_ ]\?NOT[_ ]\?MERGE' $(git ls-tree --full-tree --name-only -r HEAD) | tee /dev/fd/2 | wc -l)" -eq "0" ] - test: + clippy: + runs-on: [self-hosted, prod, "${{ matrix.os }}", "${{ matrix.device }}"] + strategy: + # Run only on Linux with CPU. + matrix: + include: + - os: Linux + feature: default + device: cpu + steps: + # This is a workaround from: https://github.com/actions/checkout/issues/590#issuecomment-970586842 + - run: "git checkout -f $(git -c user.name=x -c user.email=x@x commit-tree $(git hash-object -t tree /dev/null) < /dev/null) || :" + - uses: actions/checkout@v4 + - if: matrix.feature == 'cuda' + uses: risc0/risc0/.github/actions/cuda@main + - uses: risc0/risc0/.github/actions/rustup@main + - uses: risc0/risc0/.github/actions/sccache@main + with: + key: ${{ matrix.os }}-${{ matrix.feature }} + - uses: ./.github/actions/cargo-risczero-install + with: + ref: ${{ env.RISC0_MONOREPO_REF }} + toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} + features: ${{ matrix.feature }} + - name: cargo clippy risc0-ethereum + run: cargo clippy --workspace --all-targets --all-features + env: + RUSTFLAGS: -Dwarnings + RISC0_SKIP_BUILD: true + - name: cargo clippy all examples + run: ../.github/scripts/cargo-clippy.sh + working-directory: examples + env: + RUSTFLAGS: -Dwarnings + RISC0_SKIP_BUILD: true + - run: sccache --show-stats + + test-risc0-ethereum: runs-on: [self-hosted, prod, "${{ matrix.os }}", "${{ matrix.device }}"] strategy: fail-fast: false @@ -106,11 +144,12 @@ jobs: toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} features: ${{ matrix.feature }} - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f - - name: build workspace - run: cargo test --workspace --timings --no-run - - name: test workspace - run: cargo test --workspace --timings - - uses: actions/upload-artifact@v3 + - name: cargo build + run: cargo build --workspace --all-features + - name: cargo test + run: cargo test --workspace --all-features --timings + - name: Upload timings artifacts + uses: actions/upload-artifact@v3 with: name: cargo-timings-${{ matrix.os }}-${{ matrix.device }} path: target/cargo-timings/ @@ -122,13 +161,14 @@ jobs: examples: runs-on: [self-hosted, prod, "${{ matrix.os }}", "${{ matrix.device }}"] strategy: - fail-fast: false - # Run only on Linux with GPU. Additional coverage is marginal, and GPU is fastest. + # Run only on Linux with CPU. Additional coverage is marginal. matrix: include: - os: Linux - feature: cuda - device: nvidia_rtx_a5000 + feature: default + device: cpu + env: + RUST_BACKTRACE: full steps: # This is a workaround from: https://github.com/actions/checkout/issues/590#issuecomment-970586842 - run: "git checkout -f $(git -c user.name=x -c user.email=x@x commit-tree $(git hash-object -t tree /dev/null) < /dev/null) || :" @@ -141,34 +181,18 @@ jobs: - uses: risc0/risc0/.github/actions/sccache@main with: key: ${{ matrix.os }}-${{ matrix.feature }} - - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f - - uses: actions/setup-node@v4 - with: - node-version: 18 - uses: ./.github/actions/cargo-risczero-install with: ref: ${{ env.RISC0_MONOREPO_REF }} toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} features: ${{ matrix.feature }} - - name: build erc20 - run: cargo build - working-directory: examples/erc20 - - name: build erc20-Counter - run: cargo build - working-directory: examples/erc20-counter - - name: forge test erc20-Counter - run: forge test - working-directory: examples/erc20-counter - env: - ETH_RPC_URL: https://ethereum-sepolia-rpc.publicnode.com - - name: build token-stats - run: cargo build - working-directory: examples/token-stats - - name: test erc20-Counter - run: ./test-local-deployment.sh - working-directory: examples/erc20-counter - env: - RISC0_DEV_MODE: true + - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f + - name: cargo test all examples + run: ../.github/scripts/cargo-test.sh + working-directory: examples + - name: forge test all examples + run: ../.github/scripts/forge-test.sh + working-directory: examples - run: sccache --show-stats doc: @@ -180,17 +204,9 @@ jobs: with: submodules: recursive - uses: risc0/risc0/.github/actions/rustup@main - - uses: risc0/risc0/.github/actions/sccache@main - with: - key: macOS-default - uses: risc0/foundry-toolchain@2fe7e70b520f62368a0e3c464f997df07ede420f - - uses: ./.github/actions/cargo-risczero-install - with: - ref: ${{ env.RISC0_MONOREPO_REF }} - toolchain-version: ${{ env.RISC0_TOOLCHAIN_VERSION }} - run: cargo doc --no-deps --workspace - run: forge doc - #- run: sccache --show-stats # Run as a separate job because we need to install a different set of tools. # In particular, it uses nightly Rust and _does not_ install Forge or cargo risczero. @@ -200,8 +216,6 @@ jobs: # This is a workaround from: https://github.com/actions/checkout/issues/590#issuecomment-970586842 - run: "git checkout -f $(git -c user.name=x -c user.email=x@x commit-tree $(git hash-object -t tree /dev/null) < /dev/null) || :" - uses: actions/checkout@v4 - with: - submodules: recursive - uses: risc0/risc0/.github/actions/rustup@main with: # Building with docs.rs config requires the nightly toolchain. diff --git a/Cargo.lock b/Cargo.lock index 64fa9b41..0eb63737 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -46,9 +46,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37d89f69cb43901949ba29307ada8b9e3b170f94057ad4c04d6fd169d24d65f" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" dependencies = [ "alloy-consensus", "alloy-contract", @@ -67,9 +67,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609d6ef5716e94875b19b91faf33ef041baff373d3fff70531424f372d27bbd2" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" dependencies = [ "num_enum", "strum", @@ -77,29 +77,31 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", + "derive_more 1.0.0", "serde", ] [[package]] name = "alloy-contract" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335d62de1a887f1b780441f8a3037f39c9fb26839cc9acd891c9b80396145cd5" +checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-network", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-provider", "alloy-rpc-types-eth", "alloy-sol-types", @@ -111,24 +113,25 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b095eb0533144b4497e84a9cc3e44a5c2e3754a3983c0376a55a2f9183a53e" +checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", + "alloy-rlp", "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4004925bff5ba0a11739ae84dbb6601a981ea692f3bd45b626935ee90a6b8471" +checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "alloy-sol-types", "const-hex", @@ -144,7 +147,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "serde", ] @@ -155,7 +158,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "k256 0.13.4", "serde", @@ -163,13 +166,13 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "c-kzg", @@ -181,22 +184,22 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "serde", "serde_json", @@ -204,11 +207,11 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-types", "serde", "serde_json", @@ -218,15 +221,15 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe714e233f9eaf410de95a9af6bcd05d3a7f8c8de7a0817221e95a6b642a080" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -239,25 +242,27 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c5a38117974c5776a45e140226745a0b664f79736aa900995d8e4121558e064" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ + "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] [[package]] name = "alloy-node-bindings" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d149d4f3147b3494e1b1db8704e9fdb579e8c666c3deb7d070ebd5f38c2abb15" +checksum = "4f1334a738aa1710cb8227441b3fcc319202ce78e967ef37406940242df4a454" dependencies = [ "alloy-genesis", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "k256 0.13.4", + "rand", "serde_json", "tempfile", "thiserror", @@ -281,7 +286,7 @@ dependencies = [ "k256 0.13.4", "keccak-asm", "proptest", - "rand 0.8.5", + "rand", "ruint", "serde", "tiny-keccak", @@ -289,31 +294,36 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more 1.0.0", + "hashbrown 0.14.5", "hex-literal", + "indexmap 2.6.0", "itoa", "k256 0.13.4", "keccak-asm", + "paste", "proptest", - "rand 0.8.5", + "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65633d6ef83c3626913c004eaf166a6dd50406f724772ea8567135efd6dc5d3" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" dependencies = [ "alloy-chains", "alloy-consensus", @@ -322,7 +332,7 @@ dependencies = [ "alloy-network", "alloy-network-primitives", "alloy-node-bindings", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-client", "alloy-rpc-types-anvil", "alloy-rpc-types-eth", @@ -337,7 +347,7 @@ dependencies = [ "futures-utils-wasm", "lru", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "thiserror", @@ -370,16 +380,17 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" dependencies = [ "alloy-json-rpc", + "alloy-primitives 0.8.5", "alloy-transport", "alloy-transport-http", "futures", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "tokio", @@ -391,10 +402,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -402,52 +414,52 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25cb45ad7c0930dd62eecf164d2afe4c3d2dd2c82af85680ad1f118e1e5cb83" +checksum = "d780adaa5d95b07ad92006b2feb68ecfa7e2015f7d5976ceaac4c906c73ebd07" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a59b1d7c86e0a653e7f3d29954f6de5a2878d8cfd1f010ff93be5c2c48cd3b1" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "alloy-sol-types", + "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", - "thiserror", ] [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "serde", "serde_json", ] [[package]] name = "alloy-signer" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "async-trait", "auto_impl", "elliptic-curve 0.13.8", @@ -457,25 +469,25 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fabe917ab1778e760b4701628d1cae8e028ee9d52ac6307de4e1e9286ab6b5f" +checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" dependencies = [ "alloy-consensus", "alloy-network", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-signer", "async-trait", "k256 0.13.4", - "rand 0.8.5", + "rand", "thiserror", ] [[package]] name = "alloy-sol-macro" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0458ccb02a564228fcd76efb8eb5a520521a8347becde37b402afec9a1b83859" +checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -487,9 +499,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc65475025fc1e84bf86fc840f04f63fcccdcf3cf12053c99918e4054dfbc69" +checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -506,9 +518,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed10f0715a0b69fde3236ff3b9ae5f6f7c97db5a387747100070d3016b9266b" +checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" dependencies = [ "alloy-json-abi", "const-hex", @@ -523,9 +535,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", @@ -533,12 +545,12 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-macro", "const-hex", "serde", @@ -546,9 +558,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -565,13 +577,13 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.8", + "reqwest", "serde_json", "tower", "tracing", @@ -580,14 +592,13 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a46c9c4fdccda7982e7928904bd85fe235a0404ee3d7e197fff13d61eac8b4f" +checksum = "e9703ce68b97f8faae6f7739d1e003fc97621b856953cbcdbb2b515743f23288" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "derive_more 1.0.0", - "hashbrown 0.14.5", "nybbles", "serde", "smallvec", @@ -870,7 +881,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -880,7 +891,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -895,31 +906,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-sse" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" -dependencies = [ - "async-channel", - "futures-lite", - "http-types", - "log", - "memchr", - "pin-project-lite", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -953,6 +939,12 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "aurora-engine-modexp" version = "1.1.0" @@ -1013,12 +1005,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -1031,25 +1017,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "beacon-api-client" -version = "0.1.0" -source = "git+https://github.com/ralexstokes/ethereum-consensus.git?rev=cf3c404043230559660810bc0c9d6d5a8498d819#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "clap", - "ethereum-consensus", - "http 0.2.12", - "itertools 0.10.5", - "mev-share-sse", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - [[package]] name = "bincode" version = "1.3.3" @@ -1155,7 +1122,7 @@ checksum = "94032d3eece78099780ba07605d8ba6943e47ee152f76d73f1682e2f40cf889c" dependencies = [ "duplicate", "maybe-async", - "reqwest 0.12.8", + "reqwest", "serde", "thiserror", ] @@ -1213,9 +1180,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -1286,9 +1253,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1305,15 +1272,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "num-traits", -] - [[package]] name = "clap" version = "4.5.19" @@ -1360,15 +1318,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "const-hex" version = "1.13.1" @@ -1458,7 +1407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1470,7 +1419,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1704,7 +1653,7 @@ dependencies = [ "generic-array", "group 0.12.1", "pkcs8 0.9.0", - "rand_core 0.6.4", + "rand_core", "sec1 0.3.0", "subtle", "zeroize", @@ -1723,7 +1672,7 @@ dependencies = [ "generic-array", "group 0.13.0", "pkcs8 0.10.2", - "rand_core 0.6.4", + "rand_core", "sec1 0.7.3", "subtle", "zeroize", @@ -1750,7 +1699,7 @@ dependencies = [ "hex", "k256 0.11.6", "log", - "rand 0.8.5", + "rand", "rlp", "serde", "sha3", @@ -1805,38 +1754,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - [[package]] name = "ethereum-consensus" version = "0.1.1" @@ -1850,7 +1767,7 @@ dependencies = [ "integer-sqrt", "multiaddr", "multihash", - "rand 0.8.5", + "rand", "serde", "serde_json", "serde_yaml", @@ -1861,64 +1778,6 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve 0.13.8", - "ethabi", - "generic-array", - "k256 0.13.4", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.1.1" @@ -1942,7 +1801,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1952,7 +1811,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1970,7 +1829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -1981,6 +1840,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2040,9 +1905,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2055,9 +1920,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2065,15 +1930,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2082,30 +1947,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -2114,21 +1964,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2159,17 +2009,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -2178,14 +2017,14 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2200,7 +2039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff 0.12.1", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -2211,22 +2050,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.0", - "rand_core 0.6.4", + "rand_core", "subtle", ] [[package]] name = "h2" -version = "0.3.26" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap 2.6.0", "slab", "tokio", @@ -2256,7 +2095,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", "serde", ] @@ -2265,6 +2103,11 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -2308,17 +2151,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -2330,17 +2162,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2348,7 +2169,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -2359,67 +2180,17 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "base64 0.13.1", - "futures-lite", - "infer", - "pin-project-lite", - "rand 0.7.3", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", -] - [[package]] name = "httparse" version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.4.1" @@ -2429,8 +2200,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -2446,8 +2218,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.4.1", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -2457,19 +2229,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -2478,7 +2237,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2495,9 +2254,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -2524,24 +2283,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -2571,21 +2312,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", -] - -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", + "serde", ] [[package]] @@ -2770,11 +2497,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2827,25 +2554,6 @@ dependencies = [ "paste", ] -[[package]] -name = "mev-share-sse" -version = "0.1.6" -source = "git+https://github.com/paradigmxyz/mev-share-rs?rev=9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8#9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8" -dependencies = [ - "async-sse", - "bytes", - "ethers-core", - "futures-util", - "http-types", - "pin-project-lite", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - [[package]] name = "mime" version = "0.3.17" @@ -2869,7 +2577,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.52.0", ] @@ -3044,7 +2752,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.79", @@ -3074,21 +2781,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3096,31 +2800,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "openssl" version = "0.10.66" @@ -3203,12 +2882,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.3" @@ -3257,18 +2930,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", @@ -3313,12 +2986,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -3346,9 +3013,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", "uint", ] @@ -3419,9 +3083,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -3437,8 +3101,8 @@ dependencies = [ "bitflags 2.6.0", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -3500,7 +3164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring", "rustc-hash", "rustls", @@ -3538,19 +3202,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -3558,18 +3209,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", + "serde", ] [[package]] @@ -3579,16 +3221,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -3597,16 +3230,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -3615,7 +3239,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3633,7 +3257,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom", "libredox", "thiserror", ] @@ -3682,48 +3306,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.8" @@ -3732,15 +3314,17 @@ checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -3752,12 +3336,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3774,9 +3359,9 @@ dependencies = [ [[package]] name = "revm" -version = "14.0.2" +version = "14.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f3f55d0414c3d73902d876ba3d55a654f05fe937089fbf5f34b1ced26d78d5" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" dependencies = [ "auto_impl", "cfg-if", @@ -3789,9 +3374,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "10.0.2" +version = "10.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713dbb271acd13afb06dcd460c1dc43da211e7ac9bc73cdf13528f615f55f96b" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" dependencies = [ "revm-primitives", "serde", @@ -3799,9 +3384,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "11.0.2" +version = "11.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73010c271d53fa7904e9845338e95f3955eb1200a0355e0abfdb89c41aaa9cd" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -3817,12 +3402,13 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "9.0.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" dependencies = [ - "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives 0.8.5", "auto_impl", "bitflags 2.6.0", "bitvec", @@ -3830,7 +3416,6 @@ dependencies = [ "cfg-if", "dyn-clone", "enumn", - "hashbrown 0.14.5", "hex", "serde", ] @@ -3864,7 +3449,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom", "libc", "spin", "untrusted", @@ -3916,7 +3501,7 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "1.1.3" +version = "1.1.4" dependencies = [ "anyhow", "hex", @@ -3963,12 +3548,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1714b8968a5e4583a15018dc2ae95878c76f4cdbc643268a34670fde5b08252a" dependencies = [ "bytemuck", - "rand_core 0.6.4", + "rand_core", ] [[package]] name = "risc0-ethereum-contracts" -version = "1.1.3" +version = "1.1.4" dependencies = [ "alloy", "anyhow", @@ -3980,7 +3565,7 @@ dependencies = [ [[package]] name = "risc0-forge-ffi" -version = "1.1.3" +version = "1.1.4" dependencies = [ "alloy", "anyhow", @@ -4014,34 +3599,29 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "0.13.3" +version = "1.1.4" dependencies = [ "alloy", "alloy-consensus", - "alloy-contract", - "alloy-network", - "alloy-network-primitives", - "alloy-node-bindings", - "alloy-primitives 0.8.3", - "alloy-provider", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-rlp-derive", - "alloy-rpc-types-eth", "alloy-sol-types", "alloy-trie", "anyhow", - "beacon-api-client", "bincode", "ethereum-consensus", "log", "nybbles", "once_cell", + "reqwest", "revm", "risc0-steel", "serde", "serde_json", "sha2 0.10.8", "test-log", + "thiserror", "tokio", "url", ] @@ -4062,7 +3642,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core 0.6.4", + "rand_core", "risc0-core", "risc0-zkvm-platform", "serde", @@ -4082,7 +3662,7 @@ dependencies = [ "borsh", "bytemuck", "bytes", - "getrandom 0.2.15", + "getrandom", "hex", "lazy-regex", "prost", @@ -4110,7 +3690,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6acf0b0d7a55578f892e0460ed1f2ca06d0380e32440531d80ca82530d41272" dependencies = [ "bytemuck", - "getrandom 0.2.15", + "getrandom", "libm", "stability", ] @@ -4122,21 +3702,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rrs-lib" version = "0.1.0" @@ -4163,7 +3731,7 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", + "rand", "rlp", "ruint-macro", "serde", @@ -4228,9 +3796,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring", @@ -4240,15 +3808,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4299,35 +3858,11 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more 0.99.18", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -4372,7 +3907,7 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "rand 0.8.5", + "rand", "secp256k1-sys", ] @@ -4468,17 +4003,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4578,7 +4102,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4588,7 +4112,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4720,7 +4244,7 @@ dependencies = [ "byteorder", "crunchy", "lazy_static", - "rand 0.8.5", + "rand", "rustc-hex", ] @@ -4754,9 +4278,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", @@ -4805,20 +4329,20 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -4837,7 +4361,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5209,7 +4733,6 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] @@ -5245,12 +4768,6 @@ dependencies = [ "libc", ] -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "want" version = "0.3.1" @@ -5260,12 +4777,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5580,16 +5091,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wyz" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 4c14a993..eb2de391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["build", "contracts", "ffi", "ffi/guests", "steel"] [workspace.package] -version = "1.1.3" +version = "1.1.4" edition = "2021" license = "Apache-2.0" homepage = "https://risczero.com/" @@ -11,10 +11,10 @@ repository = "https://github.com/risc0/risc0-ethereum/" [workspace.dependencies] # Intra-workspace dependencies -risc0-build-ethereum = { version = "1.1.3", default-features = false, path = "build" } -risc0-ethereum-contracts = { version = "1.1.3", default-features = false, path = "contracts" } -risc0-steel = { version = "0.13.3", default-features = false, path = "steel" } -risc0-forge-ffi = { version = "1.1.3", default-features = false, path = "ffi" } +risc0-build-ethereum = { version = "1.1.4", default-features = false, path = "build" } +risc0-ethereum-contracts = { version = "1.1.4", default-features = false, path = "contracts" } +risc0-steel = { version = "1.1.4", default-features = false, path = "steel" } +risc0-forge-ffi = { version = "1.1.4", default-features = false, path = "ffi" } # risc0 monorepo dependencies. risc0-build = { version = "1.1.2", default-features = false } @@ -22,21 +22,15 @@ risc0-zkp = { version = "1.1.2", default-features = false } risc0-zkvm = { version = "1.1.2", default-features = false } # Alloy guest dependencies -alloy-consensus = { version = "0.3" } -alloy-primitives = { version = "=0.8.3" } +alloy-consensus = { version = "0.4" } +alloy-primitives = { version = "=0.8.5" } alloy-rlp = { version = "0.3.8" } alloy-rlp-derive = { version = "0.3.8" } -alloy-sol-types = { version = "=0.8.3" } +alloy-sol-types = { version = "=0.8.5" } # Alloy host dependencies -alloy = { version = "=0.3.3" } -alloy-contract = { version = "=0.3.3" } -alloy-network = { version = "=0.3.3" } -alloy-network-primitives = { version = "=0.3.3" } -alloy-node-bindings = { version = "=0.3.3" } -alloy-provider = { version = "=0.3.3" } -alloy-rpc-types-eth = { version = "=0.3.3" } -alloy-trie = { version = "0.5" } +alloy = { version = "0.4" } +alloy-trie = { version = "0.6" } # Beacon chain support beacon-api-client = { git = "https://github.com/ralexstokes/ethereum-consensus.git", rev = "cf3c404043230559660810bc0c9d6d5a8498d819" } @@ -48,10 +42,12 @@ clap = { version = "4.5", features = ["derive", "env"] } log = "0.4" nybbles = { version = "0.2.1" } once_cell = "1.19" -revm = { version = "=14.0.2", default-features = false, features = ["std"] } +revm = { version = "14.0", default-features = false, features = ["std"] } +reqwest = "0.12" serde = "1.0" serde_json = "1.0" sha2 = { version = "0.10" } +thiserror = "1.0" test-log = "0.2.15" tokio = { version = "1.35" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/README.md b/README.md index 957846d7..d41a6171 100644 --- a/README.md +++ b/README.md @@ -24,5 +24,5 @@ You can install [Steel] with `cargo add risc0-steel`, check out the examples in [template]: https://github.com/risc0/bonsai-foundry-template [dev.risczero.com]: https://dev.risczero.com [risc0-quickstart]: https://dev.risczero.com/api/zkvm/quickstart -[bonsai-quickstart]: https://dev.risczero.com/api/bonsai/quickstart +[bonsai-quickstart]: https://dev.risczero.com/bonsai [alloy]: https://github.com/alloy-rs diff --git a/RELEASE.md b/RELEASE.md index 1fb23405..2af63e87 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -13,6 +13,9 @@ * Bump the version of all crates in the workspace to `x.y.z`. Workspace crate versions are specified in `./Cargo.toml`. * Update the version string in contracts that contain it: * `contracts/src/groth16/RiscZeroGroth16Verifier.sol` + * Update references to the `main` branch + * Search for `risc0/risc0-ethereum/refs/heads/main` + * Update `steel/CHANGELOG.md` to ensure it details the changes to be released. * Remove the note at the top of `README.md` about being on the `main` branch. * Update `risc0` crate dependencies. In all workspaces: > You can find the workspaces with `grep -R '\[workspace\]' --include Cargo.toml -l .` @@ -25,6 +28,7 @@ * Bump the version on the `main` branch to the next, unreleased, minor version `x.y+1.0-alpha.1`. * Update the version string in contracts that contain it: * `contracts/src/groth16/RiscZeroGroth16Verifier.sol` + * Update `steel/CHANGELOG.md` to start a new section for the next release. 3. Tag the release as `vX.Y.Z`, and add release on GitHub. @@ -36,13 +40,17 @@ Crates currently published to `crates.io` are: - * `risc0-steel` + * ~~`risc0-steel`~~ + + > NOTE: risc0-steel currently cannot be published to crates.io. + > See [#202](https://github.com/risc0/risc0-ethereum/issues/202) + * `risc0-build-ethereum` + * `risc0-ethereum-contracts` -
+ > NOTE: When publishing a new crate, make sure to add github:risc0:maintainers as an owner. - > NOTE: We intend to publish more of the crates in the future. - > Blocking issue is that the other crates depend on building Solidity smart contracts as part of a `build.rs` script, which makes it incompatible with `crates.io`. +
```sh # Log in to crates.io. Create a token that is restricted to what you need to do (e.g. publish update) and set an expiry. @@ -65,6 +73,8 @@ 3. Document the new addresses and version in the `dev.risczero.com` docs. + Use [contracts/generate_contract_address_table.py] to generate the tables. Python 3.11+ is required. + [https://dev.risczero.com/api/blockchain-integration/contracts/verifier](https://dev.risczero.com/api/blockchain-integration/contracts/verifier) 6. Open a PR to [risc0-foundry-template](https://github.com/risc0/risc0-foundry-template) updating the references in `Cargo.toml` and in the `lib/risc0` submodule to point to the new release branch. diff --git a/contracts/generate_contract_address_table.py b/contracts/generate_contract_address_table.py new file mode 100644 index 00000000..4be46d33 --- /dev/null +++ b/contracts/generate_contract_address_table.py @@ -0,0 +1,111 @@ +# Copyright 2024 RISC Zero, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from urllib.parse import urljoin +import tomllib +import sys + +def load_toml(file_path): + """Load the TOML file from the given path.""" + + with open(file_path, "rb") as f: + return tomllib.load(f) + +class Link: + def __init__(self, tag, url): + self.tag = tag + self.url = url + +def generate_table_for_chain(chain_name, chain_data, version): + """Generate markdown content for a specific blockchain.""" + + chain_id = chain_data['id'] + + links = [] + etherscan_url = chain_data['etherscan-url'] + + md_content = f"### {chain_data['name']} ({chain_id})\n\n" + md_content += "| Contract | Address |\n" + md_content += "| ---------------------------- | --------- |\n" + + # Add timelock controller and router + # NOTE: TimelockController and RiscZeroVerifierRouter may not be deployed to all chains. + timelock_addr = chain_data['timelock-controller'] + router_addr = chain_data['router'] + + # The router is the contract devs are most likely to interact with, so it is first. + md_content += f"| [RiscZeroVerifierRouter][router-src] | [`{router_addr}`][router-{chain_id}-etherscan] |\n" + links.append(Link(f"router-{chain_id}-etherscan", urljoin(etherscan_url, f"address/{router_addr}#code"))) + + # Add verifiers that match the version + if "verifiers" in chain_data: + for verifier in chain_data["verifiers"]: + if verifier.get("version") == version: + verifier_addr = verifier['verifier'] + estop_addr = verifier['estop'] + + md_content += f"| [RiscZeroGroth16Verifier][verifier-src] | [`{verifier_addr}`][verifier-{chain_id}-etherscan] |\n" + md_content += f"| [RiscZeroVerifierEmergencyStop][estop-src] | [`{estop_addr}`][estop-{chain_id}-etherscan] |\n" + + links.append(Link(f"estop-{chain_id}-etherscan", urljoin(etherscan_url, f"address/{estop_addr}#code"))) + links.append(Link(f"verifier-{chain_id}-etherscan", urljoin(etherscan_url, f"address/{verifier_addr}#code"))) + + break + + # TimelockController is the contract devs are least-likely to interact with, so it is last. + md_content += f"| TimelockController | [`{timelock_addr}`][timelock-{chain_id}-etherscan] |\n\n" + links.append(Link(f"timelock-{chain_id}-etherscan", urljoin(etherscan_url, f"address/{timelock_addr}#code"))) + + # Add the links section + for link in links: + md_content += f"[{link.tag}]: {link.url}\n" + + return md_content + +def main(toml_file, version): + # Load the TOML configuration + config = load_toml(toml_file) + + # Initialize an empty markdown output + all_md_content = "\n\n" + + # Process each chain + for chain_key, chain_data in config.get("chains", {}).items(): + # Skip generation of the table chains where deployment did not succeed. + # See notes in deployment.toml. + if chain_key in ("polygon-zkevm-testnet", "linea-sepolia"): + continue + + # Generate markdown content for the chain + md_content = generate_table_for_chain(chain_key, chain_data, version) + all_md_content += md_content + "\n
\n\n" + + all_md_content += f"[router-src]: https://github.com/risc0/risc0-ethereum/tree/v{version}/contracts/src/RiscZeroVerifierRouter.sol\n" + all_md_content += f"[verifier-src]: https://github.com/risc0/risc0-ethereum/tree/v{version}/contracts/src/groth16/RiscZeroGroth16Verifier.sol\n" + all_md_content += f"[estop-src]: https://github.com/risc0/risc0-ethereum/tree/v{version}/contracts/src/groth16/RiscZeroVerifierEmergencyStop.sol\n" + + all_md_content += "\n" + + # Output the entire markdown content to stdout + print(all_md_content) + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python generate_md.py ") + sys.exit(1) + + toml_file = sys.argv[1] + version = sys.argv[2] + + main(toml_file, version) diff --git a/contracts/src/groth16/RiscZeroGroth16Verifier.sol b/contracts/src/groth16/RiscZeroGroth16Verifier.sol index 5b548c98..7b82c63f 100644 --- a/contracts/src/groth16/RiscZeroGroth16Verifier.sol +++ b/contracts/src/groth16/RiscZeroGroth16Verifier.sol @@ -54,7 +54,7 @@ contract RiscZeroGroth16Verifier is IRiscZeroVerifier, Groth16Verifier { using SafeCast for uint256; /// Semantic version of the the RISC Zero system of which this contract is part. - string public constant VERSION = "1.1.2"; + string public constant VERSION = "1.1.4"; /// @notice Control root hash binding the set of circuits in the RISC Zero system. /// @dev This value controls what set of recursion programs (e.g. lift, join, resolve), and diff --git a/contracts/src/steel/Steel.sol b/contracts/src/steel/Steel.sol index 0cd6ef0a..7d473c03 100644 --- a/contracts/src/steel/Steel.sol +++ b/contracts/src/steel/Steel.sol @@ -20,11 +20,13 @@ pragma solidity ^0.8.9; /// @notice This library provides a collection of utilities to work with Steel commitments in Solidity. library Steel { /// @notice Represents a commitment to a specific block in the blockchain. - /// @dev The `blockID` encodes both the block identifier (block number or timestamp) and the version. - /// @dev The `blockDigest` is the block hash or beacon block root, used for validation. + /// @dev The `id` combines the version and the actual identifier of the claim, such as the block number. + /// @dev The `digest` represents the data being committed to, e.g. the hash of the execution block. + /// @dev The `configID` is the cryptographic digest of the network configuration. struct Commitment { - uint256 blockID; - bytes32 blockDigest; + uint256 id; + bytes32 digest; + bytes32 configID; } /// @notice The version of the Commitment is incorrect. @@ -37,11 +39,11 @@ library Steel { /// @param commitment The Commitment struct to validate. /// @return True if the commitment's block hash matches the block hash of the block number, false otherwise. function validateCommitment(Commitment memory commitment) internal view returns (bool) { - (uint240 blockID, uint16 version) = Encoding.decodeVersionedID(commitment.blockID); + (uint240 claimID, uint16 version) = Encoding.decodeVersionedID(commitment.id); if (version == 0) { - return validateBlockCommitment(blockID, commitment.blockDigest); + return validateBlockCommitment(claimID, commitment.digest); } else if (version == 1) { - return validateBeaconCommitment(blockID, commitment.blockDigest); + return validateBeaconCommitment(claimID, commitment.digest); } else { revert InvalidCommitmentVersion(); } @@ -59,14 +61,14 @@ library Steel { } /// @notice Validates if the provided beacon commitment matches the block root of the given timestamp. - /// @param blockTimestamp The timestamp to compare against. + /// @param timestamp The timestamp to compare against. /// @param blockRoot The block root to validate. /// @return True if the block's block root matches the block root, false otherwise. - function validateBeaconCommitment(uint256 blockTimestamp, bytes32 blockRoot) internal view returns (bool) { - if (block.timestamp - blockTimestamp > 12 * 8191) { + function validateBeaconCommitment(uint256 timestamp, bytes32 blockRoot) internal view returns (bool) { + if (block.timestamp - timestamp > 12 * 8191) { revert CommitmentTooOld(); } - return blockRoot == Beacon.blockRoot(blockTimestamp); + return blockRoot == Beacon.parentBlockRoot(timestamp); } } @@ -76,22 +78,12 @@ library Beacon { /// @dev https://eips.ethereum.org/EIPS/eip-4788 address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; - /// @notice The Beacon block root could not be found as the next block has not been issued yet. - error NoParentBeaconBlock(); - - /// @notice Attempts to find the root of the Beacon block with the given timestamp. - /// @dev Since the Beacon roots contract only returns the parent Beacon block’s root, we need to find the next - /// Beacon block instead. This is done by adding the block time of 12s until a value is returned. - function blockRoot(uint256 timestamp) internal view returns (bytes32 root) { - uint256 blockTimestamp = block.timestamp; - while (true) { - timestamp += 12; // Beacon block time is 12 seconds - if (timestamp > blockTimestamp) revert NoParentBeaconBlock(); - - (bool success, bytes memory result) = BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); - if (success) { - return abi.decode(result, (bytes32)); - } + /// @notice Find the root of the Beacon block corresponding to the parent of the execution block with the given timestamp. + /// @return root Returns the corresponding Beacon block root or null, if no such block exists. + function parentBlockRoot(uint256 timestamp) internal view returns (bytes32 root) { + (bool success, bytes memory result) = BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); + if (success) { + return abi.decode(result, (bytes32)); } } } diff --git a/contracts/version-management-design.md b/contracts/version-management-design.md index 0fb2ea56..29fc56d4 100644 --- a/contracts/version-management-design.md +++ b/contracts/version-management-design.md @@ -1,9 +1,9 @@ # On-Chain Verifier Upgrade and Deprecation At base, the RISC Zero verifier contracts are designed to be immutable and stateless. -This meets the highest standards for trust minimized application on Ethereum, as no action can alter the operation of the verifier. +This meets the highest standards for trust minimized applications on Ethereum, as no action can alter the operation of the verifier. -However, in the event that a security vulnerability is discovered in the verifier contract(s), stateless contracts require the application to respond to maintain security. +However, in the event that a security vulnerability is discovered in one or more verifier contracts, stateless contracts require the application to respond to maintain security (e.g. by using governance to remove the vulnerable verifier contract address). As a countermeasure to this risk, and to allow for upgrades with new features on an opt-in basis, the following version management system is deployed to Ethereum. ## Overview @@ -81,9 +81,9 @@ A [RiscZeroVerifierRouter](./src/RiscZeroVerifierRouter.sol) allows for multiple Using the verifier selector included in the seal, it will route each `verify` call to the appropriate implementation. Implementations can be added to the router mapping by an admin of the router, who is assigned as the owner of the contract. -Implementations can also be removed by the admin, and once removed it can never be replaced. I.e. each identifier can have at most one implementation across time. +Implementations can also be removed by the admin, and once removed can never be replaced. I.e. each selector can have at most one implementation across time. -RISC Zero deploys and acts as the admin on a router, maintaining a recommended list of trusted verifiers. +RISC Zero deploys and acts as the admin on a router, maintaining a recommended list of trustworthy verifiers. Note in particular this means that RISC Zero may add new verifiers, and so a [TimelockController][TimelockController-docs] is put in place to impose a delay on all additions. If an application using the managed router does not trust a new verifier being added, they will have a time-window to respond. diff --git a/examples/erc20-counter/.env b/examples/erc20-counter/.env deleted file mode 100644 index caa2304c..00000000 --- a/examples/erc20-counter/.env +++ /dev/null @@ -1 +0,0 @@ -ETH_RPC_URL="https://ethereum-rpc.publicnode.com" diff --git a/examples/erc20-counter/Cargo.lock b/examples/erc20-counter/Cargo.lock index a360d44a..628ea941 100644 --- a/examples/erc20-counter/Cargo.lock +++ b/examples/erc20-counter/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -46,9 +46,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37d89f69cb43901949ba29307ada8b9e3b170f94057ad4c04d6fd169d24d65f" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" dependencies = [ "alloy-consensus", "alloy-contract", @@ -71,9 +71,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609d6ef5716e94875b19b91faf33ef041baff373d3fff70531424f372d27bbd2" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" dependencies = [ "num_enum", "strum", @@ -81,29 +81,31 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", + "derive_more 1.0.0", "serde", ] [[package]] name = "alloy-contract" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335d62de1a887f1b780441f8a3037f39c9fb26839cc9acd891c9b80396145cd5" +checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-network", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-provider", "alloy-pubsub", "alloy-rpc-types-eth", @@ -116,24 +118,25 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b095eb0533144b4497e84a9cc3e44a5c2e3754a3983c0376a55a2f9183a53e" +checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", + "alloy-rlp", "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4004925bff5ba0a11739ae84dbb6601a981ea692f3bd45b626935ee90a6b8471" +checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "alloy-sol-types", "const-hex", @@ -149,7 +152,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "serde", ] @@ -160,7 +163,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "k256 0.13.4", "serde", @@ -168,13 +171,13 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "c-kzg", @@ -186,22 +189,22 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "serde", "serde_json", @@ -209,11 +212,11 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-types", "serde", "serde_json", @@ -223,15 +226,15 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe714e233f9eaf410de95a9af6bcd05d3a7f8c8de7a0817221e95a6b642a080" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -244,12 +247,13 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c5a38117974c5776a45e140226745a0b664f79736aa900995d8e4121558e064" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ + "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] @@ -270,7 +274,7 @@ dependencies = [ "k256 0.13.4", "keccak-asm", "proptest", - "rand 0.8.5", + "rand", "ruint", "serde", "tiny-keccak", @@ -278,31 +282,36 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more 1.0.0", + "hashbrown 0.14.5", "hex-literal", + "indexmap 2.6.0", "itoa", "k256 0.13.4", "keccak-asm", + "paste", "proptest", - "rand 0.8.5", + "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65633d6ef83c3626913c004eaf166a6dd50406f724772ea8567135efd6dc5d3" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" dependencies = [ "alloy-chains", "alloy-consensus", @@ -310,7 +319,7 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-eth", @@ -326,7 +335,7 @@ dependencies = [ "futures-utils-wasm", "lru", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "thiserror", @@ -337,12 +346,12 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d05f63677e210d758cd5d6d1ce10f20c980c3560ccfbe79ba1997791862a04f" +checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" dependencies = [ "alloy-json-rpc", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-transport", "bimap", "futures", @@ -378,12 +387,12 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" dependencies = [ "alloy-json-rpc", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-pubsub", "alloy-transport", "alloy-transport-http", @@ -391,7 +400,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "tokio", @@ -403,10 +412,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ + "alloy-primitives 0.8.5", "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-serde", @@ -415,54 +425,55 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1464c4dd646e1bdfde86ae65ce5ba168dbb29180b478011fe87117ae46b1629b" +checksum = "e0285c4c09f838ab830048b780d7f4a4f460f309aa1194bb049843309524c64c" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "derive_more 1.0.0", + "strum", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a59b1d7c86e0a653e7f3d29954f6de5a2878d8cfd1f010ff93be5c2c48cd3b1" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "alloy-sol-types", + "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", - "thiserror", ] [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "serde", "serde_json", ] [[package]] name = "alloy-signer" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "async-trait", "auto_impl", "elliptic-curve 0.13.8", @@ -472,25 +483,25 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fabe917ab1778e760b4701628d1cae8e028ee9d52ac6307de4e1e9286ab6b5f" +checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" dependencies = [ "alloy-consensus", "alloy-network", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-signer", "async-trait", "k256 0.13.4", - "rand 0.8.5", + "rand", "thiserror", ] [[package]] name = "alloy-sol-macro" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0458ccb02a564228fcd76efb8eb5a520521a8347becde37b402afec9a1b83859" +checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -502,9 +513,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc65475025fc1e84bf86fc840f04f63fcccdcf3cf12053c99918e4054dfbc69" +checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -521,9 +532,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed10f0715a0b69fde3236ff3b9ae5f6f7c97db5a387747100070d3016b9266b" +checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" dependencies = [ "alloy-json-abi", "const-hex", @@ -538,9 +549,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", @@ -548,12 +559,12 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-macro", "const-hex", "serde", @@ -561,9 +572,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -580,13 +591,13 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.8", + "reqwest", "serde_json", "tower", "tracing", @@ -595,9 +606,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fd8491249f74d16ec979b1f5672377b12ebb818e6056478ffa386954dbd350" +checksum = "b90cf9cde7f2fce617da52768ee28f522264b282d148384a4ca0ea85af04fa3a" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -614,14 +625,14 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9704761f6297fe482276bee7f77a93cb42bd541c2bd6c1c560b6f3a9ece672e" +checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" dependencies = [ "alloy-pubsub", "alloy-transport", "futures", - "http 1.1.0", + "http", "rustls", "serde_json", "tokio", @@ -690,7 +701,7 @@ name = "apps" version = "0.1.0" dependencies = [ "alloy", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "anyhow", "clap", "erc20-counter-methods", @@ -924,7 +935,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -934,7 +945,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -949,31 +960,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-sse" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" -dependencies = [ - "async-channel", - "futures-lite", - "http-types", - "log", - "memchr", - "pin-project-lite", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -1018,6 +1004,12 @@ dependencies = [ "rustc_version 0.4.1", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "aurora-engine-modexp" version = "1.1.0" @@ -1078,12 +1070,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -1096,25 +1082,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "beacon-api-client" -version = "0.1.0" -source = "git+https://github.com/ralexstokes/ethereum-consensus.git?rev=cf3c404043230559660810bc0c9d6d5a8498d819#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "clap", - "ethereum-consensus", - "http 0.2.12", - "itertools 0.10.5", - "mev-share-sse", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - [[package]] name = "bimap" version = "0.6.3" @@ -1226,7 +1193,7 @@ checksum = "94032d3eece78099780ba07605d8ba6943e47ee152f76d73f1682e2f40cf889c" dependencies = [ "duplicate", "maybe-async", - "reqwest 0.12.8", + "reqwest", "serde", "thiserror", ] @@ -1284,9 +1251,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -1357,9 +1324,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1376,15 +1343,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "num-traits", -] - [[package]] name = "clap" version = "4.5.19" @@ -1431,15 +1389,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "const-hex" version = "1.13.1" @@ -1529,7 +1478,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1541,7 +1490,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1775,7 +1724,7 @@ dependencies = [ "generic-array", "group 0.12.1", "pkcs8 0.9.0", - "rand_core 0.6.4", + "rand_core", "sec1 0.3.0", "subtle", "zeroize", @@ -1794,7 +1743,7 @@ dependencies = [ "generic-array", "group 0.13.0", "pkcs8 0.10.2", - "rand_core 0.6.4", + "rand_core", "sec1 0.7.3", "subtle", "zeroize", @@ -1821,7 +1770,7 @@ dependencies = [ "hex", "k256 0.11.6", "log", - "rand 0.8.5", + "rand", "rlp", "serde", "sha3", @@ -1849,7 +1798,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" name = "erc20-counter-methods" version = "0.1.0" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-types", "hex", "risc0-build", @@ -1868,38 +1817,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - [[package]] name = "ethereum-consensus" version = "0.1.1" @@ -1913,7 +1830,7 @@ dependencies = [ "integer-sqrt", "multiaddr", "multihash", - "rand 0.8.5", + "rand", "serde", "serde_json", "serde_yaml", @@ -1924,64 +1841,6 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve 0.13.8", - "ethabi", - "generic-array", - "k256 0.13.4", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.1.1" @@ -2005,7 +1864,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -2015,7 +1874,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -2026,7 +1885,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -2037,6 +1896,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2096,9 +1961,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2111,9 +1976,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2121,15 +1986,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2138,30 +2003,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -2170,21 +2020,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2215,17 +2065,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -2234,14 +2073,14 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2256,7 +2095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff 0.12.1", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -2267,22 +2106,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.0", - "rand_core 0.6.4", + "rand_core", "subtle", ] [[package]] name = "h2" -version = "0.3.26" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap 2.6.0", "slab", "tokio", @@ -2312,7 +2151,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", "serde", ] @@ -2321,6 +2159,11 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -2364,17 +2207,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -2386,17 +2218,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2404,7 +2225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -2415,67 +2236,17 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "base64 0.13.1", - "futures-lite", - "infer", - "pin-project-lite", - "rand 0.7.3", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", -] - [[package]] name = "httparse" version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.4.1" @@ -2485,8 +2256,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -2502,8 +2274,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.4.1", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -2513,19 +2285,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -2534,7 +2293,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2551,9 +2310,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -2580,24 +2339,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -2627,21 +2368,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", -] - -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", + "serde", ] [[package]] @@ -2841,11 +2568,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2898,25 +2625,6 @@ dependencies = [ "paste", ] -[[package]] -name = "mev-share-sse" -version = "0.1.6" -source = "git+https://github.com/paradigmxyz/mev-share-rs?rev=9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8#9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8" -dependencies = [ - "async-sse", - "bytes", - "ethers-core", - "futures-util", - "http-types", - "pin-project-lite", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - [[package]] name = "mime" version = "0.3.17" @@ -2940,7 +2648,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.52.0", ] @@ -3115,7 +2823,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.79", @@ -3145,21 +2852,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3167,31 +2871,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "openssl" version = "0.10.66" @@ -3274,12 +2953,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.3" @@ -3338,18 +3011,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", @@ -3394,12 +3067,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -3417,9 +3084,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", "uint", ] @@ -3490,9 +3154,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -3508,8 +3172,8 @@ dependencies = [ "bitflags 2.6.0", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -3571,7 +3235,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring", "rustc-hash", "rustls", @@ -3609,19 +3273,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -3629,18 +3280,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", + "serde", ] [[package]] @@ -3650,16 +3292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -3668,16 +3301,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -3686,7 +3310,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3710,7 +3334,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom", "libredox", "thiserror", ] @@ -3759,48 +3383,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.8" @@ -3809,15 +3391,17 @@ checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -3829,12 +3413,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3851,9 +3436,9 @@ dependencies = [ [[package]] name = "revm" -version = "14.0.2" +version = "14.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f3f55d0414c3d73902d876ba3d55a654f05fe937089fbf5f34b1ced26d78d5" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" dependencies = [ "auto_impl", "cfg-if", @@ -3866,9 +3451,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "10.0.2" +version = "10.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713dbb271acd13afb06dcd460c1dc43da211e7ac9bc73cdf13528f615f55f96b" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" dependencies = [ "revm-primitives", "serde", @@ -3876,9 +3461,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "11.0.2" +version = "11.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73010c271d53fa7904e9845338e95f3955eb1200a0355e0abfdb89c41aaa9cd" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -3894,12 +3479,13 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "9.0.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" dependencies = [ - "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives 0.8.5", "auto_impl", "bitflags 2.6.0", "bitvec", @@ -3907,7 +3493,6 @@ dependencies = [ "cfg-if", "dyn-clone", "enumn", - "hashbrown 0.14.5", "hex", "serde", ] @@ -3941,7 +3526,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom", "libc", "spin", "untrusted", @@ -3993,7 +3578,7 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "1.1.3" +version = "1.1.4" dependencies = [ "anyhow", "hex", @@ -4039,12 +3624,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1714b8968a5e4583a15018dc2ae95878c76f4cdbc643268a34670fde5b08252a" dependencies = [ "bytemuck", - "rand_core 0.6.4", + "rand_core", ] [[package]] name = "risc0-ethereum-contracts" -version = "1.1.3" +version = "1.1.4" dependencies = [ "alloy", "anyhow", @@ -4073,28 +3658,25 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "0.13.3" +version = "1.1.4" dependencies = [ "alloy", "alloy-consensus", - "alloy-contract", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.3", - "alloy-provider", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-rlp-derive", - "alloy-rpc-types-eth", "alloy-sol-types", "anyhow", - "beacon-api-client", "ethereum-consensus", "log", "nybbles", "once_cell", + "reqwest", "revm", "serde", + "serde_json", "sha2 0.10.8", + "thiserror", "tokio", "url", ] @@ -4115,7 +3697,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core 0.6.4", + "rand_core", "risc0-core", "risc0-zkvm-platform", "serde", @@ -4135,7 +3717,7 @@ dependencies = [ "borsh", "bytemuck", "bytes", - "getrandom 0.2.15", + "getrandom", "hex", "lazy-regex", "prost", @@ -4163,7 +3745,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6acf0b0d7a55578f892e0460ed1f2ca06d0380e32440531d80ca82530d41272" dependencies = [ "bytemuck", - "getrandom 0.2.15", + "getrandom", "libm", "stability", ] @@ -4175,21 +3757,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rrs-lib" version = "0.1.0" @@ -4216,7 +3786,7 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", + "rand", "rlp", "ruint-macro", "serde", @@ -4281,9 +3851,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring", @@ -4293,15 +3863,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4352,35 +3913,11 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more 0.99.18", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -4425,7 +3962,7 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "rand 0.8.5", + "rand", "secp256k1-sys", ] @@ -4527,17 +4064,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4648,7 +4174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4658,7 +4184,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4790,7 +4316,7 @@ dependencies = [ "byteorder", "crunchy", "lazy_static", - "rand 0.8.5", + "rand", "rustc-hex", ] @@ -4824,9 +4350,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", @@ -4875,20 +4401,20 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -4907,7 +4433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5040,9 +4566,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", @@ -5198,17 +4724,17 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http", "httparse", "log", - "rand 0.8.5", + "rand", "rustls", "rustls-pki-types", "sha1", @@ -5294,7 +4820,6 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] @@ -5336,12 +4861,6 @@ dependencies = [ "libc", ] -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "want" version = "0.3.1" @@ -5351,12 +4870,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5677,16 +5190,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "ws_stream_wasm" version = "0.7.4" diff --git a/examples/erc20-counter/Cargo.toml b/examples/erc20-counter/Cargo.toml index 79d0009b..a8825b00 100644 --- a/examples/erc20-counter/Cargo.toml +++ b/examples/erc20-counter/Cargo.toml @@ -18,7 +18,7 @@ risc0-build = { version = "1.1.2", features = ["docker"] } risc0-zkvm = { version = "1.1.2", default-features = false } risc0-zkp = { version = "1.1.2", default-features = false } -alloy = { version = "0.3", features = ["full"] } +alloy = { version = "0.4", features = ["full"] } alloy-primitives = { version = "0.8", features = ["rlp", "serde", "std"] } alloy-sol-types = { version = "0.8" } anyhow = { version = "1.0.75" } diff --git a/examples/erc20-counter/README.md b/examples/erc20-counter/README.md index 8df768ae..c1d68e39 100644 --- a/examples/erc20-counter/README.md +++ b/examples/erc20-counter/README.md @@ -62,5 +62,5 @@ When you're ready, follow the [deployment guide] to get your application running [Sepolia]: https://www.alchemy.com/overviews/sepolia-testnet [deployment guide]: ./deployment-guide.md [Rust]: https://doc.rust-lang.org/cargo/getting-started/installation.html -[Counter]: ./contracts/Counter.sol +[Counter]: ./contracts/src/Counter.sol [Steel]: https://www.risczero.com/blog/introducing-steel diff --git a/examples/erc20-counter/apps/README.md b/examples/erc20-counter/apps/README.md index 9f568427..a38581d8 100644 --- a/examples/erc20-counter/apps/README.md +++ b/examples/erc20-counter/apps/README.md @@ -19,19 +19,34 @@ Usage: publisher [OPTIONS] --eth-wallet-private-key --e Options: --eth-wallet-private-key - Private key [env: ETH_WALLET_PRIVATE_KEY=] + Ethereum private key + + [env: ETH_WALLET_PRIVATE_KEY=] + --eth-rpc-url - Ethereum RPC endpoint URL [env: ETH_RPC_URL=] + Ethereum RPC endpoint URL + + [env: ETH_RPC_URL=] + --beacon-api-url - Beacon API endpoint URL [env: BEACON_API_URL=] - --counter - Address of the Counter verifier + Optional Beacon API endpoint URL + + When provided, Steel uses a beacon block commitment instead of the execution block. This allows proofs to be validated using the EIP-4788 beacon roots contract. + + [env: BEACON_API_URL=] + + --counter-address + Address of the Counter verifier contract + --token-contract - Address of the ERC20 token contract [env: TOKEN_CONTRACT=] + Address of the ERC20 token contract + --account Address to query the token balance of + -h, --help - Print help``` + Print help (see a summary with '-h') +``` [publisher]: ./src/bin/publisher.rs -[Counter]: ../contracts/Counter.sol +[Counter]: ../contracts/src/Counter.sol diff --git a/examples/erc20-counter/apps/src/bin/publisher.rs b/examples/erc20-counter/apps/src/bin/publisher.rs index ebaa3a52..0c266581 100644 --- a/examples/erc20-counter/apps/src/bin/publisher.rs +++ b/examples/erc20-counter/apps/src/bin/publisher.rs @@ -22,13 +22,14 @@ use alloy::{ signers::local::PrivateKeySigner, sol_types::{SolCall, SolValue}, }; -use alloy_primitives::Address; +use alloy_primitives::{Address, U256}; use anyhow::{ensure, Context, Result}; use clap::Parser; use erc20_counter_methods::{BALANCE_OF_ELF, BALANCE_OF_ID}; use risc0_ethereum_contracts::encode_seal; use risc0_steel::{ ethereum::{EthEvmEnv, ETH_SEPOLIA_CHAIN_SPEC}, + host::BlockNumberOrTag, Commitment, Contract, }; use risc0_zkvm::{default_prover, sha::Digest, ExecutorEnv, ProverOpts, VerifierContext}; @@ -55,9 +56,9 @@ alloy::sol!( ); /// Simple program to create a proof to increment the Counter contract. -#[derive(Parser, Debug)] +#[derive(Parser)] struct Args { - /// Private key + /// Ethereum private key #[clap(long, env)] eth_wallet_private_key: PrivateKeySigner, @@ -72,12 +73,12 @@ struct Args { #[clap(long, env)] beacon_api_url: Option, - /// Address of the Counter verifier + /// Address of the Counter verifier contract #[clap(long)] - counter: Address, + counter_address: Address, /// Address of the ERC20 token contract - #[clap(long, env)] + #[clap(long)] token_contract: Address, /// Address to query the token balance of @@ -101,8 +102,12 @@ async fn main() -> Result<()> { .wallet(wallet) .on_http(args.eth_rpc_url); - // Create an EVM environment from that provider defaulting to the latest block. - let mut env = EthEvmEnv::builder().provider(provider.clone()).build().await?; + // Create an EVM environment from that provider for the block latest - 1. + let mut env = EthEvmEnv::builder() + .provider(provider.clone()) + .block_number_or_tag(BlockNumberOrTag::Parent) + .build() + .await?; // The `with_chain_spec` method is used to specify the chain configuration. env = env.with_chain_spec(Ð_SEPOLIA_CHAIN_SPEC); @@ -114,24 +119,20 @@ async fn main() -> Result<()> { // Preflight the call to prepare the input that is required to execute the function in // the guest without RPC access. It also returns the result of the call. let mut contract = Contract::preflight(args.token_contract, &mut env); - let returns = contract.call_builder(&call).call().await?; - println!( - "Call {} Function on {:#} returns: {}", - IERC20::balanceOfCall::SIGNATURE, - args.token_contract, - returns._0 - ); + let returns = contract.call_builder(&call).call().await?._0; + assert!(returns >= U256::from(1)); // Finally, construct the input from the environment. // There are two options: Use EIP-4788 for verification by providing a Beacon API endpoint, // or use the regular `blockhash' opcode. let evm_input = if let Some(beacon_api_url) = args.beacon_api_url { + #[allow(deprecated)] env.into_beacon_input(beacon_api_url).await? } else { env.into_input().await? }; - println!("Creating proof for the constructed input..."); + // Create the steel proof. let prove_info = task::spawn_blocking(move || { let env = ExecutorEnv::builder() .write(&evm_input)? @@ -154,23 +155,20 @@ async fn main() -> Result<()> { // Decode and log the commitment let journal = Journal::abi_decode(journal, true).context("invalid journal")?; - println!( - "The guest committed to block {}", - journal.commitment.blockDigest - ); + log::debug!("Steel commitment: {:?}", journal.commitment); // ABI encode the seal. - let seal = encode_seal(&receipt)?; + let seal = encode_seal(&receipt).context("invalid receipt")?; // Create an alloy instance of the Counter contract. - let contract = ICounter::new(args.counter, provider); + let contract = ICounter::new(args.counter_address, &provider); // Call ICounter::imageID() to check that the contract has been deployed correctly. let contract_image_id = Digest::from(contract.imageID().call().await?._0.0); ensure!(contract_image_id == Digest::from(BALANCE_OF_ID)); // Call the increment function of the contract and wait for confirmation. - println!( + log::info!( "Sending Tx calling {} Function of {:#}...", ICounter::incrementCall::SIGNATURE, contract.address() @@ -178,11 +176,12 @@ async fn main() -> Result<()> { let call_builder = contract.increment(receipt.journal.bytes.into(), seal.into()); log::debug!("Send {} {}", contract.address(), call_builder.calldata()); let pending_tx = call_builder.send().await?; - let receipt = pending_tx.get_receipt().await?; - ensure!(receipt.status(), "transaction failed"); - - let value = contract.get().call().await?._0; - println!("New value of Counter: {}", value); + let tx_hash = *pending_tx.tx_hash(); + let receipt = pending_tx + .get_receipt() + .await + .with_context(|| format!("transaction did not confirm: {}", tx_hash))?; + ensure!(receipt.status(), "transaction failed: {}", tx_hash); Ok(()) } diff --git a/examples/erc20-counter/contracts/script/DeployCounter.s.sol b/examples/erc20-counter/contracts/script/DeployCounter.s.sol index 1cced212..a5ca55de 100644 --- a/examples/erc20-counter/contracts/script/DeployCounter.s.sol +++ b/examples/erc20-counter/contracts/script/DeployCounter.s.sol @@ -21,27 +21,37 @@ import {console2} from "forge-std/console2.sol"; import {IRiscZeroVerifier} from "risc0/IRiscZeroVerifier.sol"; import {RiscZeroCheats} from "risc0/test/RiscZeroCheats.sol"; import {Counter} from "../src/Counter.sol"; +import {IERC20Metadata} from "openzeppelin-contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {ERC20FixedSupply} from "../test/Counter.t.sol"; /// @notice Deployment script for the Counter contract. /// @dev Use the following environment variable to control the deployment: -/// * ETH_WALLET_PRIVATE_KEY private key of the wallet to be used for deployment. +/// - ETH_WALLET_PRIVATE_KEY private key of the wallet to be used for deployment. +/// - TOKEN_OWNER to deploy a new ERC 20 token, funding that address with tokens or _alternatively_ +/// - TOKEN_CONTRACT to link the Counter to an existing ERC20 token. /// /// See the Foundry documentation for more information about Solidity scripts. /// https://book.getfoundry.sh/tutorials/solidity-scripting contract DeployCounter is Script, RiscZeroCheats { function run() external { uint256 deployerKey = uint256(vm.envBytes32("ETH_WALLET_PRIVATE_KEY")); - address tokenOwner = vm.envAddress("TOKEN_OWNER"); vm.startBroadcast(deployerKey); - ERC20FixedSupply toyken = new ERC20FixedSupply("TOYKEN", "TOY", tokenOwner); - console2.log("Deployed ERC20 TOYKEN to", address(toyken)); + IERC20Metadata tokenContract = IERC20Metadata(address(0x0)); + try vm.envAddress("TOKEN_CONTRACT") returns (address val) { + tokenContract = IERC20Metadata(val); + console2.log("Using ERC20", tokenContract.name(), "at", address(tokenContract)); + } catch { + // deploy a new ERC20 token if no contract has been specified + address owner = vm.envAddress("TOKEN_OWNER"); + tokenContract = new ERC20FixedSupply("TOYKEN", "TOY", owner); + console2.log("Deployed ERC20 TOYKEN to", address(tokenContract)); + } IRiscZeroVerifier verifier = deployRiscZeroVerifier(); - Counter counter = new Counter(verifier, address(toyken)); + Counter counter = new Counter(verifier, address(tokenContract)); console2.log("Deployed Counter to", address(counter)); vm.stopBroadcast(); diff --git a/examples/erc20-counter/contracts/test/Counter.t.sol b/examples/erc20-counter/contracts/test/Counter.t.sol index 51ab4f32..611826d0 100644 --- a/examples/erc20-counter/contracts/test/Counter.t.sol +++ b/examples/erc20-counter/contracts/test/Counter.t.sol @@ -39,8 +39,8 @@ contract CounterTest is Test { bytes32 private imageId; function setUp() public { - // fork from the actual chain to get realistic Beacon block roots - string memory RPC_URL = vm.envString("ETH_RPC_URL"); + // fork from the actual Mainnet to get realistic Beacon block roots + string memory RPC_URL = vm.rpcUrl("mainnet"); vm.createSelectFork(RPC_URL); verifier = new RiscZeroMockVerifier(MOCK_SELECTOR); @@ -56,7 +56,7 @@ contract CounterTest is Test { // mock the Journal Counter.Journal memory journal = Counter.Journal({ - commitment: Steel.Commitment(Encoding.encodeVersionedID(blockNumber, 0), blockHash), + commitment: Steel.Commitment(Encoding.encodeVersionedID(blockNumber, 0), blockHash, bytes32(0x0)), tokenContract: address(token) }); // create a mock proof @@ -72,12 +72,12 @@ contract CounterTest is Test { function testEIP4788Commitment() public { // get the root of a previous Beacon block - uint240 beaconTimestamp = uint240(block.timestamp - 60); - bytes32 beaconRoot = Beacon.blockRoot(beaconTimestamp); + uint240 beaconTimestamp = uint240(block.timestamp); + bytes32 beaconRoot = Beacon.parentBlockRoot(beaconTimestamp); // mock the Journal Counter.Journal memory journal = Counter.Journal({ - commitment: Steel.Commitment(Encoding.encodeVersionedID(beaconTimestamp, 1), beaconRoot), + commitment: Steel.Commitment(Encoding.encodeVersionedID(beaconTimestamp, 1), beaconRoot, bytes32(0x0)), tokenContract: address(token) }); // create a mock proof diff --git a/examples/erc20-counter/deployment-guide.md b/examples/erc20-counter/deployment-guide.md index 43349377..80ea6afb 100644 --- a/examples/erc20-counter/deployment-guide.md +++ b/examples/erc20-counter/deployment-guide.md @@ -9,7 +9,7 @@ You can either: - [Deploy to a local network] - [Deploy to a testnet] -## Deploy on a local network +## Deploy on a local devnet You can deploy your contracts and run an end-to-end test or demo as follows: @@ -37,18 +37,22 @@ You can deploy your contracts and run an end-to-end test or demo as follows: cargo build ``` -4. Deploy the ERC20 Toyken and Counter contract by running: +4. Deploy the Counter contract. During creation, the Counter gets linked with an ERC20 token. To also deploy such a new token, you need to specify any `TOKEN_OWNER` address which will get funded with Toyken ERC20 tokens, for example the address of the private key: ```bash - forge script --rpc-url http://localhost:8545 --broadcast script/DeployCounter.s.sol + export TOKEN_OWNER=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + ``` + Then, deploy the contracts running the following script: + ```bash + forge script --rpc-url http://localhost:8545 --broadcast DeployCounter ``` This command should output something similar to: ```bash ... == Logs == - Deployed ERC20 TOYKEN to 0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6 - Deployed RiscZeroGroth16Verifier to 0x8A791620dd6260079BF849Dc5567aDC3F2FdC318 - Deployed Counter to 0x610178dA211FEF7D417bC0e6FeD39F05609AD788 + Deployed ERC20 TOYKEN to 0x5FbDB2315678afecb367f032d93F642f64180aa3 + Deployed RiscZeroGroth16Verifier to 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 + Deployed Counter to 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 ... ``` Save the `ERC20 Toyken` contract address to an env variable: @@ -59,7 +63,7 @@ You can deploy your contracts and run an end-to-end test or demo as follows: > You can also use the following command to set the contract address if you have [`jq`][jq] installed: > > ```bash - > export TOYKEN_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "ERC20") | .contractAddress' ./broadcast/DeployCounter.s.sol/31337/run-latest.json) + > export TOYKEN_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "ERC20FixedSupply") | .contractAddress' ./broadcast/DeployCounter.s.sol/31337/run-latest.json) > ``` Save the `Counter` contract address to an env variable: @@ -73,48 +77,37 @@ You can deploy your contracts and run an end-to-end test or demo as follows: > export COUNTER_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "Counter") | .contractAddress' ./broadcast/DeployCounter.s.sol/31337/run-latest.json) > ``` -5. Mint some Toyken: - ```bash - cast send --private-key $ETH_WALLET_PRIVATE_KEY --rpc-url http://localhost:8545 $TOYKEN_ADDRESS 'mint(address, uint256)' 0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 100 - ``` - > Now the account at address `0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4` should have 100 Toyken. - > - > You can verify the balance by running: - > ```bash - > cast call $TOYKEN_ADDRESS --rpc-url http://localhost:8545 "balanceOf(address)(uint256)" 0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 - > ``` - ### Interact with your local deployment 1. Query the state: ```bash - cast call --rpc-url http://localhost:8545 ${COUNTER_ADDRESS:?} 'get()(uint256)' + cast call --rpc-url http://localhost:8545 $COUNTER_ADDRESS 'get()(uint256)' ``` 2. Publish a new state ```bash - cargo run --bin publisher -- \ - --chain-id=31337 \ - --rpc-url=http://localhost:8545 \ - --contract=${COUNTER_ADDRESS:?} \ - --token=${TOYKEN_ADDRESS:?} \ - --account=0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 + RUST_LOG=info cargo run --bin publisher -- \ + --eth-wallet-private-key=$ETH_WALLET_PRIVATE_KEY \ + --eth-rpc-url=http://localhost:8545 \ + --counter-address=$COUNTER_ADDRESS \ + --token-contract=$TOYKEN_ADDRESS \ + --account=$TOKEN_OWNER ``` 3. Query the state again to see the change: ```bash - cast call --rpc-url http://localhost:8545 ${COUNTER_ADDRESS:?} 'get()(uint256)' + cast call --rpc-url http://localhost:8545 $COUNTER_ADDRESS 'get()(uint256)' ``` -## Deploy your project on a testnet +## Deploy your project on a public network -You can deploy the Counter contract on a testnet such as `Sepolia` and run an end-to-end test or demo as follows: +You can deploy the Counter contract on any Ethereum network such as `Sepolia` (in this example we will be using [PublicNode](https://ethereum.publicnode.com/)) and run an end-to-end test or demo as follows: > ***Note***: we'll be using an existing ERC20 contract for this example, specifically the USDT ERC20 contract deployed on Sepolia at address [0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0]. -1. Get access to Bonsai and an Ethereum node running on a given testnet, e.g., Sepolia (in this example, we will be using [Alchemy](https://www.alchemy.com/) as our Ethereum node provider) and export the following environment variables: +1. Get access to Bonsai and an Ethereum node running on a given testnet, e.g., Sepolia and export the following environment variables: > ***Note:*** *This requires having access to a Bonsai API Key. To request an API key [complete the form here](https://bonsai.xyz/apply).* > > Alternatively you can generate your proofs locally, assuming you have a machine with an x86 architecture and [Docker] installed. In this case do not export Bonsai related env variables. @@ -122,20 +115,11 @@ You can deploy the Counter contract on a testnet such as `Sepolia` and run an en ```bash export BONSAI_API_KEY="YOUR_API_KEY" # see form linked in the previous section export BONSAI_API_URL="BONSAI_API_URL" # provided with your api key - export ALCHEMY_API_KEY="YOUR_ALCHEMY_API_KEY" # the API_KEY provided with an alchemy account export ETH_WALLET_PRIVATE_KEY="YOUR_WALLET_PRIVATE_KEY" # the private hex-encoded key of your Sepolia testnet wallet + export TOKEN_CONTRACT=0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0 # Sepolia USDT ``` 2. Build the project: - - Before building the project, make sure the contract address on both the [methods/guest/src/bin/balance_of.rs] as well [apps/src/bin/publisher.rs] is set to `aA8E23Fb1079EA71e0a56F48a2aA51851D8433D0` - - ```rust - const CONTRACT: Address = address!("aA8E23Fb1079EA71e0a56F48a2aA51851D8433D0"); - ``` - - Then run: - ```bash cargo build ``` @@ -143,7 +127,7 @@ You can deploy the Counter contract on a testnet such as `Sepolia` and run an en 3. Deploy the Counter contract by running: ```bash - forge script script/DeployCounter.s.sol --rpc-url https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} --broadcast + forge script --rpc-url https://ethereum-sepolia-rpc.publicnode.com --broadcast DeployCounter ``` This command should output something similar to: @@ -151,8 +135,9 @@ You can deploy the Counter contract on a testnet such as `Sepolia` and run an en ```bash ... == Logs == - Deployed RiscZeroGroth16Verifier to 0x5FbDB2315678afecb367f032d93F642f64180aa3 - Deployed Counter to 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 + Using ERC20 USDT at 0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0 + Deployed RiscZeroGroth16Verifier to 0x5a1677454B5530a15536EF662C6b27b14F699aBd + Deployed Counter to 0xb0827e4F251d29685170837C2C0eE204Dfef522c ... ``` @@ -162,34 +147,29 @@ You can deploy the Counter contract on a testnet such as `Sepolia` and run an en export COUNTER_ADDRESS=#COPY COUNTER ADDRESS FROM DEPLOY LOGS ``` - > You can also use the following command to set the contract address if you have [`jq`][jq] installed: - > - > ```bash - > export COUNTER_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "Counter") | .contractAddress' ./broadcast/DeployCounter.s.sol/11155111/run-latest.json) - > ``` - ### Interact with your testnet deployment -1. Query the state: +1. Query the state. It should return `0` for a newly deployed Counter contract: ```bash - cast call --rpc-url https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} ${COUNTER_ADDRESS:?} 'get()(uint256)' + cast call --rpc-url https://ethereum-sepolia-rpc.publicnode.com $COUNTER_ADDRESS 'get()(uint256)' ``` 2. Publish a new state ```bash - cargo run --bin publisher -- \ - --chain-id=11155111 \ - --rpc-url=https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} \ - --contract=${COUNTER_ADDRESS:?} \ + RUST_LOG=info cargo run --bin publisher -- \ + --eth-wallet-private-key=$ETH_WALLET_PRIVATE_KEY \ + --eth-rpc-url=https://ethereum-sepolia-rpc.publicnode.com \ + --counter-address=$COUNTER_ADDRESS \ + --token-contract=$TOKEN_CONTRACT \ --account=0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 ``` 3. Query the state again to see the change: ```bash - cast call --rpc-url https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} ${COUNTER_ADDRESS:?} 'get()(uint256)' + cast call --rpc-url https://ethereum-sepolia-rpc.publicnode.com $COUNTER_ADDRESS 'get()(uint256)' ``` [Deploy to a testnet]: #deploy-your-project-on-a-testnet diff --git a/examples/erc20-counter/e2e-test.sh b/examples/erc20-counter/e2e-test.sh new file mode 100755 index 00000000..e54c5a0b --- /dev/null +++ b/examples/erc20-counter/e2e-test.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# Test the integration of the application contract and publisher, against a running EVM chain. +set -e -o pipefail + +export TOKEN_OWNER=${ETH_WALLET_ADDRESS:?} + +# Determine the chain ID +CHAIN_ID=$(cast rpc --rpc-url ${ETH_RPC_URL:?} eth_chainId | jq -re) +CHAIN_ID=$((CHAIN_ID)) + +# Deploy the Counter contract +echo "Deploying the Counter contract..." +forge script --rpc-url ${ETH_RPC_URL:?} --private-key ${ETH_WALLET_PRIVATE_KEY:?} --broadcast DeployCounter + +# Extract the Toyken address +TOYKEN_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "ERC20FixedSupply") | .contractAddress' ./broadcast/DeployCounter.s.sol/$CHAIN_ID/run-latest.json) +echo "ERC20 Toyken Address: $TOYKEN_ADDRESS" + +# Extract the Counter contract address +COUNTER_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "Counter") | .contractAddress' ./broadcast/DeployCounter.s.sol/$CHAIN_ID/run-latest.json) +echo "Counter Address: $COUNTER_ADDRESS" + +# Extract the block in which the Toyken contract has been deployed and wait for the next block +BLOCK_NUMBER=$(jq --arg ADDRESS "$TOYKEN_ADDRESS" -re '.receipts[] | select(.contractAddress == $ADDRESS) | .blockNumber' ./broadcast/DeployCounter.s.sol/$CHAIN_ID/run-latest.json) +echo "Waiting for block $BLOCK_NUMBER to have one confirmation..." +while [ $(cast rpc --rpc-url ${ETH_RPC_URL:?} eth_blockNumber | jq -re) == "$BLOCK_NUMBER" ]; do sleep 3; done + +# Publish a new state +echo "Publishing a new state..." +RUST_LOG=${RUST_LOG:-info,risc0_steel=debug} cargo run --bin publisher -- \ + --eth-wallet-private-key=${ETH_WALLET_PRIVATE_KEY:?} \ + --eth-rpc-url=${ETH_RPC_URL:?} \ + --counter-address=${COUNTER_ADDRESS:?} \ + --token-contract=${TOYKEN_ADDRESS:?} \ + --account=${TOKEN_OWNER:?} + +# Attempt to verify counter value as part of the script logic +echo "Verifying state..." +COUNTER_VALUE=$(cast call --rpc-url ${ETH_RPC_URL:?} ${COUNTER_ADDRESS:?} 'get()(uint256)') +if [ "$COUNTER_VALUE" != "1" ]; then + echo "Counter value is not 1 as expected, but $COUNTER_VALUE." + exit 1 +fi diff --git a/examples/erc20-counter/foundry.toml b/examples/erc20-counter/foundry.toml index 0cf40fb2..d13f1a05 100644 --- a/examples/erc20-counter/foundry.toml +++ b/examples/erc20-counter/foundry.toml @@ -5,3 +5,6 @@ libs = ["../../lib", "../../contracts/src"] test = "contracts/test" script = "contracts/script" evm_version = 'cancun' + +[rpc_endpoints] +mainnet = "https://ethereum-rpc.publicnode.com" diff --git a/examples/erc20-counter/methods/README.md b/examples/erc20-counter/methods/README.md index 98e32535..1eba1a86 100644 --- a/examples/erc20-counter/methods/README.md +++ b/examples/erc20-counter/methods/README.md @@ -27,5 +27,5 @@ Each will have a corresponding image ID, which is a hash identifying the program [guest programs]: https://dev.risczero.com/terminology#guest-program [on-chain logic]: ../contracts/ [guest/src/bin]: ./guest/src/bin/ -[Guest Code 101]: https://dev.risczero.com/zkvm/developer-guide/guest-code-101 -[RISC Zero examples]: https://github.com/risc0/tree/v0.18.0/examples \ No newline at end of file +[Guest Code 101]: https://dev.risczero.com/api/zkvm/guest-code-101 +[RISC Zero examples]: https://github.com/risc0/risc0/tree/main/examples \ No newline at end of file diff --git a/examples/erc20-counter/methods/build.rs b/examples/erc20-counter/methods/build.rs index 99e81a93..98615a79 100644 --- a/examples/erc20-counter/methods/build.rs +++ b/examples/erc20-counter/methods/build.rs @@ -24,6 +24,7 @@ const SOLIDITY_ELF_PATH: &str = "../contracts/src/Elf.sol"; fn main() { // Builds can be made deterministic, and thereby reproducible, by using Docker to build the // guest. Check the RISC0_USE_DOCKER variable and use Docker to build the guest if set. + println!("cargo:rerun-if-env-changed=RISC0_USE_DOCKER"); let use_docker = env::var("RISC0_USE_DOCKER").ok().map(|_| DockerOptions { root_dir: Some("../".into()), }); diff --git a/examples/erc20-counter/methods/guest/Cargo.lock b/examples/erc20-counter/methods/guest/Cargo.lock index aad2bfe9..9f3d80b5 100644 --- a/examples/erc20-counter/methods/guest/Cargo.lock +++ b/examples/erc20-counter/methods/guest/Cargo.lock @@ -14,22 +14,18 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", + "auto_impl", "c-kzg", + "derive_more", ] [[package]] @@ -57,15 +53,14 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde", "c-kzg", "derive_more", "once_cell", @@ -75,9 +70,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -87,23 +82,28 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more", + "hashbrown 0.14.5", "hex-literal", + "indexmap", "itoa", "k256", "keccak-asm", + "paste", "proptest", "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] @@ -129,22 +129,11 @@ dependencies = [ "syn 2.0.79", ] -[[package]] -name = "alloy-serde" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - [[package]] name = "alloy-sol-macro" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -156,9 +145,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -174,9 +163,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" dependencies = [ "const-hex", "dunce", @@ -189,9 +178,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", @@ -199,9 +188,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -615,9 +604,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -656,9 +645,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1054,7 +1043,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", "serde", ] @@ -1128,6 +1116,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", + "serde", ] [[package]] @@ -1157,6 +1146,15 @@ dependencies = [ "sha2", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "keccak-asm" version = "0.1.4" @@ -1338,12 +1336,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "parity-scale-codec" @@ -1404,12 +1399,6 @@ dependencies = [ "spki", ] -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1486,9 +1475,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -1543,6 +1532,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -1581,9 +1571,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "revm" -version = "14.0.2" +version = "14.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f3f55d0414c3d73902d876ba3d55a654f05fe937089fbf5f34b1ced26d78d5" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" dependencies = [ "auto_impl", "cfg-if", @@ -1596,9 +1586,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "10.0.2" +version = "10.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713dbb271acd13afb06dcd460c1dc43da211e7ac9bc73cdf13528f615f55f96b" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" dependencies = [ "revm-primitives", "serde", @@ -1606,9 +1596,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "11.0.2" +version = "11.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73010c271d53fa7904e9845338e95f3955eb1200a0355e0abfdb89c41aaa9cd" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -1624,11 +1614,12 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "9.0.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" dependencies = [ - "alloy-eips", + "alloy-eip2930", + "alloy-eip7702", "alloy-primitives", "auto_impl", "bitflags 2.6.0", @@ -1637,7 +1628,6 @@ dependencies = [ "cfg-if", "dyn-clone", "enumn", - "hashbrown 0.14.5", "hex", "serde", ] @@ -1739,7 +1729,7 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "0.13.3" +version = "1.1.4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -1752,6 +1742,7 @@ dependencies = [ "revm", "serde", "sha2", + "thiserror", ] [[package]] @@ -1866,6 +1857,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -2021,6 +2018,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + [[package]] name = "sha3-asm" version = "0.1.4" @@ -2131,9 +2138,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", diff --git a/examples/erc20-counter/rust-toolchain.toml b/examples/erc20-counter/rust-toolchain.toml index cb78e29e..3fd28115 100644 --- a/examples/erc20-counter/rust-toolchain.toml +++ b/examples/erc20-counter/rust-toolchain.toml @@ -1,5 +1,4 @@ [toolchain] -channel = "1.79" +channel = "stable" components = ["clippy", "rustfmt", "rust-src"] -targets = [] -profile = "minimal" \ No newline at end of file +profile = "minimal" diff --git a/examples/erc20-counter/test-local-deployment.sh b/examples/erc20-counter/test-local-deployment.sh deleted file mode 100755 index cd78a315..00000000 --- a/examples/erc20-counter/test-local-deployment.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -cleanup() { - echo "Cleaning up..." - # Check if Anvil PID is set and if the process is running, then kill it - if [ ! -z "$ANVIL_PID" ]; then - if ps -p $ANVIL_PID > /dev/null; then - echo "Killing Anvil (PID $ANVIL_PID)..." - kill $ANVIL_PID - fi - fi -} - -# Trap EXIT and ERR signals to call the cleanup function -# This ensures cleanup is performed on script exit or error -trap cleanup EXIT ERR - -# Start Anvil and capture its output temporarily -anvil > anvil_logs.txt 2>&1 & -ANVIL_PID=$! -echo "Anvil started with PID $ANVIL_PID" - -# Wait a few seconds to ensure Anvil has started and output private keys -sleep 5 - -export ETH_WALLET_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -export TOKEN_OWNER=0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 - -# Build the project -echo "Building the project..." -cargo build - -# Deploy the Counter contract -echo "Deploying the Counter contract..." -forge script --rpc-url http://localhost:8545 --broadcast DeployCounter - -# Extract the Toyken address -export TOYKEN_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "ERC20FixedSupply") | .contractAddress' ./broadcast/DeployCounter.s.sol/31337/run-latest.json) -echo "ERC20 Toyken Address: $TOYKEN_ADDRESS" - -# Extract the Counter contract address -export COUNTER_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "Counter") | .contractAddress' ./broadcast/DeployCounter.s.sol/31337/run-latest.json) -echo "Counter Address: $COUNTER_ADDRESS" - -# Publish a new state -echo "Publishing a new state..." -cargo run --bin publisher -- \ - --eth-rpc-url=http://localhost:8545 \ - --counter=${COUNTER_ADDRESS:?} \ - --token-contract=${TOYKEN_ADDRESS:?} \ - --account=${TOKEN_OWNER:?} - -# Attempt to verify counter value as part of the script logic -echo "Verifying state..." -COUNTER_VALUE=$(cast call --rpc-url http://localhost:8545 ${COUNTER_ADDRESS:?} 'get()(uint256)') -if [ "$COUNTER_VALUE" != "1" ]; then - echo "Counter value is not 1 as expected, but $COUNTER_VALUE." - exit 1 -fi - -echo "All operations completed successfully." diff --git a/examples/erc20/Cargo.lock b/examples/erc20/Cargo.lock index 402ceaef..ed2165ce 100644 --- a/examples/erc20/Cargo.lock +++ b/examples/erc20/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -46,9 +46,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37d89f69cb43901949ba29307ada8b9e3b170f94057ad4c04d6fd169d24d65f" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" dependencies = [ "alloy-consensus", "alloy-core", @@ -65,9 +65,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609d6ef5716e94875b19b91faf33ef041baff373d3fff70531424f372d27bbd2" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" dependencies = [ "num_enum", "strum", @@ -75,58 +75,41 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", + "derive_more 1.0.0", "serde", ] -[[package]] -name = "alloy-contract" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335d62de1a887f1b780441f8a3037f39c9fb26839cc9acd891c9b80396145cd5" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.3", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "thiserror", -] - [[package]] name = "alloy-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b095eb0533144b4497e84a9cc3e44a5c2e3754a3983c0376a55a2f9183a53e" +checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", + "alloy-rlp", "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4004925bff5ba0a11739ae84dbb6601a981ea692f3bd45b626935ee90a6b8471" +checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "alloy-sol-types", "const-hex", @@ -142,7 +125,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "serde", ] @@ -153,7 +136,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "k256 0.13.4", "serde", @@ -161,13 +144,13 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "c-kzg", @@ -179,22 +162,22 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "serde", "serde_json", @@ -202,11 +185,11 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-types", "serde", "serde_json", @@ -216,15 +199,15 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe714e233f9eaf410de95a9af6bcd05d3a7f8c8de7a0817221e95a6b642a080" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -237,12 +220,13 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c5a38117974c5776a45e140226745a0b664f79736aa900995d8e4121558e064" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ + "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] @@ -263,7 +247,7 @@ dependencies = [ "k256 0.13.4", "keccak-asm", "proptest", - "rand 0.8.5", + "rand", "ruint", "serde", "tiny-keccak", @@ -271,31 +255,36 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more 1.0.0", + "hashbrown 0.14.5", "hex-literal", + "indexmap 2.6.0", "itoa", "k256 0.13.4", "keccak-asm", + "paste", "proptest", - "rand 0.8.5", + "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65633d6ef83c3626913c004eaf166a6dd50406f724772ea8567135efd6dc5d3" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" dependencies = [ "alloy-chains", "alloy-consensus", @@ -303,7 +292,7 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-client", "alloy-rpc-types-eth", "alloy-transport", @@ -316,7 +305,7 @@ dependencies = [ "futures-utils-wasm", "lru", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "thiserror", @@ -349,16 +338,17 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" dependencies = [ "alloy-json-rpc", + "alloy-primitives 0.8.5", "alloy-transport", "alloy-transport-http", "futures", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "tokio", @@ -370,10 +360,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -381,41 +372,41 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a59b1d7c86e0a653e7f3d29954f6de5a2878d8cfd1f010ff93be5c2c48cd3b1" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "alloy-sol-types", + "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", - "thiserror", ] [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "serde", "serde_json", ] [[package]] name = "alloy-signer" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "async-trait", "auto_impl", "elliptic-curve 0.13.8", @@ -425,9 +416,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -439,9 +430,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -457,9 +448,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" dependencies = [ "const-hex", "dunce", @@ -472,9 +463,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", @@ -482,12 +473,12 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-macro", "const-hex", "serde", @@ -495,9 +486,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -514,13 +505,13 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.8", + "reqwest", "serde_json", "tower", "tracing", @@ -803,7 +794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -813,7 +804,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -828,31 +819,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-sse" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" -dependencies = [ - "async-channel", - "futures-lite", - "http-types", - "log", - "memchr", - "pin-project-lite", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -886,6 +852,12 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "aurora-engine-modexp" version = "1.1.0" @@ -946,12 +918,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -964,25 +930,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "beacon-api-client" -version = "0.1.0" -source = "git+https://github.com/ralexstokes/ethereum-consensus.git?rev=cf3c404043230559660810bc0c9d6d5a8498d819#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "clap", - "ethereum-consensus", - "http 0.2.12", - "itertools 0.10.5", - "mev-share-sse", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - [[package]] name = "bincode" version = "1.3.3" @@ -1088,7 +1035,7 @@ checksum = "94032d3eece78099780ba07605d8ba6943e47ee152f76d73f1682e2f40cf889c" dependencies = [ "duplicate", "maybe-async", - "reqwest 0.12.8", + "reqwest", "serde", "thiserror", ] @@ -1146,9 +1093,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -1219,9 +1166,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1238,15 +1185,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "num-traits", -] - [[package]] name = "clap" version = "4.5.19" @@ -1293,15 +1231,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "const-hex" version = "1.13.1" @@ -1391,7 +1320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1403,7 +1332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1631,7 +1560,7 @@ dependencies = [ "generic-array", "group 0.12.1", "pkcs8 0.9.0", - "rand_core 0.6.4", + "rand_core", "sec1 0.3.0", "subtle", "zeroize", @@ -1650,7 +1579,7 @@ dependencies = [ "generic-array", "group 0.13.0", "pkcs8 0.10.2", - "rand_core 0.6.4", + "rand_core", "sec1 0.7.3", "subtle", "zeroize", @@ -1677,7 +1606,7 @@ dependencies = [ "hex", "k256 0.11.6", "log", - "rand 0.8.5", + "rand", "rlp", "serde", "sha3", @@ -1718,38 +1647,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - [[package]] name = "ethereum-consensus" version = "0.1.1" @@ -1763,7 +1660,7 @@ dependencies = [ "integer-sqrt", "multiaddr", "multihash", - "rand 0.8.5", + "rand", "serde", "serde_json", "serde_yaml", @@ -1774,64 +1671,6 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve 0.13.8", - "ethabi", - "generic-array", - "k256 0.13.4", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.1.1" @@ -1855,7 +1694,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1865,7 +1704,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1876,7 +1715,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -1887,6 +1726,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1946,9 +1791,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1961,9 +1806,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1971,15 +1816,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1988,30 +1833,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -2020,21 +1850,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2065,17 +1895,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -2084,14 +1903,14 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2106,7 +1925,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff 0.12.1", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -2117,22 +1936,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.0", - "rand_core 0.6.4", + "rand_core", "subtle", ] [[package]] name = "h2" -version = "0.3.26" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap 2.6.0", "slab", "tokio", @@ -2162,7 +1981,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", "serde", ] @@ -2171,6 +1989,11 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -2218,7 +2041,7 @@ dependencies = [ name = "host" version = "0.1.0" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-types", "anyhow", "clap", @@ -2230,17 +2053,6 @@ dependencies = [ "url", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -2252,17 +2064,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2270,7 +2071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -2281,67 +2082,17 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "base64 0.13.1", - "futures-lite", - "infer", - "pin-project-lite", - "rand 0.7.3", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", -] - [[package]] name = "httparse" version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.4.1" @@ -2351,8 +2102,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -2368,8 +2120,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.4.1", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -2379,19 +2131,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -2400,7 +2139,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2417,9 +2156,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -2446,24 +2185,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -2493,21 +2214,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", -] - -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", + "serde", ] [[package]] @@ -2692,11 +2399,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2749,25 +2456,6 @@ dependencies = [ "paste", ] -[[package]] -name = "mev-share-sse" -version = "0.1.6" -source = "git+https://github.com/paradigmxyz/mev-share-rs?rev=9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8#9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8" -dependencies = [ - "async-sse", - "bytes", - "ethers-core", - "futures-util", - "http-types", - "pin-project-lite", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - [[package]] name = "mime" version = "0.3.17" @@ -2791,7 +2479,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.52.0", ] @@ -2966,7 +2654,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.79", @@ -2996,21 +2683,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3018,31 +2702,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "openssl" version = "0.10.66" @@ -3125,12 +2784,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.3" @@ -3179,18 +2832,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", @@ -3235,12 +2888,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -3258,9 +2905,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", "uint", ] @@ -3331,9 +2975,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -3349,8 +2993,8 @@ dependencies = [ "bitflags 2.6.0", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -3412,7 +3056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring", "rustc-hash", "rustls", @@ -3450,19 +3094,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -3470,18 +3101,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", + "serde", ] [[package]] @@ -3491,16 +3113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -3509,16 +3122,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -3527,7 +3131,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3545,7 +3149,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom", "libredox", "thiserror", ] @@ -3594,48 +3198,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.8" @@ -3644,15 +3206,17 @@ checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -3664,12 +3228,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3686,9 +3251,9 @@ dependencies = [ [[package]] name = "revm" -version = "14.0.2" +version = "14.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f3f55d0414c3d73902d876ba3d55a654f05fe937089fbf5f34b1ced26d78d5" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" dependencies = [ "auto_impl", "cfg-if", @@ -3701,9 +3266,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "10.0.2" +version = "10.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713dbb271acd13afb06dcd460c1dc43da211e7ac9bc73cdf13528f615f55f96b" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" dependencies = [ "revm-primitives", "serde", @@ -3711,9 +3276,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "11.0.2" +version = "11.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73010c271d53fa7904e9845338e95f3955eb1200a0355e0abfdb89c41aaa9cd" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -3729,12 +3294,13 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "9.0.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" dependencies = [ - "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives 0.8.5", "auto_impl", "bitflags 2.6.0", "bitvec", @@ -3742,7 +3308,6 @@ dependencies = [ "cfg-if", "dyn-clone", "enumn", - "hashbrown 0.14.5", "hex", "serde", ] @@ -3776,7 +3341,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom", "libc", "spin", "untrusted", @@ -3864,7 +3429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1714b8968a5e4583a15018dc2ae95878c76f4cdbc643268a34670fde5b08252a" dependencies = [ "bytemuck", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3889,28 +3454,25 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "0.13.3" +version = "1.1.4" dependencies = [ "alloy", "alloy-consensus", - "alloy-contract", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.3", - "alloy-provider", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-rlp-derive", - "alloy-rpc-types-eth", "alloy-sol-types", "anyhow", - "beacon-api-client", "ethereum-consensus", "log", "nybbles", "once_cell", + "reqwest", "revm", "serde", + "serde_json", "sha2 0.10.8", + "thiserror", "tokio", "url", ] @@ -3931,7 +3493,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core 0.6.4", + "rand_core", "risc0-core", "risc0-zkvm-platform", "serde", @@ -3951,7 +3513,7 @@ dependencies = [ "borsh", "bytemuck", "bytes", - "getrandom 0.2.15", + "getrandom", "hex", "lazy-regex", "prost", @@ -3979,7 +3541,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6acf0b0d7a55578f892e0460ed1f2ca06d0380e32440531d80ca82530d41272" dependencies = [ "bytemuck", - "getrandom 0.2.15", + "getrandom", "libm", "stability", ] @@ -3991,21 +3553,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rrs-lib" version = "0.1.0" @@ -4032,7 +3582,7 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", + "rand", "rlp", "ruint-macro", "serde", @@ -4097,9 +3647,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring", @@ -4109,15 +3659,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4168,35 +3709,11 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more 0.99.18", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -4241,7 +3758,7 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "rand 0.8.5", + "rand", "secp256k1-sys", ] @@ -4337,17 +3854,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4447,7 +3953,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4457,7 +3963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4589,7 +4095,7 @@ dependencies = [ "byteorder", "crunchy", "lazy_static", - "rand 0.8.5", + "rand", "rustc-hex", ] @@ -4623,9 +4129,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", @@ -4674,20 +4180,20 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -4706,7 +4212,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5057,7 +4563,6 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] @@ -5093,12 +4598,6 @@ dependencies = [ "libc", ] -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "want" version = "0.3.1" @@ -5108,12 +4607,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5428,16 +4921,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wyz" version = "0.5.1" diff --git a/examples/erc20/README.md b/examples/erc20/README.md index 8b638b24..5942c947 100644 --- a/examples/erc20/README.md +++ b/examples/erc20/README.md @@ -8,7 +8,7 @@ To get started, you need to have Rust installed. If you haven't done so, follow Next, you will also need to have the `cargo-risczero` tool installed following the instructions [here][install-risczero]. -You'll also need access to an Ethereum Sepolia RPC endpoint. You can for example use [ethereum-sepolia-rpc.publicnode.com](https://ethereum-sepolia-rpc.publicnode.com) or a commercial RPC provider like [Alchemy](www.alchemy.com). +You'll also need access to an Ethereum Sepolia RPC endpoint. You can for example use [ethereum-sepolia-rpc.publicnode.com](https://ethereum-sepolia-rpc.publicnode.com) or a commercial RPC provider like [Alchemy](https://www.alchemy.com/). ## Run the example diff --git a/examples/erc20/host/src/main.rs b/examples/erc20/host/src/main.rs index 8290d637..930ab3fa 100644 --- a/examples/erc20/host/src/main.rs +++ b/examples/erc20/host/src/main.rs @@ -13,14 +13,13 @@ // limitations under the License. use alloy_primitives::{address, Address}; -use alloy_sol_types::{sol, SolCall, SolValue}; +use alloy_sol_types::{sol, SolCall, SolType}; use anyhow::{Context, Result}; use clap::Parser; use erc20_methods::ERC20_GUEST_ELF; use risc0_steel::{ ethereum::{EthEvmEnv, ETH_SEPOLIA_CHAIN_SPEC}, - host::BlockNumberOrTag, - Contract, + Commitment, Contract, }; use risc0_zkvm::{default_executor, ExecutorEnv}; use tracing_subscriber::EnvFilter; @@ -78,8 +77,6 @@ async fn main() -> Result<()> { CONTRACT, returns._0 ); - // Get the commitment to verify execution later. - let commitment = env.commitment().clone(); // Finally, construct the input from the environment. let input = env.into_input().await?; @@ -96,9 +93,10 @@ async fn main() -> Result<()> { .context("failed to run executor")? }; - // The commitment in the journal should match. - let bytes = session_info.journal.as_ref(); - assert!(bytes.starts_with(&commitment.abi_encode())); + // The journal should be the ABI encoded commitment. + let commitment = Commitment::abi_decode(session_info.journal.as_ref(), true) + .context("failed to decode journal")?; + println!("{:?}", commitment); Ok(()) } diff --git a/examples/erc20/methods/guest/Cargo.lock b/examples/erc20/methods/guest/Cargo.lock index 55a68250..0a792653 100644 --- a/examples/erc20/methods/guest/Cargo.lock +++ b/examples/erc20/methods/guest/Cargo.lock @@ -14,22 +14,18 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", + "auto_impl", "c-kzg", + "derive_more", ] [[package]] @@ -57,15 +53,14 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde", "c-kzg", "derive_more", "once_cell", @@ -75,9 +70,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -87,23 +82,28 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more", + "hashbrown 0.14.5", "hex-literal", + "indexmap", "itoa", "k256", "keccak-asm", + "paste", "proptest", "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] @@ -129,22 +129,11 @@ dependencies = [ "syn 2.0.79", ] -[[package]] -name = "alloy-serde" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - [[package]] name = "alloy-sol-macro" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -156,9 +145,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -174,9 +163,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" dependencies = [ "const-hex", "dunce", @@ -189,9 +178,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", @@ -199,9 +188,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -615,9 +604,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -656,9 +645,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1054,7 +1043,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", "serde", ] @@ -1128,6 +1116,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", + "serde", ] [[package]] @@ -1157,6 +1146,15 @@ dependencies = [ "sha2", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "keccak-asm" version = "0.1.4" @@ -1338,12 +1336,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "parity-scale-codec" @@ -1404,12 +1399,6 @@ dependencies = [ "spki", ] -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1486,9 +1475,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -1543,6 +1532,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -1581,9 +1571,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "revm" -version = "14.0.2" +version = "14.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f3f55d0414c3d73902d876ba3d55a654f05fe937089fbf5f34b1ced26d78d5" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" dependencies = [ "auto_impl", "cfg-if", @@ -1596,9 +1586,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "10.0.2" +version = "10.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713dbb271acd13afb06dcd460c1dc43da211e7ac9bc73cdf13528f615f55f96b" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" dependencies = [ "revm-primitives", "serde", @@ -1606,9 +1596,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "11.0.2" +version = "11.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73010c271d53fa7904e9845338e95f3955eb1200a0355e0abfdb89c41aaa9cd" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -1624,11 +1614,12 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "9.0.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" dependencies = [ - "alloy-eips", + "alloy-eip2930", + "alloy-eip7702", "alloy-primitives", "auto_impl", "bitflags 2.6.0", @@ -1637,7 +1628,6 @@ dependencies = [ "cfg-if", "dyn-clone", "enumn", - "hashbrown 0.14.5", "hex", "serde", ] @@ -1739,7 +1729,7 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "0.13.3" +version = "1.1.4" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -1752,6 +1742,7 @@ dependencies = [ "revm", "serde", "sha2", + "thiserror", ] [[package]] @@ -1866,6 +1857,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -2021,6 +2018,16 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + [[package]] name = "sha3-asm" version = "0.1.4" @@ -2131,9 +2138,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", diff --git a/examples/erc20/methods/guest/src/main.rs b/examples/erc20/methods/guest/src/main.rs index 22c060f6..4f4a89ac 100644 --- a/examples/erc20/methods/guest/src/main.rs +++ b/examples/erc20/methods/guest/src/main.rs @@ -16,7 +16,7 @@ #![no_main] use alloy_primitives::{address, Address}; -use alloy_sol_types::{sol, SolValue}; +use alloy_sol_types::sol; use risc0_steel::{ ethereum::{EthEvmInput, ETH_SEPOLIA_CHAIN_SPEC}, Contract, diff --git a/examples/erc20/rust-toolchain.toml b/examples/erc20/rust-toolchain.toml index 36614c30..3fd28115 100644 --- a/examples/erc20/rust-toolchain.toml +++ b/examples/erc20/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] channel = "stable" -components = ["rustfmt", "rust-src"] +components = ["clippy", "rustfmt", "rust-src"] profile = "minimal" diff --git a/examples/governance/Cargo.lock b/examples/governance/Cargo.lock index 2e185a3f..26bd8d51 100644 --- a/examples/governance/Cargo.lock +++ b/examples/governance/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -46,53 +46,34 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4a4aaae80afd4be443a6aecd92a6b255dcdd000f97996928efb33d8a71e100" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" dependencies = [ - "alloy-consensus 0.2.1", - "alloy-contract 0.2.1", - "alloy-core 0.7.7", - "alloy-eips 0.2.1", - "alloy-genesis 0.2.1", - "alloy-network 0.2.1", - "alloy-provider 0.2.1", + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", "alloy-pubsub", - "alloy-rpc-client 0.2.1", + "alloy-rpc-client", "alloy-rpc-types", - "alloy-serde 0.2.1", - "alloy-signer 0.2.1", + "alloy-serde", + "alloy-signer", "alloy-signer-local", - "alloy-transport 0.2.1", - "alloy-transport-http 0.2.1", + "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", ] -[[package]] -name = "alloy" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37d89f69cb43901949ba29307ada8b9e3b170f94057ad4c04d6fd169d24d65f" -dependencies = [ - "alloy-consensus 0.3.6", - "alloy-contract 0.3.6", - "alloy-core 0.8.5", - "alloy-eips 0.3.6", - "alloy-genesis 0.3.6", - "alloy-network 0.3.6", - "alloy-provider 0.3.6", - "alloy-rpc-client 0.3.6", - "alloy-serde 0.3.6", - "alloy-transport 0.3.6", - "alloy-transport-http 0.3.6", -] - [[package]] name = "alloy-chains" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609d6ef5716e94875b19b91faf33ef041baff373d3fff70531424f372d27bbd2" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" dependencies = [ "num_enum", "strum", @@ -100,68 +81,36 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c309895995eaa4bfcc345f5515a39c7df9447798645cc8bf462b6c5bf1dc96" -dependencies = [ - "alloy-eips 0.2.1", - "alloy-primitives 0.7.7", - "alloy-rlp", - "alloy-serde 0.2.1", - "c-kzg", - "serde", -] - -[[package]] -name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ - "alloy-eips 0.3.6", - "alloy-primitives 0.8.5", + "alloy-eips", + "alloy-primitives", "alloy-rlp", - "alloy-serde 0.3.6", + "alloy-serde", + "auto_impl", "c-kzg", + "derive_more", "serde", ] [[package]] name = "alloy-contract" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4e0ef72b0876ae3068b2ed7dfae9ae1779ce13cfaec2ee1f08f5bd0348dc57" +checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" dependencies = [ - "alloy-dyn-abi 0.7.7", - "alloy-json-abi 0.7.7", - "alloy-network 0.2.1", - "alloy-network-primitives 0.2.1", - "alloy-primitives 0.7.7", - "alloy-provider 0.2.1", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", "alloy-pubsub", - "alloy-rpc-types-eth 0.2.1", - "alloy-sol-types 0.7.7", - "alloy-transport 0.2.1", - "futures", - "futures-util", - "thiserror", -] - -[[package]] -name = "alloy-contract" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eefe64fd344cffa9cf9e3435ec4e93e6e9c3481bc37269af988bf497faf4a6a" -dependencies = [ - "alloy-dyn-abi 0.8.5", - "alloy-json-abi 0.8.5", - "alloy-network 0.3.6", - "alloy-network-primitives 0.3.6", - "alloy-primitives 0.8.5", - "alloy-provider 0.3.6", - "alloy-rpc-types-eth 0.3.6", - "alloy-sol-types 0.8.5", - "alloy-transport 0.3.6", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", "futures", "futures-util", "thiserror", @@ -169,56 +118,27 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.7.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529fc6310dc1126c8de51c376cbc59c79c7f662bd742be7dc67055d5421a81b4" +checksum = "3cf9b7166dd6aee2236646457b81fa032af8a67c25f3965d56e48881658bc85f" dependencies = [ - "alloy-dyn-abi 0.7.7", - "alloy-json-abi 0.7.7", - "alloy-primitives 0.7.7", - "alloy-sol-types 0.7.7", -] - -[[package]] -name = "alloy-core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" -dependencies = [ - "alloy-dyn-abi 0.8.5", - "alloy-json-abi 0.8.5", - "alloy-primitives 0.8.5", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", "alloy-rlp", - "alloy-sol-types 0.8.5", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413902aa18a97569e60f679c23f46a18db1656d87ab4d4e49d0e1e52042f66df" -dependencies = [ - "alloy-json-abi 0.7.7", - "alloy-primitives 0.7.7", - "alloy-sol-type-parser 0.7.7", - "alloy-sol-types 0.7.7", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", + "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" +checksum = "1109c57718022ac84c194f775977a534e1b3969b405e55693a61c42187cc0612" dependencies = [ - "alloy-json-abi 0.8.5", - "alloy-primitives 0.8.5", - "alloy-sol-type-parser 0.8.5", - "alloy-sol-types 0.8.5", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", "const-hex", "itoa", "serde", @@ -232,7 +152,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.5", + "alloy-primitives", "alloy-rlp", "serde", ] @@ -243,41 +163,25 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.5", + "alloy-primitives", "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9431c99a3b3fe606ede4b3d4043bdfbcb780c45b8d8d226c3804e2b75cfbe68" -dependencies = [ - "alloy-primitives 0.7.7", - "alloy-rlp", - "alloy-serde 0.2.1", - "c-kzg", - "derive_more 0.99.18", "k256", - "once_cell", "serde", - "sha2", ] [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 0.8.5", + "alloy-primitives", "alloy-rlp", - "alloy-serde 0.3.6", + "alloy-serde", "c-kzg", - "derive_more 1.0.0", + "derive_more", "once_cell", "serde", "sha2", @@ -285,72 +189,35 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79614dfe86144328da11098edcc7bc1a3f25ad8d3134a9eb9e857e06f0d9840d" -dependencies = [ - "alloy-primitives 0.7.7", - "alloy-serde 0.2.1", - "serde", -] - -[[package]] -name = "alloy-genesis" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" dependencies = [ - "alloy-primitives 0.8.5", - "alloy-serde 0.3.6", + "alloy-primitives", + "alloy-serde", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.7.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" +checksum = "c4cc0e59c803dd44d14fc0cfa9fea1f74cfa8fd9fb60ca303ced390c58c28d4e" dependencies = [ - "alloy-primitives 0.7.7", - "alloy-sol-type-parser 0.7.7", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-abi" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" -dependencies = [ - "alloy-primitives 0.8.5", - "alloy-sol-type-parser 0.8.5", + "alloy-primitives", + "alloy-sol-type-parser", "serde", "serde_json", ] [[package]] name = "alloy-json-rpc" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e2865c4c3bb4cdad3f0d9ec1ab5c0c657ba69a375651bd35e32fb6c180ccc2" -dependencies = [ - "alloy-primitives 0.7.7", - "alloy-sol-types 0.7.7", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" dependencies = [ - "alloy-primitives 0.8.5", - "alloy-sol-types 0.8.5", + "alloy-primitives", + "alloy-sol-types", "serde", "serde_json", "thiserror", @@ -359,40 +226,19 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e701fc87ef9a3139154b0b4ccb935b565d27ffd9de020fe541bf2dec5ae4ede" -dependencies = [ - "alloy-consensus 0.2.1", - "alloy-eips 0.2.1", - "alloy-json-rpc 0.2.1", - "alloy-network-primitives 0.2.1", - "alloy-primitives 0.7.7", - "alloy-rpc-types-eth 0.2.1", - "alloy-serde 0.2.1", - "alloy-signer 0.2.1", - "alloy-sol-types 0.7.7", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "thiserror", -] - -[[package]] -name = "alloy-network" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3705ce7d8602132bcf5ac7a1dd293a42adc2f183abf5907c30ac535ceca049" -dependencies = [ - "alloy-consensus 0.3.6", - "alloy-eips 0.3.6", - "alloy-json-rpc 0.3.6", - "alloy-network-primitives 0.3.6", - "alloy-primitives 0.8.5", - "alloy-rpc-types-eth 0.3.6", - "alloy-serde 0.3.6", - "alloy-signer 0.3.6", - "alloy-sol-types 0.8.5", +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", "async-trait", "auto_impl", "futures-utils-wasm", @@ -401,61 +247,30 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9d5a0f9170b10988b6774498a022845e13eda94318440d17709d50687f67f9" -dependencies = [ - "alloy-primitives 0.7.7", - "alloy-serde 0.2.1", - "serde", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" -dependencies = [ - "alloy-eips 0.3.6", - "alloy-primitives 0.8.5", - "alloy-serde 0.3.6", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "0.7.7" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 0.99.18", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand", - "ruint", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", "serde", - "tiny-keccak", ] [[package]] name = "alloy-primitives" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" +checksum = "a289ffd7448036f2f436b377f981c79ce0b2090877bad938d43387dc09931877" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 1.0.0", - "hashbrown 0.14.5", + "derive_more", + "foldhash", + "hashbrown 0.15.0", "hex-literal", "indexmap", "itoa", @@ -473,61 +288,28 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9c0ab10b93de601a6396fc7ff2ea10d3b28c46f079338fa562107ebf9857c8" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" dependencies = [ "alloy-chains", - "alloy-consensus 0.2.1", - "alloy-eips 0.2.1", - "alloy-json-rpc 0.2.1", - "alloy-network 0.2.1", - "alloy-network-primitives 0.2.1", - "alloy-primitives 0.7.7", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", "alloy-pubsub", - "alloy-rpc-client 0.2.1", - "alloy-rpc-types-eth 0.2.1", - "alloy-transport 0.2.1", - "alloy-transport-http 0.2.1", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "async-stream", "async-trait", "auto_impl", - "dashmap 5.5.3", - "futures", - "futures-utils-wasm", - "lru", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "alloy-provider" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927f708dd457ed63420400ee5f06945df9632d5d101851952056840426a10dc5" -dependencies = [ - "alloy-chains", - "alloy-consensus 0.3.6", - "alloy-eips 0.3.6", - "alloy-json-rpc 0.3.6", - "alloy-network 0.3.6", - "alloy-network-primitives 0.3.6", - "alloy-primitives 0.8.5", - "alloy-rpc-client 0.3.6", - "alloy-rpc-types-eth 0.3.6", - "alloy-transport 0.3.6", - "alloy-transport-http 0.3.6", - "async-stream", - "async-trait", - "auto_impl", - "dashmap 6.1.0", + "dashmap", "futures", "futures-utils-wasm", "lru", @@ -543,20 +325,20 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f5da2c55cbaf229bad3c5f8b00b5ab66c74ef093e5f3a753d874cfecf7d2281" +checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" dependencies = [ - "alloy-json-rpc 0.2.1", - "alloy-primitives 0.7.7", - "alloy-transport 0.2.1", + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", "bimap", "futures", "serde", "serde_json", "tokio", "tokio-stream", - "tower 0.4.13", + "tower", "tracing", ] @@ -584,15 +366,15 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b38e3ffdb285df5d9f60cb988d336d9b8e3505acb78750c3bc60336a7af41d3" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" dependencies = [ - "alloy-json-rpc 0.2.1", - "alloy-primitives 0.7.7", + "alloy-json-rpc", + "alloy-primitives", "alloy-pubsub", - "alloy-transport 0.2.1", - "alloy-transport-http 0.2.1", + "alloy-transport", + "alloy-transport-http", "alloy-transport-ipc", "alloy-transport-ws", "futures", @@ -602,97 +384,52 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower 0.4.13", - "tracing", - "url", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" -dependencies = [ - "alloy-json-rpc 0.3.6", - "alloy-transport 0.3.6", - "alloy-transport-http 0.3.6", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower 0.5.1", + "tower", "tracing", "url", ] [[package]] name = "alloy-rpc-types" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c31a3750b8f5a350d17354e46a52b0f2f19ec5f2006d816935af599dedc521" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ + "alloy-primitives", "alloy-rpc-types-engine", - "alloy-rpc-types-eth 0.2.1", - "alloy-serde 0.2.1", + "alloy-rpc-types-eth", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-engine" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff63f51b2fb2f547df5218527fd0653afb1947bf7fead5b3ce58c75d170b30f7" +checksum = "e0285c4c09f838ab830048b780d7f4a4f460f309aa1194bb049843309524c64c" dependencies = [ - "alloy-consensus 0.2.1", - "alloy-eips 0.2.1", - "alloy-primitives 0.7.7", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth 0.2.1", - "alloy-serde 0.2.1", - "jsonwebtoken", - "rand", - "serde", - "thiserror", + "derive_more", + "strum", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e18424d962d7700a882fe423714bd5b9dde74c7a7589d4255ea64068773aef" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ - "alloy-consensus 0.2.1", - "alloy-eips 0.2.1", - "alloy-network-primitives 0.2.1", - "alloy-primitives 0.7.7", + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", "alloy-rlp", - "alloy-serde 0.2.1", - "alloy-sol-types 0.7.7", - "itertools 0.13.0", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" -dependencies = [ - "alloy-consensus 0.3.6", - "alloy-eips 0.3.6", - "alloy-network-primitives 0.3.6", - "alloy-primitives 0.8.5", - "alloy-rlp", - "alloy-serde 0.3.6", - "alloy-sol-types 0.8.5", - "cfg-if", - "derive_more 1.0.0", - "hashbrown 0.14.5", + "alloy-serde", + "alloy-sol-types", + "derive_more", "itertools 0.13.0", "serde", "serde_json", @@ -700,47 +437,22 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33feda6a53e6079895aed1d08dcb98a1377b000d80d16370fbbdb8155d547ef" -dependencies = [ - "alloy-primitives 0.7.7", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ - "alloy-primitives 0.8.5", + "alloy-primitives", "serde", "serde_json", ] [[package]] name = "alloy-signer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740a25b92e849ed7b0fa013951fe2f64be9af1ad5abe805037b44fb7770c5c47" -dependencies = [ - "alloy-primitives 0.7.7", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror", -] - -[[package]] -name = "alloy-signer" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" dependencies = [ - "alloy-primitives 0.8.5", + "alloy-primitives", "async-trait", "auto_impl", "elliptic-curve", @@ -750,14 +462,14 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b0707d4f63e4356a110b30ef3add8732ab6d181dd7be4607bf79b8777105cee" +checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" dependencies = [ - "alloy-consensus 0.2.1", - "alloy-network 0.2.1", - "alloy-primitives 0.7.7", - "alloy-signer 0.2.1", + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", "async-trait", "k256", "rand", @@ -766,26 +478,12 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" dependencies = [ - "alloy-sol-macro-expander 0.7.7", - "alloy-sol-macro-input 0.7.7", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" -dependencies = [ - "alloy-sol-macro-expander 0.8.5", - "alloy-sol-macro-input 0.8.5", + "alloy-sol-macro-expander", + "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", @@ -794,31 +492,12 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" -dependencies = [ - "alloy-json-abi 0.7.7", - "alloy-sol-macro-input 0.7.7", - "const-hex", - "heck 0.5.0", - "indexmap", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.79", - "syn-solidity 0.7.7", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" dependencies = [ - "alloy-json-abi 0.8.5", - "alloy-sol-macro-input 0.8.5", + "alloy-json-abi", + "alloy-sol-macro-input", "const-hex", "heck 0.5.0", "indexmap", @@ -826,17 +505,17 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.79", - "syn-solidity 0.8.5", + "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.7.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" dependencies = [ - "alloy-json-abi 0.7.7", + "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", @@ -844,149 +523,75 @@ dependencies = [ "quote", "serde_json", "syn 2.0.79", - "syn-solidity 0.7.7", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" -dependencies = [ - "alloy-json-abi 0.8.5", - "const-hex", - "dunce", - "heck 0.5.0", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.79", - "syn-solidity 0.8.5", + "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.7.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", ] -[[package]] -name = "alloy-sol-type-parser" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" -dependencies = [ - "alloy-json-abi 0.7.7", - "alloy-primitives 0.7.7", - "alloy-sol-macro 0.7.7", - "const-hex", - "serde", -] - [[package]] name = "alloy-sol-types" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" +checksum = "4aa666f1036341b46625e72bd36878bf45ad0185f1b88601223e1ec6ed4b72b1" dependencies = [ - "alloy-json-abi 0.8.5", - "alloy-primitives 0.8.5", - "alloy-sol-macro 0.8.5", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", "const-hex", "serde", ] [[package]] name = "alloy-transport" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0590afbdacf2f8cca49d025a2466f3b6584a016a8b28f532f29f8da1007bae" -dependencies = [ - "alloy-json-rpc 0.2.1", - "base64 0.22.1", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower 0.4.13", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" dependencies = [ - "alloy-json-rpc 0.3.6", - "base64 0.22.1", + "alloy-json-rpc", + "base64", "futures-util", "futures-utils-wasm", "serde", "serde_json", "thiserror", "tokio", - "tower 0.5.1", + "tower", "tracing", "url", ] [[package]] name = "alloy-transport-http" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2437d145d80ea1aecde8574d2058cceb8b3c9cba05f6aea8e67907c660d46698" -dependencies = [ - "alloy-json-rpc 0.2.1", - "alloy-transport 0.2.1", - "reqwest", - "serde_json", - "tower 0.4.13", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ - "alloy-json-rpc 0.3.6", - "alloy-transport 0.3.6", + "alloy-json-rpc", + "alloy-transport", "reqwest", "serde_json", - "tower 0.5.1", + "tower", "tracing", "url", ] [[package]] name = "alloy-transport-ipc" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804494366e20468776db4e18f9eb5db7db0fe14f1271eb6dbf155d867233405c" +checksum = "b90cf9cde7f2fce617da52768ee28f522264b282d148384a4ca0ea85af04fa3a" dependencies = [ - "alloy-json-rpc 0.2.1", + "alloy-json-rpc", "alloy-pubsub", - "alloy-transport 0.2.1", + "alloy-transport", "bytes", "futures", "interprocess", @@ -999,12 +604,12 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.2.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af855163e7df008799941aa6dd324a43ef2bf264b08ba4b22d44aad6ced65300" +checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" dependencies = [ "alloy-pubsub", - "alloy-transport 0.2.1", + "alloy-transport", "futures", "http", "rustls", @@ -1074,9 +679,9 @@ checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" name = "apps" version = "0.1.0" dependencies = [ - "alloy 0.2.1", - "alloy-primitives 0.8.5", - "alloy-sol-types 0.8.5", + "alloy", + "alloy-primitives", + "alloy-sol-types", "anyhow", "clap", "env_logger", @@ -1412,12 +1017,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -1580,9 +1179,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -1653,9 +1252,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1737,12 +1336,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "core-foundation" version = "0.9.4" @@ -1813,19 +1406,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "dashmap" version = "6.1.0" @@ -1856,15 +1436,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - [[package]] name = "derivative" version = "2.2.0" @@ -1876,19 +1447,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.79", -] - [[package]] name = "derive_more" version = "1.0.0" @@ -2105,6 +1663,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2164,9 +1728,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2179,9 +1743,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2189,15 +1753,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2206,15 +1770,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -2223,21 +1787,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2275,17 +1839,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2297,8 +1859,8 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" name = "governance-methods" version = "0.1.0" dependencies = [ - "alloy-primitives 0.8.5", - "alloy-sol-types 0.8.5", + "alloy-primitives", + "alloy-sol-types", "hex", "risc0-build", "risc0-build-ethereum", @@ -2331,17 +1893,18 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] [[package]] name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] [[package]] name = "heck" @@ -2621,21 +2184,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonwebtoken" -version = "9.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" -dependencies = [ - "base64 0.21.7", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - [[package]] name = "k256" version = "0.13.4" @@ -2743,11 +2291,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2864,12 +2412,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" version = "0.1.46" @@ -2930,21 +2472,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" @@ -3057,16 +2596,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pem" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" -dependencies = [ - "base64 0.22.1", - "serde", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -3096,18 +2625,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", @@ -3142,18 +2671,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -3231,9 +2748,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -3466,7 +2983,7 @@ version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-channel", "futures-core", @@ -3569,7 +3086,7 @@ dependencies = [ [[package]] name = "risc0-build-ethereum" -version = "1.1.3" +version = "1.1.4" dependencies = [ "anyhow", "hex", @@ -3620,9 +3137,9 @@ dependencies = [ [[package]] name = "risc0-ethereum-contracts" -version = "1.1.3" +version = "1.1.4" dependencies = [ - "alloy 0.3.3", + "alloy", "anyhow", "risc0-zkvm", ] @@ -3817,9 +3334,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring", @@ -3881,9 +3398,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -4084,18 +3601,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - [[package]] name = "slab" version = "0.4.9" @@ -4211,21 +3716,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "syn-solidity" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", @@ -4327,37 +3820,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -4446,9 +3908,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", @@ -4490,21 +3952,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.5.1" @@ -4610,9 +4057,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", diff --git a/examples/governance/README.md b/examples/governance/README.md index ac8d7709..19edaf4c 100644 --- a/examples/governance/README.md +++ b/examples/governance/README.md @@ -68,7 +68,7 @@ This hash accumulator (`ballotHash`) is a commitment that allows offchain voting [Governor]: https://docs.openzeppelin.com/contracts/4.x/governance [instructions]: ./instructions.md [journal]: https://dev.risczero.com/terminology#journal -[RiscZeroGovernor.sol]: ./contracts/RiscZeroGovernor.sol +[RiscZeroGovernor.sol]: ./contracts/src/RiscZeroGovernor.sol [verifier contract]: https://dev.risczero.com/api/blockchain-integration/contracts/verifier [What does Risc Zero enable]: https://dev.risczero.com/api/use-cases [zkVM]: https://dev.risczero.com/zkvm diff --git a/examples/governance/apps/Cargo.toml b/examples/governance/apps/Cargo.toml index d7bd22b4..76a654b6 100644 --- a/examples/governance/apps/Cargo.toml +++ b/examples/governance/apps/Cargo.toml @@ -4,7 +4,7 @@ version = { workspace = true } edition = { workspace = true } [dependencies] -alloy = { version = "0.2", features = ["full"] } +alloy = { version = "0.4", features = ["full"] } alloy-primitives = { workspace = true } alloy-sol-types = { workspace = true } anyhow = { workspace = true } diff --git a/examples/governance/methods/guest/Cargo.lock b/examples/governance/methods/guest/Cargo.lock index 86ee0f8d..5a4b8313 100644 --- a/examples/governance/methods/guest/Cargo.lock +++ b/examples/governance/methods/guest/Cargo.lock @@ -283,9 +283,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -706,12 +706,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "paste" @@ -735,12 +732,6 @@ dependencies = [ "spki", ] -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -784,9 +775,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] diff --git a/examples/governance/methods/src/lib.rs b/examples/governance/methods/src/lib.rs index bc3e1b11..062af436 100644 --- a/examples/governance/methods/src/lib.rs +++ b/examples/governance/methods/src/lib.rs @@ -22,7 +22,7 @@ mod test { use crate::FINALIZE_VOTES_ELF; - const TEST_INPUT: &'static [u8] = &hex!( + const TEST_INPUT: &[u8] = &hex!( "123ef2afce66c417062d3d2c69ca0a612c95de6ae9331e5e9640a361b787c1c8" "000001004f81992fce2e1846dd528ec0102e6ee1f61ed3e20000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" @@ -30,7 +30,7 @@ mod test { "eca97fde3756db8dd50882a26dcfa5ea0465615a2bd0468e6a715cf9378e9b28ba4314d567dd731e083c4b3d6f44e8f03bfb" ); - const TEST_OUTPUT: &'static [u8] = &hex!( + const TEST_OUTPUT: &[u8] = &hex!( "123ef2afce66c417062d3d2c69ca0a612c95de6ae9331e5e9640a361b787c1c8" "2b45288717bd1179cdda9be4ae9cb416e4e42028537046902c3a173596b4d623" "000000014f81992fce2e1846dd528ec0102e6ee1f61ed3e2" @@ -40,7 +40,7 @@ mod test { #[test] fn process_basic_finalization_input() { let env = ExecutorEnv::builder() - .write_slice(&TEST_INPUT) + .write_slice(TEST_INPUT) .build() .unwrap(); let exec = default_executor(); diff --git a/examples/token-stats/Cargo.lock b/examples/token-stats/Cargo.lock index bbd1e3d5..96aa8472 100644 --- a/examples/token-stats/Cargo.lock +++ b/examples/token-stats/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -46,9 +46,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c37d89f69cb43901949ba29307ada8b9e3b170f94057ad4c04d6fd169d24d65f" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" dependencies = [ "alloy-consensus", "alloy-core", @@ -65,9 +65,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609d6ef5716e94875b19b91faf33ef041baff373d3fff70531424f372d27bbd2" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" dependencies = [ "num_enum", "strum", @@ -75,58 +75,41 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", + "derive_more 1.0.0", "serde", ] -[[package]] -name = "alloy-contract" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335d62de1a887f1b780441f8a3037f39c9fb26839cc9acd891c9b80396145cd5" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.3", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "thiserror", -] - [[package]] name = "alloy-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b095eb0533144b4497e84a9cc3e44a5c2e3754a3983c0376a55a2f9183a53e" +checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", + "alloy-rlp", "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4004925bff5ba0a11739ae84dbb6601a981ea692f3bd45b626935ee90a6b8471" +checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "alloy-sol-types", "const-hex", @@ -142,7 +125,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "serde", ] @@ -153,7 +136,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "k256 0.13.4", "serde", @@ -161,13 +144,13 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "c-kzg", @@ -179,22 +162,22 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9996daf962fd0a90d3c93b388033228865953b92de7bb1959b891d78750a4091" +checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-type-parser", "serde", "serde_json", @@ -202,11 +185,11 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-types", "serde", "serde_json", @@ -216,15 +199,15 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe714e233f9eaf410de95a9af6bcd05d3a7f8c8de7a0817221e95a6b642a080" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -237,12 +220,13 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c5a38117974c5776a45e140226745a0b664f79736aa900995d8e4121558e064" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ + "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-serde", "serde", ] @@ -263,7 +247,7 @@ dependencies = [ "k256 0.13.4", "keccak-asm", "proptest", - "rand 0.8.5", + "rand", "ruint", "serde", "tiny-keccak", @@ -271,31 +255,36 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more 1.0.0", + "hashbrown 0.14.5", "hex-literal", + "indexmap 2.6.0", "itoa", "k256 0.13.4", "keccak-asm", + "paste", "proptest", - "rand 0.8.5", + "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65633d6ef83c3626913c004eaf166a6dd50406f724772ea8567135efd6dc5d3" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" dependencies = [ "alloy-chains", "alloy-consensus", @@ -303,7 +292,7 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rpc-client", "alloy-rpc-types-eth", "alloy-transport", @@ -316,7 +305,7 @@ dependencies = [ "futures-utils-wasm", "lru", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "thiserror", @@ -349,16 +338,17 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" dependencies = [ "alloy-json-rpc", + "alloy-primitives 0.8.5", "alloy-transport", "alloy-transport-http", "futures", "pin-project", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "tokio", @@ -370,10 +360,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ + "alloy-primitives 0.8.5", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -381,41 +372,41 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a59b1d7c86e0a653e7f3d29954f6de5a2878d8cfd1f010ff93be5c2c48cd3b1" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-network-primitives", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-serde", "alloy-sol-types", + "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", - "thiserror", ] [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "serde", "serde_json", ] [[package]] name = "alloy-signer" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" dependencies = [ - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "async-trait", "auto_impl", "elliptic-curve 0.13.8", @@ -425,9 +416,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -439,9 +430,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -457,9 +448,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" dependencies = [ "const-hex", "dunce", @@ -472,9 +463,9 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" dependencies = [ "serde", "winnow", @@ -482,12 +473,12 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.3", + "alloy-primitives 0.8.5", "alloy-sol-macro", "const-hex", "serde", @@ -495,9 +486,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -514,13 +505,13 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.8", + "reqwest", "serde_json", "tower", "tracing", @@ -803,7 +794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -813,7 +804,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -828,31 +819,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-sse" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6fa871e4334a622afd6bb2f611635e8083a6f5e2936c0f90f37c7ef9856298" -dependencies = [ - "async-channel", - "futures-lite", - "http-types", - "log", - "memchr", - "pin-project-lite", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -886,6 +852,12 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "aurora-engine-modexp" version = "1.1.0" @@ -946,12 +918,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -964,25 +930,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "beacon-api-client" -version = "0.1.0" -source = "git+https://github.com/ralexstokes/ethereum-consensus.git?rev=cf3c404043230559660810bc0c9d6d5a8498d819#cf3c404043230559660810bc0c9d6d5a8498d819" -dependencies = [ - "clap", - "ethereum-consensus", - "http 0.2.12", - "itertools 0.10.5", - "mev-share-sse", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - [[package]] name = "bincode" version = "1.3.3" @@ -1088,7 +1035,7 @@ checksum = "94032d3eece78099780ba07605d8ba6943e47ee152f76d73f1682e2f40cf889c" dependencies = [ "duplicate", "maybe-async", - "reqwest 0.12.8", + "reqwest", "serde", "thiserror", ] @@ -1146,9 +1093,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", @@ -1219,9 +1166,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.24" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1238,15 +1185,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "num-traits", -] - [[package]] name = "clap" version = "4.5.19" @@ -1293,15 +1231,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "const-hex" version = "1.13.1" @@ -1327,15 +1256,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "core" -version = "0.1.0" -dependencies = [ - "alloy-primitives 0.8.3", - "alloy-sol-types", - "risc0-steel", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -1400,7 +1320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1412,7 +1332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -1640,7 +1560,7 @@ dependencies = [ "generic-array", "group 0.12.1", "pkcs8 0.9.0", - "rand_core 0.6.4", + "rand_core", "sec1 0.3.0", "subtle", "zeroize", @@ -1659,7 +1579,7 @@ dependencies = [ "generic-array", "group 0.13.0", "pkcs8 0.10.2", - "rand_core 0.6.4", + "rand_core", "sec1 0.7.3", "subtle", "zeroize", @@ -1686,7 +1606,7 @@ dependencies = [ "hex", "k256 0.11.6", "log", - "rand 0.8.5", + "rand", "rlp", "serde", "sha3", @@ -1720,38 +1640,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - [[package]] name = "ethereum-consensus" version = "0.1.1" @@ -1765,7 +1653,7 @@ dependencies = [ "integer-sqrt", "multiaddr", "multihash", - "rand 0.8.5", + "rand", "serde", "serde_json", "serde_yaml", @@ -1776,64 +1664,6 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve 0.13.8", - "ethabi", - "generic-array", - "k256 0.13.4", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.1.1" @@ -1857,7 +1687,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1867,7 +1697,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -1878,7 +1708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -1889,6 +1719,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1948,9 +1784,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1963,9 +1799,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1973,15 +1809,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1990,30 +1826,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -2022,21 +1843,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2067,17 +1888,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -2086,14 +1896,14 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2108,7 +1918,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff 0.12.1", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -2119,22 +1929,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.0", - "rand_core 0.6.4", + "rand_core", "subtle", ] [[package]] name = "h2" -version = "0.3.26" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap 2.6.0", "slab", "tokio", @@ -2164,7 +1974,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", "serde", ] @@ -2173,6 +1982,11 @@ name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -2223,26 +2037,15 @@ dependencies = [ "alloy-sol-types", "anyhow", "clap", - "core", - "methods", "risc0-steel", "risc0-zkvm", + "token-stats-core", + "token-stats-methods", "tokio", "tracing-subscriber 0.3.18", "url", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -2254,17 +2057,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -2272,7 +2064,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -2281,69 +2073,19 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "http-types" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" -dependencies = [ - "anyhow", - "async-channel", - "base64 0.13.1", - "futures-lite", - "infer", - "pin-project-lite", - "rand 0.7.3", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "url", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", + "bytes", + "futures-util", + "http", + "http-body", "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", ] +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + [[package]] name = "hyper" version = "1.4.1" @@ -2353,8 +2095,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -2370,8 +2113,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.4.1", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -2381,19 +2124,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -2402,7 +2132,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2419,9 +2149,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -2448,24 +2178,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -2495,21 +2207,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.0", -] - -[[package]] -name = "infer" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", + "serde", ] [[package]] @@ -2694,11 +2392,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2751,32 +2449,6 @@ dependencies = [ "paste", ] -[[package]] -name = "methods" -version = "0.1.0" -dependencies = [ - "risc0-build", -] - -[[package]] -name = "mev-share-sse" -version = "0.1.6" -source = "git+https://github.com/paradigmxyz/mev-share-rs?rev=9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8#9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8" -dependencies = [ - "async-sse", - "bytes", - "ethers-core", - "futures-util", - "http-types", - "pin-project-lite", - "reqwest 0.11.27", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - [[package]] name = "mime" version = "0.3.17" @@ -2800,7 +2472,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.52.0", ] @@ -2975,7 +2647,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.79", @@ -3005,21 +2676,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3027,31 +2695,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "openssl" version = "0.10.66" @@ -3134,12 +2777,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.3" @@ -3188,18 +2825,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", @@ -3244,12 +2881,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "ppv-lite86" version = "0.2.20" @@ -3267,9 +2898,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", "uint", ] @@ -3340,9 +2968,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -3358,8 +2986,8 @@ dependencies = [ "bitflags 2.6.0", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax 0.8.5", "rusty-fork", @@ -3421,7 +3049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "rand 0.8.5", + "rand", "ring", "rustc-hash", "rustls", @@ -3459,19 +3087,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -3479,18 +3094,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", + "serde", ] [[package]] @@ -3500,16 +3106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -3518,16 +3115,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -3536,7 +3124,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3554,7 +3142,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom", "libredox", "thiserror", ] @@ -3603,48 +3191,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.8" @@ -3653,15 +3199,17 @@ checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -3673,12 +3221,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -3695,9 +3244,9 @@ dependencies = [ [[package]] name = "revm" -version = "14.0.2" +version = "14.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f3f55d0414c3d73902d876ba3d55a654f05fe937089fbf5f34b1ced26d78d5" +checksum = "641702b12847f9ed418d552f4fcabe536d867a2c980e96b6e7e25d7b992f929f" dependencies = [ "auto_impl", "cfg-if", @@ -3710,9 +3259,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "10.0.2" +version = "10.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713dbb271acd13afb06dcd460c1dc43da211e7ac9bc73cdf13528f615f55f96b" +checksum = "2e5e14002afae20b5bf1566f22316122f42f57517000e559c55b25bf7a49cba2" dependencies = [ "revm-primitives", "serde", @@ -3720,9 +3269,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "11.0.2" +version = "11.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73010c271d53fa7904e9845338e95f3955eb1200a0355e0abfdb89c41aaa9cd" +checksum = "3198c06247e8d4ad0d1312591edf049b0de4ddffa9fecb625c318fd67db8639b" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -3738,12 +3287,13 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "9.0.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a6bff9dbde3370a5ac9555104117f7e6039b3cc76e8d5d9d01899088beca2a" +checksum = "6f1525851a03aff9a9d6a1d018b414d76252d6802ab54695b27093ecd7e7a101" dependencies = [ - "alloy-eips", - "alloy-primitives 0.8.3", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives 0.8.5", "auto_impl", "bitflags 2.6.0", "bitvec", @@ -3751,7 +3301,6 @@ dependencies = [ "cfg-if", "dyn-clone", "enumn", - "hashbrown 0.14.5", "hex", "serde", ] @@ -3785,7 +3334,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom", "libc", "spin", "untrusted", @@ -3873,7 +3422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1714b8968a5e4583a15018dc2ae95878c76f4cdbc643268a34670fde5b08252a" dependencies = [ "bytemuck", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3898,28 +3447,25 @@ dependencies = [ [[package]] name = "risc0-steel" -version = "0.13.3" +version = "1.1.4" dependencies = [ "alloy", "alloy-consensus", - "alloy-contract", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives 0.8.3", - "alloy-provider", + "alloy-primitives 0.8.5", "alloy-rlp", "alloy-rlp-derive", - "alloy-rpc-types-eth", "alloy-sol-types", "anyhow", - "beacon-api-client", "ethereum-consensus", "log", "nybbles", "once_cell", + "reqwest", "revm", "serde", + "serde_json", "sha2 0.10.8", + "thiserror", "tokio", "url", ] @@ -3940,7 +3486,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core 0.6.4", + "rand_core", "risc0-core", "risc0-zkvm-platform", "serde", @@ -3960,7 +3506,7 @@ dependencies = [ "borsh", "bytemuck", "bytes", - "getrandom 0.2.15", + "getrandom", "hex", "lazy-regex", "prost", @@ -3988,7 +3534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6acf0b0d7a55578f892e0460ed1f2ca06d0380e32440531d80ca82530d41272" dependencies = [ "bytemuck", - "getrandom 0.2.15", + "getrandom", "libm", "stability", ] @@ -4000,21 +3546,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rrs-lib" version = "0.1.0" @@ -4041,7 +3575,7 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", + "rand", "rlp", "ruint-macro", "serde", @@ -4106,9 +3640,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring", @@ -4118,15 +3652,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4177,35 +3702,11 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more 0.99.18", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -4250,7 +3751,7 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "rand 0.8.5", + "rand", "secp256k1-sys", ] @@ -4346,17 +3847,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" -dependencies = [ - "percent-encoding", - "serde", - "thiserror", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4456,7 +3946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4466,7 +3956,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -4598,7 +4088,7 @@ dependencies = [ "byteorder", "crunchy", "lazy_static", - "rand 0.8.5", + "rand", "rustc-hex", ] @@ -4632,9 +4122,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", @@ -4683,20 +4173,20 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -4715,7 +4205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand", "once_cell", "rustix", "windows-sys 0.59.0", @@ -4784,6 +4274,22 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "token-stats-core" +version = "0.1.0" +dependencies = [ + "alloy-primitives 0.8.5", + "alloy-sol-types", + "risc0-steel", +] + +[[package]] +name = "token-stats-methods" +version = "0.1.0" +dependencies = [ + "risc0-build", +] + [[package]] name = "tokio" version = "1.40.0" @@ -5066,7 +4572,6 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] @@ -5102,12 +4607,6 @@ dependencies = [ "libc", ] -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "want" version = "0.3.1" @@ -5117,12 +4616,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5437,16 +4930,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wyz" version = "0.5.1" diff --git a/examples/token-stats/Cargo.toml b/examples/token-stats/Cargo.toml index 60a3170f..729cb694 100644 --- a/examples/token-stats/Cargo.toml +++ b/examples/token-stats/Cargo.toml @@ -18,7 +18,8 @@ alloy-sol-types = { version = "0.8" } anyhow = "1.0" clap = { version = "4.4", features = ["derive", "env"] } log = "0.4" -methods = { path = "methods" } +token-stats-core = { path = "core" } +token-stats-methods = { path = "methods" } once_cell = "1.19" rlp = "0.5.2" serde = "1.0" diff --git a/examples/token-stats/README.md b/examples/token-stats/README.md index 45a336b8..8627791f 100644 --- a/examples/token-stats/README.md +++ b/examples/token-stats/README.md @@ -8,7 +8,7 @@ To get started, you need to have Rust installed. If you haven't done so, follow Next, you will also need to have the `cargo-risczero` tool installed following the instructions [here][install-risczero]. -You'll also need access to an Ethereum Mainnet RPC endpoint. You can for example use [ethereum-rpc.publicnode.com](https://ethereum-rpc.publicnode.com/) or a commercial RPC provider like [Alchemy](www.alchemy.com). +You'll also need access to an Ethereum Mainnet RPC endpoint. You can for example use [ethereum-rpc.publicnode.com](https://ethereum-rpc.publicnode.com/) or a commercial RPC provider like [Alchemy](https://www.alchemy.com/). ## Run the example diff --git a/examples/token-stats/core/Cargo.toml b/examples/token-stats/core/Cargo.toml index e6fa7002..7c769ea4 100644 --- a/examples/token-stats/core/Cargo.toml +++ b/examples/token-stats/core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "core" +name = "token-stats-core" version = "0.1.0" edition = "2021" diff --git a/examples/token-stats/host/Cargo.toml b/examples/token-stats/host/Cargo.toml index 4f6469d7..575c546f 100644 --- a/examples/token-stats/host/Cargo.toml +++ b/examples/token-stats/host/Cargo.toml @@ -7,10 +7,10 @@ edition = "2021" alloy-sol-types = { workspace = true } anyhow = { workspace = true } clap = { workspace = true } -core = { path = "../core" } -methods = { workspace = true } risc0-steel = { workspace = true, features = ["host"] } risc0-zkvm = { workspace = true, features = ["client"] } +token-stats-core = { workspace = true } +token-stats-methods = { workspace = true } tokio = { workspace = true } tracing-subscriber = { workspace = true } url = { workspace = true } diff --git a/examples/token-stats/host/src/main.rs b/examples/token-stats/host/src/main.rs index f3d65517..eed3f774 100644 --- a/examples/token-stats/host/src/main.rs +++ b/examples/token-stats/host/src/main.rs @@ -15,13 +15,13 @@ use alloy_sol_types::{SolCall, SolValue}; use anyhow::{Context, Result}; use clap::Parser; -use core::{APRCommitment, CometMainInterface, CONTRACT}; -use methods::TOKEN_STATS_ELF; use risc0_steel::{ ethereum::{EthEvmEnv, ETH_MAINNET_CHAIN_SPEC}, Contract, }; use risc0_zkvm::{default_executor, ExecutorEnv}; +use token_stats_core::{APRCommitment, CometMainInterface, CONTRACT}; +use token_stats_methods::TOKEN_STATS_ELF; use tracing_subscriber::EnvFilter; use url::Url; @@ -73,8 +73,6 @@ async fn main() -> Result<()> { CONTRACT, rate ); - // Get the commitment to verify execution later. - let commitment = env.commitment().clone(); // Finally, construct the input from the environment. let input = env.into_input().await?; @@ -91,9 +89,10 @@ async fn main() -> Result<()> { .context("failed to run executor")? }; + // The journal should be the ABI encoded commitment. let apr_commit = APRCommitment::abi_decode(&session_info.journal.bytes, true) .context("failed to decode journal")?; - assert_eq!(apr_commit.commitment, commitment); + println!("{:?}", apr_commit.commitment); // Calculation is handling `/ 10^18 * 100` to match precision for a percentage. let apr = apr_commit.annualSupplyRate as f64 / 10f64.powi(16); diff --git a/examples/token-stats/methods/Cargo.toml b/examples/token-stats/methods/Cargo.toml index 6de3c23b..f6449c19 100644 --- a/examples/token-stats/methods/Cargo.toml +++ b/examples/token-stats/methods/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "methods" +name = "token-stats-methods" version = "0.1.0" edition = "2021" diff --git a/examples/token-stats/methods/guest/Cargo.toml b/examples/token-stats/methods/guest/Cargo.toml index e1f1875e..7fc00b16 100644 --- a/examples/token-stats/methods/guest/Cargo.toml +++ b/examples/token-stats/methods/guest/Cargo.toml @@ -7,9 +7,9 @@ edition = "2021" [dependencies] alloy-sol-types = { version = "0.8" } -core = { path = "../../core" } risc0-steel = { path = "../../../../steel" } risc0-zkvm = { version = "1.1.2", default-features = false, features = ["std"] } +token-stats-core = { path = "../../core" } [patch.crates-io] # use optimized risc0 circuit diff --git a/examples/token-stats/methods/guest/src/main.rs b/examples/token-stats/methods/guest/src/main.rs index 59ed016b..86403326 100644 --- a/examples/token-stats/methods/guest/src/main.rs +++ b/examples/token-stats/methods/guest/src/main.rs @@ -13,12 +13,12 @@ // limitations under the License. use alloy_sol_types::SolValue; -use core::{APRCommitment, CometMainInterface, CONTRACT}; use risc0_steel::{ ethereum::{EthEvmInput, ETH_MAINNET_CHAIN_SPEC}, Contract, }; use risc0_zkvm::guest::env; +use token_stats_core::{APRCommitment, CometMainInterface, CONTRACT}; const SECONDS_PER_YEAR: u64 = 60 * 60 * 24 * 365; diff --git a/examples/token-stats/rust-toolchain.toml b/examples/token-stats/rust-toolchain.toml index 6c18dfcd..3fd28115 100644 --- a/examples/token-stats/rust-toolchain.toml +++ b/examples/token-stats/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] channel = "stable" -components = ["rustfmt", "rust-src"] -profile = "minimal" \ No newline at end of file +components = ["clippy", "rustfmt", "rust-src"] +profile = "minimal" diff --git a/ffi/README.md b/ffi/README.md index 2dc61dfc..a2770746 100644 --- a/ffi/README.md +++ b/ffi/README.md @@ -1,5 +1,3 @@ # RISC Zero Forge FFI This tool provides a Command Line Interface (CLI) enabling the communication between the [Foundry Forge ffi cheatcode](https://book.getfoundry.sh/cheatcodes/ffi) and the RISC Zero zkVM. - -The [BonsaiCheat](../contracts/src/BonsaiCheats.sol) contract shows an example of how to integrate this tool. \ No newline at end of file diff --git a/ffi/guests/echo/Cargo.lock b/ffi/guests/echo/Cargo.lock new file mode 100644 index 00000000..b4675d4e --- /dev/null +++ b/ffi/guests/echo/Cargo.lock @@ -0,0 +1,1062 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "anyhow" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "sha2", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn_derive", +] + +[[package]] +name = "bytemuck" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "echo" +version = "0.1.0" +dependencies = [ + "risc0-zkvm", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "risc0-binfmt" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "anyhow", + "borsh", + "elf", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "anyhow", + "metal", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "risc0-zkvm-platform", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "bytemuck", + "rand_core", +] + +[[package]] +name = "risc0-groth16" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize", + "bytemuck", + "hex", + "num-bigint", + "num-traits", + "risc0-binfmt", + "risc0-zkp", + "serde", +] + +[[package]] +name = "risc0-zkp" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "getrandom", + "hex", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "semver", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "1.2.0-alpha.1" +source = "git+https://github.com/risc0/risc0?branch=main#0ea136aceab20795ef4eb23d286bc84622061106" +dependencies = [ + "bytemuck", + "getrandom", + "libm", + "stability", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.77", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] diff --git a/steel/CHANGELOG.md b/steel/CHANGELOG.md index 19b3c40c..a795d2de 100644 --- a/steel/CHANGELOG.md +++ b/steel/CHANGELOG.md @@ -2,12 +2,26 @@ All notable changes to this project will be documented in this file. -## [Unreleased] +## [1.1.4](https://github.com/risc0/risc0-ethereum/releases/tag/v1.1.4) ### ⚡️ Features +- Add `try_call()` method to `CallBuilder` when explicit error handling is necessary. +- Make `BeaconInput`, `BlockInput` and `StateDb` public. +- Implement custom `Debug` formatter for `Commitment`. +- Implement `Deref` for `RlpHeader`. + +### 🛠 Fixes + +- Return specific error, when no `Contract::preflight` was called. +- Use `decode_exact` when RLP-decoding the MPT leaves. + ### 🚨 Breaking Changes +- The Solidity `Commitment` now also contains a hash of the chain specification including chain ID, and fork configuration. +- Instead of committing to the root of a beacon block referenced by its timestamp, we commit to the root of a beacon block referenced by its child timestamp, or equivalently, we commit to the root of the parent beacon block referenced by its timestamp. While this may sound counterintuitive, this is exactly how the [EIP-4788](https://eips.ethereum.org/EIPS/eip-4788) beacon root contract stores its data. This makes the verification side in Solidity much easier and less expensive, and gets rid of the weird code that was necessary to query the child of a beacon block during creation. +- Introduce the `ComposeInput` as a generalized type to represent different commitments. The `BeaconInput` is now a `ComposeInput`. This changes the binary input data, but does not require any code changes. + ## [0.13.2](https://github.com/risc0/risc0-ethereum/releases/tag/steel-v0.13.2) - 2024-10-03 ### 🛠 Fixes @@ -56,9 +70,10 @@ All notable changes to this project will be documented in this file. - `EvmEnv::sol_commitment` has been replaced with `EvmEnv::commitment` (to get a reference), or `EvmEnv::into_commitment` (to consume and return the commitment). - `ETH_SEPOLIA_CHAIN_SPEC` and `ETH_MAINNET_CHAIN_SPEC` have been moved to the `ethereum` module. - `CachedProvider` has been removed completely. As alternatives, you can: - - Use `anvil --fork-url https://ethereum-rpc.publicnode.com@20475759` to create a cached fork for block `20475759`. + - Use `anvil --fork-url https://ethereum-rpc.publicnode.com@20475759` to create a cached fork for block `20475759`. - Cache the RPC responses on an HTTP level using [Tower](https://crates.io/crates/tower) or a caching forward proxy. - The host functions are now `async` instead of blocking: + ```rust // Create an EVM environment from an RPC endpoint and a block number or tag. let mut env = EthEvmEnv::from_rpc(args.rpc_url, BlockNumberOrTag::Latest).await?; diff --git a/steel/Cargo.toml b/steel/Cargo.toml index 39ebf27f..33760f42 100644 --- a/steel/Cargo.toml +++ b/steel/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "risc0-steel" description = "Query Ethereum state, or any other EVM-based blockchain state within the RISC Zero zkVM." -version = "0.13.3" +version = { workspace = true } edition = { workspace = true } license = { workspace = true } homepage = { workspace = true } @@ -14,30 +14,26 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] alloy = { workspace = true, optional = true, features = ["eips", "network", "provider-http", "rpc-types"] } alloy-consensus = { workspace = true } -alloy-contract = { workspace = true, optional = true } -alloy-network = { workspace = true, optional = true } -alloy-network-primitives = { workspace = true, optional = true } alloy-primitives = { workspace = true, features = ["rlp", "serde"] } -alloy-provider = { workspace = true, optional = true } alloy-rlp = { workspace = true } alloy-rlp-derive = { workspace = true } -alloy-rpc-types-eth = { workspace = true, optional = true } alloy-sol-types = { workspace = true } anyhow = { workspace = true } -beacon-api-client = { workspace = true, optional = true } ethereum-consensus = { workspace = true, optional = true } log = { workspace = true, optional = true } nybbles = { workspace = true, features = ["serde"] } once_cell = { workspace = true } +reqwest = { workspace = true, optional = true } revm = { workspace = true, features = ["serde"] } serde = { workspace = true } +serde_json = { workspace = true, optional = true } sha2 = { workspace = true } +thiserror = { workspace = true } tokio = { workspace = true, optional = true } url = { workspace = true, optional = true } [dev-dependencies] alloy = { workspace = true, features = ["contract", "node-bindings"] } -alloy-node-bindings = { workspace = true } alloy-trie = { workspace = true } bincode = { workspace = true } risc0-steel = { path = ".", features = ["host"] } @@ -48,14 +44,10 @@ test-log = { workspace = true } default = [] host = [ "dep:alloy", - "dep:alloy-rpc-types-eth", - "dep:alloy-contract", - "dep:alloy-network", - "dep:alloy-network-primitives", - "dep:alloy-provider", - "dep:beacon-api-client", "dep:ethereum-consensus", "dep:log", + "dep:reqwest", + "dep:serde_json", "dep:tokio", "dep:url", ] diff --git a/steel/README.md b/steel/README.md index c9e62707..59506a32 100644 --- a/steel/README.md +++ b/steel/README.md @@ -1,132 +1,57 @@ ![Steel banner](./steel-banner.png) -# Steel - Hardened off-chain Execution for EVM dapps - -> ***WARNING*** -> This library is under active development, with breaking changes expected. -> We do not recommend the Steel library for production use at this time. - -In the realm of Ethereum and smart contracts, obtaining data directly from the blockchain without altering its state—known as "view calls" — are a fundamental operation. -Traditionally, these operations, especially when it comes to proving and verifying off-chain computations, involve a degree of complexity: either via proof of storage mechanisms requiring detailed knowledge of slot indexes, or via query-specific circuit development. - -In contrast, this library abstracts away these complexities, allowing developers to query Ethereum's state by just defining the Solidity method they wish to call. -To demonstrate a simple instance of using the view call library, let's consider possibly the most common view call: querying the balance of an ERC-20 token for a specific address. -You can find the full example [here](../examples/erc20/README.md). - -## Guest code - -Here is a snippet of the [relevant code](../examples/erc20/methods/guest/src/main.rs) of the guest: - -```rust -/// Specify the function to call using the [`sol!`] macro. -/// This parses the Solidity syntax to generate a struct that implements the `SolCall` trait. -sol! { - /// ERC-20 balance function signature. - interface IERC20 { - function balanceOf(address account) external view returns (uint); - } -} - -/// Function to call, implements the `SolCall` trait. -const CALL: IERC20::balanceOfCall = IERC20::balanceOfCall { - account: address!("9737100D2F42a196DE56ED0d1f6fF598a250E7E4"), -}; - -/// Address of the deployed contract to call the function on (USDT contract on Sepolia). -const CONTRACT: Address = address!("aA8E23Fb1079EA71e0a56F48a2aA51851D8433D0"); -/// Address of the caller. If not provided, the caller will be the [CONTRACT]. -const CALLER: Address = address!("f08A50178dfcDe18524640EA6618a1f965821715"); - -fn main() { - // Read the input from the guest environment. - let input: EthEvmInput = env::read(); - - // Converts the input into a `EvmEnv` for execution. The `with_chain_spec` method is used - // to specify the chain configuration. It checks that the state matches the state root in the - // header provided in the input. - let env = input.into_env().with_chain_spec(Ð_SEPOLIA_CHAIN_SPEC); - // Commit the block hash and number used when deriving `EvmEnv` to the journal. - env::commit_slice(&env.commitment().abi_encode()); - - // Execute the view call; it returns the result in the type generated by the `sol!` macro. - let contract = Contract::new(CONTRACT, &env); - let returns = contract.call_builder(&CALL).from(CALLER).call(); - println!("View call result: {}", returns._0); -} -``` - -## Host code - -Here is a snippet to the [relevant code](../examples/erc20/host/src/main.rs) on the host, it requires the same arguments as the guest: - -```rust -// Create an EVM environment from an RPC endpoint defaulting to the latest block. -let mut env = EthEvmEnv::builder().rpc(args.rpc_url).build().await?; -// The `with_chain_spec` method is used to specify the chain configuration. -env = env.with_chain_spec(Ð_SEPOLIA_CHAIN_SPEC); - -// Preflight the call to prepare the input that is required to execute the function in -// the guest without RPC access. It also returns the result of the call. -let mut contract = Contract::preflight(CONTRACT, &mut env); -let returns = contract.call_builder(&CALL).from(CALLER).call().await?; - -// Finally, construct the input from the environment. -let input = env.into_input().await?; -``` - -## Ethereum integration +# Steel - Boundless runtime for EVM apps -Steel can be integrated with the [Bonsai Foundry Template]. The Ethereum contract that validates the Groth16 proof must also validate the ViewCallEnv commitment. +## Introducing Steel, a production-ready smart contract execution prover -Here is an example of implementing the validation using the Solidity [Steel library]. The journal contains the commitment as well as additional data: +Steel is a production-ready smart contract execution prover designed to bring boundless runtime to all EVM apps. Using execution proofs, Steel enables EVM apps to run offchain, while preserving onchain security. With Steel, you can prove correct smart contract execution without re-execution, allowing blockchain developers unbounded computation over on-chain data.. -```Solidity -struct Journal { - Steel.Commitment commitment; - address tokenAddress; -} +Our partners are already developing game-changing applications with Steel. One application has shown gas savings of 1.2 billion gas for a contract call using around 400,000 SLOADs. 1.2 billion gas is around 30 blocks worth of execution and this can be verified onchain in one proof, that costs under $10 to generate, and less than 300k gas to verify. Steel unlocks boundless application runtime, without rollups, without centralization, without re-writing your smart contracts, and without writing ZK circuits. The brakes are off. -function validate(bytes calldata journalData, bytes calldata seal) external { - Journal memory journal = abi.decode(journalData, (Journal)); - require(Steel.validateCommitment(journal.commitment), "Invalid commitment"); - verifier.verify(seal, imageId, sha256(journalData)); -} -``` - -The guest code to create the journal would look like the following: +## Getting Started with Steel -```rust -use risc0_steel::Commitment; +The recommended place is to start is [Steel examples], specifically the [ERC20 Counter] example. -sol! { - struct Journal { - Commitment commitment; - address tokenAddress; - } -} +The [create-steel-app] script will allow you to set up the erc20-counter example locally in one command: -... - -let journal = Journal { - commitment: view_call_env.block_commitment(), - tokenAddress, -}; -env::commit_slice(&journal.abi_encode()); +```sh +sh <(curl -fsSL https://raw.githubusercontent.com/risc0/risc0-ethereum/refs/heads/release-1.1/steel/docs/create-steel-app/create-steel-app) ``` -We also provide an example, [erc20-counter], showcasing such integration. - -### Block hash validation - -Since internally the `blockhash` opcode is used for validation, the commitment must not be older than 256 blocks. -Given a block time of 12 seconds, this allows just over 50 minutes to create the proof and ensure that the validating transaction is included in a block. -In many cases, this will work just fine: even very large computations such as proving an entire Ethereum block can be done in well under 50 minutes with sufficient resources. - -For scenarios needing a verified block hash older than 256 blocks: - -* Save the required block hash to the contract state if known in advance (e.g., when initiating a governance proposal). -* Use RISC Zero to prove the hash chain from the queried block up to a block within the most recent 256. - -[erc20-counter]: ../examples/erc20-counter/README.md -[Bonsai Foundry Template]: https://github.com/risc0/bonsai-foundry-template -[Steel library]: ../contracts/src/steel/Steel.sol +This example act as your skeleton project structure for further development. Once the script is finished, you can run through a test workflow with either local proving or Bonsai proving. The documentation below uses the ERC20-counter example as a guide to explain Steel in detail. + +You can watch this [video tutorial] for a quick runthrough of using the create-steel-app script to get started. + +## Documentation + +This documentation covers the core concepts of Steel. After reading, you will understand how Steel creates verifiable EVM execution proofs allowing you to carry out execution off-chain verfiably. + +- [Introducing Steel 1.0] (blog post) +- [What is Steel?] +- [How does Steel work?] + - [Proving EVM execution within the zkVM] + - [Verifying the Proof On-Chain] +- [Steel Commitments] + - [Trust Anchor: The Blockhash] + - [What is a Steel Commitment?] + - [Validation of Steel Commitments] + +## Further Reading & Ask Questions + +The RISC Zero [dev docs][dev-docs] are a great place to start to understand the zkVM in detail. If you have any questions, and/or just want to hang out with other builders, please join the [RISC Zero Discord][risczero-discord]. + +[Steel examples]: ../examples/README.md +[ERC20 Counter]: ../examples/erc20-counter/README.md +[create-steel-app]: docs/create-steel-app/README.md +[video tutorial]: https://www.loom.com/share/0e2ede7b9d50464fb729819a8bd24e05?sid=3009618b-38ea-449a-90dc-9b39ef569c67 +[Introducing Steel 1.0]: https://risczero.com/blog/introducing-steel-1.0 +[What is Steel?]: docs/what-is-steel.md +[How does Steel work?]: docs/how-does-steel-work.md +[Proving EVM execution within the zkVM]: docs/how-does-steel-work.md#proving-evm-execution-within-the-zkvm +[Verifying the Proof On-Chain]: docs/how-does-steel-work.md#verifying-the-proof-on-chain +[Steel Commitments]: docs/steel-commitments.md +[Trust Anchor: The Blockhash]: docs/steel-commitments.md#steels-trust-anchor-the-blockhash +[What is a Steel Commitment?]: docs/steel-commitments.md#what-is-a-steel-commitment +[Validation of Steel Commitments]: docs/steel-commitments.md#validation-of-steel-commitments +[dev-docs]: https://dev.risczero.com/api/ +[risczero-discord]: https://discord.com/invite/risczero diff --git a/steel/docs/create-steel-app/README.md b/steel/docs/create-steel-app/README.md new file mode 100644 index 00000000..b7d2cba7 --- /dev/null +++ b/steel/docs/create-steel-app/README.md @@ -0,0 +1,51 @@ +# create-steel-app + +## What does this script do? + +The [create-steel-app] script will allow you to set up the [erc20-counter] example locally in one command. This example will act as your skeleton project structure for your own application. Once the script is finished, you can run through a test workflow with either local proving or Bonsai proving. You can also learn more about Steel by reading the [documentation]. + +## Dependencies + +Make sure to have the following installed: + +1. [Rust] +2. [Foundry] +3. [cargo-risczero] + +## Usage + +```sh +sh <(curl -fsSL https://raw.githubusercontent.com/risc0/risc0-ethereum/refs/heads/release-1.1/steel/docs/create-steel-app/create-steel-app) +``` + +The script will automatically detect your current `cargo-risczero` version and use that for the corresponding version of the `erc20-counter` example. You also have the manual choice between between two release versions: [1.0] and [1.1]. + +Once the script is finished running, you should: + +```console +cd PROJECT_NAME +cargo build +forge build +``` + +After this, you can export the necessary Bonsai environment variables if you'd like to use Bonsai. Otherwise, local proving will be used: + +```console +export BONSAI_API_KEY="YOUR_API_KEY" +export BONSAI_API_URL="BONSAI_URL" # provided with your api key +``` + +_Note: To request an API key [complete the form here]_. + +At this point, you will be able to test against a local deployment by running the provided bash script: + +`./test-local-deployment.sh` + +[create-steel-app]: create-steel-app +[erc20-counter]: https://github.com/risc0/risc0-ethereum/tree/release-1.1/examples/erc20-counter +[documentation]: ../../README.md#documentation +[Rust]: https://www.rust-lang.org/tools/install +[Foundry]: https://book.getfoundry.sh/getting-started/installation +[cargo-risczero]: https://dev.risczero.com/api/zkvm/install +[1.0]: https://github.com/risc0/risc0-ethereum/tree/release-1.0 +[1.1]: https://github.com/risc0/risc0-ethereum/tree/release-1.1 diff --git a/steel/docs/create-steel-app/create-steel-app b/steel/docs/create-steel-app/create-steel-app new file mode 100755 index 00000000..4bac3bbb --- /dev/null +++ b/steel/docs/create-steel-app/create-steel-app @@ -0,0 +1,179 @@ +#!/bin/bash + +# check rust installation +check_rust() { + if ! command -v rustc &> /dev/null; then + echo "rust not found. to install, visit: https://www.rust-lang.org/tools/install" + exit 1 + fi +} + +# check forge installation, suggest installation if not found +check_foundry() { + if ! command -v forge &> /dev/null; then + echo "foundry not found. to install, visit: https://book.getfoundry.sh/getting-started/installation:" + exit 1 + fi +} + +# function to get risc0 version +get_risc0_version() { + RISC0_VERSION=$(cargo risczero --version 2>/dev/null | awk '{print $2}' || echo "") + if [[ -z "$RISC0_VERSION" ]]; then + echo "cargo risczero not found. Please see installation instructions by visiting: https://dev.risczero.com/api/zkvm/install" + exit 1 + fi + echo "detected risc0 version: $RISC0_VERSION" + + # map version to branch + if [[ "$RISC0_VERSION" =~ ^1\.1\. ]]; then + BRANCH="release-1.1" + else + echo "unsupported risc0 version. version 1.1 is supported" + BRANCH="" + fi +} + +select_branch() { + get_risc0_version + + # NOTE: Only 1.1 is currently supported. + + BRANCH="release-1.1" + echo "selected branch: ${BRANCH:?}" + + # Logic below can be used when more than one version is supported. + #if [[ -n "$BRANCH" ]]; then + # echo "using branch: $BRANCH based on installed risc0 version" + # read -p "do you want to use a different release? (y/N): " change_branch + # if [[ "$change_branch" =~ ^[Yy]$ ]]; then + # BRANCH="" + # else + # echo "selected branch: $BRANCH" + # return + # fi + #fi + # + #while [[ -z "$BRANCH" ]]; do + # echo "select the branch you want to use:" + # echo "1) release-1.1" + # read -p "enter 1: " choice + # case $choice in + # 1) BRANCH="release-1.1"; break;; + # *) echo "invalid option. please try again.";; + # esac + #done + # + #echo "selected branch: $BRANCH" +} + +get_folder_name() { + while true; do + read -p "Enter the name for the project folder: " FOLDER_NAME + if [[ -n "$FOLDER_NAME" ]]; then + break + else + echo "Folder name cannot be empty. Please try again." + fi + done +} + +if [ "$(uname)" = "Darwin" ]; then + # MacOS expects an argument for `-i` (empty string is used for no backup) + sed_i() { + sed -i '' "$@" + } +else + # Linux accepts `-i` without an argument + sed_i() { + sed -i "$@" + } +fi + +check_rust +check_foundry +select_branch +get_folder_name + +set -e # exit on any error + +# clone the repo without checking out files +git clone -b $BRANCH https://github.com/risc0/risc0-ethereum.git "$FOLDER_NAME" +cd "$FOLDER_NAME" + +# set up sparse checkout for 'examples/erc20-counter' +git sparse-checkout set examples/erc20-counter +git checkout + +# move erc20-counter out of examples/ +mv examples/erc20-counter ./ +rm -rf examples/ +find . -maxdepth 1 -type f -delete + +# move ALL contents of erc20-counter up one level, including hidden files +mv erc20-counter/{.,}* ./ 2>/dev/null || true + +# remove the erc20-counter directory +rm -r erc20-counter +echo "done. erc20-counter contents and steel directory are now in the root of $FOLDER_NAME." + +# update Cargo.toml files with git dependencies +## apps requires Steel to have "features = ["host"]" +find . -name Cargo.toml -type f | while read -r file; do + if [[ "$file" == *"/apps/"* ]]; then + sed_i \ + -e "s|^risc0-build-ethereum = .*$|risc0-build-ethereum = { git = \"https://github.com/risc0/risc0-ethereum\", branch = \"$BRANCH\" }|" \ + -e "s|^risc0-ethereum-contracts = .*$|risc0-ethereum-contracts = { git = \"https://github.com/risc0/risc0-ethereum\", branch = \"$BRANCH\" }|" \ + -e "s|^risc0-steel = .*$|risc0-steel = { git = \"https://github.com/risc0/risc0-ethereum\", branch = \"$BRANCH\", features = [\"host\"] }|" \ + "$file" + else + sed_i \ + -e "s|^risc0-build-ethereum = .*$|risc0-build-ethereum = { git = \"https://github.com/risc0/risc0-ethereum\", branch = \"$BRANCH\" }|" \ + -e "s|^risc0-ethereum-contracts = .*$|risc0-ethereum-contracts = { git = \"https://github.com/risc0/risc0-ethereum\", branch = \"$BRANCH\" }|" \ + -e "s|^risc0-steel = .*$|risc0-steel = { git = \"https://github.com/risc0/risc0-ethereum\", branch = \"$BRANCH\" }|" \ + "$file" + fi + echo "updated $file" +done +echo "all Cargo.toml files have been updated with git dependencies." + +# update the foundry.toml file to use the lib directory and disable auto_detect_remappings to avoid conflicts +if [ -f "foundry.toml" ]; then + sed_i \ + -e 's|libs = \["../../lib", "../../contracts/src"\]|libs = ["lib"]|' \ + -e '/\[profile\.default\]/a\'$'\n''auto_detect_remappings = false' \ + foundry.toml + echo "updated foundry.toml" +else + echo "foundry.toml not found" +fi + +# forge dependencies/remappings +# remove git conflicts +rm -rf .git +git init + +## create lib directory if it doesn't exist +mkdir -p lib + +## initialize submodules for forge remappings +git submodule init +git submodule add https://github.com/foundry-rs/forge-std lib/forge-std +git submodule add https://github.com/OpenZeppelin/openzeppelin-contracts lib/openzeppelin-contracts +git submodule add https://github.com/risc0/risc0-ethereum lib/risc0-ethereum +git submodule update --init --recursive --quiet + +# update remappings in remappings.txt +if [ -f "remappings.txt" ]; then + sed_i \ + -e 's|forge-std/=../../lib/forge-std/src/|forge-std/=lib/forge-std/src/|' \ + -e 's|openzeppelin/=../../lib/openzeppelin-contracts/|openzeppelin/=lib/openzeppelin-contracts/|' \ + -e 's|risc0/=../../contracts/src/|risc0/=lib/risc0-ethereum/contracts/src/|' \ + remappings.txt + echo "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts" >> remappings.txt + echo "updated remappings in remappings.txt" +else + echo "remappings.txt not found" +fi + +echo "done. $FOLDER_NAME is ready for development." diff --git a/steel/docs/how-does-steel-work.md b/steel/docs/how-does-steel-work.md new file mode 100644 index 00000000..f694f082 --- /dev/null +++ b/steel/docs/how-does-steel-work.md @@ -0,0 +1,129 @@ +# How does Steel work? + +A fundamental operation in smart contracts is to look up data from other contracts, such as the ERC20 token balance of a specific address. This operation is known as a “view call”’ \- it “views” state without altering it. Steels allows developers to query EVM state, within the zkVM, by just defining the Solidity method they wish to view call (using alloy’s [sol\! macro][sol-macro]). + +```rust +sol! { + interface IERC20 { + function balanceOf(address account) external view returns (uint); +} +``` + +_This code is taken from the erc20-counter example, which you can find [here]._ + +The sol\! macro parses Solidity syntax to generate Rust types; this is used to call the `balanceOf` function, within the [guest program], using `balanceOfCall`: + +```rust +// GUEST PROGRAM +// Read the input from the guest environment. +let input: EthEvmInput = env::read(); +let contract: Address = env::read(); +let account: Address = env::read(); + +let evm_env = input.into_env().with_chain_spec(Ð_SEPOLIA_CHAIN_SPEC); + +// Execute the view call; it returns the result in the type generated by the `sol!` macro. +let call = IERC20::balanceOfCall { account }; +let returns = Contract::new(contract, &evm_env) + .call_builder(&call) + .call(); + +// Check that the given account holds at least 1 token. +assert!(returns._0 >= U256::from(1)); + +// Commit the block hash and number used when deriving `view_call_env` to the journal. +let journal = Journal { + commitment: env.into_commitment(), + tokenAddress: contract, +}; +env::commit_slice(&journal.abi_encode()); +``` + +## Proving smart contract execution within the zkVM + +The zkVM guest has no network connection, and there is no way to call an RPC provider to carry out the view call from within the guest; so how does Steel make this possible? + +Steel’s key innovation is the use of [revm] for simulation of an _EVM environment_ within the guest program. This EVM environment has the necessary state populated from RPC calls, and verified with Merkle storage proofs, to carry out verifiable execution of view calls. In the [host program], the [preflight call] constructs the EVM environment, `evm_env` which is passed through as input to the guest program: + +```rust +// HOST PROGRAM +// Create an alloy provider from RPC URL +let provider = ProviderBuilder::new() + .with_recommended_fillers() + .on_http(args.eth_rpc_url); + +// Create an EVM environment from that provider defaulting to the latest block. +let mut env = EthEvmEnv::builder() + .provider(provider.clone()) + .build() + .await?; + +// Preflight the call to prepare the input that is required to execute the function in the guest without RPC access. +let mut contract = Contract::preflight(args.token_contract, &mut env); + +let evm_input = env.into_input().await? +``` + +The `preflight` step calls the RPC provider for the necessary state and for the Merkle storage proofs via `eth_getProof` ([EIP-1186]). These Merkle proofs are given to the guest which verifies them to prove that the RPC data is valid, without having to run a full node and without trusting the host or RPC provider. + +## Verifying the proof on-chain + +At this point, we have generated a proof of: a view call of state on-chain and some execution based on that view call state (e.g. checking that the balance is at least 1). + +When using Steel, the general pattern for onchain functions incorporating Steel follows this pseudo-code: + +```solidity +contract { + function doSomething(journalData, proof) { + validate journal data + validate Steel commitment + + verify proof + doSomethingElse() + } +} +``` + +The interesting on-chain logic, _doSomethingElse()_, is only reached if the journal data, the steel commitment and the proof are all valid. + +Concretely, in the erc20-counter example, the counter is only updated if the caller has a balance of at least one, and this counter update is gated by Steel and the zkVM. + +```solidity +contract Counter { + +function increment(bytes calldata journalData, bytes calldata seal) external { + // Decode and validate the journal data + Journal memory journal = abi.decode(journalData, (Journal)); + require(journal.tokenContract == tokenContract, "Invalid token address"); + require(Steel.validateCommitment(journal.commitment), "Invalid commitment"); + + // Verify the proof + bytes32 journalHash = sha256(journalData); + verifier.verify(seal, imageID, journalHash); + + // If the balance is at least one, update the counter + counter += 1; +} +``` + +Within a single proof, we’ve seen Steel can handle view calls orders of magnitude larger than on-chain execution can handle. Specifically, one partner application has shown gas savings of 1.2 _billion_ gas for a contract call using around 400,000 SLOADs. 1.2 billion gas is around 30 _blocks_ worth of execution and this can be verified onchain in one proof, that costs under $10 to generate, and less than 300k gas to verify (see [RISC Zero’s verification contracts][verifier-contracts]). + +With proof aggregation, cost savings are amortized even further, by taking multiple separate applications of RISC Zero, and wrapping them all up into a single SNARK. +Aggregation is a key feature of [Boundless][boundless-website] + +[boundless-website]: https://beboundless.xyz/ + +--- + +<---- [What is Steel?] | [Steel Commitments] ----> + +[sol-macro]: https://alloy.rs/examples/sol-macro/index.html +[here]: https://github.com/risc0/risc0-ethereum/blob/main/examples/erc20-counter/README.md +[guest program]: https://dev.risczero.com/terminology#guest-program +[revm]: https://docs.rs/revm/latest/revm/ +[host program]: https://dev.risczero.com/terminology#host-program +[preflight call]: https://docs.rs/risc0-steel/latest/risc0_steel/struct.Contract.html +[EIP-1186]: https://eips.ethereum.org/EIPS/eip-1186 +[verifier-contracts]: https://dev.risczero.com/api/blockchain-integration/contracts/verifier +[What is Steel?]: ./what-is-steel.md +[Steel Commitments]: ./steel-commitments.md diff --git a/steel/docs/steel-commitments.md b/steel/docs/steel-commitments.md new file mode 100644 index 00000000..96a03228 --- /dev/null +++ b/steel/docs/steel-commitments.md @@ -0,0 +1,139 @@ +# Steel Commitments + +Steel retrieves state for a view call at a specific block, therefore it commits the relevant block data to the journal for validation on-chain; this data is known as a Steel commitment. + +Concretely, a Steel commitment consists of a block identifier, and the block hash. To validate this block commitment on-chain, the block hash in the commitment is compared with the block hash available on-chain. If there is a discrepancy, there is no guarantee that the proof accurately reflects the correct blockchain state at the specified block. + +## Steel's Trust Anchor: The Blockhash + +Steel uses [revm] to generate an EVM execution environment, `EvmEnv` within the guest. When you create the `EvmEnv`, you can specify a block (the default is the latest block). + +```rust +// Create an EVM environment from that provider +let mut env = EthEvmEnv::builder() + .provider(provider.clone()) + .block_number(20842508) + .build() + .await?; +``` + +This block is used for RPC queries (i.e. `getStorageAt`) during the `preflight` call. Once the preflighting is done, `into_input` is called: + +```rust +let evm_input = env.into_input().await? +``` + +During this `into_input` step, the preflight data is packed into a form that can be read and validated in the guest. + +Crucially, during the step, Steel will use the RPC call [eth\_getProof] for all accounts accessed during the preflight and the return data is combined into a sparse Merkle trie. + +Within the guest, calling `into_env` checks that all Merkle tries are consistent, have the correct root and **computes the corresponding block hash.** + +_This blockhash is Steel's trust anchor; it needs to be recomputed within the guest to validate the integrity of the RPC data._ + +```rust +// Read the input from the guest environment. +let input: EthEvmInput = env::read(); +let contract: Address = env::read(); +let account: Address = env::read(); + +// Converts the input into a `EvmEnv` +let env = input.into_env().with_chain_spec(Ð_SEPOLIA_CHAIN_SPEC); +``` + +For the Steel commitment, it is this block hash, computed within the guest, that is committed to the journal: + +```rust +let journal = Journal { + commitment: env.into_commitment(), + tokenAddress: contract, +}; +env::commit_slice(&journal.abi_encode()); +``` + +This block hash has to be compared on-chain, alongside the verification of the proof, to validate that the Steel proof is correct and to verify the integrity of RPC data. + +## What is a Steel Commitment? + +A commitment consists of two values: the block ID and the block digest. The block ID encodes two values, the Steel version number and a block identifier (e.g. a block number). + +```solidity +struct Commitment { + uint256 id; + bytes32 digest; + bytes32 configID +} +``` + +In the `increment` function in the `Counter` contract, we saw this require statement: + +```solidity +require(Steel.validateCommitment(journal.commitment), "Invalid commitment"); +``` + +The [Steel library](https://github.com/risc0/risc0-ethereum/blob/main/contracts/src/steel/Steel.sol) contains the function `validateCommitment` : + +```solidity +function validateCommitment(Commitment memory commitment) internal view returns (bool) { + (uint240 claimID, uint16 version) = Encoding.decodeVersionedID(commitment.id); + if (version == 0) { + return validateBlockCommitment(claimID, commitment.digest); + } else if (version == 1) { + return validateBeaconCommitment(claimID, commitment.digest); + } else { + revert InvalidCommitmentVersion(); + } +} +``` + +## Validation of Steel Commitments + +Steel supports two methods of commitment validation (see `validateCommitment` in [Steel.sol]); This validation on-chain is essential to ensure that the proof accurately reflects the correct blockchain state. + +1. Block hash commitment + +```solidity +/// @notice Validates if the provided block commitment matches the block hash of the given block number. +/// @param blockNumber The block number to compare against. +/// @param blockHash The block hash to validate. +/// @return True if the block's block hash matches the block hash, false otherwise. +function validateBlockCommitment(uint256 blockNumber, bytes32 blockHash) internal view returns (bool) { + if (block.number - blockNumber > 256) { + revert CommitmentTooOld(); + } + return blockHash == blockhash(blockNumber); +} +``` + +This method uses the `blockhash` opcode to commit to a block hash that is no more than 256 blocks old. With Ethereum's 12-second block time, this provides a window of about 50 minutes to generate the proof and ensure that the validating transaction is contained in a block. This approach will work for most scenarios, including complex computations, as it typically provides sufficient time to generate the proof. + +2. Beacon Block Root Commitment + +```solidity +/// @notice Validates if the provided block commitment matches the block hash of the given block number. +/// @param blockNumber The block number to compare against. +/// @param blockHash The block hash to validate. +/// @return True if the block's block hash matches the block hash, false otherwise. +function validateBlockCommitment(uint256 blockNumber, bytes32 blockHash) internal view returns (bool) { + if (block.number - blockNumber > 256) { + revert CommitmentTooOld(); + } + return blockHash == blockhash(blockNumber); +} +``` + +The second method allows validation using the [EIP-4788] beacon roots contract. This technique extends the time window in which the proof can be validated on-chain to just over a day. It requires access to a beacon API endpoint and can be enabled by calling `EvmEnv::builder().beacon_api()`. However, this approach is specific to Ethereum (L1) Steel proofs and depends on the implementation of EIP-4788. + +Note that EIP-4788 only provides access to the parent beacon root, requiring iterative queries in Solidity to retrieve the target beacon root for validation. This iterative process can result in slightly higher gas costs compared to using the `blockhash` opcode. Overall, it is suitable for environments where longer proof generation times are required. + +--- + +<----[How Does Steel Work?](./how-does-steel-work.md) | [Steel README](../README.md) ----> + +[revm]: https://docs.rs/revm/latest/revm/ +[eth_getProof]: https://docs.alchemy.com/reference/eth-getproof +[Steel library]: https://github.com/risc0/risc0-ethereum/blob/main/contracts/src/steel/Steel.sol +[Steel.sol]: https://github.com/risc0/risc0-ethereum/blob/main/contracts/src/steel/Steel.sol +[EIP-4788]: https://eips.ethereum.org/EIPS/eip-4788 +[How Does Steel Work?]: ./how-does-steel-work.md +[Steel README]: ../README.md diff --git a/steel/docs/what-is-steel.md b/steel/docs/what-is-steel.md new file mode 100644 index 00000000..3d9b58b0 --- /dev/null +++ b/steel/docs/what-is-steel.md @@ -0,0 +1,73 @@ +# What is Steel? + +## Steel: Introducing Smart Contract Execution Proofs + +Steel, together with the zkVM, allows developers to leverage off-chain verifiable smart contract execution. Concretely, this means carrying out EVM execution against verifiable on-chain state, within the zkVM. This will create a proof of the smart contract execution, which upon verification can be used in place of smart contract execution, while preserving on-chain security. + +## On-chain vs off-chain execution + +On-chain execution is limited by the gas limit per block. This is fine for simple execution, but most real-world applications require significantly more capability than what is currently available, even on layer 2 rollups. With Steel, developers can carry out the same EVM execution they would on-chain, but at a much larger scale. This EVM execution is within a boundless and verifiable environment off-chain within the zkVM, allowing for an unprecented amount of scaling for EVM applications. + +To describe how Steel replaces on-chain execution with on-chain verification of smart contract execution proofs, we will walk through a simple example: a counter variable is incremented if, and only if, the ERC20 balance of a certain account is larger than 1. + +This example is purely instructive and by simplifying the execution, we can focus on understanding the specifics of Steel. + +### Without Steel + +```solidity +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract OnChainERC20Counter { + address public tokenContract; + uint256 public counter; + + function checkBalance(address accountAddress) public view returns (uint256) { + return IERC20(tokenContract).balanceOf(accountAddress); + } + + // this function will only update the counter if the account has a valid balance > 1 + function increment(address accountAddress) public { + require(checkBalance(accountAddress) > 1, "balance must be greater than 1"); + counter += 1; + } +} +``` + +The `increment` function uses the `checkBalance` function to return ERC20 the current balance of the account, and the require statement makes sure that the counter is only updated if the balance is larger than 1. + +### With Steel + +```solidity +contract OffChainERC20Counter() { + address public tokenContract; + uint256 public counter; + + // this function will only update the counter if the account has a valid balance > 1 + function increment(bytes calldata journalData, bytes calldata seal) public { + // Decode and validate the journal data + Journal memory journal = abi.decode(journalData, (Journal)); + require(journal.tokenContract == tokenContract, "Invalid Token Address"); + require(Steel.validateCommitment(journal.commitment), "Invalid Steel Commitment"); + + // Verify the execution proof + bytes32 journalHash = sha256(journalData); + verifier.verify(seal, imageID, journalHash); + + counter += 1; + } + } +} +``` + +To make sure that Steel's execution proofs can be trusted, we check the output of the zkVM program to make sure that the token contract address is correct, and we validate the [Steel Commitment]. Only if these are valid, the proof is verified. Upon succesful verification, we can be sure that the account balance is larger than 1 and we increment the counter variable. Notice there is no check on-chain of the balance or any EVM execution other than the validations and proof verification. The EVM execution happens within the zkVM guest program. + +In [How does Steel work?], we dive deeper into how exactly the zkVM guest program verifies state access and runs EVM execution, generating an smart contract execution proof, and verifying the proof on-chain. + +--- + +<---- [Steel README] | [How Does Steel Work?] ----> + +[Steel Commitment]: ./steel-commitments.md +[How does Steel work?]: ./how-does-steel-work.md +[Steel README]: ../README.md +[How Does Steel Work]: ./how-does-steel-work.md diff --git a/steel/src/beacon.rs b/steel/src/beacon.rs index 1cb6580a..d1510be5 100644 --- a/steel/src/beacon.rs +++ b/steel/src/beacon.rs @@ -12,235 +12,343 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{block::BlockInput, Commitment, CommitmentVersion, EvmBlockHeader, GuestEvmEnv}; -use alloy_primitives::B256; +//! Types related to commitments to the beacon block root. +use crate::{ + merkle, BlockHeaderCommit, Commitment, CommitmentVersion, ComposeInput, EvmBlockHeader, +}; +use alloy_primitives::{Sealed, B256}; use serde::{Deserialize, Serialize}; -use sha2::{Digest, Sha256}; + +/// The generalized Merkle tree index of the `block_hash` field in the `BeaconBlock`. +pub const BLOCK_HASH_LEAF_INDEX: usize = 6444; /// Input committing to the corresponding Beacon Chain block root. +pub type BeaconInput = ComposeInput; + +/// Provides verifiable proof that an execution block hash is included in a specific beacon block on +/// the Ethereum blockchain. +/// +/// This type represents a commitment that proves the inclusion of an execution block's hash within +/// a particular beacon block on the Ethereum beacon chain. It relies on a Merkle proof to establish +/// this link, ensuring the integrity and verifiability of the connection between the execution +/// block and the beacon chain. +/// +/// **Important:** This type currently relies on an underlying implementation that only supports the +/// Deneb fork of the beacon chain. If the beacon chain undergoes a future upgrade, this type's +/// functionality may be affected, potentially requiring updates to handle new block structures or +/// proof generation mechanisms. +/// +/// Users should monitor for beacon chain upgrades and ensure they are using a compatible version of +/// this library. +pub type BeaconCommit = GeneralizedBeaconCommit; + +/// A commitment to a field of the Beacon block at a specific index in a Merkle tree, along with a +/// timestamp. +/// +/// The constant generic parameter `LEAF_INDEX` specifies the generalized Merkle tree index of the +/// leaf node in the Merkle tree corresponding to the field. #[derive(Clone, Serialize, Deserialize)] -pub struct BeaconInput { - /// Input committing to an execution block hash. - input: BlockInput, - /// Merkle proof linking the execution block hash to the Beacon block root. - proof: MerkleProof, +pub struct GeneralizedBeaconCommit { + proof: Vec, + timestamp: u64, } -impl BeaconInput { - /// Converts the input into a [EvmEnv] for a verifiable state access in the guest. +impl GeneralizedBeaconCommit { + /// Creates a new `GeneralizedBeaconCommit`. /// - /// [EvmEnv]: crate::EvmEnv - pub fn into_env(self) -> GuestEvmEnv { - let mut env = self.input.into_env(); - - let beacon_root = self.proof.process(env.header.seal()); - env.commitment = Commitment { - blockID: Commitment::encode_id( - env.header().timestamp(), - CommitmentVersion::Beacon as u16, - ), - blockDigest: beacon_root, - }; + /// It panics if `LEAF_INDEX` is zero, because a Merkle tree cannot have a leaf at index 0. + #[must_use] + #[inline] + pub const fn new(proof: Vec, timestamp: u64) -> Self { + assert!(LEAF_INDEX > 0); + Self { proof, timestamp } + } - env + /// Disassembles this `GeneralizedBeaconCommit`, returning the underlying Merkle proof and block + /// timestamp. + #[inline] + pub fn into_parts(self) -> (Vec, u64) { + (self.proof, self.timestamp) } -} -/// Merkle proof-of-inclusion. -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct MerkleProof { - /// Path of Merkle nodes to compute the root. - pub path: Vec, - /// Index of the Merkle leaf to prove. - /// The left-most leaf has index 0 and the right-most leaf 2^depth - 1. - pub index: u32, -} + /// Calculates the root of the Merkle tree containing the given `leaf` hash at `LEAF_INDEX`, + /// using the provided Merkle proof. + #[inline] + pub fn process_proof(&self, leaf: B256) -> Result { + merkle::process_proof(leaf, &self.proof, LEAF_INDEX) + } -impl MerkleProof { - /// Returns the rebuilt hash obtained by traversing the Merkle tree up from `leaf`. + /// Verifies that the given `leaf` hash is present at the `LEAF_INDEX` in the Merkle tree + /// represented by the `root` hash. #[inline] - pub fn process(&self, leaf: B256) -> B256 { - let mut index = self.index; - let mut computed_hash = leaf; - let mut hasher = Sha256::new(); - for node in &self.path { - if index % 2 != 0 { - hasher.update(node); - hasher.update(computed_hash); - } else { - hasher.update(computed_hash); - hasher.update(node); - } - computed_hash.copy_from_slice(&hasher.finalize_reset()); - index /= 2; - } + pub fn verify(&self, leaf: B256, root: B256) -> Result<(), merkle::InvalidProofError> { + merkle::verify(leaf, &self.proof, LEAF_INDEX, root) + } - computed_hash + fn into_commit(self, leaf: B256) -> (u64, B256) { + let beacon_root = self + .process_proof(leaf) + .expect("Invalid beacon inclusion proof"); + (self.timestamp, beacon_root) + } +} + +impl BlockHeaderCommit + for GeneralizedBeaconCommit +{ + #[inline] + fn commit(self, header: &Sealed, config_id: B256) -> Commitment { + let (timestamp, beacon_root) = self.into_commit(header.seal()); + Commitment::new( + CommitmentVersion::Beacon as u16, + timestamp, + beacon_root, + config_id, + ) } } #[cfg(feature = "host")] -mod host { - use super::{BeaconInput, MerkleProof}; - use crate::{ - block::BlockInput, - ethereum::EthBlockHeader, - host::{db::AlloyDb, HostEvmEnv}, - }; +pub(crate) mod host { + use super::*; + use crate::ethereum::EthBlockHeader; use alloy::{network::Ethereum, providers::Provider, transports::Transport}; - use alloy_primitives::Sealable; + use alloy_primitives::B256; use anyhow::{bail, ensure, Context}; - use beacon_api_client::{mainnet::Client as BeaconClient, BeaconHeaderSummary, BlockId}; + use client::BeaconClient; + use ethereum_consensus::ssz::prelude::proofs::Proof; use ethereum_consensus::{ssz::prelude::*, types::SignedBeaconBlock, Fork}; - use proofs::{Proof, ProofAndWitness}; + use proofs::ProofAndWitness; use url::Url; - impl BeaconInput { - /// Derives the verifiable input from a [HostEvmEnv] and a Beacon API endpoint. - pub(crate) async fn from_env_and_endpoint( - env: HostEvmEnv, EthBlockHeader>, - url: Url, + pub(crate) mod client { + use ethereum_consensus::{ + phase0::SignedBeaconBlockHeader, primitives::Root, types::mainnet::SignedBeaconBlock, + Fork, + }; + use reqwest::IntoUrl; + use serde::{Deserialize, Serialize}; + use std::{collections::HashMap, fmt::Display}; + use url::Url; + + /// Errors returned by the [BeaconClient]. + #[derive(Debug, thiserror::Error)] + pub enum Error { + #[error("could not parse URL: {0}")] + Url(#[from] url::ParseError), + #[error("HTTP request failed: {0}")] + Http(#[from] reqwest::Error), + #[error("version field does not match data version")] + VersionMismatch, + } + + /// Response returned by the `get_block_header` API. + #[derive(Debug, Serialize, Deserialize)] + pub struct GetBlockHeaderResponse { + pub root: Root, + pub canonical: bool, + pub header: SignedBeaconBlockHeader, + } + + /// Wrapper returned by the API calls. + #[derive(Serialize, Deserialize)] + struct Response { + data: T, + #[serde(flatten)] + meta: HashMap, + } + + /// Wrapper returned by the API calls that includes a version. + #[derive(Serialize, Deserialize)] + struct VersionedResponse { + version: Fork, + #[serde(flatten)] + inner: Response, + } + + /// Simple beacon API client for the `mainnet` preset that can query headers and blocks. + pub struct BeaconClient { + http: reqwest::Client, + endpoint: Url, + } + + impl BeaconClient { + /// Creates a new beacon endpoint API client. + pub fn new(endpoint: U) -> Result { + let client = reqwest::Client::new(); + Ok(Self { + http: client, + endpoint: endpoint.into_url()?, + }) + } + + async fn http_get( + &self, + path: &str, + ) -> Result { + let target = self.endpoint.join(path)?; + let resp = self.http.get(target).send().await?; + let value = resp.error_for_status()?.json().await?; + Ok(value) + } + + /// Retrieves block details for given block id. + pub async fn get_block( + &self, + block_id: impl Display, + ) -> Result { + let path = format!("eth/v2/beacon/blocks/{block_id}"); + let result: VersionedResponse = self.http_get(&path).await?; + if result.version.to_string() != result.inner.data.version().to_string() { + return Err(Error::VersionMismatch); + } + Ok(result.inner.data) + } + } + } + + impl BeaconCommit { + /// Creates a new `BeaconCommit` for the provided header which proofs the inclusion of the + /// corresponding block hash in the referenced beacon block. + pub(crate) async fn from_header( + header: &Sealed, + rpc_provider: P, + beacon_url: Url, ) -> anyhow::Result where T: Transport + Clone, P: Provider, { - let block_hash = env.header().hash_slow(); - let parent_beacon_block_root = env - .header() - .inner() - .parent_beacon_block_root - .context("parent_beacon_block_root missing in execution header")?; - - let input = BlockInput::from_env(env) - .await - .context("failed to derive block input")?; - let client = BeaconClient::new(url); - - // first get the header of the parent and then the actual block header - let parent_beacon_header = client - .get_beacon_header(BlockId::Root(parent_beacon_block_root.0.into())) - .await - .with_context(|| { - format!("failed to get block header {}", parent_beacon_block_root) - })?; - let beacon_header = get_child_beacon_header(&client, parent_beacon_header) - .await - .with_context(|| { - format!("failed to get child of block {}", parent_beacon_block_root) - })?; + let client = BeaconClient::new(beacon_url).context("invalid URL")?; + let (commit, beacon_root) = + create_beacon_commit(header, "block_hash".into(), rpc_provider, &client).await?; + commit + .verify(header.seal(), beacon_root) + .context("proof derived from API does not verify")?; - // get the entire block - let signed_beacon_block = client - .get_beacon_block(BlockId::Root(beacon_header.root)) - .await - .with_context(|| format!("failed to get block {}", beacon_header.root))?; - // create the inclusion proof of the execution block hash depending on the fork version - let (proof, beacon_root) = match signed_beacon_block { - SignedBeaconBlock::Deneb(signed_block) => { - prove_block_hash_inclusion(signed_block.message)? - } - _ => { - bail!( - "invalid version of block {}: expected {}; got {}", - beacon_header.root, - Fork::Deneb, - signed_beacon_block.version() - ); - } - }; - - // convert and verify the proof - let proof: MerkleProof = proof - .try_into() - .context("proof derived from API is invalid")?; - ensure!( - proof.process(block_hash).0 == beacon_root.0, - "proof derived from API does not verify", + log::info!( + "Committing to parent beacon block: root={},timestamp={}", + beacon_root, + commit.timestamp ); - Ok(BeaconInput { input, proof }) + Ok(commit) } } - /// Returns the inclusion proof of `block_hash` in the given `BeaconBlock`. - fn prove_block_hash_inclusion( - beacon_block: T, - ) -> Result { - // the `block_hash` is in the ExecutionPayload in the BeaconBlockBody in the BeaconBlock - beacon_block.prove(&[ - "body".into(), - "execution_payload".into(), - "block_hash".into(), - ]) + /// Creates a beacon commitment that `field` is contained in the `ExecutionPayload` of the + /// beacon block corresponding to `header`. + async fn create_beacon_commit( + header: &Sealed, + field: PathElement, + rpc_provider: P, + beacon_client: &BeaconClient, + ) -> anyhow::Result<(GeneralizedBeaconCommit, B256)> + where + T: Transport + Clone, + P: Provider, + H: EvmBlockHeader, + { + let child = { + let child_number = header.number() + 1; + let block_res = rpc_provider + .get_block_by_number(child_number.into(), false) + .await + .context("eth_getBlockByNumber failed")?; + let block = block_res.with_context(|| { + format!( + "beacon block commitment cannot be created for the most recent block; \ + use `parent` tag instead: block {} does not have a child", + header.number() + ) + })?; + block.header + }; + ensure!( + child.parent_hash == header.seal(), + "API returned invalid child block" + ); + + let beacon_root = child + .parent_beacon_block_root + .context("parent_beacon_block_root missing in execution header")?; + let proof = create_execution_payload_proof(field, beacon_root, beacon_client).await?; + ensure!(proof.index == LEAF_INDEX, "field has the wrong leaf index"); + + let commit = GeneralizedBeaconCommit::new( + proof.branch.iter().map(|n| n.0.into()).collect(), + child.timestamp, + ); + + Ok((commit, beacon_root)) } - /// Returns the header, with `parent_root` equal to `parent.root`. - /// - /// It iteratively tries to fetch headers of successive slots until success. - /// TODO: use [BeaconClient::get_beacon_header_for_parent_root], once the nodes add support. - async fn get_child_beacon_header( + /// Creates the Merkle inclusion proof of the element `field` in the `ExecutionPayload` of the + /// beacon block with the given `beacon_root`. + async fn create_execution_payload_proof( + field: PathElement, + beacon_root: B256, client: &BeaconClient, - parent: BeaconHeaderSummary, - ) -> anyhow::Result { - let parent_slot = parent.header.message.slot; - let mut request_error = None; - for slot in (parent_slot + 1)..=(parent_slot + 32) { - match client.get_beacon_header(BlockId::Slot(slot)).await { - Err(err) => request_error = Some(err), - Ok(resp) => { - let header = &resp.header.message; - ensure!( - header.parent_root == parent.root, - "block {} has wrong parent_root: expected {}; got {}", - resp.root, - parent.root, - header.parent_root - ); - return Ok(resp); - } + ) -> anyhow::Result { + let signed_beacon_block = client + .get_block(beacon_root) + .await + .with_context(|| format!("failed to get block {}", beacon_root))?; + // create the inclusion proof of the execution block hash depending on the fork version + let (proof, _) = match signed_beacon_block { + SignedBeaconBlock::Deneb(signed_block) => { + prove_execution_payload_field(signed_block.message, field)? } - } - // return the last error, if all calls failed - let err = anyhow::Error::from(request_error.unwrap()); - Err(err.context("no valid response received for the 32 consecutive slots")) + _ => { + bail!( + "invalid version of block {}: expected {}; got {}", + beacon_root, + Fork::Deneb, + signed_beacon_block.version() + ); + } + }; + + Ok(proof) } - impl TryFrom for MerkleProof { - type Error = anyhow::Error; + /// Creates the Merkle inclusion proof of the element `field` in the `ExecutionPayload` in the + /// given `BeaconBlock`. + fn prove_execution_payload_field( + beacon_block: T, + field: PathElement, + ) -> Result { + // the field is in the ExecutionPayload in the BeaconBlockBody in the BeaconBlock + beacon_block.prove(&["body".into(), "execution_payload".into(), field]) + } - fn try_from(proof: Proof) -> Result { - let depth = proof.index.checked_ilog2().context("index is zero")?; - let index = proof.index - (1 << depth); - ensure!(proof.branch.len() == depth as usize, "index is invalid"); + #[cfg(test)] + mod tests { + use super::*; + use alloy::{eips::BlockNumberOrTag, network::BlockResponse, providers::ProviderBuilder}; - Ok(MerkleProof { - path: proof.branch.iter().map(|n| n.0.into()).collect(), - index: index.try_into().context("index too large")?, - }) - } - } -} + #[tokio::test] + #[ignore] // This queries actual RPC nodes, running only on demand. + async fn eth_mainnet_proof() { + const EL_URL: &str = "https://ethereum-rpc.publicnode.com"; + const CL_URL: &str = "https://ethereum-beacon-api.publicnode.com"; -#[cfg(test)] -pub(crate) mod tests { - use super::*; - use alloy_primitives::b256; - - #[test] - fn process_simple_proof() { - let leaf = b256!("94159da973dfa9e40ed02535ee57023ba2d06bad1017e451055470967eb71cd5"); - let proof = MerkleProof { - path: vec![ - b256!("8f594dbb4f4219ad4967f86b9cccdb26e37e44995a291582a431eef36ecba45c"), - b256!("f8c2ed25e9c31399d4149dcaa48c51f394043a6a1297e65780a5979e3d7bb77c"), - b256!("382ba9638ce263e802593b387538faefbaed106e9f51ce793d405f161b105ee6"), - ], - index: 2, - }; - assert_eq!( - proof.process(leaf), - b256!("27097c728aade54ff1376d5954681f6d45c282a81596ef19183148441b754abb") - ); + let el = ProviderBuilder::new().on_builtin(EL_URL).await.unwrap(); + let cl = BeaconClient::new(CL_URL).unwrap(); + + let block = el + .get_block_by_number(BlockNumberOrTag::Latest, false) + .await + .expect("eth_getBlockByNumber failed") + .unwrap(); + let beacon_root = block.header().parent_beacon_block_root.unwrap(); + + let block_hash = block.header().parent_hash; + let proof = create_execution_payload_proof("block_hash".into(), beacon_root, &cl) + .await + .expect("proving 'block_hash' failed"); + let branch: Vec = proof.branch.iter().map(|n| n.0.into()).collect(); + merkle::verify(block_hash, &branch, BLOCK_HASH_LEAF_INDEX, beacon_root).unwrap(); + } } } diff --git a/steel/src/block.rs b/steel/src/block.rs index a3dfe64e..73cbaf77 100644 --- a/steel/src/block.rs +++ b/steel/src/block.rs @@ -12,10 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{state::StateDb, EvmBlockHeader, EvmEnv, GuestEvmEnv, MerkleTrie}; +use crate::config::ChainSpec; +use crate::{ + state::StateDb, Commitment, CommitmentVersion, EvmBlockHeader, EvmEnv, GuestEvmEnv, MerkleTrie, +}; use ::serde::{Deserialize, Serialize}; -use alloy_primitives::Bytes; -use revm::primitives::HashMap; +use alloy_primitives::{map::HashMap, Bytes}; /// Input committing to the corresponding execution block hash. #[derive(Clone, Serialize, Deserialize)] @@ -28,7 +30,7 @@ pub struct BlockInput { } impl BlockInput { - /// Converts the input into a [EvmEnv] for a verifiable state access in the guest. + /// Converts the input into a [EvmEnv] for verifiable state access in the guest. pub fn into_env(self) -> GuestEvmEnv { // verify that the state root matches the state trie let state_root = self.state_trie.hash_slow(); @@ -38,7 +40,8 @@ impl BlockInput { let header = self.header.seal_slow(); // validate that ancestor headers form a valid chain - let mut block_hashes = HashMap::with_capacity(self.ancestors.len() + 1); + let mut block_hashes = + HashMap::with_capacity_and_hasher(self.ancestors.len() + 1, Default::default()); block_hashes.insert(header.number(), header.seal()); let mut previous_header = header.inner(); @@ -55,15 +58,20 @@ impl BlockInput { previous_header = ancestor; } - // TODO(victor): When do we check that the storage tries are ok? let db = StateDb::new( self.state_trie, self.storage_tries, self.contracts, block_hashes, ); + let commit = Commitment::new( + CommitmentVersion::Block as u16, + header.number(), + header.seal(), + ChainSpec::DEFAULT_DIGEST, + ); - EvmEnv::new(db, header) + EvmEnv::new(db, header, commit) } } @@ -73,20 +81,20 @@ pub mod host { use super::BlockInput; use crate::{ - host::{ - db::{AlloyDb, ProviderDb}, - HostEvmEnv, - }, + host::db::{AlloyDb, ProofDb, ProviderDb}, EvmBlockHeader, }; use alloy::{network::Network, providers::Provider, transports::Transport}; + use alloy_primitives::Sealed; use anyhow::{anyhow, ensure}; use log::debug; impl BlockInput { - /// Derives the verifiable input from a [HostEvmEnv]. - pub(crate) async fn from_env( - env: HostEvmEnv, H>, + /// Creates the `BlockInput` containing the necessary EVM state that can be verified against + /// the block hash. + pub(crate) async fn from_proof_db( + mut db: ProofDb>, + header: Sealed, ) -> anyhow::Result where T: Transport + Clone, @@ -95,16 +103,11 @@ pub mod host { H: EvmBlockHeader + TryFrom<::HeaderResponse>, ::HeaderResponse>>::Error: Display, { - let mut db = env.db.unwrap(); - assert_eq!( - db.inner().block_hash(), - env.header.seal(), - "DB block mismatch" - ); + assert_eq!(db.inner().block_hash(), header.seal(), "DB block mismatch"); let (state_trie, storage_tries) = db.state_proof().await?; ensure!( - env.header.state_root() == &state_trie.hash_slow(), + header.state_root() == &state_trie.hash_slow(), "accountProof root does not match header's stateRoot" ); @@ -113,7 +116,7 @@ pub mod host { // retrieve ancestor block headers let mut ancestors = Vec::new(); - for rlp_header in db.ancestor_proof(env.header.number()).await? { + for rlp_header in db.ancestor_proof(header.number()).await? { let header: H = rlp_header .try_into() .map_err(|err| anyhow!("header invalid: {}", err))?; @@ -130,7 +133,7 @@ pub mod host { debug!("ancestor blocks: {}", ancestors.len()); let input = BlockInput { - header: env.header.into_inner(), + header: header.into_inner(), state_trie, storage_tries, contracts, diff --git a/steel/src/config.rs b/steel/src/config.rs index 2d2eaaa7..79004812 100644 --- a/steel/src/config.rs +++ b/steel/src/config.rs @@ -15,21 +15,19 @@ //! Handling different blockchain specifications. use std::collections::BTreeMap; -use alloy_primitives::{BlockNumber, ChainId}; +use alloy_primitives::{b256, BlockNumber, BlockTimestamp, ChainId, B256}; use anyhow::bail; use revm::primitives::SpecId; use serde::{Deserialize, Serialize}; +use sha2::{digest::Output, Digest, Sha256}; /// The condition at which a fork is activated. -#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum ForkCondition { /// The fork is activated with a certain block. Block(BlockNumber), /// The fork is activated with a specific timestamp. - Timestamp(u64), - /// The fork is never activated - #[default] - TBD, + Timestamp(BlockTimestamp), } impl ForkCondition { @@ -39,7 +37,6 @@ impl ForkCondition { match self { ForkCondition::Block(block) => *block <= block_number, ForkCondition::Timestamp(ts) => *ts <= timestamp, - ForkCondition::TBD => false, } } } @@ -53,8 +50,27 @@ pub struct ChainSpec { pub forks: BTreeMap, } +impl Default for ChainSpec { + /// Defaults to Ethereum Chain ID using the latest specification. + #[inline] + fn default() -> Self { + Self::new_single(1, SpecId::LATEST) + } +} + impl ChainSpec { + /// Digest of the default configuration, i.e. `ChainSpec::default().digest()`. + pub const DEFAULT_DIGEST: B256 = + b256!("0e0fe3926625a8ffdd4123ad55bf3a419918885daa2e506df18c0e3d6b6c5009"); + /// Creates a new configuration consisting of only one specification ID. + /// + /// For example, this can be used to create a [ChainSpec] for an anvil instance: + /// ```rust + /// # use revm::primitives::SpecId; + /// # use risc0_steel::config::ChainSpec; + /// let spec = ChainSpec::new_single(31337, SpecId::CANCUN); + /// ``` pub fn new_single(chain_id: ChainId, spec_id: SpecId) -> Self { ChainSpec { chain_id, @@ -68,6 +84,12 @@ impl ChainSpec { self.chain_id } + /// Returns the cryptographic digest of the entire network configuration. + #[inline] + pub fn digest(&self) -> B256 { + <[u8; 32]>::from(StructHash::digest::(self)).into() + } + /// Returns the [SpecId] for a given block number and timestamp or an error if not supported. pub fn active_fork(&self, block_number: BlockNumber, timestamp: u64) -> anyhow::Result { for (spec_id, fork) in self.forks.iter().rev() { @@ -79,6 +101,57 @@ impl ChainSpec { } } +// NOTE: We do not want to make this public, to avoid having multiple traits with the `digest` function in +// the RISC Zero ecosystem of crates. +/// A simple structured hasher. +trait StructHash { + fn digest(&self) -> Output; +} + +impl StructHash for (&SpecId, &ForkCondition) { + /// Computes the cryptographic digest of a fork. + /// The hash is H(SpecID || ForkCondition::name || ForkCondition::value ) + fn digest(&self) -> Output { + let mut hasher = D::new(); + hasher.update([*self.0 as u8]); + match self.1 { + ForkCondition::Block(n) => { + hasher.update(b"Block"); + hasher.update(n.to_le_bytes()); + } + ForkCondition::Timestamp(ts) => { + hasher.update(b"Timestamp"); + hasher.update(ts.to_le_bytes()); + } + } + hasher.finalize() + } +} + +impl StructHash for ChainSpec { + /// Computes the cryptographic digest of a chain spec. + /// + /// This is equivalent to the `tagged_struct` structural hashing routines used for RISC Zero + /// data structures: + /// `tagged_struct("ChainSpec(chain_id,forks)", forks.into_vec(), &[chain_id, chain_id >> 32])` + fn digest(&self) -> Output { + let tag_digest = D::digest(b"ChainSpec(chain_id,forks)"); + + let mut hasher = D::new(); + hasher.update(tag_digest); + // down + self.forks + .iter() + .for_each(|fork| hasher.update(fork.digest::())); + // data + hasher.update(self.chain_id.to_le_bytes()); + // down.len() as u16 + hasher.update(u16::try_from(self.forks.len()).unwrap().to_le_bytes()); + + hasher.finalize() + } +} + #[cfg(test)] mod tests { use super::*; @@ -90,7 +163,6 @@ mod tests { forks: BTreeMap::from([ (SpecId::MERGE, ForkCondition::Block(2)), (SpecId::CANCUN, ForkCondition::Timestamp(60)), - (SpecId::PRAGUE, ForkCondition::TBD), ]), }; @@ -103,4 +175,19 @@ mod tests { SpecId::CANCUN ); } + + #[test] + fn default_digest() { + let exp: [u8; 32] = { + let mut h = Sha256::new(); + h.update(Sha256::digest(b"ChainSpec(chain_id,forks)")); + h.update((&SpecId::LATEST, &ForkCondition::Block(0)).digest::()); + h.update((1u64 as u32).to_le_bytes()); + h.update(((1u64 >> 32) as u32).to_le_bytes()); + h.update(1u16.to_le_bytes()); + h.finalize().into() + }; + assert_eq!(ChainSpec::DEFAULT_DIGEST.0, exp); + assert_eq!(ChainSpec::default().digest().0, exp); + } } diff --git a/steel/src/contract.rs b/steel/src/contract.rs index 557c3cad..945e7599 100644 --- a/steel/src/contract.rs +++ b/steel/src/contract.rs @@ -12,16 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{ - borrow::Borrow, - fmt::{Debug, Display}, - marker::PhantomData, - mem, -}; +use std::{borrow::Borrow, fmt::Debug, marker::PhantomData, mem}; use crate::{state::WrapStateDb, EvmBlockHeader, GuestEvmEnv}; use alloy_primitives::{Address, TxKind, U256}; use alloy_sol_types::{SolCall, SolType}; +use anyhow::anyhow; use revm::{ primitives::{CfgEnvWithHandlerCfg, ExecutionResult, ResultAndState, SuccessReason}, Database, Evm, @@ -34,13 +30,13 @@ use revm::{ /// /// ### Usage /// - **Preflight calls on the Host:** To prepare calls on the host environment and build the -/// necessary proof, use [Contract::preflight]. The environment can be initialized using -/// [EthEvmEnv::from_rpc] or [EvmEnv::new]. +/// necessary proof, use [Contract::preflight]. The environment can be initialized using the +/// [EthEvmEnv::builder] or [EvmEnv::builder]. /// - **Calls in the Guest:** To initialize the contract in the guest environment, use /// [Contract::new]. The environment should be constructed using [EvmInput::into_env]. /// /// ### Examples -/// ```rust no_run +/// ```rust,no_run /// # use risc0_steel::{ethereum::EthEvmEnv, Contract, host::BlockNumberOrTag}; /// # use alloy_primitives::address; /// # use alloy_sol_types::sol; @@ -53,14 +49,12 @@ use revm::{ /// function balanceOf(address account) external view returns (uint); /// } /// } -/// -/// let get_balance = IERC20::balanceOfCall { -/// account: address!("F977814e90dA44bFA03b6295A0616a897441aceC"), -/// }; +/// let account = address!("F977814e90dA44bFA03b6295A0616a897441aceC"); +/// let get_balance = IERC20::balanceOfCall { account }; /// /// // Host: /// let url = "https://ethereum-rpc.publicnode.com".parse()?; -/// let mut env = EthEvmEnv::from_rpc(url, BlockNumberOrTag::Latest).await?; +/// let mut env = EthEvmEnv::builder().rpc(url).build().await?; /// let mut contract = Contract::preflight(contract_address, &mut env); /// contract.call_builder(&get_balance).call().await?; /// @@ -75,9 +69,9 @@ use revm::{ /// # } /// ``` /// +/// [EthEvmEnv::builder]: crate::ethereum::EthEvmEnv::builder +/// [EvmEnv::builder]: crate::EvmEnv::builder /// [EvmInput::into_env]: crate::EvmInput::into_env -/// [EvmEnv::new]: crate::EvmEnv::new -/// [EthEvmEnv::from_rpc]: crate::ethereum::EthEvmEnv::from_rpc pub struct Contract { address: Address, env: E, @@ -90,7 +84,7 @@ impl<'a, H> Contract<&'a GuestEvmEnv> { } /// Initializes a call builder to execute a call on the contract. - pub fn call_builder(&self, call: &C) -> CallBuilder> { + pub fn call_builder(&self, call: &S) -> CallBuilder> { CallBuilder::new(self.env, self.address, call) } } @@ -100,19 +94,19 @@ impl<'a, H> Contract<&'a GuestEvmEnv> { /// Once configured, call with [CallBuilder::call]. #[derive(Debug, Clone)] #[must_use] -pub struct CallBuilder { - tx: CallTxData, +pub struct CallBuilder { + tx: CallTxData, env: E, } -impl CallBuilder { +impl CallBuilder { /// The default gas limit for function calls. const DEFAULT_GAS_LIMIT: u64 = 30_000_000; /// Creates a new builder for the given contract call. - fn new(env: E, address: Address, call: &C) -> Self + fn new(env: E, address: Address, call: &S) -> Self where - C: SolCall, + S: SolCall, { let tx = CallTxData { caller: address, // by default the contract calls itself @@ -166,7 +160,7 @@ mod host { }; use anyhow::{anyhow, Context, Result}; - impl<'a, D: Database, H> Contract<&'a mut HostEvmEnv> { + impl<'a, D: Database, H, C> Contract<&'a mut HostEvmEnv> { /// Constructor for preflighting calls to an Ethereum contract on the host. /// /// Initializes the environment for calling functions on the Ethereum contract, fetching @@ -175,26 +169,26 @@ mod host { /// /// [EvmEnv::into_input]: crate::EvmEnv::into_input /// [EvmEnv]: crate::EvmEnv - pub fn preflight(address: Address, env: &'a mut HostEvmEnv) -> Self { + pub fn preflight(address: Address, env: &'a mut HostEvmEnv) -> Self { Self { address, env } } /// Initializes a call builder to execute a call on the contract. - pub fn call_builder( + pub fn call_builder( &mut self, - call: &C, - ) -> CallBuilder> { + call: &S, + ) -> CallBuilder> { CallBuilder::new(self.env, self.address, call) } } - impl<'a, C, T, N, P, H> CallBuilder, H>> + impl<'a, S, T, N, P, H, C> CallBuilder, H, C>> where T: Transport + Clone, N: Network, P: Provider + Send + 'static, - C: SolCall + Send + 'static, - ::Return: Send, + S: SolCall + Send + 'static, + ::Return: Send, H: EvmBlockHeader + Clone + Send + 'static, { /// Fetches all the EIP-1186 storage proofs from the `access_list`. This can help to @@ -203,7 +197,7 @@ mod host { /// list. This does *not* set the access list as part of the transaction (as specified in /// EIP-2930), and thus can only be specified during preflight on the host. pub async fn prefetch_access_list(self, access_list: AccessList) -> Result { - let db = self.env.db.as_mut().unwrap(); + let db = self.env.db_mut(); db.add_access_list(access_list).await?; Ok(self) @@ -214,18 +208,18 @@ mod host { /// This uses [tokio::task::spawn_blocking] to run the blocking revm execution. /// /// [EvmEnv]: crate::EvmEnv - pub async fn call(self) -> Result { + pub async fn call(self) -> Result { log::info!( "Executing preflight calling '{}' on {}", - C::SIGNATURE, + S::SIGNATURE, self.tx.to ); - let cfg = self.env.cfg_env.clone(); - let header = self.env.header.inner().clone(); - // we cannot clone the database, so it gets moved in and out of the task + // as mutable references are not possible, the DB must be moved in and out of the task let db = self.env.db.take().unwrap(); + let cfg = self.env.cfg_env.clone(); + let header = self.env.header.inner().clone(); let (result, db) = tokio::task::spawn_blocking(move || { let mut evm = new_evm(db, cfg, header); let result = self.tx.transact(&mut evm); @@ -234,11 +228,12 @@ mod host { (result, db) }) .await - .context("EVM execution panicked")?; + .expect("EVM execution panicked"); + // restore the DB before handling errors, so that we never return an env without a DB self.env.db = Some(db); - result.map_err(|err| anyhow!("call '{}' failed: {}", C::SIGNATURE, err)) + result.map_err(|err| anyhow!("call '{}' failed: {}", S::SIGNATURE, err)) } /// Automatically prefetches the access list before executing the call using an [EvmEnv] @@ -249,18 +244,17 @@ mod host { /// [CallBuilder::call]. See the corresponding methods for more information. /// /// [EvmEnv]: crate::EvmEnv - pub async fn call_with_prefetch(self) -> Result { + pub async fn call_with_prefetch(self) -> Result { let access_list = { - let db = self.env.db.as_mut().unwrap(); - let tx = ::TransactionRequest::default() .with_from(self.tx.caller) - .with_gas_limit(self.tx.gas_limit as u128) + .with_gas_limit(self.tx.gas_limit) .with_gas_price(self.tx.gas_price.to()) .with_to(self.tx.to) .with_value(self.tx.value) .with_input(self.tx.data.clone()); + let db = self.env.db_mut(); let provider = db.inner().provider(); let access_list = provider .create_access_list(&tx) @@ -279,49 +273,57 @@ mod host { } } -impl<'a, C, H> CallBuilder> +impl<'a, S, H> CallBuilder> where - C: SolCall, + S: SolCall, H: EvmBlockHeader, { - /// Executes the call with a [EvmEnv] constructed with [Contract::new]. + /// Executes the call and returns an error if the call fails. /// - /// [EvmEnv]: crate::EvmEnv - pub fn call(self) -> C::Return { - let state_db = self.env.db.as_ref().unwrap(); + /// In general, it's recommended to use [CallBuilder::call] unless explicit error handling is + /// required. + pub fn try_call(self) -> Result { let mut evm = new_evm::<_, H>( - WrapStateDb::new(state_db), + WrapStateDb::new(self.env.db()), self.env.cfg_env.clone(), self.env.header.inner(), ); - self.tx.transact(&mut evm).unwrap() + self.tx.transact(&mut evm) + } + + /// Executes the call and panics on failure. + /// + /// A convenience wrapper for [CallBuilder::try_call], panicking if the call fails. Useful when + /// success is expected. + pub fn call(self) -> S::Return { + self.try_call().unwrap() } } /// Transaction data to be used with [CallBuilder] for an execution. #[derive(Debug, Clone)] -struct CallTxData { +struct CallTxData { caller: Address, gas_limit: u64, gas_price: U256, to: Address, value: U256, data: Vec, - phantom: PhantomData, + phantom: PhantomData, } -impl CallTxData { +impl CallTxData { /// Compile-time assertion that the call C has a return value. const RETURNS: () = assert!( - mem::size_of::() > 0, + mem::size_of::() > 0, "Function call must have a return value" ); /// Executes the call in the provided [Evm]. - fn transact(self, evm: &mut Evm<'_, EXT, DB>) -> Result + fn transact(self, evm: &mut Evm<'_, EXT, DB>) -> Result where DB: Database, - ::Error: Display, + ::Error: std::error::Error + Send + Sync + 'static, { #[allow(clippy::let_unit_value)] let _ = Self::RETURNS; @@ -336,7 +338,7 @@ impl CallTxData { let ResultAndState { result, .. } = evm .transact_preverified() - .map_err(|err| format!("EVM error: {}", err))?; + .map_err(|err| format!("EVM error: {:#}", anyhow!(err)))?; let output = match result { ExecutionResult::Success { reason, output, .. } => { // there must be a return value to decode @@ -349,10 +351,10 @@ impl CallTxData { ExecutionResult::Revert { output, .. } => Err(format!("reverted: {}", output)), ExecutionResult::Halt { reason, .. } => Err(format!("halted: {:?}", reason)), }?; - let returns = C::abi_decode_returns(&output.into_data(), true).map_err(|err| { + let returns = S::abi_decode_returns(&output.into_data(), true).map_err(|err| { format!( "return type invalid; expected '{}': {}", - as SolType>::SOL_NAME, + as SolType>::SOL_NAME, err ) })?; diff --git a/steel/src/ethereum.rs b/steel/src/ethereum.rs index 0dd9156d..6e65c38b 100644 --- a/steel/src/ethereum.rs +++ b/steel/src/ethereum.rs @@ -55,7 +55,7 @@ pub static ETH_MAINNET_CHAIN_SPEC: Lazy = Lazy::new(|| ChainSpec { }); /// [EvmEnv] for Ethereum. -pub type EthEvmEnv = EvmEnv; +pub type EthEvmEnv = EvmEnv; /// [EvmInput] for Ethereum. pub type EthEvmInput = EvmInput; @@ -94,7 +94,7 @@ impl EvmBlockHeader for EthBlockHeader { // technically, this is only valid after EIP-4399 but revm makes sure it is not used before blk_env.prevrandao = Some(header.mix_hash); if let Some(excess_blob_gas) = header.excess_blob_gas { - blk_env.set_blob_excess_gas_and_price(excess_blob_gas.try_into().unwrap()) + blk_env.set_blob_excess_gas_and_price(excess_blob_gas) }; } } diff --git a/steel/src/host/builder.rs b/steel/src/host/builder.rs new file mode 100644 index 00000000..9da1da9c --- /dev/null +++ b/steel/src/host/builder.rs @@ -0,0 +1,282 @@ +// Copyright 2024 RISC Zero, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + beacon::BeaconCommit, + config::ChainSpec, + ethereum::EthBlockHeader, + host::HostCommit, + host::{ + db::{AlloyDb, ProofDb, ProviderConfig}, + BlockNumberOrTag, EthHostEvmEnv, HostEvmEnv, + }, + EvmBlockHeader, EvmEnv, +}; +use alloy::{ + network::{BlockResponse, Ethereum, Network}, + providers::{Provider, ProviderBuilder, ReqwestProvider}, + transports::Transport, +}; +use alloy_primitives::Sealable; +use anyhow::{anyhow, Context, Result}; +use std::{fmt::Display, marker::PhantomData}; +use url::Url; + +impl EvmEnv<(), H, ()> { + /// Creates a builder for building an environment. + /// + /// Create an Ethereum environment bast on the latest block: + /// ```rust,no_run + /// # use risc0_steel::ethereum::EthEvmEnv; + /// # use url::Url; + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> anyhow::Result<()> { + /// # let url = Url::parse("https://ethereum-rpc.publicnode.com")?; + /// let env = EthEvmEnv::builder().rpc(url).build().await?; + /// # Ok(()) + /// # } + /// ``` + pub fn builder() -> EvmEnvBuilder<(), H, ()> { + EvmEnvBuilder { + provider: (), + provider_config: ProviderConfig::default(), + block: BlockNumberOrTag::Latest, + beacon_config: (), + phantom: PhantomData, + } + } +} + +/// Builder for constructing an [EvmEnv] instance on the host. +/// +/// The [EvmEnvBuilder] is used to configure and create an [EvmEnv], which is the environment in +/// which the Ethereum Virtual Machine (EVM) operates. This builder provides flexibility in setting +/// up the EVM environment by allowing configuration of RPC endpoints, block numbers, and other +/// parameters. +/// +/// # Usage +/// The builder can be created using [EvmEnv::builder()]. Various configurations can be chained to +/// customize the environment before calling the `build` function to create the final [EvmEnv]. +/// +/// # Type Parameters +/// - `P`: The type of the RPC provider that interacts with the blockchain. +/// - `H`: The type of the block header. +/// - `B`: The type of the configuration to access the Beacon API. +#[derive(Clone, Debug)] +pub struct EvmEnvBuilder { + provider: P, + provider_config: ProviderConfig, + block: BlockNumberOrTag, + beacon_config: B, + phantom: PhantomData, +} + +impl EvmEnvBuilder<(), EthBlockHeader, ()> { + /// Sets the Ethereum HTTP RPC endpoint that will be used by the [EvmEnv]. + pub fn rpc(self, url: Url) -> EvmEnvBuilder, EthBlockHeader, ()> { + self.provider(ProviderBuilder::new().on_http(url)) + } +} + +impl EvmEnvBuilder<(), H, ()> { + /// Sets a custom [Provider] that will be used by the [EvmEnv]. + pub fn provider(self, provider: P) -> EvmEnvBuilder + where + T: Transport + Clone, + N: Network, + P: Provider, + H: EvmBlockHeader + TryFrom<::HeaderResponse>, + ::HeaderResponse>>::Error: Display, + { + EvmEnvBuilder { + provider, + provider_config: self.provider_config, + block: self.block, + beacon_config: self.beacon_config, + phantom: self.phantom, + } + } +} + +impl

EvmEnvBuilder { + /// Sets the Beacon API URL for retrieving Ethereum Beacon block root commitments. + /// + /// This function configures the [EvmEnv] to interact with an Ethereum Beacon chain. + /// It assumes the use of the [mainnet](https://github.com/ethereum/consensus-specs/blob/v1.4.0/configs/mainnet.yaml) preset for consensus specs. + pub fn beacon_api(self, url: Url) -> EvmEnvBuilder { + EvmEnvBuilder { + provider: self.provider, + provider_config: self.provider_config, + block: self.block, + beacon_config: url, + phantom: self.phantom, + } + } +} + +impl EvmEnvBuilder { + /// Sets the block number to be used for the EVM execution. + pub fn block_number(self, number: u64) -> Self { + self.block_number_or_tag(BlockNumberOrTag::Number(number)) + } + + /// Sets the block number or block tag ("latest", "earliest", "pending") to be used for the EVM + /// execution. + pub fn block_number_or_tag(mut self, block: BlockNumberOrTag) -> Self { + self.block = block; + self + } + + /// Sets the chunk size for `eth_getProof` calls (EIP-1186). + /// + /// This configures the number of storage keys to request in a single call. + /// The default is 1000, but this can be adjusted based on the RPC node configuration. + pub fn eip1186_proof_chunk_size(mut self, chunk_size: usize) -> Self { + assert_ne!(chunk_size, 0, "chunk size must be non-zero"); + self.provider_config.eip1186_proof_chunk_size = chunk_size; + self + } + + /// Retrieves the block header based on the current builder configuration. + async fn get_header(&self) -> Result + where + T: Transport + Clone, + N: Network, + P: Provider, + H: EvmBlockHeader + TryFrom<::HeaderResponse>, + ::HeaderResponse>>::Error: Display, + { + let number = self.block.into_rpc_type(&self.provider).await?; + let rpc_block = self + .provider + .get_block_by_number(number, false) + .await + .context("eth_getBlockByNumber failed")? + .with_context(|| format!("block {} not found", number))?; + let header = rpc_block.header().clone(); + header + .try_into() + .map_err(|err| anyhow!("header invalid: {}", err)) + } +} + +impl EvmEnvBuilder { + /// Builds and returns an [EvmEnv] with the configured settings that commits to a block hash. + pub async fn build(self) -> Result, H, ()>> + where + T: Transport + Clone, + N: Network, + P: Provider, + H: EvmBlockHeader + TryFrom<::HeaderResponse>, + ::HeaderResponse>>::Error: Display, + { + let header = self.get_header().await?.seal_slow(); + log::info!( + "Environment initialized with block {} ({})", + header.number(), + header.seal() + ); + + let db = ProofDb::new(AlloyDb::new( + self.provider, + self.provider_config, + header.seal(), + )); + let commit = HostCommit { + inner: (), + config_id: ChainSpec::DEFAULT_DIGEST, + }; + + Ok(EvmEnv::new(db, header, commit)) + } +} + +impl

EvmEnvBuilder { + /// Builds and returns an [EvmEnv] with the configured settings that commits to a beacon root. + pub async fn build(self) -> Result, BeaconCommit>> + where + T: Transport + Clone, + P: Provider, + { + let header = self.get_header().await?.seal_slow(); + log::info!( + "Environment initialized with block {} ({})", + header.number(), + header.seal() + ); + + let commit = HostCommit { + inner: BeaconCommit::from_header(&header, &self.provider, self.beacon_config).await?, + config_id: ChainSpec::DEFAULT_DIGEST, + }; + let db = ProofDb::new(AlloyDb::new( + self.provider, + self.provider_config, + header.seal(), + )); + + Ok(EvmEnv::new(db, header, commit)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::config::ChainSpec; + use crate::{ethereum::EthEvmEnv, BlockHeaderCommit, Commitment, CommitmentVersion}; + use test_log::test; + + const EL_URL: &str = "https://ethereum-rpc.publicnode.com"; + const CL_URL: &str = "https://ethereum-beacon-api.publicnode.com"; + + #[test(tokio::test)] + #[ignore] // This queries actual RPC nodes, running only on demand. + async fn build_block_env() { + EthEvmEnv::builder() + .rpc(EL_URL.parse().unwrap()) + .build() + .await + .unwrap(); + } + + #[test(tokio::test)] + #[ignore] // This queries actual RPC nodes, running only on demand. + async fn build_beacon_env() { + let provider = ProviderBuilder::new().on_builtin(EL_URL).await.unwrap(); + let env = EthEvmEnv::builder() + .provider(&provider) + .beacon_api(CL_URL.parse().unwrap()) + .block_number_or_tag(BlockNumberOrTag::Parent) + .build() + .await + .unwrap(); + let commit = env.commit.inner.commit(&env.header, env.commit.config_id); + + // the commitment should verify against the parent_beacon_block_root of the child + let child_block = provider + .get_block_by_number((env.header.number() + 1).into(), false) + .await + .unwrap(); + let header_block = child_block.unwrap().header; + assert_eq!( + commit, + Commitment::new( + CommitmentVersion::Beacon as u16, + header_block.timestamp, + header_block.parent_beacon_block_root.unwrap(), + ChainSpec::DEFAULT_DIGEST, + ) + ); + } +} diff --git a/steel/src/host/db/alloy.rs b/steel/src/host/db/alloy.rs index 124d068e..51be603d 100644 --- a/steel/src/host/db/alloy.rs +++ b/steel/src/host/db/alloy.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{collections::HashMap, future::IntoFuture, marker::PhantomData}; +use std::{future::IntoFuture, marker::PhantomData}; use super::provider::{ProviderConfig, ProviderDb}; use alloy::{ @@ -20,7 +20,7 @@ use alloy::{ providers::Provider, transports::{Transport, TransportError}, }; -use alloy_primitives::{Address, BlockHash, B256, U256}; +use alloy_primitives::{map::B256HashMap, Address, BlockHash, B256, U256}; use revm::{ primitives::{AccountInfo, Bytecode}, Database, @@ -44,7 +44,7 @@ pub struct AlloyDb> { /// Handle to the Tokio runtime. handle: Handle, /// Bytecode cache to allow querying bytecode by hash instead of address. - contracts: HashMap, + contracts: B256HashMap, phantom: PhantomData (T, N)>, } @@ -59,7 +59,7 @@ impl> AlloyDb { provider_config: config, block_hash, handle: Handle::current(), - contracts: HashMap::new(), + contracts: Default::default(), phantom: PhantomData, } } @@ -79,8 +79,17 @@ impl> ProviderDb fo } } +/// Errors returned by the [AlloyDb]. +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("RPC error")] + Rpc(#[from] TransportError), + #[error("block not found")] + BlockNotFound, +} + impl> Database for AlloyDb { - type Error = TransportError; + type Error = Error; fn basic(&mut self, address: Address) -> Result, Self::Error> { let f = async { @@ -143,11 +152,11 @@ impl> Database for AlloyDb Result { - let block = self + let block_response = self .handle .block_on(self.provider.get_block_by_number(number.into(), false))?; - // TODO: return proper error - let block = block.unwrap(); + let block = block_response.ok_or(Error::BlockNotFound)?; + Ok(block.header().hash()) } } diff --git a/steel/src/host/db/proof.rs b/steel/src/host/db/proof.rs index 241c7f18..909811cf 100644 --- a/steel/src/host/db/proof.rs +++ b/steel/src/host/db/proof.rs @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::collections::{hash_map::Entry, HashMap, HashSet}; - use super::{provider::ProviderDb, AlloyDb}; use crate::MerkleTrie; use alloy::{ @@ -23,7 +21,10 @@ use alloy::{ rpc::types::EIP1186AccountProofResponse, transports::Transport, }; -use alloy_primitives::{Address, BlockNumber, Bytes, StorageKey, StorageValue, B256, U256}; +use alloy_primitives::{ + map::{hash_map, AddressHashMap, B256HashMap, B256HashSet, HashSet}, + Address, BlockNumber, Bytes, StorageKey, StorageValue, B256, U256, +}; use anyhow::{ensure, Context, Result}; use revm::{ primitives::{AccountInfo, Bytecode}, @@ -32,12 +33,10 @@ use revm::{ /// A simple revm [Database] wrapper that records all DB queries. pub struct ProofDb { - accounts: HashMap>, - contracts: HashMap, + accounts: AddressHashMap, + contracts: B256HashMap, block_hash_numbers: HashSet, - - proofs: HashMap, - + proofs: AddressHashMap, inner: D, } @@ -45,7 +44,7 @@ struct AccountProof { /// The inclusion proof for this account. account_proof: Vec, /// The MPT inclusion proofs for several storage slots. - storage_proofs: HashMap, + storage_proofs: B256HashMap, } struct StorageProof { @@ -59,11 +58,10 @@ impl ProofDb { /// Creates a new ProofDb instance, with a [Database]. pub fn new(db: D) -> Self { Self { - accounts: HashMap::new(), - contracts: HashMap::new(), - block_hash_numbers: HashSet::new(), - - proofs: HashMap::new(), + accounts: Default::default(), + contracts: Default::default(), + block_hash_numbers: Default::default(), + proofs: Default::default(), inner: db, } } @@ -76,7 +74,7 @@ impl ProofDb { } /// Returns the referenced contracts - pub fn contracts(&self) -> &HashMap { + pub fn contracts(&self) -> &B256HashMap { &self.contracts } @@ -140,8 +138,12 @@ impl> ProofDb Result<(MerkleTrie, Vec)> { - let proofs = &mut self.proofs; + ensure!( + !self.accounts.is_empty(), + "no accounts accessed: use Contract::preflight" + ); + let proofs = &mut self.proofs; for (address, storage_keys) in &self.accounts { let account_proof = proofs.get(address); let storage_keys: Vec<_> = storage_keys @@ -157,28 +159,35 @@ impl> ProofDb) -> impl Fn(&Storag } fn add_proof( - proofs: &mut HashMap, + proofs: &mut AddressHashMap, proof_response: EIP1186AccountProofResponse, ) -> Result<()> { // convert the response into a StorageProof @@ -266,7 +275,7 @@ fn add_proof( .collect(); match proofs.entry(proof_response.address) { - Entry::Occupied(mut entry) => { + hash_map::Entry::Occupied(mut entry) => { let account_proof = entry.get_mut(); ensure!( account_proof.account_proof == proof_response.account_proof, @@ -274,7 +283,7 @@ fn add_proof( ); account_proof.storage_proofs.extend(storage_proofs); } - Entry::Vacant(entry) => { + hash_map::Entry::Vacant(entry) => { entry.insert(AccountProof { account_proof: proof_response.account_proof, storage_proofs, diff --git a/steel/src/host/mod.rs b/steel/src/host/mod.rs index f1454779..86bea2ea 100644 --- a/steel/src/host/mod.rs +++ b/steel/src/host/mod.rs @@ -13,35 +13,87 @@ // limitations under the License. //! Functionality that is only needed for the host and not the guest. -use std::{fmt::Display, marker::PhantomData}; +use std::fmt::Display; use crate::{ - beacon::BeaconInput, + beacon::BeaconCommit, block::BlockInput, + config::ChainSpec, ethereum::{EthBlockHeader, EthEvmEnv}, - EvmBlockHeader, EvmEnv, EvmInput, + host::db::ProviderDb, + ComposeInput, EvmBlockHeader, EvmEnv, EvmInput, }; use alloy::{ - network::{BlockResponse, Ethereum, Network}, - providers::{Provider, ProviderBuilder, ReqwestProvider, RootProvider}, + network::{Ethereum, Network}, + providers::{Provider, RootProvider}, + rpc::types::BlockNumberOrTag as AlloyBlockNumberOrTag, transports::{ http::{Client, Http}, Transport, }, }; -use anyhow::{anyhow, Context, Result}; -use db::{AlloyDb, ProofDb, ProviderConfig}; +use alloy_primitives::B256; +use anyhow::{ensure, Result}; +use db::{AlloyDb, ProofDb}; use url::Url; +mod builder; pub mod db; -/// A block number (or tag - "latest", "earliest", "pending"). -pub type BlockNumberOrTag = alloy::rpc::types::BlockNumberOrTag; +/// A block number (or tag - "latest", "safe", "finalized"). +/// This enum is used to specify which block to query when interacting with the blockchain. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] +pub enum BlockNumberOrTag { + /// The most recent block in the canonical chain observed by the client. + #[default] + Latest, + /// The parent of the most recent block in the canonical chain observed by the client. + /// This is equivalent to `Latest - 1`. + Parent, + /// The most recent block considered "safe" by the client. This typically refers to a block + /// that is sufficiently deep in the chain to be considered irreversible. + Safe, + /// The most recent finalized block in the chain. Finalized blocks are guaranteed to be + /// part of the canonical chain. + Finalized, + /// A specific block number in the canonical chain. + Number(u64), +} + +impl BlockNumberOrTag { + /// Converts the `BlockNumberOrTag` into the corresponding RPC type. + async fn into_rpc_type(self, provider: P) -> Result + where + T: Transport + Clone, + N: Network, + P: Provider, + { + let number = match self { + BlockNumberOrTag::Latest => AlloyBlockNumberOrTag::Latest, + BlockNumberOrTag::Parent => { + let latest = provider.get_block_number().await?; + ensure!(latest > 0, "genesis does not have a parent"); + AlloyBlockNumberOrTag::Number(latest - 1) + } + BlockNumberOrTag::Safe => AlloyBlockNumberOrTag::Safe, + BlockNumberOrTag::Finalized => AlloyBlockNumberOrTag::Finalized, + BlockNumberOrTag::Number(n) => AlloyBlockNumberOrTag::Number(n), + }; + Ok(number) + } +} /// Alias for readability, do not make public. -pub(crate) type HostEvmEnv = EvmEnv, H>; +pub(crate) type HostEvmEnv = EvmEnv, H, HostCommit>; +type EthHostEvmEnv = EthEvmEnv, HostCommit>; + +/// Wrapper for the commit on the host. +pub struct HostCommit { + inner: C, + config_id: B256, +} -impl EthEvmEnv, Ethereum, RootProvider>>>> { +impl EthHostEvmEnv, Ethereum, RootProvider>>, ()> { /// Creates a new provable [EvmEnv] for Ethereum from an HTTP RPC endpoint. #[deprecated(since = "0.12.0", note = "use `EthEvmEnv::builder().rpc()` instead")] pub async fn from_rpc(url: Url, number: BlockNumberOrTag) -> Result { @@ -53,7 +105,7 @@ impl EthEvmEnv, Ethereum, RootProvider } } -impl EvmEnv>, H> +impl HostEvmEnv, H, ()> where T: Transport + Clone, N: Network, @@ -70,134 +122,61 @@ where .build() .await } -} -impl HostEvmEnv, H> -where - T: Transport + Clone, - N: Network, - P: Provider, - H: EvmBlockHeader + TryFrom<::HeaderResponse>, - ::HeaderResponse>>::Error: Display, -{ /// Converts the environment into a [EvmInput] committing to a block hash. pub async fn into_input(self) -> Result> { - Ok(EvmInput::Block(BlockInput::from_env(self).await?)) - } -} - -impl HostEvmEnv, EthBlockHeader> -where - T: Transport + Clone, - P: Provider, -{ - /// Converts the environment into a [EvmInput] committing to a Beacon block root. - pub async fn into_beacon_input(self, url: Url) -> Result> { - Ok(EvmInput::Beacon( - BeaconInput::from_env_and_endpoint(self, url).await?, - )) - } -} + let input = BlockInput::from_proof_db(self.db.unwrap(), self.header).await?; -impl EvmEnv<(), H> { - /// Creates a builder for building an environment. - pub fn builder() -> EvmEnvBuilder { - EvmEnvBuilder { - provider: NoProvider, - provider_config: ProviderConfig::default(), - block: BlockNumberOrTag::Latest, - phantom: PhantomData, - } + Ok(EvmInput::Block(input)) } } -/// Builder for building an [EvmEnv] on the host. -#[derive(Clone, Debug)] -pub struct EvmEnvBuilder { - provider: P, - provider_config: ProviderConfig, - block: BlockNumberOrTag, - phantom: PhantomData, -} - -/// First stage of the [EvmEnvBuilder] without a specified [Provider]. -pub struct NoProvider; - -impl EvmEnvBuilder { - /// Sets the Ethereum HTTP RPC endpoint that will be used by the [EvmEnv]. - pub fn rpc(self, url: Url) -> EvmEnvBuilder, EthBlockHeader> { - self.provider(ProviderBuilder::new().on_http(url)) - } -} +impl HostEvmEnv { + /// Sets the chain ID and specification ID from the given chain spec. + /// + /// This will panic when there is no valid specification ID for the current block. + pub fn with_chain_spec(mut self, chain_spec: &ChainSpec) -> Self { + self.cfg_env.chain_id = chain_spec.chain_id(); + self.cfg_env.handler_cfg.spec_id = chain_spec + .active_fork(self.header.number(), self.header.timestamp()) + .unwrap(); + self.commit.config_id = chain_spec.digest(); -impl EvmEnvBuilder { - /// Sets the [Provider] that will be used by the [EvmEnv]. - pub fn provider(self, provider: P) -> EvmEnvBuilder - where - T: Transport + Clone, - N: Network, - P: Provider, - H: EvmBlockHeader + TryFrom<::HeaderResponse>, - ::HeaderResponse>>::Error: Display, - { - EvmEnvBuilder { - provider, - provider_config: self.provider_config, - block: self.block, - phantom: self.phantom, - } + self } } -impl EvmEnvBuilder { - /// Sets the block number. - pub fn block_number(self, number: u64) -> Self { - self.block_number_or_tag(BlockNumberOrTag::Number(number)) - } +impl EthHostEvmEnv, BeaconCommit> +where + T: Transport + Clone, + P: Provider, +{ + /// Converts the environment into a [EvmInput] committing to a block hash. + pub async fn into_input(self) -> Result> { + let input = BlockInput::from_proof_db(self.db.unwrap(), self.header).await?; - /// Sets the block number (or tag - "latest", "earliest", "pending"). - pub fn block_number_or_tag(mut self, block: BlockNumberOrTag) -> Self { - self.block = block; - self + Ok(EvmInput::Beacon(ComposeInput::new( + input, + self.commit.inner, + ))) } +} - /// Sets the max number of storage keys to request in a single `eth_getProof` call. - /// - /// The optimal number depends on the RPC node and its configuration, but the default is 1000. - pub fn eip1186_proof_chunk_size(mut self, chunk_size: usize) -> Self { - assert_ne!(chunk_size, 0, "chunk size must be non-zero"); - self.provider_config.eip1186_proof_chunk_size = chunk_size; - self - } +impl EthHostEvmEnv, ()> +where + T: Transport + Clone, + P: Provider, +{ + /// Converts the environment into a [EvmInput] committing to an Ethereum Beacon block root. + #[deprecated( + since = "0.14.0", + note = "use `EvmEnv::builder().beacon_api()` instead" + )] + pub async fn into_beacon_input(self, url: Url) -> Result> { + let commit = + BeaconCommit::from_header(self.header(), self.db().inner().provider(), url).await?; + let input = BlockInput::from_proof_db(self.db.unwrap(), self.header).await?; - /// Builds the new provable [EvmEnv]. - pub async fn build(self) -> Result>, H>> - where - T: Transport + Clone, - N: Network, - P: Provider, - H: EvmBlockHeader + TryFrom<::HeaderResponse>, - ::HeaderResponse>>::Error: Display, - { - let rpc_block = self - .provider - .get_block_by_number(self.block, false) - .await - .context("eth_getBlockByNumber failed")? - .with_context(|| format!("block {} not found", self.block))?; - let header = rpc_block.header().clone(); - let header: H = header - .try_into() - .map_err(|err| anyhow!("header invalid: {}", err))?; - let sealed_header = header.seal_slow(); - log::info!("Environment initialized for block {}", sealed_header.seal()); - - let db = ProofDb::new(AlloyDb::new( - self.provider, - self.provider_config, - sealed_header.seal(), - )); - - Ok(EvmEnv::new(db, sealed_header)) + Ok(EvmInput::Beacon(ComposeInput::new(input, commit))) } } diff --git a/steel/src/lib.rs b/steel/src/lib.rs index 7afb8d57..29ef6201 100644 --- a/steel/src/lib.rs +++ b/steel/src/lib.rs @@ -16,25 +16,28 @@ #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] use ::serde::{Deserialize, Serialize}; -use alloy_primitives::{ruint::FromUintError, uint, BlockNumber, Sealable, Sealed, B256, U256}; -use beacon::BeaconInput; -use block::BlockInput; +use alloy_primitives::{uint, BlockNumber, Sealable, Sealed, B256, U256}; +use alloy_sol_types::SolValue; +use config::ChainSpec; use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg, SpecId}; -use state::StateDb; pub mod beacon; -pub mod block; +mod block; pub mod config; mod contract; pub mod ethereum; #[cfg(feature = "host")] pub mod host; +mod merkle; mod mpt; pub mod serde; mod state; +pub use beacon::BeaconInput; +pub use block::BlockInput; pub use contract::{CallBuilder, Contract}; pub use mpt::MerkleTrie; +pub use state::{StateAccount, StateDb}; /// The serializable input to derive and validate an [EvmEnv] from. #[non_exhaustive] @@ -59,59 +62,109 @@ impl EvmInput { } } +/// A trait linking the block header to a commitment. +pub trait BlockHeaderCommit { + /// Creates a verifiable [Commitment] of the `header`. + fn commit(self, header: &Sealed, config_id: B256) -> Commitment; +} + +/// A generalized input type consisting of a block-based input and a commitment wrapper. +/// The `commit` field provides a mechanism to generate a commitment to the block header +/// contained within the `input` field. +#[derive(Clone, Serialize, Deserialize)] +pub struct ComposeInput { + input: BlockInput, + commit: C, +} + +impl> ComposeInput { + /// Creates a new composed input from a [BlockInput] and a [BlockHeaderCommit]. + pub const fn new(input: BlockInput, commit: C) -> Self { + Self { input, commit } + } + + /// Disassembles this `ComposeInput`, returning the underlying input and commitment creator. + pub fn into_parts(self) -> (BlockInput, C) { + (self.input, self.commit) + } + + /// Converts the input into a [EvmEnv] for verifiable state access in the guest. + pub fn into_env(self) -> GuestEvmEnv { + let mut env = self.input.into_env(); + env.commit = self.commit.commit(&env.header, env.commit.configID); + + env + } +} + /// Alias for readability, do not make public. -pub(crate) type GuestEvmEnv = EvmEnv; +pub(crate) type GuestEvmEnv = EvmEnv; /// The environment to execute the contract calls in. -pub struct EvmEnv { +pub struct EvmEnv { db: Option, cfg_env: CfgEnvWithHandlerCfg, header: Sealed, - commitment: Commitment, + commit: C, } -impl EvmEnv { +impl EvmEnv { /// Creates a new environment. + /// /// It uses the default configuration for the latest specification. - pub fn new(db: D, header: Sealed) -> Self { + pub(crate) fn new(db: D, header: Sealed, commit: C) -> Self { let cfg_env = CfgEnvWithHandlerCfg::new_with_spec_id(Default::default(), SpecId::LATEST); - let commitment = Commitment::from_header(&header); - #[cfg(feature = "host")] - log::info!("Commitment to block {}", commitment.blockDigest); Self { db: Some(db), cfg_env, header, - commitment, + commit, } } + /// Returns the sealed header of the environment. + #[inline] + pub fn header(&self) -> &Sealed { + &self.header + } + + fn db(&self) -> &D { + // safe unwrap: self cannot be borrowed without a DB + self.db.as_ref().unwrap() + } + + #[allow(dead_code)] + fn db_mut(&mut self) -> &mut D { + // safe unwrap: self cannot be borrowed without a DB + self.db.as_mut().unwrap() + } +} + +impl EvmEnv { /// Sets the chain ID and specification ID from the given chain spec. - pub fn with_chain_spec(mut self, chain_spec: &config::ChainSpec) -> Self { + /// + /// This will panic when there is no valid specification ID for the current block. + pub fn with_chain_spec(mut self, chain_spec: &ChainSpec) -> Self { self.cfg_env.chain_id = chain_spec.chain_id(); self.cfg_env.handler_cfg.spec_id = chain_spec .active_fork(self.header.number(), self.header.timestamp()) .unwrap(); - self - } + self.commit.configID = chain_spec.digest(); - /// Returns the header of the environment. - #[inline] - pub fn header(&self) -> &H { - self.header.inner() + self } /// Returns the [Commitment] used to validate the environment. #[inline] pub fn commitment(&self) -> &Commitment { - &self.commitment + &self.commit } /// Consumes and returns the [Commitment] used to validate the environment. #[inline] pub fn into_commitment(self) -> Commitment { - self.commitment + self.commit } } @@ -133,68 +186,118 @@ pub trait EvmBlockHeader: Sealable { // Keep everything in the Steel library private except the commitment. mod private { alloy_sol_types::sol! { - #![sol(all_derives)] - /// A commitment to a specific block in the blockchain. + /// A Solidity struct representing a commitment used for validation. + /// + /// This struct is used to commit to a specific claim, such as the hash of an execution block + /// or a beacon chain state. It includes a version, an identifier, the claim itself, and a + /// configuration ID to ensure the commitment is valid for the intended network. + #[derive(Default, PartialEq, Eq, Hash)] struct Commitment { - /// Encodes both the block identifier (block number or timestamp) and the version. - uint256 blockID; - /// The block hash or beacon block root, used for validation. - bytes32 blockDigest; + /// Commitment ID. + /// + /// This ID combines the version and the actual identifier of the claim, such as the block number. + uint256 id; + /// The cryptographic digest of the commitment. + /// + /// This is the core of the commitment, representing the data being committed to, + /// e.g., the hash of the execution block. + bytes32 digest; + /// The cryptographic digest of the network configuration. + /// + /// This ID ensures that the commitment is valid only for the specific network configuration + /// it was created for. + bytes32 configID; } } } -/// Solidity struct representing the committed block used for validation. pub use private::Commitment; -/// The different versions of a [Commitment]. +/// Version of a [`Commitment`]. #[repr(u16)] -enum CommitmentVersion { +#[derive(Debug, PartialEq, Eq)] +pub enum CommitmentVersion { + /// Commitment to an execution block. Block, + /// Commitment to a beacon chain state. Beacon, } impl Commitment { - /// Constructs a commitment from a sealed [EvmBlockHeader]. + /// The size in bytes of the ABI-encoded commitment. + pub const ABI_ENCODED_SIZE: usize = 3 * 32; + + /// Creates a new commitment. #[inline] - fn from_header(header: &Sealed) -> Self { - Commitment { - blockID: Self::encode_id(header.number(), CommitmentVersion::Block as u16), - blockDigest: header.seal(), + pub const fn new(version: u16, id: u64, digest: B256, config_id: B256) -> Commitment { + Self { + id: Commitment::encode_id(id, version), + digest, + configID: config_id, } } - /// Returns the block identifier without the commitment version. + /// Decodes the `id` field into the claim ID and the commitment version. #[inline] - pub fn block_id(&self) -> u64 { - Self::decode_id(self.blockID).unwrap().0 + pub fn decode_id(&self) -> (U256, u16) { + let decoded = self.id + & uint!(0x0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_U256); + let version = (self.id.as_limbs()[3] >> 48) as u16; + (decoded, version) } - /// Encodes an ID and version into a single [U256] value. + /// ABI-encodes the commitment. #[inline] - pub(crate) fn encode_id(id: u64, version: u16) -> U256 { + pub fn abi_encode(&self) -> Vec { + SolValue::abi_encode(self) + } + + /// Encodes an ID and version into a single [U256] value. + const fn encode_id(id: u64, version: u16) -> U256 { U256::from_limbs([id, 0, 0, (version as u64) << 48]) } +} - /// Decodes an ID and version from a single [U256] value. - #[inline] - pub(crate) fn decode_id(mut id: U256) -> Result<(u64, u16), FromUintError> { - let version = (id.as_limbs()[3] >> 48) as u16; - id &= uint!(0x0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_U256); - Ok((id.try_into()?, version)) +impl std::fmt::Debug for Commitment { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let (id, version) = self.decode_id(); + f.debug_struct("Commitment") + .field("version", &version) + .field("id", &id) + .field("claim", &self.digest) + .field("configID", &self.configID) + .finish() } } #[cfg(test)] mod tests { - use super::Commitment; + use super::*; + use alloy_primitives::B256; + + #[test] + fn size() { + let tests = vec![ + Commitment::default(), + Commitment::new( + u16::MAX, + u64::MAX, + B256::repeat_byte(0xFF), + B256::repeat_byte(0xFF), + ), + ]; + for test in tests { + assert_eq!(test.abi_encode().len(), Commitment::ABI_ENCODED_SIZE); + } + } #[test] fn versioned_id() { let tests = vec![(u64::MAX, u16::MAX), (u64::MAX, 0), (0, u16::MAX), (0, 0)]; for test in tests { - let id = Commitment::encode_id(test.0, test.1); - assert_eq!(Commitment::decode_id(id).unwrap(), test); + let commit = Commitment::new(test.1, test.0, B256::default(), B256::default()); + let (id, version) = commit.decode_id(); + assert_eq!((id.to(), version), test); } } } diff --git a/steel/src/merkle.rs b/steel/src/merkle.rs new file mode 100644 index 00000000..28d85dea --- /dev/null +++ b/steel/src/merkle.rs @@ -0,0 +1,114 @@ +// Copyright 2024 RISC Zero, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Helpers for verifying Merkle proofs. +use alloy_primitives::B256; +use sha2::{Digest, Sha256}; +use thiserror::Error as ThisError; + +/// Error returned when verifying Merkle proofs. +#[derive(Debug, ThisError)] +#[error("proof verification failed")] +pub struct InvalidProofError; + +/// Returns an error if `leaf` cannot be proven to occupy the `index` in the Merkle tree. +#[inline] +pub fn verify( + leaf: B256, + branch: &[B256], + generalized_index: usize, + root: B256, +) -> Result<(), InvalidProofError> { + if process_proof(leaf, branch, generalized_index)? != root { + return Err(InvalidProofError); + } + + Ok(()) +} + +/// Returns the rebuilt hash obtained by traversing the Merkle tree up from `leaf`, assuming `leaf` +/// occupies the `generalized_index` in the tree. +#[inline] +pub fn process_proof( + leaf: B256, + branch: &[B256], + generalized_index: usize, +) -> Result { + let depth = generalized_index.ilog2(); + let mut index = generalized_index - (1 << depth); + if !usize::try_from(depth) + .map(|depth| branch.len() == depth) + .unwrap_or(false) + { + return Err(InvalidProofError); + } + + let mut computed_hash = leaf; + let mut hasher = Sha256::new(); + for node in branch { + if index % 2 != 0 { + hasher.update(node); + hasher.update(computed_hash); + } else { + hasher.update(computed_hash); + hasher.update(node); + } + computed_hash.copy_from_slice(&hasher.finalize_reset()); + index /= 2; + } + + Ok(computed_hash) +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_primitives::b256; + + const LEAF: B256 = b256!("94159da973dfa9e40ed02535ee57023ba2d06bad1017e451055470967eb71cd5"); + const BRANCH: [B256; 3] = [ + b256!("8f594dbb4f4219ad4967f86b9cccdb26e37e44995a291582a431eef36ecba45c"), + b256!("f8c2ed25e9c31399d4149dcaa48c51f394043a6a1297e65780a5979e3d7bb77c"), + b256!("382ba9638ce263e802593b387538faefbaed106e9f51ce793d405f161b105ee6"), + ]; + const INDEX: usize = (1 << BRANCH.len()) + 2; + const ROOT: B256 = b256!("27097c728aade54ff1376d5954681f6d45c282a81596ef19183148441b754abb"); + + #[test] + fn valid_proof() { + assert_eq!(process_proof(LEAF, &BRANCH, INDEX).unwrap(), ROOT); + verify(LEAF, &BRANCH, INDEX, ROOT).unwrap() + } + + #[test] + fn invalid_length() { + let branch = &BRANCH[..2]; + process_proof(LEAF, branch, INDEX).unwrap_err(); + verify(LEAF, branch, INDEX, ROOT).unwrap_err(); + } + + #[test] + fn invalid_index() { + let index: usize = 1 << BRANCH.len(); + assert_ne!(process_proof(LEAF, &BRANCH, index).unwrap(), ROOT); + verify(LEAF, &BRANCH, index, ROOT).unwrap_err(); + } + + #[test] + fn invalid_leaf() { + let leaf = B256::ZERO; + assert_ne!(process_proof(leaf, &BRANCH, INDEX).unwrap(), ROOT); + verify(leaf, &BRANCH, INDEX, ROOT).unwrap_err(); + } +} diff --git a/steel/src/mpt.rs b/steel/src/mpt.rs index 54823f4e..f7e60b57 100644 --- a/steel/src/mpt.rs +++ b/steel/src/mpt.rs @@ -14,10 +14,9 @@ use std::fmt::Debug; -use alloy_primitives::{b256, keccak256, B256}; +use alloy_primitives::{b256, keccak256, map::B256HashMap, B256}; use alloy_rlp::{BufMut, Decodable, Encodable, Header, PayloadView, EMPTY_STRING_CODE}; use nybbles::Nibbles; -use revm::primitives::HashMap; use serde::{Deserialize, Serialize}; /// Root hash of an empty Merkle Patricia trie, i.e. `keccak256(RLP(""))`. @@ -44,7 +43,7 @@ impl MerkleTrie { #[inline] pub fn get_rlp(&self, key: impl AsRef<[u8]>) -> alloy_rlp::Result> { match self.get(key) { - Some(mut bytes) => Ok(Some(T::decode(&mut bytes)?)), + Some(bytes) => Ok(Some(alloy_rlp::decode_exact(bytes)?)), None => Ok(None), } } @@ -77,7 +76,7 @@ impl MerkleTrie { pub fn from_rlp_nodes>( nodes: impl IntoIterator, ) -> alloy_rlp::Result { - let mut nodes_by_hash = HashMap::new(); + let mut nodes_by_hash = B256HashMap::default(); let mut root_node_opt = None; for rlp in nodes { @@ -127,7 +126,7 @@ impl Node { .and_then(|node| node.get(remaining)), None => None, // branch nodes don't have values in our MPT version }, - Node::Digest(_) => panic!("Attempted to access unresolved node"), + Node::Digest(_) => panic!("MPT: Unresolved node access"), } } @@ -333,7 +332,7 @@ fn parse_node(rlp: impl AsRef<[u8]>) -> alloy_rlp::Result<(Option, Node)> Ok(((rlp.len() >= 32).then(|| keccak256(rlp)), node)) } -fn resolve_trie(root: Node, nodes_by_hash: &HashMap) -> Node { +fn resolve_trie(root: Node, nodes_by_hash: &B256HashMap) -> Node { match root { Node::Null | Node::Leaf(..) => root, Node::Extension(prefix, child) => { @@ -357,24 +356,26 @@ fn resolve_trie(root: Node, nodes_by_hash: &HashMap) -> Node { #[cfg(test)] mod tests { - use crate::state::StateAccount; - use super::*; + use crate::state::StateAccount; use alloy_primitives::{address, uint, Bytes, U256}; use alloy_trie::HashBuilder; use serde_json::json; use std::collections::BTreeMap; - fn rlp_encoded(root: &Node) -> Vec> { - let mut out = vec![root.rlp_encoded()]; - match root { - Node::Null | Node::Leaf(_, _) | Node::Digest(_) => {} - Node::Extension(_, child) => out.extend(rlp_encoded(child)), - Node::Branch(children) => { - out.extend(children.iter().flatten().flat_map(|c| rlp_encoded(c))); - } - }; - out + fn rlp_nodes(trie: &MerkleTrie) -> Vec> { + fn rec(root: &Node) -> Vec> { + let mut out = vec![root.rlp_encoded()]; + match root { + Node::Null | Node::Leaf(_, _) | Node::Digest(_) => {} + Node::Extension(_, child) => out.extend(rec(child)), + Node::Branch(children) => { + out.extend(children.iter().flatten().flat_map(|c| rec(c))); + } + }; + out + } + rec(&trie.0) } #[test] @@ -385,10 +386,7 @@ mod tests { #[test] pub fn mpt_null() { let mpt = MerkleTrie(Node::Null); - assert_eq!( - mpt, - MerkleTrie::from_rlp_nodes(rlp_encoded(&mpt.0)).unwrap() - ); + assert_eq!(mpt, MerkleTrie::from_rlp_nodes(rlp_nodes(&mpt)).unwrap()); assert_eq!(mpt.hash_slow(), EMPTY_ROOT_HASH); assert_eq!(mpt.size(), 0); @@ -402,10 +400,7 @@ mod tests { #[test] pub fn mpt_digest() { let mpt = MerkleTrie(Node::Digest(B256::ZERO)); - assert_eq!( - mpt, - MerkleTrie::from_rlp_nodes(rlp_encoded(&mpt.0)).unwrap() - ); + assert_eq!(mpt, MerkleTrie::from_rlp_nodes(rlp_nodes(&mpt)).unwrap()); assert_eq!(mpt.hash_slow(), B256::ZERO); assert_eq!(mpt.size(), 0); @@ -414,10 +409,7 @@ mod tests { #[test] pub fn mpt_leaf() { let mpt = MerkleTrie(Node::Leaf(Nibbles::unpack(B256::ZERO), vec![0].into())); - assert_eq!( - mpt, - MerkleTrie::from_rlp_nodes(rlp_encoded(&mpt.0)).unwrap() - ); + assert_eq!(mpt, MerkleTrie::from_rlp_nodes(rlp_nodes(&mpt)).unwrap()); assert_eq!( mpt.hash_slow(), @@ -432,31 +424,6 @@ mod tests { assert_eq!(mpt.get([1, 2, 3]), None); } - #[test] - pub fn mpt_branch() { - let mut children: [Option>; 16] = Default::default(); - children[0] = Some(Box::new(Node::Leaf( - Nibbles::from_nibbles([0; 63]), - vec![0].into(), - ))); - children[1] = Some(Box::new(Node::Leaf( - Nibbles::from_nibbles([1; 63]), - vec![1].into(), - ))); - let mpt = MerkleTrie(Node::Branch(children)); - assert_eq!( - mpt.hash_slow(), - b256!("f09860d0bbaa3a755a53bbeb7b06824cdda5ac2ee5557d14aa49117a47bd0a3e") - ); - assert_eq!(mpt.size(), 3); - - assert_eq!(mpt.get(B256::repeat_byte(0x00)), Some(&[0][..])); - assert_eq!(mpt.get(B256::repeat_byte(0x11)), Some(&[1][..])); - assert_eq!(mpt.get([]), None); - assert_eq!(mpt.get([0]), None); - assert_eq!(mpt.get([1, 2, 3]), None); - } - #[test] pub fn mpt_extension() { let mut children: [Option>; 16] = Default::default(); @@ -473,6 +440,8 @@ mod tests { Nibbles::from_nibbles([0; 1]), branch.into(), )); + assert_eq!(mpt, MerkleTrie::from_rlp_nodes(rlp_nodes(&mpt)).unwrap()); + assert_eq!( mpt.hash_slow(), b256!("97aa4d930926792c6c5a716223c01dad6b64ce11ac261665d6f2fa031570ad26") @@ -492,6 +461,33 @@ mod tests { assert_eq!(mpt.get(B256::repeat_byte(0x11)), None); } + #[test] + pub fn mpt_branch() { + let mut children: [Option>; 16] = Default::default(); + children[0] = Some(Box::new(Node::Leaf( + Nibbles::from_nibbles([0; 63]), + vec![0].into(), + ))); + children[1] = Some(Box::new(Node::Leaf( + Nibbles::from_nibbles([1; 63]), + vec![1].into(), + ))); + let mpt = MerkleTrie(Node::Branch(children)); + assert_eq!(mpt, MerkleTrie::from_rlp_nodes(rlp_nodes(&mpt)).unwrap()); + + assert_eq!( + mpt.hash_slow(), + b256!("f09860d0bbaa3a755a53bbeb7b06824cdda5ac2ee5557d14aa49117a47bd0a3e") + ); + assert_eq!(mpt.size(), 3); + + assert_eq!(mpt.get(B256::repeat_byte(0x00)), Some(&[0][..])); + assert_eq!(mpt.get(B256::repeat_byte(0x11)), Some(&[1][..])); + assert_eq!(mpt.get([]), None); + assert_eq!(mpt.get([0]), None); + assert_eq!(mpt.get([1, 2, 3]), None); + } + #[test] #[should_panic] pub fn get_digest() { @@ -499,6 +495,30 @@ mod tests { mpt.get([]); } + #[test] + pub fn mpt_short() { + // 4 leaves with 1-byte long keys, the resulting root node should be shorter than 32 bytes + let leaves: BTreeMap<_, _> = (0..4u8).map(|i| (Nibbles::unpack([i]), vec![0])).collect(); + + // construct the root hash and inclusion proofs for all leaves + let proof_keys = leaves.keys().cloned().collect(); + let mut hasher = HashBuilder::default().with_proof_retainer(proof_keys); + leaves.into_iter().for_each(|(k, v)| hasher.add_leaf(k, &v)); + let exp_hash = hasher.root(); + + // reconstruct the trie from the RLP encoded proofs and verify the root hash + let mpt = MerkleTrie::from_rlp_nodes( + hasher + .take_proof_nodes() + .into_nodes_sorted() + .into_iter() + .map(|node| node.1), + ) + .unwrap(); + assert!(mpt.0.rlp_encoded().len() < 32); + assert_eq!(mpt.hash_slow(), exp_hash); + } + #[test] pub fn hash_sparse_mpt() { const NUM_LEAVES: usize = 1024; @@ -516,17 +536,20 @@ mod tests { // generate proofs only for every second leaf let proof_keys = leaves.keys().step_by(2).cloned().collect(); - let mut hash_builder = HashBuilder::default().with_proof_retainer(proof_keys); - for (key, value) in leaves { - hash_builder.add_leaf(key, &value); - } - let root = hash_builder.root(); - let proofs = hash_builder.take_proofs(); + let mut hasher = HashBuilder::default().with_proof_retainer(proof_keys); + leaves.into_iter().for_each(|(k, v)| hasher.add_leaf(k, &v)); + let exp_hash = hasher.root(); // reconstruct the trie from the RLP encoded proofs and verify the root hash - let mpt = MerkleTrie::from_rlp_nodes(proofs.into_values()) - .expect("Failed to reconstruct Merkle Trie from proofs"); - assert_eq!(mpt.hash_slow(), root); + let mpt = MerkleTrie::from_rlp_nodes( + hasher + .take_proof_nodes() + .into_nodes_sorted() + .into_iter() + .map(|node| node.1), + ) + .unwrap(); + assert_eq!(mpt.hash_slow(), exp_hash); } #[test] diff --git a/steel/src/serde.rs b/steel/src/serde.rs index 1fcbfca8..43b0c29c 100644 --- a/steel/src/serde.rs +++ b/steel/src/serde.rs @@ -13,7 +13,7 @@ // limitations under the License. //! Serde related helpers. -use std::fmt; +use std::fmt::{self, Debug}; use alloy_primitives::{hex, keccak256, Sealable, Sealed, B256}; use alloy_rlp::{Decodable, Encodable}; @@ -23,20 +23,35 @@ use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; /// /// It implements deserialization using RLP encoding and does not discard the RLP data after /// decoding, instead keeping it for faster hash computation. -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct RlpHeader { inner: H, rlp: Option>, } +impl std::ops::Deref for RlpHeader { + type Target = H; + + #[inline] + fn deref(&self) -> &Self::Target { + self.inner() + } +} + impl RlpHeader { - pub fn new(inner: H) -> Self { + #[must_use] + #[inline] + pub const fn new(inner: H) -> Self { Self { inner, rlp: None } } #[inline] pub fn inner(&self) -> &H { &self.inner } + #[inline] + pub fn inner_mut(&mut self) -> &mut H { + &mut self.inner + } } impl Sealable for RlpHeader { diff --git a/steel/src/state.rs b/steel/src/state.rs index 2f052b73..9ca4d041 100644 --- a/steel/src/state.rs +++ b/steel/src/state.rs @@ -12,32 +12,39 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{convert::Infallible, fmt::Debug, rc::Rc}; +use std::{convert::Infallible, rc::Rc}; -use crate::mpt::{MerkleTrie, EMPTY_ROOT_HASH}; -use alloy_primitives::{keccak256, Address, Bytes, TxNumber, B256, U256}; -use alloy_rlp_derive::{RlpDecodable, RlpEncodable}; +use crate::mpt::MerkleTrie; +use alloy_primitives::{ + keccak256, + map::{AddressHashMap, B256HashMap, HashMap}, + Address, Bytes, B256, U256, +}; use revm::{ - primitives::{AccountInfo, Bytecode, HashMap, KECCAK_EMPTY}, + primitives::{AccountInfo, Bytecode}, Database, }; +pub use alloy_consensus::Account as StateAccount; + /// A simple MPT-based read-only EVM database implementation. /// /// It is backed by a single [MerkleTrie] for the accounts and one [MerkleTrie] each for the /// accounts' stores. It panics when querying data not contained in the tries. This design allows /// storage keys to be queried by storage trie root hash, but not by account, which is required to -/// implement [revm::DatabaseRef]. Thus, in order to use [StateDb] in revm, [WrapStateDb] must be +/// implement [DatabaseRef]. Thus, in order to use [StateDb] in revm, a wrapper must be /// used, which caches the appropriate storage trie root for each basic account query, thus /// requiring mutability. +/// +/// [DatabaseRef]: revm::DatabaseRef pub struct StateDb { /// State MPT. state_trie: MerkleTrie, /// Storage MPTs to their root hash. /// [Rc] is used fore MPT deduplication. - storage_tries: HashMap>, + storage_tries: B256HashMap>, /// Contracts by their hash. - contracts: HashMap, + contracts: B256HashMap, /// Block hashes by their number. block_hashes: HashMap, } @@ -70,14 +77,14 @@ impl StateDb { fn account(&self, address: Address) -> Option { self.state_trie .get_rlp(keccak256(address)) - .expect("invalid state value") + .expect("Invalid encoded state trie value") } #[inline] fn code_by_hash(&self, hash: B256) -> &Bytes { self.contracts .get(&hash) - .unwrap_or_else(|| panic!("code not found: {}", hash)) + .unwrap_or_else(|| panic!("No code with hash: {}", hash)) } #[inline] @@ -85,7 +92,7 @@ impl StateDb { let hash = self .block_hashes .get(&number) - .unwrap_or_else(|| panic!("block not found: {}", number)); + .unwrap_or_else(|| panic!("No block with number: {}", number)); *hash } @@ -103,7 +110,7 @@ impl StateDb { /// account. pub struct WrapStateDb<'a> { inner: &'a StateDb, - account_storage: HashMap>>, + account_storage: AddressHashMap>>, } impl<'a> WrapStateDb<'a> { @@ -111,7 +118,7 @@ impl<'a> WrapStateDb<'a> { pub fn new(inner: &'a StateDb) -> Self { Self { inner, - account_storage: HashMap::new(), + account_storage: Default::default(), } } } @@ -160,12 +167,12 @@ impl Database for WrapStateDb<'_> { let storage = self .account_storage .get(&address) - .unwrap_or_else(|| panic!("storage not found: {:?}", address)); + .unwrap_or_else(|| panic!("No storage trie with root: {}", address)); match storage { Some(storage) => { let val = storage .get_rlp(keccak256(index.to_be_bytes::<32>())) - .expect("invalid storage value"); + .expect("Invalid encoded storage value"); Ok(val.unwrap_or_default()) } None => Ok(U256::ZERO), @@ -179,27 +186,14 @@ impl Database for WrapStateDb<'_> { } } -/// Represents an account within the state trie. -#[derive(Debug, Clone, PartialEq, Eq, RlpEncodable, RlpDecodable)] -pub struct StateAccount { - /// The number of transactions sent from this account's address. - pub nonce: TxNumber, - /// The number of Wei owned by this account's address. - pub balance: U256, - /// The root of the account's storage trie. - pub storage_root: B256, - /// The hash of the EVM code of this account. - pub code_hash: B256, -} - -impl Default for StateAccount { - /// Provides default values for a [StateAccount]. - fn default() -> Self { - Self { - nonce: 0, - balance: U256::ZERO, - storage_root: EMPTY_ROOT_HASH, - code_hash: KECCAK_EMPTY, - } +#[cfg(test)] +mod tests { + use super::*; + use alloy_consensus::constants::{EMPTY_ROOT_HASH, KECCAK_EMPTY}; + #[test] + fn default_account() { + let account: StateAccount = Default::default(); + assert_eq!(account.storage_root, EMPTY_ROOT_HASH); + assert_eq!(account.code_hash, KECCAK_EMPTY); } } diff --git a/steel/steel-banner.png b/steel/steel-banner.png index 8bc8236b8ef3ea52977fc6bad9d0776b463fe438..de234443b3e6afb71f750be009c1a434a78d0c0e 100644 GIT binary patch delta 559213 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 ` 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

@r9YIc80cbz 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