diff --git a/.github/scripts/check_reth_pin.sh b/.github/scripts/check_reth_pin.sh new file mode 100755 index 00000000..c00e57a3 --- /dev/null +++ b/.github/scripts/check_reth_pin.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Fails when the lockfile resolves more than one paradigmxyz/reth revision. reth-optimism-trie +# resolves its reth dependencies inside the OP monorepo workspace, so the graph only stays +# coherent while Alethia's reth pin references the exact commit OP pins (see the +# reth-optimism-trie note in Cargo.toml); a drifted pin splits the workspace into two +# incompatible reth copies. +set -euo pipefail + +revs=$(grep -oE 'github\.com/paradigmxyz/reth\?[^"]*#[0-9a-f]{40}' Cargo.lock | sed 's/.*#//' | sort -u) +count=$(printf '%s' "$revs" | grep -c . || true) + +if [ "$count" -ne 1 ]; then + echo "Error: expected exactly one paradigmxyz/reth revision in Cargo.lock, found $count:" >&2 + printf '%s\n' "$revs" >&2 + exit 1 +fi + +echo "single reth revision in Cargo.lock: $revs" diff --git a/.github/scripts/install_llvm.sh b/.github/scripts/install_llvm.sh new file mode 100755 index 00000000..16f90368 --- /dev/null +++ b/.github/scripts/install_llvm.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -eo pipefail + +os=${1:?usage: install_llvm.sh [version]} +version=${2:-22} +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +case "$os" in + ubuntu) + sudo "$script_dir/install_llvm_ubuntu.sh" "$version" + ;; + *) + echo "unsupported OS: $os" >&2 + exit 1 + ;; +esac diff --git a/.github/scripts/install_llvm_ubuntu.sh b/.github/scripts/install_llvm_ubuntu.sh new file mode 100755 index 00000000..2d2b6a4e --- /dev/null +++ b/.github/scripts/install_llvm_ubuntu.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# +# CI/Docker provisioning ONLY. This installs apt.llvm.org packages system-wide and +# force-overwrites the /usr/bin/{clang,llvm-config,lld,ld.lld,FileCheck} symlinks, so it must +# not be run on a developer machine: install your distribution's llvm-22 package instead +# (Homebrew `llvm@22` on macOS) and put its bin directory on PATH. +set -eo pipefail + +version=${1:-22} +bins=(clang llvm-config lld ld.lld FileCheck) + +# The official installer needs this package on Debian bookworm but not on newer distributions. +apt-get update -qq +apt-get install -y --no-install-recommends \ + lsb-release wget gnupg ca-certificates +apt-get install -y --no-install-recommends software-properties-common 2>/dev/null || true + +llvm_installer=$(mktemp) +wget -qO "$llvm_installer" https://apt.llvm.org/llvm.sh +# Pin the upstream installer so CI and Docker builds fail loudly when it changes; review the new +# script before updating this hash. +echo "9474ecd78b52aba6e923976b1e9773f5613027cc7e237b9956986cb536e02a36 $llvm_installer" | sha256sum -c - +chmod +x "$llvm_installer" +"$llvm_installer" "$version" all +rm -f "$llvm_installer" + +for bin in "${bins[@]}"; do + if ! command -v "$bin-$version" &>/dev/null; then + echo "Error: $bin-$version not found after install" >&2 + exit 1 + fi + ln -fs "$(command -v "$bin-$version")" "/usr/bin/$bin" +done + +echo "LLVM $version installed:" +llvm-config --version diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 028b1876..68aff239 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,11 +16,12 @@ jobs: name: test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: rui314/setup-mold@v1 + - run: .github/scripts/install_llvm.sh ubuntu - uses: dtolnay/rust-toolchain@master with: - toolchain: 1.94.0 + toolchain: 1.95.0 - uses: Swatinem/rust-cache@v2 with: cache-on-failure: true @@ -40,7 +41,7 @@ jobs: - uses: rui314/setup-mold@v1 - uses: dtolnay/rust-toolchain@master with: - toolchain: 1.94.0 + toolchain: 1.95.0 components: rustfmt - uses: extractions/setup-just@v2 with: @@ -54,9 +55,10 @@ jobs: steps: - uses: actions/checkout@v5 - uses: rui314/setup-mold@v1 + - run: .github/scripts/install_llvm.sh ubuntu - uses: dtolnay/rust-toolchain@master with: - toolchain: 1.94.0 + toolchain: 1.95.0 components: clippy - uses: Swatinem/rust-cache@v2 with: @@ -65,3 +67,33 @@ jobs: with: just-version: 1.5.0 - run: just clippy + + check-no-jit: + name: check (no default features) + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v5 + - name: Verify a single reth revision in Cargo.lock + run: .github/scripts/check_reth_pin.sh + - uses: rui314/setup-mold@v1 + # LLVM is deliberately not installed: this proves the interpreter-only build stays free + # of the LLVM toolchain dependency. + - uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.95.0 + - uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + - run: cargo check --locked -p alethia-reth-bin --no-default-features + + llvm-arm64: + name: llvm install (linux/arm64) + runs-on: ubuntu-24.04-arm + timeout-minutes: 30 + steps: + - uses: actions/checkout@v5 + # Guards the Docker build on ARM64 hosts: apt.llvm.org omits arm64 packages for some + # Debian releases (bookworm has no arm64 LLVM 22), which only surfaces when installing + # on an ARM64 machine. Runs the same installer inside the Docker base distribution. + - run: docker run --rm -v "$PWD/.github/scripts:/scripts:ro" debian:trixie /scripts/install_llvm_ubuntu.sh diff --git a/CLAUDE.md b/CLAUDE.md index de392edb..444d0bbb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,8 +8,9 @@ Alethia-Reth is a Rust execution client for the Taiko protocol, built atop Parad ## Key Technologies -- Language: Rust (`1.93.1` toolchain via `rust-toolchain.toml` / `justfile`) -- Framework: Reth v2.0.0 APIs (`reth_node_builder`, `reth_rpc`, `reth_engine_primitives`, etc.) +- Language: Rust (`1.95.0` toolchain via `rust-toolchain.toml` / `justfile`) +- Framework: Reth v2.4.0 APIs (`reth_node_builder`, `reth_rpc`, `reth_engine_primitives`, etc.) +- Optional revmc JIT execution (`jit` feature, on by default in the binary; needs LLVM 22) - Target protocol: Taiko rollup networks - Build & dependency manager: Cargo + `just` @@ -25,7 +26,7 @@ Alethia-Reth is a Rust execution client for the Taiko protocol, built atop Parad ├── cli CLI wrapper (`TaikoCli`) ├── consensus Beacon consensus extensions ├── db Taiko-specific tables & codecs - ├── evm EVM config, handlers, execution helpers + ├── evm EVM config, handlers, execution helpers, revmc JIT integration ├── payload Payload builder service ├── primitives Shared types (engine, payload attributes) ├── rpc Taiko RPC (eth / engine / auth) diff --git a/Cargo.lock b/Cargo.lock index a843e41f..0abe90d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,7 +14,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "generic-array", ] @@ -67,7 +67,7 @@ dependencies = [ [[package]] name = "alethia-reth-bin" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-cli", "alethia-reth-node", @@ -79,13 +79,13 @@ dependencies = [ [[package]] name = "alethia-reth-block" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-chainspec", "alethia-reth-evm", "alethia-reth-primitives", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-hardforks", "alloy-primitives", @@ -114,11 +114,11 @@ dependencies = [ [[package]] name = "alethia-reth-chainspec" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-genesis", "alloy-hardforks", "alloy-primitives", @@ -136,7 +136,7 @@ dependencies = [ [[package]] name = "alethia-reth-cli" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-block", "alethia-reth-chainspec", @@ -162,7 +162,7 @@ dependencies = [ [[package]] name = "alethia-reth-consensus" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-chainspec", "alethia-reth-evm", @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "alethia-reth-db" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-primitives", "alloy-primitives", @@ -197,7 +197,7 @@ dependencies = [ [[package]] name = "alethia-reth-evm" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-chainspec", "alethia-reth-primitives", @@ -206,13 +206,14 @@ dependencies = [ "reth-evm", "reth-revm", "revm-database-interface", + "revmc", "serde", "tracing", ] [[package]] name = "alethia-reth-node" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-block", "alethia-reth-chainspec", @@ -223,24 +224,31 @@ dependencies = [ "alethia-reth-primitives", "alethia-reth-rpc", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-eth", + "derive_more", "eyre", "futures-util", "reth", + "reth-chainspec", "reth-db", + "reth-db-common", "reth-engine-local", "reth-engine-primitives", "reth-ethereum", "reth-ethereum-primitives", + "reth-evm", + "reth-evm-ethereum", "reth-execution-types", "reth-node-api", "reth-node-builder", + "reth-node-core", "reth-node-ethereum", "reth-optimism-trie", "reth-primitives-traits", "reth-provider", + "reth-revm", "reth-rpc", "reth-rpc-builder", "reth-rpc-eth-api", @@ -256,7 +264,7 @@ dependencies = [ [[package]] name = "alethia-reth-payload" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-block", "alethia-reth-chainspec", @@ -264,7 +272,8 @@ dependencies = [ "alethia-reth-evm", "alethia-reth-primitives", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", + "alloy-genesis", "alloy-hardforks", "alloy-primitives", "alloy-rlp", @@ -298,14 +307,14 @@ dependencies = [ [[package]] name = "alethia-reth-primitives" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alloy-consensus", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "reth-chainspec", "reth-engine-local", "reth-engine-primitives", @@ -322,7 +331,7 @@ dependencies = [ [[package]] name = "alethia-reth-rpc" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alethia-reth-block", "alethia-reth-chainspec", @@ -332,7 +341,7 @@ dependencies = [ "alethia-reth-primitives", "alethia-reth-rpc-types", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-hardforks", "alloy-json-rpc", "alloy-primitives", @@ -340,7 +349,7 @@ dependencies = [ "alloy-rpc-types-debug", "alloy-rpc-types-engine", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "async-trait", "eyre", "jsonrpsee", @@ -348,6 +357,7 @@ dependencies = [ "jsonrpsee-types", "op-alloy-flz", "reth", + "reth-chain-state", "reth-db", "reth-db-api", "reth-engine-primitives", @@ -381,7 +391,7 @@ dependencies = [ [[package]] name = "alethia-reth-rpc-types" -version = "1.2.0" +version = "1.3.0" dependencies = [ "alloy-primitives", "serde", @@ -404,9 +414,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -419,27 +429,27 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.33" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e9e31d834fe25fe991b8884e4b9f0e59db4a97d86e05d1464d6899c013cd62" +checksum = "c36ddb69f5e41407e7a93aead3480f7c8ff076e73d01a951ae8f7ea4542c1ca0" dependencies = [ "alloy-primitives", "alloy-rlp", "num_enum", + "phf 0.14.0", "serde", - "strum", ] [[package]] name = "alloy-consensus" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dbe4e5e9107bf6854e7550b666ca654ff2027eabf8153913e2e31ac4b089779" +checksum = "a6ff0c4adba2abdcd9fb5829ae5f4394c06f8585ed283a9ba79aa33763c802e1" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-trie", "alloy-tx-macros", "arbitrary", @@ -450,7 +460,7 @@ dependencies = [ "either", "k256", "once_cell", - "rand 0.8.5", + "rand 0.8.7", "secp256k1 0.30.0", "serde", "serde_json", @@ -460,24 +470,24 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88fc7bbfb98cf5605a35aadf0ba43a7d9f1608d6f220d05e4fbd5144d3b0b625" +checksum = "7cdf48932b1db3216175e19a2b476d89d53076e004850ee7983c6807ba0fde74" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "arbitrary", "serde", ] [[package]] name = "alloy-dyn-abi" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2db5c583aaef0255aa63a4fe827f826090142528bba48d1bf4119b62780cad" +checksum = "a475bb02d9cef2dbb99065c1664ab3fe1f9352e21d6d5ed3f02cdbfc06ed1abc" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -487,7 +497,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.7.15", + "winnow 1.0.4", ] [[package]] @@ -500,7 +510,7 @@ dependencies = [ "alloy-rlp", "arbitrary", "crc", - "rand 0.8.5", + "rand 0.8.7", "serde", "thiserror 2.0.18", ] @@ -515,7 +525,7 @@ dependencies = [ "alloy-rlp", "arbitrary", "borsh", - "rand 0.8.5", + "rand 0.8.7", "serde", ] @@ -530,7 +540,7 @@ dependencies = [ "arbitrary", "borsh", "k256", - "rand 0.8.5", + "rand 0.8.7", "serde", "serde_with", "thiserror 2.0.18", @@ -538,45 +548,24 @@ dependencies = [ [[package]] name = "alloy-eip7928" -version = "0.3.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8222b1d88f9a6d03be84b0f5e76bb60cd83991b43ad8ab6477f0e4a7809b98d" +checksum = "b3b12337f74cbfa451cb04dac173974814a6ff463079e1793aa09600ba8813ab" dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", "borsh", + "once_cell", "serde", + "thiserror 2.0.18", ] [[package]] name = "alloy-eips" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ef28c9fdad22d4eec52d894f5f2673a0895f1e5ef196734568e68c0f6caca8" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-eip7928", - "alloy-primitives", - "alloy-rlp", - "alloy-serde 1.8.3", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "serde", - "serde_with", - "sha2", -] - -[[package]] -name = "alloy-eips" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb4919fa34b268842f434bfafa9c09136ab7b1a87ce0dd40a61befa35b5408c" +checksum = "ea4c0453065b9206acc0f869a258dc8dcbbd595e144b4446f2c493a24a814d1f" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -584,7 +573,7 @@ dependencies = [ "alloy-eip7928", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "arbitrary", "auto_impl", "borsh", @@ -600,12 +589,12 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.33.2" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fc4b83cb672156663e6094d098beb509965b7fe684bb3d6e44bb9ca2e9ae714" +checksum = "acde665074b478c97047dc2a461b4916cac77922d690e5b7415d1941ae7ff7bf" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-hardforks", "alloy-primitives", "alloy-rpc-types-engine", @@ -620,13 +609,13 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e111e22c1a2133e9ebfd9051ea0eaf63559594d2f50d43cbc6762fbb95fc3c2" +checksum = "027ba57264c5d05e4ff52e6090b3592e7526f5d5f5a844add6bbdd17c071c911" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-trie", "borsh", "serde", @@ -649,9 +638,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" +checksum = "7c36c9d7f9021601b04bfef14a4b64849f6d73116a4e91e071d7fbfe10247901" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -661,9 +650,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b6af6f374c1eeef8ab8dc26232cd440db167322a4207a3debd3d1ee565ca47" +checksum = "c4691c60de5d628533752cd07e102d17c47874c06c04c91af33960fd94c484f4" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -676,19 +665,19 @@ dependencies = [ [[package]] name = "alloy-network" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a3f5a7f3678b71d33fcc45b714fab8928dbc647d5aff2145e72032d5c849bb" +checksum = "9d912bb639bf4ac31e83095afe9e907c8b9774ce0c405966228368309fcfc45f" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-any", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-signer", "alloy-sol-types", "async-trait", @@ -702,22 +691,22 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb50dc1fb0e0b2c8748d5bee1aa7acdd18f9e036311bc93a71d97be624030317" +checksum = "d875a11bd98595f57f73890f2e36f4a1cca0fa670623e59c9fb08b2389979c36" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-primitives" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" +checksum = "4885c1409b6936c4898e646ef58baf6ec54edaf6d8179f79df805a7b85b7cf3e" dependencies = [ "alloy-rlp", "arbitrary", @@ -726,33 +715,34 @@ dependencies = [ "const-hex", "derive_more", "fixed-cache", - "foldhash 0.2.0", - "getrandom 0.4.2", - "hashbrown 0.16.1", - "indexmap 2.13.1", + "foldhash", + "getrandom 0.4.3", + "hashbrown 0.17.1", + "indexmap 2.14.0", "itoa", "k256", "keccak-asm", "paste", "proptest", - "proptest-derive", - "rand 0.9.2", + "proptest-derive 0.8.0", + "rand 0.9.5", "rapidhash", "ruint", "rustc-hash", + "secp256k1 0.31.1", "serde", - "sha3", + "sha3 0.11.0", ] [[package]] name = "alloy-provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ba5468f78c8893be2d68a7f2fda61753336e5653f006af19781001b5f99e6c" +checksum = "0e7d526d184d392a8fbcf4293e457789b307bb70646e4f8b902989a246529450" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-json-rpc", "alloy-network", "alloy-network-primitives", @@ -775,10 +765,10 @@ dependencies = [ "either", "futures", "futures-utils-wasm", - "lru", + "lru 0.16.4", "parking_lot", "pin-project", - "reqwest 0.13.2", + "reqwest", "serde", "serde_json", "thiserror 2.0.18", @@ -790,9 +780,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffcefb5d3391a320eadb95d398e4135f8cc35c7bf29a6bdb357eadcfc5ee5638" +checksum = "6fa5976a77e32a63152e937fa90d0dae1f8142b41a9a99a6386d6ea58934cfa6" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -812,9 +802,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc90b1e703d3c03f4ff7f48e82dd0bc1c8211ab7d079cd836a06fcfeb06651cb" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -823,20 +813,20 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36834a5c0a2fa56e171bf256c34d70fca07d0c0031583edea1c4946b7889c9e" +checksum = "9d4311c03125e8a18296504560b9de3d75ecbd0dcda7f71e6cf2a196d57e6fba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "alloy-rpc-client" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222fd4efff0fb9a25184684742c44fe9fa9a16c4ab5bf97583e71c86598ef8f0" +checksum = "755447dc13a04c6fa6db8dedb5d32ab5edfa4dd7aa34487ff192a3d873e0e8cf" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -847,7 +837,7 @@ dependencies = [ "alloy-transport-ws", "futures", "pin-project", - "reqwest 0.13.2", + "reqwest", "serde", "serde_json", "tokio", @@ -860,22 +850,22 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974df1e56405c27cb8242381f45d8b212ba9df5006046ccf704764a2a4634366" +checksum = "96deb317fe224e98a8ae17a7ed7ea63478867385bf50b7abd53642b24cfd811a" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-admin" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1d057dcbacf8be8f689a7737e0d697fd40a2dc5b664c9035f182ff016649ea" +checksum = "3279cb55f7069c2fb1dbcd9ab2c6e79a02d63c92fd0b850addea0a3715d6b05f" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -885,38 +875,38 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06bc10b0dca4f5bfc3cd30ed46eab5d651b5bb2cd300d683bdcdf5d2bfe6e82c" +checksum = "9f89d27756bf3effdac25d07692724e840ce90ca1ff956a6b47dd2ae1612f597" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-any" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949c0f16a94ae33cdb1139b8dbf9e34d7f26ebfe97962e2a4d620b5f65f48fe4" +checksum = "911a513723ef0b90c3b072f65eebf54d6ebc8b651d06734e252d024bd89b88ac" dependencies = [ "alloy-consensus-any", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-beacon" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8f7fa8ca056bb797a368aeed329e6ace6b62ee4271432ac36ab8ae87a5e60d" +checksum = "81133671b8da58169589aac996f3c4da23bbdee85b13ecee7098065f3eae718a" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "derive_more", @@ -932,9 +922,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301249e3c9e43661cfd7ebbb4746a00af6ce1ef58b5c968451882cd60438417d" +checksum = "b9e9c1f9ac81c56b2d96901201db7eb95c4e9fc3c21237a4690f8c652aa62089" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -945,37 +935,37 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e59bc947935732cae5b072753e5e034c0b70a8b031c2839f45e2659ba07df9ae" +checksum = "5b1f682c4881aa7000ac7cc86d7aeeb3b09836a77a90b329820140233651aeea" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "derive_more", "ethereum_ssz", "ethereum_ssz_derive", "jsonwebtoken", - "rand 0.8.5", + "rand 0.8.7", "serde", - "strum", + "strum 0.27.2", ] [[package]] name = "alloy-rpc-types-eth" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc280a41931bd419af86e9e859dd9726b73313aaa2e479b33c0e344f4b892ddb" +checksum = "4e1bd19904581ee2075b61faabab1a4cefa8b96d8f2c85343adeae8ecf615e2b" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-sol-types", "arbitrary", "itertools 0.14.0", @@ -987,28 +977,28 @@ dependencies = [ [[package]] name = "alloy-rpc-types-mev" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "286c40ce0d715217a5bfa9fb452779b11e6769e56680afa0de691ae8f3a848ac" +checksum = "54c635f0c45a871b55c276653e3838d1687d86282eeaf3d83a1914e02563b3f2" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-trace" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede0458c51bef23620aa6bd01a0b4f608be7bcb61d98e91b8530208ae545f3c2" +checksum = "796729a4e1783904c6040f11a503c4d55ddb16f69dc199ad15e50c4ad039f371" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", "serde_json", "thiserror 2.0.18", @@ -1016,32 +1006,21 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3f4df183248b57f3e0b99054b1b6786769d3fdff6d01a702234068140c8ba76" +checksum = "8533c450895de79eb581875bfc317d1a239ae71aba79e20ee158fa153268f163" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", - "serde", -] - -[[package]] -name = "alloy-serde" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ece63b89294b8614ab3f483560c08d016930f842bf36da56bf0b764a15c11e" -dependencies = [ - "alloy-primitives", + "alloy-serde", "serde", - "serde_json", ] [[package]] name = "alloy-serde" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4848831ff994c88b1c32b7df9c4c1c3eedea4b535bde5eb3c421ef0bdc5ac052" +checksum = "c1e97b3e0b9f816b25083045dcfa69431bd059a078e828e4d82d296d1949b96c" dependencies = [ "alloy-primitives", "arbitrary", @@ -1051,9 +1030,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b8ad9890b212e224291024b1aecfeef72127d27a2f6eebc5e347c40275c4bf" +checksum = "6913d06ccc0d9c6ab67e2f82e2fbe292706da1f91442f30cded2d04b56bf0d58" dependencies = [ "alloy-primitives", "async-trait", @@ -1066,9 +1045,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c67d2372aada343130d41e249b59a3cef29b1678dcd3fd80f1c2c4d6b5318f2" +checksum = "c880813cd26bd1ddf8c2236e31295896efd1fcc5cc761d8894ae894503aeea53" dependencies = [ "alloy-consensus", "alloy-network", @@ -1079,48 +1058,48 @@ dependencies = [ "coins-bip39", "eth-keystore", "k256", - "rand 0.8.5", + "rand 0.8.7", "thiserror 2.0.18", "zeroize", ] [[package]] name = "alloy-sol-macro" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" +checksum = "840128ed2b2971d6d4668a553fe403a82683d3acc646c73e75887e7157408033" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" +checksum = "63ec265e5d65d725175f6ca7711c970824c90ef9c0d1f1973711d4150ee612dd" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.13.1", + "indexmap 2.14.0", "proc-macro-error2", "proc-macro2", "quote", - "sha3", - "syn 2.0.117", + "sha3 0.11.0", + "syn 2.0.118", "syn-solidity", ] [[package]] name = "alloy-sol-macro-input" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" +checksum = "89bf01077f18650876cfa682eb1f949967b5cde03f1a51c955c469d2c9b4aa67" dependencies = [ "const-hex", "dunce", @@ -1128,25 +1107,25 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" +checksum = "857b470ecdd2ed38beaf82ad1a38c516a8ff75266750f38b9eeed001d575241b" dependencies = [ "serde", - "winnow 0.7.15", + "winnow 1.0.4", ] [[package]] name = "alloy-sol-types" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" +checksum = "384cf252de0db2dec52821eac037a7f57e2aa33fe5b900ce6fe39973402341f1" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -1156,9 +1135,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b7b755e64ae6b5de0d762ed2c780e072167ea5e542076a559e00314352a0bf" +checksum = "999adfe5c91035c6bf4c4210e0eb8d0caed79d76fbf5e1b70d78721f6097ac04" dependencies = [ "alloy-json-rpc", "auto_impl", @@ -1179,14 +1158,14 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a29980e69119444ed26b75e7ee5bed2043870f904a64318297e55800db686564" +checksum = "0e79a2c1793afc61eed9ca0963da370a988b27d2bbfa67c78013e262d47424c4" dependencies = [ "alloy-json-rpc", "alloy-transport", "itertools 0.14.0", - "reqwest 0.13.2", + "reqwest", "serde_json", "tower", "tracing", @@ -1195,9 +1174,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b27802653330740c88c28394cdaf1d55190b15b48ef9b99a946f37c9cdb19fa" +checksum = "c24422d5159996688b0c094babf1969cb0197d453902da483711c92c1624fea2" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -1215,9 +1194,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b71dc951db66795cfb52eef835f64cf15163bc93b656e061b457ce5ebff370" +checksum = "1bea36621cd4e4f06c1243e556b32fdc9c4db7b9b09b72a95a87383c0ffcc625" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -1245,7 +1224,7 @@ dependencies = [ "derive_more", "nybbles", "proptest", - "proptest-derive", + "proptest-derive 0.7.0", "serde", "smallvec", "thiserror 2.0.18", @@ -1254,14 +1233,14 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8228b9236479ff16b03041b64b86c2bd4e53da1caa45d59b5868cd1571131e" +checksum = "406bc1183f6843e0aba09f7b3365e828b597213d60793ba5cb41befc863e3a78" dependencies = [ - "darling 0.23.0", + "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1325,9 +1304,18 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[package]] +name = "approx" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] [[package]] name = "aquamarine" @@ -1340,7 +1328,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1352,6 +1340,12 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "archery" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d" + [[package]] name = "ark-bls12-381" version = "0.5.0" @@ -1455,6 +1449,23 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -1482,7 +1493,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.118", ] [[package]] @@ -1520,7 +1541,20 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] @@ -1594,13 +1628,26 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" dependencies = [ - "ark-serialize-derive", + "ark-serialize-derive 0.5.0", "ark-std 0.5.0", "arrayvec", "digest 0.10.7", "num-bigint", ] +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint", + "serde_with", +] + [[package]] name = "ark-serialize-derive" version = "0.5.0" @@ -1609,7 +1656,18 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] @@ -1619,7 +1677,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.7", ] [[package]] @@ -1629,7 +1687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.7", ] [[package]] @@ -1639,7 +1697,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.7", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.7", ] [[package]] @@ -1650,9 +1718,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" dependencies = [ "serde", ] @@ -1665,9 +1733,9 @@ checksum = "4858a9d740c5007a9069007c3b4e91152d0506f13c1b31dd49051fd537656156" [[package]] name = "async-compression" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" dependencies = [ "compression-codecs", "compression-core", @@ -1694,7 +1762,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1705,7 +1773,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1743,20 +1811,20 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.16.2" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -1765,14 +1833,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -1807,6 +1876,12 @@ dependencies = [ "match-lookup", ] +[[package]] +name = "base45" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240e56f4d3c453c36faacb695c535a4d5f8c7d23dac175014f32eb0a71012a03" + [[package]] name = "base64" version = "0.21.7" @@ -1872,7 +1947,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.11.0", + "bitflags", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1880,8 +1955,8 @@ dependencies = [ "quote", "regex", "rustc-hash", - "shlex", - "syn 2.0.117", + "shlex 1.3.0", + "syn 2.0.118", ] [[package]] @@ -1900,41 +1975,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] -name = "bitcoin-io" -version = "0.1.4" +name = "bitcoin-consensus-encoding" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" +checksum = "b2d6094e2a1ba3c93b5a596fe5a10d1a10c3c6e06785cde89f693a044c01aa40" +dependencies = [ + "bitcoin-internals", +] [[package]] -name = "bitcoin_hashes" -version = "0.14.1" +name = "bitcoin-internals" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +checksum = "a30a22d1f112dde8e16be7b45c63645dc165cef254f835b3e1e9553e485cfa64" dependencies = [ - "bitcoin-io", - "hex-conservative", + "hex-conservative 0.3.2", ] [[package]] -name = "bitflags" -version = "1.3.2" +name = "bitcoin-io" +version = "0.1.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb5de036369d1ac59d3c1819ebc4d850f89466f5401c571a285b6ed564a4cb78" +dependencies = [ + "bitcoin-consensus-encoding", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "bca4c7abb40c8817d77403c880988cfd484f23ab2365726afb2f798363e2c4a2" +dependencies = [ + "bitcoin-io", + "hex-conservative 0.2.2", +] [[package]] name = "bitflags" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" dependencies = [ "serde_core", ] +[[package]] +name = "bitmaps" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" + [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -1945,9 +2041,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.4" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ "arrayref", "arrayvec", @@ -1967,12 +2063,12 @@ dependencies = [ ] [[package]] -name = "block-padding" -version = "0.3.3" +name = "block-buffer" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -1993,11 +2089,11 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6339a700715bda376f5ea65c76e8fe8fc880930d8b0638cea68e7f3da6538e0a" dependencies = [ - "bitflags 2.11.0", + "bitflags", "boa_interner", "boa_macros", "boa_string", - "indexmap 2.13.1", + "indexmap 2.14.0", "num-bigint", "rustc-hash", ] @@ -2010,7 +2106,7 @@ checksum = "1521be326f8a5c8887e95d4ce7f002917a002a23f7b93b9a6a2bf50ed4157824" dependencies = [ "aligned-vec", "arrayvec", - "bitflags 2.11.0", + "bitflags", "boa_ast", "boa_gc", "boa_interner", @@ -2029,7 +2125,7 @@ dependencies = [ "futures-lite", "hashbrown 0.16.1", "icu_normalizer", - "indexmap 2.13.1", + "indexmap 2.14.0", "intrusive-collections", "itertools 0.14.0", "num-bigint", @@ -2038,7 +2134,7 @@ dependencies = [ "num_enum", "paste", "portable-atomic", - "rand 0.9.2", + "rand 0.9.5", "regress", "rustc-hash", "ryu-js", @@ -2075,9 +2171,9 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.16.1", - "indexmap 2.13.1", + "indexmap 2.14.0", "once_cell", - "phf", + "phf 0.13.1", "rustc-hash", "static_assertions", ] @@ -2092,7 +2188,7 @@ dependencies = [ "cow-utils", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "synstructure", ] @@ -2102,7 +2198,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd957fa9fa93e3a001a8aba5a5cd40c2bbfde486378be4c4b472fd304aaddb" dependencies = [ - "bitflags 2.11.0", + "bitflags", "boa_ast", "boa_interner", "boa_macros", @@ -2129,43 +2225,68 @@ dependencies = [ ] [[package]] -name = "borsh" -version = "1.6.1" +name = "bon" +version = "3.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +checksum = "a602c73c7b0148ec6d12af6fd5cc7a46e2eacc8878271a999abac56eed12f561" dependencies = [ - "borsh-derive", - "bytes", - "cfg_aliases", + "bon-macros", + "rustversion", ] [[package]] -name = "borsh-derive" -version = "1.6.1" +name = "bon-macros" +version = "3.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" +checksum = "6dee98b0db6a962de883bf5d20362dee4d7ca0d12fe39a7c6c73c844e1cd7c1f" dependencies = [ - "once_cell", - "proc-macro-crate", + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.118", +] + +[[package]] +name = "borsh" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +dependencies = [ + "once_cell", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "boyer-moore-magiclen" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7441b4796eb8a7107d4cd99d829810be75f5573e1081c37faa0e8094169ea0d6" +checksum = "43f0fdabfbc8017645223fd529c6077df2c491277e44e88ed8afd5afe54e715a" dependencies = [ "debug-helper", ] [[package]] name = "brotli" -version = "8.0.2" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -2174,9 +2295,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.0" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -2194,9 +2315,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "by_address" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "byte-slice-cast" @@ -2206,22 +2333,22 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "d6aedf8ae72766347502cf3cb4f41cf5e9cc37d28bee90f1fdaaae15f9cf9424" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "f65693059b6b9c588b9f62fed1cedbf0a8b805631457ea162d68f0de186f3de5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -2232,9 +2359,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -2251,9 +2378,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "2.1.7" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6648ed1e4ea8e8a1a4a2c78e1cda29a3fd500bc622899c340d8525ea9a76b24a" +checksum = "38d04308254695569fdb9bfe3bacc1c91837a670d0806605eb82d63748fbd3a6" dependencies = [ "arbitrary", "blst", @@ -2265,39 +2392,6 @@ dependencies = [ "serde", ] -[[package]] -name = "camino" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "cargo_metadata" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.28", - "serde", - "serde_json", - "thiserror 2.0.18", -] - [[package]] name = "castaway" version = "0.2.4" @@ -2309,14 +2403,14 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.59" +version = "1.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -2346,18 +2440,29 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -2366,7 +2471,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "inout", ] @@ -2378,14 +2483,14 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.9", ] [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -2405,14 +2510,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -2457,7 +2562,7 @@ dependencies = [ "hmac", "once_cell", "pbkdf2 0.12.2", - "rand 0.8.5", + "rand 0.8.7", "sha2", "thiserror 1.0.69", ] @@ -2477,7 +2582,7 @@ dependencies = [ "ripemd", "serde", "sha2", - "sha3", + "sha3 0.10.9", "thiserror 1.0.69", ] @@ -2510,9 +2615,9 @@ dependencies = [ [[package]] name = "compact_str" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" dependencies = [ "castaway", "cfg-if", @@ -2524,9 +2629,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ "brotli", "compression-core", @@ -2538,9 +2643,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "concat-kdf" @@ -2553,9 +2658,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.18.1" +version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531185e432bb31db1ecda541e9e7ab21468d4d844ad7505e0546a49b4945d49b" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -2577,11 +2682,12 @@ checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -2610,6 +2716,16 @@ dependencies = [ "unicode-segmentation", ] +[[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" version = "0.10.1" @@ -2626,15 +2742,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - [[package]] name = "cow-utils" version = "0.1.3" @@ -2670,9 +2777,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -2691,18 +2798,18 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2710,27 +2817,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crossterm" @@ -2738,7 +2845,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.11.0", + "bitflags", "crossterm_winapi", "derive_more", "document-features", @@ -2788,6 +2895,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "ctr" version = "0.9.2" @@ -2821,17 +2937,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", + "syn 2.0.118", ] [[package]] @@ -2840,22 +2946,8 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.117", + "darling_core", + "darling_macro", ] [[package]] @@ -2869,18 +2961,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.117", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core 0.20.11", - "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -2889,16 +2970,16 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.23.0", + "darling_core", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "dashmap" -version = "6.1.0" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" dependencies = [ "arbitrary", "cfg-if", @@ -2912,15 +2993,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "data-encoding-macro" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8142a83c17aa9461d637e649271eae18bf2edd00e91f2e105df36c3c16355bdb" +checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -2928,19 +3009,19 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" +checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" dependencies = [ "data-encoding", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "debug-helper" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" +checksum = "80a4af69c60438a1a82af89d362f4729fd38db7b73f305a237636fad31ceb2bf" [[package]] name = "delay_map" @@ -2969,7 +3050,6 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -2992,7 +3072,7 @@ checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3003,38 +3083,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling 0.20.11", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3056,7 +3105,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.117", + "syn 2.0.118", "unicode-xid", ] @@ -3081,12 +3130,22 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "crypto-common 0.2.2", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -3111,8 +3170,7 @@ dependencies = [ [[package]] name = "discv5" version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7999df38d0bd8f688212e1a4fae31fd2fea6d218649b9cd7c40bf3ec1318fc" +source = "git+https://github.com/sigp/discv5?rev=7663c00#7663c00ee0837ea98547caaedede95d9d6736f4d" dependencies = [ "aes", "aes-gcm", @@ -3131,7 +3189,7 @@ dependencies = [ "more-asserts", "multiaddr", "parking_lot", - "rand 0.8.5", + "rand 0.8.7", "smallvec", "socket2", "tokio", @@ -3142,13 +3200,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3195,7 +3253,7 @@ checksum = "1ec431cd708430d5029356535259c5d645d60edd3d39c54e5eea9782d46caa7d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3247,14 +3305,14 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" dependencies = [ "serde", ] @@ -3292,43 +3350,31 @@ dependencies = [ "hex", "k256", "log", - "rand 0.8.5", + "rand 0.8.7", "secp256k1 0.30.0", "serde", - "sha3", + "sha3 0.10.9", "zeroize", ] -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "enum-ordinalize" -version = "4.3.2" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +checksum = "07f808d588c10e464ea6f7d3eaed500049eff30aaac103460f61828c2d65b3eb" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.2" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +checksum = "42e528e2d34ba8a67a1a650b86beae8ef69fc5fdb638016f386b973226590432" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3348,7 +3394,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3364,7 +3410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -3379,12 +3425,12 @@ dependencies = [ "hex", "hmac", "pbkdf2 0.11.0", - "rand 0.8.5", + "rand 0.8.7", "scrypt", "serde", "serde_json", "sha2", - "sha3", + "sha3 0.10.9", "thiserror 1.0.69", "uuid 0.8.2", ] @@ -3402,9 +3448,9 @@ dependencies = [ [[package]] name = "ethereum_serde_utils" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" +checksum = "38df44a7a271ab43835678f9215b53cc2523e4714a215da6643d83dc110245da" dependencies = [ "alloy-primitives", "hex", @@ -3415,9 +3461,9 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.10.1" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2128a84f7a3850d54ee343334e3392cca61f9f6aa9441eec481b9394b43c238b" +checksum = "e462875ad8693755ea8913d6e905715c76ea4836e2254e18c9cf0f7a8f8c2a13" dependencies = [ "alloy-primitives", "ethereum_serde_utils", @@ -3430,14 +3476,25 @@ dependencies = [ [[package]] name = "ethereum_ssz_derive" -version = "0.10.1" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd596f91cff004fc8d02be44c21c0f9b93140a04b66027ae052f5f8e05b48eba" +checksum = "daf022360bdbe9456eda5f35718a50476d5b2a0d51a97ed4eae27420737a6fba" dependencies = [ - "darling 0.23.0", + "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "evmap" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8874945f036109c72242964c1174cf99434e30cfa45bf45fedc983f50046f8" +dependencies = [ + "hashbag", + "left-right", + "smallvec", ] [[package]] @@ -3456,6 +3513,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" +[[package]] +name = "fast-srgb8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" + [[package]] name = "fastrand" version = "2.4.1" @@ -3512,13 +3575,12 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.27" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" dependencies = [ "cfg-if", "libc", - "libredox", ] [[package]] @@ -3529,9 +3591,9 @@ checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixed-cache" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41c7aa69c00ebccf06c3fa7ffe2a6cf26a58b5fe4deabfe646285ff48136a8f" +checksum = "2fe63500644ef0269fe6b744e7e5dc5c20b5eebf3d881bc2be53f194636f6583" dependencies = [ "equivalent", "rapidhash", @@ -3545,7 +3607,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand 0.8.7", "rustc-hex", "static_assertions", ] @@ -3568,7 +3630,7 @@ checksum = "6dc7a9cb3326bafb80642c5ce99b39a2c0702d4bfa8ee8a3e773791a6cbe2407" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3603,12 +3665,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - [[package]] name = "foldhash" version = "0.2.0" @@ -3727,7 +3783,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -3744,12 +3800,12 @@ checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" dependencies = [ "gloo-timers", - "send_wrapper 0.4.0", + "send_wrapper", ] [[package]] @@ -3775,6 +3831,21 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" +[[package]] +name = "generator" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -3806,24 +3877,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi 5.3.0", "wasip2", - "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", - "wasip2", - "wasip3", + "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] @@ -3838,15 +3908,14 @@ dependencies = [ [[package]] name = "git2" -version = "0.20.4" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" +checksum = "ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e" dependencies = [ - "bitflags 2.11.0", + "bitflags", "libc", "libgit2-sys", "log", - "url", ] [[package]] @@ -3878,9 +3947,9 @@ dependencies = [ [[package]] name = "gloo-timers" -version = "0.2.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "482ce8a491a501da4cd806bd190275363d674f2845005c6ddbd5d3e1dd54495d" dependencies = [ "futures-channel", "futures-core", @@ -3901,6 +3970,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gmp-mpfr-sys" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db155b537cb791b133341f99f68371d86ee7fa4c79aacfbc376d72d23c70531" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "group" version = "0.13.0" @@ -3914,9 +3993,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -3924,7 +4003,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.13.1", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -3937,6 +4016,12 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" +[[package]] +name = "hashbag" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7040a10f52cba493ddb09926e15d10a9d8a28043708a405931fe4c6f19fac064" + [[package]] name = "hashbrown" version = "0.12.3" @@ -3962,7 +4047,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", - "foldhash 0.1.5", ] [[package]] @@ -3973,16 +4057,27 @@ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", - "foldhash 0.2.0", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", "serde", "serde_core", ] [[package]] name = "hashlink" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ "hashbrown 0.16.1", ] @@ -4025,48 +4120,81 @@ dependencies = [ ] [[package]] -name = "hickory-proto" -version = "0.25.2" +name = "hex-conservative" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830e599c2904b08f0834ee6337d8fe8f0ed4a63b5d9e7a7f49c0ffa06d08d360" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hickory-net" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +checksum = "e2295ed2f9c31e471e1428a8f88a3f0e1f4b27c15049592138d1eebe9c35b183" dependencies = [ "async-trait", "cfg-if", "data-encoding", - "enum-as-inner", "futures-channel", "futures-io", "futures-util", + "hickory-proto", + "idna", + "ipnet", + "jni 0.22.4", + "rand 0.10.2", + "thiserror 2.0.18", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bab31817bfb44672a252e97fe81cd0c18d1b2cf892108922f6818820df8c643" +dependencies = [ + "data-encoding", "idna", "ipnet", + "jni 0.22.4", "once_cell", - "rand 0.9.2", + "prefix-trie", + "rand 0.10.2", "ring", "serde", "thiserror 2.0.18", "tinyvec", - "tokio", "tracing", "url", ] [[package]] name = "hickory-resolver" -version = "0.25.2" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +checksum = "f0d58d28879ceecde6607729660c2667a081ccdc082e082675042793960f178c" dependencies = [ "cfg-if", "futures-util", + "hickory-net", "hickory-proto", "ipconfig", + "ipnet", + "jni 0.22.4", "moka", + "ndk-context", "once_cell", "parking_lot", - "rand 0.9.2", + "rand 0.10.2", "resolv-conf", "serde", "smallvec", + "system-configuration", "thiserror 2.0.18", "tokio", "tracing", @@ -4092,9 +4220,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -4102,9 +4230,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -4112,9 +4240,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -4149,9 +4277,9 @@ checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" [[package]] name = "humantime" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "humantime-serde" @@ -4163,11 +4291,20 @@ dependencies = [ "serde", ] +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", @@ -4187,17 +4324,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "log", "rustls", - "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -4251,7 +4386,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core", ] [[package]] @@ -4352,12 +4487,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -4395,6 +4524,31 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "imbl" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e525189e5f603908d0c6e0d402cb5de9c4b2c8866151fabc4ebd771ed2630a2e" +dependencies = [ + "archery", + "bitmaps", + "imbl-sized-chunks", + "rand_core 0.9.5", + "rand_xoshiro", + "serde_core", + "version_check", + "wide", +] + +[[package]] +name = "imbl-sized-chunks" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4241005618a62f8d57b2febd02510fb96e0137304728543dfc5fd6f052c22d" +dependencies = [ + "bitmaps", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -4412,7 +4566,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -4453,13 +4607,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] @@ -4473,22 +4627,46 @@ dependencies = [ "rustversion", ] +[[package]] +name = "inkwell" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7decbc9dfa45a4a827a6ff7b822c113b1285678a937e84213417d4ca8a095782" +dependencies = [ + "bitflags", + "inkwell_internals", + "libc", + "llvm-sys", + "thiserror 2.0.18", +] + +[[package]] +name = "inkwell_internals" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cfe97ee860815a90ed17e09639513269e39420a7440f3f4c996f238c514cf8d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "inotify" -version = "0.11.1" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" +checksum = "153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8" dependencies = [ - "bitflags 2.11.0", + "bitflags", "inotify-sys", "libc", ] [[package]] name = "inotify-sys" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" dependencies = [ "libc", ] @@ -4499,7 +4677,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "block-padding", "generic-array", ] @@ -4509,18 +4686,18 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" dependencies = [ - "darling 0.23.0", + "darling", "indoc", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "interprocess" -version = "2.4.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6be5e5c847dbdb44564bd85294740d031f4f8aeb3464e5375ef7141f7538db69" +checksum = "069323743400cb7ab06a8fe5c1ed911d36b6919ec531661d034c89083629595b" dependencies = [ "doctest-file", "futures-core", @@ -4528,7 +4705,7 @@ dependencies = [ "recvmsg", "tokio", "widestring", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -4549,7 +4726,7 @@ dependencies = [ "socket2", "widestring", "windows-registry", - "windows-result 0.4.1", + "windows-result", "windows-sys 0.61.2", ] @@ -4558,14 +4735,7 @@ name = "ipnet" version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ - "memchr", "serde", ] @@ -4624,6 +4794,36 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "simd_cesu8", + "syn 2.0.118", +] + [[package]] name = "jni-sys" version = "0.3.1" @@ -4649,28 +4849,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -4733,7 +4932,7 @@ dependencies = [ "jsonrpsee-types", "parking_lot", "pin-project", - "rand 0.9.2", + "rand 0.9.5", "rustc-hash", "serde", "serde_json", @@ -4778,7 +4977,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -4848,9 +5047,9 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "10.3.0" +version = "10.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" dependencies = [ "aws-lc-rs", "base64 0.22.1", @@ -4861,6 +5060,7 @@ dependencies = [ "serde_json", "signature", "simple_asn1", + "zeroize", ] [[package]] @@ -4898,21 +5098,46 @@ dependencies = [ "cpufeatures 0.2.17", ] +[[package]] +name = "keccak" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", +] + [[package]] name = "keccak-asm" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa468878266ad91431012b3e5ef1bf9b170eab22883503a318d46857afa4579a" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" dependencies = [ "digest 0.10.7", "sha3-asm", ] +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kqueue" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" dependencies = [ "kqueue-sys", "libc", @@ -4920,11 +5145,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", ] @@ -4935,22 +5160,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "leb128fmt" -version = "0.1.0" +name = "left-right" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +checksum = "0f0c21e4c8ff95f487fb34e6f9182875f42c84cef966d29216bf115d9bba835a" +dependencies = [ + "crossbeam-utils", + "loom", + "slab", +] [[package]] name = "libc" -version = "0.2.184" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libgit2-sys" -version = "0.18.3+1.9.2" +version = "0.18.5+1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" +checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" dependencies = [ "cc", "libc", @@ -4965,7 +5195,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-link 0.2.1", + "windows-link", +] + +[[package]] +name = "libloading" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +dependencies = [ + "cfg-if", + "windows-link", ] [[package]] @@ -4976,9 +5216,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libp2p-identity" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c7892c221730ba55f7196e98b0b8ba5e04b4155651736036628e9f73ed6fc3" +checksum = "9525f3831544f7ae497bde79adf114ef127b0fbbb97edbbf692a80408636421c" dependencies = [ "asn1_der", "bs58", @@ -4986,7 +5226,7 @@ dependencies = [ "hkdf", "k256", "multihash", - "quick-protobuf", + "prost", "sha2", "thiserror 2.0.18", "tracing", @@ -5006,14 +5246,11 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.15" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ - "bitflags 2.11.0", "libc", - "plain", - "redox_syscall 0.7.3", ] [[package]] @@ -5034,9 +5271,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.28" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -5050,7 +5287,7 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] @@ -5087,6 +5324,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +[[package]] +name = "llvm-sys" +version = "221.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abcc34a3b190f03c2a61b555f218f529589ff13657bdd2ff8ac3e85f2abe6bb" +dependencies = [ + "anyhow", + "cc", + "lazy_static", + "libc", + "regex-lite", + "semver 1.0.28", +] + [[package]] name = "lock_api" version = "0.4.14" @@ -5099,19 +5350,41 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber 0.3.23", +] [[package]] name = "lru" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "lru" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6" +dependencies = [ + "hashbrown 0.17.1", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -5139,9 +5412,9 @@ dependencies = [ [[package]] name = "lz4_flex" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c23545df7ecf1b16c303910a69b079e8e251d60f7dd2cc9b4177f2afaf1746" +checksum = "90071f8077f8e40adfc4b7fe9cd495ce316263f19e75c2211eeff3fdf475a3d9" [[package]] name = "mach2" @@ -5160,13 +5433,13 @@ checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" [[package]] name = "macro-string" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +checksum = "59a9dbbfc75d2688ed057456ce8a3ee3f48d12eec09229f560f3643b9f275653" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5177,7 +5450,7 @@ checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5191,15 +5464,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memmap2" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ "libc", ] @@ -5215,12 +5488,12 @@ dependencies = [ [[package]] name = "metrics" -version = "0.24.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5312e9ba3771cfa961b585728215e3d972c950a3eed9252aa093d6301277e8" +checksum = "89550ee9f79e88fef3119de263694973a8adb26c21d75322164fb8c493039fe2" dependencies = [ - "ahash", "portable-atomic", + "rapidhash", ] [[package]] @@ -5231,17 +5504,18 @@ checksum = "161ab904c2c62e7bda0f7562bf22f96440ca35ff79e66c800cbac298f2f4f5ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.18.1" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3589659543c04c7dc5526ec858591015b87cd8746583b51b48ef4353f99dbcda" +checksum = "1db0d8f1fc9e62caebd0319e11eaec5822b0186c171568f0480b46a0137f9108" dependencies = [ "base64 0.22.1", - "indexmap 2.13.1", + "evmap", + "indexmap 2.14.0", "metrics", "metrics-util", "quanta", @@ -5261,22 +5535,23 @@ dependencies = [ "once_cell", "procfs", "rlimit", - "windows 0.62.2", + "windows", ] [[package]] name = "metrics-util" -version = "0.20.1" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdfb1365fea27e6dd9dc1dbc19f570198bc86914533ad639dae939635f096be4" +checksum = "96f8722f8562635f92f8ed992f26df0532266eb03d5202607c20c0d7e9745e13" dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.16.1", "metrics", "quanta", - "rand 0.9.2", + "rand 0.9.5", "rand_xoshiro", + "rapidhash", "sketches-ddsketch", ] @@ -5314,9 +5589,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -5342,7 +5617,7 @@ checksum = "59b43b4fd69e3437618106f7754f34021b831a514f9e1a98ae863cabcd8d8dad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5359,7 +5634,7 @@ dependencies = [ "portable-atomic", "smallvec", "tagptr", - "uuid 1.23.0", + "uuid 1.23.5", ] [[package]] @@ -5389,26 +5664,32 @@ dependencies = [ [[package]] name = "multibase" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" +checksum = "7e0e4a371cbf1dfd666b658ba137763edb23c45beb43cfe369b5593cd6b437b6" dependencies = [ "base-x", "base256emoji", + "base45", "data-encoding", "data-encoding-macro", ] [[package]] name = "multihash" -version = "0.19.3" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +checksum = "577c63b00ad74d57e8c9aa870b5fccebf2fd64a308a5aee9f1bb88e4aea19447" dependencies = [ - "core2", "unsigned-varint", ] +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + [[package]] name = "nom" version = "7.1.3" @@ -5419,13 +5700,22 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +dependencies = [ + "serde", +] + [[package]] name = "notify" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.0", + "bitflags", "fsevent-sys", "inotify", "kqueue", @@ -5443,7 +5733,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] @@ -5461,7 +5751,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5480,9 +5770,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -5500,9 +5790,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -5515,11 +5805,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -5574,7 +5863,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5607,7 +5896,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] @@ -5620,6 +5909,15 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "object" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -5656,9 +5954,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "opentelemetry" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" dependencies = [ "futures-core", "futures-sink", @@ -5670,9 +5968,9 @@ dependencies = [ [[package]] name = "opentelemetry-appender-tracing" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6a1ac5ca3accf562b8c306fa8483c85f4390f768185ab775f242f7fe8fdcc2" +checksum = "2c0080f0dc1d7c786f467cd85a4e395fcab11ee852004f39a29a18ab7c25d837" dependencies = [ "opentelemetry", "tracing", @@ -5682,22 +5980,22 @@ dependencies = [ [[package]] name = "opentelemetry-http" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" dependencies = [ "async-trait", "bytes", "http", "opentelemetry", - "reqwest 0.12.28", + "reqwest", ] [[package]] name = "opentelemetry-otlp" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" +checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" dependencies = [ "http", "opentelemetry", @@ -5705,18 +6003,18 @@ dependencies = [ "opentelemetry-proto", "opentelemetry_sdk", "prost", - "reqwest 0.12.28", + "reqwest", "thiserror 2.0.18", "tokio", "tonic", - "tracing", + "tonic-types", ] [[package]] name = "opentelemetry-proto" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -5727,25 +6025,35 @@ dependencies = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846" +checksum = "c913ac17a6c451661ee255f4625d143e51647ae78ebd969b75e41c4442f4fe47" [[package]] name = "opentelemetry_sdk" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +checksum = "9b59f80e1ac4d5ff7a2db8fb6c80badb7f0f3f858211fba08dd9aaec750894f9" dependencies = [ "futures-channel", "futures-executor", "futures-util", "opentelemetry", "percent-encoding", - "rand 0.9.2", + "portable-atomic", + "rand 0.9.5", "thiserror 2.0.18", ] +[[package]] +name = "oxc_index" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "191884bee6c3744909a51acc7d78d4ae370d817b25875b10642f632327b6296e" +dependencies = [ + "nonmax", +] + [[package]] name = "p256" version = "0.13.2" @@ -5768,6 +6076,30 @@ dependencies = [ "winapi", ] +[[package]] +name = "palette" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" +dependencies = [ + "approx", + "fast-srgb8", + "libm", + "palette_derive", +] + +[[package]] +name = "palette_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" +dependencies = [ + "by_address", + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -5794,7 +6126,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5821,9 +6153,9 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -5832,6 +6164,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + [[package]] name = "pbkdf2" version = "0.11.0" @@ -5869,9 +6207,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.6" +version = "2.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "47627dd7305c6a2d6c8c6bcd24c5a4c17dbbf425f4f9c5313e724b38fc9782e9" dependencies = [ "memchr", "ucd-trie", @@ -5894,10 +6232,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ "phf_macros", - "phf_shared", + "phf_shared 0.13.1", "serde", ] +[[package]] +name = "phf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "010378780309880b08997fae13be7834dba947d36393bd372f2b1556deb2a2f6" +dependencies = [ + "phf_shared 0.14.0", +] + [[package]] name = "phf_generator" version = "0.13.1" @@ -5905,7 +6252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared", + "phf_shared 0.13.1", ] [[package]] @@ -5915,10 +6262,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ "phf_generator", - "phf_shared", + "phf_shared 0.13.1", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5930,24 +6277,33 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5974,15 +6330,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "plain_hasher" @@ -6035,6 +6385,17 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -6052,7 +6413,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6103,7 +6464,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6121,7 +6482,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 2.11.0", + "bitflags", "chrono", "flate2", "procfs-core", @@ -6134,7 +6495,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" dependencies = [ - "bitflags 2.11.0", + "bitflags", "chrono", "hex", ] @@ -6147,9 +6508,9 @@ checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.11.0", + "bitflags", "num-traits", - "rand 0.9.2", + "rand 0.9.5", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -6176,30 +6537,50 @@ checksum = "fb6dc647500e84a25a85b100e76c85b8ace114c209432dc174f20aac11d4ed6c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] -name = "prost" -version = "0.14.3" +name = "proptest-derive" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "c57924a81864dddafba92e1bf92f9bf82f97096c44489548a60e888e1547549b" dependencies = [ - "bytes", - "prost-derive", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive", ] [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "prost-types" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" +dependencies = [ + "prost", ] [[package]] @@ -6223,20 +6604,11 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-protobuf" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] - [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -6254,15 +6626,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.2", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -6276,23 +6649,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -6317,9 +6690,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -6329,15 +6702,26 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", "serde", ] +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -6377,6 +6761,21 @@ dependencies = [ "serde", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rand_xorshift" version = "0.4.0" @@ -6397,40 +6796,42 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.4.1" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" +checksum = "5da7e78a036ce858e8d55b7e7dc8ba3a88b78350fd2155d3591bbd966b58589e" dependencies = [ - "rand 0.9.2", + "getrandom 0.3.4", "rustversion", ] [[package]] name = "ratatui" -version = "0.30.0" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc" +checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" dependencies = [ "instability", "ratatui-core", "ratatui-crossterm", "ratatui-widgets", + "serde", ] [[package]] name = "ratatui-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" +checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ - "bitflags 2.11.0", + "bitflags", "compact_str", - "hashbrown 0.16.1", - "indoc", + "hashbrown 0.17.1", "itertools 0.14.0", "kasuari", - "lru", - "strum", + "lru 0.18.1", + "palette", + "serde", + "strum 0.28.0", "thiserror 2.0.18", "unicode-segmentation", "unicode-truncate", @@ -6439,9 +6840,9 @@ dependencies = [ [[package]] name = "ratatui-crossterm" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3" +checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" dependencies = [ "cfg-if", "crossterm", @@ -6451,18 +6852,19 @@ dependencies = [ [[package]] name = "ratatui-widgets" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" +checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.16.1", + "bitflags", + "hashbrown 0.17.1", "indoc", "instability", "itertools 0.14.0", "line-clipping", "ratatui-core", - "strum", + "serde", + "strum 0.28.0", "time", "unicode-segmentation", "unicode-width", @@ -6474,14 +6876,14 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -6509,16 +6911,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" -dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] @@ -6549,14 +6942,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" dependencies = [ "aho-corasick", "memchr", @@ -6566,20 +6959,26 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "regress" @@ -6593,49 +6992,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "reqwest" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64 0.22.1", "bytes", @@ -6655,7 +7014,7 @@ dependencies = [ "quinn", "rustls", "rustls-pki-types", - "rustls-platform-verifier 0.6.2", + "rustls-platform-verifier 0.7.0", "serde", "serde_json", "serde_urlencoded", @@ -6681,8 +7040,8 @@ checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "reth" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "alloy-rpc-types", @@ -6722,11 +7081,11 @@ dependencies = [ [[package]] name = "reth-basic-payload-builder" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "futures-core", "futures-util", @@ -6749,11 +7108,11 @@ dependencies = [ [[package]] name = "reth-chain-state" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-signer", "alloy-signer-local", @@ -6761,7 +7120,7 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "rand 0.9.2", + "rand 0.9.5", "rayon", "reth-chainspec", "reth-errors", @@ -6770,9 +7129,10 @@ dependencies = [ "reth-metrics", "reth-primitives-traits", "reth-storage-api", + "reth-tasks", "reth-trie", - "revm-database", - "revm-state", + "reth-trie-sparse", + "revm", "serde", "tokio", "tokio-stream", @@ -6781,12 +7141,12 @@ dependencies = [ [[package]] name = "reth-chainspec" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-genesis", "alloy-primitives", @@ -6801,8 +7161,8 @@ dependencies = [ [[package]] name = "reth-cli" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-genesis", "clap", @@ -6814,12 +7174,12 @@ dependencies = [ [[package]] name = "reth-cli-commands" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "backon", @@ -6838,7 +7198,7 @@ dependencies = [ "parking_lot", "ratatui", "rayon", - "reqwest 0.13.2", + "reqwest", "reth-chainspec", "reth-cli", "reth-cli-runner", @@ -6886,6 +7246,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_json", + "socket2", "tar", "tokio", "tokio-stream", @@ -6897,8 +7258,8 @@ dependencies = [ [[package]] name = "reth-cli-runner" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "reth-tasks", "tokio", @@ -6907,15 +7268,15 @@ dependencies = [ [[package]] name = "reth-cli-util" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "cfg-if", "eyre", "libc", - "rand 0.8.5", + "rand 0.8.7", "reth-fs-util", "secp256k1 0.30.0", "serde", @@ -6926,12 +7287,12 @@ dependencies = [ [[package]] name = "reth-codecs" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a79b3247ae4fbb1d4d35ce83a11fc596428a4c6ea836c98a75a55340192578a4" +checksum = "eb43f4858fef4e3b42b80954d2edf1ff67c8ad7498347083cdc7d0f6eff2f081" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-genesis", "alloy-primitives", "alloy-trie", @@ -6947,19 +7308,19 @@ dependencies = [ [[package]] name = "reth-codecs-derive" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5dbae40c272b8a1b4fcc08ee2d4e77d3b0ccdb187c1313f412a73ff54ff2a2" +checksum = "5798ae4d6b264764bc0d742468bd32c7fb515e774645d4930f95ff6311f3ae14" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "reth-config" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "eyre", "humantime-serde", @@ -6974,10 +7335,11 @@ dependencies = [ [[package]] name = "reth-consensus" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", + "alloy-eip7928", "alloy-primitives", "auto_impl", "reth-execution-types", @@ -6987,11 +7349,11 @@ dependencies = [ [[package]] name = "reth-consensus-common" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "reth-chainspec", "reth-consensus", @@ -7000,11 +7362,11 @@ dependencies = [ [[package]] name = "reth-consensus-debug-client" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-json-rpc", "alloy-primitives", "alloy-provider", @@ -7014,9 +7376,8 @@ dependencies = [ "derive_more", "eyre", "futures", - "reqwest 0.13.2", + "reqwest", "reth-node-api", - "reth-primitives-traits", "reth-tracing", "ringbuffer", "serde", @@ -7026,12 +7387,13 @@ dependencies = [ [[package]] name = "reth-db" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "derive_more", "eyre", + "libc", "metrics", "page_size", "parking_lot", @@ -7045,7 +7407,7 @@ dependencies = [ "reth-storage-errors", "reth-tracing", "rustc-hash", - "strum", + "strum 0.27.2", "sysinfo", "tempfile", "thiserror 2.0.18", @@ -7054,8 +7416,8 @@ dependencies = [ [[package]] name = "reth-db-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7080,8 +7442,8 @@ dependencies = [ [[package]] name = "reth-db-common" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-genesis", @@ -7110,10 +7472,10 @@ dependencies = [ [[package]] name = "reth-db-models" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "arbitrary", "bytes", @@ -7125,8 +7487,8 @@ dependencies = [ [[package]] name = "reth-discv4" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7134,7 +7496,7 @@ dependencies = [ "enr", "itertools 0.14.0", "parking_lot", - "rand 0.8.5", + "rand 0.8.7", "reth-ethereum-forks", "reth-net-banlist", "reth-net-nat", @@ -7150,8 +7512,8 @@ dependencies = [ [[package]] name = "reth-discv5" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -7161,7 +7523,7 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "rand 0.9.2", + "rand 0.9.5", "reth-chainspec", "reth-ethereum-forks", "reth-metrics", @@ -7174,8 +7536,8 @@ dependencies = [ [[package]] name = "reth-dns-discovery" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "dashmap", @@ -7198,11 +7560,11 @@ dependencies = [ [[package]] name = "reth-downloaders" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "async-compression", @@ -7229,13 +7591,12 @@ dependencies = [ [[package]] name = "reth-ecies" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "aes", "alloy-primitives", "alloy-rlp", - "block-padding", "byteorder", "cipher", "concat-kdf", @@ -7244,7 +7605,7 @@ dependencies = [ "futures", "hmac", "pin-project", - "rand 0.8.5", + "rand 0.8.7", "reth-network-peers", "secp256k1 0.30.0", "sha2", @@ -7257,8 +7618,8 @@ dependencies = [ [[package]] name = "reth-engine-local" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7280,11 +7641,11 @@ dependencies = [ [[package]] name = "reth-engine-primitives" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", @@ -7293,10 +7654,12 @@ dependencies = [ "reth-errors", "reth-ethereum-primitives", "reth-evm", + "reth-execution-errors", "reth-execution-types", "reth-payload-builder-primitives", "reth-payload-primitives", "reth-primitives-traits", + "reth-storage-api", "reth-trie-common", "serde", "thiserror 2.0.18", @@ -7305,12 +7668,12 @@ dependencies = [ [[package]] name = "reth-engine-tree" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-eip7928", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-primitives", "alloy-rlp", @@ -7318,10 +7681,9 @@ dependencies = [ "crossbeam-channel", "derive_more", "futures", - "indexmap 2.13.1", + "indexmap 2.14.0", "metrics", "moka", - "parking_lot", "rayon", "reth-chain-state", "reth-consensus", @@ -7348,7 +7710,6 @@ dependencies = [ "reth-trie-parallel", "reth-trie-sparse", "revm", - "revm-primitives", "schnellru", "thiserror 2.0.18", "tokio", @@ -7357,10 +7718,12 @@ dependencies = [ [[package]] name = "reth-engine-util" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", + "alloy-primitives", + "alloy-rlp", "alloy-rpc-types-engine", "eyre", "futures", @@ -7385,29 +7748,32 @@ dependencies = [ [[package]] name = "reth-era" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", + "alloy-rpc-types-beacon", + "alloy-rpc-types-engine", "ethereum_ssz", "ethereum_ssz_derive", + "sha2", "snap", "thiserror 2.0.18", ] [[package]] name = "reth-era-downloader" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "bytes", "eyre", "futures-util", - "reqwest 0.13.2", + "reqwest", "reth-era", "reth-fs-util", "sha2", @@ -7416,11 +7782,12 @@ dependencies = [ [[package]] name = "reth-era-utils" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", + "alloy-rlp", "eyre", "futures-util", "reth-db-api", @@ -7438,8 +7805,8 @@ dependencies = [ [[package]] name = "reth-errors" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "reth-consensus", "reth-execution-errors", @@ -7449,8 +7816,8 @@ dependencies = [ [[package]] name = "reth-eth-wire" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-chains", "alloy-primitives", @@ -7477,13 +7844,13 @@ dependencies = [ [[package]] name = "reth-eth-wire-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-chains", "alloy-consensus", "alloy-eip7928", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-hardforks", "alloy-primitives", "alloy-rlp", @@ -7499,8 +7866,8 @@ dependencies = [ [[package]] name = "reth-ethereum" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -7519,8 +7886,8 @@ dependencies = [ [[package]] name = "reth-ethereum-cli" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "clap", "eyre", @@ -7542,11 +7909,11 @@ dependencies = [ [[package]] name = "reth-ethereum-consensus" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "reth-chainspec", "reth-consensus", @@ -7558,10 +7925,10 @@ dependencies = [ [[package]] name = "reth-ethereum-engine-primitives" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "reth-engine-primitives", @@ -7574,8 +7941,8 @@ dependencies = [ [[package]] name = "reth-ethereum-forks" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-eip2124", "alloy-hardforks", @@ -7587,11 +7954,11 @@ dependencies = [ [[package]] name = "reth-ethereum-payload-builder" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", @@ -7617,11 +7984,11 @@ dependencies = [ [[package]] name = "reth-ethereum-primitives" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-eth", "reth-codecs", @@ -7631,8 +7998,8 @@ dependencies = [ [[package]] name = "reth-etl" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "rayon", "reth-db-api", @@ -7641,11 +8008,12 @@ dependencies = [ [[package]] name = "reth-evm" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eip7928", + "alloy-eips", "alloy-evm", "alloy-primitives", "auto_impl", @@ -7665,11 +8033,11 @@ dependencies = [ [[package]] name = "reth-evm-ethereum" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-primitives", "alloy-rpc-types-engine", @@ -7685,8 +8053,8 @@ dependencies = [ [[package]] name = "reth-execution-cache" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "fixed-cache", @@ -7703,8 +8071,8 @@ dependencies = [ [[package]] name = "reth-execution-errors" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-evm", "alloy-primitives", @@ -7716,11 +8084,11 @@ dependencies = [ [[package]] name = "reth-execution-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-primitives", "alloy-rlp", @@ -7735,11 +8103,11 @@ dependencies = [ [[package]] name = "reth-exex" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "eyre", "futures", @@ -7773,10 +8141,10 @@ dependencies = [ [[package]] name = "reth-exex-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "reth-chain-state", "reth-execution-types", @@ -7787,8 +8155,8 @@ dependencies = [ [[package]] name = "reth-fs-util" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "serde", "serde_json", @@ -7797,8 +8165,8 @@ dependencies = [ [[package]] name = "reth-invalid-block-hooks" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7817,16 +8185,14 @@ dependencies = [ "reth-tracing", "reth-trie", "revm", - "revm-bytecode", - "revm-database", "serde", "serde_json", ] [[package]] name = "reth-ipc" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "bytes", "futures", @@ -7845,10 +8211,10 @@ dependencies = [ [[package]] name = "reth-libmdbx" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "bitflags 2.11.0", + "bitflags", "byteorder", "crossbeam-queue", "dashmap", @@ -7862,8 +8228,8 @@ dependencies = [ [[package]] name = "reth-mdbx-sys" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "bindgen", "cc", @@ -7871,20 +8237,21 @@ dependencies = [ [[package]] name = "reth-metrics" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "futures", "metrics", "metrics-derive", + "reth-primitives-traits", "tokio", "tokio-util", ] [[package]] name = "reth-net-banlist" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "ipnet", @@ -7892,12 +8259,12 @@ dependencies = [ [[package]] name = "reth-net-nat" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "futures-util", "if-addrs", - "reqwest 0.13.2", + "reqwest", "serde_with", "thiserror 2.0.18", "tokio", @@ -7906,11 +8273,11 @@ dependencies = [ [[package]] name = "reth-network" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "aquamarine", @@ -7923,8 +8290,8 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.8.7", + "rand 0.9.5", "rayon", "reth-chainspec", "reth-consensus", @@ -7953,6 +8320,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", + "socket2", "thiserror 2.0.18", "tokio", "tokio-stream", @@ -7962,8 +8330,8 @@ dependencies = [ [[package]] name = "reth-network-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -7987,11 +8355,12 @@ dependencies = [ [[package]] name = "reth-network-p2p" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eip7928", + "alloy-eips", "alloy-primitives", "auto_impl", "derive_more", @@ -8009,8 +8378,8 @@ dependencies = [ [[package]] name = "reth-network-peers" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8024,8 +8393,8 @@ dependencies = [ [[package]] name = "reth-network-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-eip2124", "humantime-serde", @@ -8038,8 +8407,8 @@ dependencies = [ [[package]] name = "reth-nippy-jar" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "anyhow", "bincode 1.3.3", @@ -8055,8 +8424,8 @@ dependencies = [ [[package]] name = "reth-node-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-rpc-types-engine", "eyre", @@ -8079,11 +8448,11 @@ dependencies = [ [[package]] name = "reth-node-builder" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-provider", "alloy-rpc-types", @@ -8147,11 +8516,11 @@ dependencies = [ [[package]] name = "reth-node-core" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "clap", @@ -8161,7 +8530,7 @@ dependencies = [ "futures", "humantime", "ipnet", - "rand 0.9.2", + "rand 0.9.5", "reth-chainspec", "reth-cli-util", "reth-config", @@ -8191,7 +8560,7 @@ dependencies = [ "reth-transaction-pool", "secp256k1 0.30.0", "serde", - "strum", + "strum 0.27.2", "thiserror 2.0.18", "toml", "tracing", @@ -8202,14 +8571,20 @@ dependencies = [ [[package]] name = "reth-node-ethereum" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-consensus", + "alloy-eips", "alloy-network", + "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", + "ethereum_ssz", + "ethereum_ssz_derive", "eyre", + "http-body-util", + "jsonrpsee", "reth-chainspec", "reth-engine-local", "reth-engine-primitives", @@ -8222,6 +8597,7 @@ dependencies = [ "reth-network", "reth-node-api", "reth-node-builder", + "reth-node-core", "reth-payload-primitives", "reth-primitives-traits", "reth-provider", @@ -8229,19 +8605,23 @@ dependencies = [ "reth-rpc", "reth-rpc-api", "reth-rpc-builder", + "reth-rpc-engine-api", "reth-rpc-eth-api", "reth-rpc-eth-types", "reth-rpc-server-types", "reth-tracing", "reth-transaction-pool", "revm", + "serde", + "serde_json", "tokio", + "tower", ] [[package]] name = "reth-node-ethstats" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8264,11 +8644,11 @@ dependencies = [ [[package]] name = "reth-node-events" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "derive_more", @@ -8288,8 +8668,8 @@ dependencies = [ [[package]] name = "reth-node-metrics" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "bytes", "eyre", @@ -8301,7 +8681,7 @@ dependencies = [ "metrics-process", "metrics-util", "procfs", - "reqwest 0.13.2", + "reqwest", "reth-metrics", "reth-tasks", "tikv-jemalloc-ctl", @@ -8312,8 +8692,8 @@ dependencies = [ [[package]] name = "reth-node-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "reth-chainspec", "reth-db-api", @@ -8325,13 +8705,14 @@ dependencies = [ [[package]] name = "reth-optimism-trie" version = "1.11.3" -source = "git+https://github.com/ethereum-optimism/optimism?rev=bcf489eaca2218e5063ca2d188a25f9c83ccd3f3#bcf489eaca2218e5063ca2d188a25f9c83ccd3f3" +source = "git+https://github.com/ethereum-optimism/optimism?rev=4f21ce6b9574ffc3473dd3b622ec9f7bd0c72fad#4f21ce6b9574ffc3473dd3b622ec9f7bd0c72fad" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "auto_impl", "bincode 2.0.1", "bytes", + "crossbeam-channel", "derive_more", "eyre", "metrics", @@ -8348,8 +8729,9 @@ dependencies = [ "reth-tasks", "reth-trie", "reth-trie-common", + "reth-trie-db", "serde", - "strum", + "strum 0.27.2", "thiserror 2.0.18", "tokio", "tracing", @@ -8357,8 +8739,8 @@ dependencies = [ [[package]] name = "reth-payload-builder" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -8381,8 +8763,8 @@ dependencies = [ [[package]] name = "reth-payload-builder-primitives" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "pin-project", "reth-payload-primitives", @@ -8393,17 +8775,16 @@ dependencies = [ [[package]] name = "reth-payload-primitives" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", "auto_impl", "either", - "reth-chain-state", "reth-chainspec", "reth-errors", "reth-execution-types", @@ -8417,8 +8798,8 @@ dependencies = [ [[package]] name = "reth-payload-validator" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", @@ -8427,12 +8808,12 @@ dependencies = [ [[package]] name = "reth-primitives-traits" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc759fd87c3f65440e5d3bfa3107fe8a13a61a6807cd485c62c49d63c7bf6717" +checksum = "f59c928b2865af5bcdbce94800270b7f7798f27a22ca0aabdd2b7d3e6587c9ce" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-genesis", "alloy-primitives", "alloy-rlp", @@ -8460,11 +8841,12 @@ dependencies = [ [[package]] name = "reth-provider" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eip7928", + "alloy-eips", "alloy-genesis", "alloy-primitives", "alloy-rpc-types-engine", @@ -8494,27 +8876,26 @@ dependencies = [ "reth-storage-api", "reth-storage-errors", "reth-tasks", + "reth-tokio-util", "reth-trie", "reth-trie-db", - "revm-database", - "revm-state", + "revm", "rocksdb", - "strum", + "smallvec", + "strum 0.27.2", "tokio", "tracing", ] [[package]] name = "reth-prune" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", "alloy-primitives", "itertools 0.14.0", "metrics", - "rayon", "reth-config", "reth-db-api", "reth-errors", @@ -8535,8 +8916,8 @@ dependencies = [ [[package]] name = "reth-prune-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "arbitrary", @@ -8544,15 +8925,15 @@ dependencies = [ "modular-bitfield", "reth-codecs", "serde", - "strum", + "strum 0.27.2", "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-revm" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -8566,12 +8947,13 @@ dependencies = [ [[package]] name = "reth-rpc" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-dyn-abi", - "alloy-eips 2.0.0", + "alloy-eip7928", + "alloy-eips", "alloy-evm", "alloy-genesis", "alloy-network", @@ -8587,7 +8969,7 @@ dependencies = [ "alloy-rpc-types-mev", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-signer", "alloy-signer-local", "async-trait", @@ -8615,6 +8997,7 @@ dependencies = [ "reth-network-peers", "reth-network-types", "reth-node-api", + "reth-payload-primitives", "reth-primitives-traits", "reth-revm", "reth-rpc-api", @@ -8625,12 +9008,10 @@ dependencies = [ "reth-rpc-server-types", "reth-storage-api", "reth-tasks", - "reth-tracing", "reth-transaction-pool", "reth-trie-common", "revm", "revm-inspectors", - "revm-primitives", "serde", "serde_json", "sha2", @@ -8643,10 +9024,10 @@ dependencies = [ [[package]] name = "reth-rpc-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-genesis", "alloy-json-rpc", "alloy-primitives", @@ -8660,7 +9041,7 @@ dependencies = [ "alloy-rpc-types-mev", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde 2.0.0", + "alloy-serde", "jsonrpsee", "reth-chain-state", "reth-engine-primitives", @@ -8673,8 +9054,8 @@ dependencies = [ [[package]] name = "reth-rpc-builder" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-network", "alloy-provider", @@ -8716,8 +9097,8 @@ dependencies = [ [[package]] name = "reth-rpc-convert" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-evm", @@ -8736,10 +9117,10 @@ dependencies = [ [[package]] name = "reth-rpc-engine-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", @@ -8767,13 +9148,13 @@ dependencies = [ [[package]] name = "reth-rpc-eth-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-dyn-abi", "alloy-eip7928", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-json-rpc", "alloy-network", @@ -8781,7 +9162,7 @@ dependencies = [ "alloy-rlp", "alloy-rpc-types-eth", "alloy-rpc-types-mev", - "alloy-serde 2.0.0", + "alloy-serde", "async-trait", "auto_impl", "dyn-clone", @@ -8796,6 +9177,7 @@ dependencies = [ "reth-network-api", "reth-node-api", "reth-primitives-traits", + "reth-prune-types", "reth-revm", "reth-rpc-convert", "reth-rpc-eth-types", @@ -8813,16 +9195,19 @@ dependencies = [ [[package]] name = "reth-rpc-eth-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ + "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eip7928", + "alloy-eips", "alloy-evm", "alloy-network", "alloy-primitives", "alloy-rpc-client", "alloy-rpc-types-eth", + "alloy-serde", "alloy-sol-types", "alloy-transport", "derive_more", @@ -8831,8 +9216,8 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "metrics", - "rand 0.9.2", - "reqwest 0.13.2", + "rand 0.9.5", + "reqwest", "reth-chain-state", "reth-chainspec", "reth-errors", @@ -8861,8 +9246,8 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-rpc-types-engine", "http", @@ -8875,10 +9260,10 @@ dependencies = [ [[package]] name = "reth-rpc-server-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "jsonrpsee-core", @@ -8886,14 +9271,14 @@ dependencies = [ "reth-errors", "reth-network-api", "serde", - "strum", + "strum 0.27.2", ] [[package]] name = "reth-rpc-traits" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b766da61ec7c46596386b4bc88d9b57d1939d3da2bc9e927567a8a23650e5ce9" +checksum = "ace77dbcdd59c014fda4565ebfec76cd1fe6f5d98584b4655e8d22a947b9eee3" dependencies = [ "alloy-consensus", "alloy-network", @@ -8906,11 +9291,10 @@ dependencies = [ [[package]] name = "reth-stages" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", "alloy-primitives", "alloy-rlp", "eyre", @@ -8919,7 +9303,7 @@ dependencies = [ "num-traits", "page_size", "rayon", - "reqwest 0.13.2", + "reqwest", "reth-chainspec", "reth-codecs", "reth-config", @@ -8955,10 +9339,10 @@ dependencies = [ [[package]] name = "reth-stages-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "aquamarine", "auto_impl", @@ -8983,8 +9367,8 @@ dependencies = [ [[package]] name = "reth-stages-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "arbitrary", @@ -8997,8 +9381,8 @@ dependencies = [ [[package]] name = "reth-static-file" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "parking_lot", @@ -9017,8 +9401,8 @@ dependencies = [ [[package]] name = "reth-static-file-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "clap", @@ -9026,17 +9410,18 @@ dependencies = [ "fixed-map", "reth-stages-types", "serde", - "strum", + "strum 0.27.2", "tracing", ] [[package]] name = "reth-storage-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eip7928", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", @@ -9049,17 +9434,18 @@ dependencies = [ "reth-prune-types", "reth-stages-types", "reth-storage-errors", + "reth-tokio-util", "reth-trie-common", - "revm-database", + "revm", "serde_json", ] [[package]] name = "reth-storage-errors" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "derive_more", @@ -9067,15 +9453,14 @@ dependencies = [ "reth-primitives-traits", "reth-prune-types", "reth-static-file-types", - "revm-database-interface", - "revm-state", + "revm", "thiserror 2.0.18", ] [[package]] name = "reth-tasks" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "crossbeam-utils", "dashmap", @@ -9095,8 +9480,8 @@ dependencies = [ [[package]] name = "reth-tokio-util" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "tokio", "tokio-stream", @@ -9105,8 +9490,8 @@ dependencies = [ [[package]] name = "reth-tracing" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "clap", "eyre", @@ -9114,6 +9499,7 @@ dependencies = [ "rolling-file", "tracing", "tracing-appender", + "tracing-chrome", "tracing-journald", "tracing-logfmt", "tracing-samply", @@ -9122,9 +9508,10 @@ dependencies = [ [[package]] name = "reth-tracing-otlp" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ + "base64 0.22.1", "clap", "eyre", "opentelemetry", @@ -9140,22 +9527,23 @@ dependencies = [ [[package]] name = "reth-transaction-pool" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "aquamarine", "auto_impl", - "bitflags 2.11.0", + "bitflags", "futures-util", + "imbl", "metrics", "parking_lot", "paste", "pin-project", - "rand 0.9.2", + "rand 0.9.5", "reth-chain-state", "reth-chainspec", "reth-eth-wire-types", @@ -9169,8 +9557,6 @@ dependencies = [ "reth-storage-api", "reth-tasks", "revm", - "revm-interpreter", - "revm-primitives", "rustc-hash", "schnellru", "serde", @@ -9184,11 +9570,11 @@ dependencies = [ [[package]] name = "reth-trie" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-trie", @@ -9203,21 +9589,20 @@ dependencies = [ "reth-storage-errors", "reth-trie-common", "reth-trie-sparse", - "revm-database", "tracing", "triehash", ] [[package]] name = "reth-trie-common" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-consensus", "alloy-primitives", "alloy-rlp", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-trie", "arbitrary", "arrayvec", @@ -9230,15 +9615,15 @@ dependencies = [ "rayon", "reth-codecs", "reth-primitives-traits", - "revm-database", + "revm", "serde", "serde_with", ] [[package]] name = "reth-trie-db" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", "metrics", @@ -9247,7 +9632,6 @@ dependencies = [ "reth-execution-errors", "reth-metrics", "reth-primitives-traits", - "reth-stages-types", "reth-storage-api", "reth-storage-errors", "reth-trie", @@ -9257,19 +9641,15 @@ dependencies = [ [[package]] name = "reth-trie-parallel" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ - "alloy-eip7928", "alloy-evm", "alloy-primitives", "alloy-rlp", "crossbeam-channel", "crossbeam-utils", - "derive_more", - "itertools 0.14.0", "metrics", - "rayon", "reth-execution-errors", "reth-metrics", "reth-primitives-traits", @@ -9277,21 +9657,19 @@ dependencies = [ "reth-storage-errors", "reth-tasks", "reth-trie", - "reth-trie-sparse", - "revm-state", + "revm", "thiserror 2.0.18", "tracing", ] [[package]] name = "reth-trie-sparse" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=27bfddeada3953edc22759080a3659ccea62ca1f#27bfddeada3953edc22759080a3659ccea62ca1f" +version = "2.4.0" +source = "git+https://github.com/paradigmxyz/reth?rev=f2eecc65482af4085e43eedb27a32024bf177a0d#f2eecc65482af4085e43eedb27a32024bf177a0d" dependencies = [ "alloy-primitives", - "alloy-rlp", "alloy-trie", - "auto_impl", + "either", "metrics", "rayon", "reth-execution-errors", @@ -9302,23 +9680,24 @@ dependencies = [ "serde_json", "slotmap", "smallvec", + "strum 0.27.2", "tracing", ] [[package]] name = "reth-zstd-compressors" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fa54c341d926ec9b0f7fc0c87f831aa4959de699e69caab1a0bfd914326c09" +checksum = "e1bd4ae4f54a2ba813eef082910bc646bd31cab8ed134308fa71f1068331fb84" dependencies = [ "zstd", ] [[package]] name = "revm" -version = "38.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91202d39dbe8e8d10e9e8f2b76c30da68ecd1d25be69ba6d853ad0d03a3a398a" +checksum = "9d51c254839fb36357d0b02d02e46ba57e683d7b017e2da33b47ae74685a9e59" dependencies = [ "revm-bytecode", "revm-context", @@ -9335,21 +9714,22 @@ dependencies = [ [[package]] name = "revm-bytecode" -version = "10.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbb3a3d735efa94c91f2ef6bf20a35f99a77bc78f3e25bd758336901bdf9661" +checksum = "e33493cf6d996e9242db4f2002caef48ec9aa8c4f3fff3b18aed10ef3942eec7" dependencies = [ "bitvec", - "phf", + "paste", + "phf 0.13.1", "revm-primitives", "serde", ] [[package]] name = "revm-context" -version = "16.0.1" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f68d928d8b228e0faeb1c6ed75c4fde7d124f1ddf9119b67e7a0ad4041237d" +checksum = "86e48fc736d9542c082ea5305be44b6a14b53a615f0147ad57f62189fd813068" dependencies = [ "bitvec", "cfg-if", @@ -9364,9 +9744,9 @@ dependencies = [ [[package]] name = "revm-context-interface" -version = "17.0.1" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3758e6167c4ba7a59a689c519a047edaefcd4c37d74f279b93ed87bc8aece4" +checksum = "ac68282a454318246817486835a446519291dd0a8167d09de14c7e96f2147696" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -9380,11 +9760,13 @@ dependencies = [ [[package]] name = "revm-database" -version = "13.0.1" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c281a1f11d3bcb8c0bba1199ed6bcb001d1aeb3d4fb366819e14f88723989a4e" +checksum = "d761681a43e48408ea23f7f66ff56ff7b6128cadb8f9135d1b94787d0c0fc6b4" dependencies = [ - "alloy-eips 1.8.3", + "alloy-eips", + "derive_more", + "either", "revm-bytecode", "revm-database-interface", "revm-primitives", @@ -9394,9 +9776,9 @@ dependencies = [ [[package]] name = "revm-database-interface" -version = "11.0.1" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89efb9832a4e3742bb4ded5f7fe5bf905e8860e69427d4dfec153484fc6d304" +checksum = "b96e37d62fa60b45987b408486c84ebef4af4e7ddf1b3b96b4955a7263fd4e92" dependencies = [ "auto_impl", "either", @@ -9408,9 +9790,9 @@ dependencies = [ [[package]] name = "revm-handler" -version = "18.1.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "783e903d6922b7f5f9a940d1bb229530502d2924b1aed9d5ca5a94ebf065d460" +checksum = "f5e043ebfc0899c435e44475796285898e4f822e637bd67856da79cc170bd9df" dependencies = [ "auto_impl", "derive-where", @@ -9427,9 +9809,9 @@ dependencies = [ [[package]] name = "revm-inspector" -version = "19.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8216ad58422090d0daa9eb430e0a081f7ad07e7fd30681dee71f8420c99624e0" +checksum = "2e470b2a5e177918944d8cd26174455b61b8fbfbbe7fe411d28b4097e410d11e" dependencies = [ "auto_impl", "either", @@ -9445,9 +9827,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.39.0" +version = "0.41.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731b682530a732ef9c189ef831589128e2ce34d4a306c956322ae2dffe009715" +checksum = "54e22e1aa328f78e8c3dea6a3a860a3a3c3a77c4a7e775e3fdd3dcbb24a152ac" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -9465,9 +9847,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "35.0.1" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ece9f41b69658c15d748288a4dbdfc06a63f3ce93d983af440de3f1631dce6a" +checksum = "fa5547f653f9e4c47b4f9a9075a0b7c0faea5fa29b7873f392733a943837825d" dependencies = [ "revm-bytecode", "revm-context-interface", @@ -9478,9 +9860,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "34.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a346a8cc6c8c39bd65306641c692191299c0a7b63d38810e39e8fe9b92378660" +checksum = "6d785931e4b8750cf9d79c808c22f05979c8d191baafc8badd4651db82584c1c" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -9489,9 +9871,11 @@ dependencies = [ "ark-serialize 0.5.0", "arrayref", "aurora-engine-modexp", + "aws-lc-rs", "blst", "c-kzg", "cfg-if", + "gmp-mpfr-sys", "k256", "p256", "revm-context-interface", @@ -9503,29 +9887,173 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "23.0.0" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c99bda77d9661521ba0b4bc04558c6692074f01e65dd420fa3b893033d9b8a2" +checksum = "66f39151a31afe93d97f7ac894dd9dcc989368d5ccba19ce079bfc1d73b77452" dependencies = [ "alloy-primitives", - "num_enum", "once_cell", "serde", ] [[package]] name = "revm-state" -version = "11.0.1" +version = "41.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c32490ed687dba31c3c882beb8c20408bdd30ef96690d8f145b0ee9a87040bfe" +checksum = "73ef2fffc28acc41e8ef7525f2b1d16288a10f80579a1b33e7e62abc9892314a" dependencies = [ "alloy-eip7928", - "bitflags 2.11.0", + "bitflags", + "nonmax", "revm-bytecode", "revm-primitives", "serde", ] +[[package]] +name = "revmc" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "revm-bytecode", + "revm-context-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter", + "revm-primitives", + "revmc-backend", + "revmc-build", + "revmc-builtins", + "revmc-codegen", + "revmc-context", + "revmc-llvm", + "revmc-runtime", +] + +[[package]] +name = "revmc-backend" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "eyre", + "ruint", +] + +[[package]] +name = "revmc-build" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" + +[[package]] +name = "revmc-builtins" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "paste", + "revm-bytecode", + "revm-context-interface", + "revm-interpreter", + "revm-primitives", + "revmc-backend", + "revmc-context", + "tracing", +] + +[[package]] +name = "revmc-codegen" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "alloy-primitives", + "bitflags", + "bitvec", + "derive_more", + "either", + "indexmap 2.14.0", + "oxc_index", + "revm-bytecode", + "revm-context", + "revm-context-interface", + "revm-database-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter", + "revm-primitives", + "revm-state", + "revmc-backend", + "revmc-build", + "revmc-builtins", + "revmc-context", + "revmc-llvm", + "smallvec", + "tempfile", + "tracing", +] + +[[package]] +name = "revmc-context" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "revm-context", + "revm-context-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter", + "revm-primitives", + "revm-state", + "ruint", +] + +[[package]] +name = "revmc-llvm" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "alloy-primitives", + "cc", + "inkwell", + "object", + "revmc-backend", + "tracing", +] + +[[package]] +name = "revmc-runtime" +version = "0.1.0" +source = "git+https://github.com/paradigmxyz/revmc?rev=520462a463523a3bcd0a47226ddbc3200d62232e#520462a463523a3bcd0a47226ddbc3200d62232e" +dependencies = [ + "alloy-primitives", + "crossbeam-channel", + "crossbeam-queue", + "dashmap", + "derive_more", + "eyre", + "libc", + "libloading 0.9.0", + "quanta", + "rayon", + "revm-bytecode", + "revm-context", + "revm-context-interface", + "revm-database", + "revm-database-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter", + "revm-primitives", + "revm-state", + "revmc-backend", + "revmc-builtins", + "revmc-codegen", + "revmc-context", + "revmc-llvm", + "tempfile", + "tracing", + "wait-timeout", + "wincode", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -9605,9 +10133,9 @@ dependencies = [ [[package]] name = "roaring" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba9ce64a8f45d7fc86358410bb1a82e8c987504c0d4900e9141d69a9f26c885" +checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" dependencies = [ "bytemuck", "byteorder", @@ -9640,15 +10168,16 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "ruint" -version = "1.17.2" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +checksum = "45caf26f647c19115bf9c453c70ffe4a4a3a6390dceebd942610584f99b8ddce" dependencies = [ "alloy-rlp", "arbitrary", "ark-ff 0.3.0", "ark-ff 0.4.2", "ark-ff 0.5.0", + "ark-ff 0.6.0", "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", @@ -9658,8 +10187,8 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.8.7", + "rand 0.9.5", "rlp", "ruint-macro", "serde_core", @@ -9675,11 +10204,11 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" dependencies = [ - "rand 0.8.5", + "rand 0.9.5", ] [[package]] @@ -9721,18 +10250,18 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "aws-lc-rs", "log", @@ -9746,9 +10275,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -9758,9 +10287,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -9772,9 +10301,9 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" dependencies = [ - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", - "jni", + "jni 0.21.1", "log", "once_cell", "rustls", @@ -9789,13 +10318,13 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", - "jni", + "jni 0.22.4", "log", "once_cell", "rustls", @@ -9804,8 +10333,8 @@ dependencies = [ "rustls-webpki", "security-framework", "security-framework-sys", - "webpki-root-certs 1.0.6", - "windows-sys 0.61.2", + "webpki-root-certs 1.0.8", + "windows-sys 0.59.0", ] [[package]] @@ -9816,9 +10345,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -9828,9 +10357,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rusty-fork" @@ -9852,9 +10381,18 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "ryu-js" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" +checksum = "04d056b875a9d2e6cb9a61d127afee9ac5999b9f87bcb32079d1318e505be714" + +[[package]] +name = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] [[package]] name = "salsa20" @@ -9918,6 +10456,12 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -9958,7 +10502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.7", "secp256k1-sys 0.10.1", "serde", ] @@ -9970,7 +10514,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.9.2", + "rand 0.9.5", "secp256k1-sys 0.11.0", ] @@ -9998,8 +10542,8 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", - "core-foundation", + "bitflags", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -10038,10 +10582,6 @@ name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" -dependencies = [ - "serde", - "serde_core", -] [[package]] name = "semver-parser" @@ -10058,12 +10598,6 @@ dependencies = [ "pest", ] -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - [[package]] name = "send_wrapper" version = "0.6.0" @@ -10097,16 +10631,16 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ - "indexmap 2.13.1", + "indexmap 2.14.0", "itoa", "memchr", "serde", @@ -10137,15 +10671,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.18.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64 0.22.1", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.1", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -10156,14 +10691,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.18.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling 0.23.0", + "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -10178,9 +10713,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -10193,26 +10728,36 @@ version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ "digest 0.10.7", + "keccak 0.1.6", ] [[package]] name = "sha3" -version = "0.10.8" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" dependencies = [ - "digest 0.10.7", - "keccak", + "digest 0.11.3", + "keccak 0.2.0", ] [[package]] name = "sha3-asm" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cbb88c189d6352cc8ae96a39d19c7ecad8f7330b29461187f2587fdc2988d5" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" dependencies = [ "cc", "cfg-if", @@ -10233,6 +10778,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook" version = "0.3.18" @@ -10280,6 +10831,22 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version 0.4.1", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "simple_asn1" version = "0.6.4" @@ -10294,9 +10861,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "sketches-ddsketch" @@ -10330,9 +10897,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" dependencies = [ "arbitrary", "serde", @@ -10346,9 +10913,9 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -10366,7 +10933,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.8.5", + "rand 0.8.7", "sha1", ] @@ -10404,7 +10971,16 @@ version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros", + "strum_macros 0.27.2", +] + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros 0.28.0", ] [[package]] @@ -10416,7 +10992,19 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] @@ -10425,6 +11013,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + [[package]] name = "syn" version = "1.0.109" @@ -10438,9 +11032,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -10449,14 +11043,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" +checksum = "ec005042c7d952febc1a3ef5b0f6674e9054aa836877a31c90b20e25b3d31744" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -10476,7 +11070,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -10490,7 +11084,28 @@ dependencies = [ "ntapi", "objc2-core-foundation", "objc2-io-kit", - "windows 0.62.2", + "windows", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -10513,9 +11128,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.45" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", @@ -10529,17 +11144,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "thin-vec" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" +checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" [[package]] name = "thiserror" @@ -10567,7 +11182,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -10578,28 +11193,28 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "thread-priority" -version = "3.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210811179577da3d54eb69ab0b50490ee40491a25d95b8c6011ba40771cb721" +checksum = "8d2e834949be5111506bb252643498af1514f600d9e1dceedaa42afae155b67f" dependencies = [ - "bitflags 2.11.0", + "bitflags", "cfg-if", "libc", "log", "rustversion", - "windows 0.61.3", + "windows", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -10646,12 +11261,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", @@ -10663,15 +11277,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -10690,9 +11304,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -10705,9 +11319,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -10728,7 +11342,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -10791,7 +11405,7 @@ version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap 2.13.1", + "indexmap 2.14.0", "serde_core", "serde_spanned", "toml_datetime 0.7.5+spec-1.1.0", @@ -10820,14 +11434,14 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap 2.13.1", + "indexmap 2.14.0", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.1", + "winnow 1.0.4", ] [[package]] @@ -10836,20 +11450,20 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.4", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tonic" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "base64 0.22.1", @@ -10873,15 +11487,26 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" dependencies = [ "bytes", "prost", "tonic", ] +[[package]] +name = "tonic-types" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab1b02061f83d519bba3caa167f88f261ef05720ab8ebc954ade70de3348e8" +dependencies = [ + "prost", + "prost-types", + "tonic", +] + [[package]] name = "tower" version = "0.5.3" @@ -10891,7 +11516,7 @@ dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.13.1", + "indexmap 2.14.0", "pin-project-lite", "slab", "sync_wrapper", @@ -10904,13 +11529,13 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "async-compression", "base64 0.22.1", - "bitflags 2.11.0", + "bitflags", "bytes", "futures-core", "futures-util", @@ -10919,7 +11544,6 @@ dependencies = [ "http-body-util", "http-range-header", "httpdate", - "iri-string", "mime", "mime_guess", "percent-encoding", @@ -10930,7 +11554,8 @@ dependencies = [ "tower-layer", "tower-service", "tracing", - "uuid 1.23.0", + "url", + "uuid 1.23.5", ] [[package]] @@ -10959,11 +11584,12 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", + "symlink", "thiserror 2.0.18", "time", "tracing-subscriber 0.3.23", @@ -10977,7 +11603,18 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "tracing-chrome" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" +dependencies = [ + "serde_json", + "tracing-core", + "tracing-subscriber 0.3.23", ] [[package]] @@ -11036,9 +11673,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.32.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac28f2d093c6c477eaa76b23525478f38de514fa9aeb1285738d4b97a9552fc" +checksum = "adbc64cba7137545b8044cb1fe9814f7aacf3c6b5f9b45be8bb5db538befdb26" dependencies = [ "js-sys", "opentelemetry", @@ -11098,9 +11735,11 @@ dependencies = [ "serde", "serde_json", "sharded-slab", + "smallvec", "thread_local", "tracing", "tracing-core", + "tracing-log", "tracing-serde", ] @@ -11123,10 +11762,10 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8840ad4d852e325d3afa7fde8a50b2412f89dce47d7eb291c0cc7f87cd040f38" dependencies = [ - "darling 0.23.0", + "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -11156,7 +11795,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.2", + "rand 0.9.5", "rustls", "rustls-pki-types", "sha1", @@ -11172,9 +11811,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -11226,9 +11865,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-truncate" @@ -11259,7 +11898,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "subtle", ] @@ -11336,11 +11975,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.23.0" +version = "1.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +checksum = "ea5fab0d6c3c01ae70085a09cb03d4c7a1d6314e2b3e075392783396d724ca0a" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", "js-sys", "wasm-bindgen", ] @@ -11359,14 +11998,12 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "9.1.0" +version = "10.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" +checksum = "b5574dd2f922b1a46a06a4b1dc11193a4012108fd54cf725e1816cb8183d8778" dependencies = [ "anyhow", - "cargo_metadata", - "derive_builder", - "regex", + "bon", "rustversion", "time", "vergen-lib", @@ -11374,12 +12011,12 @@ dependencies = [ [[package]] name = "vergen-git2" -version = "9.1.0" +version = "10.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51ab55ddf1188c8d679f349775362b0fa9e90bd7a4ac69838b2a087623f0d57" +checksum = "410e2f72acce10471037150cd9c585ee7b54560f348bf70cd5fc8e87d3433e45" dependencies = [ "anyhow", - "derive_builder", + "bon", "git2", "rustversion", "time", @@ -11389,12 +12026,12 @@ dependencies = [ [[package]] name = "vergen-lib" -version = "9.1.0" +version = "10.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" +checksum = "8cd42fd155c2c2971f6d00face12ec245fbb604fce011ccaf2306d014c2e97ca" dependencies = [ "anyhow", - "derive_builder", + "bon", "rustversion", ] @@ -11418,7 +12055,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -11457,27 +12094,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -11488,9 +12116,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.67" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -11498,9 +12126,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11508,48 +12136,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.1", - "wasm-encoder", - "wasmparser", -] - [[package]] name = "wasm-streams" version = "0.5.0" @@ -11563,18 +12169,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.15.5", - "indexmap 2.13.1", - "semver 1.0.28", -] - [[package]] name = "wasmtimer" version = "0.4.3" @@ -11591,9 +12185,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.94" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -11615,14 +12209,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.6", + "webpki-root-certs 1.0.8", ] [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" dependencies = [ "rustls-pki-types", ] @@ -11633,18 +12227,28 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.6", + "webpki-roots 1.0.8", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "wide" +version = "0.7.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "widestring" version = "1.2.1" @@ -11673,7 +12277,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -11683,37 +12287,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.61.3" +name = "wincode" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" dependencies = [ - "windows-collections 0.2.0", - "windows-core 0.61.2", - "windows-future 0.2.1", - "windows-link 0.1.3", - "windows-numerics 0.2.0", + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "wincode-derive", ] [[package]] -name = "windows" -version = "0.62.2" +name = "wincode-derive" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +checksum = "15ab90b719560d0fda79c74550ad1c948d17b118765942838055ebaf34d67071" dependencies = [ - "windows-collections 0.3.2", - "windows-core 0.62.2", - "windows-future 0.3.2", - "windows-numerics 0.3.1", + "darling", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "windows-collections" -version = "0.2.0" +name = "windows" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ - "windows-core 0.61.2", + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", ] [[package]] @@ -11722,20 +12329,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ - "windows-core 0.62.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-core", ] [[package]] @@ -11746,20 +12340,9 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading 0.1.0", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -11768,9 +12351,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", - "windows-threading 0.2.1", + "windows-core", + "windows-link", + "windows-threading", ] [[package]] @@ -11781,7 +12364,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -11792,39 +12375,23 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - [[package]] name = "windows-numerics" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", + "windows-core", + "windows-link", ] [[package]] @@ -11833,18 +12400,9 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -11853,16 +12411,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -11871,7 +12420,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -11916,7 +12465,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -11956,7 +12505,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.2.1", + "windows-link", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -11967,22 +12516,13 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows-threading" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -12128,106 +12668,21 @@ name = "winnow" version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.13.1", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.0", - "indexmap 2.13.1", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.13.1", - "log", - "semver 1.0.28", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "write16" @@ -12253,7 +12708,7 @@ dependencies = [ "log", "pharos", "rustc_version 0.4.1", - "send_wrapper 0.6.0", + "send_wrapper", "thiserror 2.0.18", "wasm-bindgen", "wasm-bindgen-futures", @@ -12293,9 +12748,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -12310,35 +12765,35 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] @@ -12351,28 +12806,28 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -12407,14 +12862,14 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index 7e6d6eba..f2e3e91b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,35 +18,35 @@ resolver = "2" [workspace.package] version = "1.3.0" edition = "2024" -rust-version = "1.94" +rust-version = "1.95" license = "MIT" [workspace.dependencies] # alloy alloy-chains = { version = "0.2.33", default-features = false } -alloy-consensus = { version = "2.0.0", default-features = false } -alloy-eips = { version = "2.0.0", default-features = false } -alloy-evm = { version = "0.33.0", default-features = false } -alloy-genesis = { version = "2.0.0", default-features = false } +alloy-consensus = { version = "2.1.1", default-features = false } +alloy-eips = { version = "2.1.1", default-features = false } +alloy-evm = { version = "0.37.0", default-features = false } +alloy-genesis = { version = "2.1.1", default-features = false } alloy-hardforks = "0.4.7" -alloy-json-rpc = { version = "2.0.0", default-features = false } -alloy-network = { version = "2.0.0", default-features = false } -alloy-primitives = { version = "1.5.6", default-features = false, features = [ +alloy-json-rpc = { version = "2.1.1", default-features = false } +alloy-network = { version = "2.1.1", default-features = false } +alloy-primitives = { version = "1.6.0", default-features = false, features = [ "map-foldhash", ] } -alloy-rlp = { version = "0.3.13", default-features = false, features = [ +alloy-rlp = { version = "0.3.16", default-features = false, features = [ "core-net", ] } -alloy-rpc-client = { version = "2.0.0", default-features = false } -alloy-rpc-types-debug = { version = "2.0.0", default-features = false } -alloy-rpc-types-engine = { version = "2.0.0", default-features = false } -alloy-rpc-types-eth = { version = "2.0.0", default-features = false } -alloy-rpc-types-trace = { version = "2.0.0", default-features = false } -alloy-rpc-types-txpool = { version = "2.0.0", default-features = false } -alloy-serde = { version = "2.0.0", default-features = false } -alloy-signer = { version = "2.0.0", default-features = false } -alloy-signer-local = { version = "2.0.0", default-features = false } -alloy-sol-types = { version = "1.5.6", default-features = false } +alloy-rpc-client = { version = "2.1.1", default-features = false } +alloy-rpc-types-debug = { version = "2.1.1", default-features = false } +alloy-rpc-types-engine = { version = "2.1.1", default-features = false } +alloy-rpc-types-eth = { version = "2.1.1", default-features = false } +alloy-rpc-types-trace = { version = "2.1.1", default-features = false } +alloy-rpc-types-txpool = { version = "2.1.1", default-features = false } +alloy-serde = { version = "2.1.1", default-features = false } +alloy-signer = { version = "2.1.1", default-features = false } +alloy-signer-local = { version = "2.1.1", default-features = false } +alloy-sol-types = { version = "1.6.0", default-features = false } # general utilities arbitrary = "1.3" @@ -73,66 +73,99 @@ flate2 = "1.1.5" parity-scale-codec = "3.2.1" # reth -reth = { git = "https://github.com/paradigmxyz/reth", package = "reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-chain-state = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-cli = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-cli-commands = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-cli-runner = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-cli-util = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-codecs = { version = "0.3.0", default-features = false } -reth-consensus = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-consensus-common = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-db-api = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-engine-local = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-engine-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-engine-tree = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-errors = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-ethereum-consensus = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-ethereum-engine-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-ethereum-forks = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-evm = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-execution-cache = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-execution-types = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-payload-builder-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-payload-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-payload-validator = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-primitives = { git = "https://github.com/paradigmxyz/reth", package = "reth-ethereum-primitives", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-primitives-traits = { version = "0.3.0", default-features = false } -reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-revm = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-api = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-builder = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-engine-api = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-storage-api = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-storage-errors = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } -reth-trie = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-trie-common = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f", default-features = false } -reth-trie-db = { git = "https://github.com/paradigmxyz/reth", rev = "27bfddeada3953edc22759080a3659ccea62ca1f" } - -reth-optimism-trie = { git = "https://github.com/ethereum-optimism/optimism", rev = "bcf489eaca2218e5063ca2d188a25f9c83ccd3f3", package = "reth-optimism-trie", default-features = false, features = ["serde-bincode-compat"] } +# Default features minus `jit`: reth's own JIT wiring (reth-node-ethereum) would drag the +# LLVM toolchain into every build; Alethia wires revmc into its own EVM factory instead and +# gates it behind the workspace `jit` features. `reth-revm/portable` (a default) is applied +# via this workspace's reth-revm dependency below. +reth = { git = "https://github.com/paradigmxyz/reth", package = "reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false, features = [ + "jemalloc", + "otlp", + "otlp-logs", + "js-tracer", + "keccak-cache-global", + "asm-keccak", + "gmp", + "min-trace-logs", +] } +reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-chain-state = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-cli = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-cli-commands = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-cli-runner = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-cli-util = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-codecs = { version = "0.5.0", default-features = false } +reth-consensus = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-consensus-common = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-db-api = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-db-common = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-engine-local = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-engine-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-engine-tree = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-errors = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-ethereum-consensus = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-ethereum-engine-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-ethereum-forks = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-evm = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-execution-cache = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-execution-types = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-metrics = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-network-peers = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-payload-builder-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-payload-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-payload-validator = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", package = "reth-ethereum-primitives", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-primitives-traits = { version = "0.5.0", default-features = false } +reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-revm = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false, features = [ + "portable", +] } +reth-rpc = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-api = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-builder = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-engine-api = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-rpc-server-types = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-storage-api = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-storage-errors = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-tasks = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-tracing = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } +reth-trie = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-trie-common = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d", default-features = false } +reth-trie-db = { git = "https://github.com/paradigmxyz/reth", rev = "f2eecc65482af4085e43eedb27a32024bf177a0d" } + +# Consumed from the Optimism monorepo (path rust/op-reth/crates/trie). The rev is the merge +# commit of ethereum-optimism/optimism#21766, their post-v2.4.0 reth bump: the crate's reth +# dependencies resolve inside that workspace, so this rev and the reth pin above must reference +# the same paradigmxyz/reth commit (spelled identically) or the graph gets two incompatible reth +# copies. Future reth bumps are OP-first — match the rev they pin rather than picking our own. +# The Taiko live collector the crate used to carry for us lives in +# crates/node/src/proof_history/live.rs. +reth-optimism-trie = { git = "https://github.com/ethereum-optimism/optimism", rev = "4f21ce6b9574ffc3473dd3b622ec9f7bd0c72fad", default-features = false, features = ["serde-bincode-compat"] } # revm -revm-database-interface = { version = "11.0.0", default-features = false } +revm-database-interface = { version = "41.0.0", default-features = false } + +# revmc JIT: pinned to the revision reth f2eecc6 locks. Includes revmc#391 (non-blocking +# runtime controls), #395 (dynamic-gas failure ordering), #394 (stack sync for diverging +# builtins), and #400 (LOG memory operands in gas analysis) — the latter two fix compiled +# code diverging from the interpreter. Keep matched to the reth pin's locked revmc. +revmc = { git = "https://github.com/paradigmxyz/revmc", rev = "520462a463523a3bcd0a47226ddbc3200d62232e", default-features = false, features = [ + "llvm-prefer-static", +] } # serialization serde = { version = "1.0", default-features = false } diff --git a/Dockerfile b/Dockerfile index e029ab1e..a1754e65 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,23 @@ -FROM rust:1.94.0-bookworm AS build +# Trixie rather than bookworm: apt.llvm.org publishes arm64 LLVM 22 packages only for trixie +# (the bookworm arm64 index carries just docs and WASM cross libs), and the runtime stage must +# share the build stage's glibc. +FROM rust:1.95.0-trixie AS build WORKDIR /app -RUN apt-get update && \ +COPY .github/scripts/install_llvm_ubuntu.sh /tmp/install_llvm.sh + +RUN /tmp/install_llvm.sh && rm /tmp/install_llvm.sh && \ + apt-get update && \ apt-get -y upgrade && \ apt-get install -y git libclang-dev pkg-config curl build-essential && \ rm -rf /var/lib/apt/lists/* COPY ./ . -RUN cargo build --release +RUN cargo build --release --locked -FROM debian:bookworm-slim +FROM debian:trixie-slim RUN apt-get update && \ apt-get install -y jq curl ca-certificates && \ diff --git a/README.md b/README.md index a8907693..5c6608f1 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,20 @@ cargo build --release The main binary will be located at `target/release/alethia-reth`. +The default build includes revmc JIT support and requires Rust 1.95 plus LLVM 22. On Ubuntu or +Debian, install LLVM with the same helper used by CI and Docker: + +```bash +.github/scripts/install_llvm.sh ubuntu +``` + +On macOS, `brew install llvm` and put its `bin` directory on `PATH` while building. To build +without the LLVM toolchain dependency, disable default features: + +```bash +cargo build --release -p alethia-reth-bin --no-default-features +``` + ### 3. Run Checks and Tests To ensure everything is set up correctly, run the checks and tests: @@ -47,6 +61,31 @@ To see available command-line options and subcommands, run: _(Note: Replace `[OPTIONS]` with the necessary configuration flags for your setup. Refer to the `--help` output for details.)_ +### revmc JIT + +Start the node with upstream-compatible JIT flags: + +```bash +./target/release/alethia-reth node --jit [OPTIONS] +``` + +The main tuning flags are `--jit.hot-threshold`, `--jit.worker-count`, +`--jit.code-cache-bytes`, and `--jit.idle-evict-duration`. When the `reth` RPC namespace is +enabled, the upstream `reth_jit` method accepts `enable`, `disable`, `pause`, `unpause`, or +`clear` at runtime. + +Taiko's Unzen execution uses consensus-critical zk-gas metering that requires per-opcode +interpreter hooks. JIT dispatch therefore falls back to the interpreter for Unzen blocks and +for ordinary RPC call, trace, simulation, estimation, and pending-block execution. Canonical +Engine execution, payload building, and block replay opt in to the shared revmc backend on +pre-Unzen forks. Compiled code bakes in upstream mainnet gas and opcode semantics, so hardforks +are JIT-eligible only through an explicit allowlist: new forks stay interpreter-only until they +are deliberately marked JIT-safe in `TaikoEvmFactory`. + +revmc is pinned in `Cargo.toml` to a fast-forward of the revision reth v2.4.0 locks, adding the +upstream dynamic-gas failure-order fix (revmc#395) on top of the non-blocking runtime-control +fix (revmc#391). + ## Docker ### 1. Build the Docker Image diff --git a/bin/alethia-reth/Cargo.toml b/bin/alethia-reth/Cargo.toml index f5a43b9d..55a8103c 100644 --- a/bin/alethia-reth/Cargo.toml +++ b/bin/alethia-reth/Cargo.toml @@ -9,6 +9,10 @@ license.workspace = true name = "alethia-reth" path = "src/main.rs" +[features] +default = ["jit"] +jit = ["alethia-reth-node/jit"] + [dependencies] alethia-reth-cli = { path = "../../crates/cli" } alethia-reth-node = { path = "../../crates/node" } diff --git a/bin/alethia-reth/src/main.rs b/bin/alethia-reth/src/main.rs index a1f0b960..44586989 100644 --- a/bin/alethia-reth/src/main.rs +++ b/bin/alethia-reth/src/main.rs @@ -21,6 +21,20 @@ use tracing::info; static ALLOC: reth_cli_util::allocator::Allocator = reth_cli_util::allocator::new_allocator(); fn main() { + // When revmc re-executes this binary as its out-of-process compile helper, serve that role + // and exit before any node setup runs. + #[cfg(feature = "jit")] + { + match alethia_reth_node::maybe_run_jit_helper() { + Ok(std::ops::ControlFlow::Break(())) => return, + Ok(std::ops::ControlFlow::Continue(())) => {} + Err(err) => { + eprintln!("Error: {err:?}"); + std::process::exit(1); + } + } + } + // Enable backtraces unless a RUST_BACKTRACE value has already been explicitly provided. if std::env::var_os("RUST_BACKTRACE").is_none() { unsafe { std::env::set_var("RUST_BACKTRACE", "1") }; diff --git a/clippy.toml b/clippy.toml index 9fcf58a9..9c00d31f 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1,4 +1,4 @@ -msrv = "1.94" +msrv = "1.95" too-large-for-stack = 128 doc-valid-idents = [ "P2P", diff --git a/crates/block/Cargo.toml b/crates/block/Cargo.toml index c540f46f..51d0ac13 100644 --- a/crates/block/Cargo.toml +++ b/crates/block/Cargo.toml @@ -10,6 +10,7 @@ path = "src/lib.rs" [features] default = ["net"] +jit = ["alethia-reth-evm/jit"] prover = ["dep:alethia-reth-primitives", "dep:reth-storage-api", "dep:reth-trie-common"] test-utils = ["dep:reth-storage-api", "dep:reth-trie-common"] net = [ diff --git a/crates/block/src/assembler.rs b/crates/block/src/assembler.rs index d354d06e..8a91ab7e 100644 --- a/crates/block/src/assembler.rs +++ b/crates/block/src/assembler.rs @@ -159,6 +159,7 @@ mod test { &bundle_state, &state_provider, B256::ZERO, + None, )) .expect("Unzen block should assemble"); @@ -206,6 +207,7 @@ mod test { &bundle_state, &state_provider, B256::ZERO, + None, )) .expect("Unzen block should assemble"); diff --git a/crates/block/src/config.rs b/crates/block/src/config.rs index 3ced3c7e..a9263319 100644 --- a/crates/block/src/config.rs +++ b/crates/block/src/config.rs @@ -83,14 +83,12 @@ pub struct TaikoEvmConfig { pub executor_factory: TaikoBlockExecutorFactory, /// Block assembler used to construct finalized block objects. pub block_assembler: TaikoBlockAssembler, - /// EVM factory used to instantiate Taiko EVM instances. - pub evm_factory: TaikoEvmFactory, } impl TaikoEvmConfig { /// Creates a new Taiko EVM configuration with the given chain spec and extra context. pub fn new(chain_spec: Arc) -> Self { - Self::new_with_evm_factory(chain_spec, TaikoEvmFactory) + Self::new_with_evm_factory(chain_spec, TaikoEvmFactory::default()) } /// Creates a new Taiko EVM configuration with the given chain spec and EVM factory. @@ -105,7 +103,6 @@ impl TaikoEvmConfig { chain_spec, evm_factory, ), - evm_factory, } } @@ -113,6 +110,11 @@ impl TaikoEvmConfig { pub const fn chain_spec(&self) -> &Arc { self.executor_factory.spec() } + + /// Returns the EVM factory backing this configuration. + pub const fn evm_factory(&self) -> &TaikoEvmFactory { + self.executor_factory.evm_factory() + } } /// Returns the zero blob-gas environment used for Cancun-or-later RPC execution. @@ -159,6 +161,26 @@ impl ConfigureEvm for TaikoEvmConfig { &self.block_assembler } + /// Returns a config whose EVM factory selects (or deselects) the shared JIT backend for + /// subsequently created EVMs. + /// + /// This is the local-support gate of the JIT model: reth's engine tree and the Taiko + /// payload builder opt in explicitly, while RPC execution keeps the base config and stays + /// interpreter-only. Unzen (zk-gas) execution remains interpreter-only regardless via the + /// fork allowlist in [`TaikoEvmFactory`]. + #[cfg(feature = "jit")] + fn with_jit_support_enabled(self, enabled: bool) -> Self { + let evm_factory = self.evm_factory().clone().with_jit_support_enabled(enabled); + Self::new_with_evm_factory(self.chain_spec().clone(), evm_factory) + } + + /// Returns runtime controls for the shared revmc backend, enabling the upstream `reth_jit` + /// RPC action against this configuration. + #[cfg(feature = "jit")] + fn jit_backend(&self) -> Option<&dyn reth_evm::JitBackend> { + Some(self.evm_factory()) + } + /// Creates a new [`EvmEnv`] for the given header. fn evm_env(&self, header: &Header) -> Result, Self::Error> { let spec = taiko_revm_spec(&self.chain_spec().inner, header); @@ -424,7 +446,13 @@ where #[cfg(feature = "net")] impl BuildPendingEnv
for TaikoNextBlockEnvAttributes { /// Builds a [`ConfigureEvm::NextBlockEnvCtx`] for pending block. - fn build_pending_env(parent: &SealedHeader
) -> Self { + /// + /// Block overrides are ignored: the only override the upstream implementation consults is + /// the beacon root, and Taiko's next-block attributes carry no parent beacon block root. + fn build_pending_env( + parent: &SealedHeader
, + _block_overrides: Option<&alloy_rpc_types_eth::BlockOverrides>, + ) -> Self { Self { timestamp: parent.timestamp.saturating_add(12), suggested_fee_recipient: parent.beneficiary, @@ -443,6 +471,123 @@ mod tests { use alloy_hardforks::ForkCondition; use std::sync::Arc; + #[cfg(feature = "jit")] + #[test] + fn jit_support_is_opt_in_per_config() { + let config = TaikoEvmConfig::new(TAIKO_DEVNET.clone()); + + // The base config — handed to RPC execution — never selects the shared backend. + assert!(!config.evm_factory().jit_support_enabled()); + + // The engine tree and the payload builder opt in through the `ConfigureEvm` hook. + let engine_config = config.clone().with_jit_support(); + assert!(engine_config.evm_factory().jit_support_enabled()); + assert!(Arc::ptr_eq(config.chain_spec(), engine_config.chain_spec())); + + // Opting out again restores the interpreter-only selection. + let rpc_config = engine_config.with_jit_support_enabled(false); + assert!(!rpc_config.evm_factory().jit_support_enabled()); + } + + #[cfg(feature = "jit")] + #[test] + fn base_config_is_interpreter_only_while_jit_enabled_config_uses_backend() { + use alethia_reth_evm::{ + factory::TaikoEvmFactory, + jit::{JitBackend, JitMode, RuntimeConfig}, + }; + use alloy_evm::Evm as _; + use reth_revm::{ + context::TxEnv, + db::InMemoryDB, + primitives::TxKind, + state::{AccountInfo, Bytecode}, + }; + use revm_database_interface::{ + BENCH_CALLER, BENCH_CALLER_BALANCE, BENCH_TARGET, BENCH_TARGET_BALANCE, + }; + + fn contract_db() -> InMemoryDB { + // PUSH1 1 PUSH1 2 ADD STOP — minimal arithmetic contract. + let bytecode = Bytecode::new_raw([0x60, 0x01, 0x60, 0x02, 0x01, 0x00].into()); + let mut db = InMemoryDB::default(); + db.insert_account_info( + BENCH_TARGET, + AccountInfo { + nonce: 1, + balance: BENCH_TARGET_BALANCE, + code_hash: bytecode.hash_slow(), + code: Some(bytecode), + ..Default::default() + }, + ); + db.insert_account_info( + BENCH_CALLER, + AccountInfo { nonce: 0, balance: BENCH_CALLER_BALANCE, ..Default::default() }, + ); + db + } + + fn call_tx() -> TxEnv { + TxEnv::builder() + .caller(BENCH_CALLER) + .kind(TxKind::Call(BENCH_TARGET)) + // Skip the chain-id check instead of mirroring the devnet chain id. + .chain_id(None) + .gas_limit(100_000) + .build() + .unwrap() + } + + // Pre-Unzen chain state so the factory's fork allowlist permits JIT dispatch. + let mut chain_spec = (*TAIKO_DEVNET).as_ref().clone(); + chain_spec.inner.hardforks.insert(TaikoHardfork::Shasta, ForkCondition::Timestamp(0)); + chain_spec.inner.hardforks.insert(TaikoHardfork::Unzen, ForkCondition::Timestamp(u64::MAX)); + + let backend = JitBackend::new(RuntimeConfig { + enabled: true, + blocking: true, + jit_mode: JitMode::InProcess, + ..RuntimeConfig::default() + }) + .expect("blocking JIT backend should start"); + let config = TaikoEvmConfig::new_with_evm_factory( + Arc::new(chain_spec), + TaikoEvmFactory::new(backend.clone()), + ); + let header = Header { + number: 1, + timestamp: 1, + gas_limit: 30_000_000, + base_fee_per_gas: Some(0), + ..Header::default() + }; + + // RPC call/estimate/simulate and pending-block execution receive the base config, which + // must never consult the shared backend. + let env = config.evm_env(&header).expect("pre-Unzen RPC env should build"); + let mut rpc_evm = config.evm_with_env(contract_db(), env); + rpc_evm.transact(call_tx()).expect("RPC-style execution should succeed"); + let rpc_stats = backend.stats(); + assert_eq!( + (rpc_stats.lookup_hits, rpc_stats.lookup_misses, rpc_stats.compilations_succeeded), + (0, 0, 0), + "base-config EVM construction must stay interpreter-only", + ); + + // Engine-tree canonical execution and payload building opt in via `with_jit_support`, + // so their executions dispatch to the shared backend. + let engine_config = config.with_jit_support(); + let env = engine_config.evm_env(&header).expect("pre-Unzen Engine env should build"); + let mut engine_evm = engine_config.evm_with_env(contract_db(), env); + engine_evm.transact(call_tx()).expect("Engine-style execution should succeed"); + let engine_stats = backend.stats(); + assert!( + engine_stats.compilations_succeeded >= 1 && engine_stats.lookup_hits >= 1, + "Engine execution should dispatch to the shared JIT backend: {engine_stats:?}", + ); + } + #[test] fn unzen_takes_precedence_over_shasta() { let mut chain_spec = (*TAIKO_DEVNET).as_ref().clone(); @@ -530,6 +675,8 @@ mod tests { withdrawals_hash: None, header_difficulty, taiko_block: Some(true), + block_access_list: None, + slot_number: None, }, } } diff --git a/crates/block/src/derived_block.rs b/crates/block/src/derived_block.rs index 7ebdbb14..1578d3c4 100644 --- a/crates/block/src/derived_block.rs +++ b/crates/block/src/derived_block.rs @@ -129,6 +129,7 @@ pub fn assemble_filtered_block( &bundle_state, &state_provider, state_root, + None, ))?; Ok(RecoveredBlock::new_unhashed(block, senders)) diff --git a/crates/block/src/executor.rs b/crates/block/src/executor.rs index 03aa7e49..552ce98e 100644 --- a/crates/block/src/executor.rs +++ b/crates/block/src/executor.rs @@ -10,10 +10,10 @@ use alloy_evm::{ }; use alloy_primitives::{Address, Bytes, Log, U256, Uint}; use reth_evm::{ - Evm, OnStateHook, + Evm, block::{ BlockExecutionError, BlockExecutor, BlockValidationError, CommitChanges, ExecutableTx, - InternalBlockExecutionError, StateChangeSource, StateDB, SystemCaller, + InternalBlockExecutionError, StateDB, SystemCaller, }, eth::receipt_builder::ReceiptBuilderCtx, }; @@ -179,21 +179,24 @@ where } /// Commits the current transaction's zk gas and publishes the updated block total. - fn commit_current_transaction_zk_gas(&mut self) -> Result<(), BlockExecutionError> + /// + /// # Panics + /// + /// If committing would exceed the block zk gas budget. [`BlockExecutor::commit_transaction`] + /// is infallible in alloy-evm 0.37, so `execute_transaction_without_commit` pre-checks the + /// budget while the failure can still be reported; reaching the exceeded branch here means + /// the executor was driven with a result that skipped that check. + fn commit_current_transaction_zk_gas(&mut self) where Evm: TaikoZkGasEvm, { match self.evm.commit_transaction_zk_gas() { - Ok(Some(zk_gas)) => { - self.ctx.set_finalized_block_zk_gas(zk_gas); - Ok(()) - } - Ok(None) => Ok(()), - Err(ZkGasOutcome::LimitExceeded) => { - self.zk_gas_exhausted = true; - self.reset_current_transaction_zk_gas(); - Err(Self::zk_gas_limit_error()) - } + Ok(Some(zk_gas)) => self.ctx.set_finalized_block_zk_gas(zk_gas), + Ok(None) => {} + Err(ZkGasOutcome::LimitExceeded) => unreachable!( + "zk gas commit exceeded the block budget; \ + execute_transaction_without_commit must pre-check the budget" + ), } } @@ -222,6 +225,7 @@ where Transaction: Transaction + Encodable2718 + Clone, Receipt: TxReceipt, >, + ::TxType: Send + 'static, { /// Executes a prover candidate block and returns the transactions that were actually committed. pub fn execute_block_with_committed_transactions<'tx>( @@ -269,6 +273,7 @@ where > + TaikoZkGasEvm, Spec: TaikoExecutorSpec + Clone, R: ReceiptBuilder>, + ::TxType: Send + 'static, { /// Executes `tx` and returns `Ok(true)` if it committed, `Ok(false)` if it was filtered as a /// recoverable non-anchor failure, or `Err` for fatal / anchor errors. @@ -297,6 +302,7 @@ where > + TaikoZkGasEvm, Spec: TaikoExecutorSpec + Clone, R: ReceiptBuilder>, + ::TxType: Send + 'static, { /// Input transaction type. type Transaction = R::Transaction; @@ -365,7 +371,7 @@ where return Ok(None); } - self.commit_transaction(output).map(Some) + Ok(Some(self.commit_transaction(output))) } /// Executes a transaction and returns the resulting state diff without persisting it; the @@ -419,6 +425,15 @@ where } }; + // The trait's `commit_transaction` is infallible in alloy-evm 0.37, so the block zk gas + // budget must be checked here, where truncation can still be reported. The in-flight + // total is final at this point — nothing meters between execution and commit. + if self.evm.transaction_zk_gas_commit_would_exceed() { + self.zk_gas_exhausted = true; + self.reset_current_transaction_zk_gas(); + return Err(Self::zk_gas_limit_error()); + } + Ok(EthTxResult { result, blob_gas_used: tx.tx().blob_gas_used().unwrap_or_default(), @@ -428,16 +443,19 @@ where /// Commits a previously executed transaction: updates receipts, gas accounting, and writes the /// buffered state changes to the database. - fn commit_transaction( - &mut self, - output: Self::Result, - ) -> Result { + /// + /// `output` must be a result produced by `execute_transaction_without_commit` on this + /// executor: that is the only place the block zk gas budget is pre-checked while truncation + /// can still be reported (committing is infallible), and + /// `commit_current_transaction_zk_gas` panics on a result that skipped the check. + /// + /// State hooks fire from the `State` database on commit (reth v2.4.0 moved hook delivery off + /// the block executor), so no explicit hook call is needed here. + fn commit_transaction(&mut self, output: Self::Result) -> GasOutput { let EthTxResult { result: ResultAndState { result, state }, tx_type, .. } = output; - self.system_caller.on_state(StateChangeSource::Transaction(self.receipts.len()), &state); - let gas_used = result.tx_gas_used(); - self.commit_current_transaction_zk_gas()?; + self.commit_current_transaction_zk_gas(); // append gas used self.gas_used += gas_used; @@ -454,7 +472,7 @@ where // Commit the state changes. self.evm.db_mut().commit(state); - Ok(GasOutput::new(gas_used)) + GasOutput::new(gas_used) } /// Applies any necessary changes after executing the block's transactions, completes execution @@ -473,11 +491,6 @@ where )) } - /// Sets a hook to be called after each state change during execution. - fn set_state_hook(&mut self, hook: Option>) { - self.system_caller.with_state_hook(hook); - } - /// Exposes mutable reference to EVM. fn evm_mut(&mut self) -> &mut Self::Evm { &mut self.evm @@ -608,7 +621,7 @@ mod test { .with_database(db_with_contracts(&[(BENCH_CALLER, 0)])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); assert_eq!(evm.block_zk_gas_used(), Some(0)); let ctx = unzen_execution_ctx(); let mut executor = TaikoBlockExecutor::new( @@ -647,7 +660,7 @@ mod test { .with_database(db_with_contracts(&[(BENCH_CALLER, 0)])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let ctx = unzen_execution_ctx(); let mut executor = TaikoBlockExecutor::new(evm, ctx.clone(), chain_spec, RethReceiptBuilder::default()); @@ -671,7 +684,7 @@ mod test { .with_database(db_with_contracts(&[(BENCH_CALLER, 0)])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let ctx = unzen_execution_ctx(); let executor = TaikoBlockExecutor::new(evm, ctx.clone(), chain_spec, RethReceiptBuilder::default()); @@ -695,7 +708,7 @@ mod test { .with_database(db_with_contracts(&[(BENCH_CALLER, 0)])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let mut ctx = unzen_execution_ctx(); ctx.expected_difficulty = Some(U256::ZERO); let mut executor = @@ -759,7 +772,7 @@ mod test { }, ) .expect("next block env should build"); - let evm = config.evm_factory.create_evm(db, evm_env); + let evm = config.evm_factory().create_evm(db, evm_env); TaikoBlockExecutor::new( evm, diff --git a/crates/block/src/factory.rs b/crates/block/src/factory.rs index ca313ca5..b5189d57 100644 --- a/crates/block/src/factory.rs +++ b/crates/block/src/factory.rs @@ -6,11 +6,11 @@ use std::{ }, }; -use alloy_consensus::Header; +use alloy_consensus::{Header, TransactionEnvelope}; use alloy_evm::{ EvmFactory, - block::{BlockExecutorFactory, BlockExecutorFor, StateDB}, - eth::receipt_builder::ReceiptBuilder, + block::{BlockExecutorFactory, StateDB}, + eth::{EthTxResult, receipt_builder::ReceiptBuilder}, }; use alloy_primitives::{B256, Bytes, U256}; use alloy_rpc_types_eth::Withdrawals; @@ -116,6 +116,19 @@ where type Transaction = ::Transaction; /// Receipt type produced by the executor. type Receipt = ::Receipt; + /// Result produced by executors for each transaction. + type TxExecutionResult = EthTxResult< + ::HaltReason, + <::Transaction as TransactionEnvelope>::TxType, + >; + /// Executor type created by this factory. + type Executor<'a, DB: StateDB, I: Inspector<::Context>> = + TaikoBlockExecutor< + 'a, + ::Evm, + Spec, + &'a RethReceiptBuilder, + >; /// Reference to EVM factory used by the executor. fn evm_factory(&self) -> &Self::EvmFactory { @@ -127,10 +140,10 @@ where &'a self, evm: ::Evm, ctx: Self::ExecutionCtx<'a>, - ) -> impl BlockExecutorFor<'a, Self, DB, I> + ) -> Self::Executor<'a, DB, I> where - DB: StateDB + 'a, - I: Inspector<::Context> + 'a, + DB: StateDB, + I: Inspector<::Context>, { TaikoBlockExecutor::new(evm, ctx, self.spec.clone(), &self.receipt_builder) } @@ -146,7 +159,7 @@ mod tests { fn test_taiko_block_executor_factory_creation() { let receipt_builder = RethReceiptBuilder::default(); let spec = Arc::new(TaikoChainSpec::default()); - let evm_factory = TaikoEvmFactory; + let evm_factory = TaikoEvmFactory::default(); TaikoBlockExecutorFactory::new(receipt_builder, spec.clone(), evm_factory); } diff --git a/crates/block/src/testutil.rs b/crates/block/src/testutil.rs index 1ca6beb0..507a0961 100644 --- a/crates/block/src/testutil.rs +++ b/crates/block/src/testutil.rs @@ -184,9 +184,9 @@ where &mut self, tx: impl ExecutorTx, f: impl FnOnce(&::Result) -> reth_evm::block::CommitChanges, - ) -> Result, BlockExecutionError> { + ) -> Result, BlockExecutionError> { let tx = tx.into_parts(); - Ok(self.executor.execute_transaction_with_commit_condition(tx, f)?.map(|g| g.tx_gas_used())) + self.executor.execute_transaction_with_commit_condition(tx, f) } fn finish( diff --git a/crates/block/src/tx_selection/mod.rs b/crates/block/src/tx_selection/mod.rs index 6b9a51ff..61a7135e 100644 --- a/crates/block/src/tx_selection/mod.rs +++ b/crates/block/src/tx_selection/mod.rs @@ -146,7 +146,7 @@ where // 2. Filter by locals (if configured) if !config.locals.is_empty() && !config.locals.contains(&pool_tx.sender()) { // Mark as underpriced to skip this transaction and its dependents - best_txs.mark_invalid(&pool_tx, &InvalidPoolTransactionError::Underpriced); + best_txs.mark_invalid(&pool_tx, InvalidPoolTransactionError::Underpriced); continue; } @@ -154,7 +154,7 @@ where let tip = pool_tx.effective_tip_per_gas(config.base_fee); if tip.is_none_or(|t| t < config.min_tip as u128) { trace!(target: "tx_selection", ?pool_tx, "skipping transaction with insufficient tip"); - best_txs.mark_invalid(&pool_tx, &InvalidPoolTransactionError::Underpriced); + best_txs.mark_invalid(&pool_tx, InvalidPoolTransactionError::Underpriced); continue; } @@ -163,9 +163,7 @@ where if !is_allowed_tx_type(tx.inner()) { best_txs.mark_invalid( &pool_tx, - &InvalidPoolTransactionError::Consensus( - InvalidTransactionError::TxTypeNotSupported, - ), + InvalidPoolTransactionError::Consensus(InvalidTransactionError::TxTypeNotSupported), ); continue; } @@ -175,7 +173,7 @@ where if pool_tx.gas_limit() > config.gas_limit_per_list { best_txs.mark_invalid( &pool_tx, - &InvalidPoolTransactionError::ExceedsGasLimit( + InvalidPoolTransactionError::ExceedsGasLimit( pool_tx.gas_limit(), config.gas_limit_per_list, ), @@ -183,7 +181,7 @@ where continue; } if da_size > config.max_da_bytes_per_list { - best_txs.mark_invalid(&pool_tx, &da_limit_error(da_size, config.max_da_bytes_per_list)); + best_txs.mark_invalid(&pool_tx, da_limit_error(da_size, config.max_da_bytes_per_list)); continue; } @@ -203,7 +201,7 @@ where if lists.len() >= config.max_lists { let err = limit_exceeded_error(pool_tx.gas_limit(), exceeds_gas, exceeds_da, config); - best_txs.mark_invalid(&pool_tx, &err); + best_txs.mark_invalid(&pool_tx, err); continue; } // Start a new list @@ -225,14 +223,14 @@ where if exceeds_gas || exceeds_da.is_some() { let err = limit_exceeded_error(pool_tx.gas_limit(), exceeds_gas, exceeds_da, config); - best_txs.mark_invalid(&pool_tx, &err); + best_txs.mark_invalid(&pool_tx, err); continue; } } // 7. Execute transaction let gas_used = match builder.execute_transaction(tx.clone()) { - Ok(gas_used) => gas_used, + Ok(gas_output) => gas_output.tx_gas_used(), Err(err) if is_zk_gas_limit_exceeded(&err) => { trace!(target: "tx_selection", ?tx, "stopping selection after zk gas exhaustion"); break; @@ -249,7 +247,7 @@ where trace!(target: "tx_selection", %error, ?tx, "skipping invalid transaction and its descendants"); best_txs.mark_invalid( &pool_tx, - &InvalidPoolTransactionError::Consensus( + InvalidPoolTransactionError::Consensus( InvalidTransactionError::TxTypeNotSupported, ), ); @@ -303,7 +301,7 @@ mod tests { let chain_spec = Arc::new(unzen_chain_spec()); let mut state = State::builder().with_database(db_with_contracts(&[])).with_bundle_update().build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let executor = TaikoBlockExecutor::new( evm, unzen_execution_ctx(), @@ -348,7 +346,7 @@ mod tests { ])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let executor = TaikoBlockExecutor::new( evm, unzen_execution_ctx(), diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index 3eb692c2..e6909db2 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -120,6 +120,7 @@ where era, static_files, storage, + jit, } = *self.0; // set up node config @@ -141,6 +142,7 @@ where era, static_files, storage, + jit, }; // Apply Taiko-specific devnet Unzen timestamp override if specified. diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 905a24bb..c27044a5 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -4,10 +4,12 @@ use std::{fmt, path::PathBuf, sync::Arc, time::Duration}; use alloy_consensus::Header; -use clap::Parser; +use clap::{CommandFactory, FromArgMatches}; use reth::{ CliRunner, + args::DatadirArgs, cli::{Cli, Commands}, + dirs::{DataDirPath, MaybePlatformPath}, prometheus_exporter::install_prometheus_recorder, }; use reth_cli::chainspec::ChainSpecParser; @@ -16,14 +18,14 @@ use reth_db::DatabaseEnv; use reth_ethereum_forks::Hardforks; use reth_node_api::{NodePrimitives, NodeTypes}; use reth_node_builder::{NodeBuilder, WithLaunchContext}; -use reth_tracing::FileWorkerGuard; +use reth_tracing::TracingGuards; use tracing::info; use alethia_reth_block::config::TaikoEvmConfig; use alethia_reth_chainspec::spec::TaikoChainSpec; use alethia_reth_node::{ TaikoNode, - components::ProviderTaikoBlockReader, + components::{ProviderTaikoBlockReader, evm_config_from_jit_args}, consensus::validation::TaikoBeaconConsensus, proof_history::{ DEFAULT_PROOF_HISTORY_MAX_STARTUP_PRUNE_BLOCKS, @@ -134,6 +136,8 @@ pub struct TaikoCli< > { /// Wrapped `reth` CLI structure containing parsed commands and global options. pub inner: Cli, + /// Parsed data directory for the re-execute command, retained for JIT debug dump placement. + reexecute_datadir: Option>, } impl TaikoCli @@ -143,7 +147,7 @@ where { /// Parsers only the default CLI arguments pub fn parse_args() -> Self { - Self { inner: Cli::::parse() } + Self::try_parse_args_from(std::env::args_os()).unwrap_or_else(|err| err.exit()) } /// Parsers only the default CLI arguments from the given iterator @@ -152,7 +156,14 @@ where I: IntoIterator, T: Into + Clone, { - Cli::::try_parse_from(itr).map(|inner| Self { inner }) + let mut matches = Cli::::command().try_get_matches_from(itr)?; + let reexecute_datadir = matches + .subcommand_matches("re-execute") + .and_then(|matches| matches.get_one::>("datadir")) + .cloned(); + let inner = Cli::::from_arg_matches_mut(&mut matches)?; + + Ok(Self { inner, reexecute_datadir }) } } @@ -161,6 +172,24 @@ impl< Ext: clap::Args + fmt::Debug + TaikoNodeExtArgs, > TaikoCli { + /// Returns the JIT compiler dump directory requested by the re-execute command. + fn reexecute_jit_dump_dir(&self) -> Option { + let Commands::ReExecute(command) = &self.inner.command else { + return None; + }; + if !command.jit.debug { + return None; + } + + let chain = command.chain_spec()?.inner.chain; + let datadir = DatadirArgs { + datadir: self.reexecute_datadir.clone().unwrap_or_default(), + ..Default::default() + } + .resolve_datadir(chain); + Some(datadir.data_dir().join("jit")) + } + /// Execute the configured cli command. /// /// This accepts a closure that is used to launch the node via the @@ -211,6 +240,7 @@ impl< // Install the prometheus recorder to be sure to record all metrics let _ = install_prometheus_recorder(); let rt = runner.runtime(); + let reexecute_jit_dump_dir = self.reexecute_jit_dump_dir(); let components = |spec: Arc| { let evm = TaikoEvmConfig::new(spec.clone()); @@ -258,6 +288,26 @@ impl< runner.run_command_until_exit(|ctx| command.execute::(ctx)) } Commands::ReExecute(command) => { + // reth's re-execute never consumes its own `--jit` args (v2.4.0), and the + // components closure it accepts cannot see them, so the JIT-aware EVM config + // must be built here. Mirrors the node's executor builder, including the hard + // error when `--jit` is requested on a non-jit build. + let chain_spec = command + .chain_spec() + .cloned() + .ok_or_else(|| eyre::eyre!("re-execute requires a chain spec"))?; + let evm = + evm_config_from_jit_args(chain_spec, &command.jit, reexecute_jit_dump_dir)?; + let components = move |spec: Arc| { + let block_reader = Arc::new(ProviderTaikoBlockReader(NoopProvider::< + TaikoChainSpec, + EthPrimitives, + >::new( + spec.clone() + ))); + let consensus = Arc::new(TaikoBeaconConsensus::new(spec, block_reader)); + (evm.clone(), consensus) + }; runner.run_until_ctrl_c(command.execute::(components, rt)) } } @@ -265,9 +315,9 @@ impl< /// Initializes tracing with the configured options. /// - /// If file logging is enabled, this function returns a guard that must be kept alive to ensure + /// If file logging is enabled, the returned [`TracingGuards`] must be kept alive to ensure /// that all logs are flushed to disk. - pub fn init_tracing(&self) -> eyre::Result> { + pub fn init_tracing(&self) -> eyre::Result { let guard = self.inner.logs.init_tracing()?; Ok(guard) } @@ -285,7 +335,8 @@ mod tests { use super::{ DEFAULT_PROOF_HISTORY_MAX_STARTUP_PRUNE_BLOCKS, - DEFAULT_PROOF_HISTORY_VERIFICATION_INTERVAL, DEFAULT_PROOF_HISTORY_WINDOW, TaikoCliExtArgs, + DEFAULT_PROOF_HISTORY_VERIFICATION_INTERVAL, DEFAULT_PROOF_HISTORY_WINDOW, + TaikoChainSpecParser, TaikoCli, TaikoCliExtArgs, }; use crate::command::TaikoNodeExtArgs; @@ -319,6 +370,21 @@ mod tests { assert_eq!(cli.ext.devnet_unzen_timestamp, 0); } + #[test] + fn test_reexecute_jit_debug_resolves_dump_dir_from_datadir() { + let cli = TaikoCli::::try_parse_args_from([ + "alethia-reth", + "re-execute", + "--datadir", + "/tmp/alethia-reth", + "--jit", + "--jit.debug", + ]) + .expect("re-execute JIT arguments should parse"); + + assert_eq!(cli.reexecute_jit_dump_dir(), Some(PathBuf::from("/tmp/alethia-reth/jit"))); + } + #[test] fn test_parse_devnet_unzen_timestamp_from_env() { let _lock = env_lock(); diff --git a/crates/consensus/src/validation/anchor.rs b/crates/consensus/src/validation/anchor.rs index bfb53dc3..4fef8d68 100644 --- a/crates/consensus/src/validation/anchor.rs +++ b/crates/consensus/src/validation/anchor.rs @@ -42,7 +42,7 @@ pub fn validate_anchor_transaction( // Ensure the value is zero. if anchor_transaction.value() != U256::ZERO { - return Err(ConsensusError::Other("Anchor transaction value must be zero".into())); + return Err(ConsensusError::msg("Anchor transaction value must be zero")); } // Ensure the gas limit is correct. @@ -52,30 +52,29 @@ pub fn validate_anchor_transaction( ANCHOR_V1_V2_GAS_LIMIT }; if anchor_transaction.gas_limit() != gas_limit { - return Err(ConsensusError::Other(format!( + return Err(ConsensusError::msg(format!( "Anchor transaction gas limit must be {gas_limit}, got {}", anchor_transaction.gas_limit() ))); } // Ensure the tip is equal to zero. - let anchor_transaction_tip = - anchor_transaction.effective_tip_per_gas(ctx.base_fee_per_gas).ok_or_else(|| { - ConsensusError::Other("Anchor transaction tip must be set to zero".into()) - })?; + let anchor_transaction_tip = anchor_transaction + .effective_tip_per_gas(ctx.base_fee_per_gas) + .ok_or_else(|| ConsensusError::msg("Anchor transaction tip must be set to zero"))?; if anchor_transaction_tip != 0 { - return Err(ConsensusError::Other(format!( + return Err(ConsensusError::msg(format!( "Anchor transaction tip must be zero, got {anchor_transaction_tip}" ))); } // Ensure the sender is the treasury address. let sender = anchor_transaction.try_recover().map_err(|err| { - ConsensusError::Other(format!("Anchor transaction sender must be recoverable: {err}")) + ConsensusError::msg(format!("Anchor transaction sender must be recoverable: {err}")) })?; if sender != Address::from(TAIKO_GOLDEN_TOUCH_ADDRESS) { - return Err(ConsensusError::Other(format!( + return Err(ConsensusError::msg(format!( "Anchor transaction sender must be the treasury address, got {sender}" ))); } @@ -102,9 +101,10 @@ where AnchorValidationContext { timestamp: block.header().timestamp(), block_number: block.number(), - base_fee_per_gas: block.header().base_fee_per_gas().ok_or_else(|| { - ConsensusError::Other("Block base fee per gas must be set".into()) - })?, + base_fee_per_gas: block + .header() + .base_fee_per_gas() + .ok_or_else(|| ConsensusError::msg("Block base fee per gas must be set"))?, }, ) } @@ -115,7 +115,7 @@ pub(super) fn validate_input_selector( expected_selector: &[u8; 4], ) -> Result<(), ConsensusError> { if !input.starts_with(expected_selector) { - return Err(ConsensusError::Other(format!( + return Err(ConsensusError::msg(format!( "Anchor transaction input data does not match the expected selector: {expected_selector:?}" ))); } diff --git a/crates/consensus/src/validation/mod.rs b/crates/consensus/src/validation/mod.rs index 97f20a6f..804f432e 100644 --- a/crates/consensus/src/validation/mod.rs +++ b/crates/consensus/src/validation/mod.rs @@ -4,6 +4,7 @@ use std::{fmt::Debug, sync::Arc}; use alloy_consensus::{ BlockHeader as AlloyBlockHeader, EMPTY_OMMER_ROOT_HASH, constants::MAXIMUM_EXTRA_DATA_SIZE, }; +use alloy_hardforks::EthereumHardforks; use alloy_primitives::B256; use reth_consensus::{Consensus, ConsensusError, FullConsensus, HeaderValidator, ReceiptRootBloom}; use reth_consensus_common::validation::{ @@ -73,8 +74,15 @@ where block: &RecoveredBlock, result: &BlockExecutionResult, receipt_root_bloom: Option, + block_access_list_hash: Option, ) -> Result<(), ConsensusError> { - validate_block_post_execution(block, &self.chain_spec, result, receipt_root_bloom)?; + validate_block_post_execution( + block, + &self.chain_spec, + result, + receipt_root_bloom, + block_access_list_hash, + )?; validate_zk_gas_post_execution(block, self.chain_spec.as_ref(), &result.receipts)?; validate_anchor_transaction_in_block::<::Block>( block, @@ -160,12 +168,34 @@ where if self.chain_spec.is_shasta_active(header.timestamp()) && header.extra_data().len() != SHASTA_EXTRA_DATA_LEN { - return Err(ConsensusError::Other(format!( + return Err(ConsensusError::msg(format!( "invalid Shasta extra-data length: have {}, want {SHASTA_EXTRA_DATA_LEN}", header.extra_data().len() ))); } + // Taiko schedules no Amsterdam fork — Unzen, the latest fork, activates Osaka-level + // execution rules only — so nothing in this client builds or verifies EIP-7928 block + // access lists, and reth's post-execution validation skips the access-list comparison + // whenever the executor supplies no computed hash (always, here). Import is otherwise + // fail-open where payload building already fails closed (`ensure_amsterdam_inactive`), + // so reject the fork at the chokepoint every import path routes through: the engine + // `newPayload` flow and staged sync both call `validate_header`. + if self.chain_spec.is_amsterdam_active_at_timestamp(header.timestamp()) { + return Err(ConsensusError::msg( + "cannot validate a Taiko header with the Amsterdam fork active: EIP-7928 block access lists are unsupported", + )); + } + + // Upstream `EthBeaconConsensus` parity: pre-Amsterdam headers must not carry the + // EIP-7928 header fields. + if header.block_access_list_hash().is_some() { + return Err(ConsensusError::BlockAccessListHashUnexpected); + } + if header.slot_number().is_some() { + return Err(ConsensusError::SlotNumberUnexpected); + } + validate_header_gas(header)?; validate_header_base_fee(header, &self.chain_spec) } @@ -259,7 +289,7 @@ where return Ok(()); } - Err(ConsensusError::Other(format!( + Err(ConsensusError::msg(format!( "Unzen block body extends past zk gas truncation point: body has {body_transaction_count} transactions but execution committed {committed_receipt_count}" ))) } @@ -307,7 +337,7 @@ fn validate_no_blob_transactions( transactions: &[Tx], ) -> Result<(), ConsensusError> { if transactions.iter().any(|tx| !is_allowed_tx_type(tx)) { - return Err(ConsensusError::Other("Blob transactions are not allowed".into())); + return Err(ConsensusError::msg("Blob transactions are not allowed")); } Ok(()) } diff --git a/crates/consensus/src/validation/tests.rs b/crates/consensus/src/validation/tests.rs index 69d55b4a..bdba0c62 100644 --- a/crates/consensus/src/validation/tests.rs +++ b/crates/consensus/src/validation/tests.rs @@ -2,13 +2,14 @@ use std::sync::Arc; use super::{anchor::validate_input_selector, *}; use alethia_reth_chainspec::{ - TAIKO_DEVNET, TAIKO_MAINNET, hardfork::TaikoHardfork, spec::TaikoChainSpec, + TAIKO_DEVNET, TAIKO_HOODI, TAIKO_MAINNET, TAIKO_MASAYA, hardfork::TaikoHardfork, + spec::TaikoChainSpec, }; use alloy_consensus::{ BlockBody, EMPTY_OMMER_ROOT_HASH, Header, Signed, TxEip4844, TxLegacy, constants::EMPTY_ROOT_HASH, proofs, }; -use alloy_hardforks::ForkCondition; +use alloy_hardforks::{EthereumHardfork, EthereumHardforks, ForkCondition}; use alloy_primitives::{Address, B256, Bytes, ChainId, FixedBytes, Signature, TxKind, U256}; use reth_consensus::{Consensus, ConsensusError, FullConsensus, HeaderValidator}; use reth_ethereum_primitives::{Block, EthPrimitives, Receipt, TransactionSigned}; @@ -233,6 +234,82 @@ fn pre_shasta_header_has_no_extra_data_len_rule() { .expect("pre-Shasta headers have no extraData length rule"); } +#[test] +fn amsterdam_active_header_is_rejected_at_import() { + let mut chain_spec = devnet_chain_spec(); + chain_spec.inner.hardforks.insert(EthereumHardfork::Amsterdam, ForkCondition::Timestamp(100)); + let consensus = test_consensus(chain_spec); + let base = Header { + timestamp: 99, + base_fee_per_gas: Some(1), + gas_limit: 30_000_000, + extra_data: shasta_extra_data(), + ..Default::default() + }; + + consensus + .validate_header(&SealedHeader::new_unhashed(base.clone())) + .expect("headers before the Amsterdam activation should validate"); + + let err = consensus + .validate_header(&SealedHeader::new_unhashed(Header { timestamp: 100, ..base })) + .expect_err("Amsterdam-active headers must be rejected at import"); + assert!(err.to_string().contains("Amsterdam"), "unexpected error: {err}"); +} + +#[test] +fn pre_amsterdam_header_rejects_block_access_list_hash() { + let consensus = test_consensus(devnet_chain_spec()); + let header = Header { + timestamp: 1, + base_fee_per_gas: Some(1), + gas_limit: 30_000_000, + extra_data: shasta_extra_data(), + block_access_list_hash: Some(B256::ZERO), + ..Default::default() + }; + + let err = consensus + .validate_header(&SealedHeader::new_unhashed(header)) + .expect_err("pre-Amsterdam headers must not carry a block access list hash"); + assert!(matches!(err, ConsensusError::BlockAccessListHashUnexpected)); +} + +#[test] +fn pre_amsterdam_header_rejects_slot_number() { + let consensus = test_consensus(devnet_chain_spec()); + let header = Header { + timestamp: 1, + base_fee_per_gas: Some(1), + gas_limit: 30_000_000, + extra_data: shasta_extra_data(), + slot_number: Some(1), + ..Default::default() + }; + + let err = consensus + .validate_header(&SealedHeader::new_unhashed(header)) + .expect_err("pre-Amsterdam headers must not carry a slot number"); + assert!(matches!(err, ConsensusError::SlotNumberUnexpected)); +} + +#[test] +fn shipped_taiko_specs_never_activate_amsterdam() { + // Unzen, Taiko's latest fork, activates Osaka-level execution rules only. No shipped spec + // may ever schedule Amsterdam, or `validate_header` would reject every block at import. + for (name, spec) in [ + ("mainnet", &**TAIKO_MAINNET), + ("taiko-hoodi", &**TAIKO_HOODI), + ("devnet", &**TAIKO_DEVNET), + ("masaya", &**TAIKO_MASAYA), + ] { + assert!( + !spec.is_amsterdam_active_at_timestamp(u64::MAX), + "{name} must never activate Amsterdam" + ); + } +} + #[test] fn unzen_post_execution_rejects_body_past_truncation_point() { let consensus = test_consensus(unzen_chain_spec()); @@ -254,7 +331,7 @@ fn unzen_post_execution_rejects_body_past_truncation_point() { let err = >::validate_block_post_execution( - &consensus, &recovered, &result, None, + &consensus, &recovered, &result, None, None, ) .expect_err("Unzen blocks must reject bodies that extend past the truncation point"); assert!(matches!(err, ConsensusError::Other(_))); diff --git a/crates/evm/Cargo.toml b/crates/evm/Cargo.toml index 1a70c8da..b4a67d56 100644 --- a/crates/evm/Cargo.toml +++ b/crates/evm/Cargo.toml @@ -10,6 +10,7 @@ path = "src/lib.rs" [features] default = ["std"] +jit = ["std", "dep:revmc"] serde = ["dep:serde"] std = [ "alethia-reth-chainspec/std", @@ -26,5 +27,6 @@ alloy-primitives = { workspace = true } reth-evm = { workspace = true, default-features = false } reth-revm = { workspace = true, default-features = false } revm-database-interface = { workspace = true } +revmc = { workspace = true, optional = true } serde = { workspace = true, optional = true } tracing = { workspace = true } diff --git a/crates/evm/src/alloy.rs b/crates/evm/src/alloy.rs index b594be5f..f294f5c2 100644 --- a/crates/evm/src/alloy.rs +++ b/crates/evm/src/alloy.rs @@ -6,22 +6,23 @@ use alloy_primitives::{Address, Bytes, TxKind, U256}; // Re-export from primitives so downstream consumers can use the lighter crate. pub use alethia_reth_primitives::addresses::TAIKO_GOLDEN_TOUCH_ADDRESS; use reth_revm::{ - Context, ExecuteEvm, InspectEvm, Inspector, + Context, Inspector, context::{ - BlockEnv, CfgEnv, ContextTr, JournalTr, TxEnv, + BlockEnv, CfgEnv, ContextSetters, ContextTr, JournalTr, TxEnv, result::{ EVMError, ExecutionResult, HaltReason, Output, ResultAndState, ResultGas, SuccessReason, }, }, - handler::PrecompileProvider, - interpreter::InterpreterResult, + handler::{EthFrame, Handler, PrecompileProvider}, + inspector::InspectorHandler, + interpreter::{InterpreterResult, interpreter::EthInterpreter}, state::EvmState, }; use tracing::debug; use crate::{ evm::TaikoEvm, - handler::get_treasury_address, + handler::{TaikoEvmHandler, get_treasury_address}, spec::TaikoSpecId, zk_gas::{ adapter::ZkGasInspector, @@ -32,36 +33,89 @@ use crate::{ /// Maximum transaction gas limit enforced once Osaka/Unzen semantics are active. const MAX_SYSTEM_CALL_GAS_LIMIT: u64 = 16_777_216; +/// Base Taiko EVM implementation before optional JIT dispatch is applied. +type BaseTaikoEvm = TaikoEvm, ZkGasInspector, P>; + +/// Taiko EVM implementation used by the Alloy adapter when JIT support is compiled in. +#[cfg(feature = "jit")] +type InnerTaikoEvm = revmc::revm_evm::JitEvm>; + +/// Taiko EVM implementation used by the Alloy adapter without JIT support. +#[cfg(not(feature = "jit"))] +type InnerTaikoEvm = BaseTaikoEvm; + /// A wrapper around the Taiko EVM that implements the `Evm` trait in `alloy_evm`. pub struct TaikoEvmWrapper { /// Wrapped Taiko EVM instance implementing execution behavior. - inner: TaikoEvm, ZkGasInspector, P>, + /// + /// WARNING (jit builds): revmc's `JitEvm` publicly implements `ExecuteEvm`/`InspectEvm` + /// backed by revm's `MainnetHandler`. Never call those entry points on this field — always + /// drive it with [`TaikoEvmHandler`] (see `transact_raw`), otherwise Taiko's anchor and + /// fee-share semantics are silently dropped. + inner: InnerTaikoEvm, /// Whether to run transactions through the inspector execution path. inspect: bool, } impl TaikoEvmWrapper { - /// Creates a new [`TaikoEvmWrapper`] instance. - pub const fn new( - evm: TaikoEvm, ZkGasInspector, P>, - inspect: bool, - ) -> Self { + /// Creates an interpreter-backed [`TaikoEvmWrapper`] instance. + #[cfg(feature = "jit")] + pub fn new(evm: BaseTaikoEvm, inspect: bool) -> Self + where + P: PrecompileProvider, Output = InterpreterResult>, + { + Self { inner: revmc::revm_evm::JitEvm::disabled(evm), inspect } + } + + /// Creates an interpreter-backed [`TaikoEvmWrapper`] instance. + #[cfg(not(feature = "jit"))] + pub const fn new(evm: BaseTaikoEvm, inspect: bool) -> Self { + Self { inner: evm, inspect } + } + + /// Creates a wrapper around an already configured optional JIT dispatcher. + pub(crate) fn new_with_inner(evm: InnerTaikoEvm, inspect: bool) -> Self { Self { inner: evm, inspect } } /// Consumes self and return the inner EVM instance. - pub fn into_inner(self) -> TaikoEvm, ZkGasInspector, P> { + pub fn into_inner(self) -> BaseTaikoEvm { + #[cfg(feature = "jit")] + { + self.inner.into_inner() + } + #[cfg(not(feature = "jit"))] self.inner } + /// Returns the base Taiko EVM wrapped by the optional JIT dispatcher. + fn base_evm(&self) -> &BaseTaikoEvm { + #[cfg(feature = "jit")] + { + self.inner.inner() + } + #[cfg(not(feature = "jit"))] + &self.inner + } + + /// Returns the mutable base Taiko EVM wrapped by the optional JIT dispatcher. + fn base_evm_mut(&mut self) -> &mut BaseTaikoEvm { + #[cfg(feature = "jit")] + { + self.inner.inner_mut() + } + #[cfg(not(feature = "jit"))] + &mut self.inner + } + /// Provides a reference to the EVM context. - pub const fn ctx(&self) -> &TaikoEvmContext { - &self.inner.inner.ctx + pub fn ctx(&self) -> &TaikoEvmContext { + &self.base_evm().inner.ctx } /// Provides a mutable reference to the EVM context. pub fn ctx_mut(&mut self) -> &mut TaikoEvmContext { - &mut self.inner.inner.ctx + &mut self.base_evm_mut().inner.ctx } /// Returns a reference to the active zk gas meter, if metering is enabled. @@ -69,7 +123,8 @@ impl TaikoEvmWrapper { /// Returns `None` when the active spec/chain combination has no zk gas schedule /// (pre-Unzen specs). pub fn meter(&self) -> Option<&ZkGasMeter<'static>> { - self.inner.zk_gas_meter().or_else(|| self.inner.inner.inspector.meter()) + let evm = self.base_evm(); + evm.zk_gas_meter().or_else(|| evm.inner.inspector.meter()) } /// Returns a mutable reference to the active zk gas meter, if metering is enabled. @@ -77,10 +132,10 @@ impl TaikoEvmWrapper { /// Returns `None` when the active spec/chain combination has no zk gas schedule /// (pre-Unzen specs). pub fn meter_mut(&mut self) -> Option<&mut ZkGasMeter<'static>> { - if self.inner.zk_gas_meter().is_some() { - self.inner.zk_gas_meter_mut() + if self.base_evm().zk_gas_meter().is_some() { + self.base_evm_mut().zk_gas_meter_mut() } else { - self.inner.inner.inspector.meter_mut() + self.base_evm_mut().inner.inspector.meter_mut() } } } @@ -93,6 +148,11 @@ pub trait TaikoZkGasEvm { /// Commits the current transaction's zk gas into the block total and returns the new total. fn commit_transaction_zk_gas(&mut self) -> Result, ZkGasOutcome>; + /// Returns `true` when committing the current transaction's zk gas would exceed the block + /// budget, i.e. when [`Self::commit_transaction_zk_gas`] would fail. Always `false` when no + /// meter is installed (pre-Unzen specs). + fn transaction_zk_gas_commit_would_exceed(&self) -> bool; + /// Returns the finalized block zk gas that has already been committed. fn block_zk_gas_used(&self) -> Option; @@ -124,6 +184,11 @@ where Ok(Some(meter.block_zk_gas_used())) } + /// Returns whether committing the current transaction's zk gas would exceed the budget. + fn transaction_zk_gas_commit_would_exceed(&self) -> bool { + self.meter().is_some_and(|m| m.commit_would_exceed_block_limit()) + } + /// Returns the finalized block zk gas that has already been committed. fn block_zk_gas_used(&self) -> Option { self.meter().map(|m| m.block_zk_gas_used()) @@ -207,19 +272,21 @@ where /// Provides immutable references to the database, inspector and precompiles. fn components(&self) -> (&Self::DB, &Self::Inspector, &Self::Precompiles) { + let evm = self.base_evm(); ( - &self.inner.inner.ctx.journaled_state.database, - self.inner.inner.inspector.inner(), - &self.inner.inner.precompiles, + &evm.inner.ctx.journaled_state.database, + evm.inner.inspector.inner(), + &evm.inner.precompiles, ) } /// Provides mutable references to the database, inspector and precompiles. fn components_mut(&mut self) -> (&mut Self::DB, &mut Self::Inspector, &mut Self::Precompiles) { + let evm = self.base_evm_mut(); ( - &mut self.inner.inner.ctx.journaled_state.database, - self.inner.inner.inspector.inner_mut(), - &mut self.inner.inner.precompiles, + &mut evm.inner.ctx.journaled_state.database, + evm.inner.inspector.inner_mut(), + &mut evm.inner.precompiles, ) } @@ -228,7 +295,38 @@ where &mut self, tx: Self::Tx, ) -> Result, Self::Error> { - if self.inspect { self.inner.inspect_tx(tx) } else { self.inner.transact(tx) } + self.ctx_mut().set_tx(tx); + // Run [`TaikoEvmHandler`] against the (possibly JIT-dispatching) inner EVM directly: + // revmc's own `ExecuteEvm`/`InspectEvm` entry points would run revm's `MainnetHandler` + // and silently drop Taiko's anchor and fee-share semantics. + // + // Those entry points also re-validate revmc's per-instance lookup cache against the + // active spec (`JitEvm::invalidate_cache`, private upstream). Skipping that here is + // sound only because reth constructs a fresh EVM per block environment, so the spec + // never changes within this instance's lifetime. + let mut handler = TaikoEvmHandler::<_, EVMError, EthFrame>::new( + self.base_evm().extra_execution_ctx.clone(), + ); + let result = if self.inspect { + // Trace correctness requires inspected execution to run on the disabled JIT backend: + // compiled code cannot deliver per-step inspector callbacks (revmc forwards only + // log, selfdestruct, and frame-end events). `create_evm_with_inspector` and + // `set_inspector_enabled` both pin the disabled backend; this guards the invariant + // against future refactors. + #[cfg(feature = "jit")] + debug_assert!( + !self.inner.backend().enabled(), + "inspected execution must run with the disabled JIT backend", + ); + handler.inspect_run(&mut self.inner) + } else { + handler.run(&mut self.inner) + }; + // Finalize before propagating errors, mirroring revm's `ExecuteEvm::transact`: payload + // building and derived-block execution skip invalid transactions and keep executing on + // this EVM, and an errored run must not leave the journal for the next transaction. + let state = self.ctx_mut().journal_mut().finalize(); + Ok(ResultAndState::new(result?, state)) } /// Executes a system call. @@ -256,7 +354,11 @@ where debug!(target: "taiko_evm", "Anchor system call detected: base_fee_share_pctg = {}, caller_nonce = {}", base_fee_share_pctg, caller_nonce); // Set the Anchor transaction information for the later EVM execution. - self.inner.with_extra_execution_context(base_fee_share_pctg, caller, caller_nonce); + self.base_evm_mut().with_extra_execution_context( + base_fee_share_pctg, + caller, + caller_nonce, + ); // Load both system-call participants through the journal so witness generation can // include the same pre-execution dependencies that stateless validation will read @@ -353,7 +455,8 @@ where where Self: Sized, { - let Context { block: block_env, cfg: cfg_env, journaled_state, .. } = self.inner.inner.ctx; + let Context { block: block_env, cfg: cfg_env, journaled_state, .. } = + self.into_inner().inner.ctx; (journaled_state.database, EvmEnv { block_env, cfg_env }) } @@ -365,30 +468,38 @@ where // `create_evm` installs zk-gas on the production TaikoEvm wrapper and keeps the inner // inspector unmetered. Enabling the NoOp inspector would route around that production // meter, so only EVMs built through `create_evm_with_inspector` may switch to inspect mode. - if enabled && self.inner.zk_gas_meter().is_some() { + if enabled && self.base_evm().zk_gas_meter().is_some() { return; } + // Inspected execution cannot dispatch to compiled code (no per-step inspector + // callbacks), so switching an instance to inspect mode permanently downgrades it to a + // disabled backend. EVMs built through `create_evm_with_inspector` already hold one; + // this covers EVMs built through `create_evm` on non-metered specs. + #[cfg(feature = "jit")] + if enabled { + self.inner.set_backend(crate::jit::JitBackend::disabled()); + } self.inspect = enabled; } /// Getter of precompiles. fn precompiles(&self) -> &Self::Precompiles { - &self.inner.inner.precompiles + &self.base_evm().inner.precompiles } /// Mutable getter of precompiles. fn precompiles_mut(&mut self) -> &mut Self::Precompiles { - &mut self.inner.inner.precompiles + &mut self.base_evm_mut().inner.precompiles } /// Getter of inspector. fn inspector(&self) -> &Self::Inspector { - self.inner.inner.inspector.inner() + self.base_evm().inner.inspector.inner() } /// Mutable getter of inspector. fn inspector_mut(&mut self) -> &mut Self::Inspector { - self.inner.inner.inspector.inner_mut() + self.base_evm_mut().inner.inspector.inner_mut() } } @@ -437,7 +548,7 @@ mod tests { let mut env: EvmEnv = EvmEnv::default(); env.cfg_env.chain_id = chain_id; - let mut evm = TaikoEvmFactory.create_evm(db, env); + let mut evm = TaikoEvmFactory::default().create_evm(db, env); evm.transact_system_call(golden_touch, treasury, encode_anchor_system_call_data(25, 7)) .expect("anchor system call should short-circuit successfully"); @@ -454,7 +565,7 @@ mod tests { ); let next_tx_id = journal.transaction_id; - assert_eq!(next_tx_id, 1, "synthetic pre-execution load should advance tx id"); + assert_eq!(next_tx_id.get(), 1, "synthetic pre-execution load should advance tx id"); let golden_touch_account = witness_state .get(&golden_touch) @@ -471,4 +582,34 @@ mod tests { "treasury must be cold again for the first real transaction" ); } + + #[test] + fn errored_transaction_finalizes_the_journal_for_the_next_transaction() { + // Payload building and derived-block execution skip invalid transactions and keep + // executing on the same EVM, so an errored `transact_raw` must leave the journal as + // finalized as a successful one — revm's `ExecuteEvm::transact` finalizes + // unconditionally for exactly this reason. + let broke_caller = Address::with_last_byte(0xBC); + let mut env: EvmEnv = EvmEnv::default(); + env.cfg_env.chain_id = 167_000; + let mut evm = TaikoEvmFactory::default().create_evm(InMemoryDB::default(), env); + + let tx = TxEnv::builder() + .caller(broke_caller) + .kind(TxKind::Call(Address::ZERO)) + // Send value from an unfunded account: validation loads the caller through the + // journal and only then errors, so the failed transaction has journal state to + // leak. A pre-state error (e.g. a chain-id mismatch) would not exercise this. + .value(U256::from(1)) + .gas_limit(21_000) + .chain_id(None) + .build() + .expect("valid tx env"); + evm.transact_raw(tx).expect_err("transaction from an unfunded caller must error"); + + assert!( + evm.ctx().journal().state.is_empty(), + "an errored transaction must finalize the journal before the next transaction runs" + ); + } } diff --git a/crates/evm/src/evm.rs b/crates/evm/src/evm.rs index 916b6e46..86e333f0 100644 --- a/crates/evm/src/evm.rs +++ b/crates/evm/src/evm.rs @@ -201,6 +201,7 @@ where context, &mut frame.interpreter, instructions.instruction_table(), + instructions.gas_table(), meter, ); diff --git a/crates/evm/src/execution.rs b/crates/evm/src/execution.rs index 709514cc..5dafaa0c 100644 --- a/crates/evm/src/execution.rs +++ b/crates/evm/src/execution.rs @@ -8,7 +8,7 @@ use reth_revm::{ }, }, handler::{EthFrame, Handler, PrecompileProvider}, - inspector::{InspectorHandler, JournalExt}, + inspector::{InspectorEvmTr, InspectorHandler, JournalExt}, interpreter::{InterpreterResult, interpreter::EthInterpreter}, state::EvmState, }; @@ -16,6 +16,48 @@ use revm_database_interface::Database; use crate::{evm::TaikoEvm, handler::TaikoEvmHandler}; +/// Inspected-execution plumbing required so [`TaikoEvm`] can sit inside revmc's `JitEvm` +/// dispatcher, whose `InspectorEvmTr` implementation delegates to the wrapped EVM. Inspected +/// frames themselves run revm's default inspected interpreter loop (with `ZkGasInspector` +/// hooks); only the accessors are delegated here. That default loop materializes exceptional +/// halts before `step_end`, matching the production loop's charge point (see +/// `zk_gas::runtime::run_metered_plain`). +impl InspectorEvmTr for TaikoEvm +where + CTX: ContextSetters + JournalExt>, + INSP: Inspector, + P: PrecompileProvider, +{ + /// Inspector installed on the wrapped revm engine. + type Inspector = INSP; + + /// Returns shared references to every component required by inspected execution. + fn all_inspector( + &self, + ) -> ( + &Self::Context, + &Self::Instructions, + &Self::Precompiles, + &reth_revm::context::FrameStack, + &Self::Inspector, + ) { + self.inner.all_inspector() + } + + /// Returns mutable references to every component required by inspected execution. + fn all_mut_inspector( + &mut self, + ) -> ( + &mut Self::Context, + &mut Self::Instructions, + &mut Self::Precompiles, + &mut reth_revm::context::FrameStack, + &mut Self::Inspector, + ) { + self.inner.all_mut_inspector() + } +} + // Trait that allows to replay and transact the transaction, we // use [`TaikoEvmHandler`] to handle the transactions execution, besides // that, we use the same implementation as `RevmEvm`. diff --git a/crates/evm/src/factory.rs b/crates/evm/src/factory.rs index d20e141e..3771aac2 100644 --- a/crates/evm/src/factory.rs +++ b/crates/evm/src/factory.rs @@ -3,7 +3,7 @@ use reth_evm::precompiles::PrecompilesMap; use reth_revm::{ Context, Inspector, MainBuilder, MainContext, context::{ - BlockEnv, TxEnv, + BlockEnv, DBErrorMarker, TxEnv, result::{EVMError, HaltReason}, }, inspector::NoOpInspector, @@ -18,9 +18,126 @@ use crate::{ zk_gas::{adapter::ZkGasInspector, schedule::schedule_for}, }; +#[cfg(feature = "jit")] +use crate::jit::JitBackend; + /// A factory type for creating instances of the Taiko EVM given a certain input. -#[derive(Default, Debug, Clone, Copy)] -pub struct TaikoEvmFactory; +/// +/// With the `jit` Cargo feature, the factory owns the shared revmc backend. An EVM can execute +/// JIT-compiled code only when all gates pass: the binary was built with the `jit` feature, +/// runtime compilation was enabled with `--jit` (or the `reth_jit` RPC method), the local config +/// selected JIT support via [`reth_evm::ConfigureEvm::with_jit_support`], and the active fork is +/// on the [`spec_supports_jit`] allowlist. +#[derive(Debug, Clone)] +pub struct TaikoEvmFactory { + /// Shared runtime backend used for JIT-eligible execution. + #[cfg(feature = "jit")] + backend: JitBackend, + /// Disabled backend used for zk-gas forks, inspected execution, and unsupported paths. + #[cfg(feature = "jit")] + disabled_backend: JitBackend, + /// Whether locally created EVMs may dispatch to the shared JIT backend. + #[cfg(feature = "jit")] + jit_support: bool, +} + +#[cfg(feature = "jit")] +impl TaikoEvmFactory { + /// Creates a factory backed by the supplied revmc runtime. + pub fn new(backend: JitBackend) -> Self { + Self { backend, disabled_backend: JitBackend::disabled(), jit_support: false } + } + + /// Enables or disables JIT dispatch for EVMs subsequently created by this factory. + pub const fn with_jit_support_enabled(mut self, enabled: bool) -> Self { + self.jit_support = enabled; + self + } + + /// Enables JIT dispatch for EVMs subsequently created by this factory. + pub const fn with_jit_support(self) -> Self { + self.with_jit_support_enabled(true) + } + + /// Returns whether this factory selects the shared backend for eligible execution. + pub const fn jit_support_enabled(&self) -> bool { + self.jit_support + } + + /// Returns the shared revmc backend handle. + pub const fn backend(&self) -> &JitBackend { + &self.backend + } + + /// Selects the backend for an uninspected execution at the given Taiko fork. + fn backend_for_spec(&self, spec_id: TaikoSpecId) -> JitBackend { + // `schedule_for` is re-checked as a belt-and-suspenders guard: a spec with a zk-gas + // schedule must never reach compiled code even if the allowlist says otherwise. + if self.jit_support && spec_supports_jit(spec_id) && schedule_for(spec_id).is_none() { + self.backend.clone() + } else { + self.disabled_backend.clone() + } + } +} + +impl Default for TaikoEvmFactory { + /// Creates an interpreter-only factory. + fn default() -> Self { + #[cfg(feature = "jit")] + { + Self::new(JitBackend::disabled()) + } + #[cfg(not(feature = "jit"))] + Self {} + } +} + +/// Returns whether execution under `spec_id` may dispatch to revmc-compiled code. +/// +/// Compiled programs bake in upstream mainnet gas and opcode semantics, so only forks that +/// execute with exactly those semantics are eligible. Unzen is excluded because its zk-gas +/// metering needs per-opcode interpreter hooks. +/// +/// This match is deliberately exhaustive: adding a fork variant fails compilation here so that +/// every new fork is classified explicitly. Any fork that reprices gas or changes opcode +/// behavior in any way must stay interpreter-only — compiled code would silently diverge from +/// consensus otherwise. +#[cfg(feature = "jit")] +const fn spec_supports_jit(spec_id: TaikoSpecId) -> bool { + match spec_id { + TaikoSpecId::GENESIS | TaikoSpecId::ONTAKE | TaikoSpecId::PACAYA | TaikoSpecId::SHASTA => { + true + } + TaikoSpecId::UNZEN => false, + } +} + +/// Runtime controls for the shared revmc backend, exposed through +/// [`reth_evm::ConfigureEvm::jit_backend`] so the upstream `reth_jit` RPC action works +/// against the Taiko EVM configuration. +#[cfg(feature = "jit")] +impl reth_evm::JitBackend for TaikoEvmFactory { + /// Enables or disables JIT lookups and background compilation. + fn set_enabled(&self, enabled: bool) -> Result<(), String> { + self.backend.set_enabled(enabled).map_err(|err| err.to_string()) + } + + /// Pauses out-of-process helper execution without discarding compiled code. + fn pause(&self) { + self.backend.pause(); + } + + /// Resumes background JIT promotion. + fn resume(&self) { + self.backend.resume(); + } + + /// Clears resident and persisted compiled artifacts. + fn clear(&self) { + self.backend.clear_all(); + } +} impl EvmFactory for TaikoEvmFactory { /// The EVM type that this factory creates. @@ -29,7 +146,7 @@ impl EvmFactory for TaikoEvmFactory { /// Transaction environment. type Tx = TxEnv; /// EVM error. - type Error = EVMError; + type Error = EVMError; /// Halt reason. type HaltReason = HaltReason; /// The EVM context for inspectors. @@ -58,10 +175,18 @@ impl EvmFactory for TaikoEvmFactory { PrecompileSpecId::from_spec_id(spec_id.into()), ))); - TaikoEvmWrapper::new(TaikoEvm::new(evm).with_zk_gas_schedule(schedule), false) + let evm = TaikoEvm::new(evm).with_zk_gas_schedule(schedule); + #[cfg(feature = "jit")] + let evm = revmc::revm_evm::JitEvm::new(evm, self.backend_for_spec(spec_id)); + + TaikoEvmWrapper::new_with_inner(evm, false) } /// Creates a new instance of an EVM with an inspector. + /// + /// Inspected execution always selects the disabled backend as a correctness requirement: + /// compiled code cannot deliver the per-step inspector callbacks (revmc forwards only log, + /// selfdestruct, and frame-end events) that tracers and the zk-gas inspector depend on. fn create_evm_with_inspector>>( &self, db: DB, @@ -79,6 +204,24 @@ impl EvmFactory for TaikoEvmFactory { PrecompileSpecId::from_spec_id(spec_id.into()), ))); - TaikoEvmWrapper::new(TaikoEvm::new(evm), true) + let evm = TaikoEvm::new(evm); + #[cfg(feature = "jit")] + let evm = revmc::revm_evm::JitEvm::new(evm, self.disabled_backend.clone()); + + TaikoEvmWrapper::new_with_inner(evm, true) + } +} + +#[cfg(all(test, feature = "jit"))] +mod tests { + use super::*; + + #[test] + fn jit_dispatch_is_allowlisted_to_non_zk_gas_specs() { + assert!(spec_supports_jit(TaikoSpecId::GENESIS)); + assert!(spec_supports_jit(TaikoSpecId::ONTAKE)); + assert!(spec_supports_jit(TaikoSpecId::PACAYA)); + assert!(spec_supports_jit(TaikoSpecId::SHASTA)); + assert!(!spec_supports_jit(TaikoSpecId::UNZEN)); } } diff --git a/crates/evm/src/jit.rs b/crates/evm/src/jit.rs new file mode 100644 index 00000000..c9983273 --- /dev/null +++ b/crates/evm/src/jit.rs @@ -0,0 +1,129 @@ +//! Configuration and runtime integration for revmc JIT execution. + +#[cfg(feature = "jit")] +use std::path::PathBuf; +use std::time::Duration; + +#[cfg(feature = "jit")] +use revmc::runtime::RuntimeTuning; +#[cfg(feature = "jit")] +pub use revmc::runtime::{JitBackend, JitMode, RuntimeConfig, maybe_run_jit_helper}; + +/// Runtime settings for revmc JIT compilation. +/// +/// Building with the `jit` Cargo feature makes the backend available, while [`Self::enabled`] +/// controls whether compilation starts when the node launches. Field defaults mirror reth's +/// upstream `JitArgs`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct JitConfig { + /// Enables JIT compilation when the node starts. + pub enabled: bool, + /// Number of observed misses before bytecode is promoted for compilation. + pub hot_threshold: usize, + /// Number of background compilation workers, or the revmc default when unset. + pub worker_count: Option, + /// Capacity of the non-blocking lookup-observation channel. + pub channel_capacity: usize, + /// Maximum number of compilation jobs that may be pending concurrently. + pub max_pending_jobs: usize, + /// Maximum eligible bytecode length in bytes, where zero means unlimited. + pub max_bytecode_len: usize, + /// Maximum resident compiled-code size in bytes, where zero means unlimited. + pub code_cache_bytes: usize, + /// Idle duration after which an unused compiled program may be evicted. + pub idle_evict_duration: Duration, + /// Enables compiler IR, assembly, and bytecode dumps under the node data directory. + pub debug: bool, + /// Compiles synchronously on the first miss; intended only for tests and debugging. + pub blocking: bool, +} + +impl JitConfig { + /// Default number of misses required before compiling bytecode. + pub const DEFAULT_HOT_THRESHOLD: usize = 8; + /// Default capacity of the lookup-observation channel. + pub const DEFAULT_CHANNEL_CAPACITY: usize = 4096; + /// Default maximum number of pending compilation jobs. + pub const DEFAULT_MAX_PENDING_JOBS: usize = 2048; + /// Default maximum bytecode length, where zero disables the limit. + pub const DEFAULT_MAX_BYTECODE_LEN: usize = 0; + /// Default resident compiled-code budget of one gibibyte. + pub const DEFAULT_CODE_CACHE_BYTES: usize = 1024 * 1024 * 1024; + /// Default idle eviction duration of one hour. + pub const DEFAULT_IDLE_EVICT_DURATION: Duration = Duration::from_secs(60 * 60); + + /// Creates the shared revmc backend represented by this configuration. + /// + /// Compilation runs in an out-of-process helper (see [`maybe_run_jit_helper`]) so compiler + /// resource use stays isolated from the node process. + #[cfg(feature = "jit")] + pub fn build_backend(&self, dump_dir: Option) -> revmc::eyre::Result { + // revmc sizes a `crossbeam` `ArrayQueue` from this value and panics on zero, even when + // compilation is disabled, so reject it with an error instead. + if self.channel_capacity == 0 { + revmc::eyre::bail!("JIT channel capacity must be at least 1"); + } + + let defaults = RuntimeTuning::default(); + let tuning = RuntimeTuning { + channel_capacity: self.channel_capacity, + jit_hot_threshold: self.hot_threshold, + jit_worker_count: self.worker_count.unwrap_or(defaults.jit_worker_count), + jit_max_pending_jobs: self.max_pending_jobs, + jit_max_bytecode_len: self.max_bytecode_len, + resident_code_cache_bytes: self.code_cache_bytes, + idle_evict_duration: Some(self.idle_evict_duration), + ..defaults + }; + + JitBackend::new(RuntimeConfig { + enabled: self.enabled, + tuning, + dump_dir, + debug_assertions: self.debug, + blocking: self.blocking, + jit_mode: JitMode::OutOfProcess, + ..RuntimeConfig::default() + }) + } +} + +impl Default for JitConfig { + /// Returns the safe runtime defaults with compilation disabled. + fn default() -> Self { + Self { + enabled: false, + hot_threshold: Self::DEFAULT_HOT_THRESHOLD, + worker_count: None, + channel_capacity: Self::DEFAULT_CHANNEL_CAPACITY, + max_pending_jobs: Self::DEFAULT_MAX_PENDING_JOBS, + max_bytecode_len: Self::DEFAULT_MAX_BYTECODE_LEN, + code_cache_bytes: Self::DEFAULT_CODE_CACHE_BYTES, + idle_evict_duration: Self::DEFAULT_IDLE_EVICT_DURATION, + debug: false, + blocking: false, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn defaults_keep_jit_disabled() { + let config = JitConfig::default(); + + assert!(!config.enabled); + assert_eq!(config.hot_threshold, JitConfig::DEFAULT_HOT_THRESHOLD); + assert_eq!(config.code_cache_bytes, JitConfig::DEFAULT_CODE_CACHE_BYTES); + } + + #[cfg(feature = "jit")] + #[test] + fn build_backend_rejects_zero_jit_channel_capacity() { + let config = JitConfig { channel_capacity: 0, ..JitConfig::default() }; + + assert!(config.build_backend(None).is_err()); + } +} diff --git a/crates/evm/src/lib.rs b/crates/evm/src/lib.rs index 989f5c1f..621943ce 100644 --- a/crates/evm/src/lib.rs +++ b/crates/evm/src/lib.rs @@ -12,6 +12,8 @@ pub mod execution; pub mod factory; /// Taiko-specific handler behavior for fee sharing and anchor processing. pub mod handler; +/// Configuration and runtime integration for revmc JIT execution. +pub mod jit; /// Taiko hardfork spec identifiers and conversions. pub mod spec; /// Fork-scoped zk gas schedules for Taiko consensus. diff --git a/crates/evm/src/zk_gas/adapter.rs b/crates/evm/src/zk_gas/adapter.rs index 3baf7d98..feefdb6a 100644 --- a/crates/evm/src/zk_gas/adapter.rs +++ b/crates/evm/src/zk_gas/adapter.rs @@ -6,11 +6,13 @@ //! 3. Either charge immediately, or defer charging until `call_end` / `create_end` confirms whether //! a spawn opcode actually opened child work. +use alloy_primitives::{Address, Log, U256}; use reth_revm::{ Inspector, context::{ContextTr, JournalTr}, + handler::FrameResult, interpreter::{ - CallInputs, CallOutcome, CreateInputs, CreateOutcome, Interpreter, + CallInputs, CallOutcome, CreateInputs, CreateOutcome, FrameInput, Interpreter, interpreter::EthInterpreter, interpreter_types::Jumps, }, }; @@ -147,6 +149,30 @@ where } } + /// Forwards emitted logs to the wrapped inner inspector. + fn log(&mut self, context: &mut TaikoEvmContext, log: Log) { + self.inner.log(context, log); + } + + /// Forwards emitted logs (with interpreter access) to the wrapped inner inspector. + fn log_full( + &mut self, + interp: &mut Interpreter, + context: &mut TaikoEvmContext, + log: Log, + ) { + self.inner.log_full(interp, context, log); + } + + /// Forwards the generic frame-start hook to the wrapped inner inspector. + fn frame_start( + &mut self, + context: &mut TaikoEvmContext, + frame_input: &mut FrameInput, + ) -> Option { + self.inner.frame_start(context, frame_input) + } + /// Marks CALL-family steps that actually opened a child frame. fn call( &mut self, @@ -231,6 +257,21 @@ where set_custom_error(context); } } + + /// Forwards the generic frame-end hook to the wrapped inner inspector. + fn frame_end( + &mut self, + context: &mut TaikoEvmContext, + frame_input: &FrameInput, + frame_result: &mut FrameResult, + ) { + self.inner.frame_end(context, frame_input, frame_result); + } + + /// Forwards selfdestruct notifications to the wrapped inner inspector. + fn selfdestruct(&mut self, contract: Address, target: Address, value: U256) { + self.inner.selfdestruct(contract, target, value); + } } /// Per-inspector metering state carried across opcode callbacks. diff --git a/crates/evm/src/zk_gas/meter.rs b/crates/evm/src/zk_gas/meter.rs index cc91428f..99ab5495 100644 --- a/crates/evm/src/zk_gas/meter.rs +++ b/crates/evm/src/zk_gas/meter.rs @@ -34,6 +34,29 @@ impl<'a> ZkGasMeter<'a> { } } + /// Test-only constructor that seeds finalized and in-flight usage directly. + /// + /// The charge path caps in-flight usage at the remaining block budget, so boundary states + /// around (and past) the block limit cannot be reached through public charging — this + /// bypass exists to pin [`Self::commit_would_exceed_block_limit`] against + /// [`Self::commit_transaction`]. + #[cfg(test)] + pub(crate) const fn with_usage_for_tests( + schedule: &'a ZkGasSchedule, + block_zk_gas_used: u64, + tx_zk_gas_used: u64, + ) -> Self { + Self { + schedule, + block_zk_gas_used, + tx_zk_gas_used, + remaining_zk_gas: schedule + .block_limit + .saturating_sub(block_zk_gas_used) + .saturating_sub(tx_zk_gas_used), + } + } + /// Resets the in-flight zk gas for the current transaction. pub fn reset_transaction(&mut self) { self.tx_zk_gas_used = 0; @@ -54,6 +77,15 @@ impl<'a> ZkGasMeter<'a> { Ok(()) } + /// Returns `true` when [`Self::commit_transaction`] would fail: committing the in-flight + /// transaction zk gas would exceed the block budget or overflow `u64` arithmetic. + pub const fn commit_would_exceed_block_limit(&self) -> bool { + match self.block_zk_gas_used.checked_add(self.tx_zk_gas_used) { + Some(next_block) => next_block > self.schedule.block_limit, + None => true, + } + } + /// Returns the finalized zk gas from fully committed transactions. pub const fn block_zk_gas_used(&self) -> u64 { self.block_zk_gas_used diff --git a/crates/evm/src/zk_gas/runtime.rs b/crates/evm/src/zk_gas/runtime.rs index e8d4a926..ca40c1a4 100644 --- a/crates/evm/src/zk_gas/runtime.rs +++ b/crates/evm/src/zk_gas/runtime.rs @@ -3,7 +3,7 @@ use reth_revm::{ context::{ContextError, ContextTr}, interpreter::{ - Interpreter, InterpreterAction, + GasTable, Interpreter, InterpreterAction, instructions::InstructionTable, interpreter::EthInterpreter, interpreter_types::{Jumps, LoopControl}, @@ -16,21 +16,40 @@ use super::{ }; /// Runs the interpreter loop while charging zk gas directly in the production path. +/// +/// Mirrors revm's `Interpreter::run_plain` control flow — every step signals loop exit through +/// its `Err(InstructionResult)` — with one deliberate difference: an exceptional halt is +/// materialized *before* the step's zk gas charge instead of after the loop. +/// [`Interpreter::halt`] spends all remaining gas for `OutOfGas` results, and that forfeited +/// gas is part of the step's consensus charge: pre-2.4.0 revm called `halt_oog()` (spend-all) +/// inside `step` itself, taiko-geth's zk mirror follows that reference behavior, and these +/// totals feed `header.difficulty` on Unzen. revm's inspected loop materializes the halt +/// before `step_end` for the same reason, which keeps [`super::adapter::ZkGasInspector`]'s +/// measurements identical to this loop's. #[inline] pub(crate) fn run_metered_plain( context: &mut CTX, interpreter: &mut Interpreter, instruction_table: &InstructionTable, + gas_table: &GasTable, meter: &mut ZkGasMeter<'static>, ) -> InterpreterAction { - while interpreter.bytecode.is_not_end() { + loop { let opcode = interpreter.bytecode.opcode(); let gas_before = interpreter.gas.remaining(); - interpreter.step(instruction_table, context); + let step_result = interpreter.step(instruction_table, gas_table, context); + + // Materialize an exceptional halt before charging so the `OutOfGas` spend-all is + // reflected in the measured step gas (see the function docs). + if let Err(result) = step_result && + interpreter.bytecode.action().is_none() + { + interpreter.halt(result); + } let charge = if is_spawn_opcode(opcode) && - matches!(&interpreter.bytecode.action, Some(InterpreterAction::NewFrame(_))) + matches!(interpreter.bytecode.action(), Some(InterpreterAction::NewFrame(_))) { meter.charge_spawn_opcode(opcode) } else { @@ -42,6 +61,10 @@ pub(crate) fn run_metered_plain( interpreter.halt_fatal(); break; } + + if step_result.is_err() { + break; + } } interpreter.take_next_action() diff --git a/crates/evm/src/zk_gas/tests.rs b/crates/evm/src/zk_gas/tests.rs index 4191209a..525fa0f2 100644 --- a/crates/evm/src/zk_gas/tests.rs +++ b/crates/evm/src/zk_gas/tests.rs @@ -4,7 +4,10 @@ use alloy_evm::{Evm as AlloyEvm, EvmEnv, EvmFactory}; use alloy_primitives::{Address, address}; use reth_revm::{ Inspector, - context::TxEnv, + context::{ + TxEnv, + result::{ExecutionResult, HaltReason}, + }, db::InMemoryDB, inspector::NoOpInspector, interpreter::{ @@ -22,7 +25,7 @@ use crate::{factory::TaikoEvmFactory, spec::TaikoSpecId}; use super::{ adapter::ZK_GAS_LIMIT_ERR, meter::{ZkGasMeter, ZkGasOutcome}, - schedule::{FAILSAFE_MULTIPLIER, schedule_for}, + schedule::{FAILSAFE_MULTIPLIER, ZkGasSchedule, schedule_for}, unzen::{TX_INTRINSIC_ZK_GAS, UNZEN_ZK_GAS_SCHEDULE}, }; @@ -176,6 +179,28 @@ fn meter_rejects_block_budget_plus_one() { assert!(matches!(meter.charge_opcode(0xf0, 2), Err(ZkGasOutcome::LimitExceeded))); } +#[test] +fn meter_commit_would_exceed_agrees_with_commit_transaction_at_boundaries() { + let schedule = schedule_for(TaikoSpecId::UNZEN).expect("Unzen schedule"); + + // In-flight usage that lands exactly on the block limit commits. + let mut at_limit = ZkGasMeter::with_usage_for_tests(schedule, schedule.block_limit - 1, 1); + assert!(!at_limit.commit_would_exceed_block_limit()); + assert!(at_limit.commit_transaction().is_ok()); + assert_eq!(at_limit.block_zk_gas_used(), schedule.block_limit); + + // One zk gas past the limit is rejected, and the predicate agrees before the commit runs. + let mut past_limit = ZkGasMeter::with_usage_for_tests(schedule, schedule.block_limit - 1, 2); + assert!(past_limit.commit_would_exceed_block_limit()); + assert!(matches!(past_limit.commit_transaction(), Err(ZkGasOutcome::LimitExceeded))); + + // A `u64` overflow in the running block total also counts as exceeding the limit. + let overflow_schedule = ZkGasSchedule { block_limit: u64::MAX, ..UNZEN_ZK_GAS_SCHEDULE }; + let mut overflowing = ZkGasMeter::with_usage_for_tests(&overflow_schedule, u64::MAX, 1); + assert!(overflowing.commit_would_exceed_block_limit()); + assert!(matches!(overflowing.commit_transaction(), Err(ZkGasOutcome::LimitExceeded))); +} + #[test] fn meter_returns_limit_exceeded_for_precompile_over_block_budget() { let schedule = schedule_for(TaikoSpecId::UNZEN).expect("Unzen schedule"); @@ -230,7 +255,7 @@ impl Inspector for StepGasProbeInspector { #[test] fn unzen_adapter_uses_spawn_estimate_for_precompile_dispatch() { let schedule = schedule_for(TaikoSpecId::UNZEN).expect("Unzen schedule"); - let mut evm = TaikoEvmFactory.create_evm_with_inspector( + let mut evm = TaikoEvmFactory::default().create_evm_with_inspector( db_with_contract(staticcall_identity_bytecode()), evm_env(TaikoSpecId::UNZEN), StepGasProbeInspector::default(), @@ -268,13 +293,13 @@ fn unzen_adapter_uses_spawn_estimate_for_precompile_dispatch() { #[test] fn production_metered_path_matches_inspector_path_for_precompile_dispatch() { - let mut production_evm = TaikoEvmFactory + let mut production_evm = TaikoEvmFactory::default() .create_evm(db_with_contract(staticcall_identity_bytecode()), evm_env(TaikoSpecId::UNZEN)); production_evm.transact(tx_env(100_000)).expect("production path should execute"); let production_zk_gas = production_evm.meter().expect("production path should install a meter").tx_zk_gas_used(); - let mut inspector_evm = TaikoEvmFactory.create_evm_with_inspector( + let mut inspector_evm = TaikoEvmFactory::default().create_evm_with_inspector( db_with_contract(staticcall_identity_bytecode()), evm_env(TaikoSpecId::UNZEN), NoOpInspector {}, @@ -288,13 +313,13 @@ fn production_metered_path_matches_inspector_path_for_precompile_dispatch() { #[test] fn production_metered_path_matches_inspector_path_for_ordinary_opcodes() { - let mut production_evm = TaikoEvmFactory + let mut production_evm = TaikoEvmFactory::default() .create_evm(db_with_contract(simple_arithmetic_bytecode()), evm_env(TaikoSpecId::UNZEN)); production_evm.transact(tx_env(100_000)).expect("production path should execute"); let production_zk_gas = production_evm.meter().expect("production path should install a meter").tx_zk_gas_used(); - let mut inspector_evm = TaikoEvmFactory.create_evm_with_inspector( + let mut inspector_evm = TaikoEvmFactory::default().create_evm_with_inspector( db_with_contract(simple_arithmetic_bytecode()), evm_env(TaikoSpecId::UNZEN), NoOpInspector {}, @@ -306,9 +331,96 @@ fn production_metered_path_matches_inspector_path_for_ordinary_opcodes() { assert_eq!(production_zk_gas, inspector_zk_gas); } +/// Executes `bytecode` on Unzen through the production (no-inspector) and the inspected +/// metered path, asserting both halt with `expected_halt` and returning the per-tx zk gas +/// charged by each. +fn metered_paths_zk_gas_for_halting_tx( + bytecode: Bytecode, + gas_limit: u64, + expected_halt: fn(&HaltReason) -> bool, +) -> (u64, u64) { + let mut production_evm = TaikoEvmFactory::default() + .create_evm(db_with_contract(bytecode.clone()), evm_env(TaikoSpecId::UNZEN)); + let result = production_evm.transact(tx_env(gas_limit)).expect("production path executes"); + assert!( + matches!(&result.result, ExecutionResult::Halt { reason, .. } if expected_halt(reason)), + "production path halted unexpectedly: {:?}", + result.result, + ); + let production_zk_gas = + production_evm.meter().expect("production path installs a meter").tx_zk_gas_used(); + + let mut inspector_evm = TaikoEvmFactory::default().create_evm_with_inspector( + db_with_contract(bytecode), + evm_env(TaikoSpecId::UNZEN), + NoOpInspector {}, + ); + let result = inspector_evm.transact(tx_env(gas_limit)).expect("inspector path executes"); + assert!( + matches!(&result.result, ExecutionResult::Halt { reason, .. } if expected_halt(reason)), + "inspector path halted unexpectedly: {:?}", + result.result, + ); + let inspector_zk_gas = + inspector_evm.meter().expect("inspector path installs a meter").tx_zk_gas_used(); + + (production_zk_gas, inspector_zk_gas) +} + +#[test] +fn metered_paths_charge_forfeited_gas_for_an_oog_halting_step() { + // The gas limit admits both `PUSH1` steps (3 gas each) but dies on `ADD`'s table-driven + // static charge with 1 gas left. An `OutOfGas` halt forfeits all remaining gas + // (`Interpreter::halt` spends it), and that forfeiture is part of the step's zk gas + // charge: pre-2.4.0 revm ran `halt_oog()` (spend-all) inside `step` itself, and + // taiko-geth's zk mirror follows that reference behavior. These committed values feed + // `header.difficulty` on Unzen, so any drift here is a consensus change. + let schedule = schedule_for(TaikoSpecId::UNZEN).expect("Unzen schedule"); + let push_multiplier = u64::from(schedule.opcode_multipliers[usize::from(opcode::PUSH1)]); + let add_multiplier = u64::from(schedule.opcode_multipliers[usize::from(opcode::ADD)]); + let forfeited_gas = 1; + let expected = 2 * 3 * push_multiplier + forfeited_gas * add_multiplier; + + let (production_zk_gas, inspector_zk_gas) = + metered_paths_zk_gas_for_halting_tx(simple_arithmetic_bytecode(), 21_000 + 7, |reason| { + matches!(reason, HaltReason::OutOfGas(_)) + }); + + assert_eq!( + production_zk_gas, expected, + "OOG-halting step must charge the gas it forfeited via spend-all" + ); + assert_eq!( + inspector_zk_gas, expected, + "inspector path must charge the OOG-halting step exactly like production" + ); +} + +#[test] +fn metered_paths_charge_static_gas_zk_gas_for_a_stack_underflow_step() { + // `ADD` on an empty stack: the GasTable static charge (3 gas) lands before revm validates + // the stack, so the halting step contributes `3 x multiplier`. Known cross-client + // divergence: taiko-geth validates the stack before charging gas and meters 0 for this + // step; the fix is tracked on the geth side, so this pins reth's committed value. + let schedule = schedule_for(TaikoSpecId::UNZEN).expect("Unzen schedule"); + let add_multiplier = u64::from(schedule.opcode_multipliers[usize::from(opcode::ADD)]); + let expected = 3 * add_multiplier; + + let (production_zk_gas, inspector_zk_gas) = + metered_paths_zk_gas_for_halting_tx(stack_underflow_bytecode(), 100_000, |reason| { + matches!(reason, HaltReason::StackUnderflow) + }); + + assert_eq!(production_zk_gas, expected, "stack-underflow step must charge its static gas cost"); + assert_eq!( + inspector_zk_gas, expected, + "inspector path must charge the underflow-halting step exactly like production" + ); +} + #[test] fn unzen_adapter_raises_dedicated_error_when_limit_is_exceeded() { - let mut evm = TaikoEvmFactory.create_evm( + let mut evm = TaikoEvmFactory::default().create_evm( db_with_contract(limit_exceeding_keccak_bytecode()), evm_env(TaikoSpecId::UNZEN), ); @@ -325,7 +437,7 @@ fn unzen_adapter_raises_dedicated_error_when_limit_is_exceeded() { #[test] fn unzen_default_create_evm_path_is_metered() { - let mut evm = TaikoEvmFactory.create_evm( + let mut evm = TaikoEvmFactory::default().create_evm( db_with_contract(limit_exceeding_keccak_bytecode()), evm_env(TaikoSpecId::UNZEN), ); @@ -336,7 +448,7 @@ fn unzen_default_create_evm_path_is_metered() { #[test] fn production_metered_path_stays_metered_when_noop_inspector_is_enabled() { - let mut evm = TaikoEvmFactory.create_evm( + let mut evm = TaikoEvmFactory::default().create_evm( db_with_contract(limit_exceeding_keccak_bytecode()), evm_env(TaikoSpecId::UNZEN), ); @@ -354,7 +466,8 @@ fn production_metered_path_stays_metered_when_noop_inspector_is_enabled() { #[test] fn factory_installs_unzen_schedule() { let env = evm_env(TaikoSpecId::UNZEN); - let evm = TaikoEvmFactory.create_evm(db_with_contract(limit_exceeding_keccak_bytecode()), env); + let evm = TaikoEvmFactory::default() + .create_evm(db_with_contract(limit_exceeding_keccak_bytecode()), env); let meter = evm.meter().expect("Unzen schedule should install a meter"); assert!(std::ptr::eq(meter.schedule(), &UNZEN_ZK_GAS_SCHEDULE)); @@ -365,7 +478,7 @@ fn factory_installs_unzen_schedule() { fn taiko_zk_gas_evm_charge_tx_intrinsic_adds_intrinsic_to_in_flight_tx() { use crate::alloy::TaikoZkGasEvm; - let mut evm = TaikoEvmFactory + let mut evm = TaikoEvmFactory::default() .create_evm(db_with_contract(staticcall_identity_bytecode()), evm_env(TaikoSpecId::UNZEN)); evm.charge_tx_intrinsic_zk_gas().expect("intrinsic should fit"); @@ -377,7 +490,7 @@ fn taiko_zk_gas_evm_charge_tx_intrinsic_adds_intrinsic_to_in_flight_tx() { fn taiko_zk_gas_evm_charge_tx_intrinsic_is_ok_when_metering_is_disabled() { use crate::alloy::TaikoZkGasEvm; - let mut evm = TaikoEvmFactory + let mut evm = TaikoEvmFactory::default() .create_evm(db_with_contract(staticcall_identity_bytecode()), evm_env(TaikoSpecId::SHASTA)); assert!(evm.meter().is_none()); @@ -386,13 +499,114 @@ fn taiko_zk_gas_evm_charge_tx_intrinsic_is_ok_when_metering_is_disabled() { #[test] fn non_unzen_default_create_evm_path_keeps_metering_disabled() { - let mut evm = TaikoEvmFactory + let mut evm = TaikoEvmFactory::default() .create_evm(db_with_contract(simple_arithmetic_bytecode()), evm_env(TaikoSpecId::SHASTA)); assert!(evm.meter().is_none()); evm.transact(tx_env(5_000_000)).expect("non-Unzen tx should stay on the legacy path"); } +/// Builds a blocking, in-process JIT backend so tests observe compilation synchronously. +#[cfg(feature = "jit")] +fn blocking_jit_backend() -> revmc::runtime::JitBackend { + use revmc::runtime::{JitBackend, JitMode, RuntimeConfig}; + + JitBackend::new(RuntimeConfig { + enabled: true, + blocking: true, + single_error: false, + jit_mode: JitMode::InProcess, + ..RuntimeConfig::default() + }) + .expect("blocking JIT backend should start") +} + +#[cfg(feature = "jit")] +#[test] +fn jit_requires_local_support_and_falls_back_for_unzen() { + let backend = blocking_jit_backend(); + let factory = TaikoEvmFactory::new(backend.clone()); + + let mut unsupported_evm = factory + .create_evm(db_with_contract(simple_arithmetic_bytecode()), evm_env(TaikoSpecId::SHASTA)); + unsupported_evm + .transact(tx_env(100_000)) + .expect("locally disabled JIT execution should use the interpreter"); + assert_eq!(backend.stats().compilations_succeeded, 0); + + let factory = factory.with_jit_support(); + + let mut pre_unzen_evm = factory + .create_evm(db_with_contract(simple_arithmetic_bytecode()), evm_env(TaikoSpecId::SHASTA)); + pre_unzen_evm.transact(tx_env(100_000)).expect("pre-Unzen JIT execution should succeed"); + + let compiled = backend.stats(); + assert_eq!(compiled.compilations_succeeded, 1); + assert_eq!(compiled.lookup_hits, 1); + + let mut unzen_evm = factory + .create_evm(db_with_contract(simple_arithmetic_bytecode()), evm_env(TaikoSpecId::UNZEN)); + unzen_evm.transact(tx_env(100_000)).expect("Unzen interpreter execution should succeed"); + + let after_unzen = backend.stats(); + assert_eq!(after_unzen.compilations_succeeded, compiled.compilations_succeeded); + assert_eq!(after_unzen.lookup_hits, compiled.lookup_hits); + assert!(unzen_evm.meter().is_some()); +} + +/// Executes `bytecode` through a blocking JIT-enabled factory and an interpreter-only factory, +/// returning both outcomes and the JIT backend's stats. +#[cfg(feature = "jit")] +fn jit_and_interpreter_outputs( + bytecode: Bytecode, +) -> ( + reth_revm::context::result::ResultAndState, + reth_revm::context::result::ResultAndState, + revmc::runtime::RuntimeStatsSnapshot, +) { + let backend = blocking_jit_backend(); + + let mut jit_evm = TaikoEvmFactory::new(backend.clone()) + .with_jit_support() + .create_evm(db_with_contract(bytecode.clone()), evm_env(TaikoSpecId::SHASTA)); + let jit_output = jit_evm.transact(tx_env(100_000)).expect("JIT execution should succeed"); + + let mut interpreter_evm = TaikoEvmFactory::default() + .create_evm(db_with_contract(bytecode), evm_env(TaikoSpecId::SHASTA)); + let interpreter_output = + interpreter_evm.transact(tx_env(100_000)).expect("interpreter execution should succeed"); + + (jit_output, interpreter_output, backend.stats()) +} + +#[cfg(feature = "jit")] +#[test] +fn jit_execution_matches_interpreter_execution() { + for (name, bytecode) in [ + ("arithmetic", simple_arithmetic_bytecode()), + ("staticcall", staticcall_identity_bytecode()), + ] { + let (jit_output, interpreter_output, stats) = jit_and_interpreter_outputs(bytecode); + + assert_eq!(jit_output, interpreter_output, "JIT and interpreter diverged for {name}"); + assert!(stats.lookup_hits >= 1, "expected the JIT path to serve compiled code for {name}"); + } +} + +/// Ensures JIT execution preserves the interpreter's dynamic-gas failure ordering. +#[cfg(feature = "jit")] +#[test] +fn jit_matches_interpreter_on_dynamic_gas_failure_order() { + let bytecode = Bytecode::new_raw([0x60, 0x01, 0x60, 0xea, 0x55, 0x01].into()); + + let (jit_output, interpreter_output, _) = jit_and_interpreter_outputs(bytecode); + + assert_eq!( + jit_output, interpreter_output, + "JIT and interpreter must agree on halt reason, gas, and journaled state", + ); +} + fn evm_env(spec: TaikoSpecId) -> EvmEnv { let mut env: EvmEnv = EvmEnv::default(); env.cfg_env.spec = spec; @@ -478,6 +692,11 @@ fn simple_arithmetic_bytecode() -> Bytecode { ])) } +/// `ADD` with nothing on the stack: halts with a stack underflow after its static gas charge. +fn stack_underflow_bytecode() -> Bytecode { + Bytecode::new_raw(Bytes::from(vec![opcode::ADD])) +} + #[test] fn high_range_precompile_collision_resolves_to_failsafe_not_canonical() { // An `L1Sload`-style address whose low byte (0x01) collides with `ecrecover` but whose upper diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 0adebebb..286a7711 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -12,6 +12,7 @@ path = "src/lib.rs" default = ["serde"] arbitrary = [] client = [] +jit = ["alethia-reth-block/jit", "alethia-reth-evm/jit"] prover = [] serde = ["dep:serde", "alethia-reth-chainspec/serde", "alethia-reth-primitives/serde"] @@ -28,6 +29,7 @@ alloy-consensus = { workspace = true } alloy-eips = { workspace = true } alloy-primitives = { workspace = true } alloy-rpc-types-eth = { workspace = true } +derive_more = { workspace = true } eyre = { workspace = true } futures-util = { workspace = true } reth = { workspace = true } @@ -36,13 +38,16 @@ reth-engine-local = { workspace = true } reth-engine-primitives = { workspace = true } reth-ethereum = { workspace = true } reth-ethereum-primitives = { workspace = true } +reth-evm = { workspace = true } reth-execution-types = { workspace = true } reth-node-api = { workspace = true } reth-node-builder = { workspace = true } +reth-node-core = { workspace = true } reth-node-ethereum = { workspace = true } reth-optimism-trie = { workspace = true, features = ["metrics"] } reth-primitives-traits = { workspace = true } reth-provider = { workspace = true } +reth-revm = { workspace = true } reth-rpc = { workspace = true } reth-rpc-builder = { workspace = true } reth-rpc-eth-api = { workspace = true } @@ -55,5 +60,8 @@ tokio = { workspace = true, features = ["time"] } tracing = { workspace = true } [dev-dependencies] +reth-chainspec = { workspace = true } +reth-db-common = { workspace = true } +reth-evm-ethereum = { workspace = true } reth-provider = { workspace = true, features = ["test-utils"] } tempfile = { workspace = true } diff --git a/crates/node/src/components.rs b/crates/node/src/components.rs index 93330fcf..ea4977da 100644 --- a/crates/node/src/components.rs +++ b/crates/node/src/components.rs @@ -24,6 +24,68 @@ use tracing::info; #[derive(Debug, Clone, Default)] pub struct TaikoExecutorBuilder; +/// Builds the EVM configuration honoring the runtime `--jit` CLI settings. +/// +/// With the `jit` Cargo feature, the returned config's factory owns a shared revmc backend +/// created from `jit` (`dump_dir` receives debug artifacts when `--jit.debug` is set). Without +/// the feature this errors when `--jit` was requested, and otherwise returns the plain +/// interpreter config. +/// +/// Shared by the node's [`ExecutorBuilder`] and by CLI subcommands that execute blocks outside +/// the node builder (`re-execute`), whose reth-provided components closure cannot see the +/// command's own `JitArgs`. +pub fn evm_config_from_jit_args( + chain_spec: Arc, + jit: &reth_node_core::args::JitArgs, + dump_dir: Option, +) -> eyre::Result { + #[cfg(feature = "jit")] + { + let config = alethia_reth_evm::jit::JitConfig { + enabled: jit.enabled, + hot_threshold: jit.hot_threshold, + worker_count: jit.worker_count, + channel_capacity: jit.channel_capacity, + max_pending_jobs: jit.max_pending_jobs, + max_bytecode_len: jit.max_bytecode_len, + code_cache_bytes: jit.code_cache_bytes, + idle_evict_duration: jit.idle_evict_duration, + debug: jit.debug, + // revmc's runtime coerces `enabled = true` and `jit_hot_threshold = 0` whenever + // `blocking` is set, so forwarding `--jit.blocking` on its own would compile every + // contract on first touch without `--jit` and without the warning below. Gating it + // here keeps `--jit`/`reth_jit` the only way to turn compilation on. + blocking: jit.enabled && jit.blocking, + }; + let backend = config.build_backend(dump_dir)?; + + if config.enabled { + tracing::warn!( + target: "reth::taiko::cli", + hot_threshold = config.hot_threshold, + workers = ?config.worker_count, + blocking = config.blocking, + "Started experimental revmc JIT backend; this may cause instability" + ); + } + + let factory = alethia_reth_evm::factory::TaikoEvmFactory::new(backend); + Ok(TaikoEvmConfig::new_with_evm_factory(chain_spec, factory)) + } + + #[cfg(not(feature = "jit"))] + { + let _ = dump_dir; + if jit.enabled { + Err(eyre::eyre!( + "JIT compilation was requested with --jit, but this binary was built without the `jit` feature" + )) + } else { + Ok(TaikoEvmConfig::new(chain_spec)) + } + } +} + impl ExecutorBuilder for TaikoExecutorBuilder where Types: NodeTypes< @@ -36,12 +98,15 @@ where /// The EVM config to use. type EVM = TaikoEvmConfig; - /// Creates the EVM config. + /// Creates the EVM config from the node's `--jit` CLI settings. fn build_evm( self, ctx: &BuilderContext, ) -> impl future::Future> + Send { - future::ready(Ok(TaikoEvmConfig::new(ctx.chain_spec()))) + let jit = &ctx.config().jit; + let dump_dir = jit.debug.then(|| ctx.config().datadir().data_dir().join("jit")); + + future::ready(evm_config_from_jit_args(ctx.chain_spec(), jit, dump_dir)) } } @@ -136,4 +201,62 @@ mod tests { let reader = ProviderTaikoBlockReader(provider); assert_eq!(reader.block_timestamp_by_hash(B256::ZERO), None); } + + #[cfg(feature = "jit")] + #[test] + fn evm_config_from_jit_args_wires_the_runtime_enabled_flag() { + use reth_node_core::args::JitArgs; + + let enabled = evm_config_from_jit_args( + TAIKO_MAINNET.clone(), + &JitArgs { enabled: true, ..Default::default() }, + None, + ) + .expect("jit build constructs a backend"); + assert!(enabled.evm_factory().backend().enabled()); + + let disabled = evm_config_from_jit_args(TAIKO_MAINNET.clone(), &JitArgs::default(), None) + .expect("jit build constructs a backend"); + assert!(!disabled.evm_factory().backend().enabled()); + } + + #[cfg(feature = "jit")] + #[test] + fn evm_config_from_jit_args_keeps_blocking_from_enabling_jit() { + use reth_node_core::args::JitArgs; + + // revmc turns `blocking` into `enabled = true` with a zero hot threshold, so + // `--jit.blocking` alone would otherwise compile every contract without `--jit`. + let blocking_only = evm_config_from_jit_args( + TAIKO_MAINNET.clone(), + &JitArgs { blocking: true, ..Default::default() }, + None, + ) + .expect("jit build constructs a backend"); + assert!(!blocking_only.evm_factory().backend().enabled()); + + let blocking_with_jit = evm_config_from_jit_args( + TAIKO_MAINNET.clone(), + &JitArgs { enabled: true, blocking: true, ..Default::default() }, + None, + ) + .expect("jit build constructs a backend"); + assert!(blocking_with_jit.evm_factory().backend().enabled()); + } + + #[cfg(not(feature = "jit"))] + #[test] + fn evm_config_from_jit_args_rejects_jit_on_non_jit_builds() { + use reth_node_core::args::JitArgs; + + let err = evm_config_from_jit_args( + TAIKO_MAINNET.clone(), + &JitArgs { enabled: true, ..Default::default() }, + None, + ) + .expect_err("non-jit build must reject --jit"); + assert!(err.to_string().contains("`jit` feature")); + + assert!(evm_config_from_jit_args(TAIKO_MAINNET.clone(), &JitArgs::default(), None).is_ok()); + } } diff --git a/crates/node/src/lib.rs b/crates/node/src/lib.rs index 5475ecdf..5899be4d 100644 --- a/crates/node/src/lib.rs +++ b/crates/node/src/lib.rs @@ -12,6 +12,8 @@ pub use alethia_reth_evm as evm; pub use alethia_reth_payload as payload; pub use alethia_reth_primitives as primitives; pub use alethia_reth_rpc as rpc; +#[cfg(feature = "jit")] +pub use evm::jit::maybe_run_jit_helper; use chainspec::spec::TaikoChainSpec; use components::{TaikoConsensusBuilder, TaikoExecutorBuilder, TaikoNetworkBuilder}; diff --git a/crates/node/src/proof_history/live.rs b/crates/node/src/proof_history/live.rs new file mode 100644 index 00000000..71b9653a --- /dev/null +++ b/crates/node/src/proof_history/live.rs @@ -0,0 +1,568 @@ +//! Live trie collector executing blocks against proof-history storage. +//! +//! Ported from the `live` module of the OP monorepo's `reth-optimism-trie` crate (last present +//! upstream at `bcf489ea`): upstream replaced it with an `engine` service driven by op-node's +//! engine flow, while Alethia's proof-history sidecar drives collection itself. The collector +//! therefore lives on here as first-party code, written against the crate's public storage API +//! (`get_proof_window`). + +use alloy_eips::{BlockNumHash, NumHash, eip1898::BlockWithParent}; +use derive_more::Constructor; +use reth_evm::{ConfigureEvm, execute::Executor}; +use reth_optimism_trie::{ + BlockStateDiff, OpProofsStorage, OpProofsStorageError, OpProofsStore, + api::{OpProofsProviderRO, OpProofsProviderRw, OperationDurations}, + provider::OpProofsStateProviderRef, +}; +use reth_primitives_traits::{AlloyBlockHeader, BlockTy, RecoveredBlock}; +use reth_provider::{ + DatabaseProviderFactory, HashedPostStateProvider, StateProviderFactory, StateReader, + StateRootProvider, +}; +use reth_revm::database::StateProviderDatabase; +use reth_trie_common::{HashedPostStateSorted, updates::TrieUpdatesSorted}; +use std::{sync::Arc, time::Instant}; +use tracing::info; + +/// Live trie collector for external proofs storage. +#[derive(Debug, Constructor)] +pub struct LiveTrieCollector<'tx, Evm, Provider, PreimageStore> +where + Evm: ConfigureEvm, + Provider: StateReader + DatabaseProviderFactory + StateProviderFactory, +{ + /// EVM configuration used to re-execute blocks whose trie updates are collected. + evm_config: Evm, + /// Provider the collector reads parent state from. + provider: Provider, + /// Proof-history storage the collected trie updates are written to. + storage: &'tx OpProofsStorage, +} + +impl<'tx, Evm, Provider, Store> LiveTrieCollector<'tx, Evm, Provider, Store> +where + Evm: ConfigureEvm, + Provider: StateReader + DatabaseProviderFactory + StateProviderFactory, + Store: 'tx + OpProofsStore + Clone + 'static, +{ + /// Execute a block and store the updates in the storage. + pub fn execute_and_store_block_updates( + &self, + block: &RecoveredBlock>, + ) -> Result<(), OpProofsStorageError> { + let mut operation_durations = OperationDurations::default(); + + let start = Instant::now(); + // ensure that we have the state of the parent block + let provider_ro = self.storage.provider_ro()?; + // Errors with `NoBlocksFound` when the proof window is empty. + let window = provider_ro.get_proof_window()?; + let (earliest, latest) = (window.earliest.number, window.latest.number); + + // Genesis has no parent state to execute against. + let parent_block_number = + block.number().checked_sub(1).ok_or(OpProofsStorageError::UnknownParent)?; + if parent_block_number < earliest { + return Err(OpProofsStorageError::UnknownParent); + } + + if parent_block_number > latest { + return Err(OpProofsStorageError::MissingParentBlock { + block_number: block.number(), + parent_block_number, + latest_block_number: latest, + }); + } + + // The storage only accepts appends on top of its latest block (`store_trie_updates` + // re-checks this at write time), so require the parent to be the stored tip before + // paying for execution and state-root collection: a reorg race would otherwise surface + // late as a confusing state-root mismatch, and even a matching root could not be stored. + if parent_block_number != latest || block.parent_hash() != window.latest.hash { + return Err(OpProofsStorageError::OutOfOrder { + block_number: block.number(), + parent_block_hash: block.parent_hash(), + latest_block_hash: window.latest.hash, + }); + } + + let block_ref = + BlockWithParent::new(block.parent_hash(), NumHash::new(block.number(), block.hash())); + + let state_provider = OpProofsStateProviderRef::new( + self.provider.state_by_block_hash(block.parent_hash())?, + self.storage.provider_ro()?, + parent_block_number, + ); + + let db = StateProviderDatabase::new(&state_provider); + let block_executor = self.evm_config.batch_executor(db); + + let execution_result = block_executor.execute(&(*block).clone())?; + + operation_durations.execution_duration_seconds = start.elapsed(); + + let hashed_state = state_provider.hashed_post_state(&execution_result.state); + let (state_root, trie_updates) = + state_provider.state_root_with_updates(hashed_state.clone())?; + + operation_durations.state_root_duration_seconds = + start.elapsed() - operation_durations.execution_duration_seconds; + + if state_root != block.state_root() { + return Err(OpProofsStorageError::StateRootMismatch { + block_number: block.number(), + current_state_hash: state_root, + expected_state_hash: block.state_root(), + }); + } + + let provider_rw = self.storage.provider_rw()?; + let update_result = provider_rw.store_trie_updates( + block_ref, + BlockStateDiff { + sorted_trie_updates: trie_updates.into_sorted(), + sorted_post_state: hashed_state.into_sorted(), + }, + )?; + provider_rw.commit()?; + + operation_durations.total_duration_seconds = start.elapsed(); + operation_durations.write_duration_seconds = operation_durations.total_duration_seconds - + operation_durations.state_root_duration_seconds - + operation_durations.execution_duration_seconds; + + info!( + block_number = block.number(), + ?operation_durations, + ?update_result, + "Block executed and trie updates stored successfully", + ); + + Ok(()) + } + + /// Store trie updates for a given block. + pub fn store_block_updates( + &self, + block: BlockWithParent, + sorted_trie_updates: TrieUpdatesSorted, + sorted_post_state: HashedPostStateSorted, + ) -> Result<(), OpProofsStorageError> { + let start = Instant::now(); + let mut operation_durations = OperationDurations::default(); + + let provider_rw = self.storage.provider_rw()?; + let storage_result = provider_rw + .store_trie_updates(block, BlockStateDiff { sorted_trie_updates, sorted_post_state })?; + provider_rw.commit()?; + + let write_duration = start.elapsed(); + operation_durations.total_duration_seconds = write_duration; + operation_durations.write_duration_seconds = write_duration; + + info!( + block_number = block.block.number, + ?operation_durations, + ?storage_result, + "Trie updates stored successfully", + ); + + Ok(()) + } + + /// Handles chain reorganizations by replacing block updates after a common ancestor. + /// + /// This method removes all block updates after the latest common ancestor (the block before + /// the first block in `new_blocks`) and replaces them with the updates from the provided new + /// chain. A common ancestor at the retained earliest block is supported as long as the new + /// chain descends from the stored anchor: `replace_updates` refuses that boundary, so the + /// window is rebuilt by unwinding to the anchor and appending the new chain in one + /// transaction. + /// + /// # Arguments + /// + /// * `new_blocks` - A vector of references to `RecoveredBlock` instances representing the new + /// blocks to be added to the trie storage. + pub fn unwind_and_store_block_updates( + &self, + block_updates: Vec<(BlockWithParent, Arc, Arc)>, + ) -> Result<(), OpProofsStorageError> { + if block_updates.is_empty() { + return Ok(()); + } + + let start = Instant::now(); + let mut operation_durations = OperationDurations::default(); + let first = &block_updates[0].0; + let latest_common_block = + BlockNumHash::new(first.block.number.saturating_sub(1), first.parent); + let mut block_trie_updates: Vec<(BlockWithParent, BlockStateDiff)> = + Vec::with_capacity(block_updates.len()); + + for (block, trie_updates, hashed_state) in &block_updates { + block_trie_updates.push(( + *block, + BlockStateDiff { + sorted_trie_updates: (**trie_updates).clone(), + sorted_post_state: (**hashed_state).clone(), + }, + )); + } + + let earliest = self.storage.provider_ro()?.get_proof_window()?.earliest; + let provider_rw = self.storage.provider_rw()?; + if latest_common_block.number == earliest.number { + // `replace_updates` refuses a common ancestor at the window's earliest block, but + // that is exactly where an ordinary reorg lands right after initialization (or an + // unwind) collapsed the window onto its anchor: the anchor itself stays, only the + // blocks above it are replaced. The new chain must descend from the stored anchor. + if latest_common_block.hash != earliest.hash { + return Err(OpProofsStorageError::OutOfOrder { + block_number: first.block.number, + parent_block_hash: first.parent, + latest_block_hash: earliest.hash, + }); + } + block_trie_updates.sort_unstable_by_key(|(block, _)| block.block.number); + // `unwind_history` only reads the unwind number and the parent that becomes the new + // latest block; the replaced block's hash is not tracked here, so label the unwind + // with the replacement block at that height. + let unwind_to = BlockWithParent::new( + earliest.hash, + NumHash::new(earliest.number.saturating_add(1), first.block.hash), + ); + provider_rw.unwind_history(unwind_to)?; + for (block, diff) in block_trie_updates { + provider_rw.store_trie_updates(block, diff)?; + } + } else { + provider_rw.replace_updates(latest_common_block, block_trie_updates)?; + } + provider_rw.commit()?; + let write_duration = start.elapsed(); + operation_durations.total_duration_seconds = write_duration; + operation_durations.write_duration_seconds = write_duration; + + info!( + start_block_number = block_updates.first().map(|(b, _, _)| b.block.number), + end_block_number = block_updates.last().map(|(b, _, _)| b.block.number), + ?operation_durations, + "Trie updates rewound and stored successfully", + ); + Ok(()) + } + + /// Remove account, storage and trie updates from historical storage for all blocks from + /// the specified block (inclusive). + pub fn unwind_history(&self, to: BlockWithParent) -> Result<(), OpProofsStorageError> { + let provider_rw = self.storage.provider_rw()?; + provider_rw.unwind_history(to)?; + provider_rw.commit() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_consensus::Header; + use alloy_primitives::B256; + use reth_chainspec::{ChainSpec, ChainSpecBuilder, MAINNET}; + use reth_db::Database; + use reth_db_common::init::init_genesis; + use reth_ethereum_primitives::{Block, BlockBody}; + use reth_evm_ethereum::EthEvmConfig; + use reth_optimism_trie::{ + RethTrieStorageLayout, db::MdbxProofsStorage, initialize::InitializationJob, + }; + use reth_primitives_traits::Block as _; + use reth_provider::{ + StorageSettingsCache, + providers::BlockchainProvider, + test_utils::{MockNodeTypesWithDB, create_test_provider_factory_with_chain_spec}, + }; + use tempfile::TempDir; + + /// Paris-activated chain spec on the mainnet genesis; empty blocks keep the genesis root. + fn test_chain_spec() -> Arc { + Arc::new( + ChainSpecBuilder::default() + .chain(MAINNET.chain) + .genesis(MAINNET.genesis.clone()) + .paris_activated() + .build(), + ) + } + + /// Empty block at `number` on top of `parent_hash` claiming `state_root`. + fn empty_block(number: u64, parent_hash: B256, state_root: B256) -> RecoveredBlock { + Block { + header: Header { parent_hash, number, state_root, ..Default::default() }, + body: BlockBody::default(), + } + .try_into_recovered() + .expect("empty block recovers without senders") + } + + /// Genesis-initialized blockchain provider plus proofs storage seeded at block zero. + fn genesis_fixture( + chain_spec: &Arc, + ) -> (BlockchainProvider, OpProofsStorage>) { + let factory = create_test_provider_factory_with_chain_spec(chain_spec.clone()); + init_genesis(&factory).expect("genesis state initializes"); + + let path = TempDir::new().expect("temp dir").keep(); + let storage: OpProofsStorage> = + Arc::new(MdbxProofsStorage::new(&path).expect("mdbx proofs storage opens")).into(); + + let layout = if factory.cached_storage_settings().is_v2() { + RethTrieStorageLayout::Packed + } else { + RethTrieStorageLayout::Legacy + }; + let tx = factory.db_ref().tx().expect("read transaction opens"); + InitializationJob::new(storage.clone(), tx, layout) + .run(0, chain_spec.genesis_hash()) + .expect("proofs storage initializes to genesis"); + + let provider = BlockchainProvider::new(factory).expect("blockchain provider"); + (provider, storage) + } + + /// Latest block recorded in the proofs storage window. + fn stored_latest(storage: &OpProofsStorage>) -> NumHash { + storage + .provider_ro() + .expect("read provider opens") + .get_proof_window() + .expect("proof window exists") + .latest + } + + #[test] + fn collector_executes_and_stores_an_empty_block() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + let genesis_root = chain_spec.genesis_header().state_root; + let block = empty_block(1, chain_spec.genesis_hash(), genesis_root); + + collector.execute_and_store_block_updates(&block).expect("empty block stores cleanly"); + assert_eq!(stored_latest(&storage), NumHash::new(1, block.hash())); + } + + #[test] + fn collector_rejects_a_block_beyond_the_stored_window() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + // Parent 2 is past the window (storage only holds genesis), so collection must refuse. + let block = empty_block(3, B256::repeat_byte(0x11), B256::ZERO); + let err = collector.execute_and_store_block_updates(&block).unwrap_err(); + assert!(matches!(err, OpProofsStorageError::MissingParentBlock { .. }), "got {err:?}"); + } + + #[test] + fn collector_rejects_a_genesis_block() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + // Block zero has no parent: the parent-height subtraction must not wrap into a window + // probe. + let block = empty_block(0, B256::ZERO, chain_spec.genesis_header().state_root); + let err = collector.execute_and_store_block_updates(&block).unwrap_err(); + assert!(matches!(err, OpProofsStorageError::UnknownParent), "got {err:?}"); + } + + #[test] + fn collector_rejects_a_block_whose_parent_is_not_the_stored_tip() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + // Parent height matches the stored tip (genesis) but the hash belongs to another fork: + // the collector must refuse up front instead of executing toward a state-root mismatch. + let block = empty_block(1, B256::repeat_byte(0xEE), chain_spec.genesis_header().state_root); + let err = collector.execute_and_store_block_updates(&block).unwrap_err(); + assert!(matches!(err, OpProofsStorageError::OutOfOrder { .. }), "got {err:?}"); + } + + #[test] + fn collector_rejects_a_block_executing_inside_the_stored_window() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + // Window [0, 1]: a block whose parent is the interior genesis block is a reorg of the + // stored tip. The append-only storage would reject it at write time, so execution must + // be refused up front (reorgs go through `unwind_and_store_block_updates`). + let stored = + BlockWithParent::new(chain_spec.genesis_hash(), NumHash::new(1, B256::repeat_byte(1))); + collector + .store_block_updates( + stored, + TrieUpdatesSorted::default(), + HashedPostStateSorted::default(), + ) + .expect("canonical block stores cleanly"); + + let block = + empty_block(1, chain_spec.genesis_hash(), chain_spec.genesis_header().state_root); + let err = collector.execute_and_store_block_updates(&block).unwrap_err(); + assert!(matches!(err, OpProofsStorageError::OutOfOrder { .. }), "got {err:?}"); + } + + #[test] + fn collector_rejects_a_block_with_a_wrong_state_root() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + let block = empty_block(1, chain_spec.genesis_hash(), B256::repeat_byte(0xAA)); + let err = collector.execute_and_store_block_updates(&block).unwrap_err(); + assert!(matches!(err, OpProofsStorageError::StateRootMismatch { .. }), "got {err:?}"); + } + + #[test] + fn collector_stores_precomputed_updates_and_unwinds_them() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + let block_hash = B256::repeat_byte(0x01); + let block_ref = + BlockWithParent::new(chain_spec.genesis_hash(), NumHash::new(1, block_hash)); + collector + .store_block_updates( + block_ref, + TrieUpdatesSorted::default(), + HashedPostStateSorted::default(), + ) + .expect("precomputed updates store cleanly"); + assert_eq!(stored_latest(&storage), NumHash::new(1, block_hash)); + + collector.unwind_history(block_ref).expect("stored block unwinds"); + assert_eq!(stored_latest(&storage), NumHash::new(0, chain_spec.genesis_hash())); + } + + #[test] + fn collector_replaces_blocks_after_the_common_ancestor() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + // Grow the window to [0, 2] and reorg block 2 on top of block 1: a common ancestor + // strictly above the earliest block takes the `replace_updates` path. + let block_one = + BlockWithParent::new(chain_spec.genesis_hash(), NumHash::new(1, B256::repeat_byte(1))); + let original = + BlockWithParent::new(block_one.block.hash, NumHash::new(2, B256::repeat_byte(2))); + for block in [block_one, original] { + collector + .store_block_updates( + block, + TrieUpdatesSorted::default(), + HashedPostStateSorted::default(), + ) + .expect("canonical block stores cleanly"); + } + + let replacement = + BlockWithParent::new(block_one.block.hash, NumHash::new(2, B256::repeat_byte(3))); + collector + .unwind_and_store_block_updates(vec![( + replacement, + Arc::new(TrieUpdatesSorted::default()), + Arc::new(HashedPostStateSorted::default()), + )]) + .expect("reorg replacement stores cleanly"); + assert_eq!(stored_latest(&storage), replacement.block); + + // An empty update set is a no-op. + collector.unwind_and_store_block_updates(vec![]).expect("empty replacement is a no-op"); + assert_eq!(stored_latest(&storage), replacement.block); + } + + #[test] + fn collector_replaces_blocks_at_the_earliest_window_boundary() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + // Window [0, 1]: the genesis anchor plus one stored block. Reorging block 1 makes the + // common ancestor exactly the retained earliest block — the state right after + // initialization, when any reorg of the first collected block lands on the anchor. + let original = + BlockWithParent::new(chain_spec.genesis_hash(), NumHash::new(1, B256::repeat_byte(2))); + collector + .store_block_updates( + original, + TrieUpdatesSorted::default(), + HashedPostStateSorted::default(), + ) + .expect("canonical block stores cleanly"); + + let replacement_one = + BlockWithParent::new(chain_spec.genesis_hash(), NumHash::new(1, B256::repeat_byte(3))); + let replacement_two = + BlockWithParent::new(replacement_one.block.hash, NumHash::new(2, B256::repeat_byte(4))); + collector + .unwind_and_store_block_updates(vec![ + ( + replacement_one, + Arc::new(TrieUpdatesSorted::default()), + Arc::new(HashedPostStateSorted::default()), + ), + ( + replacement_two, + Arc::new(TrieUpdatesSorted::default()), + Arc::new(HashedPostStateSorted::default()), + ), + ]) + .expect("boundary reorg replaces blocks above the retained anchor"); + assert_eq!(stored_latest(&storage), replacement_two.block); + } + + #[test] + fn collector_rejects_a_boundary_reorg_not_descending_from_the_anchor() { + let chain_spec = test_chain_spec(); + let (provider, storage) = genesis_fixture(&chain_spec); + let collector = + LiveTrieCollector::new(EthEvmConfig::ethereum(chain_spec.clone()), provider, &storage); + + let original = + BlockWithParent::new(chain_spec.genesis_hash(), NumHash::new(1, B256::repeat_byte(2))); + collector + .store_block_updates( + original, + TrieUpdatesSorted::default(), + HashedPostStateSorted::default(), + ) + .expect("canonical block stores cleanly"); + + // The replacement claims a common ancestor at the earliest height but with a different + // hash than the retained anchor: the new chain does not descend from stored state. + let replacement = + BlockWithParent::new(B256::repeat_byte(0xEE), NumHash::new(1, B256::repeat_byte(3))); + let err = collector + .unwind_and_store_block_updates(vec![( + replacement, + Arc::new(TrieUpdatesSorted::default()), + Arc::new(HashedPostStateSorted::default()), + )]) + .unwrap_err(); + assert!(matches!(err, OpProofsStorageError::OutOfOrder { .. }), "got {err:?}"); + } +} diff --git a/crates/node/src/proof_history/mod.rs b/crates/node/src/proof_history/mod.rs index 46a50184..8dad30f5 100644 --- a/crates/node/src/proof_history/mod.rs +++ b/crates/node/src/proof_history/mod.rs @@ -2,6 +2,7 @@ mod config; mod init; +mod live; mod sidecar; mod storage_init; @@ -32,7 +33,7 @@ use reth_node_builder::{ NodeAdapter, NodeBuilderWithComponents, NodeComponentsBuilder, WithLaunchContext, rpc::{RethRpcAddOns, RpcContext}, }; -use reth_optimism_trie::{OpProofsStorage, db::MdbxProofsStorage}; +use reth_optimism_trie::{OpProofsStorage, OpProofsStorageError, db::MdbxProofsStorage}; use reth_rpc_builder::RethRpcModule; use reth_rpc_eth_api::helpers::FullEthApi; use reth_storage_api::{ @@ -45,6 +46,18 @@ use tracing::info; /// Shared storage type used by proof-history indexing and debug RPC overrides. pub type ProofHistoryStorage = OpProofsStorage>; +/// Adapts the storage bound accessors' `NoBlocksFound` error back to the `Option` shape the +/// reconciliation logic in this module was written against. +pub(crate) fn opt_block( + result: Result, +) -> Result, OpProofsStorageError> { + match result { + Ok(numhash) => Ok(Some((numhash.number, numhash.hash))), + Err(OpProofsStorageError::NoBlocksFound) => Ok(None), + Err(err) => Err(err), + } +} + /// Storage and reconciliation-readiness handles shared with the proof-history RPC overrides. pub type ProofHistoryRpcHandles = (ProofHistoryStorage, ProofHistoryReadiness); diff --git a/crates/node/src/proof_history/sidecar.rs b/crates/node/src/proof_history/sidecar.rs index 818bd659..43cd719a 100644 --- a/crates/node/src/proof_history/sidecar.rs +++ b/crates/node/src/proof_history/sidecar.rs @@ -2,12 +2,14 @@ use super::{ config::ProofHistoryConfig, + live::LiveTrieCollector, + opt_block, storage_init::{ DelayedProofHistoryStart, ProofHistoryInitializationAction, delayed_proof_history_start, finalized_block_number, initialize_historical_proof_history_storage, - initialize_proof_history_storage, proof_history_historical_init_metadata_path, - proof_history_storage_needs_initialization, proof_history_sync_target, - read_historical_init_metadata, + initialize_proof_history_storage, migrate_legacy_proof_history_storage, + proof_history_historical_init_metadata_path, proof_history_storage_needs_initialization, + proof_history_sync_target, read_historical_init_metadata, }, }; use alethia_reth_rpc::proof_state::ProofHistoryReadiness; @@ -29,7 +31,6 @@ use reth_node_api::{FullNodeComponents, NodePrimitives, NodeTypes}; use reth_optimism_trie::{ OpProofStoragePruner, OpProofsStorage, OpProofsStorageError, OpProofsStore, api::{OpProofsProviderRO, OpProofsProviderRw}, - live::LiveTrieCollector, }; use reth_storage_api::{ ChainStateBlockReader, ChangeSetReader, StorageChangeSetReader, StorageSettingsCache, @@ -282,6 +283,10 @@ where { /// Runs proof-history indexing until the node shuts down. pub(super) async fn run(self, mut shutdown: GracefulShutdown) -> eyre::Result<()> { + // Databases initialized under the previous storage dependency may lack a `LatestBlock` + // row; repair them before any reconciliation reads the storage bounds. + migrate_legacy_proof_history_storage(&self.storage)?; + let collector = LiveTrieCollector::new(self.evm_config.clone(), self.provider.clone(), &self.storage); let mut notifications = self.provider.subscribe_to_canonical_state(); @@ -405,8 +410,8 @@ where /// Computes the reconciliation action for the current proof-history storage bounds. fn startup_action(&self) -> eyre::Result { let provider_ro = self.storage.provider_ro()?; - let earliest = provider_ro.get_earliest_block_number()?; - let latest = provider_ro.get_latest_block_number()?; + let earliest = opt_block(provider_ro.get_earliest_block())?; + let latest = opt_block(provider_ro.get_latest_block())?; let canonical_best = self.provider.best_block_number()?; let canonical_earliest_hash = earliest.map(|(number, _)| self.provider.block_hash(number)).transpose()?.flatten(); @@ -427,10 +432,7 @@ where /// Unwinds proof-history storage so its latest retained block is the canonical earliest block. async fn unwind_to_earliest(&self, earliest: BlockNumHash) -> eyre::Result<()> { - let latest = self - .storage - .provider_ro()? - .get_latest_block_number()? + let latest = opt_block(self.storage.provider_ro()?.get_latest_block())? .ok_or_else(|| eyre!("no latest proof-history block to unwind"))? .0; if latest <= earliest.number { @@ -600,12 +602,10 @@ where /// Verifies the proof-history database is initialized and safe to prune automatically. fn ensure_initialized(&self) -> eyre::Result<()> { let provider_ro = self.storage.provider_ro()?; - let earliest_block_number = provider_ro - .get_earliest_block_number()? + let earliest_block_number = opt_block(provider_ro.get_earliest_block())? .ok_or_else(|| eyre!("proof-history storage is not initialized"))? .0; - let latest_block_number = provider_ro - .get_latest_block_number()? + let latest_block_number = opt_block(provider_ro.get_latest_block())? .ok_or_else(|| eyre!("proof-history storage is not initialized"))? .0; @@ -626,12 +626,14 @@ where /// Spawns the periodic proof-history pruning task. fn spawn_pruner_task(&self) { - let pruner = Arc::new(OpProofStoragePruner::new( - self.storage.clone(), - self.provider.clone(), - self.config.window, - PROOF_HISTORY_PRUNE_BATCH_SIZE, - )); + let pruner = Arc::new( + OpProofStoragePruner::new( + self.storage.clone(), + self.provider.clone(), + self.config.window, + ) + .with_batch_size(PROOF_HISTORY_PRUNE_BATCH_SIZE), + ); let prune_interval = self.config.prune_interval; let retention_window = self.config.window; let write_lock = self.write_lock.clone(); @@ -733,9 +735,9 @@ where loop { let write_guard = write_lock.lock().await; - let latest = match storage.provider_ro().and_then(|p| p.get_latest_block_number()) { - Ok(Some((number, _))) => number, - Ok(None) => { + let latest = match storage.provider_ro().and_then(|p| p.get_latest_block()) { + Ok(numhash) => numhash.number, + Err(OpProofsStorageError::NoBlocksFound) => { error!(target: "reth::taiko::proof_history", "proof-history sync loop found no stored blocks; stopping sync loop"); return; } @@ -912,11 +914,9 @@ where ) -> eyre::Result<()> { let _write_guard = self.write_lock.lock().await; let provider_ro = self.storage.provider_ro()?; - let earliest_stored = provider_ro - .get_earliest_block_number()? + let earliest_stored = opt_block(provider_ro.get_earliest_block())? .ok_or_else(|| eyre!("no earliest proof-history block stored"))?; - let latest_stored = provider_ro - .get_latest_block_number()? + let latest_stored = opt_block(provider_ro.get_latest_block())? .ok_or_else(|| eyre!("no latest proof-history block stored"))? .0; let earliest_stored = BlockNumHash::new(earliest_stored.0, earliest_stored.1); @@ -979,7 +979,7 @@ where let Some(block) = chain.blocks().get(&block_number) && let Some(trie_data) = chain.trie_data_at(block_number) { - let SortedTrieData { hashed_state, trie_updates } = trie_data.get(); + let SortedTrieData { hashed_state, trie_updates } = &trie_data.get().sorted; collector.store_block_updates( block.block_with_parent(), (**trie_updates).clone(), @@ -1023,6 +1023,13 @@ where )); } + // A reorg replacing the whole retained window bases at the earliest stored block, which + // `replace_updates` rejects even though `unwind_history` accepts unwinding one block + // higher. Route that boundary through the unwind path so the reorg still applies. + if old.first().number() == earliest_stored.number + 1 { + return self.reorg_by_unwind_and_reprocess(old, new, collector); + } + let mut block_updates: Vec<( BlockWithParent, Arc, @@ -1031,17 +1038,10 @@ where for (block_number, block) in new.blocks() { let Some(trie_data) = new.trie_data_at(*block_number) else { - // Missing trie data on at least one new block: fall back to - // unwinding the old branch first, then re-process all new - // blocks individually so executions read post-unwind parent - // state instead of stale old-branch state. - collector.unwind_history(old.first().block_with_parent())?; - for block_number in new.blocks().keys() { - self.process_block(*block_number, new, collector)?; - } - return Ok(()); + // Missing trie data on at least one new block. + return self.reorg_by_unwind_and_reprocess(old, new, collector); }; - let SortedTrieData { hashed_state, trie_updates } = trie_data.get(); + let SortedTrieData { hashed_state, trie_updates } = &trie_data.get().sorted; block_updates.push(( block.block_with_parent(), trie_updates.clone(), @@ -1056,6 +1056,23 @@ where Ok(()) } + /// Applies a reorg by unwinding the old branch first and reprocessing the new blocks + /// individually, so each block reads post-unwind parent state instead of stale + /// old-branch state. Blocks with notification trie data are stored directly; the rest are + /// re-executed. + fn reorg_by_unwind_and_reprocess( + &self, + old: &Chain, + new: &Chain, + collector: &LiveTrieCollector<'_, Node::Evm, Node::Provider, Storage>, + ) -> eyre::Result<()> { + collector.unwind_history(old.first().block_with_parent())?; + for block_number in new.blocks().keys() { + self.process_block(*block_number, new, collector)?; + } + Ok(()) + } + /// Handles a canonical chain revert notification. fn handle_chain_reverted( &self, diff --git a/crates/node/src/proof_history/storage_init.rs b/crates/node/src/proof_history/storage_init.rs index 09136db2..ee4693d2 100644 --- a/crates/node/src/proof_history/storage_init.rs +++ b/crates/node/src/proof_history/storage_init.rs @@ -7,7 +7,10 @@ use alloy_primitives::B256; use eyre::{WrapErr, eyre}; use reth::providers::{BlockNumReader, DBProvider, DatabaseProviderFactory, HeaderProvider}; use reth_db::Database; -use reth_optimism_trie::{OpProofsStore, api::OpProofsProviderRO}; +use reth_optimism_trie::{ + OpProofsStore, + api::{InitialStateStatus, OpProofsInitProvider, OpProofsProviderRO}, +}; use reth_storage_api::{ ChainStateBlockReader, ChangeSetReader, StorageChangeSetReader, StorageSettingsCache, }; @@ -28,8 +31,62 @@ where Storage: OpProofsStore, { let provider_ro = storage.provider_ro()?; - Ok(provider_ro.get_earliest_block_number()?.is_none() || - provider_ro.get_latest_block_number()?.is_none()) + Ok(super::opt_block(provider_ro.get_earliest_block())?.is_none() || + super::opt_block(provider_ro.get_latest_block())?.is_none()) +} + +/// Migrates proof-history storage written before `LatestBlock` was persisted separately. +/// +/// The previous storage dependency recorded only `EarliestBlock` when initialization completed +/// and fell back to it as the latest block, so a database that finished initializing but never +/// stored a live block has no `LatestBlock` row. The current dependency reads `LatestBlock` +/// strictly: such a database looks uninitialized, while its completed anchor makes the +/// initialization job a no-op, leaving startup permanently failing. Re-committing the completed +/// anchor rewrites `EarliestBlock` and the missing `LatestBlock` in one transaction, matching +/// the fallback semantics the database was written under. Returns whether a migration ran. +pub(super) fn migrate_legacy_proof_history_storage(storage: &Storage) -> eyre::Result +where + Storage: OpProofsStore, +{ + let provider_ro = storage.provider_ro()?; + let Some((earliest_number, earliest_hash)) = + super::opt_block(provider_ro.get_earliest_block())? + else { + return Ok(false); + }; + if super::opt_block(provider_ro.get_latest_block())?.is_some() { + return Ok(false); + } + drop(provider_ro); + + let init_provider = storage.initialization_provider()?; + let anchor = init_provider.initial_state_anchor()?; + if !matches!(anchor.status, InitialStateStatus::Completed) { + // Not a completed legacy layout; leave it to the initialization state machine. + return Ok(false); + } + let anchor_block = anchor + .block + .ok_or_else(|| eyre!("completed proof-history initialization has no anchor block"))?; + if anchor_block.number != earliest_number || anchor_block.hash != earliest_hash { + return Err(eyre!( + "legacy proof-history anchor ({}, {:?}) does not match earliest block ({}, {:?}); wipe proof-history storage and restart initialization", + anchor_block.number, + anchor_block.hash, + earliest_number, + earliest_hash + )); + } + + init_provider.commit_initial_state()?; + OpProofsInitProvider::commit(init_provider)?; + info!( + target: "reth::taiko::proof_history", + block = anchor_block.number, + hash = ?anchor_block.hash, + "migrated legacy proof-history storage: recorded the completed anchor as the latest block" + ); + Ok(true) } /// File stored beside the proof-history MDBX database to validate historical init resume targets. @@ -431,8 +488,13 @@ mod tests { use super::*; use alloy_consensus::Header; use reth_ethereum_primitives::EthPrimitives; - use reth_optimism_trie::{InMemoryProofsStorage, OpProofsStorage, api::OpProofsProviderRw}; + use reth_optimism_trie::{ + InMemoryProofsStorage, OpProofsStorage, + api::OpProofsInitProvider, + db::{MdbxProofsStorage, ProofWindow, ProofWindowKey, Tables}, + }; use reth_provider::test_utils::MockEthProvider; + use std::sync::Arc; #[test] fn proof_history_storage_initialization_check_tracks_empty_storage() { @@ -441,9 +503,12 @@ mod tests { assert!(proof_history_storage_needs_initialization(&storage).unwrap()); - let provider_rw = storage.provider_rw().expect("provider_rw"); - provider_rw.set_earliest_block_number(0, B256::ZERO).expect("set earliest block"); - provider_rw.commit().expect("commit"); + let initializer = storage.initialization_provider().expect("initialization provider"); + initializer + .set_initial_state_anchor(alloy_eips::BlockNumHash::new(0, B256::ZERO)) + .expect("set initial state anchor"); + initializer.commit_initial_state().expect("commit initial state"); + initializer.commit().expect("commit"); assert!(!proof_history_storage_needs_initialization(&storage).unwrap()); } @@ -593,4 +658,136 @@ mod tests { // unwind `latest_stored` only run on live notifications. assert_eq!(proof_history_sync_target(200, 150), None); } + + /// Writes the pre-`LatestBlock` legacy layout into a fresh proof-history MDBX database, + /// mimicking storage whose initialization completed under the previous + /// `reth-optimism-trie` pin: it recorded the anchor and `EarliestBlock` but never wrote a + /// `LatestBlock` row (reads fell back to the earliest block). + fn write_legacy_mdbx_layout(path: &Path, rows: &[(ProofWindowKey, BlockNumHash)]) { + use reth_db::{ + Database, + mdbx::{DatabaseArguments, init_db_for}, + transaction::{DbTx, DbTxMut}, + }; + + let env = init_db_for::<_, Tables>(path, DatabaseArguments::default()) + .expect("raw proofs database opens"); + let tx = env.tx_mut().expect("write transaction opens"); + for (key, block) in rows { + tx.put::(*key, (*block).into()).expect("legacy row writes"); + } + tx.commit().expect("legacy layout commits"); + } + + /// MDBX proofs storage opened over a directory prepared by [`write_legacy_mdbx_layout`]. + fn legacy_mdbx_storage(path: &Path) -> OpProofsStorage> { + Arc::new(MdbxProofsStorage::new(path).expect("mdbx storage opens")).into() + } + + #[test] + fn legacy_storage_missing_latest_block_migrates_to_earliest_anchor() { + let dir = tempfile::tempdir().unwrap(); + let anchor = BlockNumHash::new(42, B256::with_last_byte(7)); + write_legacy_mdbx_layout( + dir.path(), + &[ + (ProofWindowKey::InitialStateAnchor, anchor), + (ProofWindowKey::EarliestBlock, anchor), + ], + ); + let storage = legacy_mdbx_storage(dir.path()); + + // The strict `LatestBlock` reads make the completed legacy database look uninitialized. + assert!(proof_history_storage_needs_initialization(&storage).unwrap()); + + assert!( + migrate_legacy_proof_history_storage(&storage).expect("legacy migration succeeds"), + "missing latest block must be migrated" + ); + + let provider_ro = storage.provider_ro().unwrap(); + assert_eq!( + super::super::opt_block(provider_ro.get_earliest_block()).unwrap(), + Some((anchor.number, anchor.hash)) + ); + assert_eq!( + super::super::opt_block(provider_ro.get_latest_block()).unwrap(), + Some((anchor.number, anchor.hash)) + ); + drop(provider_ro); + assert!(!proof_history_storage_needs_initialization(&storage).unwrap()); + + // Re-running the migration is a no-op. + assert!(!migrate_legacy_proof_history_storage(&storage).expect("second run is a no-op")); + } + + #[test] + fn legacy_migration_rejects_anchor_mismatching_earliest_block() { + let dir = tempfile::tempdir().unwrap(); + write_legacy_mdbx_layout( + dir.path(), + &[ + ( + ProofWindowKey::InitialStateAnchor, + BlockNumHash::new(42, B256::with_last_byte(7)), + ), + (ProofWindowKey::EarliestBlock, BlockNumHash::new(43, B256::with_last_byte(8))), + ], + ); + let storage = legacy_mdbx_storage(dir.path()); + + let error = migrate_legacy_proof_history_storage(&storage).unwrap_err().to_string(); + + assert!(error.contains("does not match"), "got {error}"); + assert!(error.contains("wipe proof-history storage"), "got {error}"); + } + + #[test] + fn legacy_migration_skips_storage_without_recorded_anchor() { + // Earliest present but no anchor row: initialization status reads `NotStarted`, so the + // migration must leave the database to the initialization state machine. + let dir = tempfile::tempdir().unwrap(); + write_legacy_mdbx_layout( + dir.path(), + &[(ProofWindowKey::EarliestBlock, BlockNumHash::new(42, B256::with_last_byte(7)))], + ); + let storage = legacy_mdbx_storage(dir.path()); + + assert!(!migrate_legacy_proof_history_storage(&storage).unwrap()); + } + + #[test] + fn legacy_migration_skips_empty_storage() { + let storage: OpProofsStorage = + InMemoryProofsStorage::default().into(); + + assert!(!migrate_legacy_proof_history_storage(&storage).unwrap()); + } + + #[test] + fn legacy_migration_skips_in_progress_initialization() { + let storage: OpProofsStorage = + InMemoryProofsStorage::default().into(); + let initializer = storage.initialization_provider().expect("initialization provider"); + initializer + .set_initial_state_anchor(BlockNumHash::new(0, B256::ZERO)) + .expect("set initial state anchor"); + initializer.commit().expect("commit"); + + assert!(!migrate_legacy_proof_history_storage(&storage).unwrap()); + } + + #[test] + fn legacy_migration_skips_storage_with_latest_block() { + let storage: OpProofsStorage = + InMemoryProofsStorage::default().into(); + let initializer = storage.initialization_provider().expect("initialization provider"); + initializer + .set_initial_state_anchor(BlockNumHash::new(0, B256::ZERO)) + .expect("set initial state anchor"); + initializer.commit_initial_state().expect("commit initial state"); + initializer.commit().expect("commit"); + + assert!(!migrate_legacy_proof_history_storage(&storage).unwrap()); + } } diff --git a/crates/payload/Cargo.toml b/crates/payload/Cargo.toml index 8bbc4e12..45961ec7 100644 --- a/crates/payload/Cargo.toml +++ b/crates/payload/Cargo.toml @@ -49,6 +49,7 @@ tracing = { workspace = true } [dev-dependencies] alethia-reth-block = { path = "../block", features = ["test-utils"] } +alloy-genesis = { workspace = true } reth-provider = { workspace = true, features = ["test-utils"] } reth-storage-api = { workspace = true } reth-trie-common = { workspace = true } diff --git a/crates/payload/src/builder/execution.rs b/crates/payload/src/builder/execution.rs index 934a01eb..4a74b7fc 100644 --- a/crates/payload/src/builder/execution.rs +++ b/crates/payload/src/builder/execution.rs @@ -82,7 +82,7 @@ pub(super) fn execute_provided_transactions( let recovered_tx: Recovered<::SignedTx> = tx.clone(); let gas_used = match builder.execute_transaction(recovered_tx) { - Ok(gas_used) => gas_used, + Ok(gas_output) => gas_output.tx_gas_used(), Err(err) if is_zk_gas_limit_exceeded(&err) => { debug!( target: "payload_builder", @@ -150,9 +150,9 @@ where // Execute the anchor transaction as the first transaction in the block // NOTE: anchor transaction does not contribute to the total DA size limit calculation. match builder.execute_transaction(ctx.anchor_tx.clone()) { - Ok(gas_used) => { + Ok(gas_output) => { // Note: Anchor transaction has zero priority fee (tip), so no fees to add - debug!(target: "payload_builder", id=%ctx.payload_id, gas_used, "anchor transaction executed successfully"); + debug!(target: "payload_builder", id=%ctx.payload_id, gas_used = gas_output.tx_gas_used(), "anchor transaction executed successfully"); } Err(err) if is_zk_gas_limit_exceeded(&err) => { debug!( @@ -290,7 +290,7 @@ mod tests { &mut self, tx: impl ExecutorTx, f: impl FnOnce(&::Result) -> CommitChanges, - ) -> Result, BlockExecutionError> { + ) -> Result, BlockExecutionError> { if self.fail_next_execution { self.fail_next_execution = false; return Err(BlockExecutionError::other(ZkGasLimitExceeded)); @@ -347,7 +347,7 @@ mod tests { ])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let executor = TaikoBlockExecutor::new( evm, unzen_execution_ctx(), @@ -381,7 +381,7 @@ mod tests { .with_database(db_with_contracts(&[(Address::from(TAIKO_GOLDEN_TOUCH_ADDRESS), 0)])) .with_bundle_update() .build(); - let evm = TaikoEvmFactory.create_evm(&mut state, unzen_evm_env()); + let evm = TaikoEvmFactory::default().create_evm(&mut state, unzen_evm_env()); let executor = TaikoBlockExecutor::new( evm, unzen_execution_ctx(), diff --git a/crates/payload/src/builder/mod.rs b/crates/payload/src/builder/mod.rs index 7a08518d..ce2e913c 100644 --- a/crates/payload/src/builder/mod.rs +++ b/crates/payload/src/builder/mod.rs @@ -1,12 +1,14 @@ use std::sync::Arc; +use alloy_hardforks::EthereumHardforks; use reth_basic_payload_builder::{ BuildArguments, BuildOutcome, MissingPayloadBehaviour, PayloadBuilder, PayloadConfig, }; +use reth_errors::RethError; use reth_ethereum::EthPrimitives; use reth_evm::{ ConfigureEvm, - execute::{BlockBuilder, BlockBuilderOutcome, BlockExecutor}, + execute::{BlockBuilder, BlockBuilderOutcome}, }; use reth_evm_ethereum::RethReceiptBuilder; use reth_execution_cache::{CachedStateMetrics, CachedStateMetricsSource, CachedStateProvider}; @@ -143,6 +145,27 @@ fn empty_payload_result() -> Result { Err(PayloadBuilderError::MissingPayload) } +/// Rejects payload builds on a chain spec that activates the Amsterdam fork. +/// +/// Taiko schedules no Amsterdam fork, so [`taiko_payload`] never wires an EIP-7928 BAL builder +/// into the `State` and [`TaikoBlockAssembler`] always seals `block_access_list_hash: None`. +/// Reth's post-execution validation skips the access-list check whenever the hash is absent, so +/// an activation arriving through genesis config (`amsterdamTime`) would silently produce +/// non-compliant blocks. Fail closed instead, mirroring the import-side rejection in +/// `TaikoBeaconConsensus::validate_header`. +fn ensure_amsterdam_inactive( + chain_spec: &TaikoChainSpec, + timestamp: u64, +) -> Result<(), PayloadBuilderError> { + if chain_spec.is_amsterdam_active_at_timestamp(timestamp) { + return Err(PayloadBuilderError::Internal(RethError::msg( + "cannot build a Taiko payload with the Amsterdam fork active: EIP-7928 block access lists are unsupported", + ))); + } + + Ok(()) +} + /// Build a Taiko payload for the given parent/header and job attributes. #[inline] fn taiko_payload( @@ -173,20 +196,22 @@ where let BuildArguments { mut cached_reads, execution_cache, - trie_handle, + mut state_root_handle, config, cancel, best_payload: _, } = args; let attributes = normalize_payload_config(&config)?; - let PayloadConfig { parent_header, attributes: _, payload_id } = config; + let PayloadConfig { parent_header, attributes: _, payload_id, .. } = config; + + ensure_amsterdam_inactive(&client.chain_spec(), attributes.timestamp())?; let mut state_provider = client.state_by_block_hash(parent_header.hash())?; if let Some(execution_cache) = execution_cache { state_provider = Box::new(CachedStateProvider::new( state_provider, execution_cache.cache().clone(), - CachedStateMetrics::zeroed(CachedStateMetricsSource::Builder), + Some(CachedStateMetrics::zeroed(CachedStateMetricsSource::Builder)), )); } let state = StateProviderDatabase::new(state_provider.as_ref()); @@ -195,6 +220,10 @@ where debug!(target: "payload_builder", id=%payload_id, parent_hash=?parent_header.hash(), parent_number=parent_header.number, "building new payload"); + // Opt payload building into JIT dispatch (mirrors reth's engine tree and upstream payload + // builder). Unzen blocks still execute through the interpreter via the fork allowlist, and + // this local support flag is one of several gates before compiled code can run. + let evm_config = evm_config.clone().with_jit_support(); let mut builder = evm_config .builder_for_next_block( &mut db, @@ -210,8 +239,11 @@ where ) .map_err(PayloadBuilderError::other)?; - if let Some(ref handle) = trie_handle { - builder.executor_mut().set_state_hook(Some(Box::new(handle.state_hook()))); + // If we have a state-root task, wire a state hook that streams per-tx state diffs. Hooks + // are delivered through the `State` database in reth v2.4.0. + if let Some(task) = state_root_handle.as_mut() { + reth_evm::Evm::db_mut(builder.evm_mut()) + .set_state_hook(Some(Box::new(task.take_state_hook()))); } builder.apply_pre_execution_changes().map_err(PayloadBuilderError::other)?; @@ -251,11 +283,9 @@ where } }; - let BlockBuilderOutcome { execution_result: _, block, .. } = if let Some(mut handle) = - trie_handle - { + let outcome = if let Some(mut handle) = state_root_handle { // Drop the state hook so the trie task sees the final state updates and can finalize. - builder.executor_mut().set_state_hook(None); + reth_evm::Evm::db_mut(builder.evm_mut()).set_state_hook(None); // The sparse trie computes alongside transaction execution, so this usually just waits // for the last root/trie update. If that pipeline fails, fall back to synchronous state @@ -277,17 +307,27 @@ where builder.finish(state_provider.as_ref(), None)? }; - let sealed_block = Arc::new(block.into_sealed_block()); - debug!(target: "payload_builder", id=%payload_id, sealed_block_header = ?sealed_block.sealed_header(), "sealed built block"); + // The Amsterdam guard above rejects these builds up front, and this builder never wires a + // BAL builder into the `State`, so the list is always absent here. The named discard is a + // backstop against either of those changing. + let BlockBuilderOutcome { execution_result: _, block, block_access_list, .. } = outcome; + debug_assert!( + block_access_list.is_none(), + "unexpected EIP-7928 block access list for a Taiko block" + ); + + debug!(target: "payload_builder", id=%payload_id, sealed_block_header = ?block.sealed_header(), "sealed built block"); - Ok(BuildOutcome::Freeze(EthBuiltPayload::new(sealed_block, total_fees, None, None))) + Ok(BuildOutcome::Freeze(EthBuiltPayload::new(Arc::new(block), total_fees, None, None))) } #[cfg(test)] mod tests { use super::*; + use alethia_reth_chainspec::TAIKO_MAINNET; use alethia_reth_primitives::payload::attributes::{RpcL1Origin, TaikoBlockMetadata}; use alloy_consensus::Header; + use alloy_genesis::{ChainConfig, Genesis}; use alloy_primitives::{Address, B256, Bytes, U256}; use alloy_rpc_types_engine::{PayloadAttributes as EthPayloadAttributes, PayloadId}; use reth_basic_payload_builder::PayloadConfig; @@ -313,6 +353,7 @@ mod tests { withdrawals: Some(Vec::new()), parent_beacon_block_root: Some(B256::repeat_byte(0x33)), slot_number: None, + target_gas_limit: None, }, base_fee_per_gas, block_metadata: TaikoBlockMetadata { @@ -359,6 +400,27 @@ mod tests { assert!(matches!(missing_payload_behaviour(), MissingPayloadBehaviour::AwaitInProgress)); } + #[test] + fn amsterdam_activation_rejects_payload_builds() { + let spec = TaikoChainSpec::from(Genesis { + config: ChainConfig { amsterdam_time: Some(100), ..Default::default() }, + ..Default::default() + }); + + assert!(ensure_amsterdam_inactive(&spec, 99).is_ok()); + + let err = ensure_amsterdam_inactive(&spec, 100) + .expect_err("Taiko cannot seal an EIP-7928 block access list"); + assert!(err.to_string().contains("Amsterdam"), "unexpected error: {err}"); + } + + #[test] + fn taiko_mainnet_never_activates_amsterdam() { + // The guard above only fails closed if the shipped specs genuinely leave Amsterdam + // unscheduled; otherwise it would reject every mainnet build. + assert!(ensure_amsterdam_inactive(&TAIKO_MAINNET, u64::MAX).is_ok()); + } + #[test] fn malformed_attrs_still_reject_empty_payloads_with_missing_payload() { let _config = test_payload_config(None, U256::from(1u64), Some(Bytes::from(vec![0x01]))); diff --git a/crates/primitives/src/engine/mod.rs b/crates/primitives/src/engine/mod.rs index c0d51eb0..bb15917a 100644 --- a/crates/primitives/src/engine/mod.rs +++ b/crates/primitives/src/engine/mod.rs @@ -1,4 +1,5 @@ //! Engine API type adapters for Taiko execution payloads. +use alloy_primitives::Bytes; use alloy_rpc_types_engine::{ ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, ExecutionPayloadEnvelopeV4, ExecutionPayloadEnvelopeV5, ExecutionPayloadEnvelopeV6, ExecutionPayloadV1, @@ -7,6 +8,7 @@ use reth_engine_primitives::EngineTypes; use reth_ethereum_engine_primitives::EthBuiltPayload; use reth_payload_primitives::{BuiltPayload, PayloadTypes}; use reth_primitives_traits::{NodePrimitives, SealedBlock}; +use std::sync::Arc; use self::types::{TaikoExecutionData, TaikoExecutionDataSidecar}; use crate::payload::attributes::TaikoPayloadAttributes; @@ -28,10 +30,14 @@ impl PayloadTypes for TaikoEngineTypes { type PayloadAttributes = TaikoPayloadAttributes; /// Converts a block into an execution payload. + /// + /// The Amsterdam block access list is discarded because Taiko networks schedule no Amsterdam + /// fork; the transport sentinels in [`TaikoExecutionData`] remain empty for locally built data. fn block_to_payload( block: SealedBlock< <::Primitives as NodePrimitives>::Block, >, + _bal: Option, ) -> Self::ExecutionData { let tx_hash = block.transactions_root; let withdrawals_hash = block.withdrawals_root; @@ -46,11 +52,22 @@ impl PayloadTypes for TaikoEngineTypes { withdrawals_hash, header_difficulty: Some(header_difficulty), taiko_block: Some(true), + block_access_list: None, + slot_number: None, }, } } } +impl From for TaikoExecutionData { + /// Converts a built payload into Taiko execution data, discarding any Amsterdam block + /// access list (Taiko networks schedule no Amsterdam fork). + fn from(value: EthBuiltPayload) -> Self { + let block = Arc::unwrap_or_clone(value.into_block_arc()).into_sealed_block(); + TaikoEngineTypes::block_to_payload(block, None) + } +} + impl EngineTypes for TaikoEngineTypes { /// Execution Payload V1 envelope type. type ExecutionPayloadEnvelopeV1 = ExecutionPayloadV1; diff --git a/crates/primitives/src/engine/types.rs b/crates/primitives/src/engine/types.rs index a6e2bdf0..086d991a 100644 --- a/crates/primitives/src/engine/types.rs +++ b/crates/primitives/src/engine/types.rs @@ -45,6 +45,15 @@ pub struct TaikoExecutionDataSidecar { pub header_difficulty: Option, /// Marker flag indicating whether this payload is a Taiko block. pub taiko_block: Option, + /// Inbound Amsterdam block access list retained only so engine validation can reject it. + #[cfg_attr(feature = "serde", serde(default, skip_serializing))] + pub block_access_list: Option, + /// Inbound Amsterdam slot number retained only so engine validation can reject it. + #[cfg_attr( + feature = "serde", + serde(default, skip_serializing, with = "alloy_serde::quantity::opt") + )] + pub slot_number: Option, } impl ExecutionPayloadTr for TaikoExecutionData { @@ -70,7 +79,7 @@ impl ExecutionPayloadTr for TaikoExecutionData { /// Returns the access list associated with the block, if any. fn block_access_list(&self) -> Option<&Bytes> { - None + self.taiko_sidecar.block_access_list.as_ref() } /// Returns the parent beacon block root, if applicable. @@ -100,7 +109,7 @@ impl ExecutionPayloadTr for TaikoExecutionData { /// Returns the slot number for the payload. Taiko payloads do not carry a beacon slot. fn slot_number(&self) -> Option { - None + self.taiko_sidecar.slot_number } } diff --git a/crates/primitives/src/payload/attributes.rs b/crates/primitives/src/payload/attributes.rs index 4953fcb9..a707c956 100644 --- a/crates/primitives/src/payload/attributes.rs +++ b/crates/primitives/src/payload/attributes.rs @@ -118,6 +118,11 @@ impl PayloadAttributes for TaikoPayloadAttributes { fn slot_number(&self) -> Option { self.payload_attributes.slot_number() } + + /// Delegates to the wrapped ETH attributes' requested target gas limit. + fn target_gas_limit(&self) -> Option { + self.payload_attributes.target_gas_limit() + } } /// The metadata for a Taiko block, which is generated by the Taiko protocol. diff --git a/crates/primitives/src/payload/builder.rs b/crates/primitives/src/payload/builder.rs index f0320e49..4247ec6f 100644 --- a/crates/primitives/src/payload/builder.rs +++ b/crates/primitives/src/payload/builder.rs @@ -288,6 +288,7 @@ mod test { withdrawals: Some(vec![]), parent_beacon_block_root: Some(B256::ZERO), slot_number: None, + target_gas_limit: None, } } diff --git a/crates/rpc/Cargo.toml b/crates/rpc/Cargo.toml index 50daab08..328f9a0d 100644 --- a/crates/rpc/Cargo.toml +++ b/crates/rpc/Cargo.toml @@ -38,6 +38,7 @@ jsonrpsee-core = { workspace = true } jsonrpsee-types = { workspace = true } op-alloy-flz = { workspace = true } reth = { workspace = true } +reth-chain-state = { workspace = true } reth-db = { workspace = true } reth-db-api = { workspace = true } reth-engine-primitives = { workspace = true } diff --git a/crates/rpc/src/engine/api.rs b/crates/rpc/src/engine/api.rs index 1717e6c5..3c95abae 100644 --- a/crates/rpc/src/engine/api.rs +++ b/crates/rpc/src/engine/api.rs @@ -24,7 +24,8 @@ use reth_ethereum_engine_primitives::EthBuiltPayload; use reth_node_api::{EngineTypes, PayloadBuilderError, PayloadTypes}; use reth_payload_primitives::PayloadKind; use reth_provider::{ - BlockReader, DBProvider, DatabaseProviderFactory, HeaderProvider, StateProviderFactory, + BalProvider, BlockReader, DBProvider, DatabaseProviderFactory, HeaderProvider, + StateProviderFactory, }; use reth_rpc::EngineApi; use reth_rpc_engine_api::{EngineApiError, EngineCapabilities}; @@ -92,8 +93,12 @@ pub struct TaikoEngineApi TaikoEngineApi where - Provider: - HeaderProvider + BlockReader + DatabaseProviderFactory + StateProviderFactory + 'static, + Provider: HeaderProvider + + BlockReader + + DatabaseProviderFactory + + StateProviderFactory + + BalProvider + + 'static, PayloadT: PayloadTypes, Pool: TransactionPool + 'static, ChainSpec: EthereumHardforks + Send + Sync + 'static, @@ -116,8 +121,12 @@ where impl TaikoEngineApi where - Provider: - HeaderProvider + BlockReader + DatabaseProviderFactory + StateProviderFactory + 'static, + Provider: HeaderProvider + + BlockReader + + DatabaseProviderFactory + + StateProviderFactory + + BalProvider + + 'static, EngineT: EngineTypes< ExecutionData = TaikoExecutionData, PayloadAttributes = TaikoPayloadAttributes, @@ -195,8 +204,12 @@ where impl TaikoEngineApiServer for TaikoEngineApi where - Provider: - HeaderProvider + BlockReader + DatabaseProviderFactory + StateProviderFactory + 'static, + Provider: HeaderProvider + + BlockReader + + DatabaseProviderFactory + + StateProviderFactory + + BalProvider + + 'static, EngineT: EngineTypes< ExecutionData = TaikoExecutionData, PayloadAttributes = TaikoPayloadAttributes, @@ -318,7 +331,6 @@ mod tests { use alloy_eips::merge::BEACON_NONCE; use alloy_hardforks::ForkCondition; use alloy_primitives::{Address, B256, Bytes, U256}; - use reth_primitives_traits::Block as _; use std::sync::Arc; #[test] @@ -374,9 +386,10 @@ mod tests { fn sample_built_payload(difficulty: U256, fees: U256, timestamp: u64) -> EthBuiltPayload { let block = sample_unzen_block(difficulty, timestamp); - let sealed_block = Arc::new(block.seal_slow()); + let recovered_block = + Arc::new(reth_primitives_traits::RecoveredBlock::new_unhashed(block, Vec::new())); - EthBuiltPayload::new(sealed_block, fees, None, None) + EthBuiltPayload::new(recovered_block, fees, None, None) } fn sample_unzen_block(difficulty: U256, timestamp: u64) -> reth_ethereum::Block { diff --git a/crates/rpc/src/engine/validator.rs b/crates/rpc/src/engine/validator.rs index 3e92e268..0b480617 100644 --- a/crates/rpc/src/engine/validator.rs +++ b/crates/rpc/src/engine/validator.rs @@ -12,6 +12,7 @@ use alloy_primitives::B256; use alloy_rpc_types_engine::{ExecutionPayloadV1, PayloadError}; use alloy_rpc_types_eth::Withdrawals; use reth::{chainspec::EthChainSpec, primitives::RecoveredBlock}; +use reth_chain_state::StateTrieOverlayManager; use reth_engine_primitives::EngineApiValidator; use reth_engine_tree::tree::{TreeConfig, payload_validator::BasicEngineValidator}; use reth_ethereum::{Block, EthPrimitives}; @@ -25,7 +26,7 @@ use reth_node_builder::{ }; use reth_payload_primitives::{ EngineApiMessageVersion, EngineObjectValidationError, InvalidPayloadAttributesError, - PayloadAttributes, PayloadOrAttributes, + PayloadAttributes, PayloadOrAttributes, VersionSpecificValidationError, }; use reth_primitives_traits::{Block as BlockTrait, SealedBlock}; use std::sync::Arc; @@ -39,6 +40,9 @@ enum TaikoPayloadValidationError { /// Unzen payloads must carry the original header difficulty through the Taiko sidecar. #[error("missing header difficulty for Unzen payload")] MissingUnzenHeaderDifficulty, + /// Taiko payload construction does not consume the post-Amsterdam target-gas-limit attribute. + #[error("target gas limit is unsupported on Taiko")] + TargetGasLimitUnsupported, } /// Builder for [`TaikoEngineValidator`]. @@ -82,6 +86,7 @@ where ctx: &AddOnsContext<'_, N>, tree_config: TreeConfig, changeset_cache: ChangesetCache, + state_trie_overlays: StateTrieOverlayManager<::Primitives>, ) -> eyre::Result { let validator = >::build(self, ctx).await?; let data_dir = ctx.config.datadir.clone().resolve_datadir(ctx.config.chain.chain()); @@ -94,6 +99,7 @@ where tree_config, invalid_block_hook, changeset_cache, + state_trie_overlays, ctx.node.task_executor().clone(), )) } @@ -216,20 +222,39 @@ where fn validate_version_specific_fields( &self, _version: EngineApiMessageVersion, - _payload_or_attrs: PayloadOrAttributes<'_, Types::ExecutionData, Types::PayloadAttributes>, + payload_or_attrs: PayloadOrAttributes<'_, Types::ExecutionData, Types::PayloadAttributes>, ) -> Result<(), EngineObjectValidationError> { - // For Taiko, we don't have version-specific validation + let validation_kind = payload_or_attrs.message_validation_kind(); + + if payload_or_attrs.block_access_list().is_some() { + return Err(validation_kind + .to_error(VersionSpecificValidationError::BlockAccessListNotSupported)); + } + if payload_or_attrs.slot_number().is_some() { + return Err( + validation_kind.to_error(VersionSpecificValidationError::SlotNumberNotSupported) + ); + } + if payload_or_attrs.target_gas_limit().is_some() { + return Err(EngineObjectValidationError::InvalidParams(Box::new( + TaikoPayloadValidationError::TargetGasLimitUnsupported, + ))); + } + Ok(()) } /// Ensures that the payload attributes are valid for the given [`EngineApiMessageVersion`]. fn ensure_well_formed_attributes( &self, - _version: EngineApiMessageVersion, - _attributes: &Types::PayloadAttributes, + version: EngineApiMessageVersion, + attributes: &Types::PayloadAttributes, ) -> Result<(), EngineObjectValidationError> { - // Attributes are well-formed if they pass the basic validation - Ok(()) + >::validate_version_specific_fields( + self, + version, + PayloadOrAttributes::from_attributes(attributes), + ) } } @@ -237,15 +262,18 @@ where mod tests { use super::*; use alethia_reth_chainspec::{TAIKO_DEVNET, hardfork::TaikoHardfork}; - use alethia_reth_primitives::engine::{ - TaikoEngineTypes, - types::{TaikoExecutionData, TaikoExecutionDataSidecar}, + use alethia_reth_primitives::{ + engine::{ + TaikoEngineTypes, + types::{TaikoExecutionData, TaikoExecutionDataSidecar}, + }, + payload::attributes::{RpcL1Origin, TaikoBlockMetadata, TaikoPayloadAttributes}, }; use alloy_consensus::{BlockBody, Header, constants::EMPTY_WITHDRAWALS}; use alloy_eips::merge::BEACON_NONCE; use alloy_hardforks::ForkCondition; use alloy_primitives::{Address, B256, Bytes, U256}; - use alloy_rpc_types_engine::ExecutionPayloadV1; + use alloy_rpc_types_engine::{ExecutionPayloadV1, PayloadAttributes as EthPayloadAttributes}; use alloy_rpc_types_eth::Withdrawals; use reth_primitives_traits::BlockBody as _; @@ -314,6 +342,140 @@ mod tests { assert_eq!(sealed.header().requests_hash, Some(EMPTY_REQUESTS_HASH)); } + #[test] + fn rejects_slot_number_in_v2_payload_attributes_json() { + let attributes = + payload_attributes_with_extra_field("slotNumber", serde_json::json!("0x1")); + + let error = validate_payload_attributes(&attributes) + .expect_err("Taiko V2 payload attributes must reject slotNumber"); + + assert_eq!( + error.to_string(), + "Payload attributes validation error: slot number not supported in this engine API version" + ); + } + + #[test] + fn rejects_target_gas_limit_in_v2_payload_attributes_json() { + let attributes = + payload_attributes_with_extra_field("targetGasLimit", serde_json::json!("0x1c9c380")); + + let error = validate_payload_attributes(&attributes) + .expect_err("Taiko V2 payload attributes must reject targetGasLimit"); + + assert_eq!(error.to_string(), "Invalid params: target gas limit is unsupported on Taiko"); + } + + #[test] + fn rejects_block_access_list_in_v2_execution_payload_json() { + let payload = execution_data_with_extra_field("blockAccessList", serde_json::json!("0xc0")); + + let error = validate_execution_payload(&payload) + .expect_err("Taiko V2 execution payloads must reject blockAccessList"); + + assert_eq!( + error.to_string(), + "Payload validation error: block access list not supported in this engine API version" + ); + } + + #[test] + fn rejects_slot_number_in_v2_execution_payload_json() { + let payload = execution_data_with_extra_field("slotNumber", serde_json::json!("0x1")); + + let error = validate_execution_payload(&payload) + .expect_err("Taiko V2 execution payloads must reject slotNumber"); + + assert_eq!( + error.to_string(), + "Payload validation error: slot number not supported in this engine API version" + ); + } + + fn validate_payload_attributes( + attributes: &TaikoPayloadAttributes, + ) -> Result<(), EngineObjectValidationError> { + >:: + validate_version_specific_fields( + &TaikoEngineValidator::new(Arc::new(unzen_chain_spec())), + EngineApiMessageVersion::V2, + PayloadOrAttributes::from_attributes(attributes), + ) + } + + fn validate_execution_payload( + payload: &TaikoExecutionData, + ) -> Result<(), EngineObjectValidationError> { + >:: + validate_version_specific_fields( + &TaikoEngineValidator::new(Arc::new(unzen_chain_spec())), + EngineApiMessageVersion::V2, + PayloadOrAttributes::from_execution_payload(payload), + ) + } + + fn payload_attributes_with_extra_field( + field: &str, + value: serde_json::Value, + ) -> TaikoPayloadAttributes { + let mut json = serde_json::to_value(sample_payload_attributes()) + .expect("sample payload attributes must serialize"); + json.as_object_mut() + .expect("payload attributes must serialize as an object") + .insert(field.to_owned(), value); + serde_json::from_value(json).expect("payload attributes with fork field must deserialize") + } + + fn execution_data_with_extra_field( + field: &str, + value: serde_json::Value, + ) -> TaikoExecutionData { + let mut json = serde_json::to_value(sample_unzen_execution_data( + U256::from(7_u64), + Some(U256::from(7_u64)), + Some(B256::ZERO), + )) + .expect("sample execution data must serialize"); + json.as_object_mut() + .expect("execution data must serialize as an object") + .insert(field.to_owned(), value); + serde_json::from_value(json).expect("execution data with fork field must deserialize") + } + + fn sample_payload_attributes() -> TaikoPayloadAttributes { + TaikoPayloadAttributes { + payload_attributes: EthPayloadAttributes { + timestamp: 1, + prev_randao: B256::with_last_byte(0x11), + suggested_fee_recipient: Address::with_last_byte(0x22), + withdrawals: Some(Vec::new()), + parent_beacon_block_root: Some(B256::ZERO), + slot_number: None, + target_gas_limit: None, + }, + base_fee_per_gas: U256::from(1_u64), + block_metadata: TaikoBlockMetadata { + beneficiary: Address::with_last_byte(0x33), + gas_limit: 30_000_000, + timestamp: U256::from(1_u64), + mix_hash: B256::with_last_byte(0x44), + tx_list: None, + extra_data: Bytes::new(), + }, + l1_origin: RpcL1Origin { + block_id: U256::ZERO, + l2_block_hash: B256::ZERO, + l1_block_height: None, + l1_block_hash: None, + build_payload_args_id: [0; 8], + is_forced_inclusion: false, + signature: [0; 65], + }, + anchor_transaction: None, + } + } + fn unzen_chain_spec() -> TaikoChainSpec { let mut chain_spec = (*TAIKO_DEVNET).as_ref().clone(); chain_spec.inner.hardforks.insert(TaikoHardfork::Unzen, ForkCondition::Timestamp(0)); @@ -368,6 +530,8 @@ mod tests { withdrawals_hash: Some(EMPTY_WITHDRAWALS), header_difficulty, taiko_block: Some(true), + block_access_list: None, + slot_number: None, }, } } diff --git a/crates/rpc/src/proof_state.rs b/crates/rpc/src/proof_state.rs index db079308..5564ce46 100644 --- a/crates/rpc/src/proof_state.rs +++ b/crates/rpc/src/proof_state.rs @@ -183,11 +183,11 @@ where ) -> ProviderResult> { let provider_ro = self.storage.provider_ro().map_err(ProviderError::from)?; - let latest = provider_ro.get_latest_block_number().map_err(ProviderError::from)?; - let earliest = provider_ro.get_earliest_block_number().map_err(ProviderError::from)?; - let bounds = latest - .zip(earliest) - .map(|((latest_number, _), (earliest_number, _))| (earliest_number, latest_number)); + let bounds = match provider_ro.get_proof_window() { + Ok(window) => Some((window.earliest.number, window.latest.number)), + Err(reth_optimism_trie::OpProofsStorageError::NoBlocksFound) => None, + Err(err) => return Err(ProviderError::from(err)), + }; let reconciled = self.readiness.is_ready(); if !proof_history_can_serve(reconciled, block_number, bounds) { diff --git a/justfile b/justfile index be359d50..bd1b1c77 100644 --- a/justfile +++ b/justfile @@ -1,4 +1,4 @@ -toolchain := "1.94.0" +toolchain := "1.95.0" fmt_toolchain := "nightly" fmt: diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 6a89faa2..38ab2c6b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.94.0" +channel = "1.95.0" components = ["clippy", "rustfmt"]